以SMMUv2为例,使用Trace32可视化操作SMMU的常用命令详解

Trace32支持一系列的SMMU命令,可以帮助用户更好地配置、查看和分析SMMU。换句话说,就是让SMMU的配置变得可视化。
在添加SMMU实例之前,需要选择一个CPU来激活该SMMU实例的相关命令。Trace32让SMMU的配置可视化的本质是,操纵CPU读取SMMU的寄存器,然后进行解码显示。
下面的代码是一个最基本的示例,先选择CPU type,然后添加SMMU实例:

SYStem.CPU CortexA53 ;for example, the ‘CortexA53’ CPU is SMMU-capable
SMMU.ADD ... ;you can now define an SMMU, e.g. an SMMU for a graphics processing unit (GPU)

当然也有一些SOC CPU将SMMU预定义成了一个组件,可以直接在SYStem.CONFIG窗口里看见。
Trace32支持MMU-400, MMU-401 ,MMU-500 和 MMU-600,其中MMU-500指的是ARM SMMU架构第二代,简称SMMUv2,MMU-600指的是ARM SMMU架构第三代,简称SMMUv3。
Trace32的SMMU 相关命令带来的最大好处是,将SMMU的配置可视化,其中包括:
- SMMU相关配置寄存器,总结起来有三大部分:Stream mapping table相关寄存器;TCU相关寄存器(global);Context Bank相关寄存器。
- Pagetable的可视化,其中包括dump和list
- Stream mapping table的可视化。
下面我们以SMMUv2为例,解释Trace32 SMMU相关指令的用法。让Trace32显示SMMU的stream mapping table(或称Stream table),是一个最基本的做法,并且可以通过这个stream table打开SMMU其他配置功能窗口。
在这里插入图片描述

  • A 为stream table的完整窗口.
  • B Each row stands for a stream map register group (SMRG). 比如在SMMUv2中的Stream mapping table里,最多支持128个entry,也就是SMR和S2CR等寄存器有128个,即reg.grp index可以是从0x0到0x7F。
  • C Index of a translation context bank. 通过S2CR寄存器可以指定当前这个stream entry指定的是哪个CB.
  • D Data from stream matching registers. 这部分信息来自SMR寄存器,通过这个寄存器可以知道传入的stream id是否 match该entry。

下面笔者将总结Trace32常用的SMMU指令。

Trace32常用的SMMU指令

  • 一,SMMU实例创建: SMMU.ADD
    • <name>
    • <smmu_type>
    • <base_address>
  • 二,SMMU实例删除:SMMU.Clear <name> 和 SMMU.RESet
  • 三,SMMU 寄存器可视化:SMMU.Register
    • SMMU.Register.Global
    • SMMU.Register.ContextBank
    • SMMU.Register.StreamMapRegGrp
  • 四,SMMU pagetable的可视化:SMMU.StreamMapRegGrp
    • SMMU.StreamMapRegGrp.ContextReg
    • SMMU.StreamMapRegGrp.Dump 和 SMMU.StreamMapRegGrp.list
  • 五,SMMU.StreamTable 或者 SMMU.StreamMapTable
    • stream matching的硬件逻辑
    • Trace32 stream matching 函数:SMMU.StreamID2SMRG()
    • Stream Table窗口 显示字段详解
  • 六,SMMU Global Faults 或者 Global Errors 的显示

一,SMMU实例创建: SMMU.ADD

用于定义一个新的SMMU实例,Trace32最多支持添加20个SMMU 实例,

Format: SMMU.ADD "<name>" <smmu_type> <base_address>

它需要传入三个参数:

为SMMU实例设置一个独一无二的名字是必须的,名字不能超过9个字符长度,并且需要用双引号括起来,但是这只针对于SMMU.ADD指令,在执行完SMMU.ADD后,之后对该实例操作的SMMU指令不需要使用双引号。

<smmu_type>

用于指定SMMU的类型:<smmu_type>: MMU400 | MMU401 | MMU500 | MMU600

<base_address>

