Strange IOAPIC vector number and /proc/interrupts in Linux.
Posted: Thu Sep 20, 2018 8:24 pm
I am writing code in Linux (ubuntu 18.04 and ubuntu 16.10) to understand Interrupt handling in X86 Linux.
With a tool, I dumped the registers of IOAPIC in my thinkpad laptop as followings.
To my surprise, the vector number in IOAPIC does not between 0x10 and 0xFE.
At the same time, the /proc/interrupts in Linux shows something like below,
I am trying to understand how the IOAPIC vector is mapped to the CPU core, does it need to go through local APIC to do re-routing?
Or is the vector number in IOAPIC directly delivered to the CPU core?
What are 24 redirection table entries in IOAPIC are used for?
The 1st entry is IRQ0, 2nd entry is IRQ1, 24th entry is IRQ25, is this correct?
Thanks,
-Tao
With a tool, I dumped the registers of IOAPIC in my thinkpad laptop as followings.
Code: Select all
[14508.865716] RT Entry 1 : 0001000000000001
[14508.865721] Dest : 00
[14508.865725] EDID : 01
[14508.865729] Mask : not masked
[14508.865733] Trigger mode : edge
[14508.865736] Remote IRR mode: 0
[14508.865740] Polarity : active high
[14508.865744] Delivery status: idle
[14508.865747] Dest mode : physical
[14508.865751] Delivery mode : 000
[14508.865754] vector : 01
[14508.865778] RT Entry 2 : 0003000000000002
[14508.865792] Dest : 00
[14508.865806] EDID : 03
[14508.865821] Mask : not masked
[14508.865833] Trigger mode : edge
[14508.865847] Remote IRR mode: 0
[14508.865859] Polarity : active high
[14508.865871] Delivery status: idle
[14508.865881] Dest mode : physical
[14508.865884] Delivery mode : 000
[14508.865888] vector : 02
[14508.865979] RT Entry 8 : 000f000000000008
[14508.865983] Dest : 00
[14508.865987] EDID : 0F
[14508.865990] Mask : not masked
[14508.865994] Trigger mode : edge
[14508.865997] Remote IRR mode: 0
[14508.866001] Polarity : active high
[14508.866005] Delivery status: idle
[14508.866008] Dest mode : physical
[14508.866011] Delivery mode : 000
[14508.866015] vector : 08
[14508.866035] RT Entry 9 : 0011000000008009
[14508.866039] Dest : 00
[14508.866043] EDID : 11
[14508.866047] Mask : not masked
[14508.866050] Trigger mode : level
[14508.866054] Remote IRR mode: 0
[14508.866057] Polarity : active high
[14508.866072] Delivery status: idle
[14508.866086] Dest mode : physical
[14508.866101] Delivery mode : 000
[14508.866115] vector : 09
[14508.866171] RT Entry12 : 001700000000000c
[14508.866175] Dest : 00
[14508.866179] EDID : 17
[14508.866183] Mask : not masked
[14508.866187] Trigger mode : edge
[14508.866190] Remote IRR mode: 0
[14508.866194] Polarity : active high
[14508.866197] Delivery status: idle
[14508.866201] Dest mode : physical
[14508.866205] Delivery mode : 000
[14508.866208] vector : 0c
[14508.866269] RT Entry16 : 001f00000000a010
[14508.866282] Dest : 00
[14508.866296] EDID : 1F
[14508.866308] Mask : not masked
[14508.866312] Trigger mode : level
[14508.866315] Remote IRR mode: 0
[14508.866319] Polarity : active low
[14508.866323] Delivery status: idle
[14508.866327] Dest mode : physical
[14508.866330] Delivery mode : 000
[14508.866333] vector : 10
[14508.866433] RT Entry23 : 002300000000a017
[14508.866438] Dest : 00
[14508.866441] EDID : 23
[14508.866445] Mask : not masked
[14508.866449] Trigger mode : level
[14508.866453] Remote IRR mode: 0
[14508.866465] Polarity : active low
[14508.866475] Delivery status: idle
[14508.866479] Dest mode : physical
[14508.866482] Delivery mode : 000
[14508.866486] vector : 17
At the same time, the /proc/interrupts in Linux shows something like below,
Code: Select all
CPU0 CPU1 CPU2 CPU3
0: 23 0 0 0 IO-APIC 2-edge timer
1: 13 0 471 0 IO-APIC 1-edge i8042
8: 1 0 0 0 IO-APIC 8-edge rtc0
9: 0 0 0 0 IO-APIC 9-fasteoi acpi
12: 20 0 2144 0 IO-APIC 12-edge i8042
14: 0 0 0 0 IO-APIC 14-edge ata_piix
15: 0 0 0 0 IO-APIC 15-edge ata_piix
Or is the vector number in IOAPIC directly delivered to the CPU core?
What are 24 redirection table entries in IOAPIC are used for?
The 1st entry is IRQ0, 2nd entry is IRQ1, 24th entry is IRQ25, is this correct?
Thanks,
-Tao