Fact-checked by Grok 2 weeks ago

Programmable interrupt controller

A programmable interrupt controller (PIC) is an that serves as an intermediary between peripheral devices and a (CPU), managing multiple requests by prioritizing them, masking unnecessary ones, and delivering vectored to the CPU for efficient handling of asynchronous events in interrupt-driven . It accepts signals from devices such as keyboards, timers, or disk controllers, resolves priorities based on programmable modes, and signals the CPU via dedicated lines, allowing the to respond promptly without constant polling. The seminal implementation of a PIC is Intel's 8259A, introduced as an upgrade to the original 8259 in the late 1970s, designed specifically for microprocessors like the 8080, , 8086, and 8088 families. This device supports up to eight levels of vectored priority interrupts natively and can be cascaded in a master-slave to handle up to 64 interrupts, featuring programmable modes such as fully nested priority, rotating priority, and specific priority levels. Key internal components include the Register (IRR) for latching incoming requests, the In-Service Register (ISR) for tracking active interrupts, the Interrupt Mask Register (IMR) for selective enabling/disabling, and a priority resolver that determines the highest-priority during CPU acknowledgment cycles. Operating on a single 5V supply without requiring a clock, the 8259A became a cornerstone of early x86-based personal computers, facilitating real-time responses in systems like the PC. In modern architectures, PICs have evolved to address multi-core processing and higher interrupt volumes, with designs like ARM's Generic Interrupt Controller (GIC) supporting up to 1020 interrupt sources in recent versions such as GICv3 and GICv4, secure/non-secure partitioning, and dynamic prioritization for scalable systems. In x86 systems, this evolved into the (APIC) for multi-processor support. Similarly, AMD's AXI Interrupt Controller (AXI INTC) aggregates multiple peripheral interrupts into a single output for processors in FPGA-based designs, offering configurable options via memory-mapped registers to suit embedded and adaptive computing environments. These advanced PICs maintain core principles of interrupt management while incorporating features like message-signaled interrupts and affinity targeting to cores, reflecting the shift from discrete chips to integrated IP blocks in contemporary hardware.

Overview

Definition and Purpose

A programmable interrupt controller (PIC) is an integrated circuit designed to manage multiple interrupt requests from peripheral devices, prioritizing them and notifying the central processing unit (CPU) to execute appropriate interrupt service routines (ISRs). It serves as an intermediary between interrupt sources and the CPU, handling the collection, prioritization, and routing of these signals to ensure orderly processing. Interrupts are asynchronous signals generated by hardware peripherals or software to demand immediate CPU attention, allowing the processor to pause its current task and address urgent events, such as data arrival or errors. These include maskable interrupts, which can be temporarily disabled by the CPU to prevent disruption during critical operations, and non-maskable interrupts (NMIs), which cannot be disabled and are reserved for high-priority, irrecoverable conditions like system failures. The PIC primarily deals with maskable interrupts, mapping them from various inputs to specific CPU interrupt vectors (IRQs) for targeted handling. The primary purpose of a PIC is to enable efficient CPU in multitasking systems by eliminating the need for constant polling of peripherals, thus reducing overhead and improving responsiveness to asynchronous events. In early architectures, for instance, the PIC managed interrupts from devices like keyboards for input detection, system timers for scheduling, and disk controllers for I/O operations, allowing the CPU to focus on primary computations while responding promptly to demands. This vector-based mapping ensures that each interrupt source triggers the correct handler, supporting real-time interrupt-driven systems with minimal software intervention.

Historical Development

The programmable interrupt controller (PIC) emerged in the 1970s to address interrupt management needs in minicomputer and early microcomputer systems, where multiple peripherals required prioritized access to the CPU. developed the 8259 as the first widely adopted PIC, introducing it in 1976 as part of the MCS-85 family to support vectored priority s for the microprocessor and compatible systems. With the rise of personal computing, the enhanced 8259A variant became a cornerstone of x86 , integrated into the original PC released in August 1981 to handle eight interrupt requests (IRQs) from devices like the , timer, and , thereby enabling efficient resource sharing for the 8088 . The PC/AT, launched in 1984, extended this design by cascading a second 8259A chip to the primary one via IRQ2, effectively doubling the capacity to 16 IRQs and establishing the dual-PIC configuration as a for PC-compatible systems through the late and early . As PC architectures advanced in the 1990s, discrete PIC chips transitioned toward integration within southbridge components of motherboard chipsets to streamline design and reduce costs; for instance, 's early 430-series chipsets began embedding interrupt controller logic alongside other I/O functions. By the early 2000s, the standalone 8259A had become obsolete in mainstream x86 platforms, largely supplanted by more scalable alternatives that supported and higher IRQ counts. A pivotal milestone was the introduction of the (APIC) by in 1993 alongside the processor, with its use in multiprocessor systems detailed in the MultiProcessor Specification version 1.4 (May 1997). Despite these advancements, PIC concepts retain relevance into the 2020s, particularly in for with older operating systems like derivatives and in select embedded x86-based applications where ensures reliable peripheral integration without full redesign.

