Adjust memory layout for 2.6.22+ kernels with 32KB setup code master
authorMarty Connor <mdc@etherboot.org>
Tue, 18 Dec 2007 01:27:25 +0000 (20:27 -0500)
committerMarty Connor <mdc@etherboot.org>
Tue, 18 Dec 2007 01:27:25 +0000 (20:27 -0500)
Patches from Vampyre for newer kernel mknbi fixes, and for compiling on X86 64 bit machines.

Makefile
first32.c
mknbi.pl
nfl.c

index ec1f3f9..103cbf5 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -15,10 +15,10 @@ ASM=nasm
 
 # for first32*.linux
 # This one makes multiple versions
-FIRSTRELOCS=   0x92800 0x82800
+FIRSTRELOCS=   0x98800 0x88800
 OLDGAS:=       $(shell $(AS) --version | grep -q '2\.9\.1' && echo -DGAS291)
 CFLAGS=                -I. -Os -ffreestanding -fstrength-reduce -fomit-frame-pointer \
-               -mcpu=i386 \
+               -march=i386 -m32 \
                -Wall -W -Wno-format -Wno-unused -DVERSION=\"$(VERSION)$(EXTRAVERSION)\"
 LDBINARYFLAG=  --oformat binary
 FIRST32SIZE=   6144
@@ -88,20 +88,20 @@ nbitoelf:   nbitoelf.pl
 
 # 32-bit first stage protected mode call setup program
 first32@%.linux:       start32@%.o first32.o memsizes.o printf.o string.o
-       $(LD) -N -Ttext $* -e _start $(LDBINARYFLAG) -o $@ start32@$*.o first32.o memsizes.o printf.o string.o
+       $(LD) -m elf_i386 -N -Ttext $* -e _start $(LDBINARYFLAG) -o $@ start32@$*.o first32.o memsizes.o printf.o string.o
        @if [ `wc -c < $@` -gt $(FIRST32SIZE) ]; then echo Binary too large; fi
 
 # 32-bit first stage ELF setup program
 first32elf@%.linux:    start32@%.o first32elf.o memsizes.o printf.o string.o
-       $(LD) -N -Ttext $* -e _start $(LDBINARYFLAG) -o $@ start32@$*.o first32elf.o memsizes.o printf.o string.o
+       $(LD) -m elf_i386 -N -Ttext $* -e _start $(LDBINARYFLAG) -o $@ start32@$*.o first32elf.o memsizes.o printf.o string.o
        @if [ `wc -c < $@` -gt $(FIRST32SIZE) ]; then echo Binary too large; fi
 
 # 32-bit first stage ELF DOS setup program
 first32elf@%.dos:      start32@%.o first32dos.o printf.o string.o
-       $(LD) -N -Ttext $* -e _start $(LDBINARYFLAG) -o $@ start32@$*.o first32dos.o printf.o string.o
+       $(LD) -m elf_i386 -N -Ttext $* -e _start $(LDBINARYFLAG) -o $@ start32@$*.o first32dos.o printf.o string.o
 
 start32@%.o:   start32.S
-       gcc -E -DRELOC=$* $(OLDGAS) start32.S | $(AS) -o start32@$*.o
+       gcc -E -DRELOC=$* $(OLDGAS) start32.S | $(AS) -32 -o start32@$*.o
 
 first32.o:     first32.c etherboot.h start32.h
        gcc $(CFLAGS) -o first32.o -c first32.c
@@ -146,22 +146,22 @@ first-elf.fdos:   first.fdos first32elf@$(F32DRELOC).dos
 
 # Menu first stage program
 menu:  startmenu.o menu.o bootmenu.o string.o printf.o ansiesc.o md5.o misc.o serial.o
-       $(LD) -N -Ttext $(MENURELOC) -e _start $(LDBINARYFLAG) -o $@ startmenu.o menu.o bootmenu.o string.o printf.o ansiesc.o md5.o misc.o serial.o
+       $(LD) -m elf_i386 -N -Ttext $(MENURELOC) -e _start $(LDBINARYFLAG) -o $@ startmenu.o menu.o bootmenu.o string.o printf.o ansiesc.o md5.o misc.o serial.o
 
 # Another menu program, this one simpler
 menu-simple:   startmenu.o menu-simple.o string.o printf.o ansiesc.o
