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)
148 *return_paddr = (vaddr & ~mask) | (lo & mask & 0x1fffffff);
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:
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;
290 if (vaddr >= 0x80000000 && vaddr < 0xc0000000) {
291 *return_paddr = vaddr & 0x1fffffff;
296 fatal(
"TODO: instr at 0x%08" PRIx32
"\n", (uint32_t)vaddr);
301 if ((vaddr & 0xf0000000) == 0xf0000000) {
302 *return_paddr = vaddr;
315 fatal(
"Unimplemented SH vaddr 0x%08" PRIx32
"\n", vaddr);