Revision af7bf89b target-sparc/helper.c
b/target-sparc/helper.c | ||
---|---|---|
23 | 23 |
//#define DEBUG_MMU |
24 | 24 |
|
25 | 25 |
/* Sparc MMU emulation */ |
26 |
int cpu_sparc_handle_mmu_fault (CPUState *env, uint32_t address, int rw,
|
|
26 |
int cpu_sparc_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
|
27 | 27 |
int is_user, int is_softmmu); |
28 | 28 |
|
29 | 29 |
/* thread support */ |
... | ... | |
109 | 109 |
{ 0, 1, 0, 1, 0, 0, 0, 0 } |
110 | 110 |
}; |
111 | 111 |
|
112 |
int get_physical_address (CPUState *env, uint32_t *physical, int *prot,
|
|
113 |
int *access_index, uint32_t address, int rw,
|
|
112 |
int get_physical_address (CPUState *env, target_phys_addr_t *physical, int *prot,
|
|
113 |
int *access_index, target_ulong address, int rw,
|
|
114 | 114 |
int is_user) |
115 | 115 |
{ |
116 | 116 |
int access_perms = 0; |
117 | 117 |
target_phys_addr_t pde_ptr; |
118 |
uint32_t pde, virt_addr; |
|
118 |
uint32_t pde; |
|
119 |
target_ulong virt_addr; |
|
119 | 120 |
int error_code = 0, is_dirty; |
120 | 121 |
unsigned long page_offset; |
121 | 122 |
|
... | ... | |
217 | 218 |
} |
218 | 219 |
|
219 | 220 |
/* Perform address translation */ |
220 |
int cpu_sparc_handle_mmu_fault (CPUState *env, uint32_t address, int rw,
|
|
221 |
int cpu_sparc_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
|
221 | 222 |
int is_user, int is_softmmu) |
222 | 223 |
{ |
223 | 224 |
int exception = 0; |
224 |
uint32_t virt_addr, paddr; |
|
225 |
target_ulong virt_addr; |
|
226 |
target_phys_addr_t paddr; |
|
225 | 227 |
unsigned long vaddr; |
226 | 228 |
int error_code = 0, prot, ret = 0, access_index; |
227 | 229 |
|
... | ... | |
252 | 254 |
return error_code; |
253 | 255 |
} |
254 | 256 |
|
255 |
void memcpy32(uint32_t *dst, const uint32_t *src)
|
|
257 |
void memcpy32(target_ulong *dst, const target_ulong *src)
|
|
256 | 258 |
{ |
257 | 259 |
dst[0] = src[0]; |
258 | 260 |
dst[1] = src[1]; |
... | ... | |
328 | 330 |
env->psret = 0; |
329 | 331 |
cwp = (env->cwp - 1) & (NWINDOWS - 1); |
330 | 332 |
set_cwp(cwp); |
331 |
env->regwptr[9] = env->pc - 4; // XXX? |
|
332 |
env->regwptr[10] = env->pc; |
|
333 |
if (intno & 0x80) { |
|
334 |
env->regwptr[9] = env->pc; |
|
335 |
env->regwptr[10] = env->npc; |
|
336 |
} else { |
|
337 |
env->regwptr[9] = env->pc - 4; // XXX? |
|
338 |
env->regwptr[10] = env->pc; |
|
339 |
} |
|
333 | 340 |
env->psrps = env->psrs; |
334 | 341 |
env->psrs = 1; |
335 | 342 |
env->tbr = (env->tbr & TBR_BASE_MASK) | (intno << 4); |
... | ... | |
343 | 350 |
raise_exception(exception_index); |
344 | 351 |
} |
345 | 352 |
|
346 |
uint32_t mmu_probe(uint32_t address, int mmulev)
|
|
353 |
target_ulong mmu_probe(target_ulong address, int mmulev)
|
|
347 | 354 |
{ |
348 | 355 |
target_phys_addr_t pde_ptr; |
349 | 356 |
uint32_t pde; |
... | ... | |
408 | 415 |
void dump_mmu(void) |
409 | 416 |
{ |
410 | 417 |
#ifdef DEBUG_MMU |
411 |
uint32_t pa, va, va1, va2;
|
|
412 |
int n, m, o; |
|
413 |
target_phys_addr_t pde_ptr;
|
|
418 |
target_ulong va, va1, va2;
|
|
419 |
unsigned int n, m, o;
|
|
420 |
target_phys_addr_t pde_ptr, pa;
|
|
414 | 421 |
uint32_t pde; |
415 | 422 |
|
416 | 423 |
printf("MMU dump:\n"); |
417 | 424 |
pde_ptr = (env->mmuregs[1] << 4) + (env->mmuregs[2] << 4); |
418 | 425 |
pde = ldl_phys(pde_ptr); |
419 |
printf("Root ptr: 0x%08x, ctx: %d\n", env->mmuregs[1] << 4, env->mmuregs[2]);
|
|
426 |
printf("Root ptr: " TARGET_FMT_lx ", ctx: %d\n", env->mmuregs[1] << 4, env->mmuregs[2]);
|
|
420 | 427 |
for (n = 0, va = 0; n < 256; n++, va += 16 * 1024 * 1024) { |
421 | 428 |
pde_ptr = mmu_probe(va, 2); |
422 | 429 |
if (pde_ptr) { |
423 | 430 |
pa = cpu_get_phys_page_debug(env, va); |
424 |
printf("VA: 0x%08x, PA: 0x%08x PDE: 0x%08x\n", va, pa, pde_ptr);
|
|
431 |
printf("VA: " TARGET_FMT_lx ", PA: " TARGET_FMT_lx " PDE: " TARGET_FMT_lx "\n", va, pa, pde_ptr);
|
|
425 | 432 |
for (m = 0, va1 = va; m < 64; m++, va1 += 256 * 1024) { |
426 | 433 |
pde_ptr = mmu_probe(va1, 1); |
427 | 434 |
if (pde_ptr) { |
428 | 435 |
pa = cpu_get_phys_page_debug(env, va1); |
429 |
printf(" VA: 0x%08x, PA: 0x%08x PDE: 0x%08x\n", va1, pa, pde_ptr);
|
|
436 |
printf(" VA: " TARGET_FMT_lx ", PA: " TARGET_FMT_lx " PDE: " TARGET_FMT_lx "\n", va1, pa, pde_ptr);
|
|
430 | 437 |
for (o = 0, va2 = va1; o < 64; o++, va2 += 4 * 1024) { |
431 | 438 |
pde_ptr = mmu_probe(va2, 0); |
432 | 439 |
if (pde_ptr) { |
433 | 440 |
pa = cpu_get_phys_page_debug(env, va2); |
434 |
printf(" VA: 0x%08x, PA: 0x%08x PTE: 0x%08x\n", va2, pa, pde_ptr);
|
|
441 |
printf(" VA: " TARGET_FMT_lx ", PA: " TARGET_FMT_lx " PTE: " TARGET_FMT_lx "\n", va2, pa, pde_ptr);
|
|
435 | 442 |
} |
436 | 443 |
} |
437 | 444 |
} |
Also available in: Unified diff