Bring up to date with 1.4.4 (belatedly) Mknbi_1_4_4
authorKen Yap <ken_yap@users.sourceforge.net>
Fri, 18 Mar 2005 11:40:00 +0000 (11:40 +0000)
committerKen Yap <ken_yap@users.sourceforge.net>
Fri, 18 Mar 2005 11:40:00 +0000 (11:40 +0000)
12 files changed:
LOG
Makefile
README
TruncFD.pm
first32.c
linux-asm-string.h
luabuild/luapatch.txt
menu-simple.c
mknbi.pl
start32.S
string.c
string.h

diff --git a/LOG b/LOG
index a11b2bf..991471e 100644 (file)
--- a/LOG
+++ b/LOG
@@ -214,7 +214,24 @@ tested, have to postpone to 1.4.4.
 + Use perl instead of sed to substitute variables. If they have perl
 for execution they should have perl for building.
 
-+ Fix a serious error in mkelf-linux where a reference to a memory location
-in Etherboot was used after moving the initrd up in memory.
++ Fix a serious error in mkelf-linux where a reference to a memory
+location in Etherboot was used after moving the initrd up in memory.
 
 Released as mknbi-1.4.3 (production)
+
++ Improved spec file from Oron Peled.
+
++ Add memcmp to string.c and add string.o to list of objects to link,
+as recent gcc versions don't provide a builtin memcmp anymore.
+
++ Merge patches from Isac, and Michael Brown pertaining to padding
+of initrds and memdisk images.
+
++ Merge patch to menu-simple.c from Isac.
+
++ Merge corrected algorithm for calculating used sectors from Isac.
+
++ Don't print warning message for UTF-8 with Perl 5.8.3 onwards.
+Earlier versions of 5.8.x may be safe too, let me know.
+
+Released as mknbi-1.4.4 (production)
index 635e26c..ec1f3f9 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
-VERSION=1.4.3
+VERSION=1.4.4
 EXTRAVERSION=
-TARVERSION=1.4.3
+TARVERSION=1.4.4
 # spec file can override
 RPMVERSION=$(VERSION)
 
@@ -44,7 +44,7 @@ LIBDIR=               $(PREFIX)/lib/mknbi
 INSTLIBDIR=    $(INSTPREFIX)/lib/mknbi
 BINDIR=                $(INSTPREFIX)/bin
 MANDIR=                $(INSTPREFIX)/share/man/man1
-DOCDIR=                $(INSTPREFIX)/share/doc/mknbi-$(RPMVERSION)
+DOCDIR=                $(INSTPREFIX)/share/doc/packages/mknbi-$(RPMVERSION)
 
 INSTALL=       install
 
@@ -87,18 +87,18 @@ nbitoelf:   nbitoelf.pl
        chmod 755 nbitoelf
 
 # 32-bit first stage protected mode call setup program
-first32@%.linux:       start32@%.o first32.o memsizes.o printf.o
-       $(LD) -N -Ttext $* -e _start $(LDBINARYFLAG) -o $@ start32@$*.o first32.o memsizes.o printf.o
+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
        @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
-       $(LD) -N -Ttext $* -e _start $(LDBINARYFLAG) -o $@ start32@$*.o first32elf.o memsizes.o printf.o
+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
        @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
-       $(LD) -N -Ttext $* -e _start $(LDBINARYFLAG) -o $@ start32@$*.o first32dos.o printf.o
+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
 
 start32@%.o:   start32.S
        gcc -E -DRELOC=$* $(OLDGAS) start32.S | $(AS) -o start32@$*.o
@@ -243,12 +243,12 @@ install:  all $(ALTBOOT)
        -mkdir -p $(MANDIR)
        $(INSTALL) -m 644 mknbi.1 disnbi.1 $(MANDIR)/
        cd $(MANDIR); \
-       for i in mkelf mknbi-linux mkelf-linux mknbi-rom mkelf-img mknbi-menu mkelf-menu mknbi-nfl mkelf-nfl mkelf-lua mknbi-dos mknbi-fdos; \
+       for i in mkelf mknbi-linux mkelf-linux mknbi-rom mkelf-img mknbi-menu mkelf-menu mknbi-nfl mkelf-nfl mknbi-dos mknbi-fdos mkelf-lua; \
        do \
                ln -sf mknbi.1 $$i.1; \
        done
        -mkdir -p $(DOCDIR)
