pupa-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

PUPA emu patch


From: Marco Gerards
Subject: PUPA emu patch
Date: 16 Nov 2003 19:38:34 +0100
User-agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.2

Hi,

Here is the cleaned up pupa-emu patch.  It is a lot bigger because I
have moved some functions around, changed some interfaces, etc.

I've added the "update" function to the console interfaces.  This is
useful for the ncurses console because the changes are only shown
after an update function.

I've also made some changes to the stuff in util/i386/pc.  This code
is, compared to the other code, hard to read.  Please have a look at
my changes and if it is ok.

Oh, and my changelog entry is quite long.  Perhaps much of the lines
can be written in a better way, if that is possible please tell me.

This version of the patch should be ok and I will commit it soon if
there are no problems with it.

Thanks,
Marco

2003-11-16  Marco Gerards  <address@hidden>

        * conf/i386-pc.rmk (sbin_UTILITIES): Added pupa-emu.
        (pupa_setup_SOURCES): Added util/i386/pc/getroot.c.
        (pupa_emu_SOURCES): New variable.
        (pupa_emu_LDFLAGS): Likewise.
        * include/pupa/fs.h (pupa_ext2_init) [PUPA_UTIL]: New prototype.
        (pupa_ext2_fini) [PUPA_UTIL]: Likewise.
        * include/pupa/normal.h (pupa_normal_init) [PUPA_UTIL]: Likewise.
        (pupa_normal_fini) [PUPA_UTIL]: Likewise.
        * include/pupa/setjmp.h (pupa_setjmp) [PUPA_UTIL]: New macro.
        (pupa_longjmp) [PUPA_UTIL]: Likewise.
        * include/pupa/term.h (struct pupa_term): New member `refresh'.
        (pupa_refresh): New prototype.
        * include/pupa/util/getroot.h: New file.
        * kern/misc.c (pupa_vsprintf): Refresh the screen after updating
        it.
        * kern/rescue.c (pupa_rescue_get_command_line): Likewise.
        (pupa_rescue_cmd_cat): Likewise.
        (pupa_rescue_cmd_ls): Likewise.
        (pupa_rescue_cmd_testload): Likewise.
        (pupa_rescue_cmd_lsmod): Likewise.
        * normal/cmdline.c (pupa_cmdline_get): Likewise.
        * normal/menu.c (run_menu): Likewise.
        * kern/term.c (pupa_cls): Likewise.
        (pupa_refresh): New function.
        * normal/normal.c (pupa_normal_init) [PUPA_UTIL]: New function.
        (pupa_normal_fini) [PUPA_UTIL]: Likewise.
        * util/console.c: New file.
        
        * util/i386/pc/getroot.c: New file.
        * util/i386/pc/pupa-setup.c: Include <pupa/util/getroot.h>.
        (pupa_putchar): New function.
        (pupa_refresh): Likewise.
        (xgetcwd): Function moved to ...
        (strip_extra_slashes): Likewise.
        (get_prefix): Likewise.
        * util/i386/pc/getroot.c: ... here.     
        (find_root_device): Function moved and renamed to...
        * util/i386/pc/getroot.c (pupa_find_root_device): ... here.
        Changed all callers.
        * util/i386/pc/pupa-setup.c (guess_root_device): Function moved
        and renamed to...
        * util/i386/pc/getroot.c (pupa_guess_root_device): ... here.
        Changed all callers.
        * util/misc.c (pupa_memalign): New function.
        (pupa_mm_init_region): Likewise.
        (pupa_register_exported_symbols): Likewise.
        (pupa_putchar): Function removed.
        * util/pupa-emu.c: New file.

diff -uprN --exclude=CVS pupacvs/conf/i386-pc.mk pupa/conf/i386-pc.mk
--- pupacvs/conf/i386-pc.mk     2003-11-16 17:41:42.000000000 +0100
+++ pupa/conf/i386-pc.mk        2003-11-16 18:08:46.000000000 +0100
@@ -239,7 +239,7 @@ kernel_syms.lst: $(addprefix include/pup
 
 # Utilities.
 bin_UTILITIES = pupa-mkimage
-sbin_UTILITIES = pupa-setup
+sbin_UTILITIES = pupa-setup pupa-emu
 noinst_UTILITIES = genmoddep
 
 # For pupa-mkimage.
@@ -279,12 +279,13 @@ pupa_mkimage_LDFLAGS = -llzo
 
 # For pupa-setup.
 pupa_setup_SOURCES = util/i386/pc/pupa-setup.c util/i386/pc/biosdisk.c \
-       util/misc.c kern/device.c kern/disk.c kern/file.c kern/fs.c \
-       kern/err.c kern/misc.c disk/i386/pc/partition.c fs/fat.c fs/ext2.c
-CLEANFILES += pupa-setup pupa_setup-util_i386_pc_pupa_setup.o 
pupa_setup-util_i386_pc_biosdisk.o pupa_setup-util_misc.o 
pupa_setup-kern_device.o pupa_setup-kern_disk.o pupa_setup-kern_file.o 
pupa_setup-kern_fs.o pupa_setup-kern_err.o pupa_setup-kern_misc.o 
pupa_setup-disk_i386_pc_partition.o pupa_setup-fs_fat.o pupa_setup-fs_ext2.o
-MOSTLYCLEANFILES += pupa_setup-util_i386_pc_pupa_setup.d 
pupa_setup-util_i386_pc_biosdisk.d pupa_setup-util_misc.d 
pupa_setup-kern_device.d pupa_setup-kern_disk.d pupa_setup-kern_file.d 
pupa_setup-kern_fs.d pupa_setup-kern_err.d pupa_setup-kern_misc.d 
pupa_setup-disk_i386_pc_partition.d pupa_setup-fs_fat.d pupa_setup-fs_ext2.d
+       util/misc.c util/i386/pc/getroot.c kern/device.c kern/disk.c \
+       kern/err.c kern/misc.c disk/i386/pc/partition.c fs/fat.c fs/ext2.c \
+       kern/file.c kern/fs.c
+CLEANFILES += pupa-setup pupa_setup-util_i386_pc_pupa_setup.o 
pupa_setup-util_i386_pc_biosdisk.o pupa_setup-util_misc.o 
pupa_setup-util_i386_pc_getroot.o pupa_setup-kern_device.o 
pupa_setup-kern_disk.o pupa_setup-kern_err.o pupa_setup-kern_misc.o 
pupa_setup-disk_i386_pc_partition.o pupa_setup-fs_fat.o pupa_setup-fs_ext2.o 
pupa_setup-kern_file.o pupa_setup-kern_fs.o
+MOSTLYCLEANFILES += pupa_setup-util_i386_pc_pupa_setup.d 
pupa_setup-util_i386_pc_biosdisk.d pupa_setup-util_misc.d 
pupa_setup-util_i386_pc_getroot.d pupa_setup-kern_device.d 
pupa_setup-kern_disk.d pupa_setup-kern_err.d pupa_setup-kern_misc.d 
pupa_setup-disk_i386_pc_partition.d pupa_setup-fs_fat.d pupa_setup-fs_ext2.d 
pupa_setup-kern_file.d pupa_setup-kern_fs.d
 
-pupa-setup: pupa_setup-util_i386_pc_pupa_setup.o 
pupa_setup-util_i386_pc_biosdisk.o pupa_setup-util_misc.o 
pupa_setup-kern_device.o pupa_setup-kern_disk.o pupa_setup-kern_file.o 
pupa_setup-kern_fs.o pupa_setup-kern_err.o pupa_setup-kern_misc.o 
pupa_setup-disk_i386_pc_partition.o pupa_setup-fs_fat.o pupa_setup-fs_ext2.o
+pupa-setup: pupa_setup-util_i386_pc_pupa_setup.o 
pupa_setup-util_i386_pc_biosdisk.o pupa_setup-util_misc.o 
pupa_setup-util_i386_pc_getroot.o pupa_setup-kern_device.o 
pupa_setup-kern_disk.o pupa_setup-kern_err.o pupa_setup-kern_misc.o 
pupa_setup-disk_i386_pc_partition.o pupa_setup-fs_fat.o pupa_setup-fs_ext2.o 
pupa_setup-kern_file.o pupa_setup-kern_fs.o
        $(BUILD_CC) -o $@ $^ $(BUILD_LDFLAGS) $(pupa_setup_LDFLAGS)
 
 pupa_setup-util_i386_pc_pupa_setup.o: util/i386/pc/pupa-setup.c
@@ -311,6 +312,14 @@ pupa_setup-util_misc.d: util/misc.c
 
 -include pupa_setup-util_misc.d
 
+pupa_setup-util_i386_pc_getroot.o: util/i386/pc/getroot.c
+       $(BUILD_CC) -Iutil/i386/pc -I$(srcdir)/util/i386/pc $(BUILD_CPPFLAGS) 
$(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_setup_CFLAGS) -c -o $@ $<
+
+pupa_setup-util_i386_pc_getroot.d: util/i386/pc/getroot.c
+       set -e;           $(BUILD_CC) -Iutil/i386/pc -I$(srcdir)/util/i386/pc 
$(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_setup_CFLAGS) -M $<      
    | sed 's,getroot\.o[ :]*,pupa_setup-util_i386_pc_getroot.o $@ : ,g' > $@;   
    [ -s $@ ] || rm -f $@
+
+-include pupa_setup-util_i386_pc_getroot.d
+
 pupa_setup-kern_device.o: kern/device.c
        $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) 
-DPUPA_UTIL=1 $(pupa_setup_CFLAGS) -c -o $@ $<
 
@@ -327,22 +336,6 @@ pupa_setup-kern_disk.d: kern/disk.c
 
 -include pupa_setup-kern_disk.d
 
-pupa_setup-kern_file.o: kern/file.c
-       $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) 
-DPUPA_UTIL=1 $(pupa_setup_CFLAGS) -c -o $@ $<
-
-pupa_setup-kern_file.d: kern/file.c
-       set -e;           $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) 
$(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_setup_CFLAGS) -M $<          | sed 
's,file\.o[ :]*,pupa_setup-kern_file.o $@ : ,g' > $@;     [ -s $@ ] || rm -f $@
-
--include pupa_setup-kern_file.d
-
-pupa_setup-kern_fs.o: kern/fs.c
-       $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) 
-DPUPA_UTIL=1 $(pupa_setup_CFLAGS) -c -o $@ $<
-
-pupa_setup-kern_fs.d: kern/fs.c
-       set -e;           $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) 
$(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_setup_CFLAGS) -M $<          | sed 
's,fs\.o[ :]*,pupa_setup-kern_fs.o $@ : ,g' > $@;         [ -s $@ ] || rm -f $@
-
--include pupa_setup-kern_fs.d
-
 pupa_setup-kern_err.o: kern/err.c
        $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) 
-DPUPA_UTIL=1 $(pupa_setup_CFLAGS) -c -o $@ $<
 
@@ -383,6 +376,222 @@ pupa_setup-fs_ext2.d: fs/ext2.c
 
 -include pupa_setup-fs_ext2.d
 
+pupa_setup-kern_file.o: kern/file.c
+       $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) 
-DPUPA_UTIL=1 $(pupa_setup_CFLAGS) -c -o $@ $<
+
+pupa_setup-kern_file.d: kern/file.c
+       set -e;           $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) 
$(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_setup_CFLAGS) -M $<          | sed 
's,file\.o[ :]*,pupa_setup-kern_file.o $@ : ,g' > $@;     [ -s $@ ] || rm -f $@
+
+-include pupa_setup-kern_file.d
+
+pupa_setup-kern_fs.o: kern/fs.c
+       $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) 
-DPUPA_UTIL=1 $(pupa_setup_CFLAGS) -c -o $@ $<
+
+pupa_setup-kern_fs.d: kern/fs.c
+       set -e;           $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) 
$(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_setup_CFLAGS) -M $<          | sed 
's,fs\.o[ :]*,pupa_setup-kern_fs.o $@ : ,g' > $@;         [ -s $@ ] || rm -f $@
+
+-include pupa_setup-kern_fs.d
+
+
+# For pupa
+pupa_emu_SOURCES = kern/main.c kern/device.c                           \
+       kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c          \
+        kern/misc.c kern/loader.c kern/rescue.c kern/term.c            \
+       disk/i386/pc/partition.c                                        \
+       util/i386/pc/biosdisk.c fs/fat.c fs/ext2.c                      \
+       normal/cmdline.c normal/command.c normal/main.c normal/menu.c   \
+       util/console.c util/pupa-emu.c util/misc.c util/i386/pc/getroot.c
+CLEANFILES += pupa-emu pupa_emu-kern_main.o pupa_emu-kern_device.o 
pupa_emu-kern_disk.o pupa_emu-kern_dl.o pupa_emu-kern_file.o pupa_emu-kern_fs.o 
pupa_emu-kern_err.o pupa_emu-kern_misc.o pupa_emu-kern_loader.o 
pupa_emu-kern_rescue.o pupa_emu-kern_term.o pupa_emu-disk_i386_pc_partition.o 
pupa_emu-util_i386_pc_biosdisk.o pupa_emu-fs_fat.o pupa_emu-fs_ext2.o 
pupa_emu-normal_cmdline.o pupa_emu-normal_command.o pupa_emu-normal_main.o 
pupa_emu-normal_menu.o pupa_emu-util_console.o pupa_emu-util_pupa_emu.o 
pupa_emu-util_misc.o pupa_emu-util_i386_pc_getroot.o
+MOSTLYCLEANFILES += pupa_emu-kern_main.d pupa_emu-kern_device.d 
pupa_emu-kern_disk.d pupa_emu-kern_dl.d pupa_emu-kern_file.d pupa_emu-kern_fs.d 
pupa_emu-kern_err.d pupa_emu-kern_misc.d pupa_emu-kern_loader.d 
pupa_emu-kern_rescue.d pupa_emu-kern_term.d pupa_emu-disk_i386_pc_partition.d 
pupa_emu-util_i386_pc_biosdisk.d pupa_emu-fs_fat.d pupa_emu-fs_ext2.d 
pupa_emu-normal_cmdline.d pupa_emu-normal_command.d pupa_emu-normal_main.d 
pupa_emu-normal_menu.d pupa_emu-util_console.d pupa_emu-util_pupa_emu.d 
pupa_emu-util_misc.d pupa_emu-util_i386_pc_getroot.d
+
+pupa-emu: pupa_emu-kern_main.o pupa_emu-kern_device.o pupa_emu-kern_disk.o 
pupa_emu-kern_dl.o pupa_emu-kern_file.o pupa_emu-kern_fs.o pupa_emu-kern_err.o 
pupa_emu-kern_misc.o pupa_emu-kern_loader.o pupa_emu-kern_rescue.o 
pupa_emu-kern_term.o pupa_emu-disk_i386_pc_partition.o 
pupa_emu-util_i386_pc_biosdisk.o pupa_emu-fs_fat.o pupa_emu-fs_ext2.o 
pupa_emu-normal_cmdline.o pupa_emu-normal_command.o pupa_emu-normal_main.o 
pupa_emu-normal_menu.o pupa_emu-util_console.o pupa_emu-util_pupa_emu.o 
pupa_emu-util_misc.o pupa_emu-util_i386_pc_getroot.o
+       $(BUILD_CC) -o $@ $^ $(BUILD_LDFLAGS) $(pupa_emu_LDFLAGS)
+
+pupa_emu-kern_main.o: kern/main.c
+       $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) 
-DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
+
+pupa_emu-kern_main.d: kern/main.c
+       set -e;           $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) 
$(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $<    | sed 's,main\.o[ 
:]*,pupa_emu-kern_main.o $@ : ,g' > $@;       [ -s $@ ] || rm -f $@
+
+-include pupa_emu-kern_main.d
+
+pupa_emu-kern_device.o: kern/device.c
+       $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) 
-DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
+
+pupa_emu-kern_device.d: kern/device.c
+       set -e;           $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) 
$(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $<    | sed 's,device\.o[ 
:]*,pupa_emu-kern_device.o $@ : ,g' > $@;           [ -s $@ ] || rm -f $@
+
+-include pupa_emu-kern_device.d
+
+pupa_emu-kern_disk.o: kern/disk.c
+       $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) 
-DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
+
+pupa_emu-kern_disk.d: kern/disk.c
+       set -e;           $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) 
$(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $<    | sed 's,disk\.o[ 
:]*,pupa_emu-kern_disk.o $@ : ,g' > $@;       [ -s $@ ] || rm -f $@
+
+-include pupa_emu-kern_disk.d
+
+pupa_emu-kern_dl.o: kern/dl.c
+       $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) 
-DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
+
+pupa_emu-kern_dl.d: kern/dl.c
+       set -e;           $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) 
$(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $<    | sed 's,dl\.o[ 
:]*,pupa_emu-kern_dl.o $@ : ,g' > $@;           [ -s $@ ] || rm -f $@
+
+-include pupa_emu-kern_dl.d
+
+pupa_emu-kern_file.o: kern/file.c
+       $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) 
-DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
+
+pupa_emu-kern_file.d: kern/file.c
+       set -e;           $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) 
$(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $<    | sed 's,file\.o[ 
:]*,pupa_emu-kern_file.o $@ : ,g' > $@;       [ -s $@ ] || rm -f $@
+
+-include pupa_emu-kern_file.d
+
+pupa_emu-kern_fs.o: kern/fs.c
+       $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) 
-DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
+
+pupa_emu-kern_fs.d: kern/fs.c
+       set -e;           $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) 
$(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $<    | sed 's,fs\.o[ 
:]*,pupa_emu-kern_fs.o $@ : ,g' > $@;           [ -s $@ ] || rm -f $@
+
+-include pupa_emu-kern_fs.d
+
+pupa_emu-kern_err.o: kern/err.c
+       $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) 
-DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
+
+pupa_emu-kern_err.d: kern/err.c
+       set -e;           $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) 
$(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $<    | sed 's,err\.o[ 
:]*,pupa_emu-kern_err.o $@ : ,g' > $@;         [ -s $@ ] || rm -f $@
+
+-include pupa_emu-kern_err.d
+
+pupa_emu-kern_misc.o: kern/misc.c
+       $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) 
-DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
+
+pupa_emu-kern_misc.d: kern/misc.c
+       set -e;           $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) 
$(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $<    | sed 's,misc\.o[ 
:]*,pupa_emu-kern_misc.o $@ : ,g' > $@;       [ -s $@ ] || rm -f $@
+
+-include pupa_emu-kern_misc.d
+
+pupa_emu-kern_loader.o: kern/loader.c
+       $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) 
-DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
+
+pupa_emu-kern_loader.d: kern/loader.c
+       set -e;           $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) 
$(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $<    | sed 's,loader\.o[ 
:]*,pupa_emu-kern_loader.o $@ : ,g' > $@;           [ -s $@ ] || rm -f $@
+
+-include pupa_emu-kern_loader.d
+
+pupa_emu-kern_rescue.o: kern/rescue.c
+       $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) 
-DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
+
+pupa_emu-kern_rescue.d: kern/rescue.c
+       set -e;           $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) 
$(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $<    | sed 's,rescue\.o[ 
:]*,pupa_emu-kern_rescue.o $@ : ,g' > $@;           [ -s $@ ] || rm -f $@
+
+-include pupa_emu-kern_rescue.d
+
+pupa_emu-kern_term.o: kern/term.c
+       $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) 
-DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
+
+pupa_emu-kern_term.d: kern/term.c
+       set -e;           $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) 
$(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $<    | sed 's,term\.o[ 
:]*,pupa_emu-kern_term.o $@ : ,g' > $@;       [ -s $@ ] || rm -f $@
+
+-include pupa_emu-kern_term.d
+
+pupa_emu-disk_i386_pc_partition.o: disk/i386/pc/partition.c
+       $(BUILD_CC) -Idisk/i386/pc -I$(srcdir)/disk/i386/pc $(BUILD_CPPFLAGS) 
$(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
+
+pupa_emu-disk_i386_pc_partition.d: disk/i386/pc/partition.c
+       set -e;           $(BUILD_CC) -Idisk/i386/pc -I$(srcdir)/disk/i386/pc 
$(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $<    | 
sed 's,partition\.o[ :]*,pupa_emu-disk_i386_pc_partition.o $@ : ,g' > $@;     [ 
-s $@ ] || rm -f $@
+
+-include pupa_emu-disk_i386_pc_partition.d
+
+pupa_emu-util_i386_pc_biosdisk.o: util/i386/pc/biosdisk.c
+       $(BUILD_CC) -Iutil/i386/pc -I$(srcdir)/util/i386/pc $(BUILD_CPPFLAGS) 
$(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
+
+pupa_emu-util_i386_pc_biosdisk.d: util/i386/pc/biosdisk.c
+       set -e;           $(BUILD_CC) -Iutil/i386/pc -I$(srcdir)/util/i386/pc 
$(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $<    | 
sed 's,biosdisk\.o[ :]*,pupa_emu-util_i386_pc_biosdisk.o $@ : ,g' > $@;       [ 
-s $@ ] || rm -f $@
+
+-include pupa_emu-util_i386_pc_biosdisk.d
+
+pupa_emu-fs_fat.o: fs/fat.c
+       $(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) 
-DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
+
+pupa_emu-fs_fat.d: fs/fat.c
+       set -e;           $(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) 
$(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $<        | sed 's,fat\.o[ 
:]*,pupa_emu-fs_fat.o $@ : ,g' > $@;           [ -s $@ ] || rm -f $@
+
+-include pupa_emu-fs_fat.d
+
+pupa_emu-fs_ext2.o: fs/ext2.c
+       $(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) 
-DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
+
+pupa_emu-fs_ext2.d: fs/ext2.c
+       set -e;           $(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) 
$(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $<        | sed 's,ext2\.o[ 
:]*,pupa_emu-fs_ext2.o $@ : ,g' > $@;         [ -s $@ ] || rm -f $@
+
+-include pupa_emu-fs_ext2.d
+
+pupa_emu-normal_cmdline.o: normal/cmdline.c
+       $(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) 
$(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
+
+pupa_emu-normal_cmdline.d: normal/cmdline.c
+       set -e;           $(BUILD_CC) -Inormal -I$(srcdir)/normal 
$(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $<        
| sed 's,cmdline\.o[ :]*,pupa_emu-normal_cmdline.o $@ : ,g' > $@;       [ -s $@ 
] || rm -f $@
+
+-include pupa_emu-normal_cmdline.d
+
+pupa_emu-normal_command.o: normal/command.c
+       $(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) 
$(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
+
+pupa_emu-normal_command.d: normal/command.c
+       set -e;           $(BUILD_CC) -Inormal -I$(srcdir)/normal 
$(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $<        
| sed 's,command\.o[ :]*,pupa_emu-normal_command.o $@ : ,g' > $@;       [ -s $@ 
] || rm -f $@
+
+-include pupa_emu-normal_command.d
+
+pupa_emu-normal_main.o: normal/main.c
+       $(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) 
$(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
+
+pupa_emu-normal_main.d: normal/main.c
+       set -e;           $(BUILD_CC) -Inormal -I$(srcdir)/normal 
$(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $<        
| sed 's,main\.o[ :]*,pupa_emu-normal_main.o $@ : ,g' > $@;     [ -s $@ ] || rm 
-f $@
+
+-include pupa_emu-normal_main.d
+
+pupa_emu-normal_menu.o: normal/menu.c
+       $(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) 
$(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
+
+pupa_emu-normal_menu.d: normal/menu.c
+       set -e;           $(BUILD_CC) -Inormal -I$(srcdir)/normal 
$(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $<        
| sed 's,menu\.o[ :]*,pupa_emu-normal_menu.o $@ : ,g' > $@;     [ -s $@ ] || rm 
-f $@
+
+-include pupa_emu-normal_menu.d
+
+pupa_emu-util_console.o: util/console.c
+       $(BUILD_CC) -Iutil -I$(srcdir)/util $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) 
-DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
+
+pupa_emu-util_console.d: util/console.c
+       set -e;           $(BUILD_CC) -Iutil -I$(srcdir)/util $(BUILD_CPPFLAGS) 
$(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $<    | sed 's,console\.o[ 
:]*,pupa_emu-util_console.o $@ : ,g' > $@;         [ -s $@ ] || rm -f $@
+
+-include pupa_emu-util_console.d
+
+pupa_emu-util_pupa_emu.o: util/pupa-emu.c
+       $(BUILD_CC) -Iutil -I$(srcdir)/util $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) 
-DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
+
+pupa_emu-util_pupa_emu.d: util/pupa-emu.c
+       set -e;           $(BUILD_CC) -Iutil -I$(srcdir)/util $(BUILD_CPPFLAGS) 
$(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $<    | sed 
's,pupa\-emu\.o[ :]*,pupa_emu-util_pupa_emu.o $@ : ,g' > $@;      [ -s $@ ] || 
rm -f $@
+
+-include pupa_emu-util_pupa_emu.d
+
+pupa_emu-util_misc.o: util/misc.c
+       $(BUILD_CC) -Iutil -I$(srcdir)/util $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) 
-DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
+
+pupa_emu-util_misc.d: util/misc.c
+       set -e;           $(BUILD_CC) -Iutil -I$(srcdir)/util $(BUILD_CPPFLAGS) 
$(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $<    | sed 's,misc\.o[ 
:]*,pupa_emu-util_misc.o $@ : ,g' > $@;       [ -s $@ ] || rm -f $@
+
+-include pupa_emu-util_misc.d
+
+pupa_emu-util_i386_pc_getroot.o: util/i386/pc/getroot.c
+       $(BUILD_CC) -Iutil/i386/pc -I$(srcdir)/util/i386/pc $(BUILD_CPPFLAGS) 
$(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
+
+pupa_emu-util_i386_pc_getroot.d: util/i386/pc/getroot.c
+       set -e;           $(BUILD_CC) -Iutil/i386/pc -I$(srcdir)/util/i386/pc 
$(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $<    | 
sed 's,getroot\.o[ :]*,pupa_emu-util_i386_pc_getroot.o $@ : ,g' > $@;         [ 
-s $@ ] || rm -f $@
+
+-include pupa_emu-util_i386_pc_getroot.d
+
+pupa_emu_LDFLAGS = -lncurses
 
 # For genmoddep.
 genmoddep_SOURCES = util/genmoddep.c
diff -uprN --exclude=CVS pupacvs/conf/i386-pc.rmk pupa/conf/i386-pc.rmk
--- pupacvs/conf/i386-pc.rmk    2003-11-16 17:41:42.000000000 +0100
+++ pupa/conf/i386-pc.rmk       2003-11-16 18:08:46.000000000 +0100
@@ -44,7 +44,7 @@ kernel_syms.lst: $(addprefix include/pup
 
 # Utilities.
 bin_UTILITIES = pupa-mkimage
-sbin_UTILITIES = pupa-setup
+sbin_UTILITIES = pupa-setup pupa-emu
 noinst_UTILITIES = genmoddep
 
 # For pupa-mkimage.
@@ -54,8 +54,19 @@ pupa_mkimage_LDFLAGS = -llzo
 
 # For pupa-setup.
 pupa_setup_SOURCES = util/i386/pc/pupa-setup.c util/i386/pc/biosdisk.c \
-       util/misc.c kern/device.c kern/disk.c kern/file.c kern/fs.c \
-       kern/err.c kern/misc.c disk/i386/pc/partition.c fs/fat.c fs/ext2.c
+       util/misc.c util/i386/pc/getroot.c kern/device.c kern/disk.c \
+       kern/err.c kern/misc.c disk/i386/pc/partition.c fs/fat.c fs/ext2.c \
+       kern/file.c kern/fs.c
+
+# For pupa
+pupa_emu_SOURCES = kern/main.c kern/device.c                           \
+       kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c          \
+        kern/misc.c kern/loader.c kern/rescue.c kern/term.c            \
+       disk/i386/pc/partition.c                                        \
+       util/i386/pc/biosdisk.c fs/fat.c fs/ext2.c                      \
+       normal/cmdline.c normal/command.c normal/main.c normal/menu.c   \
+       util/console.c util/pupa-emu.c util/misc.c util/i386/pc/getroot.c
+pupa_emu_LDFLAGS = -lncurses
 
 # For genmoddep.
 genmoddep_SOURCES = util/genmoddep.c
diff -uprN --exclude=CVS pupacvs/include/pupa/fs.h pupa/include/pupa/fs.h
--- pupacvs/include/pupa/fs.h   2003-01-02 21:12:32.000000000 +0100
+++ pupa/include/pupa/fs.h      2003-11-16 15:20:04.000000000 +0100
@@ -63,6 +63,8 @@ pupa_fs_t EXPORT_FUNC(pupa_fs_probe) (pu
 #ifdef PUPA_UTIL
 void pupa_fat_init (void);
 void pupa_fat_fini (void);
+void pupa_ext2_init (void);
+void pupa_ext2_fini (void);
 #endif /* PUPA_UTIL */
 
 #endif /* ! PUPA_FS_HEADER */
diff -uprN --exclude=CVS pupacvs/include/pupa/normal.h 
pupa/include/pupa/normal.h
--- pupacvs/include/pupa/normal.h       2003-02-08 09:11:24.000000000 +0100
+++ pupa/include/pupa/normal.h  2003-11-16 17:04:53.000000000 +0100
@@ -129,4 +129,9 @@ int pupa_command_execute (char *cmdline)
 void pupa_command_init (void);
 void pupa_normal_init_page (void);
 
+#ifdef PUPA_UTIL
+void pupa_normal_init (void);
+void pupa_normal_fini (void);
+#endif
+
 #endif /* ! PUPA_NORMAL_HEADER */
diff -uprN --exclude=CVS pupacvs/include/pupa/setjmp.h 
pupa/include/pupa/setjmp.h
--- pupacvs/include/pupa/setjmp.h       2003-01-20 05:13:46.000000000 +0100
+++ pupa/include/pupa/setjmp.h  2003-11-12 22:26:59.000000000 +0100
@@ -23,7 +23,13 @@
 /* This must define pupa_jmp_buf.  */
 #include <pupa/cpu/setjmp.h>
 
+#ifdef PUPA_UTIL
+#include <setjmp.h>
+#define pupa_setjmp setjmp
+#define pupa_longjmp longjmp
+#else
 int pupa_setjmp (pupa_jmp_buf env);
 void pupa_longjmp (pupa_jmp_buf env, int val) __attribute__ ((noreturn));
+#endif
 
 #endif /* ! PUPA_SETJMP_HEADER */
diff -uprN --exclude=CVS pupacvs/include/pupa/term.h pupa/include/pupa/term.h
--- pupacvs/include/pupa/term.h 2003-09-27 18:00:14.000000000 +0200
+++ pupa/include/pupa/term.h    2003-11-12 23:28:39.000000000 +0100
@@ -95,6 +95,9 @@ struct pupa_term
   /* Turn on/off the cursor.  */
   void (*setcursor) (int on);
 
+  /* Update the screen.  */
+  void (*refresh) (void);
+
   /* The feature flags defined above.  */
   pupa_uint32_t flags;
   
@@ -121,6 +124,7 @@ void EXPORT_FUNC(pupa_setcolorstate) (pu
 void EXPORT_FUNC(pupa_setcolor) (pupa_uint8_t normal_color,
                                 pupa_uint8_t highlight_color);
 int EXPORT_FUNC(pupa_setcursor) (int on);
+void EXPORT_FUNC(pupa_refresh) (void);
 
 /* For convenience.  */
 #define PUPA_TERM_ASCII_CHAR(c)        ((c) & 0xff)
diff -uprN --exclude=CVS pupacvs/include/pupa/util/getroot.h 
pupa/include/pupa/util/getroot.h
--- pupacvs/include/pupa/util/getroot.h 1970-01-01 01:00:00.000000000 +0100
+++ pupa/include/pupa/util/getroot.h    2003-11-16 17:33:36.000000000 +0100
@@ -0,0 +1,26 @@
+/*
+ *  PUPA  --  Preliminary Universal Programming Architecture for GRUB
+ *  Copyright (C) 2003 Marco Gerards <address@hidden>
+ *
+ *  PUPA is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with PUPA; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef PUPA_UTIL_GETROOT_HEADER
+#define PUPA_UTIL_GETROOT_HEADER       1
+
+char *pupa_guess_root_device (const char *dir);
+char *pupa_get_prefix (const char *dir);
+
+#endif /* ! PUPA_UTIL_GETROOT_HEADER */
diff -uprN --exclude=CVS pupacvs/kern/misc.c pupa/kern/misc.c
--- pupacvs/kern/misc.c 2003-11-16 17:41:43.000000000 +0100
+++ pupa/kern/misc.c    2003-11-16 18:08:51.000000000 +0100
@@ -487,6 +487,9 @@ pupa_vsprintf (char *str, const char *fm
 
   if (str)
     *str = '\0';
+
+  if (count && !str)
+    pupa_refresh ();
   
   return count;
 }
diff -uprN --exclude=CVS pupacvs/kern/rescue.c pupa/kern/rescue.c
--- pupacvs/kern/rescue.c       2003-01-20 05:13:46.000000000 +0100
+++ pupa/kern/rescue.c  2003-11-12 23:04:29.000000000 +0100
@@ -109,9 +109,11 @@ pupa_rescue_get_command_line (const char
              pupa_putchar (c);
            }
        }
+      pupa_refresh ();
     }
 
   pupa_putchar ('\n');
+  pupa_refresh ();
 }
 
 /* Get the next word in STR and return a next pointer.  */
@@ -183,6 +185,7 @@ pupa_rescue_cmd_cat (int argc, char *arg
     }
 
   pupa_putchar ('\n');
+  pupa_refresh ();
   pupa_file_close (file);
 }
 
@@ -240,6 +243,7 @@ pupa_rescue_cmd_ls (int argc, char *argv
     {
       pupa_disk_dev_iterate (pupa_rescue_print_disks);
       pupa_putchar ('\n');
+      pupa_refresh ();
     }
   else
     {
@@ -274,6 +278,7 @@ pupa_rescue_cmd_ls (int argc, char *argv
        {
          (fs->dir) (dev, path, pupa_rescue_print_files);
          pupa_putchar ('\n');
+         pupa_refresh ();
        }
 
     fail:
@@ -383,6 +388,7 @@ pupa_rescue_cmd_testload (int argc, char
                  unsigned len __attribute__ ((unused)))
     {
       pupa_putchar ('.');
+      pupa_refresh ();
     }
 
   if (argc < 1)
@@ -457,7 +463,10 @@ pupa_rescue_cmd_testload (int argc, char
          
          for (i = 0; i < PUPA_DISK_SECTOR_SIZE; i++)
            pupa_putchar (buf[pos + i]);
-         
+
+         if (i)
+           pupa_refresh ();
+
          goto fail;
        }
     }
@@ -584,6 +593,8 @@ pupa_rescue_cmd_lsmod (int argc __attrib
          pupa_printf ("%s", dep->mod->name);
        }
       pupa_putchar ('\n');
+      pupa_refresh ();
+
       return 0;
     }
 
diff -uprN --exclude=CVS pupacvs/kern/term.c pupa/kern/term.c
--- pupacvs/kern/term.c 2003-09-27 18:00:14.000000000 +0200
+++ pupa/kern/term.c    2003-11-12 23:07:33.000000000 +0100
@@ -193,7 +193,10 @@ void
 pupa_cls (void)
 {
   if (pupa_cur_term->flags & PUPA_TERM_DUMB)
-    pupa_putchar ('\n');
+    {
+      pupa_putchar ('\n');
+      pupa_refresh ();
+    }
   else
     (pupa_cur_term->cls) ();
 }
@@ -227,3 +230,9 @@ pupa_setcursor (int on)
   return ret;
 }
 
+void
+pupa_refresh (void)
+{
+  if (pupa_cur_term->refresh)
+    (pupa_cur_term->refresh) ();
+}
diff -uprN --exclude=CVS pupacvs/normal/cmdline.c pupa/normal/cmdline.c
--- pupacvs/normal/cmdline.c    2003-01-20 05:13:46.000000000 +0100
+++ pupa/normal/cmdline.c       2003-11-12 22:44:14.000000000 +0100
@@ -285,6 +285,7 @@ pupa_cmdline_get (const char *prompt, ch
     }
 
   pupa_putchar ('\n');
+  pupa_refresh ();
 
   /* If ECHO_CHAR is NUL, remove leading spaces.  */
   lpos = 0;
diff -uprN --exclude=CVS pupacvs/normal/main.c pupa/normal/main.c
--- pupacvs/normal/main.c       2003-01-20 05:13:46.000000000 +0100
+++ pupa/normal/main.c  2003-11-12 22:18:41.000000000 +0100
@@ -332,6 +332,27 @@ pupa_rescue_cmd_normal (int argc, char *
     pupa_enter_normal_mode (argv[0]);
 }
 
+
+#ifdef PUPA_UTIL
+void
+pupa_normal_init (void)
+{
+  /* Register a command "normal" for the rescue mode.  */
+  pupa_rescue_register_command ("normal", pupa_rescue_cmd_normal,
+                               "enter normal mode");
+
+  /* This registers some built-in commands.  */
+  pupa_command_init ();
+  
+}
+
+void
+pupa_normal_fini (void)
+{
+  pupa_rescue_unregister_command ("normal");
+
+}
+#else /* ! PUPA_UTIL */
 PUPA_MOD_INIT
 {
   /* Normal mode shouldn't be unloaded.  */
@@ -349,3 +370,4 @@ PUPA_MOD_FINI
 {
   pupa_rescue_unregister_command ("normal");
 }
+#endif /* ! PUPA_UTIL */
diff -uprN --exclude=CVS pupacvs/normal/menu.c pupa/normal/menu.c
--- pupacvs/normal/menu.c       2003-09-27 18:00:14.000000000 +0200
+++ pupa/normal/menu.c  2003-11-13 00:06:10.000000000 +0100
@@ -183,6 +183,7 @@ run_menu (pupa_menu_t menu, int nested)
 
   init_page (nested);
   print_entries (menu, first, offset);
+  pupa_refresh ();
   
   while (1)
     {
@@ -251,6 +252,8 @@ run_menu (pupa_menu_t menu, int nested)
        default:
          break;
        }
+      
+      pupa_refresh ();
     }
 
   /* Never reach here.  */
diff -uprN --exclude=CVS pupacvs/util/console.c pupa/util/console.c
--- pupacvs/util/console.c      1970-01-01 01:00:00.000000000 +0100
+++ pupa/util/console.c 2003-11-16 18:07:14.000000000 +0100
@@ -0,0 +1,204 @@
+/*  console.c -- Ncurses console for PUPA.  */
+/*
+ *  PUPA  --  Preliminary Universal Programming Architecture for GRUB
+ *  Copyright (C) 2003  Marco Gerards  <address@hidden>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <curses.h>
+#include <pupa/machine/console.h>
+#include <pupa/term.h>
+#include <pupa/types.h>
+
+static int pupa_console_attr = A_NORMAL;
+
+static void
+pupa_ncurses_putchar (pupa_uint32_t c)
+{
+  addch (c | pupa_console_attr);
+}
+
+static void
+pupa_ncurses_setcolorstate (pupa_term_color_state state)
+{
+  switch (state) 
+    {
+    case PUPA_TERM_COLOR_STANDARD:
+      pupa_console_attr = A_NORMAL;
+      break;
+    case PUPA_TERM_COLOR_NORMAL:
+      pupa_console_attr = A_NORMAL;
+      break;
+    case PUPA_TERM_COLOR_HIGHLIGHT:
+      pupa_console_attr = A_STANDOUT;
+      break;
+    default:
+      break;
+    }
+}
+
+/* XXX: This function is never called.  */
+static void
+pupa_ncurses_setcolor (pupa_uint8_t normal_color, pupa_uint8_t highlight_color)
+{
+  color_set (normal_color << 8 | highlight_color, 0);
+}
+
+static int
+pupa_ncurses_checkkey (void)
+{
+  return 1;
+}
+
+static int
+pupa_ncurses_getkey (void)
+{
+  int c = getch ();
+
+  switch (c)
+    {
+    case KEY_LEFT:
+      c = PUPA_CONSOLE_KEY_LEFT;
+      break;
+
+    case KEY_RIGHT:
+      c = PUPA_CONSOLE_KEY_RIGHT;
+      break;
+      
+    case KEY_UP:
+      c = PUPA_CONSOLE_KEY_UP;
+      break;
+
+    case KEY_DOWN:
+      c = PUPA_CONSOLE_KEY_DOWN;
+      break;
+
+    case KEY_IC:
+      c = PUPA_CONSOLE_KEY_IC;
+      break;
+
+    case KEY_DC:
+      c = PUPA_CONSOLE_KEY_DC;
+      break;
+
+    case KEY_BACKSPACE:
+      c = PUPA_CONSOLE_KEY_BACKSPACE;
+      break;
+
+    case KEY_HOME:
+      c = PUPA_CONSOLE_KEY_HOME;
+      break;
+
+    case KEY_END:
+      c = PUPA_CONSOLE_KEY_END;
+      break;
+
+    case KEY_NPAGE:
+      c = PUPA_CONSOLE_KEY_NPAGE;
+      break;
+
+    case KEY_PPAGE:
+      c = PUPA_CONSOLE_KEY_PPAGE;
+      break;
+    }
+
+  return c;
+}
+
+static pupa_uint16_t
+pupa_ncurses_getxy (void)
+{
+  int x;
+  int y;
+
+  getyx (stdscr, y, x);
+
+  return (x << 8) | y;
+}
+
+static void
+pupa_ncurses_gotoxy (pupa_uint8_t x, pupa_uint8_t y)
+{
+  move (y, x);
+}
+
+static void
+pupa_ncurses_cls (void)
+{
+  clear ();
+  refresh ();
+}
+
+static void
+pupa_ncurses_setcursor (int on)
+{
+  curs_set (on ? 1 : 0);
+}
+
+static void
+pupa_ncurses_refresh (void)
+{
+  refresh ();
+}
+
+static pupa_err_t
+pupa_ncurses_init (void)
+{
+  initscr ();
+  cbreak (); 
+  noecho ();
+  scrollok (stdscr, TRUE);
+
+  nonl ();
+  intrflush (stdscr, FALSE);
+  keypad (stdscr, TRUE);
+  start_color ();
+
+  return 0;
+}
+
+static pupa_err_t
+pupa_ncurses_fini (void)
+{
+  endwin ();
+}
+
+
+static struct pupa_term pupa_ncurses_term =
+  {
+    .name = "console",
+    .init = pupa_ncurses_init,
+    .fini = pupa_ncurses_fini,
+    .putchar = pupa_ncurses_putchar,
+    .checkkey = pupa_ncurses_checkkey,
+    .getkey = pupa_ncurses_getkey,
+    .getxy = pupa_ncurses_getxy,
+    .gotoxy = pupa_ncurses_gotoxy,
+    .cls = pupa_ncurses_cls,
+    .setcolorstate = pupa_ncurses_setcolorstate,
+    .setcolor = pupa_ncurses_setcolor,
+    .setcursor = pupa_ncurses_setcursor,
+    .refresh = pupa_ncurses_refresh,
+    .flags = 0,
+    .next = 0
+  };
+
+void
+pupa_console_init (void)
+{
+  pupa_term_register (&pupa_ncurses_term);
+  pupa_term_set_current (&pupa_ncurses_term);
+}
diff -uprN --exclude=CVS pupacvs/util/i386/pc/getroot.c 
pupa/util/i386/pc/getroot.c
--- pupacvs/util/i386/pc/getroot.c      1970-01-01 01:00:00.000000000 +0100
+++ pupa/util/i386/pc/getroot.c 2003-11-16 17:37:45.000000000 +0100
@@ -0,0 +1,226 @@
+/* getroot.c - Get root device */
+/*
+ *  PUPA  --  Preliminary Universal Programming Architecture for GRUB
+ *  Copyright (C) 1999,2000,2001,2002  Free Software Foundation, Inc.
+ *  Copyright (C) 2002  Yoshinori K. Okuji <address@hidden>
+ *  Copyright (C) 2003  Marco Gerards <address@hidden>
+ *
+ *  PUPA is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with PUPA; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+#include <dirent.h>
+
+#include <pupa/util/misc.h>
+
+static void
+strip_extra_slashes (char *dir)
+{
+  char *p = dir;
+
+  while ((p = strchr (p, '/')) != 0)
+    {
+      if (p[1] == '/')
+       {
+         memmove (p, p + 1, strlen (p));
+         continue;
+       }
+      else if (p[1] == '\0')
+       {
+         p[0] = '\0';
+         break;
+       }
+      
+      p++;
+    }
+}
+
+static char *
+xgetcwd (void)
+{
+  size_t size = 10;
+  char *path;
+
+  path = xmalloc (size);
+  while (! getcwd (path, size))
+    {
+      size <<= 1;
+      path = xrealloc (path, size);
+    }
+
+  return path;
+}
+
+char *
+pupa_get_prefix (const char *dir)
+{
+  char *saved_cwd;
+  char *abs_dir, *prev_dir;
+  char *prefix;
+  struct stat st, prev_st;
+  
+  /* Save the current directory.  */
+  saved_cwd = xgetcwd ();
+
+  if (chdir (dir) < 0)
+    pupa_util_error ("Cannot change directory to `%s'", dir);
+
+  abs_dir = xgetcwd ();
+  strip_extra_slashes (abs_dir);
+  prev_dir = xstrdup (abs_dir);
+  
+  if (stat (".", &prev_st) < 0)
+    pupa_util_error ("Cannot stat `%s'", dir);
+
+  if (! S_ISDIR (prev_st.st_mode))
+    pupa_util_error ("`%s' is not a directory", dir);
+
+  while (1)
+    {
+      if (chdir ("..") < 0)
+       pupa_util_error ("Cannot change directory to the parent");
+
+      if (stat (".", &st) < 0)
+       pupa_util_error ("Cannot stat current directory");
+
+      if (! S_ISDIR (st.st_mode))
+       pupa_util_error ("Current directory is not a directory???");
+
+      if (prev_st.st_dev != st.st_dev || prev_st.st_ino == st.st_ino)
+       break;
+
+      free (prev_dir);
+      prev_dir = xgetcwd ();
+      prev_st = st;
+    }
+
+  strip_extra_slashes (prev_dir);
+  prefix = xmalloc (strlen (abs_dir) - strlen (prev_dir) + 2);
+  prefix[0] = '/';
+  strcpy (prefix + 1, abs_dir + strlen (prev_dir));
+  strip_extra_slashes (prefix);
+
+  if (chdir (saved_cwd) < 0)
+    pupa_util_error ("Cannot change directory to `%s'", dir);
+
+  free (saved_cwd);
+  free (abs_dir);
+  free (prev_dir);
+
+  pupa_util_info ("prefix = %s", prefix);
+  return prefix;
+}
+
+static char *
+find_root_device (const char *dir, dev_t dev)
+{
+  DIR *dp;
+  char *saved_cwd;
+  struct dirent *ent;
+  
+  dp = opendir (dir);
+  if (! dp)
+    return 0;
+
+  saved_cwd = xgetcwd ();
+
+  pupa_util_info ("changing current directory to %s", dir);
+  if (chdir (dir) < 0)
+    {
+      free (saved_cwd);
+      closedir (dp);
+      return 0;
+    }
+  
+  while ((ent = readdir (dp)) != 0)
+    {
+      struct stat st;
+      
+      if (strcmp (ent->d_name, ".") == 0 || strcmp (ent->d_name, "..") == 0)
+       continue;
+
+      if (lstat (ent->d_name, &st) < 0)
+       /* Ignore any error.  */
+       continue;
+
+      if (S_ISLNK (st.st_mode))
+       /* Don't follow symbolic links.  */
+       continue;
+      
+      if (S_ISDIR (st.st_mode))
+       {
+         /* Find it recursively.  */
+         char *res;
+
+         res = find_root_device (ent->d_name, dev);
+
+         if (res)
+           {
+             if (chdir (saved_cwd) < 0)
+               pupa_util_error ("Cannot restore the original directory");
+             
+             free (saved_cwd);
+             closedir (dp);
+             return res;
+           }
+       }
+
+      if (S_ISBLK (st.st_mode) && st.st_rdev == dev)
+       {
+         /* Found!  */
+         char *res;
+         char *cwd;
+
+         cwd = xgetcwd ();
+         res = xmalloc (strlen (cwd) + strlen (ent->d_name) + 2);
+         sprintf (res, "%s/%s", cwd, ent->d_name);
+         strip_extra_slashes (res);
+         free (cwd);
+
+         if (chdir (saved_cwd) < 0)
+           pupa_util_error ("Cannot restore the original directory");
+
+         free (saved_cwd);
+         closedir (dp);
+         return res;
+       }
+    }
+
+  if (chdir (saved_cwd) < 0)
+    pupa_util_error ("Cannot restore the original directory");
+
+  free (saved_cwd);
+  closedir (dp);
+  return 0;
+}
+
+char *
+pupa_guess_root_device (const char *dir)
+{
+  struct stat st;
+  char *os_dev;
+  
+  if (stat (dir, &st) < 0)
+    pupa_util_error ("Cannot stat `%s'", dir);
+
+  /* This might be truly slow, but is there any better way?  */
+  os_dev = find_root_device ("/dev", st.st_dev);
+  if (! os_dev)
+    return 0;
+
+  return pupa_util_biosdisk_get_pupa_dev (os_dev);
+}
diff -uprN --exclude=CVS pupacvs/util/i386/pc/pupa-setup.c 
pupa/util/i386/pc/pupa-setup.c
--- pupacvs/util/i386/pc/pupa-setup.c   2003-01-07 08:54:07.000000000 +0100
+++ pupa/util/i386/pc/pupa-setup.c      2003-11-16 17:38:34.000000000 +0100
@@ -3,6 +3,7 @@
  *  PUPA  --  Preliminary Universal Programming Architecture for GRUB
  *  Copyright (C) 1999,2000,2001,2002  Free Software Foundation, Inc.
  *  Copyright (C) 2002  Yoshinori K. Okuji <address@hidden>
