Revision f8bf8606

b/target-arm/cpu.h
126 126
        uint32_t c6_region[8]; /* MPU base/size registers.  */
127 127
        uint32_t c6_insn; /* Fault address registers.  */
128 128
        uint32_t c6_data;
129
        uint32_t c7_par;  /* Translation result. */
129 130
        uint32_t c9_insn; /* Cache lockdown registers.  */
130 131
        uint32_t c9_data;
131 132
        uint32_t c13_fcse; /* FCSE PID.  */
......
428 429
#define cpu_signal_handler cpu_arm_signal_handler
429 430
#define cpu_list arm_cpu_list
430 431

  
431
#define CPU_SAVE_VERSION 2
432
#define CPU_SAVE_VERSION 3
432 433

  
433 434
/* MMU modes definitions */
434 435
#define MMU_MODE0_SUFFIX _kernel
b/target-arm/helper.c
1456 1456
    case 7: /* Cache control.  */
1457 1457
        env->cp15.c15_i_max = 0x000;
1458 1458
        env->cp15.c15_i_min = 0xff0;
1459
        /* No cache, so nothing to do.  */
1460
        /* ??? MPCore has VA to PA translation functions.  */
1459
        if (op1 != 0) {
1460
            goto bad_reg;
1461
        }
1462
        /* No cache, so nothing to do except VA->PA translations. */
1463
        if (arm_feature(env, ARM_FEATURE_V6K)) {
1464
            switch (crm) {
1465
            case 4:
1466
                if (arm_feature(env, ARM_FEATURE_V7)) {
1467
                    env->cp15.c7_par = val & 0xfffff6ff;
1468
                } else {
1469
                    env->cp15.c7_par = val & 0xfffff1ff;
1470
                }
1471
                break;
1472
            case 8: {
1473
                uint32_t phys_addr;
1474
                target_ulong page_size;
1475
                int prot;
1476
                int ret, is_user = op2 & 2;
1477
                int access_type = op2 & 1;
1478

  
1479
                if (op2 & 4) {
1480
                    /* Other states are only available with TrustZone */
1481
                    goto bad_reg;
1482
                }
1483
                ret = get_phys_addr(env, val, access_type, is_user,
1484
                                    &phys_addr, &prot, &page_size);
1485
                if (ret == 0) {
1486
                    /* We do not set any attribute bits in the PAR */
1487
                    if (page_size == (1 << 24)
1488
                        && arm_feature(env, ARM_FEATURE_V7)) {
1489
                        env->cp15.c7_par = (phys_addr & 0xff000000) | 1 << 1;
1490
                    } else {
1491
                        env->cp15.c7_par = phys_addr & 0xfffff000;
1492
                    }
1493
                } else {
1494
                    env->cp15.c7_par = ((ret & (10 << 1)) >> 5) |
1495
                                       ((ret & (12 << 1)) >> 6) |
1496
                                       ((ret & 0xf) << 1) | 1;
1497
                }
1498
                break;
1499
            }
1500
            }
1501
        }
1461 1502
        break;
1462 1503
    case 8: /* MMU TLB control.  */
1463 1504
        switch (op2) {
......
1789 1830
	    }
1790 1831
        }
1791 1832
    case 7: /* Cache control.  */
1833
        if (crm == 4 && op1 == 0 && op2 == 0) {
1834
            return env->cp15.c7_par;
1835
        }
1792 1836
        /* FIXME: Should only clear Z flag if destination is r15.  */
1793 1837
        env->ZF = 0;
1794 1838
        return 0;
b/target-arm/machine.c
41 41
    }
42 42
    qemu_put_be32(f, env->cp15.c6_insn);
43 43
    qemu_put_be32(f, env->cp15.c6_data);
44
    qemu_put_be32(f, env->cp15.c7_par);
44 45
    qemu_put_be32(f, env->cp15.c9_insn);
45 46
    qemu_put_be32(f, env->cp15.c9_data);
46 47
    qemu_put_be32(f, env->cp15.c13_fcse);
......
148 149
    }
149 150
    env->cp15.c6_insn = qemu_get_be32(f);
150 151
    env->cp15.c6_data = qemu_get_be32(f);
152
    env->cp15.c7_par = qemu_get_be32(f);
151 153
    env->cp15.c9_insn = qemu_get_be32(f);
152 154
    env->cp15.c9_data = qemu_get_be32(f);
153 155
    env->cp15.c13_fcse = qemu_get_be32(f);

Also available in: Unified diff