Architecture and Operation

Internal Components and Registers

The core internal components of a programmable interrupt controller (PIC) include several key registers that manage interrupt states and configurations. The Interrupt Request Register (IRR) is a read-only 8-bit vector that captures pending interrupt requests from the input lines, storing the levels awaiting service. Similarly, the In-Service Register (ISR) is another read-only 8-bit vector that tracks interrupts currently being processed by the CPU, ensuring that servicing of higher-priority interrupts can inhibit lower ones. The Interrupt Mask Register (IMR), also an 8-bit register accessible via read operations, enables selective masking of specific interrupt request lines—setting a bit to 1 disables the corresponding IRQ, which helps prevent interrupt storms by blocking unnecessary requests without affecting unmasked lines. Initialization and operational control are handled through dedicated command word registers. The Initialization Command Words (ICWs) consist of up to four 8-bit registers (ICW1 through ICW4) that configure the PIC during setup: ICW1 initiates the process and selects the interval between acknowledge pulses; ICW2 specifies the base address for interrupt vectors; ICW3 defines the identity for multi-PIC systems; and ICW4 sets modes such as automatic end-of- or buffered operation. For runtime management, the Operation Command Words (OCWs) provide three 8-bit registers: OCW1 loads the IMR for masking; OCW2 issues commands like end-of- to update the ISR; and OCW3 handles status reads of the IRR and ISR, as well as special masking modes. These registers interact to maintain interrupt state integrity, with the IRR feeding masked requests from the IMR into the priority resolver for selection, and the ISR updating upon acknowledgment to reflect active service. In cascaded configurations, a master PIC connects to slave units via dedicated lines, allowing expansion beyond 8 IRQs; for instance, two cascaded PICs support 16 lines, where the master handles IRQs 0-7 directly and routes 8-15 to the slave, with ICW3 coordinating identities to avoid conflicts. This setup ensures scalable tracking and masking across multiple devices while preserving the read-only nature of status registers like IRR and ISR for reliable monitoring.

Interrupt Processing Flow

When a peripheral device asserts an (IRQ) on one of the input lines (IR0–IR7) of a programmable interrupt controller (PIC), the corresponding bit in the Interrupt Request Register (IRR) is set to indicate the pending request. The PIC's resolver then evaluates the IRR to determine the highest- interrupt based on the programmed scheme, such as fixed where IR0 has the highest and IR7 the lowest. If this has higher than any currently in service and is not masked, the PIC asserts the INT signal to the CPU, prompting it to suspend its current task and handle the . Upon receiving the INT signal, the CPU initiates the interrupt acknowledge sequence by issuing one or more INTA (interrupt acknowledge) pulses, depending on the system architecture. During these INTA cycles, the PIC delivers an 8-bit interrupt vector to the CPU, which the processor uses to index into its (IDT) or equivalent structure to retrieve the address of the (ISR). The highest-priority bit from the IRR is then transferred to the In-Service Register (ISR), clearing the corresponding IRR bit, to track the active interrupt and prevent lower-priority requests from proceeding until resolution. The CPU subsequently jumps to the ISR address and executes the handler code to service the interrupting device. In cascaded configurations, common for expanding beyond eight interrupts, a master PIC connects to up to eight slave PICs via its cascade lines (CAS0–CAS2), with the slaves' INT outputs wired to the master's IR inputs (typically IR2). When an interrupt from a slave is selected, the master issues additional INTA signals to enable the specific slave, which then provides its vector; vectors from slaves are offset (e.g., 0x08–0x0F for the first slave in x86 systems) to distinguish them from the master's (0x00–0x07). End-of-interrupt (EOI) commands must be issued to both the slave and master to fully clear the ISR chain. Interrupt processing concludes when the ISR handler issues an EOI command to the via specific control words, clearing the corresponding ISR bit and re-enabling lower-priority interrupts. In auto-EOI mode, the ISR bit is automatically cleared at the final INTA pulse, simplifying software but limiting nesting options as it allows immediate re-interruption by the same or higher-priority sources. For nested interrupts, higher-priority requests can interrupt a lower-priority handler in fully nested mode, with the updating the ISR accordingly while inhibiting equals or lowers until EOI. Spurious interrupts, often due to noise or short pulses on IRQ lines, are detected if no ISR bit is set after vector delivery; the may default to the IR7 level (the lowest priority) but requires to ignore invalid ones.

