Revision 06e12b65 target-sparc/helper.c
b/target-sparc/helper.c | ||
---|---|---|
378 | 378 |
{ |
379 | 379 |
uint64_t mask; |
380 | 380 |
|
381 |
switch ((tlb->tte >> 61) & 3) {
|
|
381 |
switch (TTE_PGSIZE(tlb->tte)) {
|
|
382 | 382 |
default: |
383 | 383 |
case 0x0: // 8k |
384 | 384 |
mask = 0xffffffffffffe000ULL; |
... | ... | |
445 | 445 |
uint8_t fault_type = 0; |
446 | 446 |
|
447 | 447 |
// access ok? |
448 |
if ((env->dtlb[i].tte & 0x4) && is_user) {
|
|
448 |
if (TTE_IS_PRIV(env->dtlb[i].tte) && is_user) {
|
|
449 | 449 |
fault_type |= 1; /* privilege violation */ |
450 | 450 |
env->exception_index = TT_DFAULT; |
451 | 451 |
|
452 | 452 |
DPRINTF_MMU("DFAULT at %" PRIx64 " context %" PRIx64 |
453 | 453 |
" mmu_idx=%d tl=%d\n", |
454 | 454 |
address, context, mmu_idx, env->tl); |
455 |
} else if (!(env->dtlb[i].tte & 0x2) && (rw == 1)) {
|
|
455 |
} else if (!TTE_IS_W_OK(env->dtlb[i].tte) && (rw == 1)) {
|
|
456 | 456 |
env->exception_index = TT_DPROT; |
457 | 457 |
|
458 | 458 |
DPRINTF_MMU("DPROT at %" PRIx64 " context %" PRIx64 |
... | ... | |
460 | 460 |
address, context, mmu_idx, env->tl); |
461 | 461 |
} else { |
462 | 462 |
*prot = PAGE_READ; |
463 |
if (env->dtlb[i].tte & 0x2)
|
|
463 |
if (TTE_IS_W_OK(env->dtlb[i].tte)) {
|
|
464 | 464 |
*prot |= PAGE_WRITE; |
465 |
} |
|
465 | 466 |
|
466 | 467 |
TTE_SET_USED(env->dtlb[i].tte); |
467 | 468 |
|
... | ... | |
522 | 523 |
if (ultrasparc_tag_match(&env->itlb[i], |
523 | 524 |
address, context, physical)) { |
524 | 525 |
// access ok? |
525 |
if ((env->itlb[i].tte & 0x4) && is_user) {
|
|
526 |
if (TTE_IS_PRIV(env->itlb[i].tte) && is_user) {
|
|
526 | 527 |
if (env->immu.sfsr) /* Fault status register */ |
527 | 528 |
env->immu.sfsr = 2; /* overflow (not read before |
528 | 529 |
another fault) */ |
... | ... | |
632 | 633 |
} else { |
633 | 634 |
(*cpu_fprintf)(f, "DMMU dump\n"); |
634 | 635 |
for (i = 0; i < 64; i++) { |
635 |
switch ((env->dtlb[i].tte >> 61) & 3) {
|
|
636 |
switch (TTE_PGSIZE(env->dtlb[i].tte)) {
|
|
636 | 637 |
default: |
637 | 638 |
case 0x0: |
638 | 639 |
mask = " 8k"; |
... | ... | |
647 | 648 |
mask = " 4M"; |
648 | 649 |
break; |
649 | 650 |
} |
650 |
if ((env->dtlb[i].tte & 0x8000000000000000ULL) != 0) {
|
|
651 |
if (TTE_IS_VALID(env->dtlb[i].tte)) {
|
|
651 | 652 |
(*cpu_fprintf)(f, "[%02u] VA: %" PRIx64 ", PA: %" PRIx64 |
652 | 653 |
", %s, %s, %s, %s, ctx %" PRId64 " %s\n", |
653 | 654 |
i, |
654 | 655 |
env->dtlb[i].tag & (uint64_t)~0x1fffULL, |
655 |
env->dtlb[i].tte & (uint64_t)0x1ffffffe000ULL,
|
|
656 |
TTE_PA(env->dtlb[i].tte),
|
|
656 | 657 |
mask, |
657 |
env->dtlb[i].tte & 0x4? "priv": "user", |
|
658 |
env->dtlb[i].tte & 0x2? "RW": "RO", |
|
659 |
env->dtlb[i].tte & 0x40? "locked": "unlocked", |
|
658 |
TTE_IS_PRIV(env->dtlb[i].tte) ? "priv" : "user", |
|
659 |
TTE_IS_W_OK(env->dtlb[i].tte) ? "RW" : "RO", |
|
660 |
TTE_IS_LOCKED(env->dtlb[i].tte) ? |
|
661 |
"locked" : "unlocked", |
|
660 | 662 |
env->dtlb[i].tag & (uint64_t)0x1fffULL, |
661 | 663 |
TTE_IS_GLOBAL(env->dtlb[i].tte)? |
662 | 664 |
"global" : "local"); |
... | ... | |
668 | 670 |
} else { |
669 | 671 |
(*cpu_fprintf)(f, "IMMU dump\n"); |
670 | 672 |
for (i = 0; i < 64; i++) { |
671 |
switch ((env->itlb[i].tte >> 61) & 3) {
|
|
673 |
switch (TTE_PGSIZE(env->itlb[i].tte)) {
|
|
672 | 674 |
default: |
673 | 675 |
case 0x0: |
674 | 676 |
mask = " 8k"; |
... | ... | |
683 | 685 |
mask = " 4M"; |
684 | 686 |
break; |
685 | 687 |
} |
686 |
if ((env->itlb[i].tte & 0x8000000000000000ULL) != 0) {
|
|
688 |
if (TTE_IS_VALID(env->itlb[i].tte)) {
|
|
687 | 689 |
(*cpu_fprintf)(f, "[%02u] VA: %" PRIx64 ", PA: %" PRIx64 |
688 | 690 |
", %s, %s, %s, ctx %" PRId64 " %s\n", |
689 | 691 |
i, |
690 | 692 |
env->itlb[i].tag & (uint64_t)~0x1fffULL, |
691 |
env->itlb[i].tte & (uint64_t)0x1ffffffe000ULL,
|
|
693 |
TTE_PA(env->itlb[i].tte),
|
|
692 | 694 |
mask, |
693 |
env->itlb[i].tte & 0x4? "priv": "user", |
|
694 |
env->itlb[i].tte & 0x40? "locked": "unlocked", |
|
695 |
TTE_IS_PRIV(env->itlb[i].tte) ? "priv" : "user", |
|
696 |
TTE_IS_LOCKED(env->itlb[i].tte) ? |
|
697 |
"locked" : "unlocked", |
|
695 | 698 |
env->itlb[i].tag & (uint64_t)0x1fffULL, |
696 | 699 |
TTE_IS_GLOBAL(env->itlb[i].tte)? |
697 | 700 |
"global" : "local"); |
Also available in: Unified diff