提交 5945cfcb 编写于 作者: P Peter Maydell 提交者: Riku Voipio

linux-user: Bump do_syscall() up to 8 syscall arguments

On 32 bit MIPS a few syscalls have 7 arguments, and so to call
them via NR_syscall the guest needs to be able to pass 8 arguments
to do_syscall(). Raise the number of arguments do_syscall() takes
accordingly.

This fixes some gcc 4.6 compiler warnings about arg7 and arg8
variables being set and never used.
Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
Signed-off-by: NRiku Voipio <riku.voipio@iki.fi>
上级 3002fa84
...@@ -319,7 +319,8 @@ void cpu_loop(CPUX86State *env) ...@@ -319,7 +319,8 @@ void cpu_loop(CPUX86State *env)
env->regs[R_EDX], env->regs[R_EDX],
env->regs[R_ESI], env->regs[R_ESI],
env->regs[R_EDI], env->regs[R_EDI],
env->regs[R_EBP]); env->regs[R_EBP],
0, 0);
break; break;
#ifndef TARGET_ABI32 #ifndef TARGET_ABI32
case EXCP_SYSCALL: case EXCP_SYSCALL:
...@@ -331,7 +332,8 @@ void cpu_loop(CPUX86State *env) ...@@ -331,7 +332,8 @@ void cpu_loop(CPUX86State *env)
env->regs[R_EDX], env->regs[R_EDX],
env->regs[10], env->regs[10],
env->regs[8], env->regs[8],
env->regs[9]); env->regs[9],
0, 0);
env->eip = env->exception_next_eip; env->eip = env->exception_next_eip;
break; break;
#endif #endif
...@@ -735,7 +737,8 @@ void cpu_loop(CPUARMState *env) ...@@ -735,7 +737,8 @@ void cpu_loop(CPUARMState *env)
env->regs[2], env->regs[2],
env->regs[3], env->regs[3],
env->regs[4], env->regs[4],
env->regs[5]); env->regs[5],
0, 0);
} }
} else { } else {
goto error; goto error;
...@@ -831,7 +834,8 @@ void cpu_loop(CPUState *env) ...@@ -831,7 +834,8 @@ void cpu_loop(CPUState *env)
env->regs[2], env->regs[2],
env->regs[3], env->regs[3],
env->regs[4], env->regs[4],
env->regs[5]); env->regs[5],
0, 0);
} }
} else { } else {
goto error; goto error;
...@@ -1018,7 +1022,8 @@ void cpu_loop (CPUSPARCState *env) ...@@ -1018,7 +1022,8 @@ void cpu_loop (CPUSPARCState *env)
ret = do_syscall (env, env->gregs[1], ret = do_syscall (env, env->gregs[1],
env->regwptr[0], env->regwptr[1], env->regwptr[0], env->regwptr[1],
env->regwptr[2], env->regwptr[3], env->regwptr[2], env->regwptr[3],
env->regwptr[4], env->regwptr[5]); env->regwptr[4], env->regwptr[5],
0, 0);
if ((abi_ulong)ret >= (abi_ulong)(-515)) { if ((abi_ulong)ret >= (abi_ulong)(-515)) {
#if defined(TARGET_SPARC64) && !defined(TARGET_ABI32) #if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
env->xcc |= PSR_CARRY; env->xcc |= PSR_CARRY;
...@@ -1611,7 +1616,7 @@ void cpu_loop(CPUPPCState *env) ...@@ -1611,7 +1616,7 @@ void cpu_loop(CPUPPCState *env)
env->crf[0] &= ~0x1; env->crf[0] &= ~0x1;
ret = do_syscall(env, env->gpr[0], env->gpr[3], env->gpr[4], ret = do_syscall(env, env->gpr[0], env->gpr[3], env->gpr[4],
env->gpr[5], env->gpr[6], env->gpr[7], env->gpr[5], env->gpr[6], env->gpr[7],
env->gpr[8]); env->gpr[8], 0, 0);
if (ret == (uint32_t)(-TARGET_QEMU_ESIGRETURN)) { if (ret == (uint32_t)(-TARGET_QEMU_ESIGRETURN)) {
/* Returning from a successful sigreturn syscall. /* Returning from a successful sigreturn syscall.
Avoid corrupting register state. */ Avoid corrupting register state. */
...@@ -2072,7 +2077,7 @@ void cpu_loop(CPUMIPSState *env) ...@@ -2072,7 +2077,7 @@ void cpu_loop(CPUMIPSState *env)
env->active_tc.gpr[5], env->active_tc.gpr[5],
env->active_tc.gpr[6], env->active_tc.gpr[6],
env->active_tc.gpr[7], env->active_tc.gpr[7],
arg5, arg6/*, arg7, arg8*/); arg5, arg6, arg7, arg8);
} }
if (ret == -TARGET_QEMU_ESIGRETURN) { if (ret == -TARGET_QEMU_ESIGRETURN) {
/* Returning from a successful sigreturn syscall. /* Returning from a successful sigreturn syscall.
...@@ -2160,7 +2165,8 @@ void cpu_loop (CPUState *env) ...@@ -2160,7 +2165,8 @@ void cpu_loop (CPUState *env)
env->gregs[6], env->gregs[6],
env->gregs[7], env->gregs[7],
env->gregs[0], env->gregs[0],
env->gregs[1]); env->gregs[1],
0, 0);
env->gregs[0] = ret; env->gregs[0] = ret;
break; break;
case EXCP_INTERRUPT: case EXCP_INTERRUPT:
...@@ -2229,7 +2235,8 @@ void cpu_loop (CPUState *env) ...@@ -2229,7 +2235,8 @@ void cpu_loop (CPUState *env)
env->regs[12], env->regs[12],
env->regs[13], env->regs[13],
env->pregs[7], env->pregs[7],
env->pregs[11]); env->pregs[11],
0, 0);
env->regs[10] = ret; env->regs[10] = ret;
break; break;
case EXCP_DEBUG: case EXCP_DEBUG:
...@@ -2288,7 +2295,8 @@ void cpu_loop (CPUState *env) ...@@ -2288,7 +2295,8 @@ void cpu_loop (CPUState *env)
env->regs[7], env->regs[7],
env->regs[8], env->regs[8],
env->regs[9], env->regs[9],
env->regs[10]); env->regs[10],
0, 0);
env->regs[3] = ret; env->regs[3] = ret;
env->sregs[SR_PC] = env->regs[14]; env->sregs[SR_PC] = env->regs[14];
break; break;
...@@ -2398,7 +2406,8 @@ void cpu_loop(CPUM68KState *env) ...@@ -2398,7 +2406,8 @@ void cpu_loop(CPUM68KState *env)
env->dregs[3], env->dregs[3],
env->dregs[4], env->dregs[4],
env->dregs[5], env->dregs[5],
env->aregs[0]); env->aregs[0],
0, 0);
} }
break; break;
case EXCP_INTERRUPT: case EXCP_INTERRUPT:
...@@ -2576,7 +2585,8 @@ void cpu_loop (CPUState *env) ...@@ -2576,7 +2585,8 @@ void cpu_loop (CPUState *env)
sysret = do_syscall(env, trapnr, sysret = do_syscall(env, trapnr,
env->ir[IR_A0], env->ir[IR_A1], env->ir[IR_A0], env->ir[IR_A1],
env->ir[IR_A2], env->ir[IR_A3], env->ir[IR_A2], env->ir[IR_A3],
env->ir[IR_A4], env->ir[IR_A5]); env->ir[IR_A4], env->ir[IR_A5],
0, 0);
if (trapnr == TARGET_NR_sigreturn if (trapnr == TARGET_NR_sigreturn
|| trapnr == TARGET_NR_rt_sigreturn) { || trapnr == TARGET_NR_rt_sigreturn) {
break; break;
...@@ -2707,7 +2717,8 @@ void cpu_loop(CPUS390XState *env) ...@@ -2707,7 +2717,8 @@ void cpu_loop(CPUS390XState *env)
env->regs[4], env->regs[4],
env->regs[5], env->regs[5],
env->regs[6], env->regs[6],
env->regs[7]); env->regs[7],
0, 0);
} }
break; break;
case EXCP_ADDR: case EXCP_ADDR:
......
...@@ -192,7 +192,8 @@ abi_long do_brk(abi_ulong new_brk); ...@@ -192,7 +192,8 @@ abi_long do_brk(abi_ulong new_brk);
void syscall_init(void); void syscall_init(void);
abi_long do_syscall(void *cpu_env, int num, abi_long arg1, abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
abi_long arg2, abi_long arg3, abi_long arg4, abi_long arg2, abi_long arg3, abi_long arg4,
abi_long arg5, abi_long arg6); abi_long arg5, abi_long arg6, abi_long arg7,
abi_long arg8);
void gemu_log(const char *fmt, ...) GCC_FMT_ATTR(1, 2); void gemu_log(const char *fmt, ...) GCC_FMT_ATTR(1, 2);
extern THREAD CPUState *thread_env; extern THREAD CPUState *thread_env;
void cpu_loop(CPUState *env); void cpu_loop(CPUState *env);
......
...@@ -4532,7 +4532,8 @@ int get_osversion(void) ...@@ -4532,7 +4532,8 @@ int get_osversion(void)
All errnos that do_syscall() returns must be -TARGET_<errcode>. */ All errnos that do_syscall() returns must be -TARGET_<errcode>. */
abi_long do_syscall(void *cpu_env, int num, abi_long arg1, abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
abi_long arg2, abi_long arg3, abi_long arg4, abi_long arg2, abi_long arg3, abi_long arg4,
abi_long arg5, abi_long arg6) abi_long arg5, abi_long arg6, abi_long arg7,
abi_long arg8)
{ {
abi_long ret; abi_long ret;
struct stat st; struct stat st;
...@@ -6172,7 +6173,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, ...@@ -6172,7 +6173,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
#endif #endif
#ifdef TARGET_NR_syscall #ifdef TARGET_NR_syscall
case TARGET_NR_syscall: case TARGET_NR_syscall:
ret = do_syscall(cpu_env,arg1 & 0xffff,arg2,arg3,arg4,arg5,arg6,0); ret = do_syscall(cpu_env, arg1 & 0xffff, arg2, arg3, arg4, arg5,
arg6, arg7, arg8, 0);
break; break;
#endif #endif
case TARGET_NR_wait4: case TARGET_NR_wait4:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册