static inline int _find_pte(CPUState *env, mmu_ctx_t *ctx, int is_64b, int h,

                            int rw, int type, int target_page_bits)

{

    target_phys_addr_t pteg_off;

    target_ulong pte0, pte1;

    int i, good = -1;

    int ret, r;



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

    pteg_off = get_pteg_offset(env, ctx->hash[h],

                               is_64b ? HASH_PTE_SIZE_64 : HASH_PTE_SIZE_32);

    for (i = 0; i < 8; i++) {

#if defined(TARGET_PPC64)

        if (is_64b) {

            if (env->external_htab) {

                pte0 = ldq_p(env->external_htab + pteg_off + (i * 16));

                pte1 = ldq_p(env->external_htab + pteg_off + (i * 16) + 8);

            } else {

                pte0 = ldq_phys(env->htab_base + pteg_off + (i * 16));

                pte1 = ldq_phys(env->htab_base + pteg_off + (i * 16) + 8);

            }



            /* 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)

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

                        & TARGET_PAGE_MASK;



            r = pte64_check(ctx, pte0, pte1, h, rw, type);

            LOG_MMU("Load pte from " TARGET_FMT_lx " => " TARGET_FMT_lx " "

                    TARGET_FMT_lx " %d %d %d " TARGET_FMT_lx "\n",

                    pteg_base + (i * 16), pte0, pte1, (int)(pte0 & 1), h,

                    (int)((pte0 >> 1) & 1), ctx->ptem);

        } else

#endif

        {

            if (env->external_htab) {

                pte0 = ldl_p(env->external_htab + pteg_off + (i * 8));

                pte1 = ldl_p(env->external_htab + pteg_off + (i * 8) + 4);

            } else {

                pte0 = ldl_phys(env->htab_base + pteg_off + (i * 8));

                pte1 = ldl_phys(env->htab_base + pteg_off + (i * 8) + 4);

            }

            r = pte32_check(ctx, pte0, pte1, h, rw, type);

            LOG_MMU("Load pte from " TARGET_FMT_lx " => " TARGET_FMT_lx " "

                    TARGET_FMT_lx " %d %d %d " TARGET_FMT_lx "\n",

                    pteg_base + (i * 8), pte0, pte1, (int)(pte0 >> 31), h,

                    (int)((pte0 >> 6) & 1), ctx->ptem);

        }

        switch (r) {

        case -3:

            /* PTE inconsistency */

            return -1;

        case -2:

            /* Access violation */

            ret = -2;

            good = i;

            break;

        case -1:

        default:

            /* No PTE match */

            break;

        case 0:

            /* access granted */

            /* XXX: we should go on looping to check all PTEs consistency

             *      but if we can speed-up the whole thing as the

             *      result would be undefined if PTEs are not consistent.

             */

            ret = 0;

            good = i;

            goto done;

        }

    }

    if (good != -1) {

    done:

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

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

        /* Update page flags */

        pte1 = ctx->raddr;

        if (pte_update_flags(ctx, &pte1, ret, rw) == 1) {

#if defined(TARGET_PPC64)

            if (is_64b) {

                if (env->external_htab) {

                    stq_p(env->external_htab + pteg_off + (good * 16) + 8,

                          pte1);

                } else {

                    stq_phys_notdirty(env->htab_base + pteg_off +

                                      (good * 16) + 8, pte1);

                }

            } else

#endif

            {

                if (env->external_htab) {

                    stl_p(env->external_htab + pteg_off + (good * 8) + 4,

                          pte1);

                } else {

                    stl_phys_notdirty(env->htab_base + pteg_off +

                                      (good * 8) + 4, pte1);

                }

            }

        }

    }



    return ret;

}

static inline int _find_pte(CPUState *env, mmu_ctx_t *ctx, int is_64b, int h,

                            int rw, int type, int target_page_bits)