这是SMMU寄存器空间的基址,如果SMMU支持secure和non-secure两种安全状态,那么我们可以在这个基址前加上访问类型的修饰符,比如表示以CPU secure状态下去访问,可以用AZSD: 或者 ZSD:,以CPU non-secure去访问,则使用 NSD:, NUD:, HD:。需要注意的是Trace32访问SMMU空间,是以CPU为主体进行访问的,所以访问类型不可以是AXI这种。

以下是一个具体的使用实例:

;define a new SMMU named "myGPU" for a graphics processing unit
SMMU.ADD "myGPU" MMU500 AZSD:0x50000000
;display the stream table of the SMMU named “myGPU”
SMMU.StreamTable myGPU

二,SMMU实例删除:SMMU.Clear 和 SMMU.RESet

clear 和reset都可以删除之前用SMMU.ADD创建的SMMU实例,不同的是,clear只能删除指定的那一个,而reset可以删除所有的实例。

三,SMMU 寄存器可视化:SMMU.Register

通过Trace32的 SMMU.Register指令,可以可视化SMMU里最主要的三部分寄存器:

  • TCU部分,也就是Global部分,用于控制全局的SMMU配置。
  • CB部分,用于配置Context bank相关的寄存器。
  • SMR部分,主要用于stream matching,包括SMR和S2CR。

这三部分寄存器的内容都可以通过Trace32命令显示出来。

SMMU.Register.Global

用于显示SMMU global寄存器,用法如下:

SMMU.Register.Global <name>

在这里插入图片描述

SMMU.Register.ContextBank

用于显示CB相关的寄存器,需要指定CB的index,MMU-400, MMU-401 and MMU-500 only.
用法如下:

SMMU.Register.ContextBank <name> <cbndx>
SMMU.Register.ContextBank myGPU 0x16

在这里插入图片描述

SMMU.Register.StreamMapRegGrp

关于Stream mapping,也有两个关键寄存器SMR和S2CR,需要指定Stream table entry的index,MMU-400, MMU-401 and MMU-500 only.
用法如下:

SMMU.StreamMapRegGrp.Register myGPU 0x06

在这里插入图片描述
除了使用相关命令之外,还可以在打开的Streamtable窗口下,选中指定的Stream table entry后,直接右键打开菜单进行操作:
在这里插入图片描述
在这里插入图片描述

四,SMMU pagetable的可视化:SMMU.StreamMapRegGrp

通过SMMU.StreamMapRegGrp命令可以打开SMMU指定SMR index的pagetable。
我们先捋一下逻辑,如下图所示,一笔带有stream ID的transaction进入SMMU,首先在stream mapping table里进行stream matching,它会遍历SMT里的所有SMR,逐一进行匹配,匹配成功后,比如匹配上SMR0,再通过S2CR0寄存器里先前指定好的CBNDX,选择CB,而pagetable的基址就保存在CB的TTBR里。所以通过传入SMR的index来可视化pagetable的本质是:读取对应S2CR寄存器找到指定的CB,再从该CB里找到pagetable的基址进行解码。
在这里插入图片描述
SMMU.StreamMapRegGrp指令有三个选项:

  • SMMU.StreamMapRegGrp.ContextReg, Shows the registers of the context bank associated with the stage 1 and/or stage 2 translation.
  • SMMU.StreamMapRegGrp.Dump Dumps the page table associated with the stage 1 and/or stage 2 translation page wise.
  • SMMU.StreamMapRegGrp.list Lists the page table entries associated with the stage 1 and/or stage 2 translation in a compact format.

SMMU.StreamMapRegGrp.ContextReg

SMMU.StreamMapRegGrp.ContextReg和SMMU.Register.ContextBank 这两个指令都可以将CB的配置寄存器显示出来,但是也有一点不同:

  • SMMU.Register.ContextBank 传入的参数是 CBNDX,CB的index,直接指定CB进行显示。
  • SMMU.StreamMapRegGrp.ContextReg 传入的参数是 SMRG_INDEX, stream table entry的index,正如我上文提到过,通过 SMRG_INDEX找到S2CR,然后读取对应S2CR寄存器找到指定的CB,属于间接访问,并且还可以增加 /IntermediatePT 选项,来选择显示 stage1 还是 stage2的CB。
    在这里插入图片描述

