xref: /qemu/tests/tcg/x86_64/test-1648.c (revision 60b54b67c63d8f076152e0f7dccf39854dfc6a77)
1*a7365e98SRichard Henderson /* SPDX-License-Identifier: GPL-2.0-or-later */
2*a7365e98SRichard Henderson /* See https://gitlab.com/qemu-project/qemu/-/issues/1648 */
3*a7365e98SRichard Henderson 
4*a7365e98SRichard Henderson #include <signal.h>
5*a7365e98SRichard Henderson 
6*a7365e98SRichard Henderson __attribute__((noinline))
bar(void)7*a7365e98SRichard Henderson void bar(void)
8*a7365e98SRichard Henderson {
9*a7365e98SRichard Henderson     /* Success! Continue through sigreturn. */
10*a7365e98SRichard Henderson }
11*a7365e98SRichard Henderson 
12*a7365e98SRichard Henderson /*
13*a7365e98SRichard Henderson  * Because of the change of ABI between foo and bar, the compiler is
14*a7365e98SRichard Henderson  * required to save XMM6-XMM15.  The compiler will use MOVAPS or MOVDQA,
15*a7365e98SRichard Henderson  * which will trap if the stack frame is not 16 byte aligned.
16*a7365e98SRichard Henderson  */
17*a7365e98SRichard Henderson __attribute__((noinline, ms_abi))
foo(void)18*a7365e98SRichard Henderson void foo(void)
19*a7365e98SRichard Henderson {
20*a7365e98SRichard Henderson     bar();
21*a7365e98SRichard Henderson }
22*a7365e98SRichard Henderson 
sighandler(int num)23*a7365e98SRichard Henderson void sighandler(int num)
24*a7365e98SRichard Henderson {
25*a7365e98SRichard Henderson     foo();
26*a7365e98SRichard Henderson }
27*a7365e98SRichard Henderson 
main(void)28*a7365e98SRichard Henderson int main(void)
29*a7365e98SRichard Henderson {
30*a7365e98SRichard Henderson     signal(SIGUSR1, sighandler);
31*a7365e98SRichard Henderson     raise(SIGUSR1);
32*a7365e98SRichard Henderson     return 0;
33*a7365e98SRichard Henderson }
34