diff options
Diffstat (limited to 'arch/mips/kernel/signal-common.h')
| -rw-r--r-- | arch/mips/kernel/signal-common.h | 34 |
1 files changed, 28 insertions, 6 deletions
diff --git a/arch/mips/kernel/signal-common.h b/arch/mips/kernel/signal-common.h index 3208ff528cd..0f66ae5838b 100644 --- a/arch/mips/kernel/signal-common.h +++ b/arch/mips/kernel/signal-common.h | |||
| @@ -160,7 +160,7 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext *sc) | |||
| 160 | static inline void * | 160 | static inline void * |
| 161 | get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size) | 161 | get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size) |
| 162 | { | 162 | { |
| 163 | unsigned long sp, almask; | 163 | unsigned long sp; |
| 164 | 164 | ||
| 165 | /* Default to using normal stack */ | 165 | /* Default to using normal stack */ |
| 166 | sp = regs->regs[29]; | 166 | sp = regs->regs[29]; |
| @@ -176,10 +176,32 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size) | |||
| 176 | if ((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags (sp) == 0)) | 176 | if ((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags (sp) == 0)) |
| 177 | sp = current->sas_ss_sp + current->sas_ss_size; | 177 | sp = current->sas_ss_sp + current->sas_ss_size; |
| 178 | 178 | ||
| 179 | if (PLAT_TRAMPOLINE_STUFF_LINE) | 179 | return (void *)((sp - frame_size) & (ICACHE_REFILLS_WORKAROUND_WAR ? 32 : ALMASK)); |
| 180 | almask = ~(PLAT_TRAMPOLINE_STUFF_LINE - 1); | 180 | } |
| 181 | else | 181 | |
| 182 | almask = ALMASK; | 182 | static inline int install_sigtramp(unsigned int __user *tramp, |
| 183 | unsigned int syscall) | ||
| 184 | { | ||
| 185 | int err; | ||
| 183 | 186 | ||
| 184 | return (void *)((sp - frame_size) & almask); | 187 | /* |
| 188 | * Set up the return code ... | ||
| 189 | * | ||
| 190 | * li v0, __NR__foo_sigreturn | ||
| 191 | * syscall | ||
| 192 | */ | ||
| 193 | |||
| 194 | err = __put_user(0x24020000 + syscall, tramp + 0); | ||
| 195 | err |= __put_user(0x0000000c , tramp + 1); | ||
| 196 | if (ICACHE_REFILLS_WORKAROUND_WAR) { | ||
| 197 | err |= __put_user(0, tramp + 2); | ||
| 198 | err |= __put_user(0, tramp + 3); | ||
| 199 | err |= __put_user(0, tramp + 4); | ||
| 200 | err |= __put_user(0, tramp + 5); | ||
| 201 | err |= __put_user(0, tramp + 6); | ||
| 202 | err |= __put_user(0, tramp + 7); | ||
| 203 | } | ||
| 204 | flush_cache_sigtramp((unsigned long) tramp); | ||
| 205 | |||
| 206 | return err; | ||
| 185 | } | 207 | } |
