diff options
author | Peter Maydell <peter.maydell@linaro.org> | 2018-04-04 09:36:14 +0100 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2018-04-04 09:36:14 +0100 |
commit | 71ad102baa599c3bdeee1f6d0913bbd3e0f08ee3 (patch) | |
tree | ea1547672e29a052a7b7e405a61dc13f6257f0e5 /linux-user | |
parent | f7481f651ccf7bf0fe3547b16820c9d18da8f584 (diff) | |
parent | 3ea7f4a226cd3a4d107772569976dbb13400a632 (diff) |
Merge remote-tracking branch 'remotes/vivier2/tags/linux-user-for-2.12-pull-request' into staging
# gpg: Signature made Tue 03 Apr 2018 11:33:31 BST
# gpg: using RSA key F30C38BD3F2FBE3C
# gpg: Good signature from "Laurent Vivier <lvivier@redhat.com>"
# gpg: aka "Laurent Vivier <laurent@vivier.eu>"
# gpg: aka "Laurent Vivier (Red Hat) <lvivier@redhat.com>"
# Primary key fingerprint: CD2F 75DD C8E3 A4DC 2E4F 5173 F30C 38BD 3F2F BE3C
* remotes/vivier2/tags/linux-user-for-2.12-pull-request:
linux-user: fix TARGET___O_TMPFILE for sparc
linux-user: define TARGET_ARCH_HAS_KA_RESTORER
linux-user: fix alpha signal emulation
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'linux-user')
-rw-r--r-- | linux-user/signal.c | 8 | ||||
-rw-r--r-- | linux-user/syscall.c | 7 | ||||
-rw-r--r-- | linux-user/syscall_defs.h | 5 |
3 files changed, 14 insertions, 6 deletions
diff --git a/linux-user/signal.c b/linux-user/signal.c index 33d5ced30c..046d4c8aa0 100644 --- a/linux-user/signal.c +++ b/linux-user/signal.c @@ -2920,8 +2920,8 @@ static void setup_frame(int sig, struct target_sigaction *ka, env->pc = ka->_sa_handler; env->npc = (env->pc + 4); /* 5. return to kernel instructions */ - if (ka->sa_restorer) { - env->regwptr[UREG_I7] = ka->sa_restorer; + if (ka->ka_restorer) { + env->regwptr[UREG_I7] = ka->ka_restorer; } else { uint32_t val32; @@ -6367,7 +6367,7 @@ static void setup_frame(int sig, struct target_sigaction *ka, &frame->retcode[1]); __put_user(INSN_CALLSYS, &frame->retcode[2]); /* imb() */ - r26 = frame_addr; + r26 = frame_addr + offsetof(struct target_sigframe, retcode); } unlock_user_struct(frame, frame_addr, 1); @@ -6424,7 +6424,7 @@ static void setup_rt_frame(int sig, struct target_sigaction *ka, &frame->retcode[1]); __put_user(INSN_CALLSYS, &frame->retcode[2]); /* imb(); */ - r26 = frame_addr; + r26 = frame_addr + offsetof(struct target_sigframe, retcode); } if (err) { diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 5ef5176135..8671447aca 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -8700,6 +8700,9 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, target_siginitset(&act.sa_mask, old_act->sa_mask); act.sa_flags = old_act->sa_flags; act.sa_restorer = old_act->sa_restorer; +#ifdef TARGET_ARCH_HAS_KA_RESTORER + act.ka_restorer = 0; +#endif unlock_user_struct(old_act, arg2, 0); pact = &act; } else { @@ -8774,8 +8777,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, if (!lock_user_struct(VERIFY_READ, act, arg2, 1)) { goto efault; } -#ifdef TARGET_SPARC - act->sa_restorer = restorer; +#ifdef TARGET_ARCH_HAS_KA_RESTORER + act->ka_restorer = restorer; #endif } else { act = NULL; diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h index 13fe840239..23f5bccf0e 100644 --- a/linux-user/syscall_defs.h +++ b/linux-user/syscall_defs.h @@ -435,6 +435,7 @@ int do_sigaction(int sig, const struct target_sigaction *act, #define TARGET_SA_NODEFER 0x20u #define TARGET_SA_RESETHAND 4u #define TARGET_ARCH_HAS_SA_RESTORER 1 +#define TARGET_ARCH_HAS_KA_RESTORER 1 #elif defined(TARGET_MIPS) #define TARGET_SA_NOCLDSTOP 0x00000001 #define TARGET_SA_NOCLDWAIT 0x00010000 @@ -742,6 +743,9 @@ struct target_sigaction { abi_ulong sa_restorer; #endif target_sigset_t sa_mask; +#ifdef TARGET_ARCH_HAS_KA_RESTORER + abi_ulong ka_restorer; +#endif }; #endif @@ -2561,6 +2565,7 @@ struct target_statfs64 { #define TARGET_O_CLOEXEC 0x400000 #define TARGET___O_SYNC 0x800000 #define TARGET_O_PATH 0x1000000 +#define TARGET___O_TMPFILE 0x2000000 #endif /* <asm-generic/fcntl.h> values follow. */ |