■ Interrupt Source
Device產生interrupt方式通常有兩種,一種為透過I/O APIC的IRQ Pin,另一種為MSI/MSI-X。
Message Signaled Interrupt(MSI) :
下圖為MSI 原始的address和data register format,那如何產生MSI呢?就是將Data寫到Address range為FEEx_xxxxh的位置之後,device就會產生MSI。
I/O APIC:
一般系統上有I/O APIC hardware的話,device INTA,B,C,D#其中一個pin會連接到I/O APIC的IRQ Pin,這時後device可以透過assert IRQ Pin來request I/O APIC產生中斷,I/O APIC會根據IRQ Pin的號碼來查詢對應的Redirection Table Entry(RTE),接著使用RTE裡面的資訊來發出interrupt往CPU送。下圖為RTE的原始format。
■ Remappable Format Interrupt
當interrupt remapping eanble的時候,System software會讓interrupt source(device)產生remappable format的interrupt。
Remappable Format MSI:
如下圖所示,可以注意到address[4]會被置為1,表示此interrupt為remappable format,另外新增了幾個field,SHV、Handle、SubHandle欄位
SubHandle Valid(SHV) : 如果這個bit為1,Data register裡的SubHandle就有效,為0則ignore。
Handle : 會被用來計算interrupt index,並且使用這個interrupt index來索引Interrupt Remapping Table Entry(IRTE)。
SubHandle : 當SHV為1時,這個欄位會和handle相加來得到interrupt index。
Remappable Format I/O APIC :
如下圖所示,RTE[48]為1表示為remappable format,裡面直接帶有16 bit的interrupt index,直接使用index來查詢IRTE對應的entry。
■ Interrupt Remapping Table Entries(IRTE)
上述提到Interrupt Remapping hardware使用interrupt index來查詢對應的IRTE來得到原本的資訊,IRTE會由system software allocate一塊memory,並且將這塊memory的base address和size填入Interrupt Remap Table Address register來告之Interrupt Remapping Hardware這塊memory在哪裡。接下來介紹一下各個field的用途。
P(Present) flag: 表示至個entry是否有效,為0則此interrupt cycles會被block。
FPD(Fault Processing Disable) : 置為1表示可以disable error的紀錄和回報,這個和後面章節的fault handling有關。
Destination Mode : Destination mode表示在這個IRTE裡面所記錄的Destination ID是Physical還是logical。
Redirection Hint(RH) : Redirection Hint決定這個interrupt會被導向哪個CPU。
Trigger Mode : 表示interrupt是edge trigger或者是level trigger。
Delivery Mode :則是表示現在interrupt的是哪一種type,000: Fixed, 010: SMI, 100: NMI, 101: INIT, 110: Reserved, 111: ExtINT。
Source ID(SID) : 就是interrupt的來源是哪裡,通常表示PCI-E device的Bus,device和function number。
Source ID Qualifier(SQ) : 表示Hardware會拿Entry裡面的Source ID和Interrupt request的source ID來做比對。
Source Validation Type (SVT) : 比對Source ID的方式,詳細請參考spec
Reference: Intel® Virtualization Technology for Directed I/O
沒有留言:
張貼留言