为什么hvc会产生Undefined指令异常?

时间:2015-04-17 13:12:18

标签: assembly armv7 bare-metal

我正在使用ARMv7-A汇编语言编写程序。 我想使用Virtualization Extension并在非安全的世界中制作处理器模式PL2。

  

因此,我使用hvc指令如下:

     
      
  1. 以安全的PL1(SVC)模式开始。
  2.   
  3. 设置MVBAR和VBAR。
  4.   
  5. 使用smc指令并进入监控模式。
  6.   
  7. 在监控模式下,设置SCR.NS位,设置HVBAR和异常返回。
  8.   
  9. 使处理器模式为SVC。
  10.   
  11. 致电hvc
  12.   

代码

    .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 个答案:

答案 0 :(得分:1)

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