Commit e8807b14cc8c12c0e14c08fa396d9da043b48209
Committed by
Blue Swirl
1 parent
616cbc78
sparc64: mmu bypass mode correction
This Implement physical address truncation in mmu bypass mode. IMMU bypass is also active when cpu enters RED_STATE Signed-off-by: igor.v.kovalenko@gmail.com -- Kind regards, Igor V. Kovalenko
Showing
1 changed file
with
11 additions
and
3 deletions
target-sparc/helper.c
@@ -369,6 +369,13 @@ void dump_mmu(CPUState *env) | @@ -369,6 +369,13 @@ void dump_mmu(CPUState *env) | ||
369 | #endif /* DEBUG_MMU */ | 369 | #endif /* DEBUG_MMU */ |
370 | 370 | ||
371 | #else /* !TARGET_SPARC64 */ | 371 | #else /* !TARGET_SPARC64 */ |
372 | + | ||
373 | +// 41 bit physical address space | ||
374 | +static inline target_phys_addr_t ultrasparc_truncate_physical(uint64_t x) | ||
375 | +{ | ||
376 | + return x & 0x1ffffffffffULL; | ||
377 | +} | ||
378 | + | ||
372 | /* | 379 | /* |
373 | * UltraSparc IIi I/DMMUs | 380 | * UltraSparc IIi I/DMMUs |
374 | */ | 381 | */ |
@@ -380,7 +387,7 @@ static int get_physical_address_data(CPUState *env, | @@ -380,7 +387,7 @@ static int get_physical_address_data(CPUState *env, | ||
380 | unsigned int i; | 387 | unsigned int i; |
381 | 388 | ||
382 | if ((env->lsu & DMMU_E) == 0) { /* DMMU disabled */ | 389 | if ((env->lsu & DMMU_E) == 0) { /* DMMU disabled */ |
383 | - *physical = address; | 390 | + *physical = ultrasparc_truncate_physical(address); |
384 | *prot = PAGE_READ | PAGE_WRITE; | 391 | *prot = PAGE_READ | PAGE_WRITE; |
385 | return 0; | 392 | return 0; |
386 | } | 393 | } |
@@ -442,8 +449,9 @@ static int get_physical_address_code(CPUState *env, | @@ -442,8 +449,9 @@ static int get_physical_address_code(CPUState *env, | ||
442 | target_ulong mask; | 449 | target_ulong mask; |
443 | unsigned int i; | 450 | unsigned int i; |
444 | 451 | ||
445 | - if ((env->lsu & IMMU_E) == 0) { /* IMMU disabled */ | ||
446 | - *physical = address; | 452 | + if ((env->lsu & IMMU_E) == 0 || (env->pstate & PS_RED) != 0) { |
453 | + /* IMMU disabled */ | ||
454 | + *physical = ultrasparc_truncate_physical(address); | ||
447 | *prot = PAGE_EXEC; | 455 | *prot = PAGE_EXEC; |
448 | return 0; | 456 | return 0; |
449 | } | 457 | } |