armv7m_nvic.c (9ac5df20f51fabcba0d902025df4bd7ea987c158) armv7m_nvic.c (7fbc6a403a0aab834e764fa61d81ed8586cfe352)
1/*
2 * ARM Nested Vectored Interrupt Controller
3 *
4 * Copyright (c) 2006-2007 CodeSourcery.
5 * Written by Paul Brook
6 *
7 * This code is licensed under the GPL.
8 *

--- 1248 unchanged lines hidden (view full) ---

1257 case 0xd80: /* CSSIDR */
1258 {
1259 int idx = cpu->env.v7m.csselr[attrs.secure] & R_V7M_CSSELR_INDEX_MASK;
1260 return cpu->ccsidr[idx];
1261 }
1262 case 0xd84: /* CSSELR */
1263 return cpu->env.v7m.csselr[attrs.secure];
1264 case 0xd88: /* CPACR */
1/*
2 * ARM Nested Vectored Interrupt Controller
3 *
4 * Copyright (c) 2006-2007 CodeSourcery.
5 * Written by Paul Brook
6 *
7 * This code is licensed under the GPL.
8 *

--- 1248 unchanged lines hidden (view full) ---

1257 case 0xd80: /* CSSIDR */
1258 {
1259 int idx = cpu->env.v7m.csselr[attrs.secure] & R_V7M_CSSELR_INDEX_MASK;
1260 return cpu->ccsidr[idx];
1261 }
1262 case 0xd84: /* CSSELR */
1263 return cpu->env.v7m.csselr[attrs.secure];
1264 case 0xd88: /* CPACR */
1265 if (!arm_feature(&cpu->env, ARM_FEATURE_VFP)) {
1265 if (!cpu_isar_feature(aa32_vfp_simd, cpu)) {
1266 return 0;
1267 }
1268 return cpu->env.v7m.cpacr[attrs.secure];
1269 case 0xd8c: /* NSACR */
1266 return 0;
1267 }
1268 return cpu->env.v7m.cpacr[attrs.secure];
1269 case 0xd8c: /* NSACR */
1270 if (!attrs.secure || !arm_feature(&cpu->env, ARM_FEATURE_VFP)) {
1270 if (!attrs.secure || !cpu_isar_feature(aa32_vfp_simd, cpu)) {
1271 return 0;
1272 }
1273 return cpu->env.v7m.nsacr;
1274 /* TODO: Implement debug registers. */
1275 case 0xd90: /* MPU_TYPE */
1276 /* Unified MPU; if the MPU is not present this value is zero */
1277 return cpu->pmsav7_dregion << 8;
1278 break;

--- 133 unchanged lines hidden (view full) ---

1412 if (!arm_feature(&cpu->env, ARM_FEATURE_V8)) {
1413 goto bad_offset;
1414 }
1415 if (!attrs.secure) {
1416 return 0;
1417 }
1418 return cpu->env.v7m.sfar;
1419 case 0xf34: /* FPCCR */
1271 return 0;
1272 }
1273 return cpu->env.v7m.nsacr;
1274 /* TODO: Implement debug registers. */
1275 case 0xd90: /* MPU_TYPE */
1276 /* Unified MPU; if the MPU is not present this value is zero */
1277 return cpu->pmsav7_dregion << 8;
1278 break;

--- 133 unchanged lines hidden (view full) ---

