Commit 9cb1ccec authored by Heiko Carstens's avatar Heiko Carstens Committed by Martin Schwidefsky

s390: remove all usages of PSW_ADDR_INSN

Yet another leftover from the 31 bit era. The usual operation
"y = x & PSW_ADDR_INSN" with the PSW_ADDR_INSN mask is a nop for
CONFIG_64BIT.

Therefore remove all usages and hope the code is a bit less confusing.
Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Reviewed-by: default avatarDavid Hildenbrand <dahi@linux.vnet.ibm.com>
parent fecc868a
...@@ -149,7 +149,7 @@ static inline int test_pt_regs_flag(struct pt_regs *regs, int flag) ...@@ -149,7 +149,7 @@ static inline int test_pt_regs_flag(struct pt_regs *regs, int flag)
#define arch_has_block_step() (1) #define arch_has_block_step() (1)
#define user_mode(regs) (((regs)->psw.mask & PSW_MASK_PSTATE) != 0) #define user_mode(regs) (((regs)->psw.mask & PSW_MASK_PSTATE) != 0)
#define instruction_pointer(regs) ((regs)->psw.addr & PSW_ADDR_INSN) #define instruction_pointer(regs) ((regs)->psw.addr)
#define user_stack_pointer(regs)((regs)->gprs[15]) #define user_stack_pointer(regs)((regs)->gprs[15])
#define profile_pc(regs) instruction_pointer(regs) #define profile_pc(regs) instruction_pointer(regs)
...@@ -171,7 +171,7 @@ unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs, unsigned int n); ...@@ -171,7 +171,7 @@ unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs, unsigned int n);
static inline unsigned long kernel_stack_pointer(struct pt_regs *regs) static inline unsigned long kernel_stack_pointer(struct pt_regs *regs)
{ {
return regs->gprs[15] & PSW_ADDR_INSN; return regs->gprs[15];
} }
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
......
...@@ -1470,7 +1470,7 @@ debug_dflt_header_fn(debug_info_t * id, struct debug_view *view, ...@@ -1470,7 +1470,7 @@ debug_dflt_header_fn(debug_info_t * id, struct debug_view *view,
except_str = "*"; except_str = "*";
else else
except_str = "-"; except_str = "-";
caller = ((unsigned long) entry->caller) & PSW_ADDR_INSN; caller = (unsigned long) entry->caller;
rc += sprintf(out_buf, "%02i %011lld:%06lu %1u %1s %02i %p ", rc += sprintf(out_buf, "%02i %011lld:%06lu %1u %1s %02i %p ",
area, (long long)time_spec.tv_sec, area, (long long)time_spec.tv_sec,
time_spec.tv_nsec / 1000, level, except_str, time_spec.tv_nsec / 1000, level, except_str,
......
...@@ -34,22 +34,21 @@ __show_trace(unsigned long sp, unsigned long low, unsigned long high) ...@@ -34,22 +34,21 @@ __show_trace(unsigned long sp, unsigned long low, unsigned long high)
unsigned long addr; unsigned long addr;
while (1) { while (1) {
sp = sp & PSW_ADDR_INSN;
if (sp < low || sp > high - sizeof(*sf)) if (sp < low || sp > high - sizeof(*sf))
return sp; return sp;
sf = (struct stack_frame *) sp; sf = (struct stack_frame *) sp;
addr = sf->gprs[8] & PSW_ADDR_INSN; addr = sf->gprs[8];
printk("([<%016lx>] %pSR)\n", addr, (void *)addr); printk("([<%016lx>] %pSR)\n", addr, (void *)addr);
/* Follow the backchain. */ /* Follow the backchain. */
while (1) { while (1) {
low = sp; low = sp;
sp = sf->back_chain & PSW_ADDR_INSN; sp = sf->back_chain;
if (!sp) if (!sp)
break; break;
if (sp <= low || sp > high - sizeof(*sf)) if (sp <= low || sp > high - sizeof(*sf))
return sp; return sp;
sf = (struct stack_frame *) sp; sf = (struct stack_frame *) sp;
addr = sf->gprs[8] & PSW_ADDR_INSN; addr = sf->gprs[8];
printk(" [<%016lx>] %pSR\n", addr, (void *)addr); printk(" [<%016lx>] %pSR\n", addr, (void *)addr);
} }
/* Zero backchain detected, check for interrupt frame. */ /* Zero backchain detected, check for interrupt frame. */
...@@ -57,7 +56,7 @@ __show_trace(unsigned long sp, unsigned long low, unsigned long high) ...@@ -57,7 +56,7 @@ __show_trace(unsigned long sp, unsigned long low, unsigned long high)
if (sp <= low || sp > high - sizeof(*regs)) if (sp <= low || sp > high - sizeof(*regs))
return sp; return sp;
regs = (struct pt_regs *) sp; regs = (struct pt_regs *) sp;
addr = regs->psw.addr & PSW_ADDR_INSN; addr = regs->psw.addr;
printk(" [<%016lx>] %pSR\n", addr, (void *)addr); printk(" [<%016lx>] %pSR\n", addr, (void *)addr);
low = sp; low = sp;
sp = regs->gprs[15]; sp = regs->gprs[15];
......
...@@ -252,7 +252,7 @@ static void early_pgm_check_handler(void) ...@@ -252,7 +252,7 @@ static void early_pgm_check_handler(void)
unsigned long addr; unsigned long addr;
addr = S390_lowcore.program_old_psw.addr; addr = S390_lowcore.program_old_psw.addr;
fixup = search_exception_tables(addr & PSW_ADDR_INSN); fixup = search_exception_tables(addr);
if (!fixup) if (!fixup)
disabled_wait(0); disabled_wait(0);
/* Disable low address protection before storing into lowcore. */ /* Disable low address protection before storing into lowcore. */
......
...@@ -203,7 +203,7 @@ unsigned long prepare_ftrace_return(unsigned long parent, unsigned long ip) ...@@ -203,7 +203,7 @@ unsigned long prepare_ftrace_return(unsigned long parent, unsigned long ip)
goto out; goto out;
if (unlikely(atomic_read(&current->tracing_graph_pause))) if (unlikely(atomic_read(&current->tracing_graph_pause)))
goto out; goto out;
ip = (ip & PSW_ADDR_INSN) - MCOUNT_INSN_SIZE; ip -= MCOUNT_INSN_SIZE;
trace.func = ip; trace.func = ip;
trace.depth = current->curr_ret_stack + 1; trace.depth = current->curr_ret_stack + 1;
/* Only trace if the calling function expects to. */ /* Only trace if the calling function expects to. */
......
...@@ -310,7 +310,7 @@ static int kprobe_handler(struct pt_regs *regs) ...@@ -310,7 +310,7 @@ static int kprobe_handler(struct pt_regs *regs)
*/ */
preempt_disable(); preempt_disable();
kcb = get_kprobe_ctlblk(); kcb = get_kprobe_ctlblk();
p = get_kprobe((void *)((regs->psw.addr & PSW_ADDR_INSN) - 2)); p = get_kprobe((void *)(regs->psw.addr - 2));
if (p) { if (p) {
if (kprobe_running()) { if (kprobe_running()) {
...@@ -490,7 +490,7 @@ NOKPROBE_SYMBOL(trampoline_probe_handler); ...@@ -490,7 +490,7 @@ NOKPROBE_SYMBOL(trampoline_probe_handler);
static void resume_execution(struct kprobe *p, struct pt_regs *regs) static void resume_execution(struct kprobe *p, struct pt_regs *regs)
{ {
struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
unsigned long ip = regs->psw.addr & PSW_ADDR_INSN; unsigned long ip = regs->psw.addr;
int fixup = probe_get_fixup_type(p->ainsn.insn); int fixup = probe_get_fixup_type(p->ainsn.insn);
/* Check if the kprobes location is an enabled ftrace caller */ /* Check if the kprobes location is an enabled ftrace caller */
...@@ -605,7 +605,7 @@ static int kprobe_trap_handler(struct pt_regs *regs, int trapnr) ...@@ -605,7 +605,7 @@ static int kprobe_trap_handler(struct pt_regs *regs, int trapnr)
* In case the user-specified fault handler returned * In case the user-specified fault handler returned
* zero, try to fix up. * zero, try to fix up.
*/ */
entry = search_exception_tables(regs->psw.addr & PSW_ADDR_INSN); entry = search_exception_tables(regs->psw.addr);
if (entry) { if (entry) {
regs->psw.addr = extable_fixup(entry); regs->psw.addr = extable_fixup(entry);
return 1; return 1;
......
...@@ -74,7 +74,7 @@ static unsigned long guest_is_user_mode(struct pt_regs *regs) ...@@ -74,7 +74,7 @@ static unsigned long guest_is_user_mode(struct pt_regs *regs)
static unsigned long instruction_pointer_guest(struct pt_regs *regs) static unsigned long instruction_pointer_guest(struct pt_regs *regs)
{ {
return sie_block(regs)->gpsw.addr & PSW_ADDR_INSN; return sie_block(regs)->gpsw.addr;
} }
unsigned long perf_instruction_pointer(struct pt_regs *regs) unsigned long perf_instruction_pointer(struct pt_regs *regs)
...@@ -231,29 +231,27 @@ static unsigned long __store_trace(struct perf_callchain_entry *entry, ...@@ -231,29 +231,27 @@ static unsigned long __store_trace(struct perf_callchain_entry *entry,
struct pt_regs *regs; struct pt_regs *regs;
while (1) { while (1) {
sp = sp & PSW_ADDR_INSN;
if (sp < low || sp > high - sizeof(*sf)) if (sp < low || sp > high - sizeof(*sf))
return sp; return sp;
sf = (struct stack_frame *) sp; sf = (struct stack_frame *) sp;
perf_callchain_store(entry, sf->gprs[8] & PSW_ADDR_INSN); perf_callchain_store(entry, sf->gprs[8]);
/* Follow the backchain. */ /* Follow the backchain. */
while (1) { while (1) {
low = sp; low = sp;
sp = sf->back_chain & PSW_ADDR_INSN; sp = sf->back_chain;
if (!sp) if (!sp)
break; break;
if (sp <= low || sp > high - sizeof(*sf)) if (sp <= low || sp > high - sizeof(*sf))
return sp; return sp;
sf = (struct stack_frame *) sp; sf = (struct stack_frame *) sp;
perf_callchain_store(entry, perf_callchain_store(entry, sf->gprs[8]);
sf->gprs[8] & PSW_ADDR_INSN);
} }
/* Zero backchain detected, check for interrupt frame. */ /* Zero backchain detected, check for interrupt frame. */
sp = (unsigned long) (sf + 1); sp = (unsigned long) (sf + 1);
if (sp <= low || sp > high - sizeof(*regs)) if (sp <= low || sp > high - sizeof(*regs))
return sp; return sp;
regs = (struct pt_regs *) sp; regs = (struct pt_regs *) sp;
perf_callchain_store(entry, sf->gprs[8] & PSW_ADDR_INSN); perf_callchain_store(entry, sf->gprs[8]);
low = sp; low = sp;
sp = regs->gprs[15]; sp = regs->gprs[15];
} }
......
...@@ -56,10 +56,10 @@ unsigned long thread_saved_pc(struct task_struct *tsk) ...@@ -56,10 +56,10 @@ unsigned long thread_saved_pc(struct task_struct *tsk)
return 0; return 0;
low = task_stack_page(tsk); low = task_stack_page(tsk);
high = (struct stack_frame *) task_pt_regs(tsk); high = (struct stack_frame *) task_pt_regs(tsk);
sf = (struct stack_frame *) (tsk->thread.ksp & PSW_ADDR_INSN); sf = (struct stack_frame *) tsk->thread.ksp;
if (sf <= low || sf > high) if (sf <= low || sf > high)
return 0; return 0;
sf = (struct stack_frame *) (sf->back_chain & PSW_ADDR_INSN); sf = (struct stack_frame *) sf->back_chain;
if (sf <= low || sf > high) if (sf <= low || sf > high)
return 0; return 0;
return sf->gprs[8]; return sf->gprs[8];
...@@ -220,14 +220,14 @@ unsigned long get_wchan(struct task_struct *p) ...@@ -220,14 +220,14 @@ unsigned long get_wchan(struct task_struct *p)
return 0; return 0;
low = task_stack_page(p); low = task_stack_page(p);
high = (struct stack_frame *) task_pt_regs(p); high = (struct stack_frame *) task_pt_regs(p);
sf = (struct stack_frame *) (p->thread.ksp & PSW_ADDR_INSN); sf = (struct stack_frame *) p->thread.ksp;
if (sf <= low || sf > high) if (sf <= low || sf > high)
return 0; return 0;
for (count = 0; count < 16; count++) { for (count = 0; count < 16; count++) {
sf = (struct stack_frame *) (sf->back_chain & PSW_ADDR_INSN); sf = (struct stack_frame *) sf->back_chain;
if (sf <= low || sf > high) if (sf <= low || sf > high)
return 0; return 0;
return_address = sf->gprs[8] & PSW_ADDR_INSN; return_address = sf->gprs[8];
if (!in_sched_functions(return_address)) if (!in_sched_functions(return_address))
return return_address; return return_address;
} }
......
...@@ -84,7 +84,7 @@ void update_cr_regs(struct task_struct *task) ...@@ -84,7 +84,7 @@ void update_cr_regs(struct task_struct *task)
if (test_tsk_thread_flag(task, TIF_UPROBE_SINGLESTEP)) if (test_tsk_thread_flag(task, TIF_UPROBE_SINGLESTEP))
new.control |= PER_EVENT_IFETCH; new.control |= PER_EVENT_IFETCH;
new.start = 0; new.start = 0;
new.end = PSW_ADDR_INSN; new.end = -1UL;
} }
/* Take care of the PER enablement bit in the PSW. */ /* Take care of the PER enablement bit in the PSW. */
...@@ -148,7 +148,7 @@ static inline unsigned long __peek_user_per(struct task_struct *child, ...@@ -148,7 +148,7 @@ static inline unsigned long __peek_user_per(struct task_struct *child,
else if (addr == (addr_t) &dummy->cr11) else if (addr == (addr_t) &dummy->cr11)
/* End address of the active per set. */ /* End address of the active per set. */
return test_thread_flag(TIF_SINGLE_STEP) ? return test_thread_flag(TIF_SINGLE_STEP) ?
PSW_ADDR_INSN : child->thread.per_user.end; -1UL : child->thread.per_user.end;
else if (addr == (addr_t) &dummy->bits) else if (addr == (addr_t) &dummy->bits)
/* Single-step bit. */ /* Single-step bit. */
return test_thread_flag(TIF_SINGLE_STEP) ? return test_thread_flag(TIF_SINGLE_STEP) ?
...@@ -495,8 +495,6 @@ long arch_ptrace(struct task_struct *child, long request, ...@@ -495,8 +495,6 @@ long arch_ptrace(struct task_struct *child, long request,
} }
return 0; return 0;
default: default:
/* Removing high order bit from addr (only for 31 bit). */
addr &= PSW_ADDR_INSN;
return ptrace_request(child, request, addr, data); return ptrace_request(child, request, addr, data);
} }
} }
......
...@@ -21,12 +21,11 @@ static unsigned long save_context_stack(struct stack_trace *trace, ...@@ -21,12 +21,11 @@ static unsigned long save_context_stack(struct stack_trace *trace,
unsigned long addr; unsigned long addr;
while(1) { while(1) {
sp &= PSW_ADDR_INSN;
if (sp < low || sp > high) if (sp < low || sp > high)
return sp; return sp;
sf = (struct stack_frame *)sp; sf = (struct stack_frame *)sp;
while(1) { while(1) {
addr = sf->gprs[8] & PSW_ADDR_INSN; addr = sf->gprs[8];
if (!trace->skip) if (!trace->skip)
trace->entries[trace->nr_entries++] = addr; trace->entries[trace->nr_entries++] = addr;
else else
...@@ -34,7 +33,7 @@ static unsigned long save_context_stack(struct stack_trace *trace, ...@@ -34,7 +33,7 @@ static unsigned long save_context_stack(struct stack_trace *trace,
if (trace->nr_entries >= trace->max_entries) if (trace->nr_entries >= trace->max_entries)
return sp; return sp;
low = sp; low = sp;
sp = sf->back_chain & PSW_ADDR_INSN; sp = sf->back_chain;
if (!sp) if (!sp)
break; break;
if (sp <= low || sp > high - sizeof(*sf)) if (sp <= low || sp > high - sizeof(*sf))
...@@ -46,7 +45,7 @@ static unsigned long save_context_stack(struct stack_trace *trace, ...@@ -46,7 +45,7 @@ static unsigned long save_context_stack(struct stack_trace *trace,
if (sp <= low || sp > high - sizeof(*regs)) if (sp <= low || sp > high - sizeof(*regs))
return sp; return sp;
regs = (struct pt_regs *)sp; regs = (struct pt_regs *)sp;
addr = regs->psw.addr & PSW_ADDR_INSN; addr = regs->psw.addr;
if (savesched || !in_sched_functions(addr)) { if (savesched || !in_sched_functions(addr)) {
if (!trace->skip) if (!trace->skip)
trace->entries[trace->nr_entries++] = addr; trace->entries[trace->nr_entries++] = addr;
...@@ -65,7 +64,7 @@ void save_stack_trace(struct stack_trace *trace) ...@@ -65,7 +64,7 @@ void save_stack_trace(struct stack_trace *trace)
register unsigned long sp asm ("15"); register unsigned long sp asm ("15");
unsigned long orig_sp, new_sp; unsigned long orig_sp, new_sp;
orig_sp = sp & PSW_ADDR_INSN; orig_sp = sp;
new_sp = save_context_stack(trace, orig_sp, new_sp = save_context_stack(trace, orig_sp,
S390_lowcore.panic_stack - PAGE_SIZE, S390_lowcore.panic_stack - PAGE_SIZE,
S390_lowcore.panic_stack, 1); S390_lowcore.panic_stack, 1);
...@@ -86,7 +85,7 @@ void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace) ...@@ -86,7 +85,7 @@ void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
{ {
unsigned long sp, low, high; unsigned long sp, low, high;
sp = tsk->thread.ksp & PSW_ADDR_INSN; sp = tsk->thread.ksp;
low = (unsigned long) task_stack_page(tsk); low = (unsigned long) task_stack_page(tsk);
high = (unsigned long) task_pt_regs(tsk); high = (unsigned long) task_pt_regs(tsk);
save_context_stack(trace, sp, low, high, 0); save_context_stack(trace, sp, low, high, 0);
......
...@@ -32,8 +32,7 @@ static inline void __user *get_trap_ip(struct pt_regs *regs) ...@@ -32,8 +32,7 @@ static inline void __user *get_trap_ip(struct pt_regs *regs)
address = *(unsigned long *)(current->thread.trap_tdb + 24); address = *(unsigned long *)(current->thread.trap_tdb + 24);
else else
address = regs->psw.addr; address = regs->psw.addr;
return (void __user *) return (void __user *) (address - (regs->int_code >> 16));
((address - (regs->int_code >> 16)) & PSW_ADDR_INSN);
} }
static inline void report_user_fault(struct pt_regs *regs, int signr) static inline void report_user_fault(struct pt_regs *regs, int signr)
...@@ -46,7 +45,7 @@ static inline void report_user_fault(struct pt_regs *regs, int signr) ...@@ -46,7 +45,7 @@ static inline void report_user_fault(struct pt_regs *regs, int signr)
return; return;
printk("User process fault: interruption code %04x ilc:%d ", printk("User process fault: interruption code %04x ilc:%d ",
regs->int_code & 0xffff, regs->int_code >> 17); regs->int_code & 0xffff, regs->int_code >> 17);
print_vma_addr("in ", regs->psw.addr & PSW_ADDR_INSN); print_vma_addr("in ", regs->psw.addr);
printk("\n"); printk("\n");
show_regs(regs); show_regs(regs);
} }
...@@ -69,13 +68,13 @@ void do_report_trap(struct pt_regs *regs, int si_signo, int si_code, char *str) ...@@ -69,13 +68,13 @@ void do_report_trap(struct pt_regs *regs, int si_signo, int si_code, char *str)
report_user_fault(regs, si_signo); report_user_fault(regs, si_signo);
} else { } else {
const struct exception_table_entry *fixup; const struct exception_table_entry *fixup;
fixup = search_exception_tables(regs->psw.addr & PSW_ADDR_INSN); fixup = search_exception_tables(regs->psw.addr);
if (fixup) if (fixup)
regs->psw.addr = extable_fixup(fixup); regs->psw.addr = extable_fixup(fixup);
else { else {
enum bug_trap_type btt; enum bug_trap_type btt;
btt = report_bug(regs->psw.addr & PSW_ADDR_INSN, regs); btt = report_bug(regs->psw.addr, regs);
if (btt == BUG_TRAP_TYPE_WARN) if (btt == BUG_TRAP_TYPE_WARN)
return; return;
die(regs, str); die(regs, str);
......
...@@ -116,7 +116,7 @@ static void enable_all_hw_wp(struct kvm_vcpu *vcpu) ...@@ -116,7 +116,7 @@ static void enable_all_hw_wp(struct kvm_vcpu *vcpu)
if (*cr9 & PER_EVENT_STORE && *cr9 & PER_CONTROL_ALTERATION) { if (*cr9 & PER_EVENT_STORE && *cr9 & PER_CONTROL_ALTERATION) {
*cr9 &= ~PER_CONTROL_ALTERATION; *cr9 &= ~PER_CONTROL_ALTERATION;
*cr10 = 0; *cr10 = 0;
*cr11 = PSW_ADDR_INSN; *cr11 = -1UL;
} else { } else {
*cr9 &= ~PER_CONTROL_ALTERATION; *cr9 &= ~PER_CONTROL_ALTERATION;
*cr9 |= PER_EVENT_STORE; *cr9 |= PER_EVENT_STORE;
...@@ -159,7 +159,7 @@ void kvm_s390_patch_guest_per_regs(struct kvm_vcpu *vcpu) ...@@ -159,7 +159,7 @@ void kvm_s390_patch_guest_per_regs(struct kvm_vcpu *vcpu)
vcpu->arch.sie_block->gcr[0] &= ~0x800ul; vcpu->arch.sie_block->gcr[0] &= ~0x800ul;
vcpu->arch.sie_block->gcr[9] |= PER_EVENT_IFETCH; vcpu->arch.sie_block->gcr[9] |= PER_EVENT_IFETCH;
vcpu->arch.sie_block->gcr[10] = 0; vcpu->arch.sie_block->gcr[10] = 0;
vcpu->arch.sie_block->gcr[11] = PSW_ADDR_INSN; vcpu->arch.sie_block->gcr[11] = -1UL;
} }
if (guestdbg_hw_bp_enabled(vcpu)) { if (guestdbg_hw_bp_enabled(vcpu)) {
......
...@@ -228,7 +228,7 @@ static inline void report_user_fault(struct pt_regs *regs, long signr) ...@@ -228,7 +228,7 @@ static inline void report_user_fault(struct pt_regs *regs, long signr)
return; return;
printk(KERN_ALERT "User process fault: interruption code %04x ilc:%d ", printk(KERN_ALERT "User process fault: interruption code %04x ilc:%d ",
regs->int_code & 0xffff, regs->int_code >> 17); regs->int_code & 0xffff, regs->int_code >> 17);
print_vma_addr(KERN_CONT "in ", regs->psw.addr & PSW_ADDR_INSN); print_vma_addr(KERN_CONT "in ", regs->psw.addr);
printk(KERN_CONT "\n"); printk(KERN_CONT "\n");
printk(KERN_ALERT "failing address: %016lx TEID: %016lx\n", printk(KERN_ALERT "failing address: %016lx TEID: %016lx\n",
regs->int_parm_long & __FAIL_ADDR_MASK, regs->int_parm_long); regs->int_parm_long & __FAIL_ADDR_MASK, regs->int_parm_long);
...@@ -256,7 +256,7 @@ static noinline void do_no_context(struct pt_regs *regs) ...@@ -256,7 +256,7 @@ static noinline void do_no_context(struct pt_regs *regs)
const struct exception_table_entry *fixup; const struct exception_table_entry *fixup;
/* Are we prepared to handle this kernel fault? */ /* Are we prepared to handle this kernel fault? */
fixup = search_exception_tables(regs->psw.addr & PSW_ADDR_INSN); fixup = search_exception_tables(regs->psw.addr);
if (fixup) { if (fixup) {
regs->psw.addr = extable_fixup(fixup); regs->psw.addr = extable_fixup(fixup);
return; return;
......
...@@ -16,24 +16,23 @@ __show_trace(unsigned int *depth, unsigned long sp, ...@@ -16,24 +16,23 @@ __show_trace(unsigned int *depth, unsigned long sp,
struct pt_regs *regs; struct pt_regs *regs;
while (*depth) { while (*depth) {
sp = sp & PSW_ADDR_INSN;
if (sp < low || sp > high - sizeof(*sf)) if (sp < low || sp > high - sizeof(*sf))
return sp; return sp;
sf = (struct stack_frame *) sp; sf = (struct stack_frame *) sp;
(*depth)--; (*depth)--;
oprofile_add_trace(sf->gprs[8] & PSW_ADDR_INSN); oprofile_add_trace(sf->gprs[8]);
/* Follow the backchain. */ /* Follow the backchain. */
while (*depth) { while (*depth) {
low = sp; low = sp;
sp = sf->back_chain & PSW_ADDR_INSN; sp = sf->back_chain;
if (!sp) if (!sp)
break; break;
if (sp <= low || sp > high - sizeof(*sf)) if (sp <= low || sp > high - sizeof(*sf))
return sp; return sp;
sf = (struct stack_frame *) sp; sf = (struct stack_frame *) sp;
(*depth)--; (*depth)--;
oprofile_add_trace(sf->gprs[8] & PSW_ADDR_INSN); oprofile_add_trace(sf->gprs[8]);
} }
...@@ -46,7 +45,7 @@ __show_trace(unsigned int *depth, unsigned long sp, ...@@ -46,7 +45,7 @@ __show_trace(unsigned int *depth, unsigned long sp,
return sp; return sp;
regs = (struct pt_regs *) sp; regs = (struct pt_regs *) sp;
(*depth)--; (*depth)--;
oprofile_add_trace(sf->gprs[8] & PSW_ADDR_INSN); oprofile_add_trace(sf->gprs[8]);
low = sp; low = sp;
sp = regs->gprs[15]; sp = regs->gprs[15];
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment