Revision 8500e3a9
b/target-ppc/helper.c | ||
---|---|---|
676 | 676 |
} |
677 | 677 |
|
678 | 678 |
#if defined(TARGET_PPC64) |
679 |
static inline int slb_lookup(CPUPPCState *env, target_ulong eaddr, |
|
680 |
target_ulong *vsid, target_ulong *page_mask, |
|
681 |
int *attr, int *target_page_bits) |
|
679 |
static inline ppc_slb_t *slb_lookup(CPUPPCState *env, target_ulong eaddr) |
|
682 | 680 |
{ |
683 | 681 |
uint64_t esid; |
684 | 682 |
int n; |
... | ... | |
693 | 691 |
LOG_SLB("%s: slot %d %016" PRIx64 " %016" |
694 | 692 |
PRIx64 "\n", __func__, n, slb->esid, slb->vsid); |
695 | 693 |
if (slb->esid == esid) { |
696 |
*vsid = (slb->vsid & SLB_VSID_VSID) >> SLB_VSID_SHIFT; |
|
697 |
*page_mask = ~SEGMENT_MASK_256M; |
|
698 |
*attr = slb->vsid & SLB_VSID_ATTR; |
|
699 |
if (target_page_bits) { |
|
700 |
*target_page_bits = (slb->vsid & SLB_VSID_L) |
|
701 |
? TARGET_PAGE_BITS_16M |
|
702 |
: TARGET_PAGE_BITS; |
|
703 |
} |
|
704 |
return n; |
|
694 |
return slb; |
|
705 | 695 |
} |
706 | 696 |
} |
707 | 697 |
|
708 |
return -5;
|
|
698 |
return NULL;
|
|
709 | 699 |
} |
710 | 700 |
|
711 | 701 |
void ppc_slb_invalidate_all (CPUPPCState *env) |
... | ... | |
732 | 722 |
|
733 | 723 |
void ppc_slb_invalidate_one (CPUPPCState *env, uint64_t T0) |
734 | 724 |
{ |
735 |
target_ulong vsid, page_mask; |
|
736 |
int attr; |
|
737 |
int n; |
|
738 | 725 |
ppc_slb_t *slb; |
739 | 726 |
|
740 |
n = slb_lookup(env, T0, &vsid, &page_mask, &attr, NULL);
|
|
741 |
if (n < 0) {
|
|
727 |
slb = slb_lookup(env, T0);
|
|
728 |
if (!slb) {
|
|
742 | 729 |
return; |
743 | 730 |
} |
744 | 731 |
|
745 |
slb = &env->slb[n]; |
|
746 |
|
|
747 | 732 |
if (slb->esid & SLB_ESID_V) { |
748 | 733 |
slb->esid &= ~SLB_ESID_V; |
749 | 734 |
|
... | ... | |
822 | 807 |
pr = msr_pr; |
823 | 808 |
#if defined(TARGET_PPC64) |
824 | 809 |
if (env->mmu_model & POWERPC_MMU_64) { |
825 |
int attr;
|
|
810 |
ppc_slb_t *slb;
|
|
826 | 811 |
|
827 | 812 |
LOG_MMU("Check SLBs\n"); |
828 |
ret = slb_lookup(env, eaddr, &vsid, &page_mask, &attr, |
|
829 |
&target_page_bits); |
|
830 |
if (ret < 0) |
|
831 |
return ret; |
|
832 |
ctx->key = !!(pr ? (attr & SLB_VSID_KP) : (attr & SLB_VSID_KS)); |
|
813 |
slb = slb_lookup(env, eaddr); |
|
814 |
if (!slb) { |
|
815 |
return -5; |
|
816 |
} |
|
817 |
|
|
818 |
vsid = (slb->vsid & SLB_VSID_VSID) >> SLB_VSID_SHIFT; |
|
819 |
page_mask = ~SEGMENT_MASK_256M; |
|
820 |
target_page_bits = (slb->vsid & SLB_VSID_L) |
|
821 |
? TARGET_PAGE_BITS_16M : TARGET_PAGE_BITS; |
|
822 |
ctx->key = !!(pr ? (slb->vsid & SLB_VSID_KP) |
|
823 |
: (slb->vsid & SLB_VSID_KS)); |
|
833 | 824 |
ds = 0; |
834 |
ctx->nx = !!(attr & SLB_VSID_N);
|
|
825 |
ctx->nx = !!(slb->vsid & SLB_VSID_N);
|
|
835 | 826 |
ctx->eaddr = eaddr; |
836 | 827 |
vsid_mask = 0x00003FFFFFFFFF80ULL; |
837 | 828 |
vsid_sh = 7; |
Also available in: Unified diff