SMMU.StreamMapRegGrp.Dump 和 SMMU.StreamMapRegGrp.list

SMMU.StreamMapRegGrp.Dump 和 SMMU.StreamMapRegGrp.list这两个指令,传入smrg_index参数用来选择stream table entry,并将该entry里指定的CB 的pagetable解码出来。

Format: SMMU.StreamMapRegGrp.Dump <args>
<args>: <name> <smrg_index> [<address> | <range> [<ttb_address>]] [/<option>]Format: SMMU.StreamMapRegGrp.list <args>
<args>: <name> <smrg_index> [<address> | <range> [<ttb_address>]] [/IntermediatePT]

SMMU.StreamMapRegGrp.Dump命令需要指定SMMU实例的名字以及Stream mapping table的index。如果没有指定地址或者范围,默认是dump所有的内容。其中还可以指定ttb_address,也就是Pagetable 的基址,如果没有指定,那就从SMRG中抽取。intermediatePT 选项主要用于Stage2,对于stage1,它将被忽略。
在这里插入图片描述

SMMU.StreamMapRegGrp.Dump myGPU 0x0C

也可以直接右键打开list和dump窗口:
在这里插入图片描述
在这里插入图片描述
以下是smmu Pagetable dump窗口显示出的个字段释义:
在这里插入图片描述

五,SMMU.StreamTable 或者 SMMU.StreamMapTable

SMMU.StreamTable 或者 SMMU.StreamMapTable,二者是等同的,

Format: SMMU.StreamTable <args>
SMMU.StreamMapTable <args> (as an alias)
<args>: <name> [/StreamID <value>]
(for MMU-400, MMU-401 and MMU-500)

SMMU.StreamTable命令可以传入 StreamID到Stream table里进行匹配,Trace32的Stream ID匹配逻辑是模拟真实的SMMU硬件逻辑做的。原理就是将该StreamID与所有StreamTable SMR寄存器里的ID和mask进行匹配,如果匹配成功,则会高亮该Stream table entry。
在这里插入图片描述

;define a new SMMU named "myGPU" for a graphics processing unit
SMMU.ADD "myGPU" MMU500 AZSD:0x50000000
;open the window and highlight the matching SMRG in yellow
SMMU.StreamTable myGPU /StreamID 0x324A

在这里插入图片描述

stream matching的硬件逻辑

这里简单介绍一下stream matching的硬件逻辑,stream ID的匹配主要是根据 SMR寄存器里的三个字段:valid,id 和mask进行的。valid为1,说明该stream table entry有效,可以进行stream matching。比如传入的stream ID为0x324A ,SMR.id = 0x24A, SMR.mask=0x7000,匹配是否会成功?
首先看 mask 字段,0x7000 = 0y0111_0000_0000_0000, 这说明 传入的streamID的第12,13,14三个bit不会参与stream matching, 换言之,这三个bit会被忽略,stream ID 0x324A 将这三个bit忽略后,变成0x24A, 与SMR.id = 0x24A相同,所以匹配成功。
在这里插入图片描述

Trace32 stream matching 函数:SMMU.StreamID2SMRG()

Trace32提供了一个 stream matching 函数:SMMU.StreamID2SMRG(name, stream_id),通过传入SMMU实例的名字,以及需要匹配的stream ID,来查找是否有匹配成功的stream table entry。
1
SMMU.StreamID2SMRG()的返回值有三种情况:

  • 没有匹配上,返回 -1
  • 匹配上了多个SMT entry,返回 -2
  • 有且只匹配上了一个,返回对应entry的index,比如有128个entry,那么返回值在0到127之间。
    在这里插入图片描述

使用示例:

;open the window and highlight the matching SMRG in yellow
SMMU.StreamMapTable myGPU /StreamID 0x3464
;return the index of the SMRG as a decimal value
&index=SMMU.StreamID2SMRG("myGPU",0x3464)
;print the index as hex and decimal to the AREA window
PRINT "hex: 0x" CONVert.INTTOHEX(&index) " decimal: &index"
AREA.view

