当前位置: 首页 > news >正文

SMMU软件指南SMMU编程之全局错误和最小配置

安全之安全(security²)博客目录导读

目录

一、全局错误

二、最小配置


一、全局错误

与编程接口相关的全局错误会报告到适当的 SMMU_(*_)GERROR 寄存器,而不是通过基于内存的事件队列。这些错误通常是严重的,例如导致 SMMU 停止向前推进。例如,访问某个配置数据结构时发生的外部中止。以下是所有全局错误的列表:
• 命令队列错误
• 事件队列访问中止(abort),当标记为中止时,事件队列中的传输停止
• PRI 队列访问中止(abort),当标记为中止时,PRI 队列中的传输停止
• CMD_SYNC 消息信号中断(MSI)写入中止(abort)
• 事件队列 MSI 写入中止(abort)
• PRI 队列 MSI 写入中止(abort)(仅限非安全 GERROR)
• GERROR MSI 写入中止(abort)
• SMMU 进入服务失败模式

SMMU_(*_)GERROR 为每个全局错误提供一个位标志。当触发错误条件时,通过切换 GERROR 中相应的标志来激活错误。在某些情况下,当错误处于激活状态时,SMMU 的行为会发生变化。例如,当命令队列错误激活时,命令队列中的命令不会被消费。

当 SMMU_(*_)IRQ_CTRL.GERROR_IRQEN == 1 时,当 SMMU 激活一个不是 GERROR MSI 写入中止的错误时,会触发 GERROR 中断。

二、最小配置

以下序列展示了 SMMU 初始化的最小配置

  1. 分配流表(Stream Table)
    • 为流表分配内存。
    • 通过写入 SMMU_STRTAB_BASE_CFG 配置流表的格式和大小。
    • 通过写入 SMMU_STRTAB_BASE 配置流表的基地址。
    • 通过将每个 STE 的 STE.V 设置为 0,防止未初始化的内存被解释为有效配置,从而将其标记为无效。
    • 通过执行 DSB 操作,确保写入的数据对 SMMU 可见。
    ◦ 如果 SMMU_IDR0.COHACC = 0,表示系统不支持 SMMU 的内存一致性访问。在这种情况下,可能需要额外的步骤,包括数据缓存维护,以确保 SMMU 能观察到写入的数据。

  2. 分配命令队列和事件队列
    • 为命令队列和事件队列分配内存。
    • 通过配置 SMMU_CMDQ_BASE、SMMU_CMDQ_PROD、SMMU_CMDQ_CONS、SMMU_EVENTQ_BASE、SMMU_EVENTQ_PROD 和 SMMU_EVENTQ_CONS 来指定基地址、大小、生产者指针和消费者指针。

  3. 设置访问流表、命令队列和事件队列的内存属性
    • 配置 SMMU_CR1。

  4. 启用事件队列的 IRQ和 GERROR
    • 配置 SMMU_IRQ_CTRL。

  5. 启用命令队列和事件队列
    • 通过将 SMMU_CR0.CMDQEN 位设置为 1 来启用命令队列。
    • 通过轮询 SMMU_CR0ACK,直到 CMDQEN 读取为 1,检查启用操作是否完成。
    • 通过将 SMMU_CR0.EVENTQEN 位设置为 1 来启用事件队列。
    • 通过轮询 SMMU_CR0ACK,直到 EVENTQEN 读取为 1,检查启用操作是否完成。

  6. 使 TLB 和配置缓存结构无效
    • 向命令队列发出命令
    ◦ 要使 TLB 条目无效,确保软件为翻译上下文发出适当的命令。例如,要使非安全 EL1 上下文的 TLB 条目无效,发出 CMD_TLBI_NSNH_ALL 命令;对于 EL2 上下文,发出 CMD_TLBI_EL2_ALL 命令。
    ◦ 要使 SMMU 配置缓存无效,发出 CMD_CFGI_ALL 命令。
    ◦ 要强制所有先前的命令完成,发出 CMD_SYNC 命令。
    • 另外,安全软件可以通过一次写操作使所有 TLB 和缓存无效。
    ◦ 将 SMMU_S_INIT.INV_ALL 设置为 1。
    ◦ 轮询 SMMU_S_INIT.INV_ALL,直到其设置为 0,再继续进行 SMMU 配置。

  7. 启用翻译
    • 将 SMMU_CR0.SMMUEN 位设置为 1。
    • 通过轮询 SMMU_CR0ACK,直到 SMMUEN 读取为 1,检查启用操作是否完成。

【注意】此序列展示了当 SMMU 不实现 RME 扩展,或 GPC 未启用时的非安全 SMMU 编程。安全或领域 SMMU 编程类似。如果 SMMU 实现了 RME 扩展,并且启用了 GPC,根世界运行的软件需要首先初始化 GPT。

http://www.lryc.cn/news/507868.html

相关文章:

  • CPU条件下Pytorch、jupyter环境配置
  • 【自用】通信内网部署rzgxxt项目_01,后端pipeDemo部署(使用nssm.exe仿照nohup)
  • Ubuntu 安装实时内核指南
  • MySQL 主从复制与高可用
  • RCE总结
  • 基于UNITY3D的照片墙演示项目技术分享
  • 随手记:小程序兼容后台的wangEditor富文本配置链接
  • maven项目运行时NoSuchMethodError问题排查记录(依赖冲突解决)
  • ECharts关系图-关系图11,附视频讲解与代码下载
  • 【C语言】动态内存管理:详解malloc和free函数
  • EGO Swarm翻译
  • Linux根目录
  • SAP-SD-参照退货订单补货时带不出行项目
  • 12-C语言单向链表
  • 2024年11月 蓝桥杯青少组 STEMA考试 Scratch真题
  • FFmpeg 4.3 音视频-多路H265监控录放C++开发二十一.2,RTP协议-RTP协议概述,协议详情
  • Linux系统编程——系统内核中的信号
  • delve调试环境搭建—golang
  • shell脚本的循环-----while和for循环
  • 【游戏设计原理】21 - 解谜游戏的设计
  • 【漏洞复现】Wordpress GutenKit 插件 远程文件写入致RCE漏洞复现(CVE-2024-9234)
  • 深度学习任务简介:分类、回归和生成
  • 【测试】Unittest
  • java 根据路径下载文件转换为MultipartFile,并且上传到服务器
  • Onvif服务端开发
  • 【jvm】主要参数
  • 【优选算法】—移动零(双指针算法)
  • PostgreSQL标识符长度限制不能超过63字节
  • 嵌入式硬件面试题
  • 深度解析 OneCode 混合编译:创新驱动的开发变革