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: Heiko Carstens <heiko.carstens@de.ibm.com> Reviewed-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
This commit is contained in:
parent
fecc868a66
commit
9cb1ccecb6
@ -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);
|
|||||||
|
|
||||||
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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
goto out;
|
goto out;
|
||||||
if (unlikely(atomic_read(¤t->tracing_graph_pause)))
|
if (unlikely(atomic_read(¤t->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)
|
|||||||
*/
|
*/
|
||||||
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);
|
|||||||
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)
|
|||||||
* 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)
|
|||||||
|
|
||||||
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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
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,
|
|||||||
}
|
}
|
||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
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,
|
|||||||
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];
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user