Before you begin
Do yourself a favor, and get a BiosSavior before you begin. We bought ours from http://www.paragonca.com. There are different models, make sure you order the one you need. It depends on the size and type of the ROM chip on your board. Our S2881 board has a 4Mbit PLCC chip:
While LinuxBIOS replaces the functions of the proprietary bios, it does NOT replace the VGA bios. If you want VGA on your linuxBIOS'd machine (not strictly necessary for servers), you will need to extract the VGA bios and concatenate it with the LinuxBIOS image, before burning it to your ROM. See below for details.
LinuxBIOS requires a Payload to boot an operating system.
If you want to boot from the network, you will need to use Etherboot.
If you want to boot from an IDE drive, SATA drive, USB stick or CDROM, you can use FILO.
Building the payload
In order to boot from a SATA disk, we use FILO.
Once you've downloaded FILO, you will need to put a file 'Config' in its root tree. An example can be found in the distribution, called 'defconfig'.
You can configure FILO to load Grub. Here's my Config, which does that:
# Use grub instead of autoboot? USE_GRUB = 1 # Grub menu.lst path MENULST_FILE = "hda1:/grub/menu.lst" # Driver for hard disk, CompactFlash, and CD-ROM on IDE bus IDE_DISK = 1 # Add a short delay when polling status registers # (required on some broken SATA controllers) IDE_DISK_POLL_DELAY = 1 # Driver for USB Storage USB_DISK = 1 # VGA text console VGA_CONSOLE = 1 PC_KEYBOARD = 1 # Enable the serial console SERIAL_CONSOLE = 1 # Serial console; real external serial port SERIAL_IOBASE = 0x3f8 SERIAL_SPEED = 115200 # Filesystems FSYS_EXT2FS = 1 FSYS_ISO9660 = 1 # Support for boot disk image in bootable CD-ROM (El Torito) ELTORITO = 1 # PCI support SUPPORT_PCI = 1 # Enable this to scan PCI busses above bus 0 # AMD64 based boards do need this. PCI_BRUTE_SCAN = 1 # Loader for standard Linux kernel image, a.k.a. /vmlinuz LINUX_LOADER = 1
In order to get serial output from Grub, you will also need to add something like this to your menu.list:
# serial port 0 serial --unit=0 --speed=115200 terminal --timeout=15 serial console
Now execute 'make', which will generate a filo.elf file that will be your payload. You will need to refer to this file to build LinuxBIOS as explained below, because it gets included in the LinuxBIOS ROM image.
Download LinuxBIOS (http://linuxbios.org/index.php/Download_LinuxBIOS). You need subversion revision 2251 or higher. Note that revisions 2288 through 2295 are known bad, do not use those.
If you want VGA support, a few changes are required in the linuxbios source tree. Edit this file:
You'll need to enable the following two lines:
#VGA Console default CONFIG_CONSOLE_VGA=1 default CONFIG_PCI_ROM_RUN=1
Whether you want VGA or not, build a tyan/s2881 tree.
cd targets ./buildtarget tyan/s2881
Modify tyan/s2881/Config.lb; change payload setting to point to your filo.elf file
If you don't need VGA, you will need to modify tyan/s2881/Config.lb. Comment out the line:
option ROM_SIZE = 475136
If you do need VGA, modify the ROM_SIZE line to the following, because our VGA bios is only 36KB, not 48K:
option ROM_SIZE = 487424
Make you are using GCC 3.4 (not GCC 4.0), or your image will be too large, and then:
cd tyan/s2881/s2881 make
Skip this section if you don't need VGA support in your LinuxBIOS.
The s2881 VGA bios is 36K long. The last 4KB are not available in RAM after boot (with the proprietary BIOS), however, so we can NOT use this method to extract the VGA BIOS:
While booted with your proprietary BIOS, you can see where your vga bios starts and how much space it takes by issuing
cat /proc/iomem | grep "Video ROM"Then get a copy of your vga bios.
dd if=/dev/mem of=vgabios.bin bs=1k count=32 skip=768Our vga bios is 32K. Verify that the image is correct - it should start with 55 AA, and contain strings that indicate it's your VGA bios. You should be able to clearly make out 'ATI RAGE' etc.
So this does not work - the last 4K is missing. Thankfully, Anton Borisov has some tools to extract the VGA BIOS - and other option ROMs, in fact - from the BIOS images that Tyan offers on its website.
You can download the tool for AMI here:
Then download the latest Bios for the s2881 from the TYAN website:
Once you have the image, you can display its contents like this:
./amideco 2881v206.rom -l
That should show output like:
-=AmiBIOSDeco, version 0.31e (Linux)=-
FileLength : 80000 (524288 bytes) FileName : 2881v206.rom
AMIBIOS information: Version : 0800 Packed Data : 56C90 (355472 bytes) Start : DF83C Packed Offset : 5F83C Offset : 80000 Released : 14 June 2005 DirName : 2881v206.--- +------------------------------------------------------------------------------+ | Class.Instance (Name) Packed ---> Expanded Compression Offset | +------------------------------------------------------------------------------+
08 01 ( Interface) 00798 ( 01944) => 00798 ( 01944) 5F83Ch 04 02 ( Setup Client) 03F40 ( 16192) => 069A2 ( 27042) + 5B8E8h 0C 03 ( ROM-ID) 00008 ( 00008) => 00008 ( 00008) 5B8CCh 0E 04 ( OEM Logo) 00B4D ( 02893) => 4B436 (308278) + 5AD68h 1A 05 ( Small Logo) 00532 ( 01330) => 026A2 ( 09890) + 5A820h 18 06 (ADM (Display MGR)) 01741 ( 05953) => 04019 ( 16409) + 590C8h 19 07 ( ADM Font) 0059C ( 01436) => 01304 ( 04868) + 58B18h 1B 08 ( SLAB) 25016 (151574) => 4CAA8 (314024) + 33AECh 21 09 ( Multilanguage) 03B90 ( 15248) => 0844A ( 33866) + 2FF48h 20 10 ( PCI AddOn ROM) 05B84 ( 23428) => 09000 ( 36864) + 2A3B0h 20 11 ( PCI AddOn ROM) 06343 ( 25411) => 0C800 ( 51200) + 24058h 20 12 ( PCI AddOn ROM) 0D5EA ( 54762) => 0E000 ( 57344) + 16A58h 20 13 ( PCI AddOn ROM) 05678 ( 22136) => 09000 ( 36864) + 113CCh 11 14 ( P6 Microcode) 2062004 (33955844) => 00039 ( 00057) + 0EBA4h 2E 15 ( User ROM) 047B3 ( 18355) => 07800 ( 30720) + 0A3DCh 06 16 ( DMI Data) 003CD ( 00973) => 00A1A ( 02586) + 09FF8h 2F 17 ( User-Defined ;)) 00C1D ( 03101) => 02595 ( 09621) + 093C4h 80 18 ( User-Defined ;)) 00038 ( 00056) => 00038 ( 00056) 09378h Total Sections : 18
Now extract all these parts:
./amideco 2881v206.rom -x
That will create a number of new files:
-rw-r--r-- 1 ward ward 27042 2006-07-07 16:29 amibody.04 -rw-r--r-- 1 ward ward 1944 2006-07-07 16:29 amibody.08 -rw-r--r-- 1 ward ward 8 2006-07-07 16:29 amibody.0c -rw-r--r-- 1 ward ward 308278 2006-07-07 16:29 amibody.0e -rw-r--r-- 1 ward ward 0 2006-07-07 16:29 amibody.11 -rw-r--r-- 1 ward ward 16409 2006-07-07 16:29 amibody.18 -rw-r--r-- 1 ward ward 4868 2006-07-07 16:29 amibody.19 -rw-r--r-- 1 ward ward 9890 2006-07-07 16:29 amibody.1a -rw-r--r-- 1 ward ward 314024 2006-07-07 16:29 amibody.1b -rw-r--r-- 1 ward ward 33866 2006-07-07 16:29 amibody.21 -rw-r--r-- 1 ward ward 36864 2006-07-07 16:29 amipci_00.20 -rw-r--r-- 1 ward ward 51200 2006-07-07 16:29 amipci_01.20 -rw-r--r-- 1 ward ward 57344 2006-07-07 16:29 amipci_02.20 -rw-r--r-- 1 ward ward 36864 2006-07-07 16:29 amipci_03.20
We know that our VGA BIOS is 36K long. Only 2 files fit the bill: amipci_00.20 and amipci_03.20. If you run 'strings' on both files, you'll see that the former is the VGA BIOS, and the latter is the Option ROM for the Broadcom network card.
So, now that we have the proper VGA bios image (36K long), we need to concatenate the VGA bios with the linuxbios image
cat amipci_00.20 linuxbios.rom > final_linuxbios.rom
Burning the bios
Make sure your Biossavior is set to the 'RD1' position (not to 'ORG'!), so that you can always revert to the original bios.
On the target machine:
cd LinuxBIOSv2/util/flashrom ./flashrom -v -w path/to/your/linuxbios.rom
If you want VGA support, make sure you burn the final_linuxbios.rom image!
You now need to 'halt' the machine. A soft reset won't work the first time you boot from the proprietary BIOS into LinuxBIOS.
Since we set up serial output in the LinuxBIOS configuration files above, you will want to hook up a serial console (or a copy of minicom or the like) to see what the box is doing while starting up. Keep your eyes on the screen after hitting the power button - LinuxBIOS will be up and running way before you expect it!
If you have problems, don't despair. Power down the box, switch the biossavior to 'ORG' and boot in the proprietary BIOS. Just don't forget to switch the biossavior back to the 'RD1' position before flashing the BIOS!
See what went wrong, and subscribe and post to the friendly and helpful mailing list if you can't figure it out by yourself.