首页 > 编程语言 >SMMU软件指南SMMU编程之命令队列

SMMU软件指南SMMU编程之命令队列

时间:2024-12-22 22:03:41浏览次数:11  
标签:SMMU CONS 队列 编程 CMDQ 命令 失效

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


SMMU通过内存中的循环命令队列进行控制。例如,当软件更改STE或翻译时,需要在SMMU中失效相关缓存。这可以通过向命令队列发出相应的失效命令来实现。有关命令类型的详细信息,请参见“命令”部分。

在SMMUv3.3之前,每个安全状态只有一个命令队列。支持SMMUv3.3的SMMU可以选择支持多个命令队列,以减少多个处理器元素(PE)同时向SMMU提交命令时的争用。

SMMU_CMDQ_BASE存储了命令队列的基址和大小。软件在添加新命令之前需要检查命令队列是否有空间。当软件向队列添加一个或多个命令时,会更新SMMU_CMDQ_PROD指针以通知SMMU有新命令可用。随着SMMU处理命令,它会更新SMMU_CMDQ_CONS指针。软件通过读取SMMU_CMDQ_CONS指针确定命令已被消费并释放了空间。

如果SMMU_CMDQ_PROD.WR == SMMU_CMDQ_CONS.RD 且 SMMU_CMDQ_PROD.WR_WRAP != SMMU_CMDQ_CONS.RD_WRAP,则队列已满。

仅更新SMMU_CMDQ_CONS表示命令已被消费,但这可能不意味着命令的效果已可见。CMD_SYNC命令可用于同步。只有当之前命令的效果可见时,它才会被消费。例如:

CMD_TLBI_EL3_ALL
CMD_SYNC

当CMD_SYNC被消费时,可以确保CMD_TLBI_EL3_ALL的效果可见。

一、命令

命令队列中的所有条目均为16字节长,所有命令队列条目均为小端格式。每个命令以一个8位的命令操作码开始。以下列表展示了命令的类别:

  • 预取命令(Prefetch commands:预取翻译或配置。
  • TLB失效命令(TLB invalidation commands:在给定的异常级别中使匹配标签(VMID、ASID、VA或全部)的所有TLB条目失效。
  • 配置缓存失效命令(Configuration cache invalidation commands:使指定范围内的所有配置缓存条目失效(对于STE,范围为StreamID;对于CD,范围为StreamID和SubstreamID)。
  • 同步命令(Synchronization command:为与同步命令在同一命令队列中发布的前置命令提供同步机制。
  • PRI响应命令(PRI response command:当SSV == 1时,通知与StreamID和SubstreamID对应的设备,指示由PRGIndex标识的页请求组已完成,并提供相应的响应。
  • ATC失效命令(ATC invalidation command:使匹配标签(StreamID、SubstreamID、地址范围)的所有ATC条目失效。
  • 挂起恢复/终止命令(Stall resume/termination command:恢复或终止由给定StreamID和STAG参数标识的挂起事务的处理。
  • DPT失效命令(DPT invalidation commands:这些命令从DPT TLB中移除缓存的DPT信息。

有关命令的完整说明,请参阅《Arm System Memory Management Unit version 3》。

标签:SMMU,CONS,队列,编程,CMDQ,命令,失效
From: https://blog.csdn.net/yuxiaochen99/article/details/144632663

相关文章

  • 卡西欧 FX-991 CN X 科学计算器,是否算作无编程、无储存功能的计算器吗?
    起因是:矩阵分析老师说“可以带最简单的,没存储上网等功能的计算器”https://www.cncalc.org/thread-23924-1-1.htmlhttps://www.zhihu.com/question/291618906综上,能带。......
  • Java转C++之模板元编程
    模板元编程(TemplateMetaprogramming)入门指南:针对Java程序员的讲解作为一个从Java转到C++的程序员,理解模板元编程(TemplateMetaprogramming,简称TMP)可能会感到有些挑战,特别是其中的语法和概念有很多与Java非常不同的地方。模板元编程是一种强大的技术,它允许我们在编译时......
  • 实验6 C语言结构体、枚举应用编程
    实验任务四:task4.c源代码:1#include<stdio.h>2#defineN1034typedefstruct{5charisbn[20];//isbn号6charname[80];//书名7charauthor[80];//作者8doublesales_price;//售价9int......
  • AOP面向切面编程
    1.1动态代理​动态代理是指:程序在整个运行过程中根本就不存在目标类的代理类,目标对象的代理只是由代理生成工具(不是真实定义的类)在程序运行时由JVM根据反射等机制动态生成,代理对象与目标对象的代理关系在程序运行时确定。实现方式:jdk动态代理,使用jdk中的Proxy,Met......
  • Shell脚本编程题(八道)
    Shell脚本编程题(八道)第一题1.编程实现从键盘获取一个整数,按下列情况输出对应结果:(1)当该数值为6或7时,输出“休息日(RestDay)”。(2)当该数值为1至5时,输出“工作日(WorkingDay)”。(3)其他情况输出“输入错误(ErrorInput)”#!/bin/shreaddatetimecase"$datatime"in......
  • 数据结构之栈,队列,树
    目录一.栈1.栈的概念及结构2.栈的实现3.实现讲解1.初始化栈2.销毁栈3.压栈4.出栈5.返回栈顶元素6.返回栈内元素个数7.判断栈内是否为空二.队列1.队列的概念及结构2.队列的实现3.实现讲解1.初始化队列2.销毁队列3.单个成员入队列4.单个成员出队列5.判断队......
  • C++, 模板元编程, 凭借辅助的模板结构的特化 , 从而以类型控制模板类的分支
    u++真是学无止境,遍地地雷,哦不,遍地黄金。看ue序列化中的TArray有感,特节取部分代码保存,希望能多切近ue的编码经验半分。 //...template<typenameT>structTCanBulkSerialize{enum{Value=false};};template<>structTCanBulkSerialize<unsignedint>{enum{Value......
  • 实验6 C语言结构体、枚举应用编程
    4.实验任务4#include<stdio.h>#defineN10typedefstruct{charisbn[20];//isbn号charname[80];//书名charauthor[80];//作者doublesales_price;//售价intsales_count;//销售册数}Book;voidoutput(Bookx[],intn);voidsort(Bookx[],intn);......
  • 我在使用Rust编程时,只在编译期提示要手动标注生命周期时才进行标注,这样可以吗?
    在使用Rust编程时,只在编译器提示需要标注生命周期时才进行标注是一种可以接受的初学者实践,但随着经验积累和代码复杂度增加,这种方式可能会有以下问题和限制:1.优点:简单、快速入门编译器友好:Rust的借用检查器非常强大,大部分情况下会推断出正确的生命周期,尤其是在简单的函数......
  • 实验6 C语言结构体、枚举应用编程
    实验一://P286例8.17//对教材示例代码作了微调,把输出学生信息单独编写成一个函数模块//打印不及格学生信息、打印所有学生信息均调用该模块实现#include<stdio.h>#include<string.h>#defineN3//运行程序输入测试时,可以把N改小一些输入测试typedefstr......