Revision d12d51d5 target-ppc/op_helper.c
b/target-ppc/op_helper.c | ||
---|---|---|
28 | 28 |
//#define DEBUG_EXCEPTIONS |
29 | 29 |
//#define DEBUG_SOFTWARE_TLB |
30 | 30 |
|
31 |
#ifdef DEBUG_SOFTWARE_TLB |
|
32 |
# define LOG_SWTLB(...) do { \ |
|
33 |
if (loglevel) \ |
|
34 |
fprintf(logfile, ## __VA_ARGS__); \ |
|
35 |
} while (0) |
|
36 |
#else |
|
37 |
# define LOG_SWTLB(...) do { } while (0) |
|
38 |
#endif |
|
39 |
|
|
40 |
|
|
31 | 41 |
/*****************************************************************************/ |
32 | 42 |
/* Exceptions processing helpers */ |
33 | 43 |
|
... | ... | |
3564 | 3574 |
EPN = env->spr[SPR_DMISS]; |
3565 | 3575 |
} |
3566 | 3576 |
way = (env->spr[SPR_SRR1] >> 17) & 1; |
3567 |
#if defined (DEBUG_SOFTWARE_TLB) |
|
3568 |
if (loglevel != 0) { |
|
3569 |
fprintf(logfile, "%s: EPN " ADDRX " " ADDRX " PTE0 " ADDRX |
|
3577 |
LOG_SWTLB("%s: EPN " ADDRX " " ADDRX " PTE0 " ADDRX |
|
3570 | 3578 |
" PTE1 " ADDRX " way %d\n", |
3571 | 3579 |
__func__, new_EPN, EPN, CMP, RPN, way); |
3572 |
} |
|
3573 |
#endif |
|
3574 | 3580 |
/* Store this TLB */ |
3575 | 3581 |
ppc6xx_tlb_store(env, (uint32_t)(new_EPN & TARGET_PAGE_MASK), |
3576 | 3582 |
way, is_code, CMP, RPN); |
... | ... | |
3596 | 3602 |
CMP = env->spr[SPR_PTEHI]; |
3597 | 3603 |
EPN = env->spr[SPR_TLBMISS] & ~0x3; |
3598 | 3604 |
way = env->spr[SPR_TLBMISS] & 0x3; |
3599 |
#if defined (DEBUG_SOFTWARE_TLB) |
|
3600 |
if (loglevel != 0) { |
|
3601 |
fprintf(logfile, "%s: EPN " ADDRX " " ADDRX " PTE0 " ADDRX |
|
3605 |
LOG_SWTLB("%s: EPN " ADDRX " " ADDRX " PTE0 " ADDRX |
|
3602 | 3606 |
" PTE1 " ADDRX " way %d\n", |
3603 | 3607 |
__func__, new_EPN, EPN, CMP, RPN, way); |
3604 |
} |
|
3605 |
#endif |
|
3606 | 3608 |
/* Store this TLB */ |
3607 | 3609 |
ppc6xx_tlb_store(env, (uint32_t)(new_EPN & TARGET_PAGE_MASK), |
3608 | 3610 |
way, is_code, CMP, RPN); |
... | ... | |
3726 | 3728 |
ppcemb_tlb_t *tlb; |
3727 | 3729 |
target_ulong page, end; |
3728 | 3730 |
|
3729 |
#if defined (DEBUG_SOFTWARE_TLB) |
|
3730 |
if (loglevel != 0) { |
|
3731 |
fprintf(logfile, "%s entry %d val " ADDRX "\n", __func__, (int)entry, val); |
|
3732 |
} |
|
3733 |
#endif |
|
3731 |
LOG_SWTLB("%s entry %d val " ADDRX "\n", __func__, (int)entry, val); |
|
3734 | 3732 |
entry &= 0x3F; |
3735 | 3733 |
tlb = &env->tlb[entry].tlbe; |
3736 | 3734 |
/* Invalidate previous TLB (if it's valid) */ |
3737 | 3735 |
if (tlb->prot & PAGE_VALID) { |
3738 | 3736 |
end = tlb->EPN + tlb->size; |
3739 |
#if defined (DEBUG_SOFTWARE_TLB) |
|
3740 |
if (loglevel != 0) { |
|
3741 |
fprintf(logfile, "%s: invalidate old TLB %d start " ADDRX |
|
3737 |
LOG_SWTLB("%s: invalidate old TLB %d start " ADDRX |
|
3742 | 3738 |
" end " ADDRX "\n", __func__, (int)entry, tlb->EPN, end); |
3743 |
} |
|
3744 |
#endif |
|
3745 | 3739 |
for (page = tlb->EPN; page < end; page += TARGET_PAGE_SIZE) |
3746 | 3740 |
tlb_flush_page(env, page); |
3747 | 3741 |
} |
... | ... | |
3766 | 3760 |
} |
3767 | 3761 |
tlb->PID = env->spr[SPR_40x_PID]; /* PID */ |
3768 | 3762 |
tlb->attr = val & 0xFF; |
3769 |
#if defined (DEBUG_SOFTWARE_TLB) |
|
3770 |
if (loglevel != 0) { |
|
3771 |
fprintf(logfile, "%s: set up TLB %d RPN " PADDRX " EPN " ADDRX |
|
3763 |
LOG_SWTLB("%s: set up TLB %d RPN " PADDRX " EPN " ADDRX |
|
3772 | 3764 |
" size " ADDRX " prot %c%c%c%c PID %d\n", __func__, |
3773 | 3765 |
(int)entry, tlb->RPN, tlb->EPN, tlb->size, |
3774 | 3766 |
tlb->prot & PAGE_READ ? 'r' : '-', |
3775 | 3767 |
tlb->prot & PAGE_WRITE ? 'w' : '-', |
3776 | 3768 |
tlb->prot & PAGE_EXEC ? 'x' : '-', |
3777 | 3769 |
tlb->prot & PAGE_VALID ? 'v' : '-', (int)tlb->PID); |
3778 |
} |
|
3779 |
#endif |
|
3780 | 3770 |
/* Invalidate new TLB (if valid) */ |
3781 | 3771 |
if (tlb->prot & PAGE_VALID) { |
3782 | 3772 |
end = tlb->EPN + tlb->size; |
3783 |
#if defined (DEBUG_SOFTWARE_TLB) |
|
3784 |
if (loglevel != 0) { |
|
3785 |
fprintf(logfile, "%s: invalidate TLB %d start " ADDRX |
|
3773 |
LOG_SWTLB("%s: invalidate TLB %d start " ADDRX |
|
3786 | 3774 |
" end " ADDRX "\n", __func__, (int)entry, tlb->EPN, end); |
3787 |
} |
|
3788 |
#endif |
|
3789 | 3775 |
for (page = tlb->EPN; page < end; page += TARGET_PAGE_SIZE) |
3790 | 3776 |
tlb_flush_page(env, page); |
3791 | 3777 |
} |
... | ... | |
3795 | 3781 |
{ |
3796 | 3782 |
ppcemb_tlb_t *tlb; |
3797 | 3783 |
|
3798 |
#if defined (DEBUG_SOFTWARE_TLB) |
|
3799 |
if (loglevel != 0) { |
|
3800 |
fprintf(logfile, "%s entry %i val " ADDRX "\n", __func__, (int)entry, val); |
|
3801 |
} |
|
3802 |
#endif |
|
3784 |
LOG_SWTLB("%s entry %i val " ADDRX "\n", __func__, (int)entry, val); |
|
3803 | 3785 |
entry &= 0x3F; |
3804 | 3786 |
tlb = &env->tlb[entry].tlbe; |
3805 | 3787 |
tlb->RPN = val & 0xFFFFFC00; |
... | ... | |
3808 | 3790 |
tlb->prot |= PAGE_EXEC; |
3809 | 3791 |
if (val & 0x100) |
3810 | 3792 |
tlb->prot |= PAGE_WRITE; |
3811 |
#if defined (DEBUG_SOFTWARE_TLB) |
|
3812 |
if (loglevel != 0) { |
|
3813 |
fprintf(logfile, "%s: set up TLB %d RPN " PADDRX " EPN " ADDRX |
|
3793 |
LOG_SWTLB("%s: set up TLB %d RPN " PADDRX " EPN " ADDRX |
|
3814 | 3794 |
" size " ADDRX " prot %c%c%c%c PID %d\n", __func__, |
3815 | 3795 |
(int)entry, tlb->RPN, tlb->EPN, tlb->size, |
3816 | 3796 |
tlb->prot & PAGE_READ ? 'r' : '-', |
3817 | 3797 |
tlb->prot & PAGE_WRITE ? 'w' : '-', |
3818 | 3798 |
tlb->prot & PAGE_EXEC ? 'x' : '-', |
3819 | 3799 |
tlb->prot & PAGE_VALID ? 'v' : '-', (int)tlb->PID); |
3820 |
} |
|
3821 |
#endif |
|
3822 | 3800 |
} |
3823 | 3801 |
|
3824 | 3802 |
target_ulong helper_4xx_tlbsx (target_ulong address) |
... | ... | |
3833 | 3811 |
target_ulong EPN, RPN, size; |
3834 | 3812 |
int do_flush_tlbs; |
3835 | 3813 |
|
3836 |
#if defined (DEBUG_SOFTWARE_TLB) |
|
3837 |
if (loglevel != 0) { |
|
3838 |
fprintf(logfile, "%s word %d entry %d value " ADDRX "\n", |
|
3814 |
LOG_SWTLB("%s word %d entry %d value " ADDRX "\n", |
|
3839 | 3815 |
__func__, word, (int)entry, value); |
3840 |
} |
|
3841 |
#endif |
|
3842 | 3816 |
do_flush_tlbs = 0; |
3843 | 3817 |
entry &= 0x3F; |
3844 | 3818 |
tlb = &env->tlb[entry].tlbe; |
Also available in: Unified diff