Index: loader4K.s
===================================================================
--- loader4K.s	(revision 0)
+++ loader4K.s	(revision 0)
@@ -0,0 +1,467 @@
+;*****************************************************
+; $Id: loader.s,v 1.1 2002/11/25 02:07:53 rminnich Exp $
+;*****************************************************
+USE32
+; code it is loaded into memory at 0x7000
+;*****************************************************
+nop
+nop
+;*****************************************************
+; A) setup GDT, so that we do not depend on program 
+; that loaded us for GDT. 
+; Ex: LinuxBIOS and EtherBOOT use different GDT's.
+
+;-----------------------------------------------------
+; 0)
+
+cli
+
+;-----------------------------------------------------
+; I)
+
+lgdt [0x7000+protected_gdt]
+
+;-----------------------------------------------------
+; II) setup CS
+
+jmp 0x08:0x7000+newpgdt
+
+newpgdt: nop
+
+;-----------------------------------------------------
+; III) setup all other segments
+
+mov ax,  #0x10
+mov ss,  ax
+mov ds,  ax
+mov es,  ax
+mov fs,  ax
+mov gs,  ax
+
+;-----------------------------------------------------
+; IV) 
+
+; not now
+;sti
+
+;*****************************************************
+nop
+nop
+;*****************************************************
+; B) shadow - ON (enable/read/write)
+
+mov eax, #0x80000070
+mov dx,  #0x0cf8
+out dx,  eax
+
+mov eax, #0xFFFFFFFF
+mov dx,  #0x0cfc
+out dx,  eax
+
+;*****************************************************
+nop
+nop
+;*****************************************************
+; C) copy -- boch bios
+
+; counter - 64kb.     
+mov ecx, #0x10000
+
+; source - 0x8000  ( 0x7000+0x1000 = 0x8000 ) 
+mov ax,  #0x10        ; src-segment - 2nd entry in GDT
+mov ds,  ax
+mov eax, #0x8000      ; src-offset  - 0x8000
+mov esi, eax
+
+; destination - 0xE0000
+mov ax,  #0x10        ; dst-segment - 2nd entry in GDT
+mov es,  ax     
+mov eax, #0xF0000     ; dst-offset  - 0xF0000
+mov edi, eax
+
+; clear direction flag
+cld
+
+; the copy
+rep
+  movsb
+
+;*****************************************************
+nop
+nop
+;*****************************************************
+; X) copy -- LinuxBIOS table into safe place.
+
+	;; TODO.
+	;; Q1 :	 what is the size of table.
+	;; Q2 :	 where to copy?
+		
+;*****************************************************
+nop
+nop	
+;*****************************************************
+; E) shadow - OFF (write)
+
+mov eax, #0x80000070
+mov dx,  #0x0cf8
+out dx,  eax
+
+;mov eax, #0xFFFFFFFF
+mov eax, #0x0000FFFF
+mov dx,  #0x0cfc
+out dx,  eax
+
+;*****************************************************
+nop
+nop
+;*****************************************************
+; F) do a little prep work.
+
+;-----------------------------------------------------
+; I) disable cache
+
+; if you disable cache, GRUB's GFX mode will be VERY slow.
+; so DO NOT DISABLE
+
+;mov eax, cr0
+;or  eax, #0x60000000
+;wbinvd
+;mov cr0, eax
+;wbinvd
+
+;-----------------------------------------------------
+; II) disable MTRR
+; clear the "E" (0x800) and "FE" (0x400) flags in 
+; IA32_MTRRdefType register (0x2FF)
+
+;-----------------------
+
+;mov ECX,#0x2FF
+
+; select either of the two below 
+; depending on if your compiler suports 
+; {RD,WR}MSR or not
+;rdmsr
+; .byte 0x0F, 0x32
+
+;xor edx, edx
+; xor eax, eax
+;and eax, #0xFFFFF3FF
+
+; select either of the two below 
+; depending on if your compiler suports 
+; {RD,WR}MSR or not
+;wrmsr
+; .byte 0x0F, 0x30
+
+;-----------------------
+;; This is what PC BIOS is setting. -- P6STMT.
+; add VIDEO BIOS cacheable!!!!
+;-----------------------
+; Fixed Range C0--C8
+;mov ECX,#0x268
+;mov EDX,#0x05050505 
+;mov EAX,#0x05050505 
+;wrmsr
+;-----------------------
+; Fixed Range C8--CF
+;mov ECX,#0x269
+;mov EDX,#0x0 
+;mov EAX,#0x05050505 
+;wrmsr
+;-----------------------
+
+;-----------------------------------------------------
+; III) tell BOCHS' BIOS we want to boot from hdd.
+; 0x00 - floppy
+; 0x02 - hdd
+; It's changed now //With El Torito enabled
+; 0x0 - none
+; 0x1 - floppy
+; 0x2 - hdd
+; 0x3 - cdrom
+; i.e., 0x23 means try the cdrom first, then the hdd
+; In future there will be 'fd failover'option in bochs.
+
+mov  al, #0x3d ;; cmos_reg
+out  0x70, al
+mov  al, #0x23 ;; val (cd then hdd)
+out  0x71, al
+
+;-----------------------------------------------------
+; IV) tell BOCHS' BIOS length of our mem block @ 1mb.
+;     This is for Int 15 / EAX=E820
+;     119mb = 0x77 00 00 00 
+;     (this is for 128mb of ram)
+;     (FIXME: this value is currently hard coded)
+;     (it should be being passed from LinuxBIOS )
+
+; for WinFast  6300
+; 07 70 = 0770
+; 06 80 = 0770 - 00F0		<< ALT (for unpatched bochs)
+
+; for P6STMT - 10kb less ram
+; 077F - 10     = 07 6F 
+; 07 6F - 00 F0 = 06 7F
+
+mov  al, #0x35 ;; cmos_reg
+out  0x70, al
+mov  al, #0x06 ;; val 
+out  0x71, al
+
+mov  al, #0x34 ;; cmos_reg
+out  0x70, al
+mov  al, #0x7F ;; val 
+out  0x71, al
+
+mov  al, #0x31 ;; cmos_reg
+out  0x70, al
+mov  al, #0x00 ;; val 
+out  0x71, al
+
+mov  al, #0x30 ;; cmos_reg
+out  0x70, al
+mov  al, #0x00 ;; val 
+out  0x71, al
+
+;-----------------------------------------------------
+; V) tell BOCHS' BIOS we want to have LBA translation.
+; 0x00 - NONE
+; 0x01 - LBA    <<<<
+; 0x02 - LARGE
+; 0x03 - R-CHS
+; In future there will be 'fd failover'option in bochs.
+
+mov  al, #0x39 ;; cmos_reg
+out  0x70, al
+mov  al, #0x05 ;; val 5 = (LBA and LBA) 0 = none
+out  0x71, al
+
+;*****************************************************
+nop
+nop
+;*****************************************************
+; G) the switch -- protected to real mode
+
+; IASDM, Vol 3
+; (8-14) 8.8.2 Switching Back to Real-Address Mode
+
+;=====================================================
+; 1) disable interrupts
+
+cli
+
+;=====================================================
+nop
+;=====================================================
+; 2) paging
+
+;not enabled, so not applicable.
+
+;=====================================================
+; 3) setup CS segment limit (64kb)
+; I)
+
+lgdt [0x7000+new_gdt]
+
+;-----------------------------------------------------
+; II)
+
+jmp 0x08:0x7000+new64lim
+
+new64lim: nop
+
+;=====================================================
+nop
+;=====================================================
+; 4) setup all other segments
+
+mov ax,  #0x10
+mov ss,  ax
+mov ds,  ax
+mov es,  ax
+mov fs,  ax
+mov gs,  ax
+
+;=====================================================
+nop
+;=====================================================
+; 5) LIDT
+; I)
+
+; set up Real Mode IDT table (0...3FF)
+
+; for BOCH's BIOS the address 0xF000:0xFF53 
+; cantains value 0xCF which is IRET opcode.
+
+; counter 
+mov cx,  #0xFF ;1024 bytes(255 interrupts)(4*255=0x3FF)
+
+; destination - 0x00000 = ES:EDI
+mov ax,  #0x10        ; dst-segment - 2nd entry in GDT
+mov es,  ax
+mov eax, #0x00000     ; dst-offset  - 0x00000
+mov edi, eax
+
+; data to store -- 0xF000:FF53
+mov eax, #0xF000FF53
+
+; clear direction flag
+cld
+
+; the store 
+rep
+  stosd
+
+;-----------------------------------------------------
+; II)
+; load interrupt descriptor table
+
+lidt [0x7000+new_idt]
+
+;=====================================================
+nop
+nop
+;=====================================================
+; 6) clear the PE flag in CR0 register.
+; I)
+
+; switch to 16 bit segments
+mov ax,  #0x20
+mov ss,  ax
+mov ds,  ax
+mov es,  ax
+mov fs,  ax
+mov gs,  ax
+
+;-----------------------------------------------------
+; II)
+
+; switch to 16 bit CS
+
+jmp 0x018:0x7000+new16bit
+
+USE16
+
+new16bit: nop
+
+;-----------------------------------------------------
+; III)
+; the switch
+
+;xor eax, eax
+
+mov eax, cr0            
+and eax, #0xFFFFFFFE
+mov cr0, eax            ;switch to RM
+
+;=====================================================
+nop
+nop
+;=====================================================
+; 7) far jump -- (to real mode address)
+
+jmp 0x0:0x7000+realcs
+
+realcs: nop
+
+;=====================================================
+; 8) set all segment registers to 0's
+
+mov ax,  #0x0
+mov ss,  ax
+mov ds,  ax
+mov es,  ax
+mov fs,  ax
+mov gs,  ax
+
+;=====================================================
+; 9) re-enable interrupts
+
+sti
+
+;*****************************************************
+nop
+nop
+;*****************************************************
+; H) jump to BIOS.
+
+jmp 0xFFFF:0x0000
+;jmp 0xF000:0xFFF0
+
+;*****************************************************
+;*****************************************************
+nop
+nop
+nop
+nop
+;*****************************************************
+;*****************************************************
+
+USE32
+
+new_idt:
+dw 0x03ff ;; limit 15:00
+dw 0x0000 ;; base  15:00
+dw 0x0000 ;; base  23:16
+
+new_gdt:
+dw 0x0028                     ;; limit 15:00
+dw 0x7000+new_gdt_table       ;; base  15:00
+dw 0x0000                     ;; base  23:16
+
+protected_gdt:
+dw 0x0018                     ;; limit 15:00
+dw 0x7000+pmode_gdt_table     ;; base  15:00
+dw 0x0000                     ;; base  23:16
+
+;-----------------------------------------------------
+
+new_gdt_table:
+;//  1 2 3 4 
+;//0
+dd 0x00000000
+dd 0x00000000
+
+;//8
+dd 0x0000ffff
+dd 0x00409E00
+
+;//10
+dd 0x0000ffff
+dd 0x00409200
+
+;//18
+dd 0x0000ffff
+dd 0x00009a00
+
+;//20
+dd 0x0000ffff
+dd 0x00009200
+
+;-------------------------
+
+pmode_gdt_table:
+;//  1 2 3 4 
+;//0
+dd 0x00000000
+dd 0x00000000
+
+;//8
+dd 0x0000ffff
+dd 0x00CF9E00
+
+;//10
+dd 0x0000ffff
+dd 0x00CF9200
+
+;*****************************************************
+;*****************************************************
+; the file size must be 4096 bytes.
+
+
+.org 0x1000-1
+; dd 0xdeadbeef			
+db 0x0
+
+;*****************************************************
Index: loader.s
===================================================================
--- loader.s	(revision 2762)
+++ loader.s	(working copy)
@@ -175,11 +175,17 @@
 ; III) tell BOCHS' BIOS we want to boot from hdd.
 ; 0x00 - floppy
 ; 0x02 - hdd
