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 Hendersonvoid 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 Hendersonvoid foo(void) 19*a7365e98SRichard Henderson { 20*a7365e98SRichard Henderson bar(); 21*a7365e98SRichard Henderson } 22*a7365e98SRichard Henderson sighandler(int num)23*a7365e98SRichard Hendersonvoid sighandler(int num) 24*a7365e98SRichard Henderson { 25*a7365e98SRichard Henderson foo(); 26*a7365e98SRichard Henderson } 27*a7365e98SRichard Henderson main(void)28*a7365e98SRichard Hendersonint 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