static int find_pte64(CPUPPCState *env, struct mmu_ctx_hash64 *ctx,

                      ppc_slb_t *slb, target_ulong eaddr, int rwx)

{

    hwaddr pteg_off, pte_offset;

    ppc_hash_pte64_t pte;

    uint64_t vsid, pageaddr, ptem;

    hwaddr hash;

    int segment_bits, target_page_bits;

    int ret;



    ret = -1; /* No entry found */



    if (slb->vsid & SLB_VSID_B) {

        vsid = (slb->vsid & SLB_VSID_VSID) >> SLB_VSID_SHIFT_1T;

        segment_bits = 40;

    } else {

        vsid = (slb->vsid & SLB_VSID_VSID) >> SLB_VSID_SHIFT;

        segment_bits = 28;

    }



    target_page_bits = (slb->vsid & SLB_VSID_L)

        ? TARGET_PAGE_BITS_16M : TARGET_PAGE_BITS;

    ctx->key = !!(msr_pr ? (slb->vsid & SLB_VSID_KP)

                  : (slb->vsid & SLB_VSID_KS));



    pageaddr = eaddr & ((1ULL << segment_bits)

                            - (1ULL << target_page_bits));

    if (slb->vsid & SLB_VSID_B) {

        hash = vsid ^ (vsid << 25) ^ (pageaddr >> target_page_bits);

    } else {

        hash = vsid ^ (pageaddr >> target_page_bits);

    }

    /* Only 5 bits of the page index are used in the AVPN */

    ptem = (slb->vsid & SLB_VSID_PTEM) |

        ((pageaddr >> 16) & ((1ULL << segment_bits) - 0x80));



    ret = -1;



    /* Page address translation */

    LOG_MMU("htab_base " TARGET_FMT_plx " htab_mask " TARGET_FMT_plx

            " hash " TARGET_FMT_plx "\n",

            env->htab_base, env->htab_mask, hash);





    /* Primary PTEG lookup */

    LOG_MMU("0 htab=" TARGET_FMT_plx "/" TARGET_FMT_plx

            " vsid=" TARGET_FMT_lx " ptem=" TARGET_FMT_lx

            " hash=" TARGET_FMT_plx "\n",

            env->htab_base, env->htab_mask, vsid, ptem,  hash);

    pteg_off = (hash * HASH_PTEG_SIZE_64) & env->htab_mask;

    pte_offset = ppc_hash64_pteg_search(env, pteg_off, 0, ptem, &pte);

    if (pte_offset == -1) {

        /* Secondary PTEG lookup */

        LOG_MMU("1 htab=" TARGET_FMT_plx "/" TARGET_FMT_plx

                " vsid=" TARGET_FMT_lx " api=" TARGET_FMT_lx

                " hash=" TARGET_FMT_plx "\n", env->htab_base,

                env->htab_mask, vsid, ptem, ~hash);



        pteg_off = (~hash * HASH_PTEG_SIZE_64) & env->htab_mask;

        pte_offset = ppc_hash64_pteg_search(env, pteg_off, 1, ptem, &pte);

    }



    if (pte_offset != -1) {

        ret = pte64_check(ctx, pte.pte0, pte.pte1, rwx);

        LOG_MMU("found PTE at addr %08" HWADDR_PRIx " prot=%01x ret=%d\n",

                ctx->raddr, ctx->prot, ret);

        /* Update page flags */

        if (ppc_hash64_pte_update_flags(ctx, &pte.pte1, ret, rwx) == 1) {

            ppc_hash64_store_hpte1(env, pte_offset, pte.pte1);

        }

    }



    /* We have a TLB that saves 4K pages, so let's

     * split a huge page to 4k chunks */

    if (target_page_bits != TARGET_PAGE_BITS) {

        ctx->raddr |= (eaddr & ((1 << target_page_bits) - 1))

                      & TARGET_PAGE_MASK;

    }

    return ret;

}

static int find_pte64(CPUPPCState *env, struct mmu_ctx_hash64 *ctx,

                      ppc_slb_t *slb, target_ulong eaddr, int rwx)

