iwmmxt signal frame handling
Arnd Bergmann
arnd at arndb.de
Thu Oct 14 10:09:10 EDT 2010
Peter Maydell noticed during code review that the signal frame might
be written incorrectly for kernels with CONFIG_IWMMXT set running
processes without TIF_USING_IWMMXT, where the magic/size values
for the iwmmxt section of the frame are left uninitialized.
Instead of skipping this part of the frame, we should instead
write a valid header with zero data.
This patch is compile-tested only since the problem was only
found in review and neither Peter nor myself have access to
IWMMXT capable hardware to test this on.
Signed-off-by: Arnd Bergmann <arnd at arndb.de>
Reported-by: Peter Maydell <peter.maydell at linaro.org>
--- a/arch/arm/kernel/signal.c
+++ b/arch/arm/kernel/signal.c
@@ -154,7 +154,10 @@ static int preserve_iwmmxt_context(struct iwmmxt_sigframe *frame)
kframe = (struct iwmmxt_sigframe *)((unsigned long)(kbuf + 8) & ~7);
kframe->magic = IWMMXT_MAGIC;
kframe->size = IWMMXT_STORAGE_SIZE;
- iwmmxt_task_copy(current_thread_info(), &kframe->storage);
+ if (test_thread_flag(TIF_USING_IWMMXT))
+ iwmmxt_task_copy(current_thread_info(), &kframe->storage);
+ else
+ memset(&kframe->storage, 0, sizeof(kframe->storage));
return __copy_to_user(frame, kframe, sizeof(*frame));
}
@@ -429,7 +432,7 @@ setup_sigframe(struct sigframe __user *sf, struct pt_regs *regs, sigset_t *set)
err |= preserve_crunch_context(&aux->crunch);
#endif
#ifdef CONFIG_IWMMXT
- if (err == 0 && test_thread_flag(TIF_USING_IWMMXT))
+ if (err == 0)
err |= preserve_iwmmxt_context(&aux->iwmmxt);
#endif
#ifdef CONFIG_VFP
More information about the linux-arm-kernel
mailing list