boot from iso files or embeded minimal system - vx32 - Local 9vx git repository for patches.
git clone git://r-36.net/vx32
Log
Files
Refs
---
commit 90536f1b87905c6aab9e116df8fea6205f46488a
parent 38cd867bc481a46a24dfc918583a00960ae235f1
Author: Jesus Galan Lopez (yiyus) 
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(-)
---
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
diff --git a/src/9vx/9660srv.9 b/src/9vx/9660srv.9
Binary files differ.
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
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/^/        /
diff --git a/src/9vx/boot/bootcode.9.kfs b/src/9vx/boot/bootcode.9.kfs
Binary files differ.
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;
diff --git a/src/9vx/bootcode.9 b/src/9vx/bootcode.9
Binary files differ.
diff --git a/src/9vx/bzfs.9 b/src/9vx/bzfs.9
Binary files differ.
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);
 }