Key Features

Priority Management

Programmable interrupt controllers (PICs) manage multiple interrupt sources by assigning priorities to ensure the CPU handles the most critical requests first. This involves logic that evaluates pending interrupts and selects the highest- one for processing, preventing system overload and maintaining orderly execution. In typical PIC designs, such as the 8259A, interrupts are organized into fixed levels, with IRQ0 designated as the highest priority and IRQ7 as the lowest in the default configuration. PICs support several priority modes to accommodate different . Fixed (or hard) mode uses a static , where interrupt requests are resolved strictly by their assigned level, ensuring predictable behavior for time-sensitive applications. Rotating mode cycles the highest among interrupts after servicing, promoting fairness by preventing any single source from dominating; this can be automatic or specific, where software sets the rotation point. Specific (software-defined) allows dynamic reassignment through commands like the special mask mode, enabling selective prioritization during . In the 8259A, the default fixed is reprogrammed using Operation Command Word 2 (OCW2) for or end-of-interrupt adjustments. Priority resolution occurs via an internal priority resolver and encoder logic, which automatically selects the highest-priority from the Interrupt Request Register (IRR) during contention and latches it into the In-Service Register (ISR) upon acknowledgment. This hardware mechanism supports nested interrupts, where a higher-priority request can a lower one if the interrupt mask permits, allowing urgent events to interrupt ongoing service routines. Advanced PIC variants, such as the x86 (APIC), extend this to 16 priority classes derived from the upper 4 bits of the interrupt vector (0-255), with resolution comparing the interrupt's class against the value in the Task Priority Register (TPR) to enable scalable handling in multiprocessor environments. In systems, effective priority management is crucial to ensure low-priority interrupts do not starve under frequent high-priority activity; rotating modes mitigate this by equalizing access over time, while fixed modes prioritize determinism for hard constraints. The priority encoder logic within the PIC dynamically evaluates the IRR to output the of the highest active bit, facilitating rapid resolution without software intervention and supporting bounded essential for responsive operation.

Triggering and Acknowledgment Mechanisms

Programmable interrupt controllers (PICs) detect incoming interrupts through configurable trigger mechanisms that determine how interrupt requests (IRQs) from peripherals are recognized. In edge-triggered mode, the PIC responds to a low-to-high transition (rising edge) on an input pin, requiring the signal to remain high until the first interrupt acknowledge (INTA) pulse to ensure detection. This mode is suitable for simple peripherals that generate short pulses, such as keyboards or basic timers, as it filters noise and avoids continuous signaling. However, edge triggering carries a risk of lost interrupts if the pulse is too brief or if multiple devices share the line without proper latching, potentially missing subsequent edges while the line remains asserted. In contrast, level-triggered activates on a sustained high level on the input pin, without relying on , and the signal must be deasserted before the end-of- (EOI) command to prevent re-ing. This approach is advantageous for wired-OR bus configurations, where multiple devices can share an by collectively holding it high, ensuring all requests are acknowledged until cleared. The is selected during initialization using bit 3 (LTIM) of the Initialization Command Word 1 (ICW1), with LTIM=0 for and LTIM=1 for level. To control interrupt delivery, PICs employ masking mechanisms that inhibit specific requests without altering their generation. The Interrupt Mask Register (IMR), programmed via Operation Command Word 1 (OCW1), allows individual IRQs to be masked by setting corresponding bits to 1, preventing the request from propagating to the CPU while still latching it internally if edge-triggered. Additionally, a global mask can be applied through the CPU's (e.g., via CLI/ instructions in x86), blocking all interrupts system-wide regardless of IMR settings. Acknowledgment of an interrupt service completion occurs via EOI commands issued by software to clear the in-service (IS) status and re-enable lower-priority interrupts. In specific EOI mode, an OCW2 command targets and clears the exact IRQ's IS bit using a priority level code, which is essential when the default priority nesting is disrupted, such as in non-nested operation. Non-specific EOI, also via OCW2, automatically clears the highest-priority pending IS bit without specifying the level, simplifying handling in fully nested priority modes where the active interrupt is always the highest. Auto-EOI mode, enabled by bit 1 (AEOI) in ICW4, automatically resets the IS bit upon the final INTA cycle (second for 8086 systems or third for 8080/8085), reducing software overhead but potentially allowing re-interrupts from the same source before full servicing.

Notable Implementations

Intel 8259 PIC

