我正在用ARMv7-A汇编语言编写一个程序。我想使用虚拟化扩展,并使处理器模式PL2在非安全的世界。
因此,我使用
hvc指令如下:
smc指令并进入监控模式。代码
.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(go命令)调用的。
有人知道是什么原因造成的/如何解决的吗?
发布于 2015-04-20 02:32:05
我自己解决这个问题。我没有设置SCR.HCE位。如果未设置此位,则即使在非安全的hvc模式下,也未定义PL1指令.设置此位后,出现超异常。
https://stackoverflow.com/questions/29700216
复制相似问题