git: 0ef872c9353e - stable/14 - io_apic: Support APIC Extended Destination IDs
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 16 Apr 2026 15:12:22 UTC
The branch stable/14 has been updated by cperciva:
URL: https://cgit.FreeBSD.org/src/commit/?id=0ef872c9353e83bfbfe4cba15a1960fa391cb5a4
commit 0ef872c9353e83bfbfe4cba15a1960fa391cb5a4
Author: Colin Percival <cperciva@FreeBSD.org>
AuthorDate: 2026-03-16 23:45:32 +0000
Commit: Colin Percival <cperciva@FreeBSD.org>
CommitDate: 2026-04-16 15:11:54 +0000
io_apic: Support APIC Extended Destination IDs
If APIC Extended Destination ID support is enabled, use it in APIC RTEs
by allowing APIC IDs up to 2^15 - 1 and encoding the high bits into
Intel "reserved" bits per the standard.
Reviewed by: kib
MFC after: 3 weeks
Sponsored by: Amazon
Differential Revision: https://reviews.freebsd.org/D55889
(cherry picked from commit b0e1b1069d655f12ab69cf3a1dc1904dd35ad1da)
---
sys/x86/include/apicvar.h | 1 +
sys/x86/x86/io_apic.c | 7 +++++++
2 files changed, 8 insertions(+)
diff --git a/sys/x86/include/apicvar.h b/sys/x86/include/apicvar.h
index bb2986c3bf67..36ce48339ad4 100644
--- a/sys/x86/include/apicvar.h
+++ b/sys/x86/include/apicvar.h
@@ -84,6 +84,7 @@
* to use that ID.
*/
#define IOAPIC_MAX_ID 0xff
+#define IOAPIC_MAX_EXT_ID 0x7fff
/* I/O Interrupts are used for external devices such as ISA, PCI, etc. */
#define APIC_IO_INTS (IDT_IO_INTS + 16)
diff --git a/sys/x86/x86/io_apic.c b/sys/x86/x86/io_apic.c
index ae104beadf6a..56acd091c205 100644
--- a/sys/x86/x86/io_apic.c
+++ b/sys/x86/x86/io_apic.c
@@ -371,6 +371,13 @@ ioapic_program_intpin(struct ioapic_intsrc *intpin)
low = IOART_DESTPHY;
high = intpin->io_cpu << APIC_ID_SHIFT;
intpin->io_valid = 1;
+ } else if (intpin->io_cpu <= IOAPIC_MAX_EXT_ID &&
+ apic_ext_dest_id == 1) {
+ low = IOART_DESTPHY;
+ high = intpin->io_cpu << APIC_ID_SHIFT & APIC_ID_MASK;
+ high |= (intpin->io_cpu >> 8) << APIC_EXT_ID_SHIFT
+ & APIC_EXT_ID_MASK;
+ intpin->io_valid = 1;
} else {
printf("%s: unsupported destination APIC ID %u for pin %u\n",
__func__, intpin->io_cpu, intpin->io_intpin);