LINUX.ORG.RU

QEMU с другим BIOS

 


1

1

Уважаемые специалисты. Юзаю процессор PowerPC. В QEMU для него предлагается стандартный BIOS OpenBIOS, а мне нужно подставить свой. В QEMU файл OpenBIOS содержится в формате ELF. Просто й подменой на свой сделать не получится. Надо либо свой BIOS переделывать в формат ELF с указанием точек входа и всего прочего, либо может есть какая-то возможность в QEMU засунуть файл BIOS в конкретный адрес адресного пространства. Далее хочу с помощью IDA PRO Remoute DBG подключиться к отладочному порту 1234 и дебажить его. Помогите пожалуйста.

Не обязательно ELF. Как минимум, ни для Маков, ни для PReP, ELF не требуется. При запуске управление передаётся на тот же адрес, что и на реальных железках.

alt-x ★★★★★
()
Ответ на: комментарий от alt-x

Но ELF удобнее для загрузки в GDB. Когда ты говоришь «подставить свой» - имеется ввиду, что ты его сам компилишь из исходников? Тогда лучше сделать ELF, чтобы можно было просто запускать gdb-ppc мойбиос.elf.

Если исходников нет то просто

qemu-system-ppc -bios чужойбиос.bin -s -S
, потом в gdb-ppc говоришь
target remote localhost:1234
и в путь.

alt-x ★★★★★
()
Последнее исправление: alt-x (всего исправлений: 1)
Ответ на: комментарий от Viktor2004

Используй опцию "-bios ". Но подозреваю, что тебе захочется видеть имена функций, которые вызываются, а не просто ассемблерный код. Для этого нужно загрузить биос в gdb. Проще всего это сделать с файлом в формате elf. Но можно и отдельно символы загрузить. В U-BOOT наверняка всё необходимое для отладки генерируется. Но если вдруг нет - точка входа не играет роли, только загрузочный адрес.

alt-x ★★★★★
()

А, пардон. У тебя IDA вместо gdb. Её я в связке с qemu не пробовал. Но принцип тот же, скорее всего.

Загрузочный адрес для не-ELF файлов определяется через #define в файле описывающем твою плату. Если он у тебя не такой как для OpenBIOS - придётся поправить #define и перекомпилить qemu.

alt-x ★★★★★
()
Ответ на: комментарий от alt-x

Запускаю

 qemu-system-ppc -bios u-boot-small.bin -s -S
Получаю
 Unable to unit server: Could not connect: Connection refused
 qemu-system-ppc: could not load PowerPC bios 'u-boot-small.bin'

Viktor2004
() автор топика
Ответ на: комментарий от Viktor2004

Вот если я указываю на bios в формате ELF, он запускается. А если указываю на бинарник, то нет. Как бы мне из бинарника ELF сделать

Viktor2004
() автор топика
Ответ на: комментарий от vel

Спасибо. В сети слишком много вариантов этой программы. В основном для обычных исполняемых файлов. Попробую разобраться.

Viktor2004
() автор топика
Ответ на: комментарий от Viktor2004

Краткое гугление на предмет u-boot elf говорит, что elf собирается и называется «u-boot». Посмотри, есть ли у тебя такой файлик. По идее он должен появляться до u-boot.bin.

alt-x ★★★★★
()
Ответ на: комментарий от alt-x

u-boot это я взял как пример. По нему потому что все известно. Цель моя совсем другое ПЗУ слитое с микросхемы встраиваемой платформы. Так что elf надо делать самому. Вот что пока получается на винде

C:\qemu>bin2elf u-boot-small.bin
Syntax : bin2Elf.exe [nbrOfSegments] [EntryPoint] [Segment1] [LoadAddress1] [Attributes1] ...
Example: bin2Elf.exe 2 0x00001000 C:\appsboot.mbn 0x0 0x0 c:\wmboot.mbn 0x00600000 0x0  

Вероятно надо как-то указать параметры. Ищу примеры в сети...

Viktor2004
() автор топика
Ответ на: комментарий от Viktor2004

EntryPoint это точка входа. А какая точка входа у BIOS? Там целая таблица векторов. Какой указать, Reset? или какой другой? Что указывать в сегментах, тоже не ясно.

Viktor2004
() автор топика
Ответ на: комментарий от Viktor2004

Reset, конечно. Но, подозреваю, что всё, кроме LoadAddress неважно: qemu всё равно прыгнет на адрес ресета. Скажи, а какая у твоей версии qemu модель по-умолчанию? Это точно не мак какой-нибудь?

qemu-system-ppc -M ?
должно сказать модель (по памяти пишу, нет сейчас возможности проверить)

alt-x ★★★★★
()
Ответ на: комментарий от Viktor2004

