mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 09:13:55 -06:00
linux-user/hppa: Force all code addresses to PRIV_USER
The kernel does this along the return path to user mode. Reviewed-by: Helge Deller <deller@gmx.de> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
a0ea4becca
commit
3c13b0ffe7
8 changed files with 31 additions and 17 deletions
|
@ -129,8 +129,8 @@ void cpu_loop(CPUHPPAState *env)
|
|||
default:
|
||||
env->gr[28] = ret;
|
||||
/* We arrived here by faking the gateway page. Return. */
|
||||
env->iaoq_f = env->gr[31];
|
||||
env->iaoq_b = env->gr[31] + 4;
|
||||
env->iaoq_f = env->gr[31] | PRIV_USER;
|
||||
env->iaoq_b = env->iaoq_f + 4;
|
||||
break;
|
||||
case -QEMU_ERESTARTSYS:
|
||||
case -QEMU_ESIGRETURN:
|
||||
|
@ -140,8 +140,8 @@ void cpu_loop(CPUHPPAState *env)
|
|||
case EXCP_SYSCALL_LWS:
|
||||
env->gr[21] = hppa_lws(env);
|
||||
/* We arrived here by faking the gateway page. Return. */
|
||||
env->iaoq_f = env->gr[31];
|
||||
env->iaoq_b = env->gr[31] + 4;
|
||||
env->iaoq_f = env->gr[31] | PRIV_USER;
|
||||
env->iaoq_b = env->iaoq_f + 4;
|
||||
break;
|
||||
case EXCP_IMP:
|
||||
force_sig_fault(TARGET_SIGSEGV, TARGET_SEGV_MAPERR, env->iaoq_f);
|
||||
|
@ -152,9 +152,9 @@ void cpu_loop(CPUHPPAState *env)
|
|||
case EXCP_PRIV_OPR:
|
||||
/* check for glibc ABORT_INSTRUCTION "iitlbp %r0,(%sr0, %r0)" */
|
||||
if (env->cr[CR_IIR] == 0x04000000) {
|
||||
force_sig_fault(TARGET_SIGILL, TARGET_ILL_ILLOPC, env->iaoq_f);
|
||||
force_sig_fault(TARGET_SIGILL, TARGET_ILL_ILLOPC, env->iaoq_f);
|
||||
} else {
|
||||
force_sig_fault(TARGET_SIGILL, TARGET_ILL_PRVOPC, env->iaoq_f);
|
||||
force_sig_fault(TARGET_SIGILL, TARGET_ILL_PRVOPC, env->iaoq_f);
|
||||
}
|
||||
break;
|
||||
case EXCP_PRIV_REG:
|
||||
|
@ -170,7 +170,7 @@ void cpu_loop(CPUHPPAState *env)
|
|||
force_sig_fault(TARGET_SIGFPE, 0, env->iaoq_f);
|
||||
break;
|
||||
case EXCP_BREAK:
|
||||
force_sig_fault(TARGET_SIGTRAP, TARGET_TRAP_BRKPT, env->iaoq_f & ~3);
|
||||
force_sig_fault(TARGET_SIGTRAP, TARGET_TRAP_BRKPT, env->iaoq_f);
|
||||
break;
|
||||
case EXCP_DEBUG:
|
||||
force_sig_fault(TARGET_SIGTRAP, TARGET_TRAP_BRKPT, env->iaoq_f);
|
||||
|
|
|
@ -101,7 +101,9 @@ static void restore_sigcontext(CPUArchState *env, struct target_sigcontext *sc)
|
|||
cpu_hppa_loaded_fr0(env);
|
||||
|
||||
__get_user(env->iaoq_f, &sc->sc_iaoq[0]);
|
||||
env->iaoq_f |= PRIV_USER;
|
||||
__get_user(env->iaoq_b, &sc->sc_iaoq[1]);
|
||||
env->iaoq_b |= PRIV_USER;
|
||||
__get_user(env->cr[CR_SAR], &sc->sc_sar);
|
||||
}
|
||||
|
||||
|
@ -162,8 +164,8 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
|
|||
unlock_user(fdesc, haddr, 0);
|
||||
haddr = dest;
|
||||
}
|
||||
env->iaoq_f = haddr;
|
||||
env->iaoq_b = haddr + 4;
|
||||
env->iaoq_f = haddr | PRIV_USER;
|
||||
env->iaoq_b = env->iaoq_f + 4;
|
||||
env->psw_n = 0;
|
||||
return;
|
||||
|
||||
|
|
|
@ -28,8 +28,8 @@ static inline void cpu_clone_regs_child(CPUHPPAState *env, target_ulong newsp,
|
|||
/* Indicate child in return value. */
|
||||
env->gr[28] = 0;
|
||||
/* Return from the syscall. */
|
||||
env->iaoq_f = env->gr[31];
|
||||
env->iaoq_b = env->gr[31] + 4;
|
||||
env->iaoq_f = env->gr[31] | PRIV_USER;
|
||||
env->iaoq_b = env->iaoq_f + 4;
|
||||
}
|
||||
|
||||
static inline void cpu_clone_regs_parent(CPUHPPAState *env, unsigned flags)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue