【ARMv8/v9 系统寄存器 6 -- EL 异常等级判定寄存器 CurrentEL 使用详细将介绍】

devtools/2024/10/19 6:15:31/

文章目录

    • ARMv8/v9 EL 等级获取
      • EL 等级获取函数实现
      • EL 等级获取测试

ARMv8/v9 EL 等级获取

下面这个宏定义是用于ARMv8/v9架构下,通过汇编语言检查当前执行在哪个异常级别(Exception Level,EL)并据此跳转到不同的标签。

异常级别是ARM架构中定义的用于隔离和保护系统资源的机制,不同的级别有不同的权限,一般来说:

  • EL0是用户模式,
  • EL1是操作系统内核模式,
  • EL2是虚拟机监控器模式,
  • EL3是安全监控模式。

下面代码是UEFI中实现如何判断当前EL等级的代码如下:

#define  EL1_OR_EL2_OR_EL3(SAFE_XREG) \mrs    SAFE_XREG, CurrentEL ;\  // 从"CurrentEL"系统寄存器中读取当前的异常级别到SAFE_XREG寄存器cmp    SAFE_XREG, #0x8      ;\  // 比较当前的异常级别是否为EL2 (0x8)b.gt   3f                   ;\  // 如果当前异常级别大于EL2,跳转到标签3b.eq   2f                   ;\  // 如果当前异常级别等于EL2,跳转到标签2cbnz   SAFE_XREG, 1f        ;\  // 如果当前异常级别不为0(即不是EL0),跳转到标签1b      .                    ;\  // 如果没有进入任何异常级别,就停在当前位置(这种情况应该不会发生,这里的跳转是一个死循环)// 我们不应该到达这里

这段宏定义使用了几个汇编指令:

  • mrs:将系统寄存器的值移动到一个通用寄存器中。
  • cmp:比较两个值。
  • b.gt:如果比较的结果是大于,则跳转。
  • b.eq:如果比较的结果是等于,则跳转。
  • cbnz:如果寄存器的值不为零,则跳转。
  • b:无条件跳转。

使用这个宏可以根据当前的异常级别执行不同的代码路径。例如,如果当前是EL1、EL2或EL3,它可以执行一些特定于这些级别的安全检查或配置。下面以

EL 等级获取函数实现

如下是我自己实现的获取当前 EL等级的汇编代码和C代码:

.macro EL1_OR_EL2_OR_EL3 labelmrs    \label, CurrentELcmp    \label, #0x8b.gt   3fb.eq   2fcbnz   \label, 1fb      .
.endm
func get_arm_elnEL1_OR_EL2_OR_EL3 x1
1: mov x0, #1ret
2: mov x0, #2ret
3: mov x0, #3ret
endfunc get_arm_eln

EL 等级获取测试

int get_eln(void *data)
{uint32_t el = get_current_el();log_info("current el is:%d\n", el);return 0;
}

由于当前我的代码是运行在EL3等级上的,所以理论上应该打印出当前异常等级为3, 测试结果如下:
在这里插入图片描述


http://www.ppmy.cn/devtools/41929.html

相关文章

Flutter 中的 VerticalDivider 小部件:全面指南

Flutter 中的 VerticalDivider 小部件:全面指南 在 Flutter 的世界中,VerticalDivider 是一种用于在垂直布局中提供视觉分隔的小部件。它可以在列表、卡片、行或其他布局元素之间添加一条垂直的分隔线。本文将详细介绍 VerticalDivider 的用途、属性、使…

百度GL地图实现某一段路的路况(new BMapGL.DrivingRouteLine)

功能描述: 1.百度地图实现点击地图出现起点,再次点击出现终点(起点终点能拖动)绘制完终点后获取该路的路况并且起点和终点可以拖动实现实时更新(新绘制的路段的)路况 2.地点搜索 效果如下: 关键…

web安全day03

MYSQL注入: SQL 注入的原理、危害及防御措施 SQL 注入的原理:原本的 SQL 语句在与用户可控的参数经过了如拼接、替换等字符串操作后,得到一个新的 SQL 语句并被数据库解析执行,从而达到非预期的效果。 SQL 注入的危害&#xff…

【Qt】widget圆角,styleSheet

仅配置widget,不设置其子组件。 #widget{background-color: rgba(255, 255, 255, 100); border-top-left-radius: 20; border-top-right-radius: 20; border-bottom-left-radius: 20; border-bottom-right-radius: 20;}

自建WSUS更新服务器完成内网的安全补丁更新

一、适用场景 1、企业内部网络无法访问外网,所以搭建WSUS服务器,可以让内网环境进行更新补丁。 2、校园内部的电脑实训室一般不用外网资源,偶尔开启外网使用时,电脑实训室集体自动更新占用外网资源量大,所以搭建WSUS服…

vue3项目 文件组成

从头捋顺一遍vue3项目文件目录 前置知识JS模块化什么是依赖?安装依赖webpack能做什么?vue基本使用 不借助vue-cli,从0开始搭建vue项目。index.html、main.js、App.vue引入npm引入webpack引入babel引入vue-loaderwebpack配置webpack配置 前置知…

Uniapp 自定义弹窗

布局 <view><view v-if"show" class"popup"><view class"popup-box"><view>支付方式:{{way}}</view><view>停车费用:{{money}}</view><view class"btn-box"><view class"ca…

数据特征降维 | 主成分分析(PCA)附Python代码

主成分分析(Principal Component Analysis,PCA)是一种常用的数据降维技术和探索性数据分析方法,用于从高维数据中提取出最重要的特征并进行可视化。 PCA的基本思想是通过线性变换将原始数据投影到新的坐标系上,使得投影后的数据具有最大的方差。这些新的坐标轴称为主成分…