The Intel 8259 Programmable Interrupt Controller (PIC) is an integrated circuit designed to handle up to eight vectored priority interrupts for microprocessors, including the Intel 8080/8085 and 8086 families. It features eight interrupt request inputs labeled IR0 through IR7, which correspond to IRQ0-IRQ7 in typical x86 implementations, allowing prioritization and queuing of interrupt signals from peripheral devices. The chip is housed in a 28-pin dual in-line package (DIP) or plastic leaded chip carrier (PLCC) and operates on a single 5V ±10% power supply, with the INT output pin enabling cascading to connect a master to up to eight slave units via dedicated CAS0-CAS2 lines—for expanded interrupt capacity reaching 64 levels. Introduced in the late , the original 8259 was followed by the 8259A variant in , which provided enhanced performance through faster access times and additional operating modes, such as buffered mode for improved system throughput and level-triggered interrupt support, while remaining fully upward compatible with existing 8259 software. The 8259A became the dominant version, with its functionality later integrated into compatible controller chips, including those embedded in devices that consolidate legacy peripherals like serial ports and floppy controllers while maintaining 8259 interrupt handling for . The served as the standard interrupt management solution in x86 personal computers from the IBM PC's debut in through the , often deployed in a master-slave pair to manage 16 total interrupts (IRQ0-IRQ15). In this configuration, the master PIC handles IRQ0-IRQ7 and routes slave interrupts via its IR2 input, with interrupt vectors programmable via an offset—typically set to 08h-0Fh for the master (resulting in vectors 08h through 0Fh) and 70h-77h for the slave to avoid overlap with processor exceptions. Despite its pioneering role, the 8259 has inherent limitations, including support for only eight interrupts per chip and reliance on fixed 8-bit vector sizes optimized for early 16-bit x86 architectures, which proved insufficient for the demands of multitasking or multi-core systems. These constraints rendered it obsolete for modern hardware by the mid-1990s, though its behavior continues to be emulated in environments, such as , using two cascaded 8259 instances to ensure compatibility with legacy x86 operating systems and applications.

Advanced Programmable Interrupt Controller (APIC)

The Advanced Programmable Interrupt Controller (APIC) represents a significant evolution in interrupt management for x86 architectures, designed to address the limitations of earlier controllers in multiprocessor environments. Introduced by with the processor family in 1994, the APIC architecture integrates a local APIC within each core to handle core-specific interrupts, such as timers and errors, while an external I/O APIC manages interrupts from peripherals and routes them across the system. This dual-component design supports up to 256 interrupt vectors (numbered 0 to 255), with vectors 0-31 reserved for CPU exceptions and the remainder available for general-purpose interrupts, enabling efficient handling in complex systems. Key features of the APIC include robust support for (SMP), allowing interrupts to be distributed dynamically across multiple cores for load balancing. It incorporates (MSI), where devices signal interrupts via memory writes rather than dedicated lines, reducing latency and wiring complexity in high-performance I/O setups. The APIC also provides dynamic priority management through registers like the Task Priority Register (TPR), which allows software to mask lower-priority interrupts, and interrupt affinity controls that route specific interrupts to designated cores using physical or logical destination modes in the Interrupt Command Register (ICR). These capabilities facilitate inter-processor interrupts (IPIs) for and task migration, essential for scalable . The APIC has evolved through variants to accommodate growing system scales. The original xAPIC, implemented starting with processors, uses an 8-bit APIC ID for up to 255 processors and relies on memory-mapped I/O for , typically at FEE00000H for the local APIC. In post- x86 systems, the APIC largely replaces the legacy 8259 , providing enhanced scalability for multiprocessor while maintaining when disabled. The x2APIC extension, specified by in 2006 and first implemented in Nehalem-based processors around 2009, expands to a 32-bit APIC ID supporting up to 4 billion logical processors and shifts access to Model-Specific Registers (MSRs) for improved efficiency in large-scale systems, while retaining the 256-vector limit. This memory-mapped and MSR-based approach enables precise IPI handling, such as startup sequences for application processors in SMP boot processes.

Programming and Configuration

Initialization Process

