在AArch64状态下,SP对应的物理寄存器有如下四个(某一时刻只能对应下面其中一个):

  • SP_EL0和SP_EL1
  • SP_EL2
  • SP_EL3

如何使用呢?

1、如果程序运行在EL0,那么使用的是SP_EL0

2、如果程序运行在其他Exception level下,可以使用SP_EL0和当前Exception level所对应的SP_ELx

3、默认情况下,进入异常后,使用的是当前Exception level对应的SP_ELx。即:发生的进入EL1的异常,那么在跳转到EL1的异常处理入口后,会自动切到SP_EL1,此时SP对应的就是SP_EL1. 当然,可以在异常通过操作PSTATE.SP将SP强制切到SP_EL0

4、即便不是在异常处理程序中,也可以通过操作PSTATE.SP将SP强制切到SP_EL0或者SP_ELx

5、比如程序正运行在EL1,此时使用的SP是SP_EL0,突然发生了一个进入EL1的异常,在跳转到异常处理入口后,SP会自动切到SP_EL1,在异常返回后,SP又会自动切回到原先的SP_EL0

6、后缀t和h:

  t 表示使用的是SP_EL0

  h 表示使用的是SP_ELx

 验证

下面使用DS5仿真的实验,验证一下上面的说法。

系统复位后,默认是在EL3,并且是secure模式。

第73行,将SP切到SP_EL0,然后设置SP的值为0x77,此时的寄存器状态如下:

第77行,将SP切到SP_EL3,然后将SP设置为0x88,此时的寄存器状态如下:

第81行,将SP重新切回SP_EL0,此时的寄存器状态如下:

第83行,访问ICC_SRE_EL2会触发sync异常,因为在secure模式下不存在EL2,触发异常后,会进入EL3的“Current EL with SP0”分支,因为发生异常时使用的是SP_EL0,下面是进入异常处理程序后的寄存器信息:

可以看到,此时SPSel的值是1,Mode的值为EL3h,说明此时SP用的是SP_ELx。此时SPSR_EL3的值是0x3CC,SPSR的含义如下:

M[3:0]的值是0xC,含义如下,表示发生异常前系统的模式和状态:AArch64、EL3、SP_EL0

下面是异常处理函数:

 //
// Current EL with SP0
//
el3_vectors:
c0sync3:
mrs x0, elr_el3
add x0, x0, #
msr elr_el3, x0 mov x0, #0x1
msr spsel, x0
eret

第6到8行的作用是异常返回时跳转到触发异常的指令的下一条指令执行,当第12执行完毕,ELR_EL3的值会设置给PC,SPSR_EL3的值会设置给PSTATE,所以SP会重新切回到SP_EL0:

第85行的作用是将SP切换到SP_EL3,此时的寄存器内容如下:

紧接着第86行,再次触发异常:

此时会跳转到EL3的“Current EL with SPx”分支执行:

 //
// Current EL with SPx
//
.balign 0x80
cxsync3:
mrs x0, elr_el3
add x0, x0, #
msr elr_el3, x0 mov x0, #0x0
msr spsel, x0
eret

第12行,异常返回后,寄存器内容如下:

完。

