More hacking.
authorKen Yap <ken_yap@users.sourceforge.net>
Sun, 5 Jan 2003 05:22:22 +0000 (05:22 +0000)
committerKen Yap <ken_yap@users.sourceforge.net>
Sun, 5 Jan 2003 05:22:22 +0000 (05:22 +0000)
LOG
Makefile
menu-simple.c
menu.c
mknbi.pl
nfl.c

diff --git a/LOG b/LOG
index b154b1f..de2b7ff 100644 (file)
--- a/LOG
+++ b/LOG
@@ -167,4 +167,8 @@ parse_elf_boot_notes to other menu programs.
 
 Released as mknbi-1.2-12 (production)
 
++ Relocated menu programs to 0x60000.
+
++ Downloadable Lua interpreter.
+
 Released as mknbi-1.4.0 (production)
index 462db56..13913a1 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -198,7 +198,10 @@ install:   all $(ALTBOOT)
        -mkdir -p $(INSTLIBDIR)
        $(INSTALL) $(PROG) $(INSTLIBDIR)/
        $(INSTALL) -m 644 $(MODULES) $(FIRSTS) $(ALTBOOT) $(RMRD) $(INSTLIBDIR)/
-       if [ -e lua/bin/lua ]; then $(INSTALL) -m 644 lua/bin/lua $(INSTLIBDIR)/; fi
+       if [ -e lua/bin/lua ]; then \
+               cp -p lua/bin/lua luaprog; \
+               $(INSTALL) -m 644 luaprog $(INSTLIBDIR)/lua; \
+       fi
        -mkdir -p $(BINDIR)
        cd $(BINDIR); \
        for i in linux rom fdos dos menu nfl; \
@@ -223,6 +226,8 @@ install:    all $(ALTBOOT)
        $(INSTALL) -m 644 README LOG spec.txt $(DOCDIR)/
 
 tarball:
+       mkdir -p luabuild
+       -diff -ur --exclude='*.a' --exclude='*.o' --exclude='*.map' --unidirectional-new-file /usr/local/src/lua lua > luabuild/luapatch.txt
        (cd ..; tar zcf /tmp/mknbi-$(TARVERSION).tar.gz --exclude CVS --exclude lua mknbi-$(TARVERSION))
 
 clean:
index bb3a6da..ced267b 100644 (file)
@@ -29,7 +29,7 @@ file to be loaded to the data area. The menu program should agree with
 the menu generator on the layout of the data area.
 
 This program is linked to run at 0x60000, and expects to find config
-data at 0x80000. This means the code can be up to 128kB long.
+data at 0x70000. This means the code can be up to 64kB long.
 
 When the program starts it receives 3 parameters from Etherboot:
 
@@ -89,13 +89,13 @@ lines. getline() should be smarter.
 
 Memory layout assumed by mknbi and this program
 
-0x60000-0x7FFFF    128 kB      Menu program
-0x80000-0x8FFFF    64 kB       Menu data (initial)
+0x60000-0x6FFFF    64 kB       Menu program
+0x70000-0x7FFFF    64 kB       Menu data (initial)
 
 */
 
 #define        TIMEOUT         10                      /* seconds */
-#define        MENU_DATA       ((char *)0x80000)
+#define        MENU_DATA       ((char *)0x70000)
 
 static char    *items[10];
 
diff --git a/menu.c b/menu.c
index 4c0b066..cb3c18c 100644 (file)
--- a/menu.c
+++ b/menu.c
@@ -21,7 +21,7 @@ This is an example program which shows how the extension routine
 feature in Etherboot 5.0 works.
 
 This program is linked to run at 0x60000, and expects to find config
-data if any at 0x80000. This means the code can be up to 128kB long.
+data if any at 0x70000. This means the code can be up to 64kB long.
 
 When the program starts it receives 3 parameters from Etherboot:
 
@@ -49,8 +49,8 @@ modifying tag 129 in the bootp record.
 
 Memory layout assumed by mknbi and this program
 
-0x60000-0x7FFFF    128 kB      Menu program
-0x80000-0x8FFFF    64 kB       Menu data (initial)
+0x60000-0x6FFFF    64 kB       Menu program
+0x70000-0x7FFFF    64 kB       Menu data (initial)
 
 */
 
index ad02c56..f28effa 100644 (file)
--- a/mknbi.pl
+++ b/mknbi.pl
@@ -18,6 +18,7 @@ use Elf;
 
 use constant;
 use constant DEBUG => 0;