The initialization of a programmable interrupt controller (PIC) occurs during system boot or reset, establishing its operational mode, interrupt vectoring, and cascading configuration to ensure proper interrupt handling thereafter. This one-time setup is critical, as incomplete or erroneous programming can lead to , such as ignored interrupts or system instability. In general, the process begins with writing a series of initialization commands to dedicated registers, typically via I/O ports or memory-mapped I/O, to configure core parameters like trigger sensitivity and vector offsets. Commands must be issued sequentially with precise timing— for instance, a minimum interval of 500 between writes to avoid . These commands select between - or level-triggered modes, enable single or cascaded operation for multi-PIC setups, and specify buffer modes to optimize in cascaded configurations. For the Intel 8259 , initialization requires four Initialization Command Words (ICWs) written to the control word register. ICW1 initiates the process, setting the ( or level triggering via the LTIM bit, single or via SNGL), and indicating whether ICW4 is needed. ICW2 defines the vector base , such as 20h for the master in typical x86 systems. ICW3 assigns slave IDs in cascaded setups (e.g., the master identifies connected slaves via bit patterns), and ICW4 configures additional options like trigger type for specific microprocessors, auto-end-of-interrupt (AEOI) , and buffer enablement for cascaded operation. This full sequence programs the for immediate use post-boot. In contrast, the (APIC) uses memory-mapped I/O for initialization, with the bootstrap handling setup for local APICs on each core and I/O APICs for device routing. The sequence starts by verifying APIC presence via , mapping registers to the base address FEE00000h, and enabling the local APIC by writing to the Spurious Vector (SPIV) at F0h to set the enable bit and spurious vector. Key registers like the APIC ( 20h, read-only post-reset) and Version ( 30h) are read to confirm , while Local Vector Table entries are programmed for , , and interrupts. For I/O APICs, Redirection Table Entries are configured to route s to specific local APICs, often in physical destination mode at boot. This memory-mapped approach supports scalable multi- systems but requires uncacheable memory type mapping to prevent coherency issues. Omitting steps, such as enabling the APIC or properly setting vectors, can result in misrouting or shutdowns.

Runtime Interrupt Handling

When a programmable interrupt controller (PIC) signals an to the CPU, the processor automatically saves its current state, including the and flags, before fetching the from the PIC during the acknowledgment cycles. For the 8259A PIC, this involves two or three INTA (interrupt acknowledge) pulses from the CPU, during which the PIC provides an 8-bit to the data bus, directing the CPU to jump to the corresponding service routine () in . The ISR then executes the necessary handler code for the interrupting device. Upon completing the interrupt processing, the must issue an end-of-interrupt (EOI) command to the to acknowledge resolution and clear the corresponding bit in the in-service (), allowing subsequent interrupts of equal or lower to be processed. For non-specific EOI in the 8259A, software writes to the control port (typically 0x20h for the master ) with the command byte 0x20, which automatically clears the highest- bit in the without specifying the level. Specific EOI requires a command byte with the level bits set (e.g., 0x60 for level 0), useful in non-nested modes or for targeted clearing. Failure to issue an EOI leaves the bit set, potentially causing a system lockup by blocking further interrupts from the same or lower levels. During runtime, software can interact with the PIC's status by polling the ISR or interrupt request register (IRR) using operation command word 3 (OCW3); for instance, writing 0x0Bh to the command port reads the ISR via input from the data port, enabling the handler to check for active interrupts. Nested interrupts are managed through the PIC's scheme, where a higher- interrupt request can preempt a lower one if the enable (IF) is set and the current service level allows it, with the original ISR resuming after the nested handler issues its EOI. To support dynamic adjustments, OCW2 enables commands like rotation on non-specific EOI (e.g., command byte 0xA0 rotates the after clearing), which reassigns the highest to the next interrupt in sequence, optimizing for handling in systems. ISR design emphasizes minimizing by performing only essential operations, such as device-specific reads or writes, before issuing EOI to avoid delaying higher- events. In the Advanced Programmable Interrupt Controller (APIC), runtime handling builds on similar principles but integrates more directly with the CPU. Upon delivery via the local APIC's INTR output, the CPU saves state and fetches the from the APIC's local table or I/O APIC . The ISR processes the and signals completion by writing any value (typically 0) to the APIC's EOI at offset 0xB0 in the local APIC memory-mapped space, which clears the highest-priority bit in the 256-bit ISR and updates the processor-priority (PPR) to potentially unblock lower-priority . This write broadcasts an EOI message on the APIC bus for level-triggered , ensuring proper acknowledgment across the system. The APIC supports focused delivery modes for inter-processor (IPIs), where software programs the command (ICR) to target specific logical processors using physical or modes, enabling efficient synchronization in multi-core environments without broadcasting to all CPUs. Nested in APIC are governed by the task-priority (TPR), where software raises the TPR during critical sections to lower-priority , and the ISR must lower it appropriately before EOI to restore eligibility for nesting. Omitting the EOI write keeps the in the ISR, preventing delivery of same-priority events and risking in priority-based arbitration. APIC ISRs prioritize low-latency designs, often using minimal context saves and fast I/O operations to comply with the 14-cycle EOI broadcast timing for bus-based systems.

Modern Evolutions

Integration in x86 Systems