ARMv8学习 —— SP_EL0和SP_ELx的更多相关文章

  1. ARMv8 架构与指令集.学习笔记

    目 录 第1章 ARMv8简介. 3 1.1基础认识. 3 1.2 相关专业名词解释. 3 第2章 Execution State 4 2.1 提供两种Execution State 4 2.2 决定 ...

  2. ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(3)- 异常

    1.前言 本文介绍异常相关内容,包括异常类型,异常进入,异常返回,异常层次结构,异常的路由等 2.  RESET ARMV8体系结构支持两种类型的RESET Cold reset:Reset PE所有 ...

  3. ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(2)- 寄存器

    1. 前言 2. 指令运行与异常处理寄存器 ARM体系结构的寄存器分为两类: (1)系统控制和状态报告寄存器 (2)指令处理寄存器,如累加.异常处理 本部分将主要介绍如上第(2)部分的寄存器,分为AA ...

  4. ARMV8 datasheet学习笔记5:异常模型

    1.前言 2.异常类型描述 见 ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(1)-EL/ET/ST 一文 3. 异常处理路由对比 AArch32.AArch64架 ...

  5. ARMV8 datasheet学习笔记3:AArch64应用级体系结构

    1.前言 本文主要从应用的角度介绍ARMV8的编程模型和存储模型 2. AArch64应用级编程模型 从应用的角度看到的ARM处理器元素: 可见的元素(寄存器/指令) 说明 可见的寄存器 R0-R30 ...

  6. ARMv8 内存管理架构.学习笔记

    http://blog.csdn.net/forever_2015/article/details/50285955 版权声明:未经博主允许不得转载,请尊重原创, 谢谢!   目 录 第1章 分级存储 ...

  7. ARMV8 datasheet学习笔记4:AArch64系统级体系结构之VMSA

    1. 前言 2. VMSA概述 2.1 ARMv8 VMSA naming VMSAv8 整个转换机中,地址转换有一个或两个stage VMSAv8-32 由运行AArch32的异常级别来管理 VMS ...

  8. ARMV8 datasheet学习笔记4:AArch64系统级体系结构之存储模型

    1.前言 关于存储系统体系架构,可以概述如下: 存储系统体系结构的形式 VMSA 存储属性   2. 存储系统体系结构 2.1.    地址空间 指令地址空间溢出 指令地址计算((address_of ...

  9. ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(4)- 其它

    1. 前言 2.可配置的指令使能/禁用控制和trap控制 指令使能/禁用 当指令被禁用,则这条指令就会变成未定义 指令Trap控制 控制某条或某些指令在运行时进入陷阱,进入陷阱的指令会产生trap异常 ...

随机推荐

  1. [转]利用ssh传输文件

    利用ssh传输文件 http://www.cnblogs.com/jiangyao/archive/2011/01/26/1945570.html 在linux下一般用scp这个命令来通过ssh传输文 ...

  2. 设置sde表空间为自动增长

    有的用户在测试数据时,希望在SDE表空间里面不受限制地导入数据,于是需要将SDE的表空间设置为自动增长. 过程描述 1.可以在创建sde表空间的时候,添加参数Autoextend on,修改后创建命令 ...

  3. Python_lambda简单函数表达式

    lambda表达式只能用于简单函数的书写 def funx(a): a+=1 return a print(funx(99)) 用lambda实现上面函数: funx = lambda a: a+1 ...

  4. activemq 控制面板里Number Of Pending Messages、 Messages Enqueued等含义解释

    项目中在API登录接口采用了ActiveMQ消息队列中间件,采用三台MQ做集群

  5. NOIP2017提高组Day1T3 逛公园 洛谷P3953 Tarjan 强连通缩点 SPFA 动态规划 最短路 拓扑序

    原文链接https://www.cnblogs.com/zhouzhendong/p/9258043.html 题目传送门 - 洛谷P3953 题目传送门 - Vijos P2030 题意 给定一个有 ...

  6. 3、Qt Project之Socket网络编程

    Socket网络编程  Step1:首先完成整个界面的设计 <?xml version="1.0" encoding="UTF-8"?> <u ...

  7. 用 threading 写多线程服务器

    import socket import threading server = socket.socket() server.bind(("127.0.0.1",8899)) se ...

  8. Dataset:利用Python将已有mnist数据集通过移动像素上下左右的方法来扩大数据集为初始数据集的5倍—Jason niu

    from __future__ import print_function import cPickle import gzip import os.path import random import ...

  9. 2018-6-8随笔-combox绑定-语音-删空格

    1.下面介绍三种对comboBox绑定的方式,分别是泛型中IList和Dictionary,还有数据集DataTable ----->>>>>飞机票 2. 简单的语音播报 ...

  10. 拓扑排序 --- AtCode - 3596

    题目链接: https://cn.vjudge.net/problem/1137733/origin 拓扑排序的基本思想: https://blog.csdn.net/qq_41713256/arti ...