我正在使用ARMv7-A汇编语言编写程序。 我想使用Virtualization Extension并在非安全的世界中制作处理器模式PL2。
因此,我使用
hvc
指令如下:
- 以安全的PL1(SVC)模式开始。
- 设置MVBAR和VBAR。
- 使用
smc
指令并进入监控模式。- 在监控模式下,设置SCR.NS位,设置HVBAR和异常返回。
- 使处理器模式为SVC。
- 致电hvc
醇>
代码
.text
.section .eitbra , "ax"
// non-secure vector table
.org 0x00000000
b startup_entry // 00 : reset
b default_entry // 04 : undefined instruction exception
b default_entry // 08 : supervisor call (SVC)
b default_entry // 0C : prefetch abort
b default_entry // 10 : data abort
nop // 14 : (reserved)
b default_entry // 18 : interrupt
b default_entry // 1C : fast interrupt
.org 0x00000020
// secure vector table
secure_vector:
b startup_entry // 00 : reset
b default_entry // 04 : undefined instruction exception
b default_entry // 08 : supurvisor call (SVC)
b default_entry // 0C : prefetch abort
b default_entry // 10 : data abort
nop // 14 : (reserved)
b default_entry // 18 : interrupt
b default_entry // 1C : fast interrupt
.org 0x00000040
hyper_vector:
// hyper vector table
nop // 00 : reset
b default_entry // 04 : undefined instruction exception
b default_entry // 08 : hyper call from hyper mode
b default_entry // 0C : prefetch abort
b default_entry // 10 : data abort
b hyper_entry // 14 : hyper call from non-secure world (HVC)
b default_entry // 18 : interrupt
b default_entry // 1C : fast interrupt
.org 0x00000060
monitor_vector:
// monitor vector table
nop // 00 : (reserved)
nop // 04 : (reserved)
b hyper_init // 08 : monitor call
b default_entry // 0C : prefetch abort
b default_entry // 10 : data abort
nop // 14 : (reserved)
b default_entry // 18 : interrupt
b default_entry // 1C : fast interrupt
.org 0x00000080
startup_entry:
// set cpsr
mov r0, #(PSM_SVC | CPSR_I | CPSR_F)
msr cpsr, r0
// set vector base address
ldr r1, =secure_vector
mcr p15, 0, r1, c12, c0, 0 // VBAR
ldr r1, =monitor_vector
mcr p15, 0, r1, c12, c0, 1 // MVBAR
// move to monitor mode and restart as non-secure world
smc #0
nonsecure_init:
ldr r1, =_start
mcr p15, 0, r1, c12, c0, 0 // VBAR
// set cpsr
mrs r0, cpsr
mov r0, #(PSM_SVC | CPSR_I | CPSR_F)
msr cpsr, r0
// hyper call test
hvc #0
b default_entry
hyper_init:
mrc p15, 0, r0, c1, c1, 0 //read scr
orr r0, r0, #1 // set NS bit
mcr p15, 0, r0, c1, c1, 0 //set scr
mrs r0, cpsr
ldr r0, =hyper_vector
mcr p15, 4, r0, c12, c0, 0 // HVBAR
movs pc, lr
hyper_entry:
ldr sp, =_stack_start+0x50
eret
default_entry:
nop
mrs r0, cpsr
nop
wfi
b default_entry
但是,在hvc指令中,发生了未定义的指令异常。
此代码是在TWR-LS1021A板(Cortex-A7)上从U-Boot控制台(go
命令)调用的。
任何人都知道导致此问题/如何修复的原因?
答案 0 :(得分:1)
我自己解决了这个问题。
我没有设置SCR.HCE
位。
如果未设置此位,即使在非安全PL1模式下,hvc
指令也未定义。
设置此位后,发生超级异常。