带有 UEFI 的 Beagleboard Qemu 裸机

Beagleboard Qemu baremetal with UEFI

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

  1. 当我 运行 来自 uboot 的应用程序时,使用下面的命令它 运行s 没有任何错误

    fatload mmc 0 80300000 rtosdemo.bin go 0x80300000

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

我的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文件中指定的入口点addr。现在它跳转到 ldr r0, .. 指令,但在那之后它似乎只是跳到某个函数中间的某个地方,而不是进入 msr 指令。

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

那么我哪里出错了?

编辑: 我将 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

现在可以正常使用了。

这是 ARM 代码,但听起来很像是在 Thumb 状态下跳转到的。 e59f00f4 一词在 Thumb 中将被解释为 lsls r4, r6, #3; b 0x80304bde(如果我的地址计算正确),这似乎与 "jumping somewhere in the middle of some function" 一致。您可以通过检查 CPSR 的第 5 位(假设您未处于用户模式)进行验证 - 如果已设置,则您进入了 Thumb 状态。

如果是这样,那么 'proper' 解决方案可能涉及使 UEFI 加载程序应用程序足够聪明以执行正确类型的互通分支,但快速简便的破解方法是在某处放置垫片仅用于初始条目,例如:

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