[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 10/16] ARM: linux-user: Expose VFP registers to sign
From: |
Riku |
Subject: |
[Qemu-devel] [PATCH 10/16] ARM: linux-user: Expose VFP registers to signal handlers |
Date: |
Fri, 3 Dec 2010 15:36:37 +0200 |
From: Peter Maydell <address@hidden>
For ARM linux-user mode signal handlers, fill in the ucontext with
VFP register contents in the same way that the kernel does. We only
do this for v2 format sigframe (2.6.12 and above); this is actually
bug-for-bug compatible with the older kernels, which don't save and
restore VFP registers either.
Signed-off-by: Peter Maydell <address@hidden>
Signed-off-by: Riku Voipio <address@hidden>
---
linux-user/signal.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 46 insertions(+), 1 deletions(-)
diff --git a/linux-user/signal.c b/linux-user/signal.c
index e195eef..af1e0eb 100644
--- a/linux-user/signal.c
+++ b/linux-user/signal.c
@@ -1112,6 +1112,26 @@ struct target_ucontext_v2 {
abi_ulong tuc_regspace[128] __attribute__((__aligned__(8)));
};
+struct target_user_vfp {
+ uint64_t fpregs[32];
+ abi_ulong fpscr;
+};
+
+struct target_user_vfp_exc {
+ abi_ulong fpexc;
+ abi_ulong fpinst;
+ abi_ulong fpinst2;
+};
+
+struct target_vfp_sigframe {
+ abi_ulong magic;
+ abi_ulong size;
+ struct target_user_vfp ufp;
+ struct target_user_vfp_exc ufp_exc;
+} __attribute__((__aligned__(8)));
+
+#define TARGET_VFP_MAGIC 0x56465001
+
struct sigframe_v1
{
struct target_sigcontext sc;
@@ -1255,11 +1275,29 @@ setup_return(CPUState *env, struct target_sigaction *ka,
return 0;
}
+static abi_ulong *setup_sigframe_v2_vfp(abi_ulong *regspace, CPUState *env)
+{
+ int i;
+ struct target_vfp_sigframe *vfpframe;
+ vfpframe = (struct target_vfp_sigframe *)regspace;
+ __put_user(TARGET_VFP_MAGIC, &vfpframe->magic);
+ __put_user(sizeof(*vfpframe), &vfpframe->size);
+ for (i = 0; i < 32; i++) {
+ __put_user(env->vfp.regs[i], &vfpframe->ufp.fpregs[i]);
+ }
+ __put_user(vfp_get_fpscr(env), &vfpframe->ufp.fpscr);
+ __put_user(env->vfp.xregs[ARM_VFP_FPEXC], &vfpframe->ufp_exc.fpexc);
+ __put_user(env->vfp.xregs[ARM_VFP_FPINST], &vfpframe->ufp_exc.fpinst);
+ __put_user(env->vfp.xregs[ARM_VFP_FPINST2], &vfpframe->ufp_exc.fpinst2);
+ return (abi_ulong*)(vfpframe+1);
+}
+
static void setup_sigframe_v2(struct target_ucontext_v2 *uc,
target_sigset_t *set, CPUState *env)
{
struct target_sigaltstack stack;
int i;
+ abi_ulong *regspace;
/* Clear all the bits of the ucontext we don't use. */
memset(uc, 0, offsetof(struct target_ucontext_v2, tuc_mcontext));
@@ -1271,7 +1309,14 @@ static void setup_sigframe_v2(struct target_ucontext_v2
*uc,
memcpy(&uc->tuc_stack, &stack, sizeof(stack));
setup_sigcontext(&uc->tuc_mcontext, env, set->sig[0]);
- /* FIXME: Save coprocessor signal frame. */
+ /* Save coprocessor signal frame. */
+ regspace = uc->tuc_regspace;
+ if (arm_feature(env, ARM_FEATURE_VFP)) {
+ regspace = setup_sigframe_v2_vfp(regspace, env);
+ }
+ /* Write terminating magic word */
+ __put_user(0, regspace);
+
for(i = 0; i < TARGET_NSIG_WORDS; i++) {
__put_user(set->sig[i], &uc->tuc_sigmask.sig[i]);
}
--
1.6.5
- [Qemu-devel] [PATCH 00/16] linux-user updates, Riku, 2010/12/03
- [Qemu-devel] [PATCH 02/16] linux-user: mmap_reserve() not controlled by RESERVED_VA, Riku, 2010/12/03
- [Qemu-devel] [PATCH 07/16] target-sparc: remove unused functions cpu_lock(), cpu_unlock(), Riku, 2010/12/03
- [Qemu-devel] [PATCH 08/16] ARM: linux-user: Correct size of padding in target_ucontext_v2, Riku, 2010/12/03
- [Qemu-devel] [PATCH 13/16] ARM: linux-user: Restore iWMMXT state from ucontext on sigreturn, Riku, 2010/12/03
- [Qemu-devel] [PATCH 05/16] linux-user: Translate getsockopt level option, Riku, 2010/12/03
- [Qemu-devel] [PATCH 04/16] linux-user: remove unnecessary local from __get_user(), __put_user(), Riku, 2010/12/03
- [Qemu-devel] [PATCH 14/16] linux-user: fix compiler error on nptl, Riku, 2010/12/03
- [Qemu-devel] [PATCH 03/16] linux-user: fix memory leaks with NPTL emulation, Riku, 2010/12/03
- [Qemu-devel] [PATCH 10/16] ARM: linux-user: Expose VFP registers to signal handlers,
Riku <=
- [Qemu-devel] [PATCH 11/16] ARM: linux-user: Restore VFP state from ucontext on sigreturn, Riku, 2010/12/03
- [Qemu-devel] [PATCH 12/16] ARM: linux-user: Expose iWMMXT registers to signal handlers, Riku, 2010/12/03
- [Qemu-devel] [PATCH 06/16] ARM: enable XScale/iWMMXT in linux-user mode, Riku, 2010/12/03
- [Qemu-devel] [PATCH 15/16] update binfmt conf, Riku, 2010/12/03
- [Qemu-devel] [PATCH 01/16] [PATCH] target-arm: remove unused functions cpu_lock(), cpu_unlock(), Riku, 2010/12/03
- [Qemu-devel] [PATCH 16/16] linux-user: fix mips and ppc to use UID16, Riku, 2010/12/03
- [Qemu-devel] [PATCH 09/16] ARM: Expose vfp_get_fpscr() and vfp_set_fpscr() to C code, Riku, 2010/12/03
- Re: [Qemu-devel] [PATCH 00/16] linux-user updates, Peter Maydell, 2010/12/03
- Re: [Qemu-devel] [PATCH 00/16] linux-user updates, Edgar E. Iglesias, 2010/12/03