安全之安全(security²)博客目录导读
本博客介绍了SMMUv3的编程接口:
• SMMU寄存器
• 流表(Stream table)
• CD(Context Descriptor)
• 事件队列(Event queue)
• 命令队列(Command queue)
大部分配置存储在内存结构中,因此软件必须为这些结构分配内存。然而,部分配置存储在SMMU寄存器中,例如每个结构的地址和大小。
4.1 SMMU寄存器
下图显示了SMMU寄存器映射页面(map pages)。
SMMU寄存器占用了两个连续的64K页面,分别为SMMU寄存器页面0和SMMU寄存器页面1,这是架构上要求的。此外,可能还存在额外的页面,用于可选功能或实现定义(IMPLEMENTATION DEFINED)特性:
• 如果支持VATOS接口,则会有一个64KB页面,包含VATOS寄存器。
• 如果支持安全VATOS接口,则会有一个64KB页面,包含S_VATOS寄存器。
• 如果支持增强命令队列接口,则可能会存在一个或多个命令队列控制页面。
• 如果支持安全状态下的增强命令队列接口,则可能会存在一个或多个安全命令队列控制页面。
• 可能会存在任何数量的实现定义页面。
对于具有RME(Root Management Extensions)的SMMU,会添加一个仅在根物理地址(Root PA)空间中可访问的根控制页面。其基地址与其他物理地址空间中可访问的寄存器的地址不同。
对于具有RME DA(Domain Addressing)的SMMU,会添加两个连续的64K领域寄存器页面(Realm Register Pages),即领域寄存器页面0和领域寄存器页面1,它们仅在领域和根物理地址空间中可访问。
领域寄存器页面0的基地址 = SMMU寄存器页面0的基地址 + 0x20000 + (SMMU_ROOT_IDR0.BA_REALM * 0x10000)。
SMMU寄存器页面0中的寄存器分为:
• 非安全寄存器,SMMU_*,起始偏移地址为0x0
• 安全寄存器,SMMU_S_*,起始偏移地址为0x8000
相应的领域寄存器,SMMU_R_*,位于领域寄存器页面0中。
大多数寄存器集是相同的,但在不同的安全状态下,相同的寄存器可能会有不同的地址偏移。例如:
- SMMU_CMDQ_BASE
偏移地址0x90,在SMMU寄存器页面0中,设置非安全命令队列的基地址。 - SMMU_S_CMDQ_BASE
偏移地址0x8090,在SMMU寄存器页面0中,设置安全命令队列的基地址。 - SMMU_R_CMDQ_BASE
偏移地址0x90,在领域寄存器页面0中,设置领域命令队列的基地址。
除了用于数据结构的寄存器外,还有其他寄存器用于控制SMMU的其他功能:
• 标识字段,报告已实现的功能
• 顶层控制,例如启用SMMU和队列
• 中断配置
• 全局错误报告
• 地址转换操作