Linux Mem -- AArch64 MTE功能Tag寄存器
目录
1 前言
2 Tag相关寄存器
2.1 Mtu_tag_addr_ctl
2.2 Mtu_tag_addr_base
2.3 Mtu_tag_addr_shutter{2:0}
3 mtu_tag_addr*寄存器代码设定
1 前言
如前文《The MTE stores and checks in real hardware》提到为了将memory tag保存到内存,需要对MTSX中的tag相关寄存器进行编程,以保证MTSX能够根据请求的物理地址来决定tag地址。本文参考Documentation – Arm Developer
2 Tag相关寄存器
使能MTE功能前,必须编程MTSX中地址产生寄存器和系统中相关内存控制器。MTSX根据请求的物理地址来决定tag地址,通过此读取此tag地址的memory tag 和对应虚拟地址中的address tag进行比较。MTSX需要被编程的寄存器如下:
a.mtu_tag_addr_ctl
b.mtu_tag_addr_base
c.mtu_tag_addrshutter{0-2}
2.1 Mtu_tag_addr_ctl
该寄存器用来指示使用那种内存映射方式。从端(MTXS的下游)可能使用连续的内存映射,而serves端可能是非连续的方式在CI-700 。因此,MTSX能够使用各种传输模式用于映射系统地址和下游从端的内存地址。内存映射的方式决定了MTSX用于传输地址的映射结构。MTSX支持5种内存映射方式,定义在por_mtu_tag_addr_ctl寄存器中。
映射方式 | Por_mtu _tag_ad dr_ctl.me mory_map _mode_e ncoding | 描述 |
Pass-through | 0b000 | 系统地址映射直接到下游从段,没有任何转换 |
PDD 传输 | 0b001 | 使用PDD内存映射。 |
Alternate传输 | 0b010 | 使用flat(非转换)和 PDD 两种方式混合的内存映射方式。 |
Mutil sockets的Alternate传输 | 0b011 | 和alternate传输的映射模式相同。然而如果MTSX收到超过4TB的地址,则将丢弃掉超过4TB的高位。这种模式时,MTSX不能区分0x700 0000 0000 和0x300 0000 0000。因此,系统需要阻止这种访问。 |
0映射模式 | 0b100 | --- |
如下是PDD内存映射示例,MTSX能够转换成到一个连续的映射地址使用PDD映射:
如下是Alternate传输映射模式示例:
Mutilple sockets的Alternate传输映射模式实例:
0映射模式实例:
2.2 Mtu_tag_addr_base
Mtu_tag_addr_base寄存器用于表示tag 空间在本地内存的起始物理地址,如下图显示:
如下是DRAM中tag区域的约束条件:
a.tag区域不能与数据区域交错,tag区域必须在DRAM数据区域的上面。
b.tag的物理地址空间不能映射为多个区域
例如,PDD映射模式时,不允许tag区域一部分映射在2GB-4GB、另一部分映射到43GB-64GB。
2.3 Mtu_tag_addr_shutter{2:0}
为了确认正确的DRAM地址,必须正确的对mtu_tag_addr_shutter{2:0}寄存器进行编程以删除地址位,必须移除的地址位是基于SCG的HN-Fs和SNs数量。
如下图。这些寄存器允许移除bit [51] - bit[6]范围内最多7bit的物理地址位。要对这些寄存器进行编程,您必须设置每个单独的地址位的移位行为,如下图所示。
如上图示,可以配置address shutter寄存器配置为:
a.直通PA bit[n]没有改变
b.偏移bit[n+1]和bit[n+7]任意物理bit到bit[n]位置
如下图显示物理地址范围bit[12] - bit[6]移除bit[10]和bit[7]的shutter寄存器编程:
基于SCG的HN-Fs和SNs的联合支持情况图:
3 mtu_tag_addr*寄存器代码设定
AArch64 MTE功能的allocation tag存放在mtu_tag_addr_base寄存器指向的内存中,mtu_tag_addr_base这个寄存器在哪里设置?
关于por_mtu_addr_*寄存器设置:
a.Por_mtu_addr_*类寄存器说明中:针对此寄存器的设置需要在设备的首次非配置的访问前完成。
b.以MTK平台为例,在preloader阶段(preloader/platform/mtxxx/src/core/booker.c)设置MMU是有根据MTE使能情况进行por_mt_addr*寄存器进行设置。在接近内存物理起始地址的地方,预留 dram_size >> 5 的内存空间,将此空间物理地址设置到寄存器por_mtu_addr_base做为 alloction tag的存储空间。另外需要注意:预留的该段内存设置nomap属性,在内核阶段时不会对该段内存进行虚拟映射。