鐵人賽
建議先觀看之前的文章唷
今天開始介紹 IMSIC,預計會分為五天,每天學習一點,一同了解 IMSIC 是什麼,用途在做什麼,有什麼好處,廢話不多說開始介紹囉!!
IMSIC 全名為 Incoming MSI Controller,每個 hart 會有一個 IMSIC 用來接收傳送進來的 MSI,並且當有 interrupt 需要服務時,會向 hart 發送 signal,當然這前提的條件是 interrupt pending 以及 enabled bit 有被舉起(bit 被設為 1)。
IMSIC 在 machine 的地址空間(address space)有一個或多個 memory-mapped 暫存器用來接收 MSI。除了上述的 memory-mapped 暫存器,軟體亦可通過相關 CSR 與 IMSIC 互動。
下方圖為示意圖:
根據圖片可以發現,IMSIC 是一個接收裝置,有兩種方式可以接收 interrupt ,一種是設備經由 APLIC 將 wire interrupt 轉換成 MSI 再由 IMSIC 接收,而第二種則是,設備直接發送 wire interrupt 由 IMSIC 接收,接收完成後再發送給 target hart。
在 RISC-V 系統中,MSI 不僅可以定向特定的 hart,也可以定向 hart 的 privilege level(像是 machine 或是 supervisor level),另外假設 hart 實現了 hypervisor extension,IMSIC 也可以選擇性的允許 MSI在 virtual supervisor(VS) level 指定到特定 virtual hart。
由於 MSI 可能指向 hart 不同的 privilege level 或 virtual hart,因此每個hart 的 IMSIC 擁有獨立的 interrupt file。假設 hart 實現了 supervisor mode,則它的 IMSIC 至少有兩個 interrupt file,一個用於 machine level,另一個則是 supervisor level。當 hart 也實現了 hypervisor extension 時,IMSIC 也會為 virtual hart 增加格外的 interrupt file 稱之為 guset interrupt file。
IMSIC 為 virtual hart 提供 guest interrupt file 的數量正好是 GEILEN,即由 RISC-V 特權架構定義的hypervisor extension 支援 guest external interrupt 的數量。
interrupt file: 由一個 interrput pending array 和 一個匹配的 interrupt enable array 所組成
每個 interrupt file 是由兩個 bit 位數相同的 array 所組成的,一組用於紀錄已經到達但尚未服務的 MSI(interrupt pending bit),另一組用於指定的 hart 將接受哪些 interrupt(interrupt enable bit),兩組數值的每個 bit 位置對應不同的 interrupt ID。
透過該 interrupt ID 可以在 interrupt file 中區分來自不同來源的 MSI。
由於 IMSIC 是 hart 的 external interrupt controller,所以 interrupt file 的 interrupt ID 成為 external interrupt 的 minor identity(次要 ID)。
每個 interrupt file 支援的 interrupt 數量最小 63 最大 2047。當 interrupt file 支援 N 個不同的interrupt ID 時,有效ID介於 1~N 之間,因此超出此範圍的不執行,數字 0 也不是有效的 interrupt ID。
IMSIC並未假定一個 interrupt file 的 interrupt ID 跟另一個 interrupt file 的 interrupt ID 有任何關係。軟體通常會希望不需要橫跨 interrupt file 就能進行協調,將相同 interrupt ID 分配給不同的interrupt file。
系統中所有的 interrupt file 大小不一定皆相同,machine 以及 supervisor level 的 interrupt file 可能與 guest external interrupt 的 interrupt file 大小不同,不同 hart 的 interrupt file 大小也可能不相同。
一個平台可以為軟體提供 configure 去控制 interrupt file 的數量以及大小,但是建議只賦予 machine level 更改 interrupt file 的權力就好。
建立的標準規範: 設備發送 MSI 的地址或是值皆需對齊 32bit,根據設備或是控制器所遵循的標準,地址可能被限制在較低的 4GB(32 bit) 範圍內,寫入的值可能會被限制在 16bit 的範圍內,較高的 16bit 會保持0。
當 hart 具有 IMSIC 時,來自設備的 MSI 通常直接發送到 target hart(由軟體來選擇),透過 target hart 上的 IMSIC 接收,並儲存在相對應的 interrupt file,將 MSI 指向特定的特權級別或是特定的 virtual hart。MSI 寫 physical address 寫到 target interrupt file,MSI 寫 data 則是將 interrupt ID 寫入到 target interrupt file,最後成為等待處理的 external interrupt minor ID。
透過設備上配置 MSI 的 address 以及 data,軟體可以完全控制
1 和 2是透過 MSI address 對哪個 interrupt file 確定的,3 則是由 MSI data 確定的
當 hypervisor extension 實作且設備由 guest os 管理時,設備的 MSI 地址會是 guest physical address,因為他們是由 guest OS 在設備上配置的,這些 guest 地址必須進行 IOMMU 的轉換,IOMMU 會將這些 MSI 重新導向 interrupt file 獲取正確的 guest external interrupt。
今天介紹 IMSIC 當中具有 interrupt file,interrupt file 又有好幾個不同level,M level、S level、VS level,每個 file 的大小可能不相同。
明天介紹 interrupt priority 以及 memory region。