========================================== $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. ==========================================