+ *  Copyright (C) 2003  Marco Gerards <address@hidden>
  *
  *  PUPA is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -38,6 +39,7 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <dirent.h>
+#include <pupa/util/getroot.h>
 
 #define _GNU_SOURCE    1
 #include <getopt.h>
@@ -62,6 +64,17 @@ struct boot_blocklist
   pupa_uint16_t segment;
 } __attribute__ ((packed));
 
+void
+pupa_putchar (int c)
+{
+  putchar (c);
+}
+
+void
+pupa_refresh (void)
+{
+}
+
 static void
 setup (const char *prefix, const char *dir,
        const char *boot_file, const char *core_file,
@@ -479,204 +492,6 @@ get_device_name (char *dev)
   return dev + 1;
 }
 
-static char *
-xgetcwd (void)
-{
-  size_t size = 10;
-  char *path;
-
-  path = xmalloc (size);
-  while (! getcwd (path, size))
-    {
-      size <<= 1;
-      path = xrealloc (path, size);
-    }
-
-  return path;
-}
-
-static void
-strip_extra_slashes (char *dir)
-{
-  char *p = dir;
-
-  while ((p = strchr (p, '/')) != 0)
-    {
-      if (p[1] == '/')
-       {
-         memmove (p, p + 1, strlen (p));
-         continue;
-       }
-      else if (p[1] == '\0')
-       {
-         p[0] = '\0';
-         break;
-       }
-      
-      p++;
-    }
-}
-
-static char *
-get_prefix (const char *dir)
-{
-  char *saved_cwd;
-  char *abs_dir, *prev_dir;
-  char *prefix;
-  struct stat st, prev_st;
-  
-  /* Save the current directory.  */
-  saved_cwd = xgetcwd ();
-
-  if (chdir (dir) < 0)
-    pupa_util_error ("Cannot change directory to `%s'", dir);
-
-  abs_dir = xgetcwd ();
-  strip_extra_slashes (abs_dir);
-  prev_dir = xstrdup (abs_dir);
-  
-  if (stat (".", &prev_st) < 0)
-    pupa_util_error ("Cannot stat `%s'", dir);
-
-  if (! S_ISDIR (prev_st.st_mode))
-    pupa_util_error ("`%s' is not a directory", dir);
-
-  while (1)
-    {
-      if (chdir ("..") < 0)
-       pupa_util_error ("Cannot change directory to the parent");
-
-      if (stat (".", &st) < 0)
-       pupa_util_error ("Cannot stat current directory");
-
-      if (! S_ISDIR (st.st_mode))
-       pupa_util_error ("Current directory is not a directory???");
-
-      if (prev_st.st_dev != st.st_dev || prev_st.st_ino == st.st_ino)
-       break;
-
-      free (prev_dir);
-      prev_dir = xgetcwd ();
-      prev_st = st;
-    }
-
-  strip_extra_slashes (prev_dir);
-  prefix = xmalloc (strlen (abs_dir) - strlen (prev_dir) + 2);
-  prefix[0] = '/';
-  strcpy (prefix + 1, abs_dir + strlen (prev_dir));
-  strip_extra_slashes (prefix);
-
-  if (chdir (saved_cwd) < 0)
-    pupa_util_error ("Cannot change directory to `%s'", dir);
-
-  free (saved_cwd);
-  free (abs_dir);
-  free (prev_dir);
-
-  pupa_util_info ("prefix = %s", prefix);
-  return prefix;
-}
-
-static char *
-find_root_device (const char *dir, dev_t dev)
-{
-  DIR *dp;
-  char *saved_cwd;
-  struct dirent *ent;
-  
-  dp = opendir (dir);
-  if (! dp)
-    return 0;
-
-  saved_cwd = xgetcwd ();
-
-  pupa_util_info ("changing current directory to %s", dir);
-  if (chdir (dir) < 0)
-    {
-      free (saved_cwd);
-      closedir (dp);
-      return 0;
-    }
-  
-  while ((ent = readdir (dp)) != 0)
-    {
-      struct stat st;
-      
-      if (strcmp (ent->d_name, ".") == 0 || strcmp (ent->d_name, "..") == 0)
-       continue;
-
-      if (lstat (ent->d_name, &st) < 0)
-       /* Ignore any error.  */
-       continue;
-
-      if (S_ISLNK (st.st_mode))
-       /* Don't follow symbolic links.  */
-       continue;
-      
-      if (S_ISDIR (st.st_mode))
-       {
-         /* Find it recursively.  */
-         char *res;
-
-         res = find_root_device (ent->d_name, dev);
-
-         if (res)
-           {
-             if (chdir (saved_cwd) < 0)
-               pupa_util_error ("Cannot restore the original directory");
-             
-             free (saved_cwd);
-             closedir (dp);
-             return res;
-           }
-       }
-
-      if (S_ISBLK (st.st_mode) && st.st_rdev == dev)
-       {
-         /* Found!  */
-         char *res;
-         char *cwd;
-
-         cwd = xgetcwd ();
-         res = xmalloc (strlen (cwd) + strlen (ent->d_name) + 2);
-         sprintf (res, "%s/%s", cwd, ent->d_name);
-         strip_extra_slashes (res);
-         free (cwd);
-
-         if (chdir (saved_cwd) < 0)
-           pupa_util_error ("Cannot restore the original directory");
-
-         free (saved_cwd);
-         closedir (dp);
-         return res;
-       }
-    }
-
-  if (chdir (saved_cwd) < 0)
-    pupa_util_error ("Cannot restore the original directory");
-
-  free (saved_cwd);
-  closedir (dp);
-  return 0;
-}
-
-static char *
-guess_root_device (const char *dir)
-{
-  struct stat st;
-  char *os_dev;
-  
-  if (stat (dir, &st) < 0)
-    pupa_util_error ("Cannot stat `%s'", dir);
-
-  /* This might be truly slow, but is there any better way?  */
-  os_dev = find_root_device ("/dev", st.st_dev);
-  if (! os_dev)
-    return 0;
-
-  return pupa_util_biosdisk_get_pupa_dev (os_dev);
-}
-
 int
 main (int argc, char *argv[])
 {
@@ -774,7 +589,7 @@ main (int argc, char *argv[])
       usage (1);
     }
 
