【问题标题】:Beagleboard Qemu baremetal with UEFI带有 UEFI 的 Beaglebone Qemu 裸机
【发布时间】:2015-07-11 03:04:13
【问题描述】:

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

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

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

  2. 1234563指令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

现在可以正常使用了。

【问题讨论】:

  • 你有没有机会在 Thumb 状态下跳转到这段代码?
  • 我不确定...有没有办法检查

标签: arm qemu beagleboard u-boot uefi


【解决方案1】:

这是 ARM 代码,但听起来很像是在 Thumb 状态下跳转到的。 e59f00f4 这个词在 Thumb 中将被解释为 lsls r4, r6, #3; b 0x80304bde(如果我的地址数学正确的话),这似乎与“在某个函数中间的某处跳转”一致。您可以通过检查 CPSR 的第 5 位来验证(假设您未处于用户模式) - 如果已设置,则您已进入 Thumb 状态。

如果是这种情况,那么“正确”的解决方案可能包括让 UEFI 加载器应用程序足够聪明,以执行正确的互通分支,但快速简单的破解方法是在某个地方放置一个 shim 仅用于初始条目,类似于:

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

【讨论】:

  • 你是 blx 还是 bx。正如你所说,它以拇指模式启动。现在它一直运行到它在指令str r1, [r0] 处中断。那么这条指令是否有效,我读到第一个参数应该是寄存器。 Data Abort Exception PC at 0x803050F0 CPSR 0x600001D3 nZCveAIFt_svc Translation fault on Section: write to 0x4020FFC8
  • 看来我必须禁用 MMU.. 谢谢
  • 啊,我总是忘记bx 没有直接形式,谢谢。
  • 使用 efi 加载应用实在是太麻烦了……到处卡住
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
  • 2020-03-10
  • 2018-06-16
  • 1970-01-01
相关资源
最近更新 更多