| From 1b36a0035de387d2593b92c1ddf3af515e5834c7 Mon Sep 17 00:00:00 2001 |
| From: David S. Miller <davem@davemloft.net> |
| Date: Mon, 12 Apr 2010 22:16:22 -0700 |
| Subject: sparc64: Use kstack_valid() in die_if_kernel(). |
| |
| |
| From: David S. Miller <davem@davemloft.net> |
| |
| [ Upstream commit cb256aa60409efd803806cfb0528a4b3f8397dba ] |
| |
| This gets rid of a local function (is_kernel_stack()) which tries to |
| do the same thing, yet poorly in that it doesn't handle IRQ stacks |
| properly. |
| |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| --- |
| arch/sparc/kernel/traps_64.c | 26 +++----------------------- |
| 1 file changed, 3 insertions(+), 23 deletions(-) |
| |
| --- a/arch/sparc/kernel/traps_64.c |
| +++ b/arch/sparc/kernel/traps_64.c |
| @@ -2202,27 +2202,6 @@ void dump_stack(void) |
| |
| EXPORT_SYMBOL(dump_stack); |
| |
| -static inline int is_kernel_stack(struct task_struct *task, |
| - struct reg_window *rw) |
| -{ |
| - unsigned long rw_addr = (unsigned long) rw; |
| - unsigned long thread_base, thread_end; |
| - |
| - if (rw_addr < PAGE_OFFSET) { |
| - if (task != &init_task) |
| - return 0; |
| - } |
| - |
| - thread_base = (unsigned long) task_stack_page(task); |
| - thread_end = thread_base + sizeof(union thread_union); |
| - if (rw_addr >= thread_base && |
| - rw_addr < thread_end && |
| - !(rw_addr & 0x7UL)) |
| - return 1; |
| - |
| - return 0; |
| -} |
| - |
| static inline struct reg_window *kernel_stack_up(struct reg_window *rw) |
| { |
| unsigned long fp = rw->ins[6]; |
| @@ -2251,6 +2230,7 @@ void die_if_kernel(char *str, struct pt_ |
| show_regs(regs); |
| add_taint(TAINT_DIE); |
| if (regs->tstate & TSTATE_PRIV) { |
| + struct thread_info *tp = current_thread_info(); |
| struct reg_window *rw = (struct reg_window *) |
| (regs->u_regs[UREG_FP] + STACK_BIAS); |
| |
| @@ -2258,8 +2238,8 @@ void die_if_kernel(char *str, struct pt_ |
| * find some badly aligned kernel stack. |
| */ |
| while (rw && |
| - count++ < 30&& |
| - is_kernel_stack(current, rw)) { |
| + count++ < 30 && |
| + kstack_valid(tp, (unsigned long) rw)) { |
| printk("Caller[%016lx]: %pS\n", rw->ins[7], |
| (void *) rw->ins[7]); |
| |