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