Hello,
LegacyBIOS could be added to coreboot.rom by lar tool now. I modified the Makefile in arch/x86 I am now a little lost in x86emu of coreboot v3. And I have some questions. Please help me.
1. What is the address of post() in LegacyBIOS?
and then how can we call the post() function?
Well, that will require some work. :-) Take a look at how the build exports the assembler stub "post32" (in post.c) - which calls _start() (also in post.c).
asm( ".global post32\n" "post32:\n" "cli\n" "cld\n" "lidtl " __stringify(0xf0000 | OFFSET_pmode_IDT_info) "\n" "lgdtl " __stringify(0xf0000 | OFFSET_rombios32_gdt_48) "\n" "movl $" __stringify(BUILD_STACK_ADDR) ", %esp\n" "ljmp $0x10, $_start\n" );
According to these asm codes, we should load the idt and gdt and set the stack point esp before we jump to the start() function. But these codes are in LegacyBIOS, so "_start" can be used to present the address of start(). How can I call post outside LegacyBIOS but just use the bios.bin file(copied to 0xf0000)? Can this function have a fixed address? or is there another approach?
2. How to modify the post() method in LegacyBIOS? post() will auto boot the system at the end. But we want it return to coreboot. So what is the boot code at the end of the function? Is this?
init_boot_vectors();
dprintf(1, "Scan for option roms\n"); rom_scan(0xc8000, 0xe0000);
May be we could write another funcion post_noboot() without the boot code and have a fixed address?
3. How to get the address of idt of LegacyBIOS? "lidtl " __stringify(0xf0000 | OFFSET_pmode_IDT_info) "\n" "lgdtl " __stringify(0xf0000 | OFFSET_rombios32_gdt_48) "\n" "movl $" __stringify(BUILD_STACK_ADDR) ", %esp\n"
I noticed that OFFSET_pmode_IDT_info is defined in rom16.offset.auto.h. But this header file is generated in building process and I do not find the rule for it in the Makefile. So I want to know how can I get the value of OFFSET_pmode_IDT_info? So do OFFSET_rombios32_gdt_48 and BUILD_STACK_ADDR.
Kevin, could you help me with these three questions? Thanks.
4. Where is the entrance call of util/x86emu in coreboot v3? There are several x86EMU_XXX function exported in e86emu.h. But they are called only in run_bios() in biosemu.c. I placed a printk at the beginning of run_bios() but it seems not executed. How does the codes in util/x86emu used? Where is the entrance call of util/x86emu in coreboot v3? Where should I place the code to extract LegacyBIOS to the memory? Should I write a new function and export it?
Stefan, could you help me with this question? Thanks.
Best regards.
Zhang Rui