-       $(INSTALL) -m 644 README LOG spec.txt $(DOCDIR)/
+       $(INSTALL) -m 644 COPYING README LOG spec.txt $(DOCDIR)/
 
 tarball:
        mkdir -p luabuild
diff --git a/README b/README
index 9b597c2..673b719 100644 (file)
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-mknbi.pl 1.4.3
+mknbi.pl 1.4.4
 
 mknbi is a utility for building a tagged image for a kernel for various
 operating systems. It can also build a tagged images for an Etherboot ROM
index 08d9bfd..ceb5a4b 100755 (executable)
@@ -31,14 +31,17 @@ sub truncfd ($)
        my ($dummy1, $bytepersect, $sectperclus, $resvsectors, $fats, $rootdirents,
                $sectors, $dummy2, $sectperfat, $sectpertrk, $heads, $hidsectors,
                $bigsectors, $dummy3, $fstype) =
-               unpack('a11vCvCvvavvvVVa19a5', $buffer);
+               unpack('a11vCvCvvavvvVVa18a5', $buffer);
        if ($sectors == 0) {
            $sectors = $bigsectors;
        }
        $cylinders = $sectors / ($sectpertrk * $heads);
-       $clusters = $sectors / $sectperclus;
        $fatsectors = $fats * $sectperfat;
        $rootdirsectors = POSIX::ceil(($rootdirents * 32) / $bytepersect);
+       $clusstart  = $resvsectors + $fatsectors + $rootdirsectors;
+       $clusters = int (($sectors - $clusstart) / $sectperclus);
+       return (-s $file) unless $clusters < 65525;
+       $fstype = $clusters < 4085? 'FAT12':'FAT16' if ($fstype ne 'FAT12' && $fstype ne 'FAT16');
        if (DEBUG) {
                print STDERR <<EOF;
 $fstype filesystem:
@@ -80,12 +83,11 @@ EOF
        $buffer = pack("L*", @fatents);
        # Then extract in little endian format
        @fatents = unpack("v*", $buffer);
-       $#fatents = $clusters if ($clusters < $#fatents);
+       $#fatents = $clusters + 1 if (($clusters + 1) < $#fatents);
        foreach $i (reverse(0..$#fatents)) {
                $lastclus = $i, last if ($fatents[$i] != 0);
        }
        print STDERR "Last used cluster is $lastclus\n" if (DEBUG);
-       $clusstart = $resvsectors + $fatsectors + $rootdirsectors;
        $lastsector = $clusstart + ($lastclus - 1) * $sectperclus;
        print STDERR "Last used sector is $lastsector\n" if (DEBUG);
        return ($lastsector * 512);
index cf6f008..ac0a604 100644 (file)
--- a/first32.c
+++ b/first32.c
@@ -44,7 +44,7 @@ after bzImage kernel          ramdisk (optional) (from tagged image)
 
 extern void printf(const char *, ...);
 extern int sprintf(char *, const char *, ...);
-extern void xstart(unsigned long);
+extern void xstartlinux(unsigned long);
 extern void exit(int);
 
 #ifdef FIRST32ELF
@@ -597,6 +597,8 @@ int first(struct ebinfo *eb, union infoblock *header, struct bootp_t *bootp)
                                        && (e->addr + e->size) > top_of_initrd)
                                        top_of_initrd = e->addr + e->size;
                        }
+                       /*2004/05/08: memdisk needs 64k between initrd and the computed top */
+                       top_of_initrd -= 0x10000;
                }
                if (top_of_initrd > max)
                        top_of_initrd = max;
@@ -606,17 +608,20 @@ int first(struct ebinfo *eb, union infoblock *header, struct bootp_t *bootp)
                if (rdmode == RD_TOP || rdmode == RD_HEXADDR) {
                        long                    *dp, *sp;
 
+                       /*2004/05/08: now we have a true size rd, hence
+                               need to align tail pointer to 4k boundary up */
                        sp = (long *)((p = (unsigned char *)seg[S_RAMDISK]->p_paddr) +
-                               (i = seg[S_RAMDISK]->p_filesz));
+                               (i = ((seg[S_RAMDISK]->p_filesz + 0xfff) & ~0xfff)));
                        /*
-                        * If user specified address, align to next lower
-                        * longword boundary
+                        * If user specified address, align dest tail pointer to 4k boundary below
                         */
                        if (rdmode == RD_HEXADDR)
