2019年3月26日 星期二

原理Intel Virtualization Technology for Directed I/O(VT-d) for Interrupt Remapping

接續著上一篇文章淺談Virtualization Technology for Directed I/O(VT-d) for DMA Remapping,接下來介紹對於interrupt remapping hardware是如何運作。



■ 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,SHVHandleSubHandle欄位

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。

Vector : Interrupt vector number,用來尋找對應的interrupt service routine(ISR)。

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

沒有留言:

張貼留言

解析 NVM Express - 透過Linux OS 解析M.2 NVMe SSD

在之前,我撰寫了三篇有關NVMe的文章 ,分別是" 原理NVM Express - NVMe Submission Queue & Completion Queue (SQ & CQ) "、" 原理NVM Express - Admi...