diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2005-06-15 09:00:12 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2005-10-29 14:31:23 -0400 |
commit | 02416dcf5a94af34bcd28b4baf25bbbf399d8136 (patch) | |
tree | 1906c4266d4e28ef0b13d0579a145603dcbcff1b /arch/mips/kernel/signal-common.h | |
parent | aac8aa7717a23a9bf8740dbfb59755b1d62f04bf (diff) |
Redo RM9000 workaround which along with other DSP ASE changes was
causing some headache for debuggers knowing about signal frames.
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
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 3208ff528cd2..0f66ae5838b9 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 | } |