diff options
Diffstat (limited to 'arch/sh/kernel/signal_32.c')
-rw-r--r-- | arch/sh/kernel/signal_32.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/arch/sh/kernel/signal_32.c b/arch/sh/kernel/signal_32.c index b5afbec1db59..6010750c90b4 100644 --- a/arch/sh/kernel/signal_32.c +++ b/arch/sh/kernel/signal_32.c | |||
@@ -41,6 +41,16 @@ struct fdpic_func_descriptor { | |||
41 | }; | 41 | }; |
42 | 42 | ||
43 | /* | 43 | /* |
44 | * The following define adds a 64 byte gap between the signal | ||
45 | * stack frame and previous contents of the stack. This allows | ||
46 | * frame unwinding in a function epilogue but only if a frame | ||
47 | * pointer is used in the function. This is necessary because | ||
48 | * current gcc compilers (<4.3) do not generate unwind info on | ||
49 | * SH for function epilogues. | ||
50 | */ | ||
51 | #define UNWINDGUARD 64 | ||
52 | |||
53 | /* | ||
44 | * Atomically swap in the new signal mask, and wait for a signal. | 54 | * Atomically swap in the new signal mask, and wait for a signal. |
45 | */ | 55 | */ |
46 | asmlinkage int | 56 | asmlinkage int |
@@ -327,7 +337,7 @@ get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size) | |||
327 | sp = current->sas_ss_sp + current->sas_ss_size; | 337 | sp = current->sas_ss_sp + current->sas_ss_size; |
328 | } | 338 | } |
329 | 339 | ||
330 | return (void __user *)((sp - frame_size) & -8ul); | 340 | return (void __user *)((sp - (frame_size+UNWINDGUARD)) & -8ul); |
331 | } | 341 | } |
332 | 342 | ||
333 | /* These symbols are defined with the addresses in the vsyscall page. | 343 | /* These symbols are defined with the addresses in the vsyscall page. |