boot from iso files or embeded minimal system - vx32 - Local 9vx git repository for patches.
 (HTM) git clone git://r-36.net/vx32
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
 (DIR) commit 90536f1b87905c6aab9e116df8fea6205f46488a
 (DIR) parent 38cd867bc481a46a24dfc918583a00960ae235f1
 (HTM) Author: Jesus Galan Lopez (yiyus) <yiyu.jgl@gmail.com>
       Date:   Sat, 18 Sep 2010 12:23:23 +0200
       
       boot from iso files or embeded minimal system
       
       Diffstat:
         M .hgignore                           |       3 +++
         A src/9vx/9660srv.9                   |       0 
         M src/9vx/Makefrag                    |      15 +++++++++++++++
         M src/9vx/boot/boot.c.ed              |       7 +++++++
         A src/9vx/boot/bootcode.9.kfs         |       0 
         M src/9vx/boot/local.c.ed             |      28 ++++++++++++++++++++++++++++
         M src/9vx/bootcode.9                  |       0 
         A src/9vx/bzfs.9                      |       0 
         M src/9vx/main.c                      |      21 ++++++++++++++++-----
       
       9 files changed, 69 insertions(+), 5 deletions(-)
       ---
 (DIR) diff --git a/.hgignore b/.hgignore
       @@ -29,8 +29,11 @@ src/9vx/boot/*.orig
        src/9vx/boot/libboot.a8
        src/9vx/boot/bootcode.9
        src/9vx/bootcode.S
       +src/9vx/9660srv.S
       +src/9vx/bzfs.S
        src/9vx/fossil.S
        src/9vx/kfs.S
       +src/9vx/rootfs.S
        src/9vx/venti.S
        src/9vx/data2s
        src/9vx/a/errstr.h
 (DIR) diff --git a/src/9vx/9660srv.9 b/src/9vx/9660srv.9
       Binary files differ.
 (DIR) diff --git a/src/9vx/Makefrag b/src/9vx/Makefrag
       @@ -37,7 +37,9 @@ all: 9vx/9vx
        
        PLAN9_OBJS = \
                $(addprefix 9vx/, \
       +                9660srv.o \
                        bootcode.o \
       +                bzfs.o \
                        conf.o \
                        devaudio.o \
                        devaudio-$(PLAN9AUDIO).o \
       @@ -54,6 +56,7 @@ PLAN9_OBJS = \
                        load.o \
                        main.o \
                        mmu.o \
       +                rootfs.o \
                        sched.o \
                        sdloop.o \
                        stub.o \
       @@ -232,9 +235,15 @@ PLAN9_DEPS = \
        9vx/data2s: 9vx/data2s.c
                $(HOST_CC) -o $@ $<
        
       +9vx/9660srv.S: 9vx/data2s 9vx/9660srv.9
       +        ./9vx/data2s iso9660 < 9vx/9660srv.9 >$@_ && mv $@_ $@
       +
        9vx/bootcode.S: 9vx/data2s 9vx/bootcode.9
                ./9vx/data2s boot < 9vx/bootcode.9 >$@_ && mv $@_ $@
        
       +9vx/bzfs.S: 9vx/data2s 9vx/bzfs.9
       +        ./9vx/data2s bzfs < 9vx/bzfs.9 >$@_ && mv $@_ $@
       +
        9vx/factotum.S: 9vx/data2s 9vx/factotum.9
                ./9vx/data2s factotum < 9vx/factotum.9 >$@_ && mv $@_ $@
        
       @@ -244,6 +253,9 @@ PLAN9_DEPS = \
        9vx/kfs.S: 9vx/data2s 9vx/kfs.9
                ./9vx/data2s kfs < 9vx/kfs.9 >$@_ && mv $@_ $@
        
       +9vx/rootfs.S: 9vx/data2s 9vx/rootfs.bz2
       +        ./9vx/data2s rootfs < 9vx/rootfs.bz2 >$@_ && mv $@_ $@
       +
        9vx/venti.S: 9vx/data2s 9vx/venti.9
                ./9vx/data2s venti < 9vx/venti.9 > $@_ && mv $@_ $@
        
       @@ -279,10 +291,13 @@ CLEAN_FILES += \
                9vx/a/errstr.h \
                9vx/9vx \
                9vx/data2s \
       +        9vx/9660srv.S \
                9vx/bootcode.S \
       +        9vx/bzfs.S \
                9vx/factotum.S \
                9vx/fossil.S \
                9vx/kfs.S \
       +        9vx/rootfs.S \
                9vx/venti.S
        
        include 9vx/libdraw/Makefrag
 (DIR) diff --git a/src/9vx/boot/boot.c.ed b/src/9vx/boot/boot.c.ed
       @@ -12,3 +12,10 @@ char*        localroot;
        Init:
                cpuflag = (strcmp(getenv("service"), "cpu") == 0);
        .
       +/if\(cmd == nil\)/ a
       +                sprint(cmdbuf, "/%s/init", cputype);
       +                if(stat(cmdbuf, statbuf, sizeof statbuf) < 0)
       +                        sprint(cmdbuf, "/%s/bin/rc", cputype);
       +                else
       +.
       ++;/;$/ s/^/        /
 (DIR) diff --git a/src/9vx/boot/bootcode.9.kfs b/src/9vx/boot/bootcode.9.kfs
       Binary files differ.
 (DIR) diff --git a/src/9vx/boot/local.c.ed b/src/9vx/boot/local.c.ed
       @@ -1,3 +1,31 @@
       +/^connectlocalkfs/+/^$/i
       +        char buf[512];
       +        char *argv0;
       +        char *cmd = "/boot/bzfs";
       +.
       +/stat/;/^$/ d
       +/dirfstat/ i
       +        /* can do the check in 9vx -- kfs is kfs */
       +        memset(buf, 0, sizeof buf);
       +        pread(fd, buf, 512, 0);
       +        if(memcmp(buf+256, "kfs wren device\n", 16) == 0)
       +                cmd = "/boot/kfs";
       +        else{
       +                /* if an iso image, use 9660srv */
       +                pread(fd, buf, 512, 17*0x800);
       +                if(memcmp(buf, "\0CD001", 6) == 0)
       +                        cmd = "/boot/9660srv";
       +        }
       +        /* argv0 is basename(cmd) */
       +        argv0 = strrchr(cmd, '/') + 1;
       +        if(stat(cmd, statbuf, sizeof statbuf) < 0)
       +                return -1;
       +
       +.
       +/print\("kfs\.\.\."\)/ s/"kfs\.\.\."/"%s...", argv0/
       +/"kfs"/ s/"kfs"/argv0/
       +/exec/ s;"/boot/kfs";cmd;g
       +g/fatal\(.*kfs.*\)/ s/ (for )?kfs//
        /fatal\("open \/net\/ipifc\/clone for loopback"\)/s,[^        ],// &,
        a
                                return;
 (DIR) diff --git a/src/9vx/bootcode.9 b/src/9vx/bootcode.9
       Binary files differ.
 (DIR) diff --git a/src/9vx/bzfs.9 b/src/9vx/bzfs.9
       Binary files differ.
 (DIR) diff --git a/src/9vx/main.c b/src/9vx/main.c
       @@ -50,7 +50,7 @@ int        abortonfault;
        int        nocpuload;
        char*        argv0;
        char*        conffile = "9vx";
       -char*        defaultroot = "local!#Z/usr/local/9vx";
       +char*        defaultroot = "local!/boot/rootfs.bz2";
        Conf        conf;
        
        static Mach mach0;
       @@ -336,26 +336,37 @@ bootinit(void)
                 * even if we don't execute it to provide a file system.
                 * Also, maybe /boot/boot needs it.
                 *
       -         * factotum, fossil and venti are the normal Plan9 binary.
       -         * bootcode.9 is the file bootpcf.out obtained applyng
       -         * the patch in a/bootboot.ed and compiling with:
       -         *        mk 'CONF=pcf' bootpcf.out
       +         * 9660srv, bzfs, factotum, fossil and venti are
       +         * Plan9 386 executables.
       +         * bootcode.9 is the file bootpcf.out obtained running
       +         * mk in the ./boot/ directory from inside 9vx.
       +         *
       +         * TODO(yy): The boot methods should be optional
                 */
       +        extern uchar iso9660code[];
       +        extern long iso9660len;
                extern uchar bootcode[];
                extern long bootlen;
       +        extern uchar bzfscode[];
       +        extern long bzfslen;
                extern uchar factotumcode[];
                extern long factotumlen;
                extern uchar fossilcode[];
                extern long fossillen;
                extern uchar kfscode[];
                extern long kfslen;
       +        extern uchar rootfscode[];
       +        extern long rootfslen;
                extern uchar venticode[];
                extern long ventilen;
        
       +        addbootfile("9660srv", iso9660code, iso9660len);
                addbootfile("boot", bootcode, bootlen);
       +        addbootfile("bzfs", bzfscode, bzfslen);
                addbootfile("factotum", factotumcode, factotumlen);
                addbootfile("fossil", fossilcode, fossillen);
                addbootfile("kfs", kfscode, kfslen);
       +        addbootfile("rootfs.bz2", rootfscode, rootfslen);
                addbootfile("venti", venticode, ventilen);
        }