summaryrefslogtreecommitdiff
path: root/xen
diff options
context:
space:
mode:
authorJuergen Gross <jgross@suse.com>2020-11-18 12:39:21 +0100
committerJan Beulich <jbeulich@suse.com>2020-11-18 12:39:21 +0100
commit5200fba9ce534fc55ec40ab622b6058600090415 (patch)
treee1db16adf9f3c15ea4b9d06c41568b9630135412 /xen
parent2743174ffb6c6435b5d79673fb374645d1cdfd55 (diff)
xen/x86: issue pci_serr error message via NMI continuation
Instead of using a softirq pci_serr_error() can use NMI continuation for issuing an error message. Signed-off-by: Juergen Gross <jgross@suse.com> Reviewed-by: Jan Beulich <jbeulich@suse.com>
Diffstat (limited to 'xen')
-rw-r--r--xen/arch/x86/traps.c21
-rw-r--r--xen/include/asm-x86/softirq.h5
2 files changed, 17 insertions, 9 deletions
diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c
index 240fd1b089..0459cee9fb 100644
--- a/xen/arch/x86/traps.c
+++ b/xen/arch/x86/traps.c
@@ -1661,10 +1661,18 @@ void do_general_protection(struct cpu_user_regs *regs)
panic("GENERAL PROTECTION FAULT\n[error_code=%04x]\n", regs->error_code);
}
-static void pci_serr_softirq(void)
+static bool pci_serr_cont;
+
+static bool pci_serr_nmicont(void)
{
+ if ( !pci_serr_cont )
+ return false;
+
+ pci_serr_cont = false;
printk("\n\nNMI - PCI system error (SERR)\n");
outb(inb(0x61) & 0x0b, 0x61); /* re-enable the PCI SERR error line. */
+
+ return true;
}
static void nmi_hwdom_report(unsigned int reason_idx)
@@ -1689,9 +1697,9 @@ static void pci_serr_error(const struct cpu_user_regs *regs)
nmi_hwdom_report(_XEN_NMIREASON_pci_serr);
/* fallthrough */
case 'i': /* 'ignore' */
- /* Would like to print a diagnostic here but can't call printk()
- from NMI context -- raise a softirq instead. */
- raise_softirq(PCI_SERR_SOFTIRQ);
+ /* Issue error message in NMI continuation. */
+ pci_serr_cont = true;
+ trigger_nmi_continuation();
break;
default: /* 'fatal' */
console_force_unlock();
@@ -1806,6 +1814,9 @@ bool nmi_check_continuation(void)
{
bool ret = false;
+ if ( pci_serr_nmicont() )
+ ret = true;
+
if ( nmi_oprofile_send_virq() )
ret = true;
@@ -2157,8 +2168,6 @@ void __init trap_init(void)
percpu_traps_init();
cpu_init();
-
- open_softirq(PCI_SERR_SOFTIRQ, pci_serr_softirq);
}
void activate_debugregs(const struct vcpu *curr)
diff --git a/xen/include/asm-x86/softirq.h b/xen/include/asm-x86/softirq.h
index 0b7a77f11f..415ee866c7 100644
--- a/xen/include/asm-x86/softirq.h
+++ b/xen/include/asm-x86/softirq.h
@@ -6,9 +6,8 @@
#define VCPU_KICK_SOFTIRQ (NR_COMMON_SOFTIRQS + 2)
#define MACHINE_CHECK_SOFTIRQ (NR_COMMON_SOFTIRQS + 3)
-#define PCI_SERR_SOFTIRQ (NR_COMMON_SOFTIRQS + 4)
-#define HVM_DPCI_SOFTIRQ (NR_COMMON_SOFTIRQS + 5)
-#define NR_ARCH_SOFTIRQS 6
+#define HVM_DPCI_SOFTIRQ (NR_COMMON_SOFTIRQS + 4)
+#define NR_ARCH_SOFTIRQS 5
bool arch_skip_send_event_check(unsigned int cpu);