==========================================
$Id: README,v 1.1 2002/11/25 02:07:53 rminnich Exp $
==========================================

ADLO

	A project to combine LinuxBIOS 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 LinuxBIOS or EtherBOOT.

	Sample execution paths:

LinuxBIOS -> ADLO -> LILO -> LINUX

LinuxBIOS -> 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 LinuxBIOS 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)
LinuxBIOS, or 2) via EtherBOOT, or 3) via EtherBOOT+ AA patch for FS
support.

1)
Both LinuxBIOS 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:

	-LinuxBIOS
	-LinuxBIOS and EtherBOOT
	-LinuxBIOS and EtherBOOT + AA polled I/O patch (w/ FS support).

	As little as LinuxBIOS only is required to get ADLO
	up and running.

	For development purposes it is recommended full set of
	LinuxBIOS + 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.

==========================================
