Here's a new patch which changes the loader (adds a new one) and the
Makefile so that you can have a 4K loader to keep things page aligned.
 I'm also including a new elf header which is updated to use the 4K
loader.  It needs to be put in ADLO/elf/

This allows me to use kexec to load ADLO.

It still isn't working completely, but without this patch kexec
complains that it can't use an elf that isn't page aligned.

Signed-off-by: Myles Watson <[EMAIL PROTECTED]>

Attachment: elf-header-068kb.payload
Description: Binary data

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:[EMAIL PROTECTED]:/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}
 
 #-------------------------------------------------
 
-- 
linuxbios mailing list
linuxbios@linuxbios.org
http://www.linuxbios.org/mailman/listinfo/linuxbios

Reply via email to