{

    hwaddr pteg_off, pte_offset;

    ppc_hash_pte64_t pte;

    uint64_t vsid, pageaddr, ptem;

    hwaddr hash;

    int segment_bits, target_page_bits;

    int ret;



    ret = -1; 



    if (slb->vsid & SLB_VSID_B) {

        vsid = (slb->vsid & SLB_VSID_VSID) >> SLB_VSID_SHIFT_1T;

        segment_bits = 40;

    } else {

        vsid = (slb->vsid & SLB_VSID_VSID) >> SLB_VSID_SHIFT;

        segment_bits = 28;

    }



    target_page_bits = (slb->vsid & SLB_VSID_L)

        ? TARGET_PAGE_BITS_16M : TARGET_PAGE_BITS;

    ctx->key = !!(msr_pr ? (slb->vsid & SLB_VSID_KP)

                  : (slb->vsid & SLB_VSID_KS));



    pageaddr = eaddr & ((1ULL << segment_bits)

                            - (1ULL << target_page_bits));

    if (slb->vsid & SLB_VSID_B) {

        hash = vsid ^ (vsid << 25) ^ (pageaddr >> target_page_bits);

    } else {

        hash = vsid ^ (pageaddr >> target_page_bits);

    }

    

    ptem = (slb->vsid & SLB_VSID_PTEM) |

        ((pageaddr >> 16) & ((1ULL << segment_bits) - 0x80));



    ret = -1;



    

    LOG_MMU("htab_base " TARGET_FMT_plx " htab_mask " TARGET_FMT_plx

            " hash " TARGET_FMT_plx "\n",

            env->htab_base, env->htab_mask, hash);





    

    LOG_MMU("0 htab=" TARGET_FMT_plx "/" TARGET_FMT_plx

            " vsid=" TARGET_FMT_lx " ptem=" TARGET_FMT_lx

            " hash=" TARGET_FMT_plx "\n",

            env->htab_base, env->htab_mask, vsid, ptem,  hash);

    pteg_off = (hash * HASH_PTEG_SIZE_64) & env->htab_mask;

    pte_offset = ppc_hash64_pteg_search(env, pteg_off, 0, ptem, &pte);

    if (pte_offset == -1) {

        

        LOG_MMU("1 htab=" TARGET_FMT_plx "/" TARGET_FMT_plx

                " vsid=" TARGET_FMT_lx " api=" TARGET_FMT_lx

                " hash=" TARGET_FMT_plx "\n", env->htab_base,

                env->htab_mask, vsid, ptem, ~hash);



        pteg_off = (~hash * HASH_PTEG_SIZE_64) & env->htab_mask;

        pte_offset = ppc_hash64_pteg_search(env, pteg_off, 1, ptem, &pte);

    }



    if (pte_offset != -1) {

        ret = pte64_check(ctx, pte.pte0, pte.pte1, rwx);

        LOG_MMU("found PTE at addr %08" HWADDR_PRIx " prot=%01x ret=%d\n",

                ctx->raddr, ctx->prot, ret);

        

        if (ppc_hash64_pte_update_flags(ctx, &pte.pte1, ret, rwx) == 1) {

            ppc_hash64_store_hpte1(env, pte_offset, pte.pte1);

        }

    }



    



    if (target_page_bits != TARGET_PAGE_BITS) {

        ctx->raddr |= (eaddr & ((1 << target_page_bits) - 1))

                      & TARGET_PAGE_MASK;

    }

    return ret;

}

static int FUNC_0(CPUPPCState *VAR_0, struct mmu_ctx_hash64 *VAR_1,

                      ppc_slb_t *VAR_2, target_ulong VAR_3, int VAR_4)

{

    hwaddr pteg_off, pte_offset;

    ppc_hash_pte64_t pte;

    uint64_t vsid, pageaddr, ptem;

    hwaddr hash;

    int VAR_5, VAR_6;

    int VAR_7;



    VAR_7 = -1; 



    if (VAR_2->vsid & SLB_VSID_B) {

        vsid = (VAR_2->vsid & SLB_VSID_VSID) >> SLB_VSID_SHIFT_1T;

        VAR_5 = 40;

    } else {

        vsid = (VAR_2->vsid & SLB_VSID_VSID) >> SLB_VSID_SHIFT;

        VAR_5 = 28;

    }



    VAR_6 = (VAR_2->vsid & SLB_VSID_L)

        ? TARGET_PAGE_BITS_16M : TARGET_PAGE_BITS;

    VAR_1->key = !!(msr_pr ? (VAR_2->vsid & SLB_VSID_KP)

                  : (VAR_2->vsid & SLB_VSID_KS));



    pageaddr = VAR_3 & ((1ULL << VAR_5)

                            - (1ULL << VAR_6));

    if (VAR_2->vsid & SLB_VSID_B) {

        hash = vsid ^ (vsid << 25) ^ (pageaddr >> VAR_6);

    } else {

        hash = vsid ^ (pageaddr >> VAR_6);

    }

    

    ptem = (VAR_2->vsid & SLB_VSID_PTEM) |

        ((pageaddr >> 16) & ((1ULL << VAR_5) - 0x80));



    VAR_7 = -1;



    

    LOG_MMU("htab_base " TARGET_FMT_plx " htab_mask " TARGET_FMT_plx

            " hash " TARGET_FMT_plx "\n",

            VAR_0->htab_base, VAR_0->htab_mask, hash);





    

    LOG_MMU("0 htab=" TARGET_FMT_plx "/" TARGET_FMT_plx

            " vsid=" TARGET_FMT_lx " ptem=" TARGET_FMT_lx

            " hash=" TARGET_FMT_plx "\n",

            VAR_0->htab_base, VAR_0->htab_mask, vsid, ptem,  hash);

    pteg_off = (hash * HASH_PTEG_SIZE_64) & VAR_0->htab_mask;

    pte_offset = ppc_hash64_pteg_search(VAR_0, pteg_off, 0, ptem, &pte);

    if (pte_offset == -1) {

        

        LOG_MMU("1 htab=" TARGET_FMT_plx "/" TARGET_FMT_plx

                " vsid=" TARGET_FMT_lx " api=" TARGET_FMT_lx

                " hash=" TARGET_FMT_plx "\n", VAR_0->htab_base,

                VAR_0->htab_mask, vsid, ptem, ~hash);



        pteg_off = (~hash * HASH_PTEG_SIZE_64) & VAR_0->htab_mask;

        pte_offset = ppc_hash64_pteg_search(VAR_0, pteg_off, 1, ptem, &pte);

    }



    if (pte_offset != -1) {

        VAR_7 = pte64_check(VAR_1, pte.pte0, pte.pte1, VAR_4);

        LOG_MMU("found PTE at addr %08" HWADDR_PRIx " prot=%01x VAR_7=%d\n",

                VAR_1->raddr, VAR_1->prot, VAR_7);

        

        if (ppc_hash64_pte_update_flags(VAR_1, &pte.pte1, VAR_7, VAR_4) == 1) {

            ppc_hash64_store_hpte1(VAR_0, pte_offset, pte.pte1);

        }

    }



    



    if (VAR_6 != TARGET_PAGE_BITS) {

        VAR_1->raddr |= (VAR_3 & ((1 << VAR_6) - 1))

                      & TARGET_PAGE_MASK;

    }

    return VAR_7;

}

