svn commit: r338631 - in head/sys: x86/xen xen
Roger Pau Monné
royger at FreeBSD.org
Thu Sep 13 07:14:12 UTC 2018
Author: royger
Date: Thu Sep 13 07:14:11 2018
New Revision: 338631
URL: https://svnweb.freebsd.org/changeset/base/338631
Log:
xen: legacy PVH fixes for the new interrupt count
Register interrupts using the PIC pic_register_sources method instead
of doing it in apic_setup_io. This is now required, since the internal
interrupt structures are not yet setup when calling apic_setup_io.
Approved by: re (gjb)
Sponsored by: Citrix Systems R&D
Modified:
head/sys/x86/xen/pvcpu_enum.c
head/sys/x86/xen/xen_intr.c
head/sys/xen/xen_intr.h
Modified: head/sys/x86/xen/pvcpu_enum.c
==============================================================================
--- head/sys/x86/xen/pvcpu_enum.c Thu Sep 13 07:13:13 2018 (r338630)
+++ head/sys/x86/xen/pvcpu_enum.c Thu Sep 13 07:14:11 2018 (r338631)
@@ -193,52 +193,65 @@ xenpv_setup_io(void)
{
if (xen_initial_domain()) {
- int i, ret;
+ /*
+ * NB: we could iterate over the MADT IOAPIC entries in order
+ * to figure out the exact number of IOAPIC interrupts, but
+ * this is legacy code so just keep using the previous
+ * behaviour and assume a maximum of 256 interrupts.
+ */
+ num_io_irqs = max(MINIMUM_MSI_INT - 1, num_io_irqs);
- /* Map MADT */
- madt_physaddr = acpi_find_table(ACPI_SIG_MADT);
- madt = acpi_map_table(madt_physaddr, ACPI_SIG_MADT);
- madt_length = madt->Header.Length;
+ acpi_SetDefaultIntrModel(ACPI_INTR_APIC);
+ }
+ return (0);
+}
- /* Try to initialize ACPI so that we can access the FADT. */
- i = acpi_Startup();
- if (ACPI_FAILURE(i)) {
- printf("MADT: ACPI Startup failed with %s\n",
- AcpiFormatException(i));
- printf("Try disabling either ACPI or apic support.\n");
- panic("Using MADT but ACPI doesn't work");
- }
+void
+xenpv_register_pirqs(struct pic *pic __unused)
+{
+ unsigned int i;
+ int ret;
- /* Run through the table to see if there are any overrides. */
- madt_walk_table(madt_parse_ints, NULL);
+ /* Map MADT */
+ madt_physaddr = acpi_find_table(ACPI_SIG_MADT);
+ madt = acpi_map_table(madt_physaddr, ACPI_SIG_MADT);
+ madt_length = madt->Header.Length;
- /*
- * If there was not an explicit override entry for the SCI,
- * force it to use level trigger and active-low polarity.
- */
- if (!madt_found_sci_override) {
- printf(
- "MADT: Forcing active-low polarity and level trigger for SCI\n");
- ret = xen_register_pirq(AcpiGbl_FADT.SciInterrupt,
- INTR_TRIGGER_LEVEL, INTR_POLARITY_LOW);
- if (ret != 0)
- panic("Unable to register SCI IRQ");
- }
+ /* Try to initialize ACPI so that we can access the FADT. */
+ ret = acpi_Startup();
+ if (ACPI_FAILURE(ret)) {
+ printf("MADT: ACPI Startup failed with %s\n",
+ AcpiFormatException(ret));
+ printf("Try disabling either ACPI or apic support.\n");
+ panic("Using MADT but ACPI doesn't work");
+ }
- /* Register legacy ISA IRQs */
- for (i = 1; i < 16; i++) {
- if (intr_lookup_source(i) != NULL)
- continue;
- ret = xen_register_pirq(i, INTR_TRIGGER_EDGE,
- INTR_POLARITY_LOW);
- if (ret != 0 && bootverbose)
- printf("Unable to register legacy IRQ#%d: %d\n",
- i, ret);
- }
+ /* Run through the table to see if there are any overrides. */
+ madt_walk_table(madt_parse_ints, NULL);
- acpi_SetDefaultIntrModel(ACPI_INTR_APIC);
+ /*
+ * If there was not an explicit override entry for the SCI,
+ * force it to use level trigger and active-low polarity.
+ */
+ if (!madt_found_sci_override) {
+ printf(
+"MADT: Forcing active-low polarity and level trigger for SCI\n");
+ ret = xen_register_pirq(AcpiGbl_FADT.SciInterrupt,
+ INTR_TRIGGER_LEVEL, INTR_POLARITY_LOW);
+ if (ret != 0)
+ panic("Unable to register SCI IRQ");
}
- return (0);
+
+ /* Register legacy ISA IRQs */
+ for (i = 1; i < 16; i++) {
+ if (intr_lookup_source(i) != NULL)
+ continue;
+ ret = xen_register_pirq(i, INTR_TRIGGER_EDGE,
+ INTR_POLARITY_LOW);
+ if (ret != 0 && bootverbose)
+ printf("Unable to register legacy IRQ#%u: %d\n", i,
+ ret);
+ }
}
static void
Modified: head/sys/x86/xen/xen_intr.c
==============================================================================
--- head/sys/x86/xen/xen_intr.c Thu Sep 13 07:13:13 2018 (r338630)
+++ head/sys/x86/xen/xen_intr.c Thu Sep 13 07:14:11 2018 (r338631)
@@ -178,6 +178,9 @@ struct pic xen_intr_pic = {
* physical interrupt sources.
*/
struct pic xen_intr_pirq_pic = {
+#ifdef __amd64__
+ .pic_register_sources = xenpv_register_pirqs,
+#endif
.pic_enable_source = xen_intr_pirq_enable_source,
.pic_disable_source = xen_intr_pirq_disable_source,
.pic_eoi_source = xen_intr_pirq_eoi_source,
Modified: head/sys/xen/xen_intr.h
==============================================================================
--- head/sys/xen/xen_intr.h Thu Sep 13 07:13:13 2018 (r338630)
+++ head/sys/xen/xen_intr.h Thu Sep 13 07:14:11 2018 (r338631)
@@ -274,4 +274,14 @@ int xen_intr_add_handler(const char *name, driver_filt
int xen_intr_get_evtchn_from_port(evtchn_port_t port,
xen_intr_handle_t *handlep);
+/**
+ * Register the IO-APIC PIRQs when running in legacy PVH Dom0 mode.
+ *
+ * \param pic PIC instance.
+ *
+ * NB: this should be removed together with the support for legacy PVH mode.
+ */
+struct pic;
+void xenpv_register_pirqs(struct pic *pic);
+
#endif /* _XEN_INTR_H_ */
More information about the svn-src-all
mailing list