powerpc/book3s: Print task info if we take a machine check in user mode
For an MCE (Machine Check Exception) that hits while in user mode MSR(PR=1), print the task info to the console MCE error log. This may help to identify an application that triggered the MCE. After this patch the MCE console looks like: Severe Machine check interrupt [Recovered] NIP: [0000000010039778] PID: 762 Comm: ebizzy Initiator: CPU Error type: SLB [Multihit] Effective address: 0000000010039778 Severe Machine check interrupt [Not recovered] NIP: [0000000010039778] PID: 763 Comm: ebizzy Initiator: CPU Error type: UE [Page table walk ifetch] Effective address: 0000000010039778 ebizzy[763]: unhandled signal 7 at 0000000010039778 nip 0000000010039778 lr 0000000010001b44 code 30004 Signed-off-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
parent
5b1d6fc2d4
commit
63f44d6514
@ -207,7 +207,8 @@ extern void save_mce_event(struct pt_regs *regs, long handled,
|
||||
extern int get_mce_event(struct machine_check_event *mce, bool release);
|
||||
extern void release_mce_event(void);
|
||||
extern void machine_check_queue_event(void);
|
||||
extern void machine_check_print_event_info(struct machine_check_event *evt);
|
||||
extern void machine_check_print_event_info(struct machine_check_event *evt,
|
||||
bool user_mode);
|
||||
extern uint64_t get_mce_fault_addr(struct machine_check_event *evt);
|
||||
|
||||
#endif /* __ASM_PPC64_MCE_H__ */
|
||||
|
@ -228,12 +228,13 @@ static void machine_check_process_queued_event(struct irq_work *work)
|
||||
while (__this_cpu_read(mce_queue_count) > 0) {
|
||||
index = __this_cpu_read(mce_queue_count) - 1;
|
||||
machine_check_print_event_info(
|
||||
this_cpu_ptr(&mce_event_queue[index]));
|
||||
this_cpu_ptr(&mce_event_queue[index]), false);
|
||||
__this_cpu_dec(mce_queue_count);
|
||||
}
|
||||
}
|
||||
|
||||
void machine_check_print_event_info(struct machine_check_event *evt)
|
||||
void machine_check_print_event_info(struct machine_check_event *evt,
|
||||
bool user_mode)
|
||||
{
|
||||
const char *level, *sevstr, *subtype;
|
||||
static const char *mc_ue_types[] = {
|
||||
@ -311,7 +312,15 @@ void machine_check_print_event_info(struct machine_check_event *evt)
|
||||
printk("%s%s Machine check interrupt [%s]\n", level, sevstr,
|
||||
evt->disposition == MCE_DISPOSITION_RECOVERED ?
|
||||
"Recovered" : "Not recovered");
|
||||
printk("%s NIP [%016llx]: %pS\n", level, evt->srr0, (void *)evt->srr0);
|
||||
|
||||
if (user_mode) {
|
||||
printk("%s NIP: [%016llx] PID: %d Comm: %s\n", level,
|
||||
evt->srr0, current->pid, current->comm);
|
||||
} else {
|
||||
printk("%s NIP [%016llx]: %pS\n", level, evt->srr0,
|
||||
(void *)evt->srr0);
|
||||
}
|
||||
|
||||
printk("%s Initiator: %s\n", level,
|
||||
evt->initiator == MCE_INITIATOR_CPU ? "CPU" : "Unknown");
|
||||
switch (evt->error_type) {
|
||||
|
@ -435,7 +435,7 @@ int opal_machine_check(struct pt_regs *regs)
|
||||
evt.version);
|
||||
return 0;
|
||||
}
|
||||
machine_check_print_event_info(&evt);
|
||||
machine_check_print_event_info(&evt, user_mode(regs));
|
||||
|
||||
if (opal_recover_mce(regs, &evt))
|
||||
return 1;
|
||||
|
Loading…
Reference in New Issue
Block a user