-                               dp = (long *)((rdaddr + i) & ~0x3);
+                               dp = (long *)((rdaddr & ~0xfff) + i);
                        else
                                dp = (long *)top_of_initrd;
-                       /* Copy to destination by longwords, tail first */
+                       /* Copy to destination by longwords, tail first;
+                               seg[] might get overwritten, save rd size first */
+                       i = seg[S_RAMDISK]->p_filesz;
                        while (sp > (long *)p)
                                *--dp = *--sp;
                        printf("Ramdisk at %#X, size %#X\n",
@@ -636,7 +641,7 @@ int first(struct ebinfo *eb, union infoblock *header, struct bootp_t *bootp)
        for (i = 0; i < 0x7ffffff; i++)
                ;
 #endif
-       xstart((unsigned long)setup);
+       xstartlinux((unsigned long)setup);
        return (0);
 }
 #endif /* FIRST32LINUX */
index e5ccc0e..e2492d6 100644 (file)
@@ -148,8 +148,6 @@ __asm__ __volatile__(
 return dest;
 }
 
-#define memcmp __builtin_memcmp
-
 extern inline void * __memset_generic(void * s, char c,size_t count)
 {
 int d0, d1;
index c020f52..7aaeaf3 100644 (file)
@@ -1,17 +1,3 @@
-diff -ur --exclude='*.a' --exclude='*.o' --exclude='*.map' --unidirectional-new-file /usr/local/src/lua-4.0.1/Makefile lua-4.0.1/Makefile
---- /usr/local/src/lua-4.0.1/Makefile  2000-11-01 04:32:01.000000000 +1100
-+++ lua-4.0.1/Makefile 2003-01-07 22:27:31.000000000 +1100
-@@ -10,8 +10,9 @@
- all clean co klean:
-       cd include; $(MAKE) $@
-       cd src; $(MAKE) $@
--      cd src/luac; $(MAKE) $@
-+      # cd src/luac; $(MAKE) $@
-       cd src/lib; $(MAKE) $@
-+      cd sa; $(MAKE) $@
-       cd src/lua; $(MAKE) $@
- # remove debug information from binaries
 diff -ur --exclude='*.a' --exclude='*.o' --exclude='*.map' --unidirectional-new-file /usr/local/src/lua-4.0.1/config lua-4.0.1/config
 --- /usr/local/src/lua-4.0.1/config    2000-11-07 07:28:20.000000000 +1100
 +++ lua-4.0.1/config   2003-01-13 10:49:43.000000000 +1100
@@ -181,50 +167,20 @@ diff -ur --exclude='*.a' --exclude='*.o' --exclude='*.map' --unidirectional-new-
 +#define       fread(a,b,c,d)  1
 +#define       feof(f)         0
 +#endif
-diff -ur --exclude='*.a' --exclude='*.o' --exclude='*.map' --unidirectional-new-file /usr/local/src/lua-4.0.1/sa/Makefile lua-4.0.1/sa/Makefile
---- /usr/local/src/lua-4.0.1/sa/Makefile       1970-01-01 10:00:00.000000000 +1000
-+++ lua-4.0.1/sa/Makefile      2003-01-13 01:08:33.000000000 +1100
-@@ -0,0 +1,40 @@
-+LUA=          ..
-+include               $(LUA)/config
-+
-+# Options for auxiliary menu program
-+# Available: -DANSIESC -DANSIMODE -DCONSOLE_CRT/CONSOLE_SERIAL -DPOWERSAVE -DCOMCONSOLE -DCOMPRESERVE
-+# ANSIMODE requires ANSIESC, see misc.c for choices
-+# Might as well take the lot since code size is not a concern
-+EXTRA_FLAGS=  -DCONSOLE_CRT -DANSIESC -DANSIMODE=-1 -DPOWERSAVE -DCOMCONSOLE=0x3f8 -DCOMPRESERVE
-+
-+# We steal the malloc .o's from uclibc. They have to be in libsalib.a
-+# otherwise they bind to the s/brk in uclibc instead of our substitute
-+UCLIBC=               /usr/i386-linux-uclibc/lib/libc.a
-+MOBJS=                malloc.o realloc.o heap_alloc.o heap_alloc_at.o free.o heap_free.o
-+
-+all:  ../lib/libsalib.a startmenu.o
-+
-+../lib/libsalib.a:    printf.o misc.o ansiesc.o brk.o luserlib.o $(UCLIBC)
-+      ar xv $(UCLIBC) $(MOBJS)
-+      $(AR) $@ printf.o misc.o ansiesc.o brk.o luserlib.o $(MOBJS)
-+
-+startmenu.o:  ../../startmenu.S
-+      gcc -E -Ui386 -DRELOC=$(LUA_RELOC) ../../startmenu.S | $(AS) -o startmenu.o
-+
-+printf.o:             ../../printf.c
-+      $(CC) $(CFLAGS) -c ../../$*.c
-+
-+misc.o:       ../../misc.h ../../misc.c ../../ansiesc.h ../../etherboot.h
-+      $(CC) $(CFLAGS) $(EXTRA_FLAGS) -c ../../$*.c
-+
-+ansiesc.o:    ../../ansiesc.h ../../ansiesc.c ../../stddef.h ../../string.h ../../etherboot.h
-+      $(CC) $(CFLAGS) $(EXTRA_FLAGS) -c ../../$*.c
-+
-+brk.o:        brk.c
-+      $(CC) $(CFLAGS) -c $*.c
-+
-+luserlib.o:   luserlib.c
-+      $(CC) $(CFLAGS) $(EXTRA_FLAGS) -c $*.c
-+
-+clean:
-+      rm *.o
+diff -ur --exclude='*.a' --exclude='*.o' --exclude='*.map' --unidirectional-new-file /usr/local/src/lua-4.0.1/Makefile lua-4.0.1/Makefile
+--- /usr/local/src/lua-4.0.1/Makefile  2000-11-01 04:32:01.000000000 +1100
++++ lua-4.0.1/Makefile 2003-01-07 22:27:31.000000000 +1100
+@@ -10,8 +10,9 @@
+ all clean co klean:
+       cd include; $(MAKE) $@
+       cd src; $(MAKE) $@
+-      cd src/luac; $(MAKE) $@
++      # cd src/luac; $(MAKE) $@
+       cd src/lib; $(MAKE) $@
++      cd sa; $(MAKE) $@
+       cd src/lua; $(MAKE) $@
+ # remove debug information from binaries
 diff -ur --exclude='*.a' --exclude='*.o' --exclude='*.map' --unidirectional-new-file /usr/local/src/lua-4.0.1/sa/brk.c lua-4.0.1/sa/brk.c
 --- /usr/local/src/lua-4.0.1/sa/brk.c  1970-01-01 10:00:00.000000000 +1000
 +++ lua-4.0.1/sa/brk.c 2003-01-07 22:27:31.000000000 +1100
@@ -344,6 +300,50 @@ diff -ur --exclude='*.a' --exclude='*.o' --exclude='*.map' --unidirectional-new-
 +LUALIB_API void lua_userlibopen (lua_State *L) {
 +  luaL_openl(L, userlib);
 +}
+diff -ur --exclude='*.a' --exclude='*.o' --exclude='*.map' --unidirectional-new-file /usr/local/src/lua-4.0.1/sa/Makefile lua-4.0.1/sa/Makefile
+--- /usr/local/src/lua-4.0.1/sa/Makefile       1970-01-01 10:00:00.000000000 +1000
++++ lua-4.0.1/sa/Makefile      2003-01-13 01:08:33.000000000 +1100
+@@ -0,0 +1,40 @@
++LUA=          ..
++include               $(LUA)/config
++
++# Options for auxiliary menu program
++# Available: -DANSIESC -DANSIMODE -DCONSOLE_CRT/CONSOLE_SERIAL -DPOWERSAVE -DCOMCONSOLE -DCOMPRESERVE
++# ANSIMODE requires ANSIESC, see misc.c for choices
++# Might as well take the lot since code size is not a concern
++EXTRA_FLAGS=  -DCONSOLE_CRT -DANSIESC -DANSIMODE=-1 -DPOWERSAVE -DCOMCONSOLE=0x3f8 -DCOMPRESERVE
++
++# We steal the malloc .o's from uclibc. They have to be in libsalib.a
++# otherwise they bind to the s/brk in uclibc instead of our substitute
++UCLIBC=               /usr/i386-linux-uclibc/lib/libc.a
++MOBJS=                malloc.o realloc.o heap_alloc.o heap_alloc_at.o free.o heap_free.o
++
++all:  ../lib/libsalib.a startmenu.o
++
++../lib/libsalib.a:    printf.o misc.o ansiesc.o brk.o luserlib.o $(UCLIBC)
++      ar xv $(UCLIBC) $(MOBJS)
++      $(AR) $@ printf.o misc.o ansiesc.o brk.o luserlib.o $(MOBJS)
++
++startmenu.o:  ../../startmenu.S
++      gcc -E -Ui386 -DRELOC=$(LUA_RELOC) ../../startmenu.S | $(AS) -o startmenu.o
++
++printf.o:             ../../printf.c
++      $(CC) $(CFLAGS) -c ../../$*.c
++
++misc.o:       ../../misc.h ../../misc.c ../../ansiesc.h ../../etherboot.h
++      $(CC) $(CFLAGS) $(EXTRA_FLAGS) -c ../../$*.c
++
++ansiesc.o:    ../../ansiesc.h ../../ansiesc.c ../../stddef.h ../../string.h ../../etherboot.h
++      $(CC) $(CFLAGS) $(EXTRA_FLAGS) -c ../../$*.c
++
++brk.o:        brk.c
++      $(CC) $(CFLAGS) -c $*.c
++
++luserlib.o:   luserlib.c
++      $(CC) $(CFLAGS) $(EXTRA_FLAGS) -c $*.c
++
++clean:
++      rm *.o
 diff -ur --exclude='*.a' --exclude='*.o' --exclude='*.map' --unidirectional-new-file /usr/local/src/lua-4.0.1/src/ldo.c lua-4.0.1/src/ldo.c
 --- /usr/local/src/lua-4.0.1/src/ldo.c 2002-06-21 00:24:40.000000000 +1000
 +++ lua-4.0.1/src/ldo.c        2003-01-07 22:27:31.000000000 +1100
@@ -365,20 +365,6 @@ diff -ur --exclude='*.a' --exclude='*.o' --exclude='*.map' --unidirectional-new-
  }
  
  