+; It's changed now //With El Torito enabled
+; 0x0 - none
+; 0x1 - floppy
+; 0x2 - hdd
+; 0x3 - cdrom
+; i.e., 0x23 means try the cdrom first, then the hdd
 ; In future there will be 'fd failover'option in bochs.
 
 mov  al, #0x3d ;; cmos_reg
 out  0x70, al
-mov  al, #0x02 ;; val (hdd)
+mov  al, #0x23 ;; val (cd then hdd)
 out  0x71, al
 
 ;-----------------------------------------------------
@@ -228,7 +234,7 @@
 
 mov  al, #0x39 ;; cmos_reg
 out  0x70, al
-mov  al, #0x01 ;; val (LBA)
+mov  al, #0x05 ;; val 5 = (LBA and LBA) 0 = none
 out  0x71, al
 
 ;*****************************************************
@@ -378,7 +384,7 @@
 nop
 nop
 ;*****************************************************
-; G) jump to BIOS.
+; H) jump to BIOS.
 
 jmp 0xFFFF:0x0000
 ;jmp 0xF000:0xFFF0
Index: Makefile
===================================================================
--- Makefile	(revision 2762)
+++ Makefile	(working copy)
@@ -3,10 +3,13 @@
 #-------------------------------------------------
 
 ELF064=elf/elf-header-065kb.payload