在这里插入图片描述

Stream Table窗口 显示字段详解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六,SMMU Global Faults 或者 Global Errors 的显示

如下图所示,Trace32的SMMU.StreamTable窗口可以显示 SMMU的 Global faults,其原理就是解码SMMU_sGFSR寄存器,该寄存器里保存着各种Global faults的状态信息。
SMMU.StreamID2SMRG()
关于 CB的错误信息,SMMU.StreamTable窗口里也有显示,在state列中以一个红色字母,比如 F,M或者S显示:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/82873.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

将数据库表导出为C#实体对象

数据库方式 use 数据库;declare TableName sysname 表名 declare Result varchar(max) /// <summary> /// TableName /// </summary> public class TableName {select Result Result /// <summary>/// CONVERT(NVARCHAR(500), ISNULL(ColN…

CSS 预处理器与工具

目录 CSS 预处理器与工具1. Less主要特性 2. Sass/SCSS主要特性 3. Tailwind CSS主要特性 4. 其他工具PostCSSCSS Modules 5. 选择建议 CSS 预处理器与工具 1. Less Less 是一个 CSS 预处理器&#xff0c;它扩展了 CSS 语言&#xff0c;添加了变量、嵌套规则、混合&#xff0…

this.$set() 的用法详解(Vue响应式系统相关)

1. 什么是 this.$set()&#xff1f; this.$set(target, key, value) 是 Vue 2 中提供的一个方法&#xff0c;用于向响应式对象中动态添加属性&#xff0c;确保新加的属性同样是响应式的。 2. 为什么需要它&#xff1f; Vue 2 的响应式系统基于 Object.defineProperty&#…

【HarmonyOS Next之旅】DevEco Studio使用指南(三十)

目录 1 -> 部署云侧工程 2 -> 通过CloudDev面板获取云开发资源支持 3 -> 通用云开发模板 3.1 -> 适用范围 3.2 -> 效果图 4 -> 总结 1 -> 部署云侧工程 可以选择在云函数和云数据库全部开发完成后&#xff0c;将整个云工程资源统一部署到AGC云端。…

如何配置nginx解决前端跨域请求问题

我们以一个简单的例子模拟不同情况下产生的跨域问题以及解决方案。假设在http://127.0.0.1:8000的页面调用接口 fetch(http://127.0.0.1:8003/api/data)常看到的错误“Access to fetch at ‘http://127.0.0.1:8003/api/data’ from origin ‘http://localhost:8000’ has been…

React Hooks 指南:何时使用 useEffect ?

在 React 的函数组件中&#xff0c;useEffect Hook 是一个强大且不可或缺的工具。它允许我们处理副作用 (side effects)——那些在组件渲染之外发生的操作。但是&#xff0c;什么时候才是使用 useEffect 的正确时机呢&#xff1f;让我们深入探讨一下&#xff01; 什么是副作用…

bat批量去掉本文件夹中的文件扩展名

本文本夹内 批量去掉本文件夹中的文件扩展名 假如你有一些文件&#xff0c;你想去掉他们的扩展名 有没有方便的办法呢 今天我们就分享一种办法。 下面&#xff0c;就来看看吧。 首先我们新建一个记事本&#xff0c;把名字改为&#xff0c;批量去掉本文件夹中的文件扩展名.txt 然…

STM32标准库-输入捕获

一、输入捕获 1.简介 IC&#xff08;Input Capture&#xff09;输入捕获输入 捕获模式下&#xff0c;当通道输入引脚出现指定电平跳变时&#xff0c;当前CNT的值将被锁存到CCR中&#xff0c;可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数 每个高级定时器和…

在linux系统上搭建git服务器(ssh协议)

1.在windows上生成RSA密钥对 ssh-keygen -t rsa -b 2048 -C"git用户名/邮箱地址" 命令执行后会在 C:\Users\${windows登录账户}\.ssh 目录下生成密钥对 其中 id_rsa 为私钥&#xff0c;id_rsa.pub 为公钥 2.在 linux 系统上登记公钥 vim ~/.ssh/authorized_keys…

RAG检索系统的两大核心利器——Embedding模型和Rerank模型

