diff options
Diffstat (limited to 'arch/s390/kernel/stacktrace.c')
-rw-r--r-- | arch/s390/kernel/stacktrace.c | 11 |
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); |