[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [PATCH 2/7] linux-user: Split PPC Trampoline Encoding from Re
From: |
Tom Musta |
Subject: |
[Qemu-ppc] [PATCH 2/7] linux-user: Split PPC Trampoline Encoding from Register Save |
Date: |
Mon, 30 Jun 2014 08:13:37 -0500 |
Split the encoding of the PowerPC sigreturn trampoline from the saving of
register state onto the signal handler stack. This will make it easier
in subsequent patches to deal with variations in the stack frame layouts between
32 and 64 bit PowerPC.
Signed-off-by: Tom Musta <address@hidden>
---
linux-user/signal.c | 18 ++++++++++++------
1 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/linux-user/signal.c b/linux-user/signal.c
index 256f9b9..00c99b1 100644
--- a/linux-user/signal.c
+++ b/linux-user/signal.c
@@ -4480,8 +4480,7 @@ static target_ulong get_sigframe(struct target_sigaction
*ka,
return newsp;
}
-static void save_user_regs(CPUPPCState *env, struct target_mcontext *frame,
- int sigret)
+static void save_user_regs(CPUPPCState *env, struct target_mcontext *frame)
{
target_ulong msr = env->msr;
int i;
@@ -4548,11 +4547,14 @@ static void save_user_regs(CPUPPCState *env, struct
target_mcontext *frame,
/* Store MSR. */
__put_user(msr, &frame->mc_gregs[TARGET_PT_MSR]);
+}
+static void encode_trampoline(int sigret, uint32_t *tramp)
+{
/* Set up the sigreturn trampoline: li r0,sigret; sc. */
if (sigret) {
- __put_user(0x38000000UL | sigret, &frame->tramp[0]);
- __put_user(0x44000002UL, &frame->tramp[1]);
+ __put_user(0x38000000 | sigret, &tramp[0]);
+ __put_user(0x44000002, &tramp[1]);
}
}
@@ -4663,7 +4665,10 @@ static void setup_frame(int sig, struct target_sigaction
*ka,
__put_user(sig, &sc->signal);
/* Save user regs. */
- save_user_regs(env, &frame->mctx, TARGET_NR_sigreturn);
+ save_user_regs(env, &frame->mctx);
+
+ /* Construct the trampoline code on the stack. */
+ encode_trampoline(TARGET_NR_sigreturn, (uint32_t *)&frame->mctx.tramp);
/* The kernel checks for the presence of a VDSO here. We don't
emulate a vdso, so use a sigreturn system call. */
@@ -4729,7 +4734,8 @@ static void setup_rt_frame(int sig, struct
target_sigaction *ka,
}
frame = &rt_sf->uc.tuc_mcontext;
- save_user_regs(env, frame, TARGET_NR_rt_sigreturn);
+ save_user_regs(env, frame);
+ encode_trampoline(TARGET_NR_rt_sigreturn, (uint32_t *)&frame->tramp);
/* The kernel checks for the presence of a VDSO here. We don't
emulate a vdso, so use a sigreturn system call. */
--
1.7.1
- [Qemu-ppc] [PATCH 0/7] linux-user: Support for Signal Handlers on PPC64, Tom Musta, 2014/06/30
- [Qemu-ppc] [PATCH 1/7] linux-user: Fix Stack Pointer Bug in PPC setup_rt_frame, Tom Musta, 2014/06/30
- [Qemu-ppc] [PATCH 3/7] linux-user: Enable Signal Handlers on PPC64, Tom Musta, 2014/06/30
- [Qemu-ppc] [PATCH 2/7] linux-user: Split PPC Trampoline Encoding from Register Save,
Tom Musta <=
- [Qemu-ppc] [PATCH 4/7] linux-user: Properly Dereference PPC64 ELFv1 Signal Handler Pointer, Tom Musta, 2014/06/30
- [Qemu-ppc] [PATCH 6/7] linux-user: Move get_ppc64_abi, Tom Musta, 2014/06/30
- [Qemu-ppc] [PATCH 5/7] linux-user: Implement do_setcontext for PPC64, Tom Musta, 2014/06/30
- [Qemu-ppc] [PATCH 7/7] linux-user: Handle PPC64 ELFv2 Function Pointers, Tom Musta, 2014/06/30