{

    target_phys_addr_t pteg_off;

    target_ulong pte0, pte1;

    int i, good = -1;

    int ret, r;



    ret = -1; 

    pteg_off = get_pteg_offset(env, ctx->hash[h],

                               is_64b ? HASH_PTE_SIZE_64 : HASH_PTE_SIZE_32);

    for (i = 0; i < 8; i++) {

#if defined(TARGET_PPC64)

        if (is_64b) {

            if (env->external_htab) {

                pte0 = ldq_p(env->external_htab + pteg_off + (i * 16));

                pte1 = ldq_p(env->external_htab + pteg_off + (i * 16) + 8);

            } else {

                pte0 = ldq_phys(env->htab_base + pteg_off + (i * 16));

                pte1 = ldq_phys(env->htab_base + pteg_off + (i * 16) + 8);

            }



            



            if (target_page_bits != TARGET_PAGE_BITS)

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

                        & TARGET_PAGE_MASK;



            r = pte64_check(ctx, pte0, pte1, h, rw, type);

            LOG_MMU("Load pte from " TARGET_FMT_lx " => " TARGET_FMT_lx " "

                    TARGET_FMT_lx " %d %d %d " TARGET_FMT_lx "\n",

                    pteg_base + (i * 16), pte0, pte1, (int)(pte0 & 1), h,

                    (int)((pte0 >> 1) & 1), ctx->ptem);

        } else

#endif

        {

            if (env->external_htab) {

                pte0 = ldl_p(env->external_htab + pteg_off + (i * 8));

                pte1 = ldl_p(env->external_htab + pteg_off + (i * 8) + 4);

            } else {

                pte0 = ldl_phys(env->htab_base + pteg_off + (i * 8));

                pte1 = ldl_phys(env->htab_base + pteg_off + (i * 8) + 4);

            }

            r = pte32_check(ctx, pte0, pte1, h, rw, type);

            LOG_MMU("Load pte from " TARGET_FMT_lx " => " TARGET_FMT_lx " "

                    TARGET_FMT_lx " %d %d %d " TARGET_FMT_lx "\n",

                    pteg_base + (i * 8), pte0, pte1, (int)(pte0 >> 31), h,

                    (int)((pte0 >> 6) & 1), ctx->ptem);

        }

        switch (r) {

        case -3:

            

            return -1;

        case -2:

            

            ret = -2;

            good = i;

            break;

        case -1:

        default:

            

            break;

        case 0:

            

            







            ret = 0;

            good = i;

            goto done;

        }

    }

    if (good != -1) {

    done:

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

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

        

        pte1 = ctx->raddr;

        if (pte_update_flags(ctx, &pte1, ret, rw) == 1) {

#if defined(TARGET_PPC64)

            if (is_64b) {

                if (env->external_htab) {

                    stq_p(env->external_htab + pteg_off + (good * 16) + 8,

                          pte1);

                } else {

                    stq_phys_notdirty(env->htab_base + pteg_off +

                                      (good * 16) + 8, pte1);

                }

            } else

#endif

            {

                if (env->external_htab) {

                    stl_p(env->external_htab + pteg_off + (good * 8) + 4,

                          pte1);

                } else {

                    stl_phys_notdirty(env->htab_base + pteg_off +

                                      (good * 8) + 4, pte1);

                }

            }

        }

    }



    return ret;

}

                    pteg_base + (i * 16), pte0, pte1, (int)(pte0 & 1), h,                     pteg_base + (i * 8), pte0, pte1, (int)(pte0 >> 31), h,
static inline int FUNC_0(CPUState *VAR_0, mmu_ctx_t *VAR_1, int VAR_2, int VAR_3,

                            int VAR_4, int VAR_5, int VAR_6)

