Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 23 Jul 2026 10:01:11 +0000
From:      Olivier Certner <olce@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Cc:        Elliott Mitchell <ehem+freebsd@m5p.com>
Subject:   git: 94ec0a9c183e - stable/14 - intr/x86: add ioapic_drv_t to reduce number of casts in IO-APIC implementation
Message-ID:  <6a61e667.3cac9.73a7df20@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch stable/14 has been updated by olce:

URL: https://cgit.FreeBSD.org/src/commit/?id=94ec0a9c183e4801c54b264429bf6ebbe397f71c

commit 94ec0a9c183e4801c54b264429bf6ebbe397f71c
Author:     Elliott Mitchell <ehem+freebsd@m5p.com>
AuthorDate: 2024-10-01 19:56:25 +0000
Commit:     Olivier Certner <olce@FreeBSD.org>
CommitDate: 2026-07-23 09:59:14 +0000

    intr/x86: add ioapic_drv_t to reduce number of casts in IO-APIC implementation
    
    void * is handy when you truly do not care about the type.  Yet there is
    so much casting back and forth in the IO-APIC code as to be hazardous.
    Achieve better static checking by the compiler using a typedef.
    
    Reviewed by: imp
    Pull Request: https://github.com/freebsd/freebsd-src/pull/1457
    
    (cherry picked from commit 90fb07edbd7adb653bd8dc1aac09a63b7ff76f89)
---
 sys/x86/include/apicvar.h | 24 +++++++++++++-----------
 sys/x86/x86/io_apic.c     | 42 +++++++++++-------------------------------
 sys/x86/x86/mptable.c     |  4 ++--
 3 files changed, 26 insertions(+), 44 deletions(-)

diff --git a/sys/x86/include/apicvar.h b/sys/x86/include/apicvar.h
index 36ce48339ad4..dcfa79ffc0c0 100644
--- a/sys/x86/include/apicvar.h
+++ b/sys/x86/include/apicvar.h
@@ -197,19 +197,21 @@ extern int *apic_cpuids;
 /* Allow to replace the lapic_ipi_vectored implementation. */
 extern void (*ipi_vectored)(u_int, int);
 
+typedef struct ioapic *ioapic_drv_t;
+
 void	apic_register_enumerator(struct apic_enumerator *enumerator);
