diff options
-rw-r--r-- | arch/x86/oprofile/backtrace.c | 2 | ||||
-rw-r--r-- | include/asm-x86/ptrace.h | 8 |
2 files changed, 8 insertions, 2 deletions
diff --git a/arch/x86/oprofile/backtrace.c b/arch/x86/oprofile/backtrace.c index 0ca4815a2938..e2095cba409f 100644 --- a/arch/x86/oprofile/backtrace.c +++ b/arch/x86/oprofile/backtrace.c | |||
@@ -77,7 +77,7 @@ void | |||
77 | x86_backtrace(struct pt_regs * const regs, unsigned int depth) | 77 | x86_backtrace(struct pt_regs * const regs, unsigned int depth) |
78 | { | 78 | { |
79 | struct frame_head *head = (struct frame_head *)frame_pointer(regs); | 79 | struct frame_head *head = (struct frame_head *)frame_pointer(regs); |
80 | unsigned long stack = stack_pointer(regs); | 80 | unsigned long stack = kernel_trap_sp(regs); |
81 | 81 | ||
82 | if (!user_mode_vm(regs)) { | 82 | if (!user_mode_vm(regs)) { |
83 | if (depth) | 83 | if (depth) |
diff --git a/include/asm-x86/ptrace.h b/include/asm-x86/ptrace.h index 79d5b8fcd7b1..d9e04b46a440 100644 --- a/include/asm-x86/ptrace.h +++ b/include/asm-x86/ptrace.h | |||
@@ -182,7 +182,13 @@ static inline int v8086_mode(struct pt_regs *regs) | |||
182 | #endif | 182 | #endif |
183 | } | 183 | } |
184 | 184 | ||
185 | static inline unsigned long stack_pointer(struct pt_regs *regs) | 185 | /* |
186 | * X86_32 CPUs don't save ss and esp if the CPU is already in kernel mode | ||
187 | * when it traps. So regs will be the current sp. | ||
188 | * | ||
189 | * This is valid only for kernel mode traps. | ||
190 | */ | ||
191 | static inline unsigned long kernel_trap_sp(struct pt_regs *regs) | ||
186 | { | 192 | { |
187 | #ifdef CONFIG_X86_32 | 193 | #ifdef CONFIG_X86_32 |
188 | return (unsigned long)regs; | 194 | return (unsigned long)regs; |