{

    target_phys_addr_t pteg_off;

    target_ulong pte0, pte1;

    int VAR_7, VAR_8 = -1;

    int VAR_9, VAR_10;



    VAR_9 = -1; 

    pteg_off = get_pteg_offset(VAR_0, VAR_1->hash[VAR_3],

                               VAR_2 ? HASH_PTE_SIZE_64 : HASH_PTE_SIZE_32);

    for (VAR_7 = 0; VAR_7 < 8; VAR_7++) {

#if defined(TARGET_PPC64)

        if (VAR_2) {

            if (VAR_0->external_htab) {

                pte0 = ldq_p(VAR_0->external_htab + pteg_off + (VAR_7 * 16));

                pte1 = ldq_p(VAR_0->external_htab + pteg_off + (VAR_7 * 16) + 8);

            } else {

                pte0 = ldq_phys(VAR_0->htab_base + pteg_off + (VAR_7 * 16));

                pte1 = ldq_phys(VAR_0->htab_base + pteg_off + (VAR_7 * 16) + 8);

            }



            



            if (VAR_6 != TARGET_PAGE_BITS)

                pte1 |= (VAR_1->eaddr & (( 1 << VAR_6 ) - 1))

                        & TARGET_PAGE_MASK;



            VAR_10 = pte64_check(VAR_1, pte0, pte1, VAR_3, VAR_4, VAR_5);

            LOG_MMU("Load pte from " TARGET_FMT_lx " => " TARGET_FMT_lx " "

                    TARGET_FMT_lx " %d %d %d " TARGET_FMT_lx "\n",

                    pteg_base + (VAR_7 * 16), pte0, pte1, (int)(pte0 & 1), VAR_3,

                    (int)((pte0 >> 1) & 1), VAR_1->ptem);

        } else

#endif

        {

            if (VAR_0->external_htab) {

                pte0 = ldl_p(VAR_0->external_htab + pteg_off + (VAR_7 * 8));

                pte1 = ldl_p(VAR_0->external_htab + pteg_off + (VAR_7 * 8) + 4);

            } else {

                pte0 = ldl_phys(VAR_0->htab_base + pteg_off + (VAR_7 * 8));

                pte1 = ldl_phys(VAR_0->htab_base + pteg_off + (VAR_7 * 8) + 4);

            }

            VAR_10 = pte32_check(VAR_1, pte0, pte1, VAR_3, VAR_4, VAR_5);

            LOG_MMU("Load pte from " TARGET_FMT_lx " => " TARGET_FMT_lx " "

                    TARGET_FMT_lx " %d %d %d " TARGET_FMT_lx "\n",

                    pteg_base + (VAR_7 * 8), pte0, pte1, (int)(pte0 >> 31), VAR_3,

                    (int)((pte0 >> 6) & 1), VAR_1->ptem);

        }

        switch (VAR_10) {

        case -3:

            

            return -1;

        case -2:

            

            VAR_9 = -2;

            VAR_8 = VAR_7;

            break;

        case -1:

        default:

            

            break;

        case 0:

            

            







            VAR_9 = 0;

            VAR_8 = VAR_7;

            goto done;

        }

    }

    if (VAR_8 != -1) {

    done:

        LOG_MMU("found PTE at addr " TARGET_FMT_lx " prot=%01x VAR_9=%d\n",

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

        

        pte1 = VAR_1->raddr;

        if (pte_update_flags(VAR_1, &pte1, VAR_9, VAR_4) == 1) {

#if defined(TARGET_PPC64)

            if (VAR_2) {

                if (VAR_0->external_htab) {

                    stq_p(VAR_0->external_htab + pteg_off + (VAR_8 * 16) + 8,

                          pte1);

                } else {

                    stq_phys_notdirty(VAR_0->htab_base + pteg_off +

                                      (VAR_8 * 16) + 8, pte1);

                }

            } else

#endif

            {

                if (VAR_0->external_htab) {

                    stl_p(VAR_0->external_htab + pteg_off + (VAR_8 * 8) + 4,

                          pte1);

                } else {

                    stl_phys_notdirty(VAR_0->htab_base + pteg_off +

                                      (VAR_8 * 8) + 4, pte1);

                }

            }

        }

    }



    return VAR_9;

}

static inline int FUNC_0(CPUState *VAR_0, mmu_ctx_t *VAR_1, int VAR_2, int VAR_3,
int VAR_4, int VAR_5, int VAR_6)
{ target_phys_addr_t pteg_off; target_ulong pte0, pte1; int VAR_7, VAR_8 = -1; int VAR_9, VAR_10; VAR_9 = -1; pteg_off = get_pteg_offset(VAR_0, VAR_1->hash[VAR_3],
VAR_2 ? HASH_PTE_SIZE_64 : HASH_PTE_SIZE_32); for (VAR_7 = 0; VAR_7 < 8; VAR_7++) { #if defined(TARGET_PPC64)
if (VAR_2) { if (VAR_0->external_htab) { pte0 = ldq_p(VAR_0->external_htab + pteg_off + (VAR_7 * 16)); pte1 = ldq_p(VAR_0->external_htab + pteg_off + (VAR_7 * 16) + 8); } else { pte0 = ldq_phys(VAR_0->htab_base + pteg_off + (VAR_7 * 16)); pte1 = ldq_phys(VAR_0->htab_base + pteg_off + (VAR_7 * 16) + 8); } if (VAR_6 != TARGET_PAGE_BITS)
pte1 |= (VAR_1->eaddr & (( 1 << VAR_6 ) - 1))
& TARGET_PAGE_MASK; VAR_10 = pte64_check(VAR_1, pte0, pte1, VAR_3, VAR_4, VAR_5); LOG_MMU("Load pte from " TARGET_FMT_lx " => " TARGET_FMT_lx " "
TARGET_FMT_lx " %d %d %d " TARGET_FMT_lx "\n",
pteg_base + (VAR_7 * 16), pte0, pte1, (int)(pte0 & 1), VAR_3,
(int)((pte0 >> 1) & 1), VAR_1->ptem); } else #endif
{ if (VAR_0->external_htab) { pte0 = ldl_p(VAR_0->external_htab + pteg_off + (VAR_7 * 8)); pte1 = ldl_p(VAR_0->external_htab + pteg_off + (VAR_7 * 8) + 4); } else { pte0 = ldl_phys(VAR_0->htab_base + pteg_off + (VAR_7 * 8)); pte1 = ldl_phys(VAR_0->htab_base + pteg_off + (VAR_7 * 8) + 4); } VAR_10 = pte32_check(VAR_1, pte0, pte1, VAR_3, VAR_4, VAR_5); LOG_MMU("Load pte from " TARGET_FMT_lx " => " TARGET_FMT_lx " "
TARGET_FMT_lx " %d %d %d " TARGET_FMT_lx "\n",
pteg_base + (VAR_7 * 8), pte0, pte1, (int)(pte0 >> 31), VAR_3,
(int)((pte0 >> 6) & 1), VAR_1->ptem); } switch (VAR_10) { case -3:
return -1; case -2:
VAR_9 = -2; VAR_8 = VAR_7; break; case -1:
default:
break; case 0:
VAR_9 = 0; VAR_8 = VAR_7; goto done; } } if (VAR_8 != -1) { done:
LOG_MMU("found PTE at addr " TARGET_FMT_lx " prot=%01x VAR_9=%d\n",
VAR_1->raddr, VAR_1->prot, VAR_9); pte1 = VAR_1->raddr; if (pte_update_flags(VAR_1, &pte1, VAR_9, VAR_4) == 1) { #if defined(TARGET_PPC64)
if (VAR_2) { if (VAR_0->external_htab) { stq_p(VAR_0->external_htab + pteg_off + (VAR_8 * 16) + 8,
pte1); } else { stq_phys_notdirty(VAR_0->htab_base + pteg_off +
(VAR_8 * 16) + 8, pte1); } } else #endif
{ if (VAR_0->external_htab) { stl_p(VAR_0->external_htab + pteg_off + (VAR_8 * 8) + 4,
pte1); } else { stl_phys_notdirty(VAR_0->htab_base + pteg_off +
(VAR_8 * 8) + 4, pte1); } } } } return VAR_9; }