Простейший пример на ассемблере для MPC860xx (PowerPC)

Sep 12, 2005 4 Replies

Hello everybody.



Hет ли у кого чего-нибудь типа мигающего светодиода для сабжевого контроллера? Есть плата на XPC860MH (кстати, доку на этот MH почему-то нигде не могу найти, хотя на другие разновидности 860 лежит и на chipinfo, и на самом freescale). Плата в оригинале должна была втыкаться в PCI, для чего там стояла PCI9060, но эта самая PCI9060 по непонятным причинам сгорела и была отпаяна. При этом не ясно, исправны ли остальные компоненты, в частности сам процессор. Путём некоторых плясок с бубном удалось заставить плату подавать первичные признаки жизни, а именно неким образом шевелить шинами адреса и данных, но добиться сколь бы то ни было осмысленного поведения от имеющейся прошивки (некий бутлоадер) так и не получилось. Соответственно, ищется сабж. Можно и не на асме, а на С (лишь бы он был обозримым), но тогда дайте заодно и мэйкфайл, который из этого кода делает бинарник для заливки в ПЗУ.



Конечная цель всего этого - портировать туда u-boot и (наполеоновские планы) поставить Линух, но до этого ещё далеко...



З.Ы. Город Вращенцы велик и славен. Если вы в этом сомневаетесь, то посмотрите вокруг.



Ivan


Hello everybody.

á ×ÏÏÂÝÅ, ÅÓÔØ ÚÄÅÓØ ÌÀÄÉ, ÚÎÁËÏÍÙÅ ÓÁÂÖÅ×ÙÍ ÁÓÍÏÍ ÉÌÉ ÈÏÔÑ-ÂÙ ÐÒÏÓÔÏ Ó ËÏÍÐÉÌÑÔÏÒÏÍ GNU as? ðÙÔÁÀÓØ ×ÙÄÒÁÔØ ÉÚ ÂÏÌØÛÏÇÏ É ÎÅËÏÍÐÉÌÑÂÅÌØÎÏÇÏ ÉÓÈÏÄÎÉËÁ ÍÉÎÉÍÁÌØÎÏ ÒÁÂÏÔÏÓÐÏÓÏÂÎÙÊ ËÕÓÏÞÅË. ðÏÌÕÞÁÅÔÓÑ ÔÁË:

.section .text .align 2 /* align on word boundary */ .globl _start .globl reset

.equ CacheDisableCmd, 0x400 oemprom: .skip 0x100 VTABLE: .globl oemprom_entry

oemprom_entry: _start: ba reset .skip 0x3000-(.-oemprom) reset: li %r0,0x0000 /* all 0's in R0 */ /* Disable Data Cache before accessing any registers */ lis %r3,CacheDisableCmd /* DCache Disable command */ mtspr DC_CST,%r3 isync /* Reset Instruction Cache */ lis %r3,CacheDisableCmd /* ICache Disable command */ mtspr IC_CST,%r3 isync /* HÕ É ÐÏÛÌÉ ÄÁÌØÛÅ ÐÒÏÃ É ÖÅÌÅÚËÕ ÉÎÉÃÉÁÌÉÚÉÒÏ×ÁÔØ - ÎÁ ÄÁÎÎÏÍ ÜÔÁÐÅ*/ /* ÎÅ ×ÁÖÎÏ */

âÅÄÁ × ÔÏÍ, ÞÔÏ ÐÅÒ×ÕÀ ÉÎÓÔÒÕËÃÉÀ powerpc-elf-as ËÏÍÐÉÌÉÔ ÐÏÞÅÍÕ-ÔÏ × ba oemprom (ÓÍÏÔÒÅÌ Ó ÐÏÍÏÝØÀ IDA Pro Adv 4.8), Á ÐÏÓÌÅ powerpc-elf-objcopy -O binary ÏÎÁ É ×Ï×ÓÅ ÐÒÏÐÁÄÁÅÔ (ÐÏ ÓÍÅÝÅÎÉÀ 0x100 × ÂÉÎÁÒÎÉËÅ ÎÕÌÉ). çÄÅ ËÏÓÑË ÚÁÒÙÔ?

binutils ×ÅÒÓÉÉ 2.10, ÓÏÂÒÁÎÙ ÐÏÄ cygwin.

Ivan

Привет Ivan!

15 Sep 05 02:04, Ivan Maximov писал Ivan Maximov:

IM> А вообще, есть здесь люди, знакомые сабжевым асмом или хотя-бы просто IM> с компилятором GNU as?

Я немного знаком.

IM> oemprom: IM> .skip 0x100 IM> ba reset IM> .skip 0x3000-(.-oemprom) IM> reset:

