历史上的今天
今天是:2024年12月25日(星期三)
2019年12月25日 | ARMv8学习 —— SP_EL0和SP_ELx
2019-12-25 来源:eefocus
在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

下面是异常处理函数:
1 //
2 // Current EL with SP0
3 //
4 el3_vectors:
5 c0sync3:
6 mrs x0, elr_el3
7 add x0, x0, #4
8 msr elr_el3, x0
9
10 mov x0, #0x1
11 msr spsel, x0
12 eret
第6到8行的作用是异常返回时跳转到触发异常的指令的下一条指令执行,当第12执行完毕,ELR_EL3的值会设置给PC,SPSR_EL3的值会设置给PSTATE,所以SP会重新切回到SP_EL0:

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

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

此时会跳转到EL3的“Current EL with SPx”分支执行:
1 //
2 // Current EL with SPx
3 //
4 .balign 0x80
5 cxsync3:
6 mrs x0, elr_el3
7 add x0, x0, #4
8 msr elr_el3, x0
9
10 mov x0, #0x0
11 msr spsel, x0
12 eret
第12行,异常返回后,寄存器内容如下:

完。
下一篇:TQ2440中断系统
史海拾趣
|
(高价)(高价)(高价)诚激高手开发:sock5全自动代理自助管理系统,有技术者加QQ详谈,99040008 (高价)(高价)(高价)诚激高手开发:sock5全自动代理自助管理系统,有技术者加QQ详谈,99040008… 查看全部问答> |
|
我在pb 4.2 中修改 platform.reg 如下: ; HIVE BOOT SECTION [HKEY_LOCAL_MACHINE\\init\\BootVars] \"SYSTEMHIVE\"=\"Documents and Settings\\\\system.hv\" \"PROFILEDIR\"=\"Doc ...… 查看全部问答> |
|
STM8的EEPROM读写速度挺快的啊,经测试发现并没像datasheet说的那样一个字节6.6ms, 下载 (49.52 KB) 2010-10-9 11:08 我是单字节写的,似乎写N个字节都是6点几个ms,我是用示波器测得的 下载 (27.15 K ...… 查看全部问答> |
|
TI Sitara入门资料分享7-AM335X家族介绍TI Sitara官方资料汇总 用于基于 ARM® Cortex™-A8 和 ARM9™ Sitara™ 的微控制器 (MPU) 的软件和工具软件开发套件 (SDK) - TI SDK 为您选择的平台提供主要软件组件和文档。SDK 可在 TI.com 上免费下载,同时随附 TI 评估模块 (EVM) 和开发套件提 ...… 查看全部问答> |
|
MSP430关于延时时间的问题。 #include /* * main.c */ void main(void) { WDTCTL = WDTPW + WDTHOLD; unsigned int i; unsigned char j;   ...… 查看全部问答> |
|
现有一套全新的DevKit8500D (DM3730) 出售,需要的尽快 - 基于ARM Cortex-A8的TI DM3730处理器,主频1GHz - 板载512MByte DDR SDRAM、512MByte NAND Flash - 3路串口,4个USB Host,USB OTG,以太网口,音频输入输出,TF卡,键盘,JTAG接口 - 支持24位TFT液晶显示器,DVI-D,S-Video显示输出,可输 ...… 查看全部问答> |




