diff --git a/ChangeLog b/ChangeLog index daee77777..ef523a29d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,56 @@ +2003-11-17 Marco Gerards + + * 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_UTIL]: Include . + (pupa_jmp_buf): New typedef. + (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_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. + 2003-11-16 Jeroen Dekkers * conf/i386-pc.rmk (pkgdata_MODULES): Add _multiboot.mod. diff --git a/conf/i386-pc.mk b/conf/i386-pc.mk index c62bb1100..42ccae248 100644 --- a/conf/i386-pc.mk +++ b/conf/i386-pc.mk @@ -239,7 +239,7 @@ kernel_syms.lst: $(addprefix include/pupa/,$(kernel_img_HEADERS)) genkernsyms.sh # 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 --git a/conf/i386-pc.rmk b/conf/i386-pc.rmk index 1bdc23bd9..6fec499b0 100644 --- a/conf/i386-pc.rmk +++ b/conf/i386-pc.rmk @@ -44,7 +44,7 @@ kernel_syms.lst: $(addprefix include/pupa/,$(kernel_img_HEADERS)) genkernsyms.sh # 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 --git a/include/grub/fs.h b/include/grub/fs.h index 406c21bb8..49b5f9593 100644 --- a/include/grub/fs.h +++ b/include/grub/fs.h @@ -63,6 +63,8 @@ pupa_fs_t EXPORT_FUNC(pupa_fs_probe) (pupa_device_t device); #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 --git a/include/grub/normal.h b/include/grub/normal.h index 1335859d5..308c69b77 100644 --- a/include/grub/normal.h +++ b/include/grub/normal.h @@ -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 --git a/include/grub/setjmp.h b/include/grub/setjmp.h index 35c05a5a5..cf50b748d 100644 --- a/include/grub/setjmp.h +++ b/include/grub/setjmp.h @@ -20,10 +20,17 @@ #ifndef PUPA_SETJMP_HEADER #define PUPA_SETJMP_HEADER 1 +#ifdef PUPA_UTIL +#include +typedef jmp_buf pupa_jmp_buf; +#define pupa_setjmp setjmp +#define pupa_longjmp longjmp +#else /* This must define pupa_jmp_buf. */ #include int pupa_setjmp (pupa_jmp_buf env); void pupa_longjmp (pupa_jmp_buf env, int val) __attribute__ ((noreturn)); +#endif #endif /* ! PUPA_SETJMP_HEADER */ diff --git a/include/grub/term.h b/include/grub/term.h index 4c40a2f86..3e6685b21 100644 --- a/include/grub/term.h +++ b/include/grub/term.h @@ -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) (pupa_term_color_state state); 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 --git a/include/grub/util/getroot.h b/include/grub/util/getroot.h new file mode 100644 index 000000000..c71ce9604 --- /dev/null +++ b/include/grub/util/getroot.h @@ -0,0 +1,26 @@ +/* + * PUPA -- Preliminary Universal Programming Architecture for GRUB + * Copyright (C) 2003 Marco Gerards + * + * 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 --git a/kern/misc.c b/kern/misc.c index 53fc59ecc..e1fa032a8 100644 --- a/kern/misc.c +++ b/kern/misc.c @@ -487,6 +487,9 @@ pupa_vsprintf (char *str, const char *fmt, va_list args) if (str) *str = '\0'; + + if (count && !str) + pupa_refresh (); return count; } diff --git a/kern/rescue.c b/kern/rescue.c index 51e80d579..23e596c22 100644 --- a/kern/rescue.c +++ b/kern/rescue.c @@ -109,9 +109,11 @@ pupa_rescue_get_command_line (const char *prompt) 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 *argv[]) } 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 *argv[]) unsigned len __attribute__ ((unused))) { pupa_putchar ('.'); + pupa_refresh (); } if (argc < 1) @@ -457,7 +463,10 @@ pupa_rescue_cmd_testload (int argc, char *argv[]) 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 __attribute__ ((unused)), pupa_printf ("%s", dep->mod->name); } pupa_putchar ('\n'); + pupa_refresh (); + return 0; } diff --git a/kern/term.c b/kern/term.c index 1d605af2a..1e3dbb15e 100644 --- a/kern/term.c +++ b/kern/term.c @@ -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 --git a/normal/cmdline.c b/normal/cmdline.c index b021b6a1d..d6810cd34 100644 --- a/normal/cmdline.c +++ b/normal/cmdline.c @@ -285,6 +285,7 @@ pupa_cmdline_get (const char *prompt, char cmdline[], unsigned max_len, } pupa_putchar ('\n'); + pupa_refresh (); /* If ECHO_CHAR is NUL, remove leading spaces. */ lpos = 0; diff --git a/normal/main.c b/normal/main.c index d315b585d..52749f79d 100644 --- a/normal/main.c +++ b/normal/main.c @@ -332,6 +332,27 @@ pupa_rescue_cmd_normal (int argc, char *argv[]) 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 --git a/normal/menu.c b/normal/menu.c index ac2e04391..930db0475 100644 --- a/normal/menu.c +++ b/normal/menu.c @@ -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 --git a/util/console.c b/util/console.c new file mode 100644 index 000000000..d5cc72b9c --- /dev/null +++ b/util/console.c @@ -0,0 +1,204 @@ +/* console.c -- Ncurses console for PUPA. */ +/* + * PUPA -- Preliminary Universal Programming Architecture for GRUB + * Copyright (C) 2003 Marco Gerards + * + * 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 +#include +#include +#include + +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 --git a/util/grub-emu.c b/util/grub-emu.c new file mode 100644 index 000000000..0aaa23624 --- /dev/null +++ b/util/grub-emu.c @@ -0,0 +1,172 @@ +/* + * PUPA -- Preliminary Universal Programming Architecture for GRUB + * Copyright (C) 2003 Marco Gerards + * + * 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 +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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', "DEV", 0, "use DEV as the root device [default=guessed]"}, + {"device-map", 'm', "FILE", 0, "use FILE as the device map"}, + {"directory", 'd', "DIR", 0, "use PUPA files in the directory DIR"}, + {"verbose", 'v', 0 , 0, "print verbose messages"}, + { 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}; + + +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; +} diff --git a/util/i386/pc/getroot.c b/util/i386/pc/getroot.c new file mode 100644 index 000000000..2db3883ba --- /dev/null +++ b/util/i386/pc/getroot.c @@ -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 + * Copyright (C) 2003 Marco Gerards + * + * 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 +#include +#include +#include + +#include + +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 --git a/util/i386/pc/grub-setup.c b/util/i386/pc/grub-setup.c index 94a9e743a..31d855d1f 100644 --- a/util/i386/pc/grub-setup.c +++ b/util/i386/pc/grub-setup.c @@ -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 + * Copyright (C) 2003 Marco Gerards * * 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 #include #include +#include #define _GNU_SOURCE 1 #include @@ -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 --git a/util/misc.c b/util/misc.c index 35eafc723..581f07692 100644 --- a/util/misc.c +++ b/util/misc.c @@ -189,18 +189,29 @@ 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_mm_init_region (void *addr, pupa_size_t size) +{ +} + +void +pupa_register_exported_symbols (void) +{ +} + void pupa_stop (void) { exit (1); } -void -pupa_putchar (int c) -{ - putchar (c); -} - pupa_uint32_t pupa_get_rtc (void) {