+use constant LUA_VERSION => 0x04000000;        # 4.0.0.0
 
 use vars qw($libdir $version $format $target $output $module $relocseg $relocsegstr
        $progreturns $param $append $rootdir $rootmode $ip $ramdisk $rdbase
@@ -400,13 +401,13 @@ sub mknbi_menu ($)
        $module->add_pm_header("mknbi-menu-$version", $relocseg + 0x0, 0x60000, 1);
        $menudesc = { file => "$libdir/menu",
                segment => 0x6000,
-               maxlen => 0x20000,
+               maxlen => 0x10000,
                id => 16 };
        $module->add_segment($menudesc);
        if ($#ARGV >= 0) {
                return unless check_file($ARGV[0]);
                $datadesc = { file => $ARGV[0],
-                       segment => 0x8000,
+                       segment => 0x7000,
                        maxlen => 0x10000,
                        id => 17,
                        end => 1 };
@@ -431,13 +432,13 @@ sub mknbi_nfl ($)
        $module->add_pm_header("mknbi-nfl-$version", $relocseg + 0x0, 0x60000, 1);
        $menudesc = { file => "$libdir/nfl",
                segment => 0x6000,
-               maxlen => 0x20000,
+               maxlen => 0x10000,
                id => 16 };
        $module->add_segment($menudesc);
        if ($#ARGV >= 0) {
                return unless check_file($ARGV[0]);
                $datadesc = { file => $ARGV[0],
-                       segment => 0x8000,
+                       segment => 0x7000,
                        maxlen => 0x10000,
                        id => 17,
                        end => 1 };
@@ -450,36 +451,54 @@ sub mknbi_nfl ($)
        $module->copy_file($datadesc) if ($#ARGV >= 0);
 }
 
+#
+#      Packing of LUA program:
+#      LUA version as network int32, i.e. 4.0.0.0
+#      progname rounded to int32 boundary
+#      length of program as network int32
+#      program
+#
+sub read_lua_prog ($) {
+       my ($progfile) = @_;
+
+       open(P, $progfile) or die "Shouldn't happen, we already did check_file!\n";
+       # remove all but last component of filename
+       $progfile =~ s:.*/::;
+       $progfile .= "\x00";
+       local $/;
+       local $_ = <P>;
+       close(P);
+       my $len = length($progfile);
+       $len = ($len + 3) & ~0x3;
+       return (pack("Na${len}Na*", LUA_VERSION, $progfile, length($_), $_));
+}
+
 sub mkelf_lua ($)
 {
        my ($module) = @_;
        my ($menudesc, $datadesc);
 
        $format eq 'elf' or die "Only ELF images are catered for\n";
-       $#ARGV >= -1 or die "Usage: mkelf-lua [luaprog]\n";
+       $#ARGV >= 0 or die "Usage: mkelf-lua luaprog\n";
        print STDERR "Warning: mkelf-lua requires Etherboot 5.0 or later\n";
-       return unless check_file("$libdir/lua");
+       return unless check_file("$libdir/lua", $ARGV[0]);
        # $progreturns == 1
-       $module->add_pm_header("mkelf-lua-$version", $relocseg + 0x0, 0x60000, 1);
+       $module->add_pm_header("mkelf-lua-$version", 0x7c0, 0x60000, 1);
        $menudesc = { file => "$libdir/lua",
                segment => 0x6000,
                maxlen => 0x20000,
                id => 16 };
        $module->add_segment($menudesc);
-       if ($#ARGV >= 0) {
-               return unless check_file($ARGV[0]);
-               $datadesc = { file => $ARGV[0],
-                       segment => 0x8000,
-                       maxlen => 0x10000,
-                       id => 17,
-                       end => 1 };
-               $module->add_segment($datadesc);
-       } else {
-               $$menudesc{'end'} = 1;
-       }
+       my $progstring = &read_lua_prog($ARGV[0]);
+       my $progdesc = { string => $progstring,
+               segment => 0x8000,
+               maxlen => 0x4000,
+               id => 17,
+               end => 1 };
+       $module->add_segment($progdesc);
        $module->dump_segments();
        $module->copy_file($menudesc);
-       $module->copy_file($datadesc) if ($#ARGV >= 0);
+       $module->copy_string($progdesc);
 }
 
 $libdir = '@@LIBDIR@@';                # where config and auxiliary files are stored
@@ -588,6 +607,8 @@ B<mknbi-nfl> [--output=I<outputfile>] [I<dataimage>]
 
 B<mkelf-nfl> [--output=I<outputfile>] [I<dataimage>]
 
+B<mkelf-lua> [--output=I<outputfile>] I<luabin>
+
 B<mknbi-fdos> [--output=I<outputfile>] I<kernel.sys floppyimage>
 
 B<mknbi-dos> [--output=I<outputfile>] I<floppyimage>
@@ -852,6 +873,22 @@ image. Chaining to other menus works.
 Enhancements to the menu format accepted to specify other features such
 as titles, timeout, colours, and so forth are highly encouraged.
 
+=head1 MKELF-LUA
+
+B<mkelf-lua> makes an ELF image from a precompiled Lua
+(C<http://www.tecgraf.puc-rio.br/lua/>) program.
+
+Typical usage is:
+
+C<mkelf-lua> C<hello.lb> > C<luaprog.nb>
+
+where C<hello.lb> was generated from a Lua program by:
+
+C<luac -o hello.lb hello.lua>
+
+The functions available to Lua programs in this environment is described
+in a separate document.
+
 =head1 MKNBI-FDOS
 
 B<mknbi-fdos> makes a tagged image from a FreeDOS kernel file and a
diff --git a/nfl.c b/nfl.c
index 6f37495..a8784cc 100644 (file)
--- a/nfl.c
+++ b/nfl.c
@@ -30,7 +30,7 @@ file to be loaded to the data area. The menu program should agree with
 the menu generator on the layout of the data area.
 
 This program is linked to run at 0x60000, and expects to find config
-data at 0x80000. This means the code can be up to 128kB long.
+data at 0x70000. This means the code can be up to 64kB long.
 
 When the program starts it receives 3 parameters from Etherboot:
 
@@ -90,15 +90,15 @@ lines. getline() should be smarter.
 
 Memory layout assumed by mknbi and this program
 
-0x60000-0x7FFFF    128 kB      Menu program
-0x80000-0x8FFFF    64 kB       Menu data (initial)
+0x60000-0x6FFFF    64 kB       Menu program
+0x70000-0x7FFFF    64 kB       Menu data (initial)
 
 */
 
 #define        NFL_VERSION     "0.56"
 
 #define        TIMEOUT         10                      /* seconds */
-#define        MENU_DATA       ((char *)0x80000)
+#define        MENU_DATA       ((char *)0x70000)
 #define MENU_COLS      75
 #define MENU_ROWS      14
 #define MAX_ENTRIES    100