114
104
static inline int host_to_target_signal(int sig)
116
108
return host_to_target_signal_table[sig];
119
static inline int target_to_host_signal(int sig)
111
int target_to_host_signal(int sig)
121
115
return target_to_host_signal_table[sig];
118
static inline void target_sigemptyset(target_sigset_t *set)
120
memset(set, 0, sizeof(*set));
123
static inline void target_sigaddset(target_sigset_t *set, int signum)
126
abi_ulong mask = (abi_ulong)1 << (signum % TARGET_NSIG_BPW);
127
set->sig[signum / TARGET_NSIG_BPW] |= mask;
130
static inline int target_sigismember(const target_sigset_t *set, int signum)
133
abi_ulong mask = (abi_ulong)1 << (signum % TARGET_NSIG_BPW);
134
return ((set->sig[signum / TARGET_NSIG_BPW] & mask) != 0);
124
137
static void host_to_target_sigset_internal(target_sigset_t *d,
125
138
const sigset_t *s)
128
unsigned long sigmask;
129
uint32_t target_sigmask;
131
sigmask = ((unsigned long *)s)[0];
133
for(i = 0; i < 32; i++) {
134
if (sigmask & (1 << i))
135
target_sigmask |= 1 << (host_to_target_signal(i + 1) - 1);
137
#if TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 32
138
d->sig[0] = target_sigmask;
139
for(i = 1;i < TARGET_NSIG_WORDS; i++) {
140
d->sig[i] = ((unsigned long *)s)[i];
142
#elif TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 64 && TARGET_NSIG_WORDS == 2
143
d->sig[0] = target_sigmask;
144
d->sig[1] = sigmask >> 32;
141
target_sigemptyset(d);
142
for (i = 1; i <= TARGET_NSIG; i++) {
143
if (sigismember(s, i)) {
144
target_sigaddset(d, host_to_target_signal(i));
150
149
void host_to_target_sigset(target_sigset_t *d, const sigset_t *s)
297
306
/* set all host signal handlers. ALL signals are blocked during
298
307
the handlers to serialize them. */
308
memset(sigact_table, 0, sizeof(sigact_table));
299
310
sigfillset(&act.sa_mask);
300
311
act.sa_flags = SA_SIGINFO;
301
312
act.sa_sigaction = host_signal_handler;
302
for(i = 1; i < NSIG; i++) {
303
sigaction(i, &act, NULL);
313
for(i = 1; i <= TARGET_NSIG; i++) {
314
host_sig = target_to_host_signal(i);
315
sigaction(host_sig, NULL, &oact);
316
if (oact.sa_sigaction == (void *)SIG_IGN) {
317
sigact_table[i - 1]._sa_handler = TARGET_SIG_IGN;
318
} else if (oact.sa_sigaction == (void *)SIG_DFL) {
319
sigact_table[i - 1]._sa_handler = TARGET_SIG_DFL;
321
/* If there's already a handler installed then something has
322
gone horribly wrong, so don't even try to handle that case. */
323
/* Install some handlers for our own use. We need at least
324
SIGSEGV and SIGBUS, to detect exceptions. We can not just
325
trap all signals because it affects syscall interrupt
326
behavior. But do trap all default-fatal signals. */
327
if (fatal_signal (i))
328
sigaction(host_sig, &act, NULL);
306
memset(sigact_table, 0, sizeof(sigact_table));
308
first_free = &sigqueue_table[0];
309
for(i = 0; i < MAX_SIGQUEUE_SIZE - 1; i++)
310
sigqueue_table[i].next = &sigqueue_table[i + 1];
311
sigqueue_table[MAX_SIGQUEUE_SIZE - 1].next = NULL;
314
332
/* signal queue handling */
316
static inline struct sigqueue *alloc_sigqueue(void)
334
static inline struct sigqueue *alloc_sigqueue(CPUState *env)
318
struct sigqueue *q = first_free;
336
TaskState *ts = env->opaque;
337
struct sigqueue *q = ts->first_free;
321
first_free = q->next;
340
ts->first_free = q->next;
325
static inline void free_sigqueue(struct sigqueue *q)
344
static inline void free_sigqueue(CPUState *env, struct sigqueue *q)
327
q->next = first_free;
346
TaskState *ts = env->opaque;
347
q->next = ts->first_free;
331
351
/* abort execution with signal */
332
void __attribute((noreturn)) force_sig(int sig)
352
static void QEMU_NORETURN force_sig(int sig)
335
355
host_sig = target_to_host_signal(sig);
336
356
fprintf(stderr, "qemu: uncaught target signal %d (%s) - exiting\n",
337
357
sig, strsignal(host_sig));
359
gdb_signalled(thread_env, sig);
339
360
_exit(-host_sig);
352
373
/* queue a signal so that it will be send to the virtual CPU as soon
354
int queue_signal(int sig, target_siginfo_t *info)
375
int queue_signal(CPUState *env, int sig, target_siginfo_t *info)
356
struct emulated_sigaction *k;
377
TaskState *ts = env->opaque;
378
struct emulated_sigtable *k;
357
379
struct sigqueue *q, **pq;
358
380
abi_ulong handler;
360
383
#if defined(DEBUG_SIGNAL)
361
384
fprintf(stderr, "queue_signal: sig=%d\n",
364
k = &sigact_table[sig - 1];
365
handler = k->sa._sa_handler;
366
if (handler == TARGET_SIG_DFL) {
387
k = &ts->sigtab[sig - 1];
388
queue = gdb_queuesig ();
389
handler = sigact_table[sig - 1]._sa_handler;
390
if (!queue && handler == TARGET_SIG_DFL) {
391
if (sig == TARGET_SIGTSTP || sig == TARGET_SIGTTIN || sig == TARGET_SIGTTOU) {
392
kill(getpid(),SIGSTOP);
367
395
/* default handler : ignore some signal. The other are fatal */
368
396
if (sig != TARGET_SIGCHLD &&
369
397
sig != TARGET_SIGURG &&
370
sig != TARGET_SIGWINCH) {
398
sig != TARGET_SIGWINCH &&
399
sig != TARGET_SIGCONT) {
373
402
return 0; /* indicate ignored */
375
} else if (handler == TARGET_SIG_IGN) {
404
} else if (!queue && handler == TARGET_SIG_IGN) {
376
405
/* ignore signal */
378
} else if (handler == TARGET_SIG_ERR) {
407
} else if (!queue && handler == TARGET_SIG_ERR) {
513
543
sig, (int)act, (int)oact);
516
oact->_sa_handler = tswapl(k->sa._sa_handler);
517
oact->sa_flags = tswapl(k->sa.sa_flags);
546
oact->_sa_handler = tswapl(k->_sa_handler);
547
oact->sa_flags = tswapl(k->sa_flags);
518
548
#if !defined(TARGET_MIPS)
519
oact->sa_restorer = tswapl(k->sa.sa_restorer);
549
oact->sa_restorer = tswapl(k->sa_restorer);
521
oact->sa_mask = k->sa.sa_mask;
551
oact->sa_mask = k->sa_mask;
524
k->sa._sa_handler = tswapl(act->_sa_handler);
525
k->sa.sa_flags = tswapl(act->sa_flags);
554
/* FIXME: This is not threadsafe. */
555
k->_sa_handler = tswapl(act->_sa_handler);
556
k->sa_flags = tswapl(act->sa_flags);
526
557
#if !defined(TARGET_MIPS)
527
k->sa.sa_restorer = tswapl(act->sa_restorer);
558
k->sa_restorer = tswapl(act->sa_restorer);
529
k->sa.sa_mask = act->sa_mask;
560
k->sa_mask = act->sa_mask;
531
562
/* we update the host linux signal state */
532
563
host_sig = target_to_host_signal(sig);
533
564
if (host_sig != SIGSEGV && host_sig != SIGBUS) {
534
565
sigfillset(&act1.sa_mask);
535
566
act1.sa_flags = SA_SIGINFO;
536
if (k->sa.sa_flags & TARGET_SA_RESTART)
567
if (k->sa_flags & TARGET_SA_RESTART)
537
568
act1.sa_flags |= SA_RESTART;
538
569
/* NOTE: it is important to update the host kernel signal
539
570
ignore state to avoid getting unexpected interrupted
541
if (k->sa._sa_handler == TARGET_SIG_IGN) {
572
if (k->_sa_handler == TARGET_SIG_IGN) {
542
573
act1.sa_sigaction = (void *)SIG_IGN;
543
} else if (k->sa._sa_handler == TARGET_SIG_DFL) {
544
act1.sa_sigaction = (void *)SIG_DFL;
574
} else if (k->_sa_handler == TARGET_SIG_DFL) {
575
if (fatal_signal (sig))
576
act1.sa_sigaction = host_signal_handler;
578
act1.sa_sigaction = (void *)SIG_DFL;
546
580
act1.sa_sigaction = host_signal_handler;
1077
1129
setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/
1078
1130
CPUState *env, abi_ulong mask)
1082
__put_user_error(env->regs[0], &sc->arm_r0, err);
1083
__put_user_error(env->regs[1], &sc->arm_r1, err);
1084
__put_user_error(env->regs[2], &sc->arm_r2, err);
1085
__put_user_error(env->regs[3], &sc->arm_r3, err);
1086
__put_user_error(env->regs[4], &sc->arm_r4, err);
1087
__put_user_error(env->regs[5], &sc->arm_r5, err);
1088
__put_user_error(env->regs[6], &sc->arm_r6, err);
1089
__put_user_error(env->regs[7], &sc->arm_r7, err);
1090
__put_user_error(env->regs[8], &sc->arm_r8, err);
1091
__put_user_error(env->regs[9], &sc->arm_r9, err);
1092
__put_user_error(env->regs[10], &sc->arm_r10, err);
1093
__put_user_error(env->regs[11], &sc->arm_fp, err);
1094
__put_user_error(env->regs[12], &sc->arm_ip, err);
1095
__put_user_error(env->regs[13], &sc->arm_sp, err);
1096
__put_user_error(env->regs[14], &sc->arm_lr, err);
1097
__put_user_error(env->regs[15], &sc->arm_pc, err);
1132
__put_user(env->regs[0], &sc->arm_r0);
1133
__put_user(env->regs[1], &sc->arm_r1);
1134
__put_user(env->regs[2], &sc->arm_r2);
1135
__put_user(env->regs[3], &sc->arm_r3);
1136
__put_user(env->regs[4], &sc->arm_r4);
1137
__put_user(env->regs[5], &sc->arm_r5);
1138
__put_user(env->regs[6], &sc->arm_r6);
1139
__put_user(env->regs[7], &sc->arm_r7);
1140
__put_user(env->regs[8], &sc->arm_r8);
1141
__put_user(env->regs[9], &sc->arm_r9);
1142
__put_user(env->regs[10], &sc->arm_r10);
1143
__put_user(env->regs[11], &sc->arm_fp);
1144
__put_user(env->regs[12], &sc->arm_ip);
1145
__put_user(env->regs[13], &sc->arm_sp);
1146
__put_user(env->regs[14], &sc->arm_lr);
1147
__put_user(env->regs[15], &sc->arm_pc);
1098
1148
#ifdef TARGET_CONFIG_CPU_32
1099
__put_user_error(cpsr_read(env), &sc->arm_cpsr, err);
1149
__put_user(cpsr_read(env), &sc->arm_cpsr);
1102
__put_user_error(/* current->thread.trap_no */ 0, &sc->trap_no, err);
1103
__put_user_error(/* current->thread.error_code */ 0, &sc->error_code, err);
1104
__put_user_error(/* current->thread.address */ 0, &sc->fault_address, err);
1105
__put_user_error(mask, &sc->oldmask, err);
1152
__put_user(/* current->thread.trap_no */ 0, &sc->trap_no);
1153
__put_user(/* current->thread.error_code */ 0, &sc->error_code);
1154
__put_user(/* current->thread.address */ 0, &sc->fault_address);
1155
__put_user(mask, &sc->oldmask);
1110
1158
static inline abi_ulong
1111
get_sigframe(struct emulated_sigaction *ka, CPUState *regs, int framesize)
1159
get_sigframe(struct target_sigaction *ka, CPUState *regs, int framesize)
1113
1161
unsigned long sp = regs->regs[13];
1116
1164
* This is the X/Open sanctioned signal stack switching.
1118
if ((ka->sa.sa_flags & TARGET_SA_ONSTACK) && !sas_ss_flags(sp))
1166
if ((ka->sa_flags & TARGET_SA_ONSTACK) && !sas_ss_flags(sp))
1119
1167
sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
1121
1169
* ATPCS B01 mandates 8-byte alignment
1127
setup_return(CPUState *env, struct emulated_sigaction *ka,
1175
setup_return(CPUState *env, struct target_sigaction *ka,
1128
1176
abi_ulong *rc, abi_ulong frame_addr, int usig, abi_ulong rc_addr)
1130
abi_ulong handler = ka->sa._sa_handler;
1178
abi_ulong handler = ka->_sa_handler;
1131
1179
abi_ulong retcode;
1133
#if defined(TARGET_CONFIG_CPU_32)
1135
abi_ulong cpsr = env->cpsr;
1138
* Maybe we need to deliver a 32-bit signal to a 26-bit task.
1140
if (ka->sa.sa_flags & SA_THIRTYTWO)
1141
cpsr = (cpsr & ~MODE_MASK) | USR_MODE;
1143
#ifdef CONFIG_ARM_THUMB
1144
if (elf_hwcap & HWCAP_THUMB) {
1146
* The LSB of the handler determines if we're going to
1147
* be using THUMB or ARM mode for this signal handler.
1149
thumb = handler & 1;
1156
#endif /* CONFIG_ARM_THUMB */
1158
#endif /* TARGET_CONFIG_CPU_32 */
1160
if (ka->sa.sa_flags & TARGET_SA_RESTORER) {
1161
retcode = ka->sa.sa_restorer;
1180
int thumb = handler & 1;
1182
if (ka->sa_flags & TARGET_SA_RESTORER) {
1183
retcode = ka->sa_restorer;
1163
1185
unsigned int idx = thumb;
1165
if (ka->sa.sa_flags & TARGET_SA_SIGINFO)
1187
if (ka->sa_flags & TARGET_SA_SIGINFO)
1168
1190
if (__put_user(retcodes[idx], rc))
1214
static void setup_sigframe_v2(struct target_ucontext_v2 *uc,
1215
target_sigset_t *set, CPUState *env)
1217
struct target_sigaltstack stack;
1220
/* Clear all the bits of the ucontext we don't use. */
1221
memset(uc, 0, offsetof(struct target_ucontext_v2, tuc_mcontext));
1223
memset(&stack, 0, sizeof(stack));
1224
__put_user(target_sigaltstack_used.ss_sp, &stack.ss_sp);
1225
__put_user(target_sigaltstack_used.ss_size, &stack.ss_size);
1226
__put_user(sas_ss_flags(get_sp_from_cpustate(env)), &stack.ss_flags);
1227
memcpy(&uc->tuc_stack, &stack, sizeof(stack));
1229
setup_sigcontext(&uc->tuc_mcontext, env, set->sig[0]);
1230
/* FIXME: Save coprocessor signal frame. */
1231
for(i = 0; i < TARGET_NSIG_WORDS; i++) {
1232
__put_user(set->sig[i], &uc->tuc_sigmask.sig[i]);
1191
1236
/* compare linux/arch/arm/kernel/signal.c:setup_frame() */
1192
static void setup_frame(int usig, struct emulated_sigaction *ka,
1193
target_sigset_t *set, CPUState *regs)
1237
static void setup_frame_v1(int usig, struct target_sigaction *ka,
1238
target_sigset_t *set, CPUState *regs)
1195
struct sigframe *frame;
1240
struct sigframe_v1 *frame;
1196
1241
abi_ulong frame_addr = get_sigframe(ka, regs, sizeof(*frame));
1199
1244
if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
1202
err |= setup_sigcontext(&frame->sc, /*&frame->fpstate,*/ regs, set->sig[0]);
1247
setup_sigcontext(&frame->sc, regs, set->sig[0]);
1204
1249
for(i = 1; i < TARGET_NSIG_WORDS; i++) {
1205
1250
if (__put_user(set->sig[i], &frame->extramask[i - 1]))
1210
err = setup_return(regs, ka, &frame->retcode, frame_addr, usig,
1211
frame_addr + offsetof(struct sigframe, retcode));
1254
setup_return(regs, ka, &frame->retcode, frame_addr, usig,
1255
frame_addr + offsetof(struct sigframe_v1, retcode));
1214
1258
unlock_user_struct(frame, frame_addr, 1);
1261
static void setup_frame_v2(int usig, struct target_sigaction *ka,
1262
target_sigset_t *set, CPUState *regs)
1264
struct sigframe_v2 *frame;
1265
abi_ulong frame_addr = get_sigframe(ka, regs, sizeof(*frame));
1267
if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
1270
setup_sigframe_v2(&frame->uc, set, regs);
1272
setup_return(regs, ka, &frame->retcode, frame_addr, usig,
1273
frame_addr + offsetof(struct sigframe_v2, retcode));
1275
unlock_user_struct(frame, frame_addr, 1);
1278
static void setup_frame(int usig, struct target_sigaction *ka,
1279
target_sigset_t *set, CPUState *regs)
1281
if (get_osversion() >= 0x020612) {
1282
setup_frame_v2(usig, ka, set, regs);
1284
setup_frame_v1(usig, ka, set, regs);
1218
1288
/* compare linux/arch/arm/kernel/signal.c:setup_rt_frame() */
1219
static void setup_rt_frame(int usig, struct emulated_sigaction *ka,
1220
target_siginfo_t *info,
1221
target_sigset_t *set, CPUState *env)
1289
static void setup_rt_frame_v1(int usig, struct target_sigaction *ka,
1290
target_siginfo_t *info,
1291
target_sigset_t *set, CPUState *env)
1223
struct rt_sigframe *frame;
1293
struct rt_sigframe_v1 *frame;
1224
1294
abi_ulong frame_addr = get_sigframe(ka, env, sizeof(*frame));
1225
1295
struct target_sigaltstack stack;
1227
1297
abi_ulong info_addr, uc_addr;
1229
1299
if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
1230
1300
return /* 1 */;
1232
info_addr = frame_addr + offsetof(struct rt_sigframe, info);
1233
__put_user_error(info_addr, &frame->pinfo, err);
1234
uc_addr = frame_addr + offsetof(struct rt_sigframe, uc);
1235
__put_user_error(uc_addr, &frame->puc, err);
1236
err |= copy_siginfo_to_user(&frame->info, info);
1302
info_addr = frame_addr + offsetof(struct rt_sigframe_v1, info);
1303
__put_user(info_addr, &frame->pinfo);
1304
uc_addr = frame_addr + offsetof(struct rt_sigframe_v1, uc);
1305
__put_user(uc_addr, &frame->puc);
1306
copy_siginfo_to_user(&frame->info, info);
1238
1308
/* Clear all the bits of the ucontext we don't use. */
1239
memset(&frame->uc, 0, offsetof(struct target_ucontext, tuc_mcontext));
1309
memset(&frame->uc, 0, offsetof(struct target_ucontext_v1, tuc_mcontext));
1241
1311
memset(&stack, 0, sizeof(stack));
1242
1312
__put_user(target_sigaltstack_used.ss_sp, &stack.ss_sp);
1244
1314
__put_user(sas_ss_flags(get_sp_from_cpustate(env)), &stack.ss_flags);
1245
1315
memcpy(&frame->uc.tuc_stack, &stack, sizeof(stack));
1247
err |= setup_sigcontext(&frame->uc.tuc_mcontext, /*&frame->fpstate,*/
1317
setup_sigcontext(&frame->uc.tuc_mcontext, env, set->sig[0]);
1249
1318
for(i = 0; i < TARGET_NSIG_WORDS; i++) {
1250
1319
if (__put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]))
1255
err = setup_return(env, ka, &frame->retcode, frame_addr, usig,
1256
frame_addr + offsetof(struct rt_sigframe, retcode));
1323
setup_return(env, ka, &frame->retcode, frame_addr, usig,
1324
frame_addr + offsetof(struct rt_sigframe_v1, retcode));
1260
* For realtime signals we must also set the second and third
1261
* arguments for the signal handler.
1262
* -- Peter Maydell <pmaydell@chiark.greenend.org.uk> 2000-12-06
1264
env->regs[1] = info_addr;
1265
env->regs[2] = uc_addr;
1326
env->regs[1] = info_addr;
1327
env->regs[2] = uc_addr;
1269
1330
unlock_user_struct(frame, frame_addr, 1);
1333
static void setup_rt_frame_v2(int usig, struct target_sigaction *ka,
1334
target_siginfo_t *info,
1335
target_sigset_t *set, CPUState *env)
1337
struct rt_sigframe_v2 *frame;
1338
abi_ulong frame_addr = get_sigframe(ka, env, sizeof(*frame));
1339
abi_ulong info_addr, uc_addr;
1341
if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
1344
info_addr = frame_addr + offsetof(struct rt_sigframe_v2, info);
1345
uc_addr = frame_addr + offsetof(struct rt_sigframe_v2, uc);
1346
copy_siginfo_to_user(&frame->info, info);
1348
setup_sigframe_v2(&frame->uc, set, env);
1350
setup_return(env, ka, &frame->retcode, frame_addr, usig,
1351
frame_addr + offsetof(struct rt_sigframe_v2, retcode));
1353
env->regs[1] = info_addr;
1354
env->regs[2] = uc_addr;
1356
unlock_user_struct(frame, frame_addr, 1);
1359
static void setup_rt_frame(int usig, struct target_sigaction *ka,
1360
target_siginfo_t *info,
1361
target_sigset_t *set, CPUState *env)
1363
if (get_osversion() >= 0x020612) {
1364
setup_rt_frame_v2(usig, ka, info, set, env);
1366
setup_rt_frame_v1(usig, ka, info, set, env);
1353
long do_rt_sigreturn(CPUState *env)
1355
abi_ulong frame_addr;
1356
struct rt_sigframe *frame;
1449
static int do_sigframe_return_v2(CPUState *env, target_ulong frame_addr,
1450
struct target_ucontext_v2 *uc)
1454
target_to_host_sigset(&host_set, &uc->tuc_sigmask);
1455
sigprocmask(SIG_SETMASK, &host_set, NULL);
1457
if (restore_sigcontext(env, &uc->tuc_mcontext))
1460
if (do_sigaltstack(frame_addr + offsetof(struct target_ucontext_v2, tuc_stack), 0, get_sp_from_cpustate(env)) == -EFAULT)
1464
/* Send SIGTRAP if we're single-stepping */
1465
if (ptrace_cancel_bpt(current))
1466
send_sig(SIGTRAP, current, 1);
1472
static long do_sigreturn_v2(CPUState *env)
1474
abi_ulong frame_addr;
1475
struct sigframe_v2 *frame;
1478
* Since we stacked the signal on a 64-bit boundary,
1479
* then 'sp' should be word aligned here. If it's
1480
* not, then the user is trying to mess with us.
1482
if (env->regs[13] & 7)
1485
frame_addr = env->regs[13];
1486
if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1))
1489
if (do_sigframe_return_v2(env, frame_addr, &frame->uc))
1492
unlock_user_struct(frame, frame_addr, 0);
1493
return env->regs[0];
1496
unlock_user_struct(frame, frame_addr, 0);
1497
force_sig(SIGSEGV /* , current */);
1501
long do_sigreturn(CPUState *env)
1503
if (get_osversion() >= 0x020612) {
1504
return do_sigreturn_v2(env);
1506
return do_sigreturn_v1(env);
1510
static long do_rt_sigreturn_v1(CPUState *env)
1512
abi_ulong frame_addr;
1513
struct rt_sigframe_v1 *frame;
1357
1514
sigset_t host_set;
2706
2901
force_sig(TARGET_SIGSEGV);
2904
#elif defined(TARGET_CRIS)
2906
struct target_sigcontext {
2907
struct target_pt_regs regs; /* needs to be first */
2909
uint32_t usp; /* usp before stacking this gunk on it */
2912
/* Signal frames. */
2913
struct target_signal_frame {
2914
struct target_sigcontext sc;
2915
uint32_t extramask[TARGET_NSIG_WORDS - 1];
2916
uint8_t retcode[8]; /* Trampoline code. */
2919
struct rt_signal_frame {
2920
struct siginfo *pinfo;
2922
struct siginfo info;
2924
uint8_t retcode[8]; /* Trampoline code. */
2927
static void setup_sigcontext(struct target_sigcontext *sc, CPUState *env)
2929
__put_user(env->regs[0], &sc->regs.r0);
2930
__put_user(env->regs[1], &sc->regs.r1);
2931
__put_user(env->regs[2], &sc->regs.r2);
2932
__put_user(env->regs[3], &sc->regs.r3);
2933
__put_user(env->regs[4], &sc->regs.r4);
2934
__put_user(env->regs[5], &sc->regs.r5);
2935
__put_user(env->regs[6], &sc->regs.r6);
2936
__put_user(env->regs[7], &sc->regs.r7);
2937
__put_user(env->regs[8], &sc->regs.r8);
2938
__put_user(env->regs[9], &sc->regs.r9);
2939
__put_user(env->regs[10], &sc->regs.r10);
2940
__put_user(env->regs[11], &sc->regs.r11);
2941
__put_user(env->regs[12], &sc->regs.r12);
2942
__put_user(env->regs[13], &sc->regs.r13);
2943
__put_user(env->regs[14], &sc->usp);
2944
__put_user(env->regs[15], &sc->regs.acr);
2945
__put_user(env->pregs[PR_MOF], &sc->regs.mof);
2946
__put_user(env->pregs[PR_SRP], &sc->regs.srp);
2947
__put_user(env->pc, &sc->regs.erp);
2950
static void restore_sigcontext(struct target_sigcontext *sc, CPUState *env)
2952
__get_user(env->regs[0], &sc->regs.r0);
2953
__get_user(env->regs[1], &sc->regs.r1);
2954
__get_user(env->regs[2], &sc->regs.r2);
2955
__get_user(env->regs[3], &sc->regs.r3);
2956
__get_user(env->regs[4], &sc->regs.r4);
2957
__get_user(env->regs[5], &sc->regs.r5);
2958
__get_user(env->regs[6], &sc->regs.r6);
2959
__get_user(env->regs[7], &sc->regs.r7);
2960
__get_user(env->regs[8], &sc->regs.r8);
2961
__get_user(env->regs[9], &sc->regs.r9);
2962
__get_user(env->regs[10], &sc->regs.r10);
2963
__get_user(env->regs[11], &sc->regs.r11);
2964
__get_user(env->regs[12], &sc->regs.r12);
2965
__get_user(env->regs[13], &sc->regs.r13);
2966
__get_user(env->regs[14], &sc->usp);
2967
__get_user(env->regs[15], &sc->regs.acr);
2968
__get_user(env->pregs[PR_MOF], &sc->regs.mof);
2969
__get_user(env->pregs[PR_SRP], &sc->regs.srp);
2970
__get_user(env->pc, &sc->regs.erp);
2973
static abi_ulong get_sigframe(CPUState *env, int framesize)
2976
/* Align the stack downwards to 4. */
2977
sp = (env->regs[R_SP] & ~3);
2978
return sp - framesize;
2981
static void setup_frame(int sig, struct target_sigaction *ka,
2982
target_sigset_t *set, CPUState *env)
2984
struct target_signal_frame *frame;
2985
abi_ulong frame_addr;
2989
frame_addr = get_sigframe(env, sizeof *frame);
2990
if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0))
2994
* The CRIS signal return trampoline. A real linux/CRIS kernel doesn't
2995
* use this trampoline anymore but it sets it up for GDB.
2996
* In QEMU, using the trampoline simplifies things a bit so we use it.
2998
* This is movu.w __NR_sigreturn, r9; break 13;
3000
err |= __put_user(0x9c5f, frame->retcode+0);
3001
err |= __put_user(TARGET_NR_sigreturn,
3003
err |= __put_user(0xe93d, frame->retcode+4);
3005
/* Save the mask. */
3006
err |= __put_user(set->sig[0], &frame->sc.oldmask);
3010
for(i = 1; i < TARGET_NSIG_WORDS; i++) {
3011
if (__put_user(set->sig[i], &frame->extramask[i - 1]))
3015
setup_sigcontext(&frame->sc, env);
3017
/* Move the stack and setup the arguments for the handler. */
3018
env->regs[R_SP] = (uint32_t) (unsigned long) frame;
3019
env->regs[10] = sig;
3020
env->pc = (unsigned long) ka->_sa_handler;
3021
/* Link SRP so the guest returns through the trampoline. */
3022
env->pregs[PR_SRP] = (uint32_t) (unsigned long) &frame->retcode[0];
3024
unlock_user_struct(frame, frame_addr, 1);
3027
unlock_user_struct(frame, frame_addr, 1);
3028
force_sig(TARGET_SIGSEGV);
3031
static void setup_rt_frame(int sig, struct target_sigaction *ka,
3032
target_siginfo_t *info,
3033
target_sigset_t *set, CPUState *env)
3035
fprintf(stderr, "CRIS setup_rt_frame: not implemented\n");
3038
long do_sigreturn(CPUState *env)
3040
struct target_signal_frame *frame;
3041
abi_ulong frame_addr;
3042
target_sigset_t target_set;
3046
frame_addr = env->regs[R_SP];
3047
/* Make sure the guest isn't playing games. */
3048
if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 1))
3051
/* Restore blocked signals */
3052
if (__get_user(target_set.sig[0], &frame->sc.oldmask))
3054
for(i = 1; i < TARGET_NSIG_WORDS; i++) {
3055
if (__get_user(target_set.sig[i], &frame->extramask[i - 1]))
3058
target_to_host_sigset_internal(&set, &target_set);
3059
sigprocmask(SIG_SETMASK, &set, NULL);
3061
restore_sigcontext(&frame->sc, env);
3062
unlock_user_struct(frame, frame_addr, 0);
3063
return env->regs[10];
3065
unlock_user_struct(frame, frame_addr, 0);
3066
force_sig(TARGET_SIGSEGV);
3069
long do_rt_sigreturn(CPUState *env)
3071
fprintf(stderr, "CRIS do_rt_sigreturn: not implemented\n");
3072
return -TARGET_ENOSYS;
2712
static void setup_frame(int sig, struct emulated_sigaction *ka,
3077
static void setup_frame(int sig, struct target_sigaction *ka,
2713
3078
target_sigset_t *set, CPUState *env)
2715
3080
fprintf(stderr, "setup_frame: not implemented\n");
2718
static void setup_rt_frame(int sig, struct emulated_sigaction *ka,
3083
static void setup_rt_frame(int sig, struct target_sigaction *ka,
2719
3084
target_siginfo_t *info,
2720
3085
target_sigset_t *set, CPUState *env)