Use madt_setup_io (from madt.c) on Xen apic_enumerator, in order to
parse the interrupt sources from the IO APIC.
I would like to get opinions, but I think we should rename and move
madt_setup_io to io_apic.c.
---
sys/amd64/include/apicvar.h |1 +
sys/i386/include/apicvar.h |1 +
sys/x86/acpica/madt.c |5 ++---
sys/x86/xen/mptable.c | 24 +++-
4 files changed, 27 insertions(+), 4 deletions(-)
diff --git a/sys/amd64/include/apicvar.h b/sys/amd64/include/apicvar.h
index a48a76b..3974067 100644
--- a/sys/amd64/include/apicvar.h
+++ b/sys/amd64/include/apicvar.h
@@ -233,6 +233,7 @@ int lapic_set_lvt_triggermode(u_int apic_id, u_int lvt,
void lapic_set_tpr(u_int vector);
void lapic_setup(int boot);
void xen_intr_handle_upcall(struct trapframe *frame);
+intmadt_setup_io(void);
#endif /* !LOCORE */
#endif /* _MACHINE_APICVAR_H_ */
diff --git a/sys/i386/include/apicvar.h b/sys/i386/include/apicvar.h
index c8ee9bc..05ec013 100644
--- a/sys/i386/include/apicvar.h
+++ b/sys/i386/include/apicvar.h
@@ -232,6 +232,7 @@ int lapic_set_lvt_triggermode(u_int apic_id, u_int lvt,
void lapic_set_tpr(u_int vector);
void lapic_setup(int boot);
void xen_intr_handle_upcall(struct trapframe *frame);
+intmadt_setup_io(void);
#endif /* !LOCORE */
#endif /* _MACHINE_APICVAR_H_ */
diff --git a/sys/x86/acpica/madt.c b/sys/x86/acpica/madt.c
index 5929fde..6f3b591 100644
--- a/sys/x86/acpica/madt.c
+++ b/sys/x86/acpica/madt.c
@@ -61,7 +61,7 @@ static struct lapic_info {
} lapics[MAX_APIC_ID + 1];
static int madt_found_sci_override;
-static ACPI_TABLE_MADT *madt;
+ACPI_TABLE_MADT *madt;
static vm_paddr_t madt_physaddr;
static vm_offset_t madt_length;
@@ -84,7 +84,6 @@ static void madt_probe_cpus_handler(ACPI_SUBTABLE_HEADER
*entry,
void *arg __unused);
static voidmadt_register(void *dummy);
static int madt_setup_local(void);
-static int madt_setup_io(void);
static voidmadt_walk_table(acpi_subtable_handler *handler, void *arg);
static struct apic_enumerator madt_enumerator = {
@@ -147,7 +146,7 @@ madt_setup_local(void)
/*
* Enumerate I/O APICs and setup interrupt sources.
*/
-static int
+int
madt_setup_io(void)
{
void *ioapic;
diff --git a/sys/x86/xen/mptable.c b/sys/x86/xen/mptable.c
index 0384886..46b03f3 100644
--- a/sys/x86/xen/mptable.c
+++ b/sys/x86/xen/mptable.c
@@ -43,6 +43,9 @@ __FBSDID($FreeBSD$);
#include machine/intr_machdep.h
#include machine/apicvar.h
+#include contrib/dev/acpica/include/acpi.h
+#include contrib/dev/acpica/include/actables.h
+
#include machine/cpu.h
#include machine/smp.h
@@ -51,6 +54,9 @@ __FBSDID($FreeBSD$);
#include xen/interface/vcpu.h
+/* From madt.c */
+extern ACPI_TABLE_MADT *madt;
+
static int xenpv_probe(void);
static int xenpv_probe_cpus(void);
static int xenpv_setup_local(void);
@@ -107,7 +113,23 @@ xenpv_setup_local(void)
static int
xenpv_setup_io(void)
{
- return (0);
+ vm_paddr_t madt_physaddr;
+ vm_offset_t madt_length;
+
+ if (!xen_initial_domain())
+ return (0);
+
+ madt_physaddr = acpi_find_table(ACPI_SIG_MADT);
+ if (madt_physaddr == 0)
+ panic(could not find MADT table);
+ madt = acpi_map_table(madt_physaddr, ACPI_SIG_MADT);
+ if (madt == NULL)
+ panic(unable to map MADT);
+ madt_length = madt-Header.Length;
+ acpi_unmap_table(madt);
+ madt = pmap_mapbios(madt_physaddr, madt_length);
+
+ return (madt_setup_io());
}
static void
--
1.7.7.5 (Apple Git-26)
___
freebsd-xen@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-xen
To unsubscribe, send any mail to freebsd-xen-unsubscr...@freebsd.org