-diff -ur --exclude='*.a' --exclude='*.o' --exclude='*.map' --unidirectional-new-file /usr/local/src/lua-4.0.1/src/lib/Makefile lua-4.0.1/src/lib/Makefile
---- /usr/local/src/lua-4.0.1/src/lib/Makefile  2000-09-20 13:13:52.000000000 +1100
-+++ lua-4.0.1/src/lib/Makefile 2003-01-07 22:27:31.000000000 +1100
-@@ -7,8 +7,8 @@
- # actually only used in liolib.c
- EXTRA_DEFS= $(POPEN)
--OBJS= lauxlib.o lbaselib.o ldblib.o liolib.o lmathlib.o lstrlib.o
--SRCS= lauxlib.c lbaselib.c ldblib.c liolib.c lmathlib.c lstrlib.c
-+OBJS= lauxlib.o lbaselib.o ldblib.o lstrlib.o
-+SRCS= lauxlib.c lbaselib.c ldblib.c lstrlib.c
- T= $(LIB)/liblualib.a
 diff -ur --exclude='*.a' --exclude='*.o' --exclude='*.map' --unidirectional-new-file /usr/local/src/lua-4.0.1/src/lib/lbaselib.c lua-4.0.1/src/lib/lbaselib.c
 --- /usr/local/src/lua-4.0.1/src/lib/lbaselib.c        2002-06-12 03:01:50.000000000 +1000
 +++ lua-4.0.1/src/lib/lbaselib.c       2003-01-07 22:27:31.000000000 +1100
