首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么hvc会使未定义的指令异常?

为什么hvc会使未定义的指令异常?
EN

Stack Overflow用户
提问于 2015-04-17 13:12:18
回答 1查看 749关注 0票数 1

我正在用ARMv7-A汇编语言编写一个程序。我想使用虚拟化扩展,并使处理器模式PL2在非安全的世界。

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

  1. 以安全PL1(SVC)模式启动。
  2. 设置MVBAR和VBAR。
  3. 使用smc指令并进入监控模式。
  4. 在监视器模式下,设置SCR.NS位,设置HVBAR和excetpion返回。
  5. 使处理器模式为SVC。
  6. 呼叫hvc

代码

代码语言:javascript
复制
    .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命令)调用的。

有人知道是什么原因造成的/如何解决的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-20 02:32:05

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29700216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档