MADT: Difference between revisions

From OSDev.wiki
Jump to navigation Jump to search
[unchecked revision][unchecked revision]
Content added Content deleted
No edit summary
Line 79: Line 79:
=== Entry Type 1 : I/O APIC ===
=== Entry Type 1 : I/O APIC ===


This type represents a I/O APIC. The global system interrupt base is the first interrupt number that this I/O APIC handles. You can see how many interrupts it handles using the register by getting the number of redirection entries from register 0x01, as described here http://wiki.osdev.org/APIC#Local_APIC_registers.
This type represents a I/O APIC. The global system interrupt base is the first interrupt number that this I/O APIC handles. You can see how many interrupts it handles using the register by getting the number of redirection entries from register 0x01, as described here http://wiki.osdev.org/APIC#IO_APIC_registers.


{| {{wikitable}}
{| {{wikitable}}

Revision as of 20:57, 4 August 2017

This page is about the ACPI MADT (Multiple APIC Description Table)

MADT

Introduction

The MADT describes all of the interrupt controllers in the system. It can be used to enumerate the processors currently available.

You can look at the length field in the MADT's header to determine when you have read all the entries.

Table Structure

The MADT starts with the standard ACPI table header. The signature is 'APIC'.

Offset (hex) Length Description
00 4 Signature 'APIC'
04 4 Length
08 1 Revision
09 1 Checksum
0a 6 OEMID
10 8 OEM Table ID
18 4 OEM Revision
1c 4 Creator ID
20 4 Creator Revision

After the standard header, the following fields are located.

Offset (hex) Length Description
24 4 Local Controller Address
28 4 Flags (1 = Dual 8259 Legacy PICs Installed)

If bit 1 in the flags field is set then you need to mask all the 8259 PIC's interrupts, but you should probably do this anyway.

After the Flags field, starting at offset 0x2C, the rest of the MADT table contains a sequence of variable length records which enumerate the interrupt devices on this machine. Each record begins with the following header fields.

Offset (hex) Length Description
0 1 Entry Type
1 1 Record Length

Based on the Entry Type field value, the rest of the record layout can be determined.

Entry Type 0 : Processor Local APIC

This type represents a single physical processor and its local interrupt controller.

Offset (hex) Length Description
2 1 ACPI Processor ID
3 1 APIC ID
4 4 Flags (1 = Processor Enabled)

Entry Type 1 : I/O APIC

This type represents a I/O APIC. The global system interrupt base is the first interrupt number that this I/O APIC handles. You can see how many interrupts it handles using the register by getting the number of redirection entries from register 0x01, as described here http://wiki.osdev.org/APIC#IO_APIC_registers.

Offset (hex) Length Description
2 1 I/O APIC's ID
3 1 Reserved (0)
4 4 I/O APIC Address
8 4 Global System Interrupt Base

Entry Type 2 : Interrupt Source Override

This entry type contains the data for an Interrupt Source Override. This explains how IRQ sources are mapped to global system interrupts. For example, IRQ source for the timer is 0, and the global system interrupt will usually be 2. So you could look for the I/O APIC with the base below 2 and within its redirection entries, then make the redirection entry for (2 - base) to be the timer interrupt.

Offset (hex) Length Description
2 1 Bus Source
3 1 IRQ Source
4 4 Global System Interrupt
8 2 Flags

See also