diff options
author | Avi Kivity <avi@redhat.com> | 2009-05-06 11:24:39 +0300 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2009-05-06 11:26:17 +0300 |
commit | 8f1c89f7f016e3d4d6a694978a047a06069230bb (patch) | |
tree | e7066eb1a2a40dfc1aaa9dd1ce0b6bf8893e1314 /target-ppc | |
parent | virtio-net: Make save/load format independent of build options (diff) | |
parent | ETRAX: Simplify serport control logic. (diff) | |
download | qemu-kvm-8f1c89f7f016e3d4d6a694978a047a06069230bb.tar.gz qemu-kvm-8f1c89f7f016e3d4d6a694978a047a06069230bb.tar.bz2 qemu-kvm-8f1c89f7f016e3d4d6a694978a047a06069230bb.zip |
Merge branch 'master' of git://git.sv.gnu.org/qemu
* 'master' of git://git.sv.gnu.org/qemu: (84 commits)
ETRAX: Simplify serport control logic.
ETRAX: Drop _t for the serial type.
ETRAX: Use NULL for subwidth serport reg accesses.
ETRAX: Drop the _t for the internal PIC type.
ETRAX: Simplify the interrupt controller model.
ETRAX: Simplify interrupt signaling.
Fix compiler warnings in nwfpe code.
target-mips: proper sign extension for 'SUBU rd, zero, rt'
target-mips: fix comments about SUB/DSUB
qemu-options.hx: fix description of cache=none suboption
Suppress type mismatch warnings in VDE code.
minor fix of pci_register_bus()
use PCI_HEADER_TYPE.
Fix typos in comments in exec.c
Optimize cmp x, 0 case
Reindent
Handle NULL bdrv.
Improve instruction name comments for easier searching
Clarify: dmmuregs[1] is not a typo
Optimize operations with immediate parameters
...
Conflicts:
Makefile.target
hw/vga.c
qemu-common.h
vl.c
(iothread merge by Marcelo)
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'target-ppc')
-rw-r--r-- | target-ppc/cpu.h | 3 | ||||
-rw-r--r-- | target-ppc/exec.h | 8 | ||||
-rw-r--r-- | target-ppc/helper.c | 4 | ||||
-rw-r--r-- | target-ppc/machine.c | 2 | ||||
-rw-r--r-- | target-ppc/translate_init.c | 45 |
5 files changed, 37 insertions, 25 deletions
diff --git a/target-ppc/cpu.h b/target-ppc/cpu.h index 82f66f8dd..eb256bc11 100644 --- a/target-ppc/cpu.h +++ b/target-ppc/cpu.h @@ -655,6 +655,7 @@ struct CPUPPCState { /* Exception vectors */ target_ulong excp_vectors[POWERPC_EXCP_NB]; target_ulong excp_prefix; + target_ulong hreset_excp_prefix; target_ulong ivor_mask; target_ulong ivpr_mask; target_ulong hreset_vector; @@ -803,7 +804,7 @@ int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val); #define cpu_signal_handler cpu_ppc_signal_handler #define cpu_list ppc_cpu_list -#define CPU_SAVE_VERSION 3 +#define CPU_SAVE_VERSION 4 /* MMU modes definitions */ #define MMU_MODE0_SUFFIX _user diff --git a/target-ppc/exec.h b/target-ppc/exec.h index d89698c63..f6b9ee6c8 100644 --- a/target-ppc/exec.h +++ b/target-ppc/exec.h @@ -44,11 +44,17 @@ static always_inline void regs_to_env (void) { } +static always_inline int cpu_has_work(CPUState *env) +{ + return (msr_ee && (env->interrupt_request & CPU_INTERRUPT_HARD)); +} + + static always_inline int cpu_halted (CPUState *env) { if (!env->halted) return 0; - if (msr_ee && (env->interrupt_request & CPU_INTERRUPT_HARD)) { + if (cpu_has_work(env)) { env->halted = 0; return 0; } diff --git a/target-ppc/helper.c b/target-ppc/helper.c index a0d884ee1..db765e308 100644 --- a/target-ppc/helper.c +++ b/target-ppc/helper.c @@ -2796,6 +2796,7 @@ void cpu_ppc_reset (void *opaque) msr |= (target_ulong)1 << MSR_SPE; /* Allow SPE usage */ msr |= (target_ulong)1 << MSR_PR; #else + env->excp_prefix = env->hreset_excp_prefix; env->nip = env->hreset_vector | env->excp_prefix; if (env->mmu_model != POWERPC_MMU_REAL) ppc_tlb_invalidate_all(env); @@ -2831,8 +2832,7 @@ CPUPPCState *cpu_ppc_init (const char *cpu_model) cpu_ppc_register_internal(env, def); cpu_ppc_reset(env); - if (kvm_enabled()) - kvm_init_vcpu(env); + qemu_init_vcpu(env); return env; } diff --git a/target-ppc/machine.c b/target-ppc/machine.c index 02eecb829..8b82005a1 100644 --- a/target-ppc/machine.c +++ b/target-ppc/machine.c @@ -87,6 +87,7 @@ void cpu_save(QEMUFile *f, void *opaque) for (i = 0; i < POWERPC_EXCP_NB; i++) qemu_put_betls(f, &env->excp_vectors[i]); qemu_put_betls(f, &env->excp_prefix); + qemu_put_betls(f, &env->hreset_excp_prefix); qemu_put_betls(f, &env->ivor_mask); qemu_put_betls(f, &env->ivpr_mask); qemu_put_betls(f, &env->hreset_vector); @@ -173,6 +174,7 @@ int cpu_load(QEMUFile *f, void *opaque, int version_id) for (i = 0; i < POWERPC_EXCP_NB; i++) qemu_get_betls(f, &env->excp_vectors[i]); qemu_get_betls(f, &env->excp_prefix); + qemu_get_betls(f, &env->hreset_excp_prefix); qemu_get_betls(f, &env->ivor_mask); qemu_get_betls(f, &env->ivpr_mask); qemu_get_betls(f, &env->hreset_vector); diff --git a/target-ppc/translate_init.c b/target-ppc/translate_init.c index 56d8d93e6..f5e3b28f6 100644 --- a/target-ppc/translate_init.c +++ b/target-ppc/translate_init.c @@ -2609,7 +2609,7 @@ static void init_excp_4xx_real (CPUPPCState *env) env->excp_vectors[POWERPC_EXCP_FIT] = 0x00001010; env->excp_vectors[POWERPC_EXCP_WDT] = 0x00001020; env->excp_vectors[POWERPC_EXCP_DEBUG] = 0x00002000; - env->excp_prefix = 0x00000000UL; + env->hreset_excp_prefix = 0x00000000UL; env->ivor_mask = 0x0000FFF0UL; env->ivpr_mask = 0xFFFF0000UL; /* Hardware reset vector */ @@ -2634,7 +2634,7 @@ static void init_excp_4xx_softmmu (CPUPPCState *env) env->excp_vectors[POWERPC_EXCP_DTLB] = 0x00001100; env->excp_vectors[POWERPC_EXCP_ITLB] = 0x00001200; env->excp_vectors[POWERPC_EXCP_DEBUG] = 0x00002000; - env->excp_prefix = 0x00000000UL; + env->hreset_excp_prefix = 0x00000000UL; env->ivor_mask = 0x0000FFF0UL; env->ivpr_mask = 0xFFFF0000UL; /* Hardware reset vector */ @@ -2660,7 +2660,7 @@ static void init_excp_MPC5xx (CPUPPCState *env) env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001C00; env->excp_vectors[POWERPC_EXCP_MEXTBR] = 0x00001E00; env->excp_vectors[POWERPC_EXCP_NMEXTBR] = 0x00001F00; - env->excp_prefix = 0x00000000UL; + env->hreset_excp_prefix = 0x00000000UL; env->ivor_mask = 0x0000FFF0UL; env->ivpr_mask = 0xFFFF0000UL; /* Hardware reset vector */ @@ -2692,7 +2692,7 @@ static void init_excp_MPC8xx (CPUPPCState *env) env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001C00; env->excp_vectors[POWERPC_EXCP_MEXTBR] = 0x00001E00; env->excp_vectors[POWERPC_EXCP_NMEXTBR] = 0x00001F00; - env->excp_prefix = 0x00000000UL; + env->hreset_excp_prefix = 0x00000000UL; env->ivor_mask = 0x0000FFF0UL; env->ivpr_mask = 0xFFFF0000UL; /* Hardware reset vector */ @@ -2720,7 +2720,7 @@ static void init_excp_G2 (CPUPPCState *env) env->excp_vectors[POWERPC_EXCP_DSTLB] = 0x00001200; env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300; env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400; - env->excp_prefix = 0x00000000UL; + env->hreset_excp_prefix = 0x00000000UL; /* Hardware reset vector */ env->hreset_vector = 0xFFFFFFFCUL; #endif @@ -2749,7 +2749,7 @@ static void init_excp_e200 (CPUPPCState *env) env->excp_vectors[POWERPC_EXCP_SPEU] = 0x00000000; env->excp_vectors[POWERPC_EXCP_EFPDI] = 0x00000000; env->excp_vectors[POWERPC_EXCP_EFPRI] = 0x00000000; - env->excp_prefix = 0x00000000UL; + env->hreset_excp_prefix = 0x00000000UL; env->ivor_mask = 0x0000FFF7UL; env->ivpr_mask = 0xFFFF0000UL; /* Hardware reset vector */ @@ -2776,7 +2776,7 @@ static void init_excp_BookE (CPUPPCState *env) env->excp_vectors[POWERPC_EXCP_DTLB] = 0x00000000; env->excp_vectors[POWERPC_EXCP_ITLB] = 0x00000000; env->excp_vectors[POWERPC_EXCP_DEBUG] = 0x00000000; - env->excp_prefix = 0x00000000UL; + env->hreset_excp_prefix = 0x00000000UL; env->ivor_mask = 0x0000FFE0UL; env->ivpr_mask = 0xFFFF0000UL; /* Hardware reset vector */ @@ -2799,7 +2799,7 @@ static void init_excp_601 (CPUPPCState *env) env->excp_vectors[POWERPC_EXCP_IO] = 0x00000A00; env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00; env->excp_vectors[POWERPC_EXCP_RUNM] = 0x00002000; - env->excp_prefix = 0xFFF00000UL; + env->hreset_excp_prefix = 0xFFF00000UL; /* Hardware reset vector */ env->hreset_vector = 0x00000100UL; #endif @@ -2827,7 +2827,7 @@ static void init_excp_602 (CPUPPCState *env) env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400; env->excp_vectors[POWERPC_EXCP_WDT] = 0x00001500; env->excp_vectors[POWERPC_EXCP_EMUL] = 0x00001600; - env->excp_prefix = 0xFFF00000UL; + env->hreset_excp_prefix = 0xFFF00000UL; /* Hardware reset vector */ env->hreset_vector = 0xFFFFFFFCUL; #endif @@ -2852,7 +2852,7 @@ static void init_excp_603 (CPUPPCState *env) env->excp_vectors[POWERPC_EXCP_DSTLB] = 0x00001200; env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300; env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400; - env->excp_prefix = 0x00000000UL; + env->hreset_excp_prefix = 0x00000000UL; /* Hardware reset vector */ env->hreset_vector = 0xFFFFFFFCUL; #endif @@ -2875,9 +2875,9 @@ static void init_excp_604 (CPUPPCState *env) env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00; env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300; env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400; - env->excp_prefix = 0x00000000UL; + env->hreset_excp_prefix = 0xFFF00000UL; /* Hardware reset vector */ - env->hreset_vector = 0xFFFFFFFCUL; + env->hreset_vector = 0x00000100UL; #endif } @@ -2899,7 +2899,7 @@ static void init_excp_620 (CPUPPCState *env) env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00; env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300; env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400; - env->excp_prefix = 0xFFF00000UL; + env->hreset_excp_prefix = 0xFFF00000UL; /* Hardware reset vector */ env->hreset_vector = 0x0000000000000100ULL; #endif @@ -2924,7 +2924,7 @@ static void init_excp_7x0 (CPUPPCState *env) env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300; env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400; env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700; - env->excp_prefix = 0x00000000UL; + env->hreset_excp_prefix = 0x00000000UL; /* Hardware reset vector */ env->hreset_vector = 0xFFFFFFFCUL; #endif @@ -2947,7 +2947,7 @@ static void init_excp_750cl (CPUPPCState *env) env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00; env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300; env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400; - env->excp_prefix = 0x00000000UL; + env->hreset_excp_prefix = 0x00000000UL; /* Hardware reset vector */ env->hreset_vector = 0xFFFFFFFCUL; #endif @@ -2970,7 +2970,7 @@ static void init_excp_750cx (CPUPPCState *env) env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00; env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300; env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700; - env->excp_prefix = 0x00000000UL; + env->hreset_excp_prefix = 0x00000000UL; /* Hardware reset vector */ env->hreset_vector = 0xFFFFFFFCUL; #endif @@ -2998,7 +2998,7 @@ static void init_excp_7x5 (CPUPPCState *env) env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300; env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400; env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700; - env->excp_prefix = 0x00000000UL; + env->hreset_excp_prefix = 0x00000000UL; /* Hardware reset vector */ env->hreset_vector = 0xFFFFFFFCUL; #endif @@ -3024,7 +3024,7 @@ static void init_excp_7400 (CPUPPCState *env) env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400; env->excp_vectors[POWERPC_EXCP_VPUA] = 0x00001600; env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700; - env->excp_prefix = 0x00000000UL; + env->hreset_excp_prefix = 0x00000000UL; /* Hardware reset vector */ env->hreset_vector = 0xFFFFFFFCUL; #endif @@ -3052,7 +3052,7 @@ static void init_excp_7450 (CPUPPCState *env) env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300; env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400; env->excp_vectors[POWERPC_EXCP_VPUA] = 0x00001600; - env->excp_prefix = 0x00000000UL; + env->hreset_excp_prefix = 0x00000000UL; /* Hardware reset vector */ env->hreset_vector = 0xFFFFFFFCUL; #endif @@ -3082,7 +3082,7 @@ static void init_excp_970 (CPUPPCState *env) env->excp_vectors[POWERPC_EXCP_MAINT] = 0x00001600; env->excp_vectors[POWERPC_EXCP_VPUA] = 0x00001700; env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001800; - env->excp_prefix = 0x00000000FFF00000ULL; + env->hreset_excp_prefix = 0x00000000FFF00000ULL; /* Hardware reset vector */ env->hreset_vector = 0x0000000000000100ULL; #endif @@ -8892,7 +8892,7 @@ static void init_ppc_proc (CPUPPCState *env, const ppc_def_t *def) /* Set all exception vectors to an invalid address */ for (i = 0; i < POWERPC_EXCP_NB; i++) env->excp_vectors[i] = (target_ulong)(-1ULL); - env->excp_prefix = 0x00000000; + env->hreset_excp_prefix = 0x00000000; env->ivor_mask = 0x00000000; env->ivpr_mask = 0x00000000; /* Default MMU definitions */ @@ -8922,6 +8922,9 @@ static void init_ppc_proc (CPUPPCState *env, const ppc_def_t *def) } /* PowerPC implementation specific initialisations (SPRs, timers, ...) */ (*def->init_proc)(env); +#if !defined(CONFIG_USER_ONLY) + env->excp_prefix = env->hreset_excp_prefix; +#endif /* MSR bits & flags consistency checks */ if (env->msr_mask & (1 << 25)) { switch (env->flags & (POWERPC_FLAG_SPE | POWERPC_FLAG_VRE)) { |