diff --git a/bsd-user/arm/target_arch_signal.h b/bsd-user/arm/target_arch_signal.h index 048bd4f..0b14b0b 100644 --- a/bsd-user/arm/target_arch_signal.h +++ b/bsd-user/arm/target_arch_signal.h @@ -47,7 +47,7 @@ #define TARGET_INSN_SIZE 4 /* arm instruction size */ /* Size of the signal trampolin code. See _sigtramp(). */ -#define TARGET_SZSIGCODE ((abi_ulong)(8 * TARGET_INSN_SIZE)) +#define TARGET_SZSIGCODE ((abi_ulong)(9 * TARGET_INSN_SIZE)) /* compare to arm/include/_limits.h */ #define TARGET_MINSIGSTKSZ (1024 * 4) /* min sig stack size */ @@ -248,7 +248,7 @@ static inline abi_long get_ucontext_sigreturn(CPUARMState *regs, return -TARGET_EINVAL; } - *target_uc = target_sf + offsetof(struct target_sigframe, sf_uc); + *target_uc = target_sf; return 0; } diff --git a/bsd-user/arm/target_arch_sigtramp.h b/bsd-user/arm/target_arch_sigtramp.h index 98dc313..5b7424c 100644 --- a/bsd-user/arm/target_arch_sigtramp.h +++ b/bsd-user/arm/target_arch_sigtramp.h @@ -15,16 +15,17 @@ static inline abi_long setup_sigtramp(abi_ulong offset, unsigned sigf_uc, */ uint32_t sigtramp_code[] = { /* 1 */ 0xE1A0000D, /* mov r0, sp */ - /* 2 */ 0xE59F700C, /* ldr r7, [pc, #12] */ - /* 3 */ 0xEF000000 + sys_sigreturn, /* swi (SYS_sigreturn) */ - /* 4 */ 0xE59F7008, /* ldr r7, [pc, #8] */ - /* 5 */ 0xEF000000 + sys_exit, /* swi (SYS_exit)*/ - /* 6 */ 0xEAFFFFFA, /* b . -16 */ - /* 7 */ sys_sigreturn, - /* 8 */ sys_exit + /* 2 */ 0xE2800000 + sigf_uc, /* add r0, r0, #SIGF_UC */ + /* 3 */ 0xE59F700C, /* ldr r7, [pc, #12] */ + /* 4 */ 0xEF000000 + sys_sigreturn, /* swi (SYS_sigreturn) */ + /* 5 */ 0xE59F7008, /* ldr r7, [pc, #8] */ + /* 6 */ 0xEF000000 + sys_exit, /* swi (SYS_exit)*/ + /* 7 */ 0xEAFFFFFA, /* b . -16 */ + /* 8 */ sys_sigreturn, + /* 9 */ sys_exit }; - for (i = 0; i < 8; i++) { + for (i = 0; i < 9; i++) { tswap32s(&sigtramp_code[i]); }