Browse Source

arch: arm: Adding fault description for the cortex A7

Add support for processing the Fault Status Registers and recoverable
data abort for the cortex A7.

Based on Cortex-A7 MPCore Technical Reference Manual (ARM DDI 0406).
(see https://developer.arm.com/documentation/ddi0406)

Signed-off-by: Julien Racki <julien.racki@st.com>
pull/88161/head
Julien Racki 4 months ago committed by Benjamin Cabé
parent
commit
87719828ac
  1. 53
      arch/arm/core/cortex_a_r/fault.c
  2. 14
      include/zephyr/arch/arm/arch.h
  3. 27
      modules/cmsis/cmsis_core_a_r_ext.h

53
arch/arm/core/cortex_a_r/fault.c

@ -100,6 +100,59 @@ static uint32_t dump_fault(uint32_t status, uint32_t addr) @@ -100,6 +100,59 @@ static uint32_t dump_fault(uint32_t status, uint32_t addr)
reason = K_ERR_ARM_UNSUPPORTED_EXCLUSIVE_ACCESS_FAULT;
LOG_ERR("Unsupported Exclusive Access Fault @ 0x%08x", addr);
break;
#elif defined(CONFIG_ARMV7_A)
case FSR_FS_PERMISSION_FAULT_2ND_LEVEL:
reason = K_ERR_ARM_PERMISSION_FAULT_2ND_LEVEL;
LOG_ERR("2nd Level Permission Fault @ 0x%08x", addr);
break;
case FSR_FS_ACCESS_FLAG_FAULT_1ST_LEVEL:
reason = K_ERR_ARM_ACCESS_FLAG_FAULT_1ST_LEVEL;
LOG_ERR("1st Level Access Flag Fault @ 0x%08x", addr);
break;
case FSR_FS_ACCESS_FLAG_FAULT_2ND_LEVEL:
reason = K_ERR_ARM_ACCESS_FLAG_FAULT_2ND_LEVEL;
LOG_ERR("2nd Level Access Flag Fault @ 0x%08x", addr);
break;
case FSR_FS_CACHE_MAINTENANCE_INSTRUCTION_FAULT:
reason = K_ERR_ARM_CACHE_MAINTENANCE_INSTRUCTION_FAULT;
LOG_ERR("Cache Maintenance Instruction Fault @ 0x%08x", addr);
break;
case FSR_FS_TRANSLATION_FAULT:
reason = K_ERR_ARM_TRANSLATION_FAULT;
LOG_ERR("1st Level Translation Fault @ 0x%08x", addr);
break;
case FSR_FS_TRANSLATION_FAULT_2ND_LEVEL:
reason = K_ERR_ARM_TRANSLATION_FAULT_2ND_LEVEL;
LOG_ERR("2nd Level Translation Fault @ 0x%08x", addr);
break;
case FSR_FS_DOMAIN_FAULT_1ST_LEVEL:
reason = K_ERR_ARM_DOMAIN_FAULT_1ST_LEVEL;
LOG_ERR("1st Level Domain Fault @ 0x%08x", addr);
break;
case FSR_FS_DOMAIN_FAULT_2ND_LEVEL:
reason = K_ERR_ARM_DOMAIN_FAULT_2ND_LEVEL;
LOG_ERR("2nd Level Domain Fault @ 0x%08x", addr);
break;
case FSR_FS_SYNC_EXTERNAL_ABORT_TRANSLATION_TABLE_1ST_LEVEL:
reason = K_ERR_ARM_SYNC_EXTERNAL_ABORT_TRANSLATION_TABLE_1ST_LEVEL;
LOG_ERR("1st Level Synchronous External Abort Translation Table @ 0x%08x", addr);
break;
case FSR_FS_SYNC_EXTERNAL_ABORT_TRANSLATION_TABLE_2ND_LEVEL:
reason = K_ERR_ARM_SYNC_EXTERNAL_ABORT_TRANSLATION_TABLE_2ND_LEVEL;
LOG_ERR("2nd Level Synchronous External Abort Translation Table @ 0x%08x", addr);
break;
case FSR_FS_TLB_CONFLICT_FAULT:
reason = K_ERR_ARM_TLB_CONFLICT_FAULT;
LOG_ERR("Table Conflict Fault @ 0x%08x", addr);
break;
case FSR_FS_SYNC_PARITY_ERROR_TRANSLATION_TABLE_1ST_LEVEL:
reason = K_ERR_ARM_SYNC_PARITY_ERROR_TRANSLATION_TABLE_1ST_LEVEL;
LOG_ERR("1st Level Synchronous Parity Error Translation Table @ 0x%08x", addr);
break;
case FSR_FS_SYNC_PARITY_ERROR_TRANSLATION_TABLE_2ND_LEVEL:
reason = K_ERR_ARM_SYNC_PARITY_ERROR_TRANSLATION_TABLE_2ND_LEVEL;
LOG_ERR("2nd Level Synchronous Parity Error Translation Table @ 0x%08x", addr);
break;
#else
case FSR_FS_BACKGROUND_FAULT:
reason = K_ERR_ARM_BACKGROUND_FAULT;

14
include/zephyr/arch/arm/arch.h

@ -99,13 +99,25 @@ enum k_fatal_error_reason_arch { @@ -99,13 +99,25 @@ enum k_fatal_error_reason_arch {
K_ERR_ARM_ALIGNMENT_FAULT,
K_ERR_ARM_BACKGROUND_FAULT,
K_ERR_ARM_PERMISSION_FAULT,
K_ERR_ARM_PERMISSION_FAULT_2ND_LEVEL,
K_ERR_ARM_SYNC_EXTERNAL_ABORT,
K_ERR_ARM_ASYNC_EXTERNAL_ABORT,
K_ERR_ARM_SYNC_PARITY_ERROR,
K_ERR_ARM_ASYNC_PARITY_ERROR,
K_ERR_ARM_DEBUG_EVENT,
K_ERR_ARM_TRANSLATION_FAULT,
K_ERR_ARM_UNSUPPORTED_EXCLUSIVE_ACCESS_FAULT
K_ERR_ARM_TRANSLATION_FAULT_2ND_LEVEL,
K_ERR_ARM_UNSUPPORTED_EXCLUSIVE_ACCESS_FAULT,
K_ERR_ARM_ACCESS_FLAG_FAULT_1ST_LEVEL,
K_ERR_ARM_ACCESS_FLAG_FAULT_2ND_LEVEL,
K_ERR_ARM_CACHE_MAINTENANCE_INSTRUCTION_FAULT,
K_ERR_ARM_DOMAIN_FAULT_1ST_LEVEL,
K_ERR_ARM_DOMAIN_FAULT_2ND_LEVEL,
K_ERR_ARM_SYNC_EXTERNAL_ABORT_TRANSLATION_TABLE_1ST_LEVEL,
K_ERR_ARM_SYNC_EXTERNAL_ABORT_TRANSLATION_TABLE_2ND_LEVEL,
K_ERR_ARM_TLB_CONFLICT_FAULT,
K_ERR_ARM_SYNC_PARITY_ERROR_TRANSLATION_TABLE_1ST_LEVEL,
K_ERR_ARM_SYNC_PARITY_ERROR_TRANSLATION_TABLE_2ND_LEVEL,
};
#endif /* _ASMLANGUAGE */

27
modules/cmsis/cmsis_core_a_r_ext.h

@ -29,6 +29,33 @@ @@ -29,6 +29,33 @@
#define FSR_FS_ALIGNMENT_FAULT (33)
#define FSR_FS_DEBUG_EVENT (34)
#define FSR_FS_UNSUPPORTED_EXCLUSIVE_ACCESS_FAULT (53)
#elif defined(CONFIG_ARMV7_A)
/**
* N.B.: these FSR encodings are only valid when the
* Short-descriptor translation table format is used
*/
#define FSR_FS_ALIGNMENT_FAULT (1)
#define FSR_FS_DEBUG_EVENT (2)
#define FSR_FS_ACCESS_FLAG_FAULT_1ST_LEVEL (3)
#define FSR_FS_CACHE_MAINTENANCE_INSTRUCTION_FAULT (4)
#define FSR_FS_TRANSLATION_FAULT (5)
#define FSR_FS_ACCESS_FLAG_FAULT_2ND_LEVEL (6)
#define FSR_FS_TRANSLATION_FAULT_2ND_LEVEL (7)
#define FSR_FS_SYNC_EXTERNAL_ABORT (8)
#define FSR_FS_DOMAIN_FAULT_1ST_LEVEL (9)
#define FSR_FS_DOMAIN_FAULT_2ND_LEVEL (11)
#define FSR_FS_SYNC_EXTERNAL_ABORT_TRANSLATION_TABLE_1ST_LEVEL (12)
#define FSR_FS_PERMISSION_FAULT (13)
#define FSR_FS_SYNC_EXTERNAL_ABORT_TRANSLATION_TABLE_2ND_LEVEL (14)
#define FSR_FS_PERMISSION_FAULT_2ND_LEVEL (15)
#define FSR_FS_TLB_CONFLICT_FAULT (16)
#define FSR_FS_ASYNC_EXTERNAL_ABORT (22)
#define FSR_FS_ASYNC_PARITY_ERROR (24)
#define FSR_FS_SYNC_PARITY_ERROR (25)
#define FSR_FS_SYNC_PARITY_ERROR_TRANSLATION_TABLE_1ST_LEVEL (28)
#define FSR_FS_SYNC_PARITY_ERROR_TRANSLATION_TABLE_2ND_LEVEL (30)
#else
#define FSR_FS_BACKGROUND_FAULT (0)
#define FSR_FS_ALIGNMENT_FAULT (1)

Loading…
Cancel
Save