[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v3 11/17] target/arm: Extend arm_fi_to_lfsc to level -1
From: |
Richard Henderson |
Subject: |
[PATCH v3 11/17] target/arm: Extend arm_fi_to_lfsc to level -1 |
Date: |
Wed, 23 Feb 2022 12:31:31 -1000 |
With FEAT_LPA2, rather than introducing translation level 4,
we introduce level -1, below the current level 0. Extend
arm_fi_to_lfsc to handle these faults.
Assert that this new translation level does not leak into
fault types for which it is not defined, which allows some
masking of fi->level to be removed.
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
target/arm/internals.h | 35 +++++++++++++++++++++++++++++------
1 file changed, 29 insertions(+), 6 deletions(-)
diff --git a/target/arm/internals.h b/target/arm/internals.h
index 3d3d41ba2b..00af41d792 100644
--- a/target/arm/internals.h
+++ b/target/arm/internals.h
@@ -462,28 +462,51 @@ static inline uint32_t arm_fi_to_lfsc(ARMMMUFaultInfo *fi)
case ARMFault_None:
return 0;
case ARMFault_AddressSize:
- fsc = fi->level & 3;
+ assert(fi->level >= -1 && fi->level <= 3);
+ if (fi->level < 0) {
+ fsc = 0b101001;
+ } else {
+ fsc = fi->level;
+ }
break;
case ARMFault_AccessFlag:
- fsc = (fi->level & 3) | (0x2 << 2);
+ assert(fi->level >= 0 && fi->level <= 3);
+ fsc = 0b001000 | fi->level;
break;
case ARMFault_Permission:
- fsc = (fi->level & 3) | (0x3 << 2);
+ assert(fi->level >= 0 && fi->level <= 3);
+ fsc = 0b001100 | fi->level;
break;
case ARMFault_Translation:
- fsc = (fi->level & 3) | (0x1 << 2);
+ assert(fi->level >= -1 && fi->level <= 3);
+ if (fi->level < 0) {
+ fsc = 0b101011;
+ } else {
+ fsc = 0b000100 | fi->level;
+ }
break;
case ARMFault_SyncExternal:
fsc = 0x10 | (fi->ea << 12);
break;
case ARMFault_SyncExternalOnWalk:
- fsc = (fi->level & 3) | (0x5 << 2) | (fi->ea << 12);
+ assert(fi->level >= -1 && fi->level <= 3);
+ if (fi->level < 0) {
+ fsc = 0b010011;
+ } else {
+ fsc = 0b010100 | fi->level;
+ }
+ fsc |= fi->ea << 12;
break;
case ARMFault_SyncParity:
fsc = 0x18;
break;
case ARMFault_SyncParityOnWalk:
- fsc = (fi->level & 3) | (0x7 << 2);
+ assert(fi->level >= -1 && fi->level <= 3);
+ if (fi->level < 0) {
+ fsc = 0b011011;
+ } else {
+ fsc = 0b011100 | fi->level;
+ }
break;
case ARMFault_AsyncParity:
fsc = 0x19;
--
2.25.1
- [PATCH v3 03/17] target/arm: Fault on invalid TCR_ELx.TxSZ, (continued)
- [PATCH v3 03/17] target/arm: Fault on invalid TCR_ELx.TxSZ, Richard Henderson, 2022/02/23
- [PATCH v3 04/17] target/arm: Move arm_pamax out of line, Richard Henderson, 2022/02/23
- [PATCH v3 05/17] target/arm: Pass outputsize down to check_s2_mmu_setup, Richard Henderson, 2022/02/23
- [PATCH v3 06/17] target/arm: Use MAKE_64BIT_MASK to compute indexmask, Richard Henderson, 2022/02/23
- [PATCH v3 07/17] target/arm: Honor TCR_ELx.{I}PS, Richard Henderson, 2022/02/23
- [PATCH v3 08/17] target/arm: Prepare DBGBVR and DBGWVR for FEAT_LVA, Richard Henderson, 2022/02/23
- [PATCH v3 12/17] target/arm: Introduce tlbi_aa64_get_range, Richard Henderson, 2022/02/23
- [PATCH v3 09/17] target/arm: Implement FEAT_LVA, Richard Henderson, 2022/02/23
- [PATCH v3 10/17] target/arm: Implement FEAT_LPA, Richard Henderson, 2022/02/23
- [PATCH v3 14/17] target/arm: Validate tlbi TG matches translation granule in use, Richard Henderson, 2022/02/23
- [PATCH v3 11/17] target/arm: Extend arm_fi_to_lfsc to level -1,
Richard Henderson <=
- [PATCH v3 13/17] target/arm: Fix TLBIRange.base for 16k and 64k pages, Richard Henderson, 2022/02/23
- [PATCH v3 15/17] target/arm: Advertise all page sizes for -cpu max, Richard Henderson, 2022/02/23
- [PATCH v3 16/17] tests/avocado: Limit test_virt_tcg_gicv[23] to cortex-a72, Richard Henderson, 2022/02/23
- [PATCH v3 17/17] target/arm: Implement FEAT_LPA2, Richard Henderson, 2022/02/23