soc: apple: rtkit-crashlog: Add support for AArch32 state 'CrgA' section

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@gmail.com>
Link: https://patch.msgid.link/20260919-rtkit-armv7-crashlog-v1-2-f4a671ea453c@gmail.com
Signed-off-by: Sven Peter <sven@kernel.org>
This commit is contained in:
Nick Chan 2026-09-19 00:47:04 +08:00 committed by Sven Peter
parent 1a2ae08528
commit 4edbfa916d

View File

@ -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);