1412 if (!arm_feature(&cpu->env, ARM_FEATURE_V8)) {
1413 goto bad_offset;
1414 }
1415 if (!attrs.secure) {
1416 return 0;
1417 }
1418 return cpu->env.v7m.sfar;
1419 case 0xf34: /* FPCCR */
1420 if (!arm_feature(&cpu->env, ARM_FEATURE_VFP)) {
1420 if (!cpu_isar_feature(aa32_vfp_simd, cpu)) {
1421 return 0;
1422 }
1423 if (attrs.secure) {
1424 return cpu->env.v7m.fpccr[M_REG_S];
1425 } else {
1426 /*
1427 * NS can read LSPEN, CLRONRET and MONRDY. It can read
1428 * BFRDY and HFRDY if AIRCR.BFHFNMINS != 0;

--- 10 unchanged lines hidden (view full) ---

1439 }
1440
1441 value &= mask;
1442
1443 value |= cpu->env.v7m.fpccr[M_REG_NS];
1444 return value;
1445 }
1446 case 0xf38: /* FPCAR */
1421 return 0;
1422 }
1423 if (attrs.secure) {
1424 return cpu->env.v7m.fpccr[M_REG_S];
1425 } else {
1426 /*
1427 * NS can read LSPEN, CLRONRET and MONRDY. It can read
1428 * BFRDY and HFRDY if AIRCR.BFHFNMINS != 0;

--- 10 unchanged lines hidden (view full) ---

1439 }
1440
1441 value &= mask;
1442
1443 value |= cpu->env.v7m.fpccr[M_REG_NS];
1444 return value;
1445 }
1446 case 0xf38: /* FPCAR */
1447 if (!arm_feature(&cpu->env, ARM_FEATURE_VFP)) {
1447 if (!cpu_isar_feature(aa32_vfp_simd, cpu)) {
1448 return 0;
1449 }
1450 return cpu->env.v7m.fpcar[attrs.secure];
1451 case 0xf3c: /* FPDSCR */
1448 return 0;
1449 }
1450 return cpu->env.v7m.fpcar[attrs.secure];
1451 case 0xf3c: /* FPDSCR */
1452 if (!arm_feature(&cpu->env, ARM_FEATURE_VFP)) {
1452 if (!cpu_isar_feature(aa32_vfp_simd, cpu)) {
1453 return 0;
1454 }
1455 return cpu->env.v7m.fpdscr[attrs.secure];
1456 case 0xf40: /* MVFR0 */
1457 return cpu->isar.mvfr0;
1458 case 0xf44: /* MVFR1 */
1459 return cpu->isar.mvfr1;
1460 case 0xf48: /* MVFR2 */

--- 245 unchanged lines hidden (view full) ---

1706 "NVIC: Aux fault status registers unimplemented\n");
1707 break;
1708 case 0xd84: /* CSSELR */
1709 if (!arm_v7m_csselr_razwi(cpu)) {
1710 cpu->env.v7m.csselr[attrs.secure] = value & R_V7M_CSSELR_INDEX_MASK;
1711 }
1712 break;
1713 case 0xd88: /* CPACR */
1453 return 0;
1454 }
1455 return cpu->env.v7m.fpdscr[attrs.secure];
1456 case 0xf40: /* MVFR0 */
1457 return cpu->isar.mvfr0;
1458 case 0xf44: /* MVFR1 */
1459 return cpu->isar.mvfr1;
1460 case 0xf48: /* MVFR2 */

--- 245 unchanged lines hidden (view full) ---

1706 "NVIC: Aux fault status registers unimplemented\n");
1707 break;
1708 case 0xd84: /* CSSELR */
1709 if (!arm_v7m_csselr_razwi(cpu)) {
1710 cpu->env.v7m.csselr[attrs.secure] = value & R_V7M_CSSELR_INDEX_MASK;
1711 }
1712 break;
1713 case 0xd88: /* CPACR */
1714 if (arm_feature(&cpu->env, ARM_FEATURE_VFP)) {
1714 if (cpu_isar_feature(aa32_vfp_simd, cpu)) {
1715 /* We implement only the Floating Point extension's CP10/CP11 */
1716 cpu->env.v7m.cpacr[attrs.secure] = value & (0xf << 20);
1717 }
1718 break;
1719 case 0xd8c: /* NSACR */
1715 /* We implement only the Floating Point extension's CP10/CP11 */
1716 cpu->env.v7m.cpacr[attrs.secure] = value & (0xf << 20);
1717 }
1718 break;
1719 case 0xd8c: /* NSACR */
1720 if (attrs.secure && arm_feature(&cpu->env, ARM_FEATURE_VFP)) {
1720 if (attrs.secure && cpu_isar_feature(aa32_vfp_simd, cpu)) {
1721 /* We implement only the Floating Point extension's CP10/CP11 */
1722 cpu->env.v7m.nsacr = value & (3 << 10);
1723 }
1724 break;
1725 case 0xd90: /* MPU_TYPE */
1726 return; /* RO */
1727 case 0xd94: /* MPU_CTRL */
1728 if ((value &

--- 217 unchanged lines hidden (view full) ---

1946 }
1947
1948 if (excnum < s->num_irq) {
1949 armv7m_nvic_set_pending(s, excnum, false);
1950 }
1951 break;
1952 }
1953 case 0xf34: /* FPCCR */
1721 /* We implement only the Floating Point extension's CP10/CP11 */
1722 cpu->env.v7m.nsacr = value & (3 << 10);
1723 }
1724 break;
1725 case 0xd90: /* MPU_TYPE */
1726 return; /* RO */
1727 case 0xd94: /* MPU_CTRL */
1728 if ((value &

--- 217 unchanged lines hidden (view full) ---

1946 }
1947
1948 if (excnum < s->num_irq) {
1949 armv7m_nvic_set_pending(s, excnum, false);
1950 }
1951 break;
1952 }
1953 case 0xf34: /* FPCCR */
1954 if (arm_feature(&cpu->env, ARM_FEATURE_VFP)) {
1954 if (cpu_isar_feature(aa32_vfp_simd, cpu)) {
1955 /* Not all bits here are banked. */
1956 uint32_t fpccr_s;
1957
1958 if (!arm_feature(&cpu->env, ARM_FEATURE_V8)) {
1959 /* Don't allow setting of bits not present in v7M */
1960 value &= (R_V7M_FPCCR_LSPACT_MASK |
1961 R_V7M_FPCCR_USER_MASK |
1962 R_V7M_FPCCR_THREAD_MASK |

--- 37 unchanged lines hidden (view full) ---

2000 cpu->env.v7m.fpccr[M_REG_NS] = value;
2001 } else {
2002 fpccr_s = value;
2003 }
2004 cpu->env.v7m.fpccr[M_REG_S] = fpccr_s;
2005 }
2006 break;
2007 case 0xf38: /* FPCAR */
1955 /* Not all bits here are banked. */
1956 uint32_t fpccr_s;
1957
1958 if (!arm_feature(&cpu->env, ARM_FEATURE_V8)) {
1959 /* Don't allow setting of bits not present in v7M */
1960 value &= (R_V7M_FPCCR_LSPACT_MASK |
1961 R_V7M_FPCCR_USER_MASK |
1962 R_V7M_FPCCR_THREAD_MASK |

--- 37 unchanged lines hidden (view full) ---

2000 cpu->env.v7m.fpccr[M_REG_NS] = value;
2001 } else {
2002 fpccr_s = value;
2003 }
2004 cpu->env.v7m.fpccr[M_REG_S] = fpccr_s;
2005 }
2006 break;
2007 case 0xf38: /* FPCAR */
2008 if (arm_feature(&cpu->env, ARM_FEATURE_VFP)) {
2008 if (cpu_isar_feature(aa32_vfp_simd, cpu)) {
2009 value &= ~7;
2010 cpu->env.v7m.fpcar[attrs.secure] = value;
2011 }
2012 break;
2013 case 0xf3c: /* FPDSCR */
2009 value &= ~7;
2010 cpu->env.v7m.fpcar[attrs.secure] = value;
2011 }
2012 break;
2013 case 0xf3c: /* FPDSCR */
2014 if (arm_feature(&cpu->env, ARM_FEATURE_VFP)) {
2014 if (cpu_isar_feature(aa32_vfp_simd, cpu)) {
2015 value &= 0x07c00000;
2016 cpu->env.v7m.fpdscr[attrs.secure] = value;
2017 }
2018 break;
2019 case 0xf50: /* ICIALLU */
2020 case 0xf58: /* ICIMVAU */
2021 case 0xf5c: /* DCIMVAC */
2022 case 0xf60: /* DCISW */

--- 749 unchanged lines hidden ---
2015 value &= 0x07c00000;
2016 cpu->env.v7m.fpdscr[attrs.secure] = value;
2017 }
2018 break;
2019 case 0xf50: /* ICIALLU */
2020 case 0xf58: /* ICIMVAU */
2021 case 0xf5c: /* DCIMVAC */
2022 case 0xf60: /* DCISW */

--- 749 unchanged lines hidden ---