From af66ff10d9e3c08828eebde70feae6fd9a1ec69e Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Wed, 21 May 2008 18:15:53 -0700 Subject: [PATCH] --- yaml --- r: 97171 b: refs/heads/master c: 14d2c68baa659cfd15dc782dd229ea304330c4f6 h: refs/heads/master i: 97169: 55f37f209394b06803f86744b24684c8c7a587f7 97167: 3c16b06ccf017a5e9fd337407bfc5e22573cc901 v: v3 --- [refs] | 2 +- trunk/arch/sparc64/kernel/stacktrace.c | 12 +++++++----- trunk/arch/sparc64/kernel/traps.c | 12 +++++++----- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/[refs] b/[refs] index c7369f459e96..98888bd3e716 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a051bc5bb1ac6dc138d529077fa20cbbc6622d95 +refs/heads/master: 14d2c68baa659cfd15dc782dd229ea304330c4f6 diff --git a/trunk/arch/sparc64/kernel/stacktrace.c b/trunk/arch/sparc64/kernel/stacktrace.c index 01b52f561af4..c73ce3f4197e 100644 --- a/trunk/arch/sparc64/kernel/stacktrace.c +++ b/trunk/arch/sparc64/kernel/stacktrace.c @@ -19,7 +19,7 @@ void save_stack_trace(struct stack_trace *trace) fp = ksp + STACK_BIAS; thread_base = (unsigned long) tp; do { - struct reg_window *rw; + struct sparc_stackf *sf; struct pt_regs *regs; unsigned long pc; @@ -28,15 +28,17 @@ void save_stack_trace(struct stack_trace *trace) fp >= (thread_base + THREAD_SIZE)) break; - rw = (struct reg_window *) fp; - regs = (struct pt_regs *) (rw + 1); + sf = (struct sparc_stackf *) fp; + regs = (struct pt_regs *) (sf + 1); if ((regs->magic & ~0x1ff) == PT_REGS_MAGIC) { + if (!(regs->tstate & TSTATE_PRIV)) + break; pc = regs->tpc; fp = regs->u_regs[UREG_I6] + STACK_BIAS; } else { - pc = rw->ins[7]; - fp = rw->ins[6] + STACK_BIAS; + pc = sf->callers_pc; + fp = (unsigned long)sf->fp + STACK_BIAS; } if (trace->skip > 0) diff --git a/trunk/arch/sparc64/kernel/traps.c b/trunk/arch/sparc64/kernel/traps.c index d9b8d46707d1..369749262653 100644 --- a/trunk/arch/sparc64/kernel/traps.c +++ b/trunk/arch/sparc64/kernel/traps.c @@ -2116,7 +2116,7 @@ void show_stack(struct task_struct *tsk, unsigned long *_ksp) printk("\n"); #endif do { - struct reg_window *rw; + struct sparc_stackf *sf; struct pt_regs *regs; unsigned long pc; @@ -2124,15 +2124,17 @@ void show_stack(struct task_struct *tsk, unsigned long *_ksp) if (fp < (thread_base + sizeof(struct thread_info)) || fp >= (thread_base + THREAD_SIZE)) break; - rw = (struct reg_window *)fp; - regs = (struct pt_regs *) (rw + 1); + sf = (struct sparc_stackf *) fp; + regs = (struct pt_regs *) (sf + 1); if ((regs->magic & ~0x1ff) == PT_REGS_MAGIC) { + if (!(regs->tstate & TSTATE_PRIV)) + break; pc = regs->tpc; fp = regs->u_regs[UREG_I6] + STACK_BIAS; } else { - pc = rw->ins[7]; - fp = rw->ins[6] + STACK_BIAS; + pc = sf->callers_pc; + fp = (unsigned long)sf->fp + STACK_BIAS; } printk(" [%016lx] ", pc);