-void	*ioapic_create(vm_paddr_t addr, int32_t apic_id, int intbase);
-int	ioapic_disable_pin(void *cookie, u_int pin);
-int	ioapic_get_vector(void *cookie, u_int pin);
-void	ioapic_register(void *cookie);
-int	ioapic_remap_vector(void *cookie, u_int pin, int vector);
-int	ioapic_set_bus(void *cookie, u_int pin, int bus_type);
-int	ioapic_set_extint(void *cookie, u_int pin);
-int	ioapic_set_nmi(void *cookie, u_int pin);
-int	ioapic_set_polarity(void *cookie, u_int pin, enum intr_polarity pol);
-int	ioapic_set_triggermode(void *cookie, u_int pin,
+ioapic_drv_t	ioapic_create(vm_paddr_t addr, int32_t apic_id, int intbase);
+int	ioapic_disable_pin(ioapic_drv_t cookie, u_int pin);
+int	ioapic_get_vector(ioapic_drv_t cookie, u_int pin);
+void	ioapic_register(ioapic_drv_t cookie);
+int	ioapic_remap_vector(ioapic_drv_t cookie, u_int pin, int vector);
+int	ioapic_set_bus(ioapic_drv_t cookie, u_int pin, int bus_type);
+int	ioapic_set_extint(ioapic_drv_t cookie, u_int pin);
+int	ioapic_set_nmi(ioapic_drv_t cookie, u_int pin);
+int	ioapic_set_polarity(ioapic_drv_t cookie, u_int pin, enum intr_polarity pol);
+int	ioapic_set_triggermode(ioapic_drv_t cookie, u_int pin,
 	    enum intr_trigger trigger);
-int	ioapic_set_smi(void *cookie, u_int pin);
+int	ioapic_set_smi(ioapic_drv_t cookie, u_int pin);
 
 void	lapic_create(u_int apic_id, int boot_cpu);
 void	lapic_init(vm_paddr_t addr);
diff --git a/sys/x86/x86/io_apic.c b/sys/x86/x86/io_apic.c
index 56acd091c205..4e0b8a6e4ddb 100644
--- a/sys/x86/x86/io_apic.c
+++ b/sys/x86/x86/io_apic.c
@@ -626,7 +626,7 @@ ioapic_resume(struct pic *pic, bool suspend_cancelled)
 /*
  * Create a plain I/O APIC object.
  */
-void *
+ioapic_drv_t
 ioapic_create(vm_paddr_t addr, int32_t apic_id, int intbase)
 {
 	struct ioapic *io;
@@ -749,22 +749,18 @@ ioapic_create(vm_paddr_t addr, int32_t apic_id, int intbase)
 }
 
 int
-ioapic_get_vector(void *cookie, u_int pin)
+ioapic_get_vector(ioapic_drv_t io, u_int pin)
 {
-	struct ioapic *io;
 
-	io = (struct ioapic *)cookie;
 	if (pin >= io->io_numintr)
 		return (-1);
 	return (io->io_pins[pin].io_irq);
 }
 
 int
-ioapic_disable_pin(void *cookie, u_int pin)
+ioapic_disable_pin(ioapic_drv_t io, u_int pin)
 {
-	struct ioapic *io;
 
-	io = (struct ioapic *)cookie;
 	if (pin >= io->io_numintr)
 		return (EINVAL);
 	if (io->io_pins[pin].io_irq == IRQ_DISABLED)
@@ -776,11 +772,9 @@ ioapic_disable_pin(void *cookie, u_int pin)
 }
 
 int
-ioapic_remap_vector(void *cookie, u_int pin, int vector)
+ioapic_remap_vector(ioapic_drv_t io, u_int pin, int vector)
 {
-	struct ioapic *io;
 
-	io = (struct ioapic *)cookie;
 	if (pin >= io->io_numintr || vector < 0)
 		return (EINVAL);
 	if (io->io_pins[pin].io_irq < 0)
@@ -793,13 +787,11 @@ ioapic_remap_vector(void *cookie, u_int pin, int vector)
 }
 
 int
-ioapic_set_bus(void *cookie, u_int pin, int bus_type)
+ioapic_set_bus(ioapic_drv_t io, u_int pin, int bus_type)
 {
-	struct ioapic *io;
 
 	if (bus_type < 0 || bus_type > APIC_BUS_MAX)
 		return (EINVAL);
-	io = (struct ioapic *)cookie;
 	if (pin >= io->io_numintr)
 		return (EINVAL);
 	if (io->io_pins[pin].io_irq < 0)
@@ -814,11 +806,9 @@ ioapic_set_bus(void *cookie, u_int pin, int bus_type)
 }
 
 int
-ioapic_set_nmi(void *cookie, u_int pin)
+ioapic_set_nmi(ioapic_drv_t io, u_int pin)
 {
-	struct ioapic *io;
 
-	io = (struct ioapic *)cookie;
 	if (pin >= io->io_numintr)
 		return (EINVAL);
 	if (io->io_pins[pin].io_irq == IRQ_NMI)
@@ -838,11 +828,9 @@ ioapic_set_nmi(void *cookie, u_int pin)
 }
 
 int
-ioapic_set_smi(void *cookie, u_int pin)
+ioapic_set_smi(ioapic_drv_t io, u_int pin)
 {
-	struct ioapic *io;
 
-	io = (struct ioapic *)cookie;
 	if (pin >= io->io_numintr)
 		return (EINVAL);
 	if (io->io_pins[pin].io_irq == IRQ_SMI)
@@ -862,11 +850,9 @@ ioapic_set_smi(void *cookie, u_int pin)
 }
 
 int
-ioapic_set_extint(void *cookie, u_int pin)
+ioapic_set_extint(ioapic_drv_t io, u_int pin)
 {
-	struct ioapic *io;
 
-	io = (struct ioapic *)cookie;
 	if (pin >= io->io_numintr)
 		return (EINVAL);
 	if (io->io_pins[pin].io_irq == IRQ_EXTINT)
@@ -889,12 +875,10 @@ ioapic_set_extint(void *cookie, u_int pin)
 }
 
 int
-ioapic_set_polarity(void *cookie, u_int pin, enum intr_polarity pol)
+ioapic_set_polarity(ioapic_drv_t io, u_int pin, enum intr_polarity pol)
 {
-	struct ioapic *io;
 	int activehi;
 
-	io = (struct ioapic *)cookie;
 	if (pin >= io->io_numintr || pol == INTR_POLARITY_CONFORM)
 		return (EINVAL);
 	if (io->io_pins[pin].io_irq < 0)
@@ -910,12 +894,10 @@ ioapic_set_polarity(void *cookie, u_int pin, enum intr_polarity pol)
 }
 
 int
-ioapic_set_triggermode(void *cookie, u_int pin, enum intr_trigger trigger)
+ioapic_set_triggermode(ioapic_drv_t io, u_int pin, enum intr_trigger trigger)
 {
-	struct ioapic *io;
 	int edgetrigger;
 
-	io = (struct ioapic *)cookie;
 	if (pin >= io->io_numintr || trigger == INTR_TRIGGER_CONFORM)
 		return (EINVAL);
 	if (io->io_pins[pin].io_irq < 0)
@@ -934,15 +916,13 @@ ioapic_set_triggermode(void *cookie, u_int pin, enum intr_trigger trigger)
  * Register a complete I/O APIC object with the interrupt subsystem.
  */
 void
-ioapic_register(void *cookie)
+ioapic_register(ioapic_drv_t io)
 {
 	struct ioapic_intsrc *pin;
-	struct ioapic *io;
 	volatile ioapic_t *apic;
 	uint32_t flags;
 	int i;
 
-	io = (struct ioapic *)cookie;
 	apic = io->io_addr;
 	mtx_lock_spin(&icu_lock);
 	flags = ioapic_read(apic, IOAPIC_VER) & IOART_VER_VERSION;
diff --git a/sys/x86/x86/mptable.c b/sys/x86/x86/mptable.c
index e5e5a24c457b..571ffbf55875 100644
--- a/sys/x86/x86/mptable.c
+++ b/sys/x86/x86/mptable.c
@@ -163,7 +163,7 @@ struct pci_route_interrupt_args {
 static mpfps_t mpfps;
 static mpcth_t mpct;
 static ext_entry_ptr mpet;
-static void *ioapics[IOAPIC_MAX_ID + 1];
+static ioapic_drv_t ioapics[IOAPIC_MAX_ID + 1];
 static bus_datum *busses;
 static int mptable_nioapics, mptable_nbusses, mptable_maxbusid;
 static int pci0 = -1;
@@ -770,7 +770,7 @@ intentry_trigger(int_entry_ptr intr)
 static void
 mptable_parse_io_int(int_entry_ptr intr)
 {
-	void *ioapic;
+	ioapic_drv_t ioapic;
 	u_int pin, apic_id;
 
 	apic_id = intr->dst_apic_id;


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6a61e667.3cac9.73a7df20>