mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
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:
parent
1a2ae08528
commit
4edbfa916d
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user