IM> Беда в том, что первую инструкцию powerpc-elf-as компилит почему-то в IM> ba oemprom IM> (смотрел с помощью IDA Pro Adv 4.8),

В смысле, ты смотрел под отладчиком (симулятором?) в пошаговом режиме куда ba передает управление? А уверен, что ему можно верить? Лучше посмотри эту секцию с помощью objdump с ключом -d.

IM> а после powerpc-elf-objcopy -O IM> binary она и вовсе пропадает (по смещению 0x100 в бинарнике нули).

А как ты определил, что она должна быть по смещению 0x100?

IM> Где косяк зарыт?

IM> binutils версии 2.10, собраны под cygwin.

А чем вызвано использование версии более чем пятилетней давности? Последняя версия, насколько я помню, уже 2.16.

Всего наилучшего, [Team PCAD 2000] Алексей М. ... Закрой свой Ворд!

  • Replying to a msg in PERSONAL (My personal EchoMail)

Hello Alex.

15 Сен 05 13:10, you wrote to me:

IM>> oemprom: IM>> .skip 0x100 IM>> ba reset

IM>> Беда в том, что первую инструкцию powerpc-elf-as компилит IM>> почему-то в IM>> ba oemprom IM>> (смотрел с помощью IDA Pro Adv 4.8), AM> В смысле, ты смотрел под отладчиком (симулятором?) в пошаговом Hет, смотрел дизассемблером. AM> режиме куда ba передает управление? А уверен, что ему можно верить? Как выяснилось, нельзя. AM> Лучше посмотри эту секцию с помощью objdump с ключом -d. Как подсказали в ru.asm.chainik, проблема была в том, что после ассембера надо запускать ещё и линкер, а я этого не сделал. Соответственно, что IDA, что objdump -d показывали там ba 0 <oemprom>. После того, как сказал powerpc-elf-ld -o a.elf a.out , всё стало нормально. Hо почему-то только под 2.10 под cygwin.

IM>> а после powerpc-elf-objcopy -O IM>> binary она и вовсе пропадает (по смещению 0x100 в бинарнике IM>> нули). AM> А как ты определил, что она должна быть по смещению 0x100? Перед ней стоит .skip 0x100 . Как написано в man objcopy, пропадает она именно из-за того, что copying a relocatable object file between any two formats may not work as expected.

IM>> binutils версии 2.10, собраны под cygwin. AM> А чем вызвано использование версии более чем пятилетней давности? AM> Последняя версия, насколько я помню, уже 2.16. Исключительно наличием у меня её, собранной под cygwin. Пробовал 2.14 под линухом (из eldk), столкнулся с непонятными граблями:

gm@momed:~/powerpc$ ppc_8xx-ld -o a.elf a.out a.out(.text+0x100): In function `oemprom_entry': : relocation truncated to fit: R_PPC_ADDR24 reset

При этом gm@momed:~/powerpc$ ppc_8xx-ld -r -o a.elf a.out работает, но relocation не удаляет (как я понял, на то оно и -r).

Ivan

Привет Ivan!

15 Sep 05 18:28, Ivan Maximov писал Alex Mogilnikov:

AM>> А как ты определил, что она должна быть по смещению 0x100? IM> Перед ней стоит IM> .skip 0x100

Это не говорит абсолютно ни о чем. .skip 0x100 помещает 256 нулевых байт по текущему адресу в текущей секции. Как эта секция потом будет размещена, из приведенного тобой текста неизвестно. Смотри еще раз ассемблерный мануал.

IM> . Как написано в man objcopy, пропадает она именно из-за того, что IM> copying a relocatable object file between any two formats may not work IM> as expected.

Кто пропадает? Hикто у тебя не пропадал. Просто у тебя адреса были не настроены. Именно потому что ассемблер не знает, на каком адресе окажется reset. Это может знать только линкер.

AM>> А чем вызвано использование версии более чем пятилетней AM>> давности? Последняя версия, насколько я помню, уже 2.16. IM> Исключительно наличием у меня её, собранной под cygwin.

Hу, дело твое, конечно.

IM> Пробовал 2.14 IM> под линухом (из eldk), столкнулся с непонятными граблями:

IM> gm@momed:~/powerpc$ ppc_8xx-ld -o a.elf a.out IM> a.out(.text+0x100): In function `oemprom_entry': IM> : relocation truncated to fit: R_PPC_ADDR24 reset

Есть подозрение, что грабли не в линкере, а в программе. А старая версия просто на них не напарывается (вероятно, как раз ошибочно).

Всего наилучшего, [Team PCAD 2000] Алексей М. ... Синяки рождаются в споре куда чаще, чем истина...

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required