Skip to content

Commit 4ec98e6

Browse files
asahilinaarndb
authored andcommitted
soc: apple: rtkit: Do not copy the reg state structure to the stack
The register state struct is 848 bytes, which ends up bloating the apple_rtkit_crashlog_dump_regs stack frame beyond 1024 on some 32-bit platforms, triggering compile warnings. This doesn't matter for 64BIT/ARM64, but there's also no good reason to copy the structure to the stack in this case. We can use __packed to avoid alignment issues, there are no double-read hazards, and this is a fatal error path so performance does not matter. Fixes: 22991d8 ("soc: apple: rtkit: Add register dump decoding to crashlog") Signed-off-by: Asahi Lina <[email protected]> Reviewed-by: Eric Curtin <[email protected]> Signed-off-by: Arnd Bergmann <[email protected]>
1 parent 6890717 commit 4ec98e6

File tree

1 file changed

+13
-13
lines changed

1 file changed

+13
-13
lines changed

drivers/soc/apple/rtkit-crashlog.c

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ struct apple_rtkit_crashlog_regs {
5757
u64 unk_X;
5858
u64 esr;
5959
u64 unk_Z;
60-
};
60+
} __packed;
6161
static_assert(sizeof(struct apple_rtkit_crashlog_regs) == 0x350);
6262

6363
static void apple_rtkit_crashlog_dump_str(struct apple_rtkit *rtk, u8 *bfr,
@@ -126,18 +126,18 @@ static void apple_rtkit_crashlog_dump_mailbox(struct apple_rtkit *rtk, u8 *bfr,
126126
static void apple_rtkit_crashlog_dump_regs(struct apple_rtkit *rtk, u8 *bfr,
127127
size_t size)
128128
{
129-
struct apple_rtkit_crashlog_regs regs;
129+
struct apple_rtkit_crashlog_regs *regs;
130130
const char *el;
131131
int i;
132132

133-
if (size < sizeof(regs)) {
133+
if (size < sizeof(*regs)) {
134134
dev_warn(rtk->dev, "RTKit: Regs section too small: 0x%zx", size);
135135
return;
136136
}
137137

138-
memcpy(&regs, bfr, sizeof(regs));
138+
regs = (struct apple_rtkit_crashlog_regs *)bfr;
139139

140-
switch (regs.psr & PSR_MODE_MASK) {
140+
switch (regs->psr & PSR_MODE_MASK) {
141141
case PSR_MODE_EL0t:
142142
el = "EL0t";
143143
break;
@@ -160,24 +160,24 @@ static void apple_rtkit_crashlog_dump_regs(struct apple_rtkit *rtk, u8 *bfr,
160160

161161
dev_warn(rtk->dev, "RTKit: Exception dump:");
162162
dev_warn(rtk->dev, " == Exception taken from %s ==", el);
163-
dev_warn(rtk->dev, " PSR = 0x%llx", regs.psr);
164-
dev_warn(rtk->dev, " PC = 0x%llx\n", regs.pc);
165-
dev_warn(rtk->dev, " ESR = 0x%llx\n", regs.esr);
166-
dev_warn(rtk->dev, " FAR = 0x%llx\n", regs.far);
167-
dev_warn(rtk->dev, " SP = 0x%llx\n", regs.sp);
163+
dev_warn(rtk->dev, " PSR = 0x%llx", regs->psr);
164+
dev_warn(rtk->dev, " PC = 0x%llx\n", regs->pc);
165+
dev_warn(rtk->dev, " ESR = 0x%llx\n", regs->esr);
166+
dev_warn(rtk->dev, " FAR = 0x%llx\n", regs->far);
167+
dev_warn(rtk->dev, " SP = 0x%llx\n", regs->sp);
168168
dev_warn(rtk->dev, "\n");
169169

170170
for (i = 0; i < 31; i += 4) {
171171
if (i < 28)
172172
dev_warn(rtk->dev,
173173
" x%02d-x%02d = %016llx %016llx %016llx %016llx\n",
174174
i, i + 3,
175-
regs.regs[i], regs.regs[i + 1],
176-
regs.regs[i + 2], regs.regs[i + 3]);
175+
regs->regs[i], regs->regs[i + 1],
176+
regs->regs[i + 2], regs->regs[i + 3]);
177177
else
178178
dev_warn(rtk->dev,
179179
" x%02d-x%02d = %016llx %016llx %016llx\n", i, i + 3,
180-
regs.regs[i], regs.regs[i + 1], regs.regs[i + 2]);
180+
regs->regs[i], regs->regs[i + 1], regs->regs[i + 2]);
181181
}
182182

183183
dev_warn(rtk->dev, "\n");

0 commit comments

Comments
 (0)