[PATCH v2 2/2] microblaze: reserve the ABI argument-home area in the signal frame
From: Ramin Moussavi
Date: Fri Jun 05 2026 - 04:22:14 EST
The MicroBlaze procedure call standard reserves [r1+0] for the return
address and lets a callee store its incoming register arguments r5..r10
into the caller-provided home slots at [r1+4]..[r1+24]. When the kernel
enters a signal handler it sets r1 to point at struct rt_sigframe, whose
leading members are the siginfo and ucontext prepared for the handler.
A handler that homes its arguments - which an unoptimised (-O0) build
always does - therefore overwrites the start of siginfo/ucontext,
corrupting the signal state that the handler and sys_rt_sigreturn()
depend on.
Reserve the home area by making a seven-word gap the first member of
struct rt_sigframe, so the handler's argument stores land in scratch
space instead of clobbering siginfo.
Tested on qemu-system-microblazeel (petalogix-s3adsp1800) with the
uClibc-ng NPTL test suite: tst-timer4, tst-timer5, tst-mqueue5 and
tst-signal6 pass; before this change they failed because the handler
clobbered the signal frame.
Signed-off-by: Ramin Moussavi <ramin.moussavi@xxxxxxxxx>
---
arch/microblaze/kernel/signal.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/arch/microblaze/kernel/signal.c b/arch/microblaze/kernel/signal.c
index c78a0ff48..9cca06d60 100644
--- a/arch/microblaze/kernel/signal.c
+++ b/arch/microblaze/kernel/signal.c
@@ -49,6 +49,14 @@ struct sigframe {
};
struct rt_sigframe {
+ /*
+ * Home area for the handler's register arguments: the MicroBlaze
+ * ABI reserves [r1+0] for the return address and lets the callee
+ * store r5..r10 at [r1+4]..[r1+24], and r1 points at this frame
+ * when the handler is entered. Without the gap those stores
+ * corrupt info/uc.
+ */
+ unsigned long abi_gap[7];
struct siginfo info;
struct ucontext uc;
unsigned long tramp[2]; /* signal trampoline */
--
2.53.0