在RAG系统中&#xff0c;有两个非常重要的模型一个是Embedding模型&#xff0c;另一个则是Rerank模型&#xff1b;这两个模型在RAG中扮演着重要角色。 Embedding模型的作用是把数据向量化&#xff0c;通过降维的方式&#xff0c;使得可以通过欧式距离&#xff0c;余弦函数等计算…

stm32内存踩踏一例

1、问题描述 程序运行过程中&#xff0c;发现显示的内容乱了&#xff0c;如下图所示&#xff1a; 2、问题分析 此原因产生是由于将一个函数提前引起的&#xff0c;单步跟踪检查问题 运行过此函数后变量的地址改变了&#xff1f;被调函数能改变调用函数的变量地址&#xff1f…

Selenium的底层原理

Selenium 底层主要依赖于 WebDriver 协议&#xff08;即 W3C WebDriver 规范&#xff0c;早期也有 JSON Wire Protocol&#xff09;来实现对浏览器的远程控制&#xff0c;其核心架构可以分为以下几层&#xff1a; Selenium 客户端&#xff08;Client Library&#xff09; 支持多…

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…

MATLAB-电偶极子所产出的电磁场仿真

% 清除工作区 clear all % 用户输入 a input(输入点电荷的位置如[1,0,1;2,0,2]表示位置在(1,0,1),(2,0,2): ); Q input(输入点电荷的电荷量&#xff0c;-表示电性&#xff0c;如[1,-1]: ); a1 input(电场线角度间隔: ); % 角度间隔 % 设置绘图范围 xmin min(a(:,1)) - 4;…

混合云数据库连接问题:本地与云实例的兼容性挑战

关键词:混合云数据库,混合云架构,数据库连接问题,网络策略,兼容性挑战,权限冲突,防火墙,VPN,ExpressRoute,Direct Connect,SQL Server,MySQL,PostgreSQL,Azure SQL Database,AWS RDS 随着企业数字化转型的深入,混合云架构正成为主流选择。它结合了本地数据中心…

pikachu靶场通关笔记16 CSRF关卡02-CSRF(POST)

目录 一、CSRF原理 二、源码分析 三、渗透实战 1、构造CSRF链接 &#xff08;1&#xff09;登录 &#xff08;2&#xff09;bp设置inception on &#xff08;3&#xff09;修改个人信息 &#xff08;4&#xff09;构造CSRF链接 2、模拟受害者登录 3、诱导受害者点击 …

CAD2025安装教程与资源下载

软件下载 软件名称&#xff1a;CAD2025软件语言&#xff1a;简体中文软件大小&#xff1a;2.69G系统要求&#xff1a;Windows10或更高&#xff0c;32/ 64位操作系统硬件要求&#xff1a;CPU2GHz &#xff0c;RAM4G或更高下载链接&#xff1a; 链接&#xff1a;https://pan.qua…

SpringBoot离线应用的5种实现方式

在当今高度依赖网络的环境中&#xff0c;离线应用的价值日益凸显。无论是在网络不稳定的区域运行的现场系统&#xff0c;还是需要在断网环境下使用的企业内部应用&#xff0c;具备离线工作能力已成为许多应用的必备特性。 本文将介绍基于SpringBoot实现离线应用的5种不同方式。…

数据类型 -- 字符

在C中&#xff0c;字符型&#xff08;char&#xff09;用于存储单个字符&#xff0c;如字母、数字、符号等。字符型是最基本的数据类型之一&#xff0c;常用于处理文本、字符数组&#xff08;字符串&#xff09;等场景。 1. 基本类型 • char&#xff1a;标准字符类型&#x…

国标GB28181视频平台EasyGBS视频实时监控系统打造换热站全景可视化管理方案

一、方案背景​ 在城市供热体系中&#xff0c;换热站作为连接热源与用户的核心枢纽&#xff0c;其运行稳定性直接影响供热质量。面对供热规模扩大与需求升级&#xff0c;传统人工巡检模式暴露出效率低、响应慢、监测不足等问题。基于GB28181协议的EasyGBS视频实时监控系统&…