文章目录
基于armv8,SPI中断虚拟化的实现相关重要的寄存器
重要的寄存器
Interrupt Controller List Registers
ICH_LR_EL2, n = 0 - 15
目的:为virtual CPU interface提供中断上下文信息。
state[63:62]:The state of the interrupt:
0b00-Invalid (Inactive).
0b01-Pending.
0b10-Active.
0b11-Pending and active.
HW[61]:
Group[60]:Indicates the group for this virtual interrupt:
0b0-This is a Group 0 virtual interrupt.
0b1-This is a Group 1 virtual interrupt, signaled as a virtual IRQ.
NMI[59]:ndicates whether the virtual priority has the non-maskable property.:
0b0-vINTID does not have the non-maskable interrupt property.
0b1-vINTID has the non-maskable interrupt property.
Priority[55:48]:The priority of this interrupt.
pINTID[44:32]:Physical INTID, for hardware interrupts.
vINTID[31:0]:Virtual INTID of the interrupt.
读取:MRS , ICH_LR_EL2
写:MSR ICH_LR_EL2,
Interrupt Controller Virtual Machine Control Register
ICH_VMCR_EL2
目的:使hypervisor能够保存和恢复GIC状态的虚拟机视图。原文-Enables the hypervisor to save and restore the virtual machine view of the GIC state.
VPMR, bits [31:24]:
此字段是ICV_PMR_EL1.Priority的别名。
Virtual Priority掩码。virtual CPU interface.的优先级掩码级别。如果挂起的虚拟中断的优先级高于该字段指示的值,则接口向PE发送虚拟中断信号。
VBPR0, bits [23:21]:
此字段是ICV_BPR0_EL1.BinaryPoint的别名
Group 0的Virtual Binary Point Register。定义优先级值字段拆分为两部分(组优先级字段和子优先级字段)的点。组优先级字段确定Group 0中断抢占,并且如果ICH_VMCR_EL2.VCBPR==1,还确定Group 1中断抢占。
VBPR1, bits [20:18]:
此字段是ICV_BPR1_EL1.BinaryPoint的别名。
Group 1的Virtual Binary Point Register。定义优先级值字段拆分为两部分(组优先级字段和子优先级字段)的点。如果ICH_VMCR_EL2.VCBPR==0,则组优先级字段确定Group 1中断抢占。
VEOIM, bit [9]:
此位是ICV_CTLR_EL1.EOImode的别名。
Virtual EOI模式。控制对中断结束寄存器的写入是否也会停用虚拟中断:
0b0-ICV_ EOIR0_EL1和ICV_。访问ICV_DIR_EL1是不可预测的。
0b1-ICV_ EOIR0_EL1和ICV_。ICV_DIR_EL1提供中断去激活功能。
VCBPR, bit [4]:
此字段是ICV_CTLR_EL1.CBPR的别名。
Virtual Common Binary Point Register。该位的可能值为:
0b0-ICV_BPR1_EL1确定虚拟组1中断的抢占组。
0b1-读取ICV_BPR1_EL1返回ICV_BPR0_EL1加1,饱和为0b111。将忽略对ICV_BPR1_EL1的写入。
VFIQEn, bit [3]:
此位是GICV_CTLR.FIQEn的别名。
启用虚拟FIQ。该位的可能值为:
0b0-Group 0 virtual中断被呈现为virtual IRQ。
0b1-Group 0 virtual中断被呈现为virtual FIQ。
VAckCtl, bit [2]:
此位是GICV_CTLR.AckCtl的别名。
Virtual AckCtl. 该位的可能值为:
0b0-如果最高优先级pending中断是Group 1,则读取GICV_IAR或GICV_HPPIR返回INTID 1022。
0b1-如果最高优先级pending中断是Group 1,则读取GICV_IAR或GICV_HPPIR返回相应中断的INTID。
VENG1, bit [1]:
此位是ICV_IGRPEN1_EL1.Enable的别名。
Virtual Group 1中断启用。该位的可能值为:
0b0-Virtual Group 1中断被禁用。
0b1-Virtual Group 1中断已启用。
VENG0, bit [0]:
此位是ICV_IGRPEN0_EL1.Enable的别名。
Virtual Group 0中断启用。该位的可能值为:
0b0- Virtual Group0中断被禁用。
0b1-Virtual Group 0中断已启用。
Hypervisor Configuration Register
**HCR_EL2 **
目的:为虚拟化提供配置控制,包括定义各种操作是否被捕获到EL2。
HCR_EL2, Hypervisor Configuration Register
AMO, bit [5]:Physical SError interrupt routing.
0b0:
在EL2以下的异常级别执行时,并且EL2在当前安全状态下启用:
- 物理SError中断不会被带到EL2。
- 当HCR_EL2.TGE的值为0时,如果PE使用AArch64在EL2执行,则除非通过SCR_EL3.EA位将物理SError中断路由到EL3,否则不会进行物理SEerror中断。
- 虚拟SError中断被禁用。
0b1:
在任何异常级别执行时,并且EL2在当前安全状态下启用:
- 物理SError中断被带到EL2,除非它们被路由到EL3。
- 当HCR_EL2.TGE的值为0时,则启用虚拟SError中断。
IMO, bit [4]:Physical IRQ Routing.
0b0:
在EL2以下的异常级别执行时,并且EL2在当前安全状态下启用:
- 物理IRQ中断不会被带到EL2。
- 当HCR_EL2.TGE的值为0时,如果PE使用AArch64在EL2执行,则不采用物理IRQ中断,除非它们通过SCR_EL3.IRQ位路由到EL3。
- 虚拟IRQ中断被禁用。
0b1:
在任何异常级别执行时,并且EL2在当前安全状态下启用:
- 物理IRQ中断被带到EL2,除非它们被路由到EL3。
- 当HCR_EL2.TGE的值为0时,则启用虚拟IRQ中断。
FMO, bit [3]:Physical FIQ Routing.
0b0:
在EL2以下的异常级别执行时,并且EL2在当前安全状态下启用:
•物理FIQ中断不带到EL2。
•当HCR_EL2.TGE的值为0时,如果PE使用AArch64在EL2执行,则不采用物理FIQ中断,除非它们通过SCR_EL3.FIQ位路由到EL3。
•虚拟FIQ中断被禁用。
0b1:
在任何异常级别执行时,并且EL2在当前安全状态下启用:
- 物理FIQ中断被带到EL2,除非它们被路由到EL3。
- 当HCR_EL2.TGE为0时,则启用虚拟FIQ中断。
Distributor Control Register
GICD_CTLR
目的:启用中断和关联路由。
RWP, bit [31]:
寄存器写入挂起。只读。指示寄存器写入是否正在进行:
0b0-没有正在进行的寄存器写入。先前寄存器写入受影响寄存器字段的影响对GIC体系结构的所有逻辑组件(包括CPU interfaces)都是可见的。
0b1-正在进行寄存器写入。由于更改的影响仍在传播,因此不能保证以前对受影响寄存器字段的寄存器写入的影响对GIC体系结构的所有逻辑组件(包括CPU interfaces)都可见。
E1NWF, bit [7]:Enable 1 of N Wakeup Functionality.
0b0-对于1 of N中断,无法选择处于休眠状态的PE。
0b1-可以为1 of N中断,选择休眠的PE,这是由IMPLEMENTATION DEFINED控件确定的。
DS, bit [6]:Disable Security.
0b0-不允许Non-secure访问和修改控制Group 0中断的寄存器。
0b1-允许Non-secure访问和修改控制Group 0中断的寄存器。
ARE_NS, bit [5]:Affinity Routing Enable, Non-secure state.
0b0-Affinity routing disabled for Non-secure state.
0b1-Affinity routing enabled for Non-secure state.
ARE_S, bit [4]:Affinity Routing Enable, Secure state.
0b0-Affinity routing disabled for Secure state.
0b1-Affinity routing enabled for Secure state.
EnableGrp1S, bit [2]:Enable Secure Group 1 interrupts.
0b0-Secure Group 1中断被禁用。
0b1-Secure Group 1中断已启用。
EnableGrp1NS, bit [1]:Enable Non-secure Group 1 interrupts.
0b0-Secure Group 1中断被禁用。
0b1-Secure Group 1中断已启用。
EnableGrp0, bit [0]:Enable Group 0 interrupts.
0b0-Group 0中断被禁用。
0b1-Group 0中断已启用。
List Registers
GICH_LR, n = 0 - 15
目的:这些寄存器为虚拟CPU interface.提供上下文信息。
HW, bit [31]
指示此虚拟中断是否为硬件中断,这意味着它对应于物理中断。虚拟中断的停用还导致对应于INTID的物理中断的停用:
0b0-此中断完全由软件触发。当虚拟中断被停用时,不会向Distributor发送任何通知。
0b1-硬件中断。当虚拟中断被停用时,会向Distributor发送停用中断请求,使用GICH_LR.pITID来指示物理中断标识符。
Group, bit [30]
指示中断是Group 0还是Group1:
0b0-Group 0 virtual中断。GICV_CTLR.FIQEn确定它是作为虚拟IRQ还是作为虚拟FIQ被发信号通知,并且GICV_CTLC.EnableGrp0使能将该中断发信号通知给虚拟机。
0b1-Group 1 virtual中断,用信号通知为虚拟IRQ。ICV_CTLR.EnableGrp1使能向虚拟机发出该中断的信号。
State, bits [29:28]
中断的状态。此字段具有以下值之一:
0b00-Inactive
0b01-Pending
0b10-Active
0b11-Active and pending
Priority, bits [27:23]
此中断的优先级。
pINTID, bits [19:10]
此字段的功能取决于GICH_LR.HW的值。
当GICH_LR.HW==0时:
- Bit[19]指示中断是否触发EOI维护中断。如果该位为1,则当vINTID标识的中断被停用时,EOI维护中断被断言。
- 位[18:13]被保留,SBZ。
- 如果vINTID字段值对应于SGI(即0-15),则位[12:10]包含请求PE的编号。这出现在GICV_IAR或GICV_AIAR的相应字段中。如果vINTID字段值不是0-15,则此字段必须清除为0。
当GICH_LR.HW==1时:
- 此字段指示hypervisor转发给Distributor的pINTID。此字段只需要实现足够的位来保存ID配置的有效值。
- 如果pINTID的值为0-15或1020-1023,则行为是不可预测的。如果pITID的值为16-31,则该字段应用于与请求去激活的virtual CPU interface相同的PE相关联的PPI。
vINTID, bits [9:0]
当通过GICV_IAR确认中断时,该INTID返回给VM。存储在List registers中的每个有效中断必须具有该virtual CPU interface. 的唯一vINTID。如果vINTID的值是1020-1023。