+ELF068=elf/elf-header-068kb.payload
 ELF113=elf/elf-header-113kb.payload
 ELF129=elf/elf-header-129kb.payload
+ELF132=elf/elf-header-129kb.payload
 
 LOADER=loader.o
+LOADER4K=loader4K.o
 
 BOCHS_R=bochs
 BOCHS_B=bochs/bios
@@ -14,28 +17,31 @@
 BOCHS_X=bochs/bochs-cvs/bochs/bios
 
 BIOS_R=${BOCHS_R}/rombios.bin
-BIOS_B=${BOCHS_B}/rombios.bin
+#BIOS_B=${BOCHS_B}/rombios.bin
+BIOS_B=${BOCHS_B}/BIOS-bochs-legacy
 BIOS_X=${BOCHS_X}/rombios.bin
 
 PAYLOAD=payload
+PAYLOAD_KEXEC=payload4K
 
 BOCHSCVS=-d:pserver:anonymous@cvs.bochs.sourceforge.net:/cvsroot/bochs
 
 #-------------------------------------------------
 
-all: clean build #install
+all: clean build install
 
 #-------------------------------------------------
 
-epia: loader.o bios
+build: ${LOADER4K} ${LOADER} ${BIOS_B} 
 	cat ${ELF064} ${LOADER} ${BIOS_B} > ${PAYLOAD}
-build: loader.o bios
-	cat ${ELF064} ${LOADER} ${BIOS_B} > ${PAYLOAD}
+	cat ${ELF068} ${LOADER4K} ${BIOS_B} > ${PAYLOAD_KEXEC}
 
 #-------------------------------------------------
 
 loader.o: loader.s
 	as86 loader.s -b ${LOADER}
+loader4K.o: loader4K.s
+	as86 loader4K.s -b ${LOADER4K}
 
 #-------------------------------------------------
 
