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

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属性,在内核阶段时不会对该段内存进行虚拟映射。


http://www.kler.cn/a/549973.html

相关文章:

  • Redis五种用途
  • 【LeetCode】15.三数之和
  • TDengine 数据备份/还原工具 taosdump
  • vue点击左边导航,右边出现页面步骤
  • 【GO】Golang/C++混合编程 - 初识
  • Linux 目录结构与基础命令学习记录
  • Spring AI发布!让Java紧跟AI赛道!
  • openEuler 22.03 LTS SP4源码编译部署OpenStack-Dalmatian
  • 云原生(五十五) | ECS中自建数据库迁移到RDS
  • 2009年下半年软件设计师上午真题的知识点整理(附真题及答案解析)
  • React.memo 使用详解与最佳实践
  • SpringBoot+微信小程序+数据可视化的宠物到家喂宠服务(程序+论文+讲解+安装+调试+售后等)
  • 使用 DiskPart 命令创建磁盘和卷
  • 基于AWS的证券交易系统架构设计与核心技术实践
  • 第6章 6.1 ASP.NET Core MVC 项目
  • PHP语法入门完全指南(2024新版)
  • 生成对抗网络(GAN)的“对抗“过程解析:从图像合成到药物发现的跨领域应用
  • 制作一个项目用于研究elementUI的源码
  • 腿足机器人之七- 逆运动学
  • 【Unity】打包运行后如何查看日志