static int get_phys_addr_v5(CPUState *env, uint32_t address, int access_type,

			    int is_user, uint32_t *phys_ptr, int *prot)

{

    int code;

    uint32_t table;

    uint32_t desc;

    int type;

    int ap;

    int domain;

    uint32_t phys_addr;



    /* Pagetable walk.  */

    /* Lookup l1 descriptor.  */

    table = get_level1_table_address(env, address);

    desc = ldl_phys(table);

    type = (desc & 3);

    domain = (env->cp15.c3 >> ((desc >> 4) & 0x1e)) & 3;

    if (type == 0) {

        /* Section translation fault.  */

        code = 5;

        goto do_fault;

    }

    if (domain == 0 || domain == 2) {

        if (type == 2)

            code = 9; /* Section domain fault.  */

        else

            code = 11; /* Page domain fault.  */

        goto do_fault;

    }

    if (type == 2) {

        /* 1Mb section.  */

        phys_addr = (desc & 0xfff00000) | (address & 0x000fffff);

        ap = (desc >> 10) & 3;

        code = 13;

    } else {

        /* Lookup l2 entry.  */

	if (type == 1) {

	    /* Coarse pagetable.  */

	    table = (desc & 0xfffffc00) | ((address >> 10) & 0x3fc);

	} else {

	    /* Fine pagetable.  */

	    table = (desc & 0xfffff000) | ((address >> 8) & 0xffc);

	}

        desc = ldl_phys(table);

        switch (desc & 3) {

        case 0: /* Page translation fault.  */

            code = 7;

            goto do_fault;

        case 1: /* 64k page.  */

            phys_addr = (desc & 0xffff0000) | (address & 0xffff);

            ap = (desc >> (4 + ((address >> 13) & 6))) & 3;

            break;

        case 2: /* 4k page.  */

            phys_addr = (desc & 0xfffff000) | (address & 0xfff);

            ap = (desc >> (4 + ((address >> 13) & 6))) & 3;

            break;

        case 3: /* 1k page.  */

	    if (type == 1) {

		if (arm_feature(env, ARM_FEATURE_XSCALE)) {

		    phys_addr = (desc & 0xfffff000) | (address & 0xfff);

		} else {

		    /* Page translation fault.  */

		    code = 7;

		    goto do_fault;

		}

	    } else {

		phys_addr = (desc & 0xfffffc00) | (address & 0x3ff);

	    }

            ap = (desc >> 4) & 3;

            break;

        default:

            /* Never happens, but compiler isn't smart enough to tell.  */

            abort();

        }

        code = 15;

    }

    *prot = check_ap(env, ap, domain, access_type, is_user);

    if (!*prot) {

        /* Access permission fault.  */

        goto do_fault;

    }

    *phys_ptr = phys_addr;

    return 0;

do_fault:

    return code | (domain << 4);

}

static int get_phys_addr_v5(CPUState *env, uint32_t address, int access_type,

			    int is_user, uint32_t *phys_ptr, int *prot)

{

    int code;

    uint32_t table;

    uint32_t desc;

    int type;

    int ap;

    int domain;

    uint32_t phys_addr;



    

    

    table = get_level1_table_address(env, address);

    desc = ldl_phys(table);

    type = (desc & 3);

    domain = (env->cp15.c3 >> ((desc >> 4) & 0x1e)) & 3;

    if (type == 0) {

        

        code = 5;

        goto do_fault;

    }

    if (domain == 0 || domain == 2) {

        if (type == 2)

            code = 9; 

        else

            code = 11; 

        goto do_fault;

    }

    if (type == 2) {

        

        phys_addr = (desc & 0xfff00000) | (address & 0x000fffff);

        ap = (desc >> 10) & 3;

        code = 13;

    } else {

        

	if (type == 1) {

	    

	    table = (desc & 0xfffffc00) | ((address >> 10) & 0x3fc);

	} else {

	    

	    table = (desc & 0xfffff000) | ((address >> 8) & 0xffc);

	}

        desc = ldl_phys(table);

        switch (desc & 3) {

        case 0: 

            code = 7;

            goto do_fault;

        case 1: 

            phys_addr = (desc & 0xffff0000) | (address & 0xffff);

            ap = (desc >> (4 + ((address >> 13) & 6))) & 3;

            break;

        case 2: 

            phys_addr = (desc & 0xfffff000) | (address & 0xfff);

            ap = (desc >> (4 + ((address >> 13) & 6))) & 3;

            break;

        case 3: 

	    if (type == 1) {

		if (arm_feature(env, ARM_FEATURE_XSCALE)) {

		    phys_addr = (desc & 0xfffff000) | (address & 0xfff);

		} else {

		    

		    code = 7;

		    goto do_fault;

		}

	    } else {

		phys_addr = (desc & 0xfffffc00) | (address & 0x3ff);

	    }

            ap = (desc >> 4) & 3;

            break;

        default:

            

            abort();

        }

        code = 15;

    }

    *prot = check_ap(env, ap, domain, access_type, is_user);

    if (!*prot) {

        

        goto do_fault;

    }

    *phys_ptr = phys_addr;

    return 0;

do_fault:

    return code | (domain << 4);

}

