Hi, On 19/11/2015 10:28, John Paul Adrian Glaubitz wrote: > On 11/19/2015 10:17 AM, Peter Maydell wrote: >> Unfortunately this isn't sufficient. You also need to add >> the code to the sh4-specific functions in linux-user/signal.c >> which honours the requested sigaltstack when taking and returning >> from signal handlers.
it seems all needed functions for sh4 signal handling are already written in linux-user/signal.c, I thing about setup_frame(), setup_rt_frame(), do_sigreturn() and do_rt_sigreturn(). Do we need more ? > My supplied test case shows that sigaltstack works unless I am > overseeing anything? Laurent Vivier (CC'ed) who has done some > extensive qemu development thinks that my change should be enough. > > Here's the output of my test case (CC'ing Michael Karcher who > suggested the test case): > > (sid-sh4-sbuild)root@jessie32:/tmp# cat stackoverflow.c > > #include <setjmp.h> > #include <signal.h> > #include <stdlib.h> > #include <stdio.h> > > jmp_buf exit_jmp; > > void handler(int x) > { > longjmp(exit_jmp, 1); > } > > int f(void) > { > return f(); > } > > int main(void) > { > stack_t sigstack; > sigstack.ss_sp = malloc(1024*1024); > sigstack.ss_size = 1024*1024; > sigstack.ss_flags = 0; > sigaltstack(&sigstack, NULL); > struct sigaction sa; > sa.sa_handler = handler; > sigemptyset(&sa.sa_mask); > sa.sa_flags = SA_ONSTACK; > sigaction(SIGSEGV, &sa, NULL); > if (setjmp(exit_jmp) == 0) > { > return f(); > } > puts("recovered"); > return 0; > } > (sid-sh4-sbuild)root@jessie32:/tmp# gcc stackoverflow.c -o stackoverflow > (sid-sh4-sbuild)root@jessie32:/tmp# ./stackoverflow > recovered > (sid-sh4-sbuild)root@jessie32:/tmp# > > Now commenting "sigaltstack" out: > > (sid-sh4-sbuild)root@jessie32:/tmp# cat stackoverflow.c > > #include <setjmp.h> > #include <signal.h> > #include <stdlib.h> > #include <stdio.h> > > jmp_buf exit_jmp; > > void handler(int x) > { > longjmp(exit_jmp, 1); > } > > int f(void) > { > return f(); > } > > int main(void) > { > stack_t sigstack; > sigstack.ss_sp = malloc(1024*1024); > sigstack.ss_size = 1024*1024; > sigstack.ss_flags = 0; > // sigaltstack(&sigstack, NULL); > struct sigaction sa; > sa.sa_handler = handler; > sigemptyset(&sa.sa_mask); > sa.sa_flags = SA_ONSTACK; > sigaction(SIGSEGV, &sa, NULL); > if (setjmp(exit_jmp) == 0) > { > return f(); > } > puts("recovered"); > return 0; > } > (sid-sh4-sbuild)root@jessie32:/tmp# gcc stackoverflow.c -o stackoverflow > (sid-sh4-sbuild)root@jessie32:/tmp# ./stackoverflow > qemu: uncaught target signal 11 (Segmentation fault) - core dumped > Segmentation fault > (sid-sh4-sbuild)root@jessie32:/tmp# > > Thus, for me it seems sigaltstack behaves as expected with the patch > applied. > > Am I missing something obvious? > > Cheers, > Adrian >