In x86 systems, the (APIC) architecture is deeply integrated into the , with the local APIC (LAPIC) embedded within each CPU core and the I/O APIC (IOAPIC) typically incorporated into the southbridge or , such as Intel's I/O Controller Hub (ICH) series. This split design allows the IOAPIC to manage external interrupts from peripherals via the , routing them to appropriate LAPICs for multi-processor delivery. In virtualized environments, hypervisors like emulate or virtualize APIC components to enable guest operating systems to handle interrupts transparently, supporting features like virtual interrupt delivery without direct hardware access. Legacy support for the original 8259 Programmable Interrupt Controller () persists through emulation in the or , ensuring compatibility with older operating systems and devices that rely on traditional IRQ lines. However, since around 2010, the x2APIC extension has become the standard in and x86 CPUs, expanding the APIC ID space to 32 bits for systems with hundreds of cores and improving interrupt scalability in multi-socket configurations. For PCIe devices, Extended (MSI-X) is the preferred mechanism over INTx signaling, as it enables devices to generate interrupts directly as memory writes, reducing latency and avoiding shared IRQ lines in high-bandwidth environments. Post-2020 developments have further refined APIC integration, particularly in Intel's 12th-generation processors released in 2021, where enhancements to APIC technology (APICv) optimize handling across architectures combining performance (P-cores) and efficiency (E-cores). These updates include improved delivery and task priority shadowing to better distribute interrupts in heterogeneous core layouts, enhancing overall system responsiveness. Additionally, security mitigations such as retpoline address speculative execution vulnerabilities like Variant 2, which can indirectly impact delivery by poisoning branch predictors in paths, requiring updates and modifications for safer indirect branching. Despite these advances, challenges remain in interrupt management, particularly IRQ sharing among USB controllers and PCI/PCIe devices, where multiple endpoints compete for the same global system interrupt (GSI), potentially leading to contention and reduced performance in dense I/O configurations. ACPI tables, such as the Multiple APIC Description Table (MADT) and Interrupt Routing Tables, facilitate dynamic IRQ remapping by providing the operating system with platform-specific mappings, allowing runtime adjustments to resolve conflicts without hardware reconfiguration.

Implementations in Other Architectures

The ARM Generic Interrupt Controller (GIC) serves as a primary implementation of programmable interrupt management in ARM-based architectures, with versions tailored for scalability in multi-core systems. GICv2, introduced around 2011, supports up to 16 software-generated interrupts (SGIs), 16 private peripheral interrupts (PPIs), and 988 shared peripheral interrupts (SPIs), enabling a total of up to 1020 interrupt sources. It provides 8 priority levels (effectively 0-31 due to grouping in the 8-bit field) and dedicated CPU interfaces for up to 8 cores, facilitating per-core interrupt distribution and acknowledgment. GICv3, released in 2013, extends these capabilities with full 256 priority levels (0-255), support for more than 1020 interrupt IDs including message-signaled interrupts, and affinity routing for unlimited cores, while maintaining per-core redistributor interfaces for localized handling. GICv4, building on GICv3 with its initial specification released in 2015 and updates through 2022, introduces enhanced virtualization via direct injection of virtual interrupts into guest systems, reducing hypervisor overhead through isolated virtual CPU interfaces. In architectures, the Platform-Level Interrupt Controller (PLIC) handles shared across multiple cores, supporting 1 to 1023 sources with configurable priorities where higher values indicate greater urgency and ties resolved by lower ID numbers. It enables per-target activation through memory-mapped registers for up to 15,872 contexts (covering hart privilege modes), allowing precise routing in multi-core environments without fixed limits on core count. Complementing the PLIC, the Core-Local Interrupt Controller (CLIC) provides low-latency handling with up to 4096 per hart, 256 priority levels (0-255), and configurable vectoring, where each hart maintains an independent instance for multi-core scalability and per-target enabling via CSRs and registers. The employs a Core Interrupt Controller integrated into the , supporting 6 to 8 hardware interrupt inputs in vectored mode, expandable to 256 via an External Interrupt Controller (EIC) for advanced routing. In multi-core setups, the Global Interrupt Controller distributes up to 256 external sources across up to 63 elements, with configurable , /level , and mapping to non-maskable interrupts or yield qualifiers. For embedded applications, Microchip's implement a basic system using the INTCON for global enabling and flags, handling around 14 peripheral sources such as timers, comparators, and interfaces, though without explicit levels—interrupts are processed sequentially from a single vector at address 0004h. Newer PIC18 variants include a Controller to streamline peripheral requests, mimicking programmable functionality for low-power tasks despite the unrelated naming to general PICs. Post-2020 developments emphasize and efficiency, as seen in the 2022 updates to GICv4, which refine direct virtual interrupt injection for secure guest isolation in cloud and . Trends in system-on-chip () designs for and low-power devices favor distributed interrupt controllers, such as scalable GIC variants, to enable per-cluster routing and , reducing latency in battery-constrained environments like sensors and wearables. Compared to the x86 (APIC), which limits vectors to 255 and relies on local/I-O APIC pairs for up to 255 priorities, ARM's GIC offers greater interrupt capacity (up to 1024+), native affinity for core targeting, and integrated security states, prioritizing and multi-chiplet scalability over x86's focus on legacy compatibility.

