2015-05-01 3 views
0

Я пытаюсь загрузить приложение Freertos из UEFI на QemuBeagleboard Qemu baremetal с UEFI

  1. Когда я запустить приложение из UBoot, используя команды ниже он работает без каких-либо ошибок

    fatload mmc 0 80300000 rtosdemo.bin go 0x80300000

  2. Приложение uefi загружает файл эльфа на 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 
` 
  1. использование goto 0x80305098, который является точкой входа адр, указанный в эльфа файле. Теперь он переходит на инструкцию ldr r0, .., но после этого он просто прыгает, где-то в середине некоторой функции, а не переходит в инструкцию msr.

  2. Поскольку в UBoot его прыжки в 0x80300000, я пытался, прыгнув с этим адр, теперь он идет к инструкции b 80305098 <start>, но после этой команды вместо прыжков в 80305098 он просто переходит к следующей инструкции ldr pc, [pc, #20].

Итак, любые идеи о том, куда я иду, не так?

EDIT: Я обновил 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

Вы случайно перепрыгиваете с помощью этого кода в состояние Thumb? – Notlikethat

+0

Я не уверен ... Есть ли способ проверить – Lonewolf

ответ

0

Это код ARM, но это звучит очень похоже на то, что он прыгнул в состояние Thumb. Слово e59f00f4 будет интерпретировано в Thumb как lsls r4, r6, #3; b 0x80304bde (если у меня есть права на адрес справа), что похоже на «прыжок где-то посредине какой-то функции». Вы можете проверить, проверив бит 5 CPSR (если вы не в пользовательском режиме) - если он установлен, вы вошли в состояние Thumb.

Если это так, то «правильное» решение, вероятно, связано с тем, что приложение-загрузчик UEFI достаточно умен, чтобы сделать правильную ветку межсетевого взаимодействия, но быстрый и легкий взлом должен был разместить прокладку где-то только для начальная запись, что-то вроде:

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

Вы '' '' '' '' '' '' '' bx'''. Как вы сказали, он запускается в режиме большого пальца. Теперь он работает до точки, где он разбивается по команде '' 'str r1, [r0]' ''. Так что эта инструкция действительна, я читаю, что 1-й аргумент должен быть даже зарегистрирован. '' 'Data Abort Exception PC на 0x803050F0 CPSR 0x600001D3 nZCveAIFt_svc Ошибка перевода в разделе: записать в 0x4020FFC8''' – Lonewolf

+0

Похоже, мне пришлось отключить MMU .. Спасибо – Lonewolf

+0

А, я всегда забываю, что' bx' не имеет немедленной формы , благодаря. – Notlikethat

Смежные вопросы