@@ -398,6 +384,20 @@ diff -ur --exclude='*.a' --exclude='*.o' --exclude='*.map' --unidirectional-new-
    return 0;
  }
  
+diff -ur --exclude='*.a' --exclude='*.o' --exclude='*.map' --unidirectional-new-file /usr/local/src/lua-4.0.1/src/lib/Makefile lua-4.0.1/src/lib/Makefile
+--- /usr/local/src/lua-4.0.1/src/lib/Makefile  2000-09-20 13:13:52.000000000 +1100
++++ lua-4.0.1/src/lib/Makefile 2003-01-07 22:27:31.000000000 +1100
+@@ -7,8 +7,8 @@
+ # actually only used in liolib.c
+ EXTRA_DEFS= $(POPEN)
+-OBJS= lauxlib.o lbaselib.o ldblib.o liolib.o lmathlib.o lstrlib.o
+-SRCS= lauxlib.c lbaselib.c ldblib.c liolib.c lmathlib.c lstrlib.c
++OBJS= lauxlib.o lbaselib.o ldblib.o lstrlib.o
++SRCS= lauxlib.c lbaselib.c ldblib.c lstrlib.c
+ T= $(LIB)/liblualib.a
 diff -ur --exclude='*.a' --exclude='*.o' --exclude='*.map' --unidirectional-new-file /usr/local/src/lua-4.0.1/src/llimits.h lua-4.0.1/src/llimits.h
 --- /usr/local/src/lua-4.0.1/src/llimits.h     2000-10-26 23:47:05.000000000 +1100
 +++ lua-4.0.1/src/llimits.h    2003-01-07 22:28:25.000000000 +1100