References

  1. [1]
    [PDF] 8259A PROGRAMMABLE INTERRUPT CONTROLLER ... - PDOS-MIT
    The Intel 8259A Programmable Interrupt Controller handles up to eight vectored priority interrupts for the CPU. It is cascadable for up to 64 vectored priority ...
  2. [2]
    Cortex-A9 MPCore Technical Reference Manual r4p1
    ### Summary of ARM Generic Interrupt Controller (GIC) from Cortex-A9 MPCore Technical Reference Manual
  3. [3]
    AXI Interrupt Controller - AMD
    The LogiCORE™ IP AXI Interrupt Controller (AXI INTC) core concentrates multiple interrupt inputs from peripheral devices to a single interrupt output to the ...Missing: Programmable | Show results with:Programmable
  4. [4]
    [PDF] Understanding the Integrated Programmable Interrupt Controller (IPIC)
    The purpose of the integrated programmable interrupt controller (IPIC) is to receive interrupt requests from the peripheral modules of a microcontroller ...
  5. [5]
    [PDF] AVR1305: XMEGA Interrupts and the Programmable Multi-level ...
    Microcontrollers use interrupts to prioritize between the tasks and to ensure that certain peripheral modules are serviced fast. Further, interrupts can be ...Missing: explanation | Show results with:explanation
  6. [6]
    Exception types - Cortex-M0+ Devices Generic User Guide
    A Non-Maskable Interrupt (NMI) can be signalled by a peripheral or triggered by software. This is the highest priority exception other than reset.
  7. [7]
    Intel 8259 - EPFL Graph Search
    The 8259 was introduced as part of Intel's MCS 85 family in 1976. The 8259A was included in the original PC introduced in 1981 and maintained by the PC/XT when ...
  8. [8]
    Pardon the Interruption... A Brief History of Interrupts
    May 21, 2024 · A history of interrupts on Intel x86 systems, including 8259A, APIC, IO-APIC, NMI , INT, and IRQ.
  9. [9]
    The i8259 Programmable Interrupt Controller - Davmac.org
    The Intel i8259A Programmable Interrupt Controller (PIC), AKA "Legacy PIC", is the IC used as the interrupt controller for the original IBM PC and later ...
  10. [10]
    What is the main function of the Southbridge on the motherboard?
    Mar 14, 2018 · The Southbridge was a seperate chip which handled slower I/O devices such as USB, Audio, Ethernet, SATA/IDE and PCI addon cards compared to ...
  11. [11]
    Programmable Interrupt Controller - an overview - ScienceDirect.com
    The APIC has replaced the use of 8259 PIC in most use cases, but the 8259 PIC still exists on all platforms and is often used by older operating systems. The ...
  12. [12]
    [PDF] MultiProcessor Specification - UT Computer Science
    May 12, 1997 · The following sections describe the APIC architecture and the three interrupt modes allowed in an MP-compliant system. 3.6.1 APIC Architecture.
  13. [13]
    How many 8259A chips do processors have? - Quora
    Apr 17, 2017 · None. In the distant past, the early PCs like the PC-XT had a single Intel 8259A Programmable Interrupt Controller (PIC) on-board.<|control11|><|separator|>
  14. [14]
    [PDF] Intel® 64 and IA-32 Architectures Software Developer's Manual
    NOTE: The Intel® 64 and IA-32 Architectures Software Developer's Manual consists of ten volumes: Basic Architecture, Order Number 253665; Instruction Set ...Missing: keyboard | Show results with:keyboard
  15. [15]
    New Interrupt Architecture Supports Multiprocessing - halfhill.com
    It supersedes the 8259A, which made its debut in 1978 and is found in almost all PC compatibles. The 8259A has no support for multitasking or multiprocessing, ...Missing: variants | Show results with:variants
  16. [16]
    [PDF] SIO10N268 - Microchip Technology
    Jan 19, 2016 · The SIO10N268 is a 3.3V operational (5.0V tolerant), PC 99/2001, and ACPI 1.0 compliant Super I/O Controller. This device includes ...<|separator|>
  17. [17]
    Emulated and synthetic hardware specification for Windows Server ...
    Dec 26, 2023 · Windows Server 2012 Hyper-V makes emulated and synthetic devices available to the virtual machines. ... Two cascaded 8259 programmable interrupt ...
  18. [18]
    [PDF] Volume 3 (3A, 3B, 3C & 3D): System Programming Guide - Intel
    This is Volume 3 of the Intel 64 and IA-32 manual, a System Programming Guide, part of a four-volume set.
  19. [19]
    [PDF] Intel® 64 and IA-32 Architectures Software Developer's Manual
    NOTE: The Intel® 64 and IA-32 Architectures Software Developer's Manual consists of nine volumes: Basic Architecture, Order Number 253665; Instruction Set ...
  20. [20]
    29.1. IO-APIC - The Linux Kernel documentation
    IO-APIC, which is an enhanced interrupt controller. It enables us to route hardware interrupts to multiple CPUs, or to CPU groups.
  21. [21]
    [PDF] Software and Hardware Techniques for x86 Virtualization - VMware
    For CPUs without hardware support for APIC virtualization, the order for 32-bit Windows guest operating systems is: HV-hwMMU, followed by BT-swMMU, followed ...
  22. [22]
    xAPIC Deprecation Plan - Intel
    Sep 18, 2025 · The APIC architecture, which was introduced in Pentium 4 processors, is now referred to as the xAPIC architecture. The second generation of APIC ...Missing: date | Show results with:date
  23. [23]
    [PDF] Intel 64 Architecture x2APIC Specification - Washington
    APIC. The set of advanced programmable interrupt controller features which may be implemented in a stand-alone controller, part of a system chipset, or in a ...
  24. [24]
    4. The MSI Driver Guide HOWTO — The Linux Kernel 5.10.0-rc1+ ...
    The MSI-X capability was also introduced with PCI 3.0. It supports more interrupts per device than MSI and allows interrupts to be independently configured.
  25. [25]
    Hybrid Architecture (code name Alder Lake) - Intel
    This CPU architecture leverages two distinct types of cores: Performance-cores and Efficient-cores. This multicore solution is optimized for many workload types ...
  26. [26]
    Retpoline: A Branch Target Injection Mitigation - Intel
    Aug 22, 2022 · Retpoline is a hybrid approach since it requires updated microcode to make the speculation hardware behavior more predictable on some processor models.
  27. [27]
    Plug-and-Play-HOWTO: Interrupt Sharing and Interrupt Conflicts
    Interrupt sharing occurs when multiple devices use the same interrupt line. Interrupt conflict happens when devices try to use the same IRQ, often causing the ...
  28. [28]
    5. ACPI Software Programming Model - UEFI Forum
    ACPI defines a hardware register interface that an ACPI-compatible OS uses to control core power management features of a machine.
  29. [29]
    Arm® Generic Interrupt Controller Architecture version 2.0
    ARM Generic Interrupt Controller Architecture version 2.0 - Architecture Specification. This document is only available in a PDF version.
  30. [30]
    Arm Generic Interrupt Controller (GIC) Architecture Specification, v3 ...
    This specification describes the Arm Generic Interrupt Controller (GIC) architecture. It defines versions 3.0, 3.1, 3.2, 3.3 (GICv3), 4.0, 4.1, ...Missing: GICv2 | Show results with:GICv2
  31. [31]
    [PDF] RISC-V Core-Local Interrupt Controller (CLIC) Version 0.9-draft ...
    The Core-Local Interrupt Controller (CLIC) is designed to provide low-latency, vectored, pre-emptive interrupts for RISC-V systems. When activated the CLIC ...
  32. [32]
    [PDF] Global Interrupt Controller - MIPS
    The GIC distributes interrupts between processor elements, handles up to 256 external sources, and allows any processor element to interrupt another.Missing: specification | Show results with:specification
  33. [33]
    [PDF] Section 8. Interrupts - Microchip Technology
    The INTCON register contains these interrupts: INT Pin Interrupt, the RB Port Change Interrupt, and the TMR0 Overflow Interrupt. The INTCON register also ...
  34. [34]
    Vectored Interrupt Controller Overview - Microchip Developer Help
    Nov 10, 2023 · The Vectored Interrupt Controller (VIC) module, found on the latest PIC18F family microcontroller devices, reduces the numerous peripheral interrupt request ...Missing: architecture | Show results with:architecture
  35. [35]
  36. [36]
    MSI (Message Signaled Interrupts): Architecture Implementation in ...
    May 15, 2025 · This article provides a comprehensive overview of MSI implementation across both Intel x86 and ARM architectures, with specific focus on the ...