Щас у меня виртуальная машина слетела. Перед смертью вроде получилось загрузить бинарник с помощью -L

Viktor2004
() автор топика
Ответ на: комментарий от Viktor2004

Я тоже любитель. :) Это - машинки такие. Существенно более старые чем ppce500. Идея такая: взять кусок кода из hw/pci-host/prep.c и вставить его туда, где загружается биос в ppce500, чтобы вместо load_elf() использовалось load_image_targphys().

alt-x ★★★★★
()
Ответ на: комментарий от alt-x
40p                  IBM RS/6000 7020 (40p)
bamboo               bamboo
g3beige              Heathrow based PowerMAC (default)
mac99                Mac99 based PowerMAC
mpc8544ds            mpc8544ds
none                 empty machine
ppce500              generic paravirt e500 platform
prep                 PowerPC PREP platform
ref405ep             ref405ep
taihu                taihu
virtex-ml507         Xilinx Virtex ML507 reference design 

И как в итоге выглядит строка запуска?

Viktor2004
() автор топика
Ответ на: комментарий от alt-x
 Идея такая: взять кусок кода из hw/pci-host/prep.c и вставить его туда, где загружается биос в ppce500, чтобы вместо load_elf() использовалось load_image_targphys(). 

А можно об этом поподробнее?

Viktor2004
() автор топика
Ответ на: комментарий от Viktor2004

Моя выглядит, например так:

  ppc-softmmu/qemu-system-ppc -M 40p -bios /projects/ppc/p12h0456.img -serial telnet::4441,server -monitor stdio  -nographic -vga none -hda /projects/ppc-disks/aix-5.1.qcow2 -cpu 604

Но тут важно, что файл p12h0456.img - это дамп прошивки как раз от машинки типа 40p. C другой прошивкой - зависнет скорее всего ещё до того как последовательный порт проинициализирует.

alt-x ★★★★★
()
Последнее исправление: alt-x (всего исправлений: 1)
Ответ на: комментарий от Viktor2004

Ты в Си умеешь? Найди в файле hw/pci-host/prep.c «load_image_targphys» и посмотри как там сделано. Если дали elf - грузим elf. Иначе - грузим бинарник по заданному адресу.

alt-x ★★★★★
()
Ответ на: комментарий от alt-x

Вот этот кусок в prep.c

    memory_region_init_ram(&s->bios, OBJECT(s), "bios", BIOS_SIZE,
                           &error_fatal);
    memory_region_set_readonly(&s->bios, true);
    memory_region_add_subregion(get_system_memory(), (uint32_t)(-BIOS_SIZE),
                                &s->bios);
    vmstate_register_ram_global(&s->bios);
    if (s->bios_name) {
        filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, s->bios_name);
        if (filename) {
            if (s->elf_machine != EM_NONE) {
                bios_size = load_elf(filename, NULL, NULL, NULL,
                                     NULL, NULL, 1, s->elf_machine, 0, 0);
            }
            if (bios_size < 0) {
                bios_size = get_image_size(filename);
                if (bios_size > 0 && bios_size <= BIOS_SIZE) {
                    hwaddr bios_addr;
                    bios_size = (bios_size + 0xfff) & ~0xfff;
                    bios_addr = (uint32_t)(-BIOS_SIZE);
                    bios_size = load_image_targphys(filename, bios_addr,
                                                    bios_size);
                }
            }
        }
        if (bios_size < 0 || bios_size > BIOS_SIZE) {
            /* FIXME should error_setg() */
            hw_error("qemu: could not load bios image '%s'\n", s->bios_name);
        }
        g_free(filename);
    }
}
  

Его надо переместить вместо аналогичного в ppce500.c ?

Viktor2004
() автор топика
Ответ на: комментарий от Viktor2004

Да. Только я не уверен, что в ppce500.c, может быть это в каком-то общем файле происходит, например в hw/ppc/e500.c . Глянул сейчас в исходник. Может быть,

qemu-system-ppc -M ppce500 -kernel /путьк/твойбиос.bin

сделает как тебе надо. У них там извращение, они опцию -kernel используют для загрузки биоса, если биос не указан. Может быть ещё опцию -nodefaults добавить придётся.

alt-x ★★★★★
()
Ответ на: комментарий от alt-x

Не проходит. Слушай. Может сделаешь мне это, что бы запускались мои биусы. И загружались с адреса FFF00000. Векторная таблица у них стандартная. RESET соответственно FFF00100 Это u-boot https://yadi.sk/d/ur1Jni3I3P8Nyx он чисто для проверки работоспособности. Я его на живой плате проверял. а это https://yadi.sk/d/BA6rvcFU3P8Nv7 тот биус который меня интересует. Мне его дебажить надо. altera2004@list.ru Пиши, договоримся.

Viktor2004
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.