static int pte64_check(struct mmu_ctx_hash64 *ctx, target_ulong pte0,

                       target_ulong pte1, int h, int rwx)

{

    target_ulong mmask;

    int access, ret, pp;



    ret = -1;

    /* Check validity and table match */

    if ((pte0 & HPTE64_V_VALID) && (h == !!(pte0 & HPTE64_V_SECONDARY))) {

        bool nx;



        /* Check vsid & api */

        mmask = PTE64_CHECK_MASK;

        pp = (pte1 & HPTE64_R_PP) | ((pte1 & HPTE64_R_PP0) >> 61);

        /* No execute if either noexec or guarded bits set */

        nx = (pte1 & HPTE64_R_N) || (pte1 & HPTE64_R_G);

        if (HPTE64_V_COMPARE(pte0, ctx->ptem)) {

            if (ctx->raddr != (hwaddr)-1ULL) {

                /* all matches should have equal RPN, WIMG & PP */

                if ((ctx->raddr & mmask) != (pte1 & mmask)) {

                    qemu_log("Bad RPN/WIMG/PP\n");

                    return -3;

                }

            }

            /* Compute access rights */

            access = ppc_hash64_pp_check(ctx->key, pp, nx);

            /* Keep the matching PTE informations */

            ctx->raddr = pte1;

            ctx->prot = access;

            ret = ppc_hash64_check_prot(ctx->prot, rwx);

            if (ret == 0) {

                /* Access granted */

                LOG_MMU("PTE access granted !\n");

            } else {

                /* Access right violation */

                LOG_MMU("PTE access rejected\n");

            }

        }

    }



    return ret;

}

static int pte64_check(struct mmu_ctx_hash64 *ctx, target_ulong pte0,

                       target_ulong pte1, int h, int rwx)

{

    target_ulong mmask;

    int access, ret, pp;



    ret = -1;

    

    if ((pte0 & HPTE64_V_VALID) && (h == !!(pte0 & HPTE64_V_SECONDARY))) {

        bool nx;



        

        mmask = PTE64_CHECK_MASK;

        pp = (pte1 & HPTE64_R_PP) | ((pte1 & HPTE64_R_PP0) >> 61);

        

        nx = (pte1 & HPTE64_R_N) || (pte1 & HPTE64_R_G);

        if (HPTE64_V_COMPARE(pte0, ctx->ptem)) {

            if (ctx->raddr != (hwaddr)-1ULL) {

                

                if ((ctx->raddr & mmask) != (pte1 & mmask)) {

                    qemu_log("Bad RPN/WIMG/PP\n");

                    return -3;

                }

            }

            

            access = ppc_hash64_pp_check(ctx->key, pp, nx);

            

            ctx->raddr = pte1;

            ctx->prot = access;

            ret = ppc_hash64_check_prot(ctx->prot, rwx);

            if (ret == 0) {

                

                LOG_MMU("PTE access granted !\n");

            } else {

                

                LOG_MMU("PTE access rejected\n");

            }

        }

    }



    return ret;

}

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

                       target_ulong VAR_2, int VAR_3, int VAR_4)

{

    target_ulong mmask;

    int VAR_5, VAR_6, VAR_7;



    VAR_6 = -1;

    

    if ((VAR_1 & HPTE64_V_VALID) && (VAR_3 == !!(VAR_1 & HPTE64_V_SECONDARY))) {

        bool nx;



        

        mmask = PTE64_CHECK_MASK;

        VAR_7 = (VAR_2 & HPTE64_R_PP) | ((VAR_2 & HPTE64_R_PP0) >> 61);

        

        nx = (VAR_2 & HPTE64_R_N) || (VAR_2 & HPTE64_R_G);

        if (HPTE64_V_COMPARE(VAR_1, VAR_0->ptem)) {

            if (VAR_0->raddr != (hwaddr)-1ULL) {

                

                if ((VAR_0->raddr & mmask) != (VAR_2 & mmask)) {

                    qemu_log("Bad RPN/WIMG/PP\n");

                    return -3;

                }

            }

            

            VAR_5 = ppc_hash64_pp_check(VAR_0->key, VAR_7, nx);

            

            VAR_0->raddr = VAR_2;

            VAR_0->prot = VAR_5;

            VAR_6 = ppc_hash64_check_prot(VAR_0->prot, VAR_4);

            if (VAR_6 == 0) {

                

                LOG_MMU("PTE VAR_5 granted !\n");

            } else {

                

                LOG_MMU("PTE VAR_5 rejected\n");

            }

        }

    }



    return VAR_6;

}

static int FUNC_0(struct mmu_ctx_hash64 *VAR_0, target_ulong VAR_1,
target_ulong VAR_2, int VAR_3, int VAR_4)
{ target_ulong mmask; int VAR_5, VAR_6, VAR_7; VAR_6 = -1; if ((VAR_1 & HPTE64_V_VALID) && (VAR_3 == !!(VAR_1 & HPTE64_V_SECONDARY))) { bool nx; mmask = PTE64_CHECK_MASK; VAR_7 = (VAR_2 & HPTE64_R_PP) | ((VAR_2 & HPTE64_R_PP0) >> 61); nx = (VAR_2 & HPTE64_R_N) || (VAR_2 & HPTE64_R_G); if (HPTE64_V_COMPARE(VAR_1, VAR_0->ptem)) { if (VAR_0->raddr != (hwaddr)-1ULL) { if ((VAR_0->raddr & mmask) != (VAR_2 & mmask)) { qemu_log("Bad RPN/WIMG/PP\n"); return -3; } } VAR_5 = ppc_hash64_pp_check(VAR_0->key, VAR_7, nx); VAR_0->raddr = VAR_2; VAR_0->prot = VAR_5; VAR_6 = ppc_hash64_check_prot(VAR_0->prot, VAR_4); if (VAR_6 == 0) { LOG_MMU("PTE VAR_5 granted !\n"); } else { LOG_MMU("PTE VAR_5 rejected\n"); } } } return VAR_6; }