快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈
文章目录
1、ARMV8 ARMV7的SP寄存器的介绍(1)、ARMV7-aarch32的SP寄存器(2)、ARMV8-aarch32的SP寄存器(3)、ARMV8-aarch64的SP寄存器
2、ARMV8 ARMV7的SP寄存器的使用举例(1)、aarch32状态下读写SP的示例(2)、aarch64状态下读写SP的示例
1、ARMV8 ARMV7的SP寄存器的介绍
(1)、ARMV7-aarch32的SP寄存器
在ARMV8-aarch32的状态下,有以下SP寄存器
spsp_usrsp_svcsp_abtsp_undsp_irqsp_fiqsp_monsp_hyp
注意:在armv7上,arm有七种模式:user、system、supervisor、abort、undefined、irq、fiq, 再加两个扩展模式:hyp、monitor
(2)、ARMV8-aarch32的SP寄存器
ASRMV8为了与armv7兼容,在ARMV8-aarch32的状态下,SP寄存器同armv7的一致
spsp_usrsp_svcsp_abtsp_undsp_irqsp_fiqsp_monsp_hyp
其实armv8的aarch32的这些寄存器,map到了Xx通用寄存器上:
(3)、ARMV8-aarch64的SP寄存器
在ARMV8-aarch64的状态下,有以下SP寄存器
SP_EL0 //当PSTATE.SP=0(SPSel.SP == 0),高的级别访问的sp就是sp_el0SP_EL1 //在EL1级别下使用SP_EL2 //在EL2级别下使用SP_EL3 //在EL3级别下使用
2、ARMV8 ARMV7的SP寄存器的使用举例
(1)、aarch32状态下读写SP的示例
(1)
FUNC thread_set_abt_sp
, :
UNWIND( .fnstart
)
UNWIND( .cantunwind
)
mrs r1
, cpsr
cps #CPSR_MODE_ABT
mov sp
, r0
msr cpsr
, r1
bx lr
UNWIND( .fnend
)
END_FUNC thread_set_abt_sp
(2)
FUNC thread_set_und_sp
, :
UNWIND( .fnstart
)
UNWIND( .cantunwind
)
mrs r1
, cpsr
cps #CPSR_MODE_UND
mov sp
, r0
msr cpsr
, r1
bx lr
UNWIND( .fnend
)
END_FUNC thread_set_und_sp
(3)
FUNC thread_set_irq_sp
, :
UNWIND( .fnstart
)
UNWIND( .cantunwind
)
mrs r1
, cpsr
cps #CPSR_MODE_IRQ
mov sp
, r0
msr cpsr
, r1
bx lr
UNWIND( .fnend
)
END_FUNC thread_set_irq_sp
(4)
FUNC thread_set_fiq_sp
, :
UNWIND( .fnstart
)
UNWIND( .cantunwind
)
mrs r1
, cpsr
cps #CPSR_MODE_FIQ
mov sp
, r0
msr cpsr
, r1
bx lr
UNWIND( .fnend
)
END_FUNC thread_set_fiq_sp
......
(2)、aarch64状态下读写SP的示例
.macro native_intr_handler mode
:req
.......
msr spsel
, #
0
mov sp
, x1
.......
adr x16
, thread_nintr_handler_ptr
.......
msr spsel
, #
1
ldr w0
, [sp
, #THREAD_CORE_LOCAL_FLAGS
]
lsr w0
, w0
, #THREAD_CLF_SAVED_SHIFT
str w0
, [sp
, #THREAD_CORE_LOCAL_FLAGS
]
.......
eret
1: b eret_to_el0
.endm