[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH] linux-user: Correct a few missuses of host addresse
From: |
Edgar E. Iglesias |
Subject: |
[Qemu-devel] [PATCH] linux-user: Correct a few missuses of host addresses |
Date: |
Mon, 22 Aug 2011 19:05:43 +0200 |
User-agent: |
Mutt/1.5.21 (2010-09-15) |
Hi,
I ran into a couple of missuses of where signal setup was directly passing
host pointers to the guest.
I've run tested the CRIS and MicroBlaze changes. The S390 and SH4 are only
compile tested.
Cheers
commit f47829920bc06abddfd7d55cec97ec798f4668e2
Author: Edgar E. Iglesias <address@hidden>
Date: Mon Aug 22 18:44:58 2011 +0200
linux-user: Correct a few missuses of host addresses
Fix a few cases where we were passing host pointers to the
guest.
Signed-off-by: Edgar E. Iglesias <address@hidden>
diff --git a/linux-user/signal.c b/linux-user/signal.c
index 07ad07a..89276eb 100644
--- a/linux-user/signal.c
+++ b/linux-user/signal.c
@@ -3064,10 +3064,10 @@ static void setup_frame(int sig, struct
target_sigaction *ka,
goto give_sigsegv;
/* Set up registers for signal handler */
- regs->gregs[15] = (unsigned long) frame;
+ regs->gregs[15] = frame_addr;
regs->gregs[4] = signal; /* Arg for signal handler */
regs->gregs[5] = 0;
- regs->gregs[6] = (unsigned long) &frame->sc;
+ regs->gregs[6] = frame_addr += offsetof(typeof(*frame), sc);
regs->pc = (unsigned long) ka->_sa_handler;
unlock_user_struct(frame, frame_addr, 1);
@@ -3127,10 +3127,10 @@ static void setup_rt_frame(int sig, struct
target_sigaction *ka,
goto give_sigsegv;
/* Set up registers for signal handler */
- regs->gregs[15] = (unsigned long) frame;
+ regs->gregs[15] = frame_addr;
regs->gregs[4] = signal; /* Arg for signal handler */
- regs->gregs[5] = (unsigned long) &frame->info;
- regs->gregs[6] = (unsigned long) &frame->uc;
+ regs->gregs[5] = frame_addr + offsetof(typeof(*frame), info);
+ regs->gregs[6] = frame_addr + offsetof(typeof(*frame), uc);
regs->pc = (unsigned long) ka->_sa_handler;
unlock_user_struct(frame, frame_addr, 1);
@@ -3381,11 +3381,12 @@ static void setup_frame(int sig, struct
target_sigaction *ka,
goto badframe;
/* Set up registers for signal handler */
- env->regs[1] = (unsigned long) frame;
+ env->regs[1] = frame_addr;
/* Signal handler args: */
env->regs[5] = sig; /* Arg 0: signum */
env->regs[6] = 0;
- env->regs[7] = (unsigned long) &frame->uc; /* arg 1: sigcontext */
+ /* arg 1: sigcontext */
+ env->regs[7] = frame_addr += offsetof(typeof(*frame), uc);
/* Offset of 4 to handle microblaze rtid r14, 0 */
env->sregs[SR_PC] = (unsigned long)ka->_sa_handler;
@@ -3559,11 +3560,11 @@ static void setup_frame(int sig, struct
target_sigaction *ka,
setup_sigcontext(&frame->sc, env);
/* Move the stack and setup the arguments for the handler. */
- env->regs[R_SP] = (uint32_t) (unsigned long) frame;
+ env->regs[R_SP] = frame_addr;
env->regs[10] = sig;
env->pc = (unsigned long) ka->_sa_handler;
/* Link SRP so the guest returns through the trampoline. */
- env->pregs[PR_SRP] = (uint32_t) (unsigned long) &frame->retcode[0];
+ env->pregs[PR_SRP] = frame_addr + offsetof(typeof(*frame), retcode);
unlock_user_struct(frame, frame_addr, 1);
return;
@@ -3769,11 +3770,11 @@ static void setup_frame(int sig, struct
target_sigaction *ka,
}
/* Set up registers for signal handler */
- env->regs[15] = (target_ulong)(unsigned long) frame;
+ env->regs[15] = frame_addr;
env->psw.addr = (target_ulong) ka->_sa_handler | PSW_ADDR_AMODE;
env->regs[2] = sig; //map_signal(sig);
- env->regs[3] = (target_ulong)(unsigned long) &frame->sc;
+ env->regs[3] = frame_addr += offsetof(typeof(*frame), sc);
/* We forgot to include these in the sigcontext.
To avoid breaking binary compatibility, they are passed as args. */
@@ -3844,12 +3845,12 @@ static void setup_rt_frame(int sig, struct
target_sigaction *ka,
}
/* Set up registers for signal handler */
- env->regs[15] = (target_ulong)(unsigned long) frame;
+ env->regs[15] = frame_addr;
env->psw.addr = (target_ulong) ka->_sa_handler | PSW_ADDR_AMODE;
env->regs[2] = sig; //map_signal(sig);
- env->regs[3] = (target_ulong)(unsigned long) &frame->info;
- env->regs[4] = (target_ulong)(unsigned long) &frame->uc;
+ env->regs[3] = frame_addr + offsetof(typeof(*frame), info);
+ env->regs[4] = frame_addr + offsetof(typeof(*frame), uc);
return;
give_sigsegv:
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Qemu-devel] [PATCH] linux-user: Correct a few missuses of host addresses,
Edgar E. Iglesias <=