-  prefix = get_prefix (dir ? : DEFAULT_DIRECTORY);
+  prefix = pupa_get_prefix (dir ? : DEFAULT_DIRECTORY);
   
   /* Initialize the emulated biosdisk driver.  */
   pupa_util_biosdisk_init (dev_map ? : DEFAULT_DEVICE_MAP);
@@ -795,7 +610,7 @@ main (int argc, char *argv[])
     }
   else
     {
-      root_dev = guess_root_device (dir ? : DEFAULT_DIRECTORY);
+      root_dev = pupa_guess_root_device (dir ? : DEFAULT_DIRECTORY);
       if (! root_dev)
        {
          pupa_util_info ("guessing the root device failed, because of `%s'",
diff -uprN --exclude=CVS pupacvs/util/misc.c pupa/util/misc.c
--- pupacvs/util/misc.c 2003-11-12 21:39:04.000000000 +0100
+++ pupa/util/misc.c    2003-11-16 19:13:21.000000000 +0100
@@ -189,16 +189,27 @@ pupa_realloc (void *ptr, unsigned size)
   return realloc (ptr, size);
 }
 
+void *
+pupa_memalign (pupa_size_t align, pupa_size_t size)
+{
+  return memalign (align, size);
+}
+
+/* Some functions that we don't use.  */
 void
-pupa_stop (void)
+pupa_mm_init_region (void *addr, pupa_size_t size)
 {
-  exit (1);
 }
 
 void
-pupa_putchar (int c)
+pupa_register_exported_symbols (void)
 {
-  putchar (c);
+}
+
+void
+pupa_stop (void)
+{
+  exit (1);
 }
 
 pupa_uint32_t
diff -uprN --exclude=CVS pupacvs/util/pupa-emu.c pupa/util/pupa-emu.c
--- pupacvs/util/pupa-emu.c     1970-01-01 01:00:00.000000000 +0100
+++ pupa/util/pupa-emu.c        2003-11-16 19:13:32.000000000 +0100
@@ -0,0 +1,172 @@
+/*
+ *  PUPA  --  Preliminary Universal Programming Architecture for GRUB
+ *  Copyright (C) 2003 Marco Gerards <address@hidden>
+ *
+ *  PUPA is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with PUPA; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <stdlib.h>
+#include <malloc.h>
+#include <sys/stat.h>
+#include <argp.h>
+#include <string.h>
+
+#include <pupa/mm.h>
+#include <pupa/setjmp.h>
+#include <pupa/fs.h>
+#include <pupa/i386/pc/util/biosdisk.h>
+#include <pupa/dl.h>
+#include <pupa/machine/console.h>
+#include <pupa/util/misc.h>
+#include <pupa/kernel.h>
+#include <pupa/normal.h>
+#include <pupa/util/getroot.h>
+
+#ifdef __NetBSD__
+/* NetBSD uses /boot for its boot block.  */
+# define DEFAULT_DIRECTORY     "/pupa"
+#else
+# define DEFAULT_DIRECTORY     "/boot/pupa"
+#endif
+
+#define DEFAULT_DEVICE_MAP     DEFAULT_DIRECTORY "/device.map"
+
+/* XXX.  */
+pupa_addr_t pupa_end_addr = -1;
+pupa_addr_t pupa_total_module_size = 0;
+
+int
+pupa_arch_dl_check_header (void *ehdr, pupa_size_t size)
+{
+  (void) ehdr;
+  (void) size;
+
+  return PUPA_ERR_BAD_MODULE;
+}
+
+pupa_err_t
+pupa_arch_dl_relocate_symbols (pupa_dl_t mod, void *ehdr)
+{
+  (void) mod;
+  (void) ehdr;
+
+  return PUPA_ERR_BAD_MODULE;
+}
+
+void
+pupa_machine_init (void)
+{
+  pupa_console_init ();
+}
+
+
+const char *argp_program_version = PACKAGE_STRING;
+const char *argp_program_bug_address = PACKAGE_BUGREPORT;
+static char doc[] = "PUPA emulator";
+
+static struct argp_option options[] = {
+  {"root-device", 'r', "FILE", 0, "use DEV as the root device", 0},
+  {"device-map",  'm', "FILE", 0, "use DEV as the root device 
[default=guessed]", 0},
+  {"directory",   'd', "DIR",  0, "use PUPA files in the directory DIR", 0},
+  {"verbose",     'v', 0     , 0, "print verbose messages", 0},
+  { 0, 0, 0, 0, 0, 0 }
+};
+
+struct arguments
+{
+  char *root_dev;
+  char *dev_map;
+  char *dir;
+};
+
+static error_t
+parse_opt (int key, char *arg, struct argp_state *state)
+{
+  struct arguments *args = state->input;
+  
+  switch (key)
+    {
+    case 'r':
+      args->root_dev = arg;
+      break;
+    case 'd':
+      args->dir = arg;
+      break;
+    case 'm':
+      args->dev_map = arg;
+      break;
+    case 'v':
+      verbosity++;
+      break;
+    case ARGP_KEY_END:
+      break;
+    default:
+      return ARGP_ERR_UNKNOWN;
+    }
+  return 0;
+}
+
+static struct argp argp = {options, parse_opt, 0, doc, 0, 0, 0};
+
+
+int
+main (int argc, char *argv[])
+{
+  char *prefix = 0;
+  char rootprefix[100];
+  struct arguments args =
+    {
+      .dir = DEFAULT_DIRECTORY,
+      .dev_map = DEFAULT_DEVICE_MAP
+    };
+
+  argp_parse (&argp, argc, argv, 0, 0, &args);
+
+  /* More sure there is a root device.  */
+  if (! args.root_dev)
+    {
+      args.root_dev = pupa_guess_root_device (args.dir ? : DEFAULT_DIRECTORY);
+      if (! args.root_dev)
+       {
+         pupa_util_info ("guessing the root device failed, because of `%s'",
+                         pupa_errmsg);
+         pupa_util_error ("Cannot guess the root device. Specify the option 
``--root-device''.");
+       }
+    }
+
+  prefix = pupa_get_prefix (args.dir ? : DEFAULT_DIRECTORY);
+  sprintf (rootprefix, "%s%s", args.root_dev, prefix);
+  pupa_dl_set_prefix (rootprefix);
+  
+  /* XXX: This is a bit unportable.  */
+  pupa_util_biosdisk_init (args.dev_map);
+
+  /* Initialize the default modules.  */
+  pupa_fat_init ();
+  pupa_ext2_init ();
+
+  /* XXX: Should normal mode be started by default?  */
+  pupa_normal_init ();
+
+  /* Start PUPA!  */
+  pupa_main ();
+
+  pupa_util_biosdisk_fini ();
+  pupa_normal_fini ();
+  pupa_ext2_fini ();
+  pupa_fat_fini ();
+
+  return 0;
+}





reply via email to

[Prev in Thread] Current Thread [Next in Thread]