@@ -431,42 +431,6 @@ diff -ur --exclude='*.a' --exclude='*.o' --exclude='*.map' --unidirectional-new-
      optional(ls, ';');
      LUA_ASSERT(ls->fs->stacklevel == ls->fs->nactloc,
                 "stack size != # local vars");
-diff -ur --exclude='*.a' --exclude='*.o' --exclude='*.map' --unidirectional-new-file /usr/local/src/lua-4.0.1/src/lua/Makefile lua-4.0.1/src/lua/Makefile
---- /usr/local/src/lua-4.0.1/src/lua/Makefile  2000-03-31 23:52:56.000000000 +1000
-+++ lua-4.0.1/src/lua/Makefile 2003-01-07 22:27:31.000000000 +1100
-@@ -4,7 +4,7 @@
- include $(LUA)/config
--EXTRA_DEFS= $(POSIX)
-+EXTRA_DEFS+= $(POSIX)
- OBJS= lua.o
- SRCS= lua.c
-@@ -13,8 +13,8 @@
- all: $T
--$T: $(OBJS) $(LIB)/liblua.a $(LIB)/liblualib.a
--      $(CC) -o $@ $(OBJS) -L$(LIB) -llua -llualib $(EXTRA_LIBS)
-+$T: $(OBJS) $(LUA)/sa/startmenu.o $(LIB)/liblua.a $(LIB)/liblualib.a $(LIB)/libsalib.a
-+      $(LD) -M --oformat binary -N -Ttext $(LUA_RELOC) -e _start -o $@ $(LUA)/sa/startmenu.o $(OBJS) -L$(LIB) -llua -llualib -lsalib $(EXTRA_LIBS) > lua.map
- $(LIB)/liblua.a:
-       cd ..; $(MAKE)
-@@ -22,6 +22,12 @@
- $(LIB)/liblualib.a:
-       cd ../lib; $(MAKE)
-+$(LUA)/sa/startmenu.o:
-+      cd ../../sa; $(MAKE) startmenu.o
-+
-+$(LIB)/libsalib.a:
-+      cd ../../sa; $(MAKE) ../lib/libsalib.a
-+
- clean:
-       rm -f $(OBJS) $T
 diff -ur --exclude='*.a' --exclude='*.o' --exclude='*.map' --unidirectional-new-file /usr/local/src/lua-4.0.1/src/lua/lua.c lua-4.0.1/src/lua/lua.c
 --- /usr/local/src/lua-4.0.1/src/lua/lua.c     2000-10-21 03:36:32.000000000 +1100
 +++ lua-4.0.1/src/lua/lua.c    2003-01-10 13:03:11.000000000 +1100
