Revision a04e134a
b/linux-user/alpha/target_signal.h | ||
---|---|---|
1 |
#ifndef TARGET_SIGNAL_H |
|
2 |
#define TARGET_SIGNAL_H |
|
3 |
|
|
4 |
#include "cpu.h" |
|
5 |
|
|
6 |
/* this struct defines a stack used during syscall handling */ |
|
7 |
|
|
8 |
typedef struct target_sigaltstack { |
|
9 |
target_ulong ss_sp; |
|
10 |
target_long ss_flags; |
|
11 |
target_ulong ss_size; |
|
12 |
} target_stack_t; |
|
13 |
|
|
14 |
|
|
15 |
/* |
|
16 |
* sigaltstack controls |
|
17 |
*/ |
|
18 |
#define TARGET_SS_ONSTACK 1 |
|
19 |
#define TARGET_SS_DISABLE 2 |
|
20 |
|
|
21 |
#define TARGET_MINSIGSTKSZ 4096 |
|
22 |
#define TARGET_SIGSTKSZ 16384 |
|
23 |
|
|
24 |
#endif /* TARGET_SIGNAL_H */ |
b/linux-user/arm/target_signal.h | ||
---|---|---|
1 |
#ifndef TARGET_SIGNAL_H |
|
2 |
#define TARGET_SIGNAL_H |
|
3 |
|
|
4 |
#include "cpu.h" |
|
5 |
|
|
6 |
/* this struct defines a stack used during syscall handling */ |
|
7 |
|
|
8 |
typedef struct target_sigaltstack { |
|
9 |
target_ulong ss_sp; |
|
10 |
target_long ss_flags; |
|
11 |
target_ulong ss_size; |
|
12 |
} target_stack_t; |
|
13 |
|
|
14 |
|
|
15 |
/* |
|
16 |
* sigaltstack controls |
|
17 |
*/ |
|
18 |
#define TARGET_SS_ONSTACK 1 |
|
19 |
#define TARGET_SS_DISABLE 2 |
|
20 |
|
|
21 |
#define TARGET_MINSIGSTKSZ 2048 |
|
22 |
#define TARGET_SIGSTKSZ 8192 |
|
23 |
|
|
24 |
#endif /* TARGET_SIGNAL_H */ |
b/linux-user/i386/target_signal.h | ||
---|---|---|
1 |
#ifndef TARGET_SIGNAL_H |
|
2 |
#define TARGET_SIGNAL_H |
|
3 |
|
|
4 |
#include "cpu.h" |
|
5 |
|
|
6 |
/* this struct defines a stack used during syscall handling */ |
|
7 |
|
|
8 |
typedef struct target_sigaltstack { |
|
9 |
target_ulong ss_sp; |
|
10 |
target_long ss_flags; |
|
11 |
target_ulong ss_size; |
|
12 |
} target_stack_t; |
|
13 |
|
|
14 |
|
|
15 |
/* |
|
16 |
* sigaltstack controls |
|
17 |
*/ |
|
18 |
#define TARGET_SS_ONSTACK 1 |
|
19 |
#define TARGET_SS_DISABLE 2 |
|
20 |
|
|
21 |
#define TARGET_MINSIGSTKSZ 2048 |
|
22 |
#define TARGET_SIGSTKSZ 8192 |
|
23 |
|
|
24 |
#endif /* TARGET_SIGNAL_H */ |
b/linux-user/m68k/target_signal.h | ||
---|---|---|
1 |
#ifndef TARGET_SIGNAL_H |
|
2 |
#define TARGET_SIGNAL_H |
|
3 |
|
|
4 |
#include "cpu.h" |
|
5 |
|
|
6 |
/* this struct defines a stack used during syscall handling */ |
|
7 |
|
|
8 |
typedef struct target_sigaltstack { |
|
9 |
target_ulong ss_sp; |
|
10 |
target_long ss_flags; |
|
11 |
target_ulong ss_size; |
|
12 |
} target_stack_t; |
|
13 |
|
|
14 |
|
|
15 |
/* |
|
16 |
* sigaltstack controls |
|
17 |
*/ |
|
18 |
#define TARGET_SS_ONSTACK 1 |
|
19 |
#define TARGET_SS_DISABLE 2 |
|
20 |
|
|
21 |
#define TARGET_MINSIGSTKSZ 2048 |
|
22 |
#define TARGET_SIGSTKSZ 8192 |
|
23 |
|
|
24 |
#endif /* TARGET_SIGNAL_H */ |
b/linux-user/mips/target_signal.h | ||
---|---|---|
1 |
#ifndef TARGET_SIGNAL_H |
|
2 |
#define TARGET_SIGNAL_H |
|
3 |
|
|
4 |
#include "cpu.h" |
|
5 |
|
|
6 |
/* this struct defines a stack used during syscall handling */ |
|
7 |
|
|
8 |
typedef struct target_sigaltstack { |
|
9 |
target_ulong ss_sp; |
|
10 |
target_ulong ss_size; |
|
11 |
target_long ss_flags; |
|
12 |
} target_stack_t; |
|
13 |
|
|
14 |
|
|
15 |
/* |
|
16 |
* sigaltstack controls |
|
17 |
*/ |
|
18 |
#define TARGET_SS_ONSTACK 1 |
|
19 |
#define TARGET_SS_DISABLE 2 |
|
20 |
|
|
21 |
#define TARGET_MINSIGSTKSZ 2048 |
|
22 |
#define TARGET_SIGSTKSZ 8192 |
|
23 |
|
|
24 |
#endif /* TARGET_SIGNAL_H */ |
b/linux-user/ppc/target_signal.h | ||
---|---|---|
1 |
#ifndef TARGET_SIGNAL_H |
|
2 |
#define TARGET_SIGNAL_H |
|
3 |
|
|
4 |
#include "cpu.h" |
|
5 |
|
|
6 |
/* this struct defines a stack used during syscall handling */ |
|
7 |
|
|
8 |
typedef struct target_sigaltstack { |
|
9 |
target_ulong ss_sp; |
|
10 |
target_long ss_flags; |
|
11 |
target_ulong ss_size; |
|
12 |
} target_stack_t; |
|
13 |
|
|
14 |
|
|
15 |
/* |
|
16 |
* sigaltstack controls |
|
17 |
*/ |
|
18 |
#define TARGET_SS_ONSTACK 1 |
|
19 |
#define TARGET_SS_DISABLE 2 |
|
20 |
|
|
21 |
#define TARGET_MINSIGSTKSZ 2048 |
|
22 |
#define TARGET_SIGSTKSZ 8192 |
|
23 |
|
|
24 |
#endif /* TARGET_SIGNAL_H */ |
b/linux-user/ppc64/target_signal.h | ||
---|---|---|
1 |
#ifndef TARGET_SIGNAL_H |
|
2 |
#define TARGET_SIGNAL_H |
|
3 |
|
|
4 |
#include "cpu.h" |
|
5 |
|
|
6 |
/* this struct defines a stack used during syscall handling */ |
|
7 |
|
|
8 |
typedef struct target_sigaltstack { |
|
9 |
target_ulong ss_sp; |
|
10 |
target_long ss_flags; |
|
11 |
target_ulong ss_size; |
|
12 |
} target_stack_t; |
|
13 |
|
|
14 |
|
|
15 |
/* |
|
16 |
* sigaltstack controls |
|
17 |
*/ |
|
18 |
#define TARGET_SS_ONSTACK 1 |
|
19 |
#define TARGET_SS_DISABLE 2 |
|
20 |
|
|
21 |
#define TARGET_MINSIGSTKSZ 2048 |
|
22 |
#define TARGET_SIGSTKSZ 8192 |
|
23 |
|
|
24 |
#endif /* TARGET_SIGNAL_H */ |
b/linux-user/qemu.h | ||
---|---|---|
9 | 9 |
|
10 | 10 |
#include "cpu.h" |
11 | 11 |
#include "syscall.h" |
12 |
#include "target_signal.h" |
|
12 | 13 |
#include "gdbstub.h" |
13 | 14 |
|
14 | 15 |
/* This struct is used to hold certain information about the image. |
... | ... | |
149 | 150 |
void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo); |
150 | 151 |
long do_sigreturn(CPUState *env); |
151 | 152 |
long do_rt_sigreturn(CPUState *env); |
153 |
int do_sigaltstack(const struct target_sigaltstack *uss, |
|
154 |
struct target_sigaltstack *uoss, |
|
155 |
target_ulong sp); |
|
152 | 156 |
|
153 | 157 |
#ifdef TARGET_I386 |
154 | 158 |
/* vm86.c */ |
b/linux-user/sh4/target_signal.h | ||
---|---|---|
1 |
#ifndef TARGET_SIGNAL_H |
|
2 |
#define TARGET_SIGNAL_H |
|
3 |
|
|
4 |
#include "cpu.h" |
|
5 |
|
|
6 |
/* this struct defines a stack used during syscall handling */ |
|
7 |
|
|
8 |
typedef struct target_sigaltstack { |
|
9 |
target_ulong ss_sp; |
|
10 |
target_long ss_flags; |
|
11 |
target_ulong ss_size; |
|
12 |
} target_stack_t; |
|
13 |
|
|
14 |
|
|
15 |
/* |
|
16 |
* sigaltstack controls |
|
17 |
*/ |
|
18 |
#define TARGET_SS_ONSTACK 1 |
|
19 |
#define TARGET_SS_DISABLE 2 |
|
20 |
|
|
21 |
#define TARGET_MINSIGSTKSZ 2048 |
|
22 |
#define TARGET_SIGSTKSZ 8192 |
|
23 |
|
|
24 |
#endif /* TARGET_SIGNAL_H */ |
b/linux-user/signal.c | ||
---|---|---|
26 | 26 |
#include <errno.h> |
27 | 27 |
#include <sys/ucontext.h> |
28 | 28 |
|
29 |
#include "target_signal.h" |
|
29 | 30 |
#include "qemu.h" |
30 | 31 |
|
31 | 32 |
//#define DEBUG_SIGNAL |
... | ... | |
45 | 46 |
first signal, we put it here */ |
46 | 47 |
}; |
47 | 48 |
|
49 |
struct target_sigaltstack target_sigaltstack_used = { |
|
50 |
.ss_sp = 0, |
|
51 |
.ss_size = 0, |
|
52 |
.ss_flags = TARGET_SS_DISABLE, |
|
53 |
}; |
|
54 |
|
|
48 | 55 |
static struct emulated_sigaction sigact_table[TARGET_NSIG]; |
49 | 56 |
static struct sigqueue sigqueue_table[MAX_SIGQUEUE_SIZE]; /* siginfo queue */ |
50 | 57 |
static struct sigqueue *first_free; /* first free siginfo queue entry */ |
... | ... | |
92 | 99 |
}; |
93 | 100 |
static uint8_t target_to_host_signal_table[65]; |
94 | 101 |
|
102 |
static inline int on_sig_stack(unsigned long sp) |
|
103 |
{ |
|
104 |
return (sp - target_sigaltstack_used.ss_sp |
|
105 |
< target_sigaltstack_used.ss_size); |
|
106 |
} |
|
107 |
|
|
108 |
static inline int sas_ss_flags(unsigned long sp) |
|
109 |
{ |
|
110 |
return (target_sigaltstack_used.ss_size == 0 ? SS_DISABLE |
|
111 |
: on_sig_stack(sp) ? SS_ONSTACK : 0); |
|
112 |
} |
|
113 |
|
|
95 | 114 |
static inline int host_to_target_signal(int sig) |
96 | 115 |
{ |
97 | 116 |
return host_to_target_signal_table[sig]; |
... | ... | |
419 | 438 |
} |
420 | 439 |
} |
421 | 440 |
|
441 |
int do_sigaltstack(const struct target_sigaltstack *uss, |
|
442 |
struct target_sigaltstack *uoss, |
|
443 |
target_ulong sp) |
|
444 |
{ |
|
445 |
int ret; |
|
446 |
struct target_sigaltstack oss; |
|
447 |
|
|
448 |
/* XXX: test errors */ |
|
449 |
if(uoss) |
|
450 |
{ |
|
451 |
__put_user(target_sigaltstack_used.ss_sp, &oss.ss_sp); |
|
452 |
__put_user(target_sigaltstack_used.ss_size, &oss.ss_size); |
|
453 |
__put_user(sas_ss_flags(sp), &oss.ss_flags); |
|
454 |
} |
|
455 |
|
|
456 |
if(uss) |
|
457 |
{ |
|
458 |
struct target_sigaltstack ss; |
|
459 |
|
|
460 |
ret = -EFAULT; |
|
461 |
if (!access_ok(VERIFY_READ, uss, sizeof(*uss)) |
|
462 |
|| __get_user(ss.ss_sp, &uss->ss_sp) |
|
463 |
|| __get_user(ss.ss_size, &uss->ss_size) |
|
464 |
|| __get_user(ss.ss_flags, &uss->ss_flags)) |
|
465 |
goto out; |
|
466 |
|
|
467 |
ret = -EPERM; |
|
468 |
if (on_sig_stack(sp)) |
|
469 |
goto out; |
|
470 |
|
|
471 |
ret = -EINVAL; |
|
472 |
if (ss.ss_flags != TARGET_SS_DISABLE |
|
473 |
&& ss.ss_flags != TARGET_SS_ONSTACK |
|
474 |
&& ss.ss_flags != 0) |
|
475 |
goto out; |
|
476 |
|
|
477 |
if (ss.ss_flags == TARGET_SS_DISABLE) { |
|
478 |
ss.ss_size = 0; |
|
479 |
ss.ss_sp = 0; |
|
480 |
} else { |
|
481 |
ret = -ENOMEM; |
|
482 |
if (ss.ss_size < MINSIGSTKSZ) |
|
483 |
goto out; |
|
484 |
} |
|
485 |
|
|
486 |
target_sigaltstack_used.ss_sp = ss.ss_sp; |
|
487 |
target_sigaltstack_used.ss_size = ss.ss_size; |
|
488 |
} |
|
489 |
|
|
490 |
if (uoss) { |
|
491 |
ret = -EFAULT; |
|
492 |
if (!access_ok(VERIFY_WRITE, uoss, sizeof(oss))) |
|
493 |
goto out; |
|
494 |
memcpy(uoss, &oss, sizeof(oss)); |
|
495 |
} |
|
496 |
|
|
497 |
ret = 0; |
|
498 |
out: |
|
499 |
return ret; |
|
500 |
} |
|
501 |
|
|
422 | 502 |
int do_sigaction(int sig, const struct target_sigaction *act, |
423 | 503 |
struct target_sigaction *oact) |
424 | 504 |
{ |
... | ... | |
551 | 631 |
target_ulong cr2; |
552 | 632 |
}; |
553 | 633 |
|
554 |
typedef struct target_sigaltstack { |
|
555 |
target_ulong ss_sp; |
|
556 |
int ss_flags; |
|
557 |
target_ulong ss_size; |
|
558 |
} target_stack_t; |
|
559 |
|
|
560 | 634 |
struct target_ucontext { |
561 | 635 |
target_ulong tuc_flags; |
562 | 636 |
target_ulong tuc_link; |
... | ... | |
640 | 714 |
|
641 | 715 |
/* Default to using normal stack */ |
642 | 716 |
esp = env->regs[R_ESP]; |
643 |
#if 0 |
|
644 | 717 |
/* This is the X/Open sanctioned signal stack switching. */ |
645 |
if (ka->sa.sa_flags & SA_ONSTACK) {
|
|
646 |
if (sas_ss_flags(esp) == 0)
|
|
647 |
esp = current->sas_ss_sp + current->sas_ss_size;
|
|
648 |
}
|
|
718 |
if (ka->sa.sa_flags & TARGET_SA_ONSTACK) {
|
|
719 |
if (sas_ss_flags(esp) == 0)
|
|
720 |
esp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
|
|
721 |
}
|
|
649 | 722 |
|
650 | 723 |
/* This is the legacy signal stack switching. */ |
651 | 724 |
else |
652 |
#endif |
|
653 | 725 |
if ((env->segs[R_SS].selector & 0xffff) != __USER_DS && |
654 | 726 |
!(ka->sa.sa_flags & TARGET_SA_RESTORER) && |
655 | 727 |
ka->sa.sa_restorer) { |
... | ... | |
750 | 822 |
/* Create the ucontext. */ |
751 | 823 |
err |= __put_user(0, &frame->uc.tuc_flags); |
752 | 824 |
err |= __put_user(0, &frame->uc.tuc_link); |
753 |
err |= __put_user(/*current->sas_ss_sp*/ 0,
|
|
825 |
err |= __put_user(target_sigaltstack_used.ss_sp,
|
|
754 | 826 |
&frame->uc.tuc_stack.ss_sp); |
755 |
err |= __put_user(/* sas_ss_flags(regs->esp) */ 0,
|
|
827 |
err |= __put_user(sas_ss_flags(get_sp_from_cpustate(env)),
|
|
756 | 828 |
&frame->uc.tuc_stack.ss_flags); |
757 |
err |= __put_user(/* current->sas_ss_size */ 0,
|
|
829 |
err |= __put_user(target_sigaltstack_used.ss_size,
|
|
758 | 830 |
&frame->uc.tuc_stack.ss_size); |
759 | 831 |
err |= setup_sigcontext(&frame->uc.tuc_mcontext, &frame->fpstate, |
760 | 832 |
env, set->sig[0]); |
... | ... | |
880 | 952 |
{ |
881 | 953 |
struct rt_sigframe *frame = (struct rt_sigframe *)g2h(env->regs[R_ESP] - 4); |
882 | 954 |
sigset_t set; |
883 |
// stack_t st; |
|
884 | 955 |
int eax; |
885 | 956 |
|
886 | 957 |
#if 0 |
... | ... | |
893 | 964 |
if (restore_sigcontext(env, &frame->uc.tuc_mcontext, &eax)) |
894 | 965 |
goto badframe; |
895 | 966 |
|
896 |
#if 0 |
|
897 |
if (__copy_from_user(&st, &frame->uc.tuc_stack, sizeof(st))) |
|
967 |
if (do_sigaltstack(&frame->uc.tuc_stack, NULL, get_sp_from_cpustate(env)) == -EFAULT) |
|
898 | 968 |
goto badframe; |
899 |
/* It is more difficult to avoid calling this function than to |
|
900 |
call it and ignore errors. */ |
|
901 |
do_sigaltstack(&st, NULL, regs->esp); |
|
902 |
#endif |
|
969 |
|
|
903 | 970 |
return eax; |
904 | 971 |
|
905 | 972 |
badframe: |
... | ... | |
933 | 1000 |
target_ulong fault_address; |
934 | 1001 |
}; |
935 | 1002 |
|
936 |
typedef struct target_sigaltstack { |
|
937 |
target_ulong ss_sp; |
|
938 |
int ss_flags; |
|
939 |
target_ulong ss_size; |
|
940 |
} target_stack_t; |
|
941 |
|
|
942 | 1003 |
struct target_ucontext { |
943 | 1004 |
target_ulong tuc_flags; |
944 | 1005 |
target_ulong tuc_link; |
... | ... | |
1031 | 1092 |
{ |
1032 | 1093 |
unsigned long sp = regs->regs[13]; |
1033 | 1094 |
|
1034 |
#if 0 |
|
1035 | 1095 |
/* |
1036 | 1096 |
* This is the X/Open sanctioned signal stack switching. |
1037 | 1097 |
*/ |
1038 |
if ((ka->sa.sa_flags & SA_ONSTACK) && !sas_ss_flags(sp)) |
|
1039 |
sp = current->sas_ss_sp + current->sas_ss_size; |
|
1040 |
#endif |
|
1098 |
if ((ka->sa.sa_flags & TARGET_SA_ONSTACK) && !sas_ss_flags(sp)) |
|
1099 |
sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size; |
|
1041 | 1100 |
/* |
1042 | 1101 |
* ATPCS B01 mandates 8-byte alignment |
1043 | 1102 |
*/ |
... | ... | |
1074 | 1133 |
else |
1075 | 1134 |
cpsr &= ~T_BIT; |
1076 | 1135 |
} |
1077 |
#endif |
|
1078 |
#endif |
|
1136 |
#endif /* CONFIG_ARM_THUMB */
|
|
1137 |
#endif /* 0 */
|
|
1079 | 1138 |
#endif /* TARGET_CONFIG_CPU_32 */ |
1080 | 1139 |
|
1081 | 1140 |
if (ka->sa.sa_flags & TARGET_SA_RESTORER) { |
... | ... | |
1132 | 1191 |
target_sigset_t *set, CPUState *env) |
1133 | 1192 |
{ |
1134 | 1193 |
struct rt_sigframe *frame = get_sigframe(ka, env, sizeof(*frame)); |
1194 |
struct target_sigaltstack stack; |
|
1135 | 1195 |
int i, err = 0; |
1136 | 1196 |
|
1137 | 1197 |
if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame))) |
... | ... | |
1144 | 1204 |
/* Clear all the bits of the ucontext we don't use. */ |
1145 | 1205 |
memset(&frame->uc, 0, offsetof(struct target_ucontext, tuc_mcontext)); |
1146 | 1206 |
|
1207 |
memset(&stack, 0, sizeof(stack)); |
|
1208 |
__put_user(target_sigaltstack_used.ss_sp, &stack.ss_sp); |
|
1209 |
__put_user(target_sigaltstack_used.ss_size, &stack.ss_size); |
|
1210 |
__put_user(sas_ss_flags(get_sp_from_cpustate(env)), &stack.ss_flags); |
|
1211 |
if (!access_ok(VERIFY_WRITE, &frame->uc.tuc_stack, sizeof(stack))) |
|
1212 |
err = 1; |
|
1213 |
else |
|
1214 |
memcpy(&frame->uc.tuc_stack, &stack, sizeof(stack)); |
|
1215 |
|
|
1147 | 1216 |
err |= setup_sigcontext(&frame->uc.tuc_mcontext, /*&frame->fpstate,*/ |
1148 | 1217 |
env, set->sig[0]); |
1149 | 1218 |
for(i = 0; i < TARGET_NSIG_WORDS; i++) { |
... | ... | |
1270 | 1339 |
if (restore_sigcontext(env, &frame->uc.tuc_mcontext)) |
1271 | 1340 |
goto badframe; |
1272 | 1341 |
|
1342 |
if (do_sigaltstack(&frame->uc.tuc_stack, NULL, get_sp_from_cpustate(env)) == -EFAULT) |
|
1343 |
goto badframe; |
|
1344 |
|
|
1273 | 1345 |
#if 0 |
1274 | 1346 |
/* Send SIGTRAP if we're single-stepping */ |
1275 | 1347 |
if (ptrace_cancel_bpt(current)) |
... | ... | |
1382 | 1454 |
unsigned long sp; |
1383 | 1455 |
|
1384 | 1456 |
sp = env->regwptr[UREG_FP]; |
1385 |
#if 0 |
|
1386 | 1457 |
|
1387 | 1458 |
/* This is the X/Open sanctioned signal stack switching. */ |
1388 |
if (sa->sa_flags & TARGET_SA_ONSTACK) { |
|
1389 |
if (!on_sig_stack(sp) && !((current->sas_ss_sp + current->sas_ss_size) & 7)) |
|
1390 |
sp = current->sas_ss_sp + current->sas_ss_size; |
|
1459 |
if (sa->sa.sa_flags & TARGET_SA_ONSTACK) { |
|
1460 |
if (!on_sig_stack(sp) |
|
1461 |
&& !((target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size) & 7)) |
|
1462 |
sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size; |
|
1391 | 1463 |
} |
1392 |
#endif |
|
1393 | 1464 |
return g2h(sp - framesize); |
1394 | 1465 |
} |
1395 | 1466 |
|
... | ... | |
1842 | 1913 |
*/ |
1843 | 1914 |
sp -= 32; |
1844 | 1915 |
|
1845 |
#if 0 |
|
1846 | 1916 |
/* This is the X/Open sanctioned signal stack switching. */ |
1847 |
if ((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags (sp) == 0))
|
|
1848 |
sp = current->sas_ss_sp + current->sas_ss_size;
|
|
1849 |
#endif
|
|
1917 |
if ((ka->sa.sa_flags & TARGET_SA_ONSTACK) && (sas_ss_flags (sp) == 0)) {
|
|
1918 |
sp = target_sigaltstack_used.ss_sp + target_sigaltstack_used.ss_size;
|
|
1919 |
}
|
|
1850 | 1920 |
|
1851 | 1921 |
return g2h((sp - frame_size) & ~7); |
1852 | 1922 |
} |
b/linux-user/sparc/target_signal.h | ||
---|---|---|
1 |
#ifndef TARGET_SIGNAL_H |
|
2 |
#define TARGET_SIGNAL_H |
|
3 |
|
|
4 |
#include "cpu.h" |
|
5 |
|
|
6 |
/* this struct defines a stack used during syscall handling */ |
|
7 |
|
|
8 |
typedef struct target_sigaltstack { |
|
9 |
target_ulong ss_sp; |
|
10 |
target_long ss_flags; |
|
11 |
target_ulong ss_size; |
|
12 |
} target_stack_t; |
|
13 |
|
|
14 |
|
|
15 |
/* |
|
16 |
* sigaltstack controls |
|
17 |
*/ |
|
18 |
#define TARGET_SS_ONSTACK 1 |
|
19 |
#define TARGET_SS_DISABLE 2 |
|
20 |
|
|
21 |
#define TARGET_MINSIGSTKSZ 4096 |
|
22 |
#define TARGET_SIGSTKSZ 16384 |
|
23 |
|
|
24 |
#endif /* TARGET_SIGNAL_H */ |
b/linux-user/sparc64/target_signal.h | ||
---|---|---|
1 |
#ifndef TARGET_SIGNAL_H |
|
2 |
#define TARGET_SIGNAL_H |
|
3 |
|
|
4 |
#include "cpu.h" |
|
5 |
|
|
6 |
/* this struct defines a stack used during syscall handling */ |
|
7 |
|
|
8 |
typedef struct target_sigaltstack { |
|
9 |
target_ulong ss_sp; |
|
10 |
target_long ss_flags; |
|
11 |
target_ulong ss_size; |
|
12 |
} target_stack_t; |
|
13 |
|
|
14 |
|
|
15 |
/* |
|
16 |
* sigaltstack controls |
|
17 |
*/ |
|
18 |
#define TARGET_SS_ONSTACK 1 |
|
19 |
#define TARGET_SS_DISABLE 2 |
|
20 |
|
|
21 |
#define TARGET_MINSIGSTKSZ 4096 |
|
22 |
#define TARGET_SIGSTKSZ 16384 |
|
23 |
|
|
24 |
#endif /* TARGET_SIGNAL_H */ |
b/linux-user/syscall.c | ||
---|---|---|
4318 | 4318 |
case TARGET_NR_capset: |
4319 | 4319 |
goto unimplemented; |
4320 | 4320 |
case TARGET_NR_sigaltstack: |
4321 |
#if defined(TARGET_I386) || defined(TARGET_ARM) || defined(TARGET_SPARC) |
|
4322 |
ret = do_sigaltstack((struct target_sigaltstack *)arg1, |
|
4323 |
(struct target_sigaltstack *)arg2, |
|
4324 |
get_sp_from_cpustate((CPUState *)cpu_env)); |
|
4325 |
break; |
|
4326 |
#else |
|
4321 | 4327 |
goto unimplemented; |
4328 |
#endif |
|
4322 | 4329 |
case TARGET_NR_sendfile: |
4323 | 4330 |
goto unimplemented; |
4324 | 4331 |
#ifdef TARGET_NR_getpmsg |
b/linux-user/x86_64/target_signal.h | ||
---|---|---|
1 |
#ifndef TARGET_SIGNAL_H |
|
2 |
#define TARGET_SIGNAL_H |
|
3 |
|
|
4 |
#include "cpu.h" |
|
5 |
|
|
6 |
/* this struct defines a stack used during syscall handling */ |
|
7 |
|
|
8 |
typedef struct target_sigaltstack { |
|
9 |
target_ulong ss_sp; |
|
10 |
target_long ss_flags; |
|
11 |
target_ulong ss_size; |
|
12 |
} target_stack_t; |
|
13 |
|
|
14 |
|
|
15 |
/* |
|
16 |
* sigaltstack controls |
|
17 |
*/ |
|
18 |
#define TARGET_SS_ONSTACK 1 |
|
19 |
#define TARGET_SS_DISABLE 2 |
|
20 |
|
|
21 |
#define TARGET_MINSIGSTKSZ 2048 |
|
22 |
#define TARGET_SIGSTKSZ 8192 |
|
23 |
|
|
24 |
#endif /* TARGET_SIGNAL_H */ |
b/target-alpha/cpu.h | ||
---|---|---|
397 | 397 |
void pal_init (CPUState *env); |
398 | 398 |
void call_pal (CPUState *env, int palcode); |
399 | 399 |
|
400 |
static inline target_ulong get_sp_from_cpustate(CPUAlphaState *state) |
|
401 |
{ |
|
402 |
return state->ir[IR_SP]; |
|
403 |
} |
|
404 |
|
|
400 | 405 |
#endif /* !defined (__CPU_ALPHA_H__) */ |
b/target-arm/cpu.h | ||
---|---|---|
300 | 300 |
#define cpu_gen_code cpu_arm_gen_code |
301 | 301 |
#define cpu_signal_handler cpu_arm_signal_handler |
302 | 302 |
|
303 |
static inline target_ulong get_sp_from_cpustate(CPUARMState *state) |
|
304 |
{ |
|
305 |
return state->regs[13]; |
|
306 |
} |
|
307 |
|
|
303 | 308 |
#include "cpu-all.h" |
304 | 309 |
|
305 | 310 |
#endif |
b/target-i386/cpu.h | ||
---|---|---|
688 | 688 |
#define cpu_gen_code cpu_x86_gen_code |
689 | 689 |
#define cpu_signal_handler cpu_x86_signal_handler |
690 | 690 |
|
691 |
static inline target_ulong get_sp_from_cpustate(CPUX86State *state) |
|
692 |
{ |
|
693 |
return state->regs[R_ESP]; |
|
694 |
} |
|
695 |
|
|
691 | 696 |
#include "cpu-all.h" |
692 | 697 |
|
693 | 698 |
#include "svm.h" |
b/target-mips/cpu.h | ||
---|---|---|
548 | 548 |
uint32_t cpu_mips_get_clock (void); |
549 | 549 |
int cpu_mips_signal_handler(int host_signum, void *pinfo, void *puc); |
550 | 550 |
|
551 |
static inline target_ulong get_sp_from_cpustate(CPUMIPSState *state) |
|
552 |
{ |
|
553 |
return state->gpr[29][state->current_tc]; |
|
554 |
} |
|
555 |
|
|
551 | 556 |
#endif /* !defined (__MIPS_CPU_H__) */ |
b/target-ppc/cpu.h | ||
---|---|---|
1146 | 1146 |
|
1147 | 1147 |
/*****************************************************************************/ |
1148 | 1148 |
|
1149 |
static inline target_ulong get_sp_from_cpustate(CPUPPCState *state) |
|
1150 |
{ |
|
1151 |
return state->gpr[1]; |
|
1152 |
} |
|
1153 |
|
|
1149 | 1154 |
#endif /* !defined (__CPU_PPC_H__) */ |
b/target-sparc/cpu.h | ||
---|---|---|
316 | 316 |
#define cpu_gen_code cpu_sparc_gen_code |
317 | 317 |
#define cpu_signal_handler cpu_sparc_signal_handler |
318 | 318 |
|
319 |
#ifndef UREG_I6 |
|
320 |
#define UREG_I6 6 |
|
321 |
#endif |
|
322 |
#ifndef UREG_FP |
|
323 |
#define UREG_FP UREG_I6 |
|
324 |
#endif |
|
325 |
|
|
326 |
static inline target_ulong get_sp_from_cpustate(CPUSPARCState *state) |
|
327 |
{ |
|
328 |
return state->regwptr[UREG_FP]; |
|
329 |
} |
|
330 |
|
|
319 | 331 |
#include "cpu-all.h" |
320 | 332 |
|
321 | 333 |
#endif |
Also available in: Unified diff