aboutsummaryrefslogtreecommitdiff
path: root/target-sparc
diff options
context:
space:
mode:
authorblueswir1 <blueswir1@c046a42c-6fe2-441c-8c8c-71466251a162>2007-09-24 19:44:09 +0000
committerblueswir1 <blueswir1@c046a42c-6fe2-441c-8c8c-71466251a162>2007-09-24 19:44:09 +0000
commit40ce0a9a8f498dc4c766f55760eea49b3f55069e (patch)
tree65d1caaafabe10233fd5f0514daf9a08b957a6b8 /target-sparc
parent9437454a8427c1b32de4ab7a426615ea237e59c6 (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.h1
-rw-r--r--target-sparc/helper.c7
-rw-r--r--target-sparc/op_helper.c4
-rw-r--r--target-sparc/translate.c5
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;
}