SeaBIOS: Difference between revisions
KevinOConnor (talk | contribs) (→Adding payloads: LZMA now supported) |
KevinOConnor (talk | contribs) (→Adding a VGA option rom: Note support for lzma option roms.) |
||
Line 104: | Line 104: | ||
<source lang="bash"> | <source lang="bash"> | ||
$ ./cbfstool coreboot.rom add /path/to/vgabios.bin pci1106,3344.rom 0 | $ ./cbfstool coreboot.rom add /path/to/vgabios.bin pci1106,3344.rom 0 | ||
$ ./cbfstool coreboot.rom print | |||
</source> | |||
Alternatively, SeaBIOS supports lzma compressed option roms. Use the following to add a compressed option rom instead: | |||
<source lang="bash"> | |||
$ lzma -zc < /path/to/vgabios.bin > vgabios.bin.lzma | |||
$ ./cbfstool coreboot.rom add vgabios.bin.lzma pci1106,3344.rom.lzma 0 | |||
$ ./cbfstool coreboot.rom print | $ ./cbfstool coreboot.rom print | ||
</source> | </source> |
Revision as of 02:07, 28 April 2009
SeaBIOS (previously known as LegacyBIOS) is an open-source legacy BIOS implementation, which can also be used as coreboot payload.
Use cases
Any software requiring 16-bit BIOS services benefits from SeaBIOS.
Windows XP
Windows XP has been booted on real hardware with coreboot and SeaBIOS. Some patches are required.
Windows Vista
Windows Vista (64/32 bit) has been booted on real hardware with coreboot and SeaBIOS. Some patches are required.
Windows 7 Beta
Windows 7 Beta (?? bit) has been booted on real hardware with coreboot and SeaBIOS. Some patches are required.
GRUB
GRUB works with coreboot and SeaBIOS on real hardware and boots Linux just fine.
Building
SeaBIOS
You can download the latest version of SeaBIOS through a git repository:
<source lang="bash"> $ git clone git://git.linuxtogo.org/home/kevin/seabios.git seabios $ cd seabios </source>
Alternatively, the released versions of SeaBIOS can be found at http://linuxtogo.org/~kevin/SeaBIOS/. There's also a gitweb facility to browse the latest source code online.
Edit src/config.h and set the following values:
<source lang="C">
- define CONFIG_COREBOOT 1
- define CONFIG_DEBUG_SERIAL 1
- define CONFIG_OPTIONROMS_DEPLOYED 0
- define CONFIG_COREBOOT_FLASH 1
- define CONFIG_VGAHOOKS 1
</source>
Then:
<source lang="bash"> $ make </source>
The final SeaBIOS payload file is out/bios.bin.elf, which can be used with coreboot v2 or v3.
coreboot
For best results, use coreboot-v2 and edit the target Config.lb with the following:
option CONFIG_CBFS=1 option HAVE_HIGH_TABLES=1 ... romimage "fallback" ... payload /path/to/seabios/out/bios.bin.elf end
Unfortunately, many boards don't have HAVE_HIGH_TABLES support yet. If the build fails complaining about this option, one can edit the src/mainboard/<vendor>/<board>/Options.lb file and add a "uses HAVE_HIGH_TABLES" line. Then one can edit src/arch/i386/boot/tables.c and change the lines:
<source lang="C"> uint64_t high_tables_base = 0; uint64_t high_tables_size; </source>
to:
<source lang="C"> uint64_t high_tables_base = ( <memorysize> )*1024*1024 - (64*1024); uint64_t high_tables_size = 64*1024; </source>
where <memorysize> is the amount of memory (in MiB) available on the target machine, but not more than 3072. So, if you have more than 3GiB of ram installed, put 3072. Otherwise, put the number of MiB of ram installed in your machine.
Alternatively, one can add proper support for HAVE_HIGH_TABLES.
Once the above is done, the final image will be in coreboot.rom.
SeaBIOS and CBFS
SeaBIOS can read the coreboot flash filesystem and extract option roms and payloads.
Adding a VGA option rom
Once a coreboot.rom file has been prepared, one can add option roms to it. It is frequently necessary to add a vga option rom for built-in VGA adapters so that they are properly initialized.
The first step is to find the vendor and device id of the VGA adapter. This information can be found from lspci:
<source lang="bash"> $ lspci -vnn ... 01:00.0 VGA compatible controller [0300]: VIA Technologies, Inc. UniChrome Pro IGP [1106:3344] (rev 01) (prog-if 00 [VGA controller]) </source>
In the above example, the VGA vendor/deviceid is "1106:3344". Obtain the vga rom (eg, vgabios.bin) and add it to the rom with:
<source lang="bash"> $ ./cbfstool coreboot.rom add /path/to/vgabios.bin pci1106,3344.rom 0 $ ./cbfstool coreboot.rom print </source>
Alternatively, SeaBIOS supports lzma compressed option roms. Use the following to add a compressed option rom instead:
<source lang="bash"> $ lzma -zc < /path/to/vgabios.bin > vgabios.bin.lzma $ ./cbfstool coreboot.rom add vgabios.bin.lzma pci1106,3344.rom.lzma 0 $ ./cbfstool coreboot.rom print </source>
After the above is done, one can write the coreboot.rom file to flash. SeaBIOS will extract the vga rom and run it during boot.
Adding gpxe support
A [gpxe] option rom can nicely complement SeaBIOS and coreboot by adding network boot support. Adding gpxe is similar to #Adding a VGA option rom. The first step is to find the ethernet vendor/device id. For example:
<source lang="bash"> $ lspci -vnn ... 00:09.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10) </source>
Then one can build a gpxe option rom. For example:
<source lang="bash"> $ cd gpxe/src/ $ make bin/10ec8167.rom </source>
And add it to the coreboot image. For example:
<source lang="bash"> $ ./cbfstool coreboot.rom add /path/to/gpxe/src/bin/10ec8167.rom pci10ec,8167.rom 0 $ ./cbfstool coreboot.rom print </source>
In addition to gpxe, other option roms can be added in the same manor.
Adding payloads
Most payloads can also be launched from SeaBIOS. To add a payload, build the corresponding .elf file and then add it to the coreboot.rom file in the "img/" directory. For example:
<source lang="bash"> $ ./cbfstool coreboot.rom add-payload /path/to/payload.elf img/MyPayload l $ ./cbfstool coreboot.rom print </source>
During boot, one can press the F12 key to get a boot menu. SeaBIOS will show all files in the "img/" directory, and one can instruct SeaBIOS to run them.
Note, SeaBIOS currently supports uncompressed and lzma compressed payloads. The nrv2b compression algorithm is not supported.