| ========================================== |
| $Id: README,v 1.1 2002/11/25 02:07:53 rminnich Exp $ |
| ========================================== |
| |
| ADLO |
| |
| A project to combine coreboot and BOCHS BIOS to add support |
| for booting legacy applications, such as Microsoft Windows. |
| |
| ========================================== |
| |
| Boot Overvew: |
| |
| ADLO requires an boot loader with ELF support. |
| In our case it is either coreboot or EtherBOOT. |
| |
| Sample execution paths: |
| |
| coreboot -> ADLO -> LILO -> LINUX |
| |
| coreboot -> EtherBOOT -> ADLO -> LILO -> LINUX |
| |
| Then it can start any real mode application. |
| In our case it could be LILO or GRUB, but |
| choices are not limited to this. |
| |
| ========================================== |
| |
| ADLO overview: |
| |
| -Elf header |
| -mainteance routines |
| -bochs bios |
| -vga bios |
| |
| ------------------------------------------ |
| |
| Elf header |
| |
| hand crafted binary. Currently there are 3 diff binaries |
| for three different sizes of payload (65kb,113kb,129kb). |
| |
| they are catted at beginning of file |
| |
| ------------------------------------------ |
| |
| mainteance routines |
| |
| this is the loader.s file which gets compiled into loader.o binary |
| |
| it is catted 2nd right after elf header and it is where |
| control is being transfered when the elf is executed. |
| |
| it consist of : |
| -tuneups: |
| select device to boot |
| set memory for Int15/EAX=E820 |
| enable LBA |
| copy coreboot table [TODO] |
| -shadow : |
| enable/write/read |
| -copy: |
| bochs @ 0xF00000 |
| video bios (binary only) @ 0xC00000 |
| -switch |
| from Real to Protected Mode |
| -jump |
| jmp to the bios at 0xFFFF:0x0000 |
| |
| we must have bios payload always at 1kb |
| offset from start of ELF payload so loader.o |
| must be always 1024 bytes. |
| |
| ------------------------------------------ |
| |
| BOCHS BIOS |
| |
| we have taken the boch's project and just extracted |
| its bios from it only. it took us (so far) only |
| minor modifications in order to make it work. |
| |
| basically it is the following directory in the |
| bochs sources |
| |
| bochs-cvs/bochs/bios |
| |
| of all files there the rombios.c is the key file. |
| Most of the times our patches are against current |
| version of the rombios.c file. We try to feed back |
| the patches to bochs maintainers so that's possible |
| to use the bochs bios as is. |
| |
| the boch's related stuff are in bochs subdirectory. |
| |
| building boch's bios is as simple as |
| |
| cd bochs/bochs-cvs/bochs/bios |
| make |
| |
| the resulting file rombios.bin is our bios image. |
| |
| ----- |
| At present time, it is recommended to use |
| dev86-0.16.3 + my patch in order to compile |
| bochs' bios. The dev86 package can be found |
| at: |
| |
| http://www.cix.co.uk/~mayday/ |
| |
| prepatched sources at: |
| |
| http://www.missl.cs.umd.edu/~adam/dev86-0.16.3-MSR.tgz |
| |
| ------------------------------------------ |
| |
| Video BIOS |
| |
| Video BIOS we use is binary only, so far. |
| |
| At the present time we are using the original |
| Video BIOS as supplied from the system. |
| |
| To get the image simply type: |
| |
| make makevideobios |
| |
| The right thing will happen. For refernece the |
| magic line in the Makefile is: |
| |
| videobios: |
| dd if=/proc/kcore \ |
| of=./video.bios.bin \ |
| bs=1 count=65536 skip=790528 |
| |
| --------------- |
| |
| We assume it is located at 0xC00000-0xE00000 |
| and we use 'dd and /proc/kcore to extract it |
| (obviously it works as root only). |
| |
| Obviously it needs to be done with original |
| (as shipped by manufactuer bios) so it should |
| be done as the first step of the ADLO setup. |
| |
| --------------- |
| |
| The /proc/kcore is in ELF format (linux kernel |
| 2.4.x and later) so if we want to get accurate |
| image of ram we must skip the ELF header. |
| The magic command is : |
| |
| readelf -a /proc/kcore |
| |
| Program Headers: |
| Type Offset VirtAddr PhysAddr FileSiz MemSiz |
| NOTE 0x0007d4 0x00000000 0x00000000 0x005b0 0x00000 |
| LOAD 0x001000 0xc0000000 0x00000000 0xff60000 0xff60000 |
| ^^^^^^^^ |
| |
| There we look for the first LOAD section, and see what |
| is its offset (for us it is 0x1000) |
| |
| --------------- |
| |
| 64KiB = 65536 |
| |
| 0x0C 00 00 + 0x10 00 = 790528 |
| |
| --------------- |
| |
| On technical note in our case video bios |
| is just 48kb, but for paranoia sake we copy |
| 64kb. |
| |
| ========================================== |
| |
| Environment overview |
| |
| ADLO is an ELF file and thus can be loaded either directly from 1) |
| coreboot, or 2) via EtherBOOT, or 3) via EtherBOOT+ AA patch for FS |
| support. |
| |
| 1) |
| Both coreboot and ADLO are on the same EEPROM chip. From end-user |
| viewpoint it is probably the most similar to the bios classic. |
| (computer boots up and just loads whatever is in MBR). |
| |
| 2) |
| Set it up in /tftpboot directory on dhcp/tftp server and have it served |
| from there. (this is how we did the development) |
| |
| 3) |
| Use AA patch and put it as /kernel file and it will be then loaded by |
| etherboot from local hard disk. |
| |
| |
| ------------------------------------------ |
| |
| Before ADLO starts. |
| |
| ADLO requires an boot loader with ELF support. |
| In our case it is: |
| |
| -coreboot |
| -coreboot and EtherBOOT |
| -coreboot and EtherBOOT + AA polled I/O patch (w/ FS support). |
| |
| As little as coreboot only is required to get ADLO |
| up and running. |
| |
| For development purposes it is recommended full set of |
| coreboot + EtherBOOT and boot via DHCP/TFTP. |
| |
| ------------------------------------------ |
| |
| After ADLO finish. |
| |
| ADLO will attempt to locate the first hard disk |
| and read MBR from it and execute. |
| |
| Then it can start any real mode application. |
| In our case it could be LILO or GRUB |
| but choices are not limited to this. |
| |
| In our case it would cause LILO to load |
| (fully usable) and from there it was able to |
| execute simple programs. so far the list |
| of the program is limited to linux which |
| runs somewhat. More to come in future. |
| |
| ========================================== |