mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2025-03-24 22:15:07 +00:00
target-sparc: use SparcV9MMU type for sparc64 I/D-MMUs
Backports commit 96df2bc99f9bdaf7a2f13550111f219b72b73708 from qemu
This commit is contained in:
parent
c61e580b2d
commit
f3d96d19e5
|
@ -398,7 +398,22 @@ struct CPUTimer
|
||||||
typedef struct CPUTimer CPUTimer;
|
typedef struct CPUTimer CPUTimer;
|
||||||
|
|
||||||
typedef struct CPUSPARCState CPUSPARCState;
|
typedef struct CPUSPARCState CPUSPARCState;
|
||||||
|
#if defined(TARGET_SPARC64)
|
||||||
|
typedef union {
|
||||||
|
uint64_t mmuregs[16];
|
||||||
|
struct {
|
||||||
|
uint64_t tsb_tag_target;
|
||||||
|
uint64_t mmu_primary_context;
|
||||||
|
uint64_t mmu_secondary_context;
|
||||||
|
uint64_t sfsr;
|
||||||
|
uint64_t sfar;
|
||||||
|
uint64_t tsb;
|
||||||
|
uint64_t tag_access;
|
||||||
|
uint64_t virtual_watchpoint;
|
||||||
|
uint64_t physical_watchpoint;
|
||||||
|
};
|
||||||
|
} SparcV9MMU;
|
||||||
|
#endif
|
||||||
struct CPUSPARCState {
|
struct CPUSPARCState {
|
||||||
target_ulong gregs[8]; /* general registers */
|
target_ulong gregs[8]; /* general registers */
|
||||||
target_ulong *regwptr; /* pointer to current register window */
|
target_ulong *regwptr; /* pointer to current register window */
|
||||||
|
@ -451,35 +466,8 @@ struct CPUSPARCState {
|
||||||
uint64_t lsu;
|
uint64_t lsu;
|
||||||
#define DMMU_E 0x8
|
#define DMMU_E 0x8
|
||||||
#define IMMU_E 0x4
|
#define IMMU_E 0x4
|
||||||
//typedef struct SparcMMU
|
SparcV9MMU immu;
|
||||||
union {
|
SparcV9MMU dmmu;
|
||||||
uint64_t immuregs[16];
|
|
||||||
struct {
|
|
||||||
uint64_t tsb_tag_target;
|
|
||||||
uint64_t unused_mmu_primary_context; // use DMMU
|
|
||||||
uint64_t unused_mmu_secondary_context; // use DMMU
|
|
||||||
uint64_t sfsr;
|
|
||||||
uint64_t sfar;
|
|
||||||
uint64_t tsb;
|
|
||||||
uint64_t tag_access;
|
|
||||||
uint64_t virtual_watchpoint;
|
|
||||||
uint64_t physical_watchpoint;
|
|
||||||
} immu;
|
|
||||||
};
|
|
||||||
union {
|
|
||||||
uint64_t dmmuregs[16];
|
|
||||||
struct {
|
|
||||||
uint64_t tsb_tag_target;
|
|
||||||
uint64_t mmu_primary_context;
|
|
||||||
uint64_t mmu_secondary_context;
|
|
||||||
uint64_t sfsr;
|
|
||||||
uint64_t sfar;
|
|
||||||
uint64_t tsb;
|
|
||||||
uint64_t tag_access;
|
|
||||||
uint64_t virtual_watchpoint;
|
|
||||||
uint64_t physical_watchpoint;
|
|
||||||
} dmmu;
|
|
||||||
};
|
|
||||||
SparcTLBEntry itlb[64];
|
SparcTLBEntry itlb[64];
|
||||||
SparcTLBEntry dtlb[64];
|
SparcTLBEntry dtlb[64];
|
||||||
uint32_t mmu_version;
|
uint32_t mmu_version;
|
||||||
|
|
|
@ -1494,7 +1494,7 @@ void helper_st_asi(CPUSPARCState *env, target_ulong addr, target_ulong val,
|
||||||
int reg = (addr >> 3) & 0xf;
|
int reg = (addr >> 3) & 0xf;
|
||||||
uint64_t oldreg;
|
uint64_t oldreg;
|
||||||
|
|
||||||
oldreg = env->immuregs[reg];
|
oldreg = env->immu.mmuregs[reg];
|
||||||
switch (reg) {
|
switch (reg) {
|
||||||
case 0: /* RO */
|
case 0: /* RO */
|
||||||
return;
|
return;
|
||||||
|
@ -1525,7 +1525,7 @@ void helper_st_asi(CPUSPARCState *env, target_ulong addr, target_ulong val,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (oldreg != env->immuregs[reg]) {
|
if (oldreg != env->immu.mmuregs[reg]) {
|
||||||
DPRINTF_MMU("immu change reg[%d]: 0x%016" PRIx64 " -> 0x%016"
|
DPRINTF_MMU("immu change reg[%d]: 0x%016" PRIx64 " -> 0x%016"
|
||||||
PRIx64 "\n", reg, oldreg, env->immuregs[reg]);
|
PRIx64 "\n", reg, oldreg, env->immuregs[reg]);
|
||||||
}
|
}
|
||||||
|
@ -1559,7 +1559,7 @@ void helper_st_asi(CPUSPARCState *env, target_ulong addr, target_ulong val,
|
||||||
int reg = (addr >> 3) & 0xf;
|
int reg = (addr >> 3) & 0xf;
|
||||||
uint64_t oldreg;
|
uint64_t oldreg;
|
||||||
|
|
||||||
oldreg = env->dmmuregs[reg];
|
oldreg = env->dmmu.mmuregs[reg];
|
||||||
switch (reg) {
|
switch (reg) {
|
||||||
case 0: /* RO */
|
case 0: /* RO */
|
||||||
case 4:
|
case 4:
|
||||||
|
@ -1602,7 +1602,7 @@ void helper_st_asi(CPUSPARCState *env, target_ulong addr, target_ulong val,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (oldreg != env->dmmuregs[reg]) {
|
if (oldreg != env->dmmu.mmuregs[reg]) {
|
||||||
DPRINTF_MMU("dmmu change reg[%d]: 0x%016" PRIx64 " -> 0x%016"
|
DPRINTF_MMU("dmmu change reg[%d]: 0x%016" PRIx64 " -> 0x%016"
|
||||||
PRIx64 "\n", reg, oldreg, env->dmmuregs[reg]);
|
PRIx64 "\n", reg, oldreg, env->dmmuregs[reg]);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue