[PATCH 2/2] soc: apple: rtkit-crashlog: Add support for AArch32 state 'CrgA' section

From: Nick Chan

Date: Fri Sep 18 2026 - 12:59:42 EST


Add support for CrgA section containing the AArch32 IOP CPU state, which
may appear when an AArch32 RTKit IOP crashes.

Signed-off-by: Nick Chan <towinchenmi@xxxxxxxxx>
---
drivers/soc/apple/rtkit-crashlog.c | 96 ++++++++++++++++++++++++++++++++++++++
1 file changed, 96 insertions(+)

diff --git a/drivers/soc/apple/rtkit-crashlog.c b/drivers/soc/apple/rtkit-crashlog.c
index 6a8273e81e61..195b7869ce58 100644
--- a/drivers/soc/apple/rtkit-crashlog.c
+++ b/drivers/soc/apple/rtkit-crashlog.c
@@ -13,6 +13,7 @@
#define APPLE_RTKIT_CRASHLOG_VERSION FOURCC('C', 'v', 'e', 'r')
#define APPLE_RTKIT_CRASHLOG_MBOX FOURCC('C', 'm', 'b', 'x')
#define APPLE_RTKIT_CRASHLOG_TIME FOURCC('C', 't', 'i', 'm')
+#define APPLE_RTKIT_CRASHLOG_AARCH32 FOURCC('C', 'r', 'g', 'A')
#define APPLE_RTKIT_CRASHLOG_AARCH64 FOURCC('C', 'r', 'g', '8')

/* For COMPILE_TEST on non-ARM64 architectures */
@@ -25,6 +26,21 @@
#define PSR_MODE_MASK 0x0000000f
#endif

+/*
+ * AArch32 mode definitions: APPLE_RTKIT depends on APPLE_MAILBOX, which
+ * depends on 64BIT, so there is no need to care about COMPILE_TEST on ARM.
+ */
+#define USR_MODE 0x00000010
+#define FIQ_MODE 0x00000011
+#define IRQ_MODE 0x00000012
+#define SVC_MODE 0x00000013
+#define MON_MODE 0x00000016
+#define ABT_MODE 0x00000017
+#define HYP_MODE 0x0000001a
+#define UND_MODE 0x0000001b
+#define SYSTEM_MODE 0x0000001f
+#define MODE_MASK_32 0x0000001f
+
struct apple_rtkit_crashlog_header {
u32 fourcc;
u32 version;
@@ -60,6 +76,20 @@ struct apple_rtkit_crashlog_aarch64 {
} __packed;
static_assert(sizeof(struct apple_rtkit_crashlog_aarch64) == 0x350);

+struct apple_rtkit_crashlog_aarch32 {
+ u32 unk_0;
+ u32 unk_4;
+ u32 regs[16];
+ u32 psr;
+ u32 unk_x1;
+ u8 stack[0x100];
+ u32 unk_x2;
+ u32 unk_x3;
+ u32 unk_x4;
+ u32 unk_x5;
+} __packed;
+static_assert(sizeof(struct apple_rtkit_crashlog_aarch32) == 0x160);
+
static void apple_rtkit_crashlog_dump_str(struct apple_rtkit *rtk, u8 *bfr,
size_t size)
{
@@ -123,6 +153,68 @@ static void apple_rtkit_crashlog_dump_mailbox(struct apple_rtkit *rtk, u8 *bfr,
}
}

+static void apple_rtkit_crashlog_dump_aarch32(struct apple_rtkit *rtk, u8 *bfr,
+ size_t size)
+{
+ struct apple_rtkit_crashlog_aarch32 *state;
+ const char *mode;
+ int i;
+
+ if (size < sizeof(*state)) {
+ dev_warn(rtk->dev, "RTKit: AArch32 section too small: 0x%zx", size);
+ return;
+ }
+
+ state = (struct apple_rtkit_crashlog_aarch32 *)bfr;
+
+ switch (state->psr & MODE_MASK_32) {
+ case USR_MODE:
+ mode = "User";
+ break;
+ case FIQ_MODE:
+ mode = "FIQ";
+ break;
+ case IRQ_MODE:
+ mode = "IRQ";
+ break;
+ case SVC_MODE:
+ mode = "Supervisor";
+ break;
+ case MON_MODE:
+ mode = "Monitor";
+ break;
+ case ABT_MODE:
+ mode = "Abort";
+ break;
+ case HYP_MODE:
+ mode = "Hypervisor";
+ break;
+ case UND_MODE:
+ mode = "Undefined";
+ break;
+ case SYSTEM_MODE:
+ mode = "System";
+ break;
+ default:
+ mode = "Unknown";
+ break;
+ }
+
+ dev_warn(rtk->dev, "RTKit: Exception dump:");
+ dev_warn(rtk->dev, " == Exception taken from %s mode ==", mode);
+ dev_warn(rtk->dev, " PSR = 0x%x", state->psr);
+ dev_warn(rtk->dev, "\n");
+
+ for (i = 0; i < 16; i += 4)
+ dev_warn(rtk->dev,
+ " r%02d-r%02d = %08x %08x %08x %08x\n",
+ i, i + 3,
+ state->regs[i], state->regs[i + 1],
+ state->regs[i + 2], state->regs[i + 3]);
+
+ dev_warn(rtk->dev, "\n");
+}
+
static void apple_rtkit_crashlog_dump_aarch64(struct apple_rtkit *rtk, u8 *bfr,
size_t size)
{
@@ -230,6 +322,10 @@ void apple_rtkit_crashlog_dump(struct apple_rtkit *rtk, u8 *bfr, size_t size)
apple_rtkit_crashlog_dump_time(rtk, bfr + offset + 16,
section_size);
break;
+ case APPLE_RTKIT_CRASHLOG_AARCH32:
+ apple_rtkit_crashlog_dump_aarch32(rtk, bfr + offset + 16,
+ section_size);
+ break;
case APPLE_RTKIT_CRASHLOG_AARCH64:
apple_rtkit_crashlog_dump_aarch64(rtk, bfr + offset + 16,
section_size);

--
2.55.0