diff options
author | Nicolas Pitre <nico@cam.org> | 2007-12-14 15:56:01 -0500 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2008-01-26 10:25:17 -0500 |
commit | d30a0c8bf99f0e6a7d8c57bd4524039585ffbced (patch) | |
tree | 8177015c7fe37b05df24165195a4027508ac4d7f | |
parent | 25ce1dd71b8326f2542cf030f68e0e64c3d94dc1 (diff) |
ARM kprobes: don't let a single-stepped stmdb corrupt the exception stack
If kprobes installs a breakpoint on a "stmdb sp!, {...}" instruction,
and then single-step it by simulation from the exception context, it will
corrupt the saved regs on the stack from the previous context.
To avoid this, let's add an optional parameter to the svc_entry macro
allowing for a hole to be created on the stack before saving the
interrupted context, and use it in the undef_svc handler when kprobes
is enabled.
Signed-off-by: Nicolas Pitre <nico@marvell.com>
-rw-r--r-- | arch/arm/kernel/entry-armv.S | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index 29dec080a604..12ecc817be3f 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S | |||
@@ -112,8 +112,8 @@ common_invalid: | |||
112 | #define SPFIX(code...) | 112 | #define SPFIX(code...) |
113 | #endif | 113 | #endif |
114 | 114 | ||
115 | .macro svc_entry | 115 | .macro svc_entry, stack_hole=0 |
116 | sub sp, sp, #S_FRAME_SIZE | 116 | sub sp, sp, #(S_FRAME_SIZE + \stack_hole) |
117 | SPFIX( tst sp, #4 ) | 117 | SPFIX( tst sp, #4 ) |
118 | SPFIX( bicne sp, sp, #4 ) | 118 | SPFIX( bicne sp, sp, #4 ) |
119 | stmib sp, {r1 - r12} | 119 | stmib sp, {r1 - r12} |
@@ -121,7 +121,7 @@ common_invalid: | |||
121 | ldmia r0, {r1 - r3} | 121 | ldmia r0, {r1 - r3} |
122 | add r5, sp, #S_SP @ here for interlock avoidance | 122 | add r5, sp, #S_SP @ here for interlock avoidance |
123 | mov r4, #-1 @ "" "" "" "" | 123 | mov r4, #-1 @ "" "" "" "" |
124 | add r0, sp, #S_FRAME_SIZE @ "" "" "" "" | 124 | add r0, sp, #(S_FRAME_SIZE + \stack_hole) |
125 | SPFIX( addne r0, r0, #4 ) | 125 | SPFIX( addne r0, r0, #4 ) |
126 | str r1, [sp] @ save the "real" r0 copied | 126 | str r1, [sp] @ save the "real" r0 copied |
127 | @ from the exception stack | 127 | @ from the exception stack |
@@ -242,7 +242,14 @@ svc_preempt: | |||
242 | 242 | ||
243 | .align 5 | 243 | .align 5 |
244 | __und_svc: | 244 | __und_svc: |
245 | #ifdef CONFIG_KPROBES | ||
246 | @ If a kprobe is about to simulate a "stmdb sp..." instruction, | ||
247 | @ it obviously needs free stack space which then will belong to | ||
248 | @ the saved context. | ||
249 | svc_entry 64 | ||
250 | #else | ||
245 | svc_entry | 251 | svc_entry |
252 | #endif | ||
246 | 253 | ||
247 | @ | 254 | @ |
248 | @ call emulation code, which returns using r9 if it has emulated | 255 | @ call emulation code, which returns using r9 if it has emulated |