54 static int translate_via_mmu(
struct cpu *
cpu, uint32_t vaddr,
55 uint64_t *return_paddr,
int flags)
58 int i, urb, urc, require_asid_match, cur_asid, expevt = 0;
59 uint32_t hi, lo = 0, mask = 0;
123 if ((hi & mask) != (vaddr & mask))
128 if (!sh && require_asid_match) {
130 if (asid != cur_asid)
140 if (i == SH_N_UTLB_ENTRIES)
148 *return_paddr = (vaddr & ~mask) | (lo & mask & 0x1fffffff);
150 if (flags & FLAG_INSTR) {
161 if (i >= 0 && !(flags & FLAG_NOEXCEPTIONS)) {
181 goto protection_violation;
192 goto protection_violation;
195 case 3:
if (wf && !d)
196 goto initial_write_exception;
204 case 1:
goto protection_violation;
206 goto protection_violation;
208 case 3:
if (wf && !d)
209 goto initial_write_exception;
218 protection_violation:
222 initial_write_exception:
227 if (flags & FLAG_NOEXCEPTIONS) {
252 uint32_t vaddr = vaddr64;
255 if (!(vaddr & 0x80000000) ||
256 (vaddr >= 0xc0000000 && vaddr < 0xe0000000)) {
260 *return_paddr = vaddr & 0x1fffffff;
265 return translate_via_mmu(cpu, vaddr, return_paddr, flags);
269 if (vaddr >= 0xe0000000 && vaddr < 0xe4000000) {
271 *return_paddr = vaddr;
276 if (flags & FLAG_NOEXCEPTIONS) {
290 if (vaddr >= 0x80000000 && vaddr < 0xc0000000) {
291 *return_paddr = vaddr & 0x1fffffff;
295 if (flags & FLAG_INSTR) {
296 fatal(
"TODO: instr at 0x%08" PRIx32
"\n", (uint32_t)vaddr);
301 if ((vaddr & 0xf0000000) == 0xf0000000) {
302 *return_paddr = vaddr;
306 if (flags & FLAG_NOEXCEPTIONS) {
314 if (!(flags & FLAG_NOEXCEPTIONS)) {
315 fatal(
"Unimplemented SH vaddr 0x%08" PRIx32
"\n", vaddr);
#define SH4_MMUCR_URB_MASK
#define EXPEVT_TLB_MISS_LD
void fatal(const char *fmt,...)
#define SH_N_UTLB_ENTRIES
#define FLAG_NOEXCEPTIONS
#define SH4_MMUCR_URC_MASK
void sh_exception(struct cpu *cpu, int expevt, int intevt, uint32_t vaddr)
#define SH4_MMUCR_URB_SHIFT
#define SH4_PTEH_ASID_MASK
#define SH_N_ITLB_ENTRIES
uint32_t itlb_lo[SH_N_ITLB_ENTRIES]
uint32_t utlb_hi[SH_N_UTLB_ENTRIES]
#define SH4_PTEL_PR_SHIFT
#define SH4_MMUCR_URC_SHIFT
#define EXPEVT_TLB_MISS_ST
int sh_translate_v2p(struct cpu *cpu, uint64_t vaddr64, uint64_t *return_paddr, int flags)
#define EXPEVT_TLB_PROT_LD
uint32_t itlb_hi[SH_N_ITLB_ENTRIES]
void(* invalidate_code_translation)(struct cpu *, uint64_t paddr, int flags)
uint32_t utlb_lo[SH_N_UTLB_ENTRIES]
void(* invalidate_translation_caches)(struct cpu *, uint64_t paddr, int flags)
#define EXPEVT_TLB_PROT_ST