[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 05/10] mips-linux-user: Fix n32 and n64 syscalls
From: |
Richard Henderson |
Subject: |
[Qemu-devel] [PATCH 05/10] mips-linux-user: Fix n32 and n64 syscalls |
Date: |
Sun, 10 Feb 2013 10:30:45 -0800 |
Signed-off-by: Richard Henderson <address@hidden>
---
linux-user/main.c | 25 ++++++++++++++++++-------
1 file changed, 18 insertions(+), 7 deletions(-)
diff --git a/linux-user/main.c b/linux-user/main.c
index 3df8aa2..3a3be70 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -1783,8 +1783,8 @@ void cpu_loop(CPUPPCState *env)
#ifdef TARGET_MIPS
-#define MIPS_SYS(name, args) args,
-
+# ifdef TARGET_ABI_MIPSO32
+# define MIPS_SYS(name, args) args,
static const uint8_t mips_syscall_args[] = {
MIPS_SYS(sys_syscall , 8) /* 4000 */
MIPS_SYS(sys_exit , 1)
@@ -2130,8 +2130,8 @@ static const uint8_t mips_syscall_args[] = {
MIPS_SYS(sys_clock_adjtime, 2)
MIPS_SYS(sys_syncfs, 1)
};
-
-#undef MIPS_SYS
+# undef MIPS_SYS
+# endif /* O32 */
static int do_store_exclusive(CPUMIPSState *env)
{
@@ -2185,8 +2185,11 @@ static int do_store_exclusive(CPUMIPSState *env)
void cpu_loop(CPUMIPSState *env)
{
target_siginfo_t info;
- int trapnr, ret;
+ int trapnr;
+ abi_long ret;
+# ifdef TARGET_ABI_MIPSO32
unsigned int syscall_num;
+# endif
for(;;) {
cpu_exec_start(env);
@@ -2194,8 +2197,9 @@ void cpu_loop(CPUMIPSState *env)
cpu_exec_end(env);
switch(trapnr) {
case EXCP_SYSCALL:
- syscall_num = env->active_tc.gpr[2] - 4000;
env->active_tc.PC += 4;
+# ifdef TARGET_ABI_MIPSO32
+ syscall_num = env->active_tc.gpr[2] - 4000;
if (syscall_num >= sizeof(mips_syscall_args)) {
ret = -TARGET_ENOSYS;
} else {
@@ -2234,12 +2238,19 @@ void cpu_loop(CPUMIPSState *env)
arg5, arg6, arg7, arg8);
}
done_syscall:
+# else
+ ret = do_syscall(env, env->active_tc.gpr[2],
+ env->active_tc.gpr[4], env->active_tc.gpr[5],
+ env->active_tc.gpr[6], env->active_tc.gpr[7],
+ env->active_tc.gpr[8], env->active_tc.gpr[9],
+ env->active_tc.gpr[10], env->active_tc.gpr[11]);
+# endif /* O32 */
if (ret == -TARGET_QEMU_ESIGRETURN) {
/* Returning from a successful sigreturn syscall.
Avoid clobbering register state. */
break;
}
- if ((unsigned int)ret >= (unsigned int)(-1133)) {
+ if ((abi_ulong)ret >= (abi_ulong)-1133) {
env->active_tc.gpr[7] = 1; /* error flag */
ret = -ret;
} else {
--
1.8.1.2
- Re: [Qemu-devel] [PATCH 01/10] mips-linux-user: Delete n32 and n64 signal stubs, (continued)
[Qemu-devel] [PATCH 02/10] mips-linux-user: Share o32 code for n32 and n64 signals, Richard Henderson, 2013/02/10
[Qemu-devel] [PATCH 03/10] mips-linux-user: Enable mips64 and mipsn32 linux-user targets, Richard Henderson, 2013/02/10
[Qemu-devel] [PATCH 06/10] mips64-linux-user: Enable 64-bit address mode and fpu, Richard Henderson, 2013/02/10
[Qemu-devel] [PATCH 05/10] mips-linux-user: Fix n32 and n64 syscalls,
Richard Henderson <=
[Qemu-devel] [PATCH 04/10] mips-linux-user: Save and restore fpu and dsp from sigcontext, Richard Henderson, 2013/02/10