-       $(LD) -N -Ttext $(MENURELOC) -e _start $(LDBINARYFLAG) -o $@ startmenu.o menu-simple.o string.o printf.o ansiesc.o
+       $(LD) -m elf_i386 -N -Ttext $(MENURELOC) -e _start $(LDBINARYFLAG) -o $@ startmenu.o menu-simple.o string.o printf.o ansiesc.o
 
 # Network FreeLoader (light-bar menu program)
 nfl:   startmenu.o nfl.o string.o printf.o ansiesc.o
-       $(LD) -N -Ttext $(MENURELOC) -e _start $(LDBINARYFLAG) -o $@ startmenu.o nfl.o string.o printf.o ansiesc.o
+       $(LD) -m elf_i386 -N -Ttext $(MENURELOC) -e _start $(LDBINARYFLAG) -o $@ startmenu.o nfl.o string.o printf.o ansiesc.o
 
 # LUA interpreter
 lua/bin/lua:
        cd lua; make
 
 startmenu.o:   startmenu.S startmenu.h
-       gcc -E -Ui386 -DRELOC=$(MENURELOC) $(OLDGAS) startmenu.S | $(AS) -o startmenu.o
+       gcc -E -Ui386 -DRELOC=$(MENURELOC) $(OLDGAS) startmenu.S | $(AS) -32 -o startmenu.o
 
 menu.o:                menu.c stddef.h string.h printf.h ansiesc.h \
                misc.h linux-asm-io.h etherboot.h
index e725700..be4c3df 100644 (file)
--- a/first32.c
+++ b/first32.c
@@ -26,10 +26,11 @@ Memory layout assumed by mknbi and this program
 0x0F???-0x0FFFF     ? kB       large Etherboot data buffers (deprecated)
 0x10000-0x8FFFF 512.0 kB       kernel (from tagged image)
 0x90000-0x901FF          0.5 kB        Linux floppy boot sector (from Linux image)
-0x90200-0x921FF          8.0 kB        kernel setup (from Linux image)
-0x92200-0x923FF          0.5 kB        tagged image header ("directory")
-0x92400-0x927FF          1.0 kB        kernel parameters (generated by mknbi)
-0x92800-0x93FFF          6.0 kB        this program (generated by mknbi)
+0x90200-0x981FF         32.0 kB        kernel setup (from Linux image)
+0x98200-0x983FF          0.5 kB        tagged image header ("directory")
+0x98400-0x987FF          1.0 kB        kernel parameters (generated by mknbi)
+0x98800-0x9CFFF          6.0 kB        this program (generated by mknbi)
+
 0x94000-0x9FFFF         48.0 kB        Etherboot (top few kB may be used by BIOS)
                                Normally Etherboot starts at 0x94000
 0x100000-                      kernel (if bzImage) (from tagged image)
index ff3601c..3966943 100644 (file)
--- a/mknbi.pl
+++ b/mknbi.pl
@@ -148,10 +148,10 @@ sub make_paramstring ($)
        return ($string);
 }
 
-use constant HEADER_SEG_OFFSET => 0x220;       # in units of 16 bytes
-use constant START_OFFSET => 0x280;            # in units of 16 bytes
+use constant HEADER_SEG_OFFSET => 0x820;       # in units of 16 bytes
+use constant START_OFFSET => 0x880;            # in units of 16 bytes
 use constant START_MAX_LENGTH => 6144;
-use constant PARAM_SEG_OFFSET => 0x240;                # in units of 16 bytes
+use constant PARAM_SEG_OFFSET => 0x840;                # in units of 16 bytes
 use constant PARAM_MAX_LENGTH => 1024;
 
 sub mknbi_linux ($)
@@ -202,7 +202,7 @@ sub mknbi_linux ($)
                segment => $relocseg + 0x20,
                fromoff => 512,
                len => $setupsects * 512,
-               maxlen => 8192,
+               maxlen => 32768,
                id => 19 };
        $module->peek_file($setupseg, \$block, 512) == 512
                or die "Error reading first setup sector of $kernelfile\n";
diff --git a/nfl.c b/nfl.c
index e0de097..2c72b27 100644 (file)
--- a/nfl.c
+++ b/nfl.c
@@ -124,7 +124,7 @@ static unsigned short menu_rows = 0x0800;
 static unsigned short menu_cols = 0x0800;
 
 /* Terminal types.  */
-static int terminal = TERMINAL_CONSOLE;
+int terminal = TERMINAL_CONSOLE;
 
 /* Defined in ANSI.C */
 extern unsigned short rows, columns, attr;