@@ -611,3 +575,39 @@ diff -ur --exclude='*.a' --exclude='*.o' --exclude='*.map' --unidirectional-new-
 +    fprintf(stderr, "lua: error %d\n", res);
 +  return 0;
 +}
+diff -ur --exclude='*.a' --exclude='*.o' --exclude='*.map' --unidirectional-new-file /usr/local/src/lua-4.0.1/src/lua/Makefile lua-4.0.1/src/lua/Makefile
+--- /usr/local/src/lua-4.0.1/src/lua/Makefile  2000-03-31 23:52:56.000000000 +1000
++++ lua-4.0.1/src/lua/Makefile 2003-01-07 22:27:31.000000000 +1100
+@@ -4,7 +4,7 @@
+ include $(LUA)/config
+-EXTRA_DEFS= $(POSIX)
++EXTRA_DEFS+= $(POSIX)
+ OBJS= lua.o
+ SRCS= lua.c
+@@ -13,8 +13,8 @@
+ all: $T
+-$T: $(OBJS) $(LIB)/liblua.a $(LIB)/liblualib.a
+-      $(CC) -o $@ $(OBJS) -L$(LIB) -llua -llualib $(EXTRA_LIBS)
++$T: $(OBJS) $(LUA)/sa/startmenu.o $(LIB)/liblua.a $(LIB)/liblualib.a $(LIB)/libsalib.a
++      $(LD) -M --oformat binary -N -Ttext $(LUA_RELOC) -e _start -o $@ $(LUA)/sa/startmenu.o $(OBJS) -L$(LIB) -llua -llualib -lsalib $(EXTRA_LIBS) > lua.map
+ $(LIB)/liblua.a:
+       cd ..; $(MAKE)
+@@ -22,6 +22,12 @@
+ $(LIB)/liblualib.a:
+       cd ../lib; $(MAKE)
++$(LUA)/sa/startmenu.o:
++      cd ../../sa; $(MAKE) startmenu.o
++
++$(LIB)/libsalib.a:
++      cd ../../sa; $(MAKE) ../lib/libsalib.a
++
+ clean:
+       rm -f $(OBJS) $T
index 4b36fa0..b1a0ee1 100644 (file)
@@ -264,5 +264,5 @@ int menu(struct ebinfo *eb, union infoblock *header, struct bootp_t *bootp)
                strcpy(path, items[i]);
        else                    /* use directory of current pathname */
                strcpy(file, items[i]);
-       return (0);
+       return (1);
 }
index daf1370..ff3601c 100644 (file)
--- a/mknbi.pl
+++ b/mknbi.pl
@@ -26,7 +26,7 @@ use constant LUA_VERSION => 0x04000100;       # 4.0.1.0
 use bytes;
 
 use vars qw($libdir $version $format $target $output $module $relocseg $relocsegstr
-       $progreturns $param $append $rootdir $rootmode $ip $ramdisk $rdbase
+       $progreturns $param $append $rootdir $rootmode $ip $ramdisk $rdbase $rdnopad
        $simhd $dishd $squashfd $first32 $showversion);
 
 sub check_file
@@ -223,7 +223,7 @@ sub mknbi_linux ($)
                end => 1 };
        $ramdiskseg = { file => $ramdisk,
                segment => 0x10000,
-               align => 4096,
+               align => $rdnopad ? 1 : 4096,
                id => 21,
                end => 1 };
        $$kernelseg{'end'} = 0 if (defined($ramdisk));
@@ -545,6 +545,7 @@ $libdir = '@@LIBDIR@@';             # where config and auxiliary files are stored
 
 $version = '@@VERSION@@';
 $showversion = '';
+$rdnopad = 0;
 $simhd = 0;
 $dishd = 0;
 $squashfd = 1;
