diff options
Diffstat (limited to 'arch/s390/oprofile/backtrace.c')
-rw-r--r-- | arch/s390/oprofile/backtrace.c | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/arch/s390/oprofile/backtrace.c b/arch/s390/oprofile/backtrace.c index 8a6811b2cdb9..fe0bfe370c45 100644 --- a/arch/s390/oprofile/backtrace.c +++ b/arch/s390/oprofile/backtrace.c | |||
@@ -16,24 +16,23 @@ __show_trace(unsigned int *depth, unsigned long sp, | |||
16 | struct pt_regs *regs; | 16 | struct pt_regs *regs; |
17 | 17 | ||
18 | while (*depth) { | 18 | while (*depth) { |
19 | sp = sp & PSW_ADDR_INSN; | ||
20 | if (sp < low || sp > high - sizeof(*sf)) | 19 | if (sp < low || sp > high - sizeof(*sf)) |
21 | return sp; | 20 | return sp; |
22 | sf = (struct stack_frame *) sp; | 21 | sf = (struct stack_frame *) sp; |
23 | (*depth)--; | 22 | (*depth)--; |
24 | oprofile_add_trace(sf->gprs[8] & PSW_ADDR_INSN); | 23 | oprofile_add_trace(sf->gprs[8]); |
25 | 24 | ||
26 | /* Follow the backchain. */ | 25 | /* Follow the backchain. */ |
27 | while (*depth) { | 26 | while (*depth) { |
28 | low = sp; | 27 | low = sp; |
29 | sp = sf->back_chain & PSW_ADDR_INSN; | 28 | sp = sf->back_chain; |
30 | if (!sp) | 29 | if (!sp) |
31 | break; | 30 | break; |
32 | if (sp <= low || sp > high - sizeof(*sf)) | 31 | if (sp <= low || sp > high - sizeof(*sf)) |
33 | return sp; | 32 | return sp; |
34 | sf = (struct stack_frame *) sp; | 33 | sf = (struct stack_frame *) sp; |
35 | (*depth)--; | 34 | (*depth)--; |
36 | oprofile_add_trace(sf->gprs[8] & PSW_ADDR_INSN); | 35 | oprofile_add_trace(sf->gprs[8]); |
37 | 36 | ||
38 | } | 37 | } |
39 | 38 | ||
@@ -46,7 +45,7 @@ __show_trace(unsigned int *depth, unsigned long sp, | |||
46 | return sp; | 45 | return sp; |
47 | regs = (struct pt_regs *) sp; | 46 | regs = (struct pt_regs *) sp; |
48 | (*depth)--; | 47 | (*depth)--; |
49 | oprofile_add_trace(sf->gprs[8] & PSW_ADDR_INSN); | 48 | oprofile_add_trace(sf->gprs[8]); |
50 | low = sp; | 49 | low = sp; |
51 | sp = regs->gprs[15]; | 50 | sp = regs->gprs[15]; |
52 | } | 51 | } |