aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/kernel/stacktrace.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/s390/kernel/stacktrace.c')
-rw-r--r--arch/s390/kernel/stacktrace.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/arch/s390/kernel/stacktrace.c b/arch/s390/kernel/stacktrace.c
index 1785cd82253c..5acba3cb7220 100644
--- a/arch/s390/kernel/stacktrace.c
+++ b/arch/s390/kernel/stacktrace.c
@@ -21,12 +21,11 @@ static unsigned long save_context_stack(struct stack_trace *trace,
21 unsigned long addr; 21 unsigned long addr;
22 22
23 while(1) { 23 while(1) {
24 sp &= PSW_ADDR_INSN;
25 if (sp < low || sp > high) 24 if (sp < low || sp > high)
26 return sp; 25 return sp;
27 sf = (struct stack_frame *)sp; 26 sf = (struct stack_frame *)sp;
28 while(1) { 27 while(1) {
29 addr = sf->gprs[8] & PSW_ADDR_INSN; 28 addr = sf->gprs[8];
30 if (!trace->skip) 29 if (!trace->skip)
31 trace->entries[trace->nr_entries++] = addr; 30 trace->entries[trace->nr_entries++] = addr;
32 else 31 else
@@ -34,7 +33,7 @@ static unsigned long save_context_stack(struct stack_trace *trace,
34 if (trace->nr_entries >= trace->max_entries) 33 if (trace->nr_entries >= trace->max_entries)
35 return sp; 34 return sp;
36 low = sp; 35 low = sp;
37 sp = sf->back_chain & PSW_ADDR_INSN; 36 sp = sf->back_chain;
38 if (!sp) 37 if (!sp)
39 break; 38 break;
40 if (sp <= low || sp > high - sizeof(*sf)) 39 if (sp <= low || sp > high - sizeof(*sf))
@@ -46,7 +45,7 @@ static unsigned long save_context_stack(struct stack_trace *trace,
46 if (sp <= low || sp > high - sizeof(*regs)) 45 if (sp <= low || sp > high - sizeof(*regs))
47 return sp; 46 return sp;
48 regs = (struct pt_regs *)sp; 47 regs = (struct pt_regs *)sp;
49 addr = regs->psw.addr & PSW_ADDR_INSN; 48 addr = regs->psw.addr;
50 if (savesched || !in_sched_functions(addr)) { 49 if (savesched || !in_sched_functions(addr)) {
51 if (!trace->skip) 50 if (!trace->skip)
52 trace->entries[trace->nr_entries++] = addr; 51 trace->entries[trace->nr_entries++] = addr;
@@ -65,7 +64,7 @@ void save_stack_trace(struct stack_trace *trace)
65 register unsigned long sp asm ("15"); 64 register unsigned long sp asm ("15");
66 unsigned long orig_sp, new_sp; 65 unsigned long orig_sp, new_sp;
67 66
68 orig_sp = sp & PSW_ADDR_INSN; 67 orig_sp = sp;
69 new_sp = save_context_stack(trace, orig_sp, 68 new_sp = save_context_stack(trace, orig_sp,
70 S390_lowcore.panic_stack - PAGE_SIZE, 69 S390_lowcore.panic_stack - PAGE_SIZE,
71 S390_lowcore.panic_stack, 1); 70 S390_lowcore.panic_stack, 1);
@@ -86,7 +85,7 @@ void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
86{ 85{
87 unsigned long sp, low, high; 86 unsigned long sp, low, high;
88 87
89 sp = tsk->thread.ksp & PSW_ADDR_INSN; 88 sp = tsk->thread.ksp;
90 low = (unsigned long) task_stack_page(tsk); 89 low = (unsigned long) task_stack_page(tsk);
91 high = (unsigned long) task_pt_regs(tsk); 90 high = (unsigned long) task_pt_regs(tsk);
92 save_context_stack(trace, sp, low, high, 0); 91 save_context_stack(trace, sp, low, high, 0);