static int FUNC_0(CPUState *VAR_0, uint32_t VAR_1, int VAR_2,

			    int VAR_3, uint32_t *VAR_4, int *VAR_5)

{

    int VAR_6;

    uint32_t table;

    uint32_t desc;

    int VAR_7;

    int VAR_8;

    int VAR_9;

    uint32_t phys_addr;



    

    

    table = get_level1_table_address(VAR_0, VAR_1);

    desc = ldl_phys(table);

    VAR_7 = (desc & 3);

    VAR_9 = (VAR_0->cp15.c3 >> ((desc >> 4) & 0x1e)) & 3;

    if (VAR_7 == 0) {

        

        VAR_6 = 5;

        goto do_fault;

    }

    if (VAR_9 == 0 || VAR_9 == 2) {

        if (VAR_7 == 2)

            VAR_6 = 9; 

        else

            VAR_6 = 11; 

        goto do_fault;

    }

    if (VAR_7 == 2) {

        

        phys_addr = (desc & 0xfff00000) | (VAR_1 & 0x000fffff);

        VAR_8 = (desc >> 10) & 3;

        VAR_6 = 13;

    } else {

        

	if (VAR_7 == 1) {

	    

	    table = (desc & 0xfffffc00) | ((VAR_1 >> 10) & 0x3fc);

	} else {

	    

	    table = (desc & 0xfffff000) | ((VAR_1 >> 8) & 0xffc);

	}

        desc = ldl_phys(table);

        switch (desc & 3) {

        case 0: 

            VAR_6 = 7;

            goto do_fault;

        case 1: 

            phys_addr = (desc & 0xffff0000) | (VAR_1 & 0xffff);

            VAR_8 = (desc >> (4 + ((VAR_1 >> 13) & 6))) & 3;

            break;

        case 2: 

            phys_addr = (desc & 0xfffff000) | (VAR_1 & 0xfff);

            VAR_8 = (desc >> (4 + ((VAR_1 >> 13) & 6))) & 3;

            break;

        case 3: 

	    if (VAR_7 == 1) {

		if (arm_feature(VAR_0, ARM_FEATURE_XSCALE)) {

		    phys_addr = (desc & 0xfffff000) | (VAR_1 & 0xfff);

		} else {

		    

		    VAR_6 = 7;

		    goto do_fault;

		}

	    } else {

		phys_addr = (desc & 0xfffffc00) | (VAR_1 & 0x3ff);

	    }

            VAR_8 = (desc >> 4) & 3;

            break;

        default:

            

            abort();

        }

        VAR_6 = 15;

    }

    *VAR_5 = check_ap(VAR_0, VAR_8, VAR_9, VAR_2, VAR_3);

    if (!*VAR_5) {

        

        goto do_fault;

    }

    *VAR_4 = phys_addr;

    return 0;

do_fault:

    return VAR_6 | (VAR_9 << 4);

}

static int FUNC_0(CPUState *VAR_0, uint32_t VAR_1, int VAR_2,
int VAR_3, uint32_t *VAR_4, int *VAR_5)
{ int VAR_6; uint32_t table; uint32_t desc; int VAR_7; int VAR_8; int VAR_9; uint32_t phys_addr; table = get_level1_table_address(VAR_0, VAR_1); desc = ldl_phys(table); VAR_7 = (desc & 3); VAR_9 = (VAR_0->cp15.c3 >> ((desc >> 4) & 0x1e)) & 3; if (VAR_7 == 0) { VAR_6 = 5; goto do_fault; } if (VAR_9 == 0 || VAR_9 == 2) { if (VAR_7 == 2)
VAR_6 = 9; else
VAR_6 = 11; goto do_fault; } if (VAR_7 == 2) { phys_addr = (desc & 0xfff00000) | (VAR_1 & 0x000fffff); VAR_8 = (desc >> 10) & 3; VAR_6 = 13; } else { if (VAR_7 == 1) { table = (desc & 0xfffffc00) | ((VAR_1 >> 10) & 0x3fc); } else { table = (desc & 0xfffff000) | ((VAR_1 >> 8) & 0xffc); } desc = ldl_phys(table); switch (desc & 3) { case 0:
VAR_6 = 7; goto do_fault; case 1:
phys_addr = (desc & 0xffff0000) | (VAR_1 & 0xffff); VAR_8 = (desc >> (4 + ((VAR_1 >> 13) & 6))) & 3; break; case 2:
phys_addr = (desc & 0xfffff000) | (VAR_1 & 0xfff); VAR_8 = (desc >> (4 + ((VAR_1 >> 13) & 6))) & 3; break; case 3:
if (VAR_7 == 1) { if (arm_feature(VAR_0, ARM_FEATURE_XSCALE)) { phys_addr = (desc & 0xfffff000) | (VAR_1 & 0xfff); } else { VAR_6 = 7; goto do_fault; } } else { phys_addr = (desc & 0xfffffc00) | (VAR_1 & 0x3ff); } VAR_8 = (desc >> 4) & 3; break; default:
abort(); } VAR_6 = 15; } *VAR_5 = check_ap(VAR_0, VAR_8, VAR_9, VAR_2, VAR_3); if (!*VAR_5) { goto do_fault; } *VAR_4 = phys_addr; return 0; do_fault:
return VAR_6 | (VAR_9 << 4); }