与UEFI的Beagleboard Qemu baremetal

时间:2015-05-01 09:07:37

标签: arm qemu beagleboard u-boot uefi

我正在尝试在Qemu上启动UEFI的freertos应用程序

  1. 当我从uboot运行应用程序时,使用以下命令运行它没有任何错误

    fatload mmc 0 80300000 rtosdemo.bin go 0x80300000

  2. uefi应用程序将elf文件加载到0x80300000然后我尝试了两个选项。

  3. 我的boot.s文件位于

    之下
    `start:
    _start:
    _mainCRTStartup:
        ldr   r0, .LC6
        msr   CPSR_c, #MODE_UND|I_BIT|F_BIT /* Undefined Instruction */
        mov   sp, r0
        sub   r0, r0, #UND_STACK_SIZE
        msr   CPSR_c, #MODE_ABT|I_BIT|F_BIT /* Abort Mode */
        mov   sp, r0
        ...
    

    ` 反汇编文件

    `
    80300000 <_undf-0x20>:
    80300000:   ea001424    b   80305098 <start>
    80300004:   e59ff014    ldr pc, [pc, #20]   ; 80300020 <_undf>
    80300008:   e59ff014    ldr pc, [pc, #20]   ; 80300024 <_swi>
    8030000c:   e59ff014    ldr pc, [pc, #20]   ; 80300028 <_pabt>
    80300010:   e59ff014    ldr pc, [pc, #20]   ; 8030002c <_dabt>
    ...........
    80305098 <start>:
    80305098:   e59f00f4    ldr r0, [pc, #244]  ; 80305194 <endless_loop+0x18>
    8030509c:   e321f0db    msr CPSR_c, #219    ; 0xdb
    803050a0:   e1a0d000    mov sp, r0
    803050a4:   e2400004    sub r0, r0, #4
    `
    
    1. 使用goto 0x80305098这是elf文件中指定的入口点地址。现在它跳转到ldr r0, ..指令,但之后它似乎只是在一些函数的中间跳转而不是进入msr指令。

    2. 因为在uboot中它跳转到0x80300000,我尝试跳转到该地址,现在它转到指令b 80305098 <start>,但在该指令之后而不是跳转到80305098它只是转到下一条指令ldr pc, [pc, #20]

    3. 所以关于我哪里出错的想法?​​

      编辑: 我将boot.s更新为

      start:
      _start:
      _mainCRTStartup:
          .thumb
      thumb_entry_point:
          blx arm_entry_point
          .arm
      arm_entry_point:
          ldr   r0, .LC6
          msr   CPSR_c, #MODE_UND|I_BIT|F_BIT /* Undefined Instruction Mode */
          mov   sp, r0
      

      现在工作正常。

1 个答案:

答案 0 :(得分:0)

这是ARM代码,但听起来非常像是在Thumb状态下跳转到它。单词e59f00f4将在Thumb中解释为lsls r4, r6, #3; b 0x80304bde(如果我的地址数学正确),这似乎与某些功能中间的某些地方跳跃相符&#34 ;。您可以通过查看CPSR的第5位进行验证(假设您未处于用户模式) - 如果已设置,则您处于Thumb状态。

如果是这种情况,则适当的&#39;解决方案可能涉及使UEFI加载器应用程序足够聪明以进行正确的交互分支,但是快速简单的黑客攻击就是在初始条目的位置放置垫片,如:

    .thumb
thumb_entry_point:
    blx  arm_entry_point
    .arm
arm_entry_point:
    b  start