diff options
author | blueswir1 <blueswir1@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-09-24 19:44:09 +0000 |
---|---|---|
committer | blueswir1 <blueswir1@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-09-24 19:44:09 +0000 |
commit | 40ce0a9a8f498dc4c766f55760eea49b3f55069e (patch) | |
tree | 65d1caaafabe10233fd5f0514daf9a08b957a6b8 /target-sparc | |
parent | 9437454a8427c1b32de4ab7a426615ea237e59c6 (diff) |
CPU boot mode
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3231 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'target-sparc')
-rw-r--r-- | target-sparc/cpu.h | 1 | ||||
-rw-r--r-- | target-sparc/helper.c | 7 | ||||
-rw-r--r-- | target-sparc/op_helper.c | 4 | ||||
-rw-r--r-- | target-sparc/translate.c | 5 |
4 files changed, 13 insertions, 4 deletions
diff --git a/target-sparc/cpu.h b/target-sparc/cpu.h index 6f0da43b87..5c8c49ab63 100644 --- a/target-sparc/cpu.h +++ b/target-sparc/cpu.h @@ -145,6 +145,7 @@ /* MMU */ #define MMU_E (1<<0) #define MMU_NF (1<<1) +#define MMU_BM (1<<14) #define PTE_ENTRYTYPE_MASK 3 #define PTE_ACCESS_MASK 0x1c diff --git a/target-sparc/helper.c b/target-sparc/helper.c index b78e5dfb88..af8bc96948 100644 --- a/target-sparc/helper.c +++ b/target-sparc/helper.c @@ -110,7 +110,14 @@ int get_physical_address (CPUState *env, target_phys_addr_t *physical, int *prot unsigned long page_offset; virt_addr = address & TARGET_PAGE_MASK; + if ((env->mmuregs[0] & MMU_E) == 0) { /* MMU disabled */ + // Boot mode: instruction fetches are taken from PROM + if (rw == 2 && (env->mmuregs[0] & MMU_BM)) { + *physical = 0xff0000000ULL | (address & 0x3ffffULL); + *prot = PAGE_READ | PAGE_EXEC; + return 0; + } *physical = address; *prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC; return 0; diff --git a/target-sparc/op_helper.c b/target-sparc/op_helper.c index 21ae5dec2b..eea4a63771 100644 --- a/target-sparc/op_helper.c +++ b/target-sparc/op_helper.c @@ -337,8 +337,8 @@ void helper_st_asi(int asi, int size) oldreg = env->mmuregs[reg]; switch(reg) { case 0: - env->mmuregs[reg] &= ~(MMU_E | MMU_NF); - env->mmuregs[reg] |= T1 & (MMU_E | MMU_NF); + env->mmuregs[reg] &= ~(MMU_E | MMU_NF | MMU_BM); + env->mmuregs[reg] |= T1 & (MMU_E | MMU_NF | MMU_BM); // Mappings generated during no-fault mode or MMU // disabled mode are invalid in normal mode if (oldreg != env->mmuregs[reg]) diff --git a/target-sparc/translate.c b/target-sparc/translate.c index d617b91e99..d12a356c60 100644 --- a/target-sparc/translate.c +++ b/target-sparc/translate.c @@ -3486,8 +3486,9 @@ void cpu_reset(CPUSPARCState *env) env->pstate = PS_PRIV; env->pc = 0x1fff0000000ULL; #else - env->pc = 0xffd00000; + env->pc = 0; env->mmuregs[0] &= ~(MMU_E | MMU_NF); + env->mmuregs[0] |= MMU_BM; #endif env->npc = env->pc + 4; #endif @@ -3584,7 +3585,7 @@ int cpu_sparc_register (CPUSPARCState *env, const sparc_def_t *def) env->version = def->iu_version; env->fsr = def->fpu_version; #if !defined(TARGET_SPARC64) - env->mmuregs[0] = def->mmu_version; + env->mmuregs[0] |= def->mmu_version; #endif return 0; } |