Commit d2bfb39ad220a6431e366bdff72353b09f60e3db

Authored by bellard
1 parent 3611a29c

use the kernel sigaction syscall to avoid relying on glibc one


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1044 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 3 changed files with 39 additions and 11 deletions
@@ -144,6 +144,22 @@ void *shmat(int shmid, const void *shmaddr, int shmflg) @@ -144,6 +144,22 @@ void *shmat(int shmid, const void *shmaddr, int shmflg)
144 } 144 }
145 145
146 /****************************************************************/ 146 /****************************************************************/
  147 +/* sigaction bypassing the threads */
  148 +
  149 +static int kernel_sigaction(int signum, const struct qemu_sigaction *act,
  150 + struct qemu_sigaction *oldact,
  151 + int sigsetsize)
  152 +{
  153 + QEMU_SYSCALL4(rt_sigaction, signum, act, oldact, sigsetsize);
  154 +}
  155 +
  156 +int qemu_sigaction(int signum, const struct qemu_sigaction *act,
  157 + struct qemu_sigaction *oldact)
  158 +{
  159 + return kernel_sigaction(signum, act, oldact, 8);
  160 +}
  161 +
  162 +/****************************************************************/
147 /* memory allocation */ 163 /* memory allocation */
148 164
149 //#define DEBUG_MALLOC 165 //#define DEBUG_MALLOC
@@ -22,6 +22,29 @@ void *get_mmap_addr(unsigned long size); @@ -22,6 +22,29 @@ void *get_mmap_addr(unsigned long size);
22 extern void __longjmp(jmp_buf env, int val); 22 extern void __longjmp(jmp_buf env, int val);
23 #define longjmp __longjmp 23 #define longjmp __longjmp
24 24
  25 +#include <signal.h>
  26 +
  27 +/* NOTE: it works only because the glibc sigset_t is >= kernel sigset_t */
  28 +struct qemu_sigaction {
  29 + union {
  30 + void (*_sa_handler)(int);
  31 + void (*_sa_sigaction)(int, struct siginfo *, void *);
  32 + } _u;
  33 + unsigned long sa_flags;
  34 + void (*sa_restorer)(void);
  35 + sigset_t sa_mask; /* mask last for extensibility */
  36 +};
  37 +
  38 +int qemu_sigaction(int signum, const struct qemu_sigaction *act,
  39 + struct qemu_sigaction *oldact);
  40 +
  41 +#undef sigaction
  42 +#undef sa_handler
  43 +#undef sa_sigaction
  44 +#define sigaction qemu_sigaction
  45 +#define sa_handler _u._sa_handler
  46 +#define sa_sigaction _u._sa_sigaction
  47 +
25 #endif 48 #endif
26 49
27 #endif 50 #endif
@@ -68,17 +68,6 @@ @@ -68,17 +68,6 @@
68 #ifdef __APPLE__ 68 #ifdef __APPLE__
69 #include <SDL/SDL.h> 69 #include <SDL/SDL.h>
70 #endif 70 #endif
71 -#if defined(__linux__)  
72 -/* SDL use the pthreads and they modify sigaction. We don't  
73 - want that. */  
74 -#if (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2))  
75 -extern void __libc_sigaction();  
76 -#define sigaction(sig, act, oact) __libc_sigaction(sig, act, oact)  
77 -#else  
78 -extern void __sigaction();  
79 -#define sigaction(sig, act, oact) __sigaction(sig, act, oact)  
80 -#endif  
81 -#endif /* __linux__ */  
82 #endif /* CONFIG_SDL */ 71 #endif /* CONFIG_SDL */
83 72
84 #include "disas.h" 73 #include "disas.h"