我正在尝试在Qemu上启动UEFI的freertos应用程序
当我从uboot运行应用程序时,使用以下命令运行它没有任何错误
fatload mmc 0 80300000 rtosdemo.bin
go 0x80300000
uefi应用程序将elf文件加载到0x80300000然后我尝试了两个选项。
我的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
`
使用goto 0x80305098
这是elf文件中指定的入口点地址。现在它跳转到ldr r0, ..
指令,但之后它似乎只是在一些函数的中间跳转而不是进入msr
指令。
因为在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
现在工作正常。
答案 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