21
21
#include <sys/ucontext.h>
22
22
#include <sys/resource.h>
23
23
#include <sys/syscall.h>
24
+ #include <sys/signal.h>
24
25
25
26
#include "qemu.h"
26
27
#include "qemu-common.h"
@@ -38,7 +39,7 @@ static struct target_sigaction sigact_table[TARGET_NSIG];
38
39
static void host_signal_handler (int host_signum , siginfo_t * info ,
39
40
void * puc );
40
41
41
- static uint8_t host_to_target_signal_table [_NSIG ] = {
42
+ static uint8_t host_to_target_signal_table [NSIG ] = {
42
43
[SIGHUP ] = TARGET_SIGHUP ,
43
44
[SIGINT ] = TARGET_SIGINT ,
44
45
[SIGQUIT ] = TARGET_SIGQUIT ,
@@ -71,18 +72,32 @@ static uint8_t host_to_target_signal_table[_NSIG] = {
71
72
[SIGPROF ] = TARGET_SIGPROF ,
72
73
[SIGWINCH ] = TARGET_SIGWINCH ,
73
74
[SIGIO ] = TARGET_SIGIO ,
75
+ #ifdef SIGPWR
74
76
[SIGPWR ] = TARGET_SIGPWR ,
77
+ #endif
75
78
[SIGSYS ] = TARGET_SIGSYS ,
76
79
/* next signals stay the same */
77
80
/* Nasty hack: Reverse SIGRTMIN and SIGRTMAX to avoid overlap with
78
81
host libpthread signals. This assumes no one actually uses SIGRTMAX :-/
79
82
To fix this properly we need to do manual signal delivery multiplexed
80
83
over a single host signal. */
84
+ #if defined(__SIGRTMIN ) && defined (__SIGRTMAX )
81
85
[__SIGRTMIN ] = __SIGRTMAX ,
82
86
[__SIGRTMAX ] = __SIGRTMIN ,
87
+ #endif
83
88
};
84
89
static uint8_t target_to_host_signal_table [TARGET_NSIG ];
85
90
91
+ /** `sigorset` is a Linux specific function in `signal.h` that provides the union (logical OR)
92
+ * of two `sigset_t`s. Since macOS `sigset_t` is a u32, this is simple to shim.
93
+ * http://refspecs.linux-foundation.org/LSB_4.0.0/LSB-Core-generic/LSB-Core-generic/baselib-sigorset.html
94
+ */
95
+ static int inline sigorset (sigset_t * dest , const sigset_t * left , const sigset_t * right ) {
96
+ * dest = * left | * right ;
97
+
98
+ return 0 ;
99
+ }
100
+
86
101
static inline int on_sig_stack (unsigned long sp )
87
102
{
88
103
return (sp - target_sigaltstack_used .ss_sp
@@ -97,7 +112,7 @@ static inline int sas_ss_flags(unsigned long sp)
97
112
98
113
int host_to_target_signal (int sig )
99
114
{
100
- if (sig < 0 || sig >= _NSIG )
115
+ if (sig < 0 || sig >= NSIG )
101
116
return sig ;
102
117
return host_to_target_signal_table [sig ];
103
118
}
@@ -137,7 +152,7 @@ static void host_to_target_sigset_internal(target_sigset_t *d,
137
152
{
138
153
int i ;
139
154
target_sigemptyset (d );
140
- for (i = 1 ; i <= _NSIG ; i ++ ) {
155
+ for (i = 1 ; i <= NSIG ; i ++ ) {
141
156
if (sigismember (s , i )) {
142
157
target_sigaddset (d , host_to_target_signal (i ));
143
158
}
@@ -319,8 +334,8 @@ static inline void host_to_target_siginfo_noswap(target_siginfo_t *tinfo,
319
334
320
335
switch (si_code ) {
321
336
case SI_USER :
322
- case SI_TKILL :
323
- case SI_KERNEL :
337
+ // case SI_TKILL:
338
+ // case SI_KERNEL:
324
339
/* Sent via kill(), tkill() or tgkill(), or direct from the kernel.
325
340
* These are the only unspoofable si_code values.
326
341
*/
@@ -338,13 +353,13 @@ static inline void host_to_target_siginfo_noswap(target_siginfo_t *tinfo,
338
353
#endif
339
354
tinfo -> _sifields ._sigchld ._status
340
355
= host_to_target_waitstatus (info -> si_status );
341
- tinfo -> _sifields ._sigchld ._utime = info -> si_utime ;
342
- tinfo -> _sifields ._sigchld ._stime = info -> si_stime ;
356
+ // tinfo->_sifields._sigchld._utime = info->si_utime;
357
+ // tinfo->_sifields._sigchld._stime = info->si_stime;
343
358
si_type = QEMU_SI_CHLD ;
344
359
break ;
345
360
case TARGET_SIGIO :
346
361
tinfo -> _sifields ._sigpoll ._band = info -> si_band ;
347
- tinfo -> _sifields ._sigpoll ._fd = info -> si_fd ;
362
+ // tinfo->_sifields._sigpoll._fd = info->si_fd;
348
363
si_type = QEMU_SI_POLL ;
349
364
break ;
350
365
default :
@@ -495,11 +510,11 @@ void signal_init(CPUArchState *env)
495
510
int host_sig ;
496
511
497
512
/* generate signal conversion tables */
498
- for (i = 1 ; i < _NSIG ; i ++ ) {
513
+ for (i = 1 ; i < NSIG ; i ++ ) {
499
514
if (host_to_target_signal_table [i ] == 0 )
500
515
host_to_target_signal_table [i ] = i ;
501
516
}
502
- for (i = 1 ; i < _NSIG ; i ++ ) {
517
+ for (i = 1 ; i < NSIG ; i ++ ) {
503
518
j = host_to_target_signal_table [i ];
504
519
if (j < TARGET_NSIG )
505
520
target_to_host_signal_table [j ] = i ;
@@ -579,6 +594,7 @@ static void QEMU_NORETURN dump_core_and_abort(CPUArchState *env, int target_sig)
579
594
struct sigaction act ;
580
595
581
596
host_sig = target_to_host_signal (target_sig );
597
+ // TODO: why isn't this function defined anywhere? macro?
582
598
trace_user_force_sig (env , target_sig , host_sig );
583
599
gdb_signalled (env , target_sig );
584
600
@@ -631,6 +647,7 @@ int queue_signal(CPUArchState *env, int sig, int si_type,
631
647
CPUState * cpu = ENV_GET_CPU (env );
632
648
TaskState * ts = cpu -> opaque ;
633
649
650
+ /* is this a real function? */
634
651
trace_user_queue_signal (env , sig );
635
652
636
653
info -> si_code = deposit32 (info -> si_code , 16 , 16 , si_type );
0 commit comments