MIPS patches 2015-11-24
Changes: * Fixes for enabling/disabling 64-bit addressing -----BEGIN PGP SIGNATURE----- iQEcBAABAgAGBQJWVHorAAoJEFIRjjwLKdprMyMH/00o4XJQAqKn3UDrbA5EygLH R1wQ1btykiDH/9841Coa+GLyT9DHBux65WQaKysHnF5rHX9fDAfu3Nirt9k03q+x 2vwNNZVBPr2Z/ENL3mH4VwOWkYVxNf21Ell8j69hctqRgJQPwbVdAaJumDDEGfs/ 9/OcMYVu/Gx/3C5M2las+dFH6qv6QOOjt+mJa2+Lvtiq6MfTmZiifJEQZGkYI5Pd 610DuJfuPkz2VaM4Q5YAHyfTGjPFpTqrw7Qw3NVBnRfPltVEK9GaH7MfhjXnVfVY Ec1pPdaZR/GHQyLPxAVCmTxMcvwXqNCsK4q5QtnZMKKLkXAhXg11qKJO5iVk6Qs= =h/7q -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/lalrae/tags/mips-20151124' into staging MIPS patches 2015-11-24 Changes: * Fixes for enabling/disabling 64-bit addressing # gpg: Signature made Tue 24 Nov 2015 14:54:35 GMT using RSA key ID 0B29DA6B # gpg: Good signature from "Leon Alrae <leon.alrae@imgtec.com>" * remotes/lalrae/tags/mips-20151124: target-mips: flush QEMU TLB when disabling 64-bit addressing target-mips: Fix exceptions while UX=0 Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
4b6eda626f
@ -961,6 +961,15 @@ static inline void compute_hflags(CPUMIPSState *env)
|
||||
}
|
||||
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
static inline void cpu_mips_tlb_flush(CPUMIPSState *env, int flush_global)
|
||||
{
|
||||
MIPSCPU *cpu = mips_env_get_cpu(env);
|
||||
|
||||
/* Flush qemu's TLB and discard all shadowed entries. */
|
||||
tlb_flush(CPU(cpu), flush_global);
|
||||
env->tlb->tlb_in_use = env->tlb->nb_tlb;
|
||||
}
|
||||
|
||||
/* Called for updates to CP0_Status. */
|
||||
static inline void sync_c0_status(CPUMIPSState *env, CPUMIPSState *cpu, int tc)
|
||||
{
|
||||
@ -999,6 +1008,7 @@ static inline void sync_c0_status(CPUMIPSState *env, CPUMIPSState *cpu, int tc)
|
||||
static inline void cpu_mips_store_status(CPUMIPSState *env, target_ulong val)
|
||||
{
|
||||
uint32_t mask = env->CP0_Status_rw_bitmask;
|
||||
target_ulong old = env->CP0_Status;
|
||||
|
||||
if (env->insn_flags & ISA_MIPS32R6) {
|
||||
bool has_supervisor = extract32(mask, CP0St_KSU, 2) == 0x3;
|
||||
@ -1014,7 +1024,13 @@ static inline void cpu_mips_store_status(CPUMIPSState *env, target_ulong val)
|
||||
mask &= ~(((1 << CP0St_SR) | (1 << CP0St_NMI)) & val);
|
||||
}
|
||||
|
||||
env->CP0_Status = (env->CP0_Status & ~mask) | (val & mask);
|
||||
env->CP0_Status = (old & ~mask) | (val & mask);
|
||||
#if defined(TARGET_MIPS64)
|
||||
if ((env->CP0_Status ^ old) & (old & (7 << CP0St_UX))) {
|
||||
/* Access to at least one of the 64-bit segments has been disabled */
|
||||
cpu_mips_tlb_flush(env, 1);
|
||||
}
|
||||
#endif
|
||||
if (env->CP0_Config3 & (1 << CP0C3_MT)) {
|
||||
sync_c0_status(env, env, env->current_tc);
|
||||
} else {
|
||||
|
@ -524,6 +524,10 @@ void mips_cpu_do_interrupt(CPUState *cs)
|
||||
enter_debug_mode:
|
||||
if (env->insn_flags & ISA_MIPS3) {
|
||||
env->hflags |= MIPS_HFLAG_64;
|
||||
if (!(env->insn_flags & ISA_MIPS64R6) ||
|
||||
env->CP0_Status & (1 << CP0St_KX)) {
|
||||
env->hflags &= ~MIPS_HFLAG_AWRAP;
|
||||
}
|
||||
}
|
||||
env->hflags |= MIPS_HFLAG_DM | MIPS_HFLAG_CP0;
|
||||
env->hflags &= ~(MIPS_HFLAG_KSU);
|
||||
@ -548,6 +552,10 @@ void mips_cpu_do_interrupt(CPUState *cs)
|
||||
env->CP0_Status |= (1 << CP0St_ERL) | (1 << CP0St_BEV);
|
||||
if (env->insn_flags & ISA_MIPS3) {
|
||||
env->hflags |= MIPS_HFLAG_64;
|
||||
if (!(env->insn_flags & ISA_MIPS64R6) ||
|
||||
env->CP0_Status & (1 << CP0St_KX)) {
|
||||
env->hflags &= ~MIPS_HFLAG_AWRAP;
|
||||
}
|
||||
}
|
||||
env->hflags |= MIPS_HFLAG_CP0;
|
||||
env->hflags &= ~(MIPS_HFLAG_KSU);
|
||||
@ -725,6 +733,10 @@ void mips_cpu_do_interrupt(CPUState *cs)
|
||||
env->CP0_Status |= (1 << CP0St_EXL);
|
||||
if (env->insn_flags & ISA_MIPS3) {
|
||||
env->hflags |= MIPS_HFLAG_64;
|
||||
if (!(env->insn_flags & ISA_MIPS64R6) ||
|
||||
env->CP0_Status & (1 << CP0St_KX)) {
|
||||
env->hflags &= ~MIPS_HFLAG_AWRAP;
|
||||
}
|
||||
}
|
||||
env->hflags |= MIPS_HFLAG_CP0;
|
||||
env->hflags &= ~(MIPS_HFLAG_KSU);
|
||||
|
@ -23,10 +23,6 @@
|
||||
#include "exec/cpu_ldst.h"
|
||||
#include "sysemu/kvm.h"
|
||||
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
static inline void cpu_mips_tlb_flush (CPUMIPSState *env, int flush_global);
|
||||
#endif
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Exceptions processing helpers */
|
||||
|
||||
@ -1846,15 +1842,6 @@ target_ulong helper_yield(CPUMIPSState *env, target_ulong arg)
|
||||
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
/* TLB management */
|
||||
static void cpu_mips_tlb_flush (CPUMIPSState *env, int flush_global)
|
||||
{
|
||||
MIPSCPU *cpu = mips_env_get_cpu(env);
|
||||
|
||||
/* Flush qemu's TLB and discard all shadowed entries. */
|
||||
tlb_flush(CPU(cpu), flush_global);
|
||||
env->tlb->tlb_in_use = env->tlb->nb_tlb;
|
||||
}
|
||||
|
||||
static void r4k_mips_tlb_flush_extra (CPUMIPSState *env, int first)
|
||||
{
|
||||
/* Discard entries from env->tlb[first] onwards. */
|
||||
|
Loading…
Reference in New Issue
Block a user