2015-04-17 229 views
1

我正在用ARMv7-A汇编语言编写一个程序。 我想使用Virtualization Extension并在非安全的世界中使处理器模式PL2。为什么hvc使未定义的指令异常?

因此,我用hvc指令如下:

  1. 在安全PL1(SVC)模式开始。
  2. 设置MVBAR和VBAR。
  3. 使用smc指令并进入监视模式。
  4. 在监视模式下,设置SCR.NS位,设置HVBAR和excetpion的返回值。
  5. 使处理器模式SVC。
  6. 呼叫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命令)调用。

任何人都知道是什么原因导致/如何解决?

回答

1

我自己解决这个问题。 我没有设置SCR.HCE位。 如果未设置该位,则即使在非安全PL1模式下,hvc指令也是未定义的。 设置此位后,发生超级异常。