static int FUNC_0(CPUPPCState *VAR_0, struct mmu_ctx_hash64 *VAR_1,
ppc_slb_t *VAR_2, target_ulong VAR_3, int VAR_4)
{ hwaddr pteg_off, pte_offset; ppc_hash_pte64_t pte; uint64_t vsid, pageaddr, ptem; hwaddr hash; int VAR_5, VAR_6; int VAR_7; VAR_7 = -1; if (VAR_2->vsid & SLB_VSID_B) { vsid = (VAR_2->vsid & SLB_VSID_VSID) >> SLB_VSID_SHIFT_1T; VAR_5 = 40; } else { vsid = (VAR_2->vsid & SLB_VSID_VSID) >> SLB_VSID_SHIFT; VAR_5 = 28; } VAR_6 = (VAR_2->vsid & SLB_VSID_L)
? TARGET_PAGE_BITS_16M : TARGET_PAGE_BITS; VAR_1->key = !!(msr_pr ? (VAR_2->vsid & SLB_VSID_KP)
: (VAR_2->vsid & SLB_VSID_KS)); pageaddr = VAR_3 & ((1ULL << VAR_5)
- (1ULL << VAR_6)); if (VAR_2->vsid & SLB_VSID_B) { hash = vsid ^ (vsid << 25) ^ (pageaddr >> VAR_6); } else { hash = vsid ^ (pageaddr >> VAR_6); } ptem = (VAR_2->vsid & SLB_VSID_PTEM) |
((pageaddr >> 16) & ((1ULL << VAR_5) - 0x80)); VAR_7 = -1; LOG_MMU("htab_base " TARGET_FMT_plx " htab_mask " TARGET_FMT_plx
" hash " TARGET_FMT_plx "\n",
VAR_0->htab_base, VAR_0->htab_mask, hash); LOG_MMU("0 htab=" TARGET_FMT_plx "/" TARGET_FMT_plx
" vsid=" TARGET_FMT_lx " ptem=" TARGET_FMT_lx
" hash=" TARGET_FMT_plx "\n",
VAR_0->htab_base, VAR_0->htab_mask, vsid, ptem,  hash); pteg_off = (hash * HASH_PTEG_SIZE_64) & VAR_0->htab_mask; pte_offset = ppc_hash64_pteg_search(VAR_0, pteg_off, 0, ptem, &pte); if (pte_offset == -1) { LOG_MMU("1 htab=" TARGET_FMT_plx "/" TARGET_FMT_plx
" vsid=" TARGET_FMT_lx " api=" TARGET_FMT_lx
" hash=" TARGET_FMT_plx "\n", VAR_0->htab_base,
VAR_0->htab_mask, vsid, ptem, ~hash); pteg_off = (~hash * HASH_PTEG_SIZE_64) & VAR_0->htab_mask; pte_offset = ppc_hash64_pteg_search(VAR_0, pteg_off, 1, ptem, &pte); } if (pte_offset != -1) { VAR_7 = pte64_check(VAR_1, pte.pte0, pte.pte1, VAR_4); LOG_MMU("found PTE at addr %08" HWADDR_PRIx " prot=%01x VAR_7=%d\n",
VAR_1->raddr, VAR_1->prot, VAR_7); if (ppc_hash64_pte_update_flags(VAR_1, &pte.pte1, VAR_7, VAR_4) == 1) { ppc_hash64_store_hpte1(VAR_0, pte_offset, pte.pte1); } } if (VAR_6 != TARGET_PAGE_BITS) { VAR_1->raddr |= (VAR_3 & ((1 << VAR_6) - 1))
& TARGET_PAGE_MASK; } return VAR_7; }