@@ -559,6 +560,7 @@ GetOptions('format=s' => \$format,
        'rootmode=s' => \$rootmode,
        'ip=s' => \$ip,
        'rdbase=s' => \$rdbase,
+       'rdnopad!' => \$rdnopad,
        'harddisk!' => \$simhd,
        'disableharddisk!' => \$dishd,
        'squash!' => \$squashfd,
@@ -572,7 +574,7 @@ if ($showversion) {
        exit 0;
 }
 
-if (defined($ENV{LANG}) and $ENV{LANG} =~ /\.UTF-8$/i) {
+if ($] > 5.008 and $] < 5.008003 and defined($ENV{LANG}) and $ENV{LANG} =~ /\.UTF-8$/i) {
        print STDERR <<'EOF';
 Warning: Perl 5.8 may have a bug that affects handing of strings in Unicode
 locales that may cause misbehaviour with binary files.  To work around this
@@ -596,7 +598,7 @@ binmode(STDOUT);
 
 if ($format eq 'nbi') {
        $first32 = '' if !defined($first32);
-       if ($target ne 'rom' and $target ne 'dos' and $target ne 'fdos') {
+       if ($target ne 'rom') {
                print STDERR "mkelf-$target is preferred in future instead of mknbi-$target\n";
        }
        $module = Nbi->new($libdir);
@@ -796,9 +798,12 @@ kernel in memory, if the kernel is loaded high. For this option to work,
 the kernel must be able to handle ramdisks at these addresses.
 I<0xNNNNNNNN> moves the ramdisk to the hex address specified. The onus
 is on the user to specify a suitable address that is acceptable to the
-kernel and doesn't overlap with any other segments. It will have to be
-aligned to a 4k byte boundary so you should ensure that this is so. (The
-last three hex digits must be 0.)
+kernel and doesn't overlap with any other segments. Etherboot will round
+address down to multiple of 4k (last 3 digits to zero).
+
+B<--rdnopad> By default, etherboot pads (with nulls) the given initrd of
+any size to multiple of 4k bytes (aligning to memory page boundary). Use
+this option to disable padding if it causes problem.
 
 B<--first32=>I<program> Override the default first stage setup
 program.  It can be used to call extensions to the Etherboot code, which
index 593e7f8..8cf1493 100644 (file)
--- a/start32.S
+++ b/start32.S
@@ -226,10 +226,10 @@ basememsize:
        ret
 
 /**************************************************************************
-XSTART - Transfer control to the kernel just loaded in real mode
+XSTARTLINUX - Transfer control to the kernel just loaded in real mode
 **************************************************************************/
-       .globl  xstart
-xstart:
+       .globl  xstartlinux
+xstartlinux:
        pushl   %ebp
        movl    %esp,%ebp
        pushl   %ebx
@@ -244,6 +244,16 @@ xstart:
        orl     %eax,%ebx
        call    _prot_to_real
        .code16
+/* (isac) some kernels expect segment registers to point to start of real-mode
+ * code (see Documentation/i386/boot.txt:RUNNING THE KERNEL)
+ */
+       movl    %ebx,%eax
+       shrl    $16,%eax
+       subw    $0x20,%ax /* RM start is seg. offset 0x20 before entry point */
+       movw    %ax,%ds
+       movw    %ax,%es
+       movw    %ax,%fs
+       movw    %ax,%gs
        movl    $((RELOC<<12)+(1f-RELOC)),%eax
        pushl   %eax
        pushl   %ebx
index fd0586f..dc668b6 100644 (file)
--- a/string.c
+++ b/string.c
@@ -57,3 +57,17 @@ char *strncat(char *dest, const char *src, unsigned int maxlen)
        *d = 0;
        return (dest);
 }
+
+#ifndef __HAVE_ARCH_MEMCMP
+int memcmp(const void *s1, const void *s2, int n)
+{
+       int i;
+       const unsigned char *src1 = s1, *src2 = s2;
+       for(i = 0; i < n ; i++) {
+               if (src1[i] != src2[i]) {
+                       return src1[i] - src2[i];
+               }
+       }
+       return 0;
+}
+#endif
index 41007d0..7ac10cb 100644 (file)
--- a/string.h
+++ b/string.h
@@ -5,7 +5,8 @@
  *     Prototypes for other non-inline string functions
  */
 
-char *strrchr(const char *s, int c);
-char *strcpy(char *dest, const char *src);
-char *strcat(char *dest, const char *src);
-char *strncat(char *dest, const char *src, unsigned int maxlen);
+extern char *strrchr(const char *s, int c);
+extern char *strcpy(char *dest, const char *src);
+extern char *strcat(char *dest, const char *src);
+extern char *strncat(char *dest, const char *src, unsigned int maxlen);
+extern int memcmp(const void *s1, const void *s2, int n);