Re: [PATCH RFC 02/13] ioapic: introduce hooks for some ioapic ops

2014-01-21 Thread John Baldwin
On Tuesday, December 24, 2013 6:20:51 am Roger Pau Monne wrote:
 Create some hooks for IO APIC operations that will diverge from bare
 metal when implemented for Xen Dom0.
 
 This patch should not introduce any changes in functionality, it's a
 preparatory patch for the implementation of the Xen IO APIC hooks.

I think this is fine.  I should really create a sys/x86/include/apicvar.h
as there is a lot shared between those two headers.

-- 
John Baldwin
___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to freebsd-current-unsubscr...@freebsd.org


[PATCH RFC 02/13] ioapic: introduce hooks for some ioapic ops

2013-12-24 Thread Roger Pau Monne
Create some hooks for IO APIC operations that will diverge from bare
metal when implemented for Xen Dom0.

This patch should not introduce any changes in functionality, it's a
preparatory patch for the implementation of the Xen IO APIC hooks.
---
 sys/amd64/include/apicvar.h |   13 
 sys/i386/include/apicvar.h  |   13 
 sys/x86/include/apicreg.h   |   12 
 sys/x86/x86/io_apic.c   |   65 ++-
 4 files changed, 71 insertions(+), 32 deletions(-)

diff --git a/sys/amd64/include/apicvar.h b/sys/amd64/include/apicvar.h
index 84e01d4..a48a76b 100644
--- a/sys/amd64/include/apicvar.h
+++ b/sys/amd64/include/apicvar.h
@@ -161,6 +161,19 @@ struct apic_enumerator {
SLIST_ENTRY(apic_enumerator) apic_next;
 };
 
+struct ioapic_intsrc {
+   struct intsrc io_intsrc;
+   u_int io_irq;
+   u_int io_intpin:8;
+   u_int io_vector:8;
+   u_int io_cpu:8;
+   u_int io_activehi:1;
+   u_int io_edgetrigger:1;
+   u_int io_masked:1;
+   int io_bus:4;
+   uint32_t io_lowreg;
+};
+
 inthand_t
IDTVEC(apic_isr1), IDTVEC(apic_isr2), IDTVEC(apic_isr3),
IDTVEC(apic_isr4), IDTVEC(apic_isr5), IDTVEC(apic_isr6),
diff --git a/sys/i386/include/apicvar.h b/sys/i386/include/apicvar.h
index 24c99f0..c8ee9bc 100644
--- a/sys/i386/include/apicvar.h
+++ b/sys/i386/include/apicvar.h
@@ -160,6 +160,19 @@ struct apic_enumerator {
SLIST_ENTRY(apic_enumerator) apic_next;
 };
 
+struct ioapic_intsrc {
+   struct intsrc io_intsrc;
+   u_int io_irq;
+   u_int io_intpin:8;
+   u_int io_vector:8;
+   u_int io_cpu:8;
+   u_int io_activehi:1;
+   u_int io_edgetrigger:1;
+   u_int io_masked:1;
+   int io_bus:4;
+   uint32_t io_lowreg;
+};
+
 inthand_t
IDTVEC(apic_isr1), IDTVEC(apic_isr2), IDTVEC(apic_isr3),
IDTVEC(apic_isr4), IDTVEC(apic_isr5), IDTVEC(apic_isr6),
diff --git a/sys/x86/include/apicreg.h b/sys/x86/include/apicreg.h
index 283d50e..4629470 100644
--- a/sys/x86/include/apicreg.h
+++ b/sys/x86/include/apicreg.h
@@ -204,6 +204,18 @@ struct IOAPIC {
 
 typedef struct IOAPIC ioapic_t;
 
+struct ioapic_intsrc;
+/*
+ * Struct containing pointers to IO APIC management functions whose
+ * implementation is run time selectable.
+ */
+struct ioapic_ops {
+   u_int(*read)(volatile ioapic_t *, int);
+   void (*write)(volatile ioapic_t *, int, u_int);
+   void (*register_intr)(struct ioapic_intsrc *);
+};
+extern struct ioapic_ops ioapic_ops;
+
 #undef PAD4
 #undef PAD3
 
diff --git a/sys/x86/x86/io_apic.c b/sys/x86/x86/io_apic.c
index 6d62b1e..125d06a 100644
--- a/sys/x86/x86/io_apic.c
+++ b/sys/x86/x86/io_apic.c
@@ -81,19 +81,6 @@ static MALLOC_DEFINE(M_IOAPIC, io_apic, I/O APIC 
structures);
  * ftp://download.intel.com/design/chipsets/datashts/29056601.pdf
  */
 
-struct ioapic_intsrc {
-   struct intsrc io_intsrc;
-   u_int io_irq;
-   u_int io_intpin:8;
-   u_int io_vector:8;
-   u_int io_cpu:8;
-   u_int io_activehi:1;
-   u_int io_edgetrigger:1;
-   u_int io_masked:1;
-   int io_bus:4;
-   uint32_t io_lowreg;
-};
-
 struct ioapic {
struct pic io_pic;
u_int io_id:8;  /* logical ID */
@@ -106,8 +93,9 @@ struct ioapic {
struct ioapic_intsrc io_pins[0];
 };
 
-static u_int   ioapic_read(volatile ioapic_t *apic, int reg);
-static voidioapic_write(volatile ioapic_t *apic, int reg, u_int val);
+static u_int   native_ioapic_read(volatile ioapic_t *apic, int reg);
+static voidnative_ioapic_write(volatile ioapic_t *apic, int reg, u_int 
val);
+static voidnative_ioapic_register_intr(struct ioapic_intsrc *pin);
 static const char *ioapic_bus_string(int bus_type);
 static voidioapic_print_irq(struct ioapic_intsrc *intpin);
 static voidioapic_enable_source(struct intsrc *isrc);
@@ -139,6 +127,13 @@ SYSCTL_INT(_hw_apic, OID_AUTO, enable_extint, 
CTLFLAG_RDTUN, enable_extint, 0,
 Enable the ExtINT pin in the first I/O APIC);
 TUNABLE_INT(hw.apic.enable_extint, enable_extint);
 
+/* Default ioapic_ops implementation. */
+struct ioapic_ops ioapic_ops = {
+   .read = native_ioapic_read,
+   .write =native_ioapic_write,
+   .register_intr =native_ioapic_register_intr,
+};
+
 static __inline void
 _ioapic_eoi_source(struct intsrc *isrc)
 {
@@ -146,7 +141,7 @@ _ioapic_eoi_source(struct intsrc *isrc)
 }
 
 static u_int
-ioapic_read(volatile ioapic_t *apic, int reg)
+native_ioapic_read(volatile ioapic_t *apic, int reg)
 {
 
mtx_assert(icu_lock, MA_OWNED);
@@ -155,7 +150,7 @@ ioapic_read(volatile ioapic_t *apic, int reg)
 }
 
 static void
-ioapic_write(volatile ioapic_t *apic, int reg, u_int val)
+native_ioapic_write(volatile ioapic_t *apic, int reg, u_int val)
 {
 
mtx_assert(icu_lock, MA_OWNED);
@@ -163,6 +158,12 @@ ioapic_write(volatile ioapic_t *apic, int reg, u_int val)
apic-iowin =