diff --git a/ChangeLog b/ChangeLog index a88dd1c53..7d4a39db0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +2009-03-28 Robert Millan + + * conf/i386-pc.rmk (pkglib_MODULES): Add `linux16.mod'. + (linux16_mod_SOURCES, linux16_mod_CFLAGS, linux16_mod_LDFLAGS): New + variables. Use 16-bit loader. + (linux_mod_SOURCES, linux_mod_CFLAGS, linux_mod_LDFLAGS): Use 32-bit + loader. + * kern/i386/loader.S (grub_linux_boot): Rename to ... + (grub_linux16_boot): ... this. Update all users. + * loader/i386/linux.c (grub_linux32_boot): Rename to ... + (grub_linux_boot): ... this. Update all users. + + * loader/i386/pc/linux.c (GRUB_MOD_INIT(linux)): Rename to ... + (GRUB_MOD_INIT(linux16)): ... this. Rename `linux' and `initrd' + commands to `linux16' and `initrd16'. + (GRUB_MOD_FINI(linux)): Rename to ... + (GRUB_MOD_FINI(linux16)): ... this. + 2009-03-24 Pavel Roskin * genmk.rb: Define ASM_FILE for *.S files for *.lst generation, diff --git a/conf/i386-pc.mk b/conf/i386-pc.mk index c78c87184..1b76550e9 100644 --- a/conf/i386-pc.mk +++ b/conf/i386-pc.mk @@ -1010,7 +1010,7 @@ grub-mkrescue: util/i386/pc/grub-mkrescue.in $(util/i386/pc/grub-mkrescue.in_DEP chmod +x $@ -pkglib_MODULES = biosdisk.mod chain.mod linux.mod normal.mod \ +pkglib_MODULES = biosdisk.mod chain.mod normal.mod \ multiboot.mod reboot.mod halt.mod \ vbe.mod vbetest.mod vbeinfo.mod play.mod serial.mod \ ata.mod vga.mod memdisk.mod pci.mod lspci.mod \ @@ -1132,14 +1132,71 @@ partmap-chain_mod-loader_i386_pc_chainloader.lst: loader/i386/pc/chainloader.c $ chain_mod_CFLAGS = $(COMMON_CFLAGS) chain_mod_LDFLAGS = $(COMMON_LDFLAGS) -# For _linux.mod. -linux_mod_SOURCES = loader/i386/pc/linux.c -CLEANFILES += linux.mod mod-linux.o mod-linux.c pre-linux.o linux_mod-loader_i386_pc_linux.o und-linux.lst +pkglib_MODULES += linux16.mod +linux16_mod_SOURCES = loader/i386/pc/linux.c +CLEANFILES += linux16.mod mod-linux16.o mod-linux16.c pre-linux16.o linux16_mod-loader_i386_pc_linux.o und-linux16.lst +ifneq ($(linux16_mod_EXPORTS),no) +CLEANFILES += def-linux16.lst +DEFSYMFILES += def-linux16.lst +endif +MOSTLYCLEANFILES += linux16_mod-loader_i386_pc_linux.d +UNDSYMFILES += und-linux16.lst + +linux16.mod: pre-linux16.o mod-linux16.o $(TARGET_OBJ2ELF) + -rm -f $@ + $(TARGET_CC) $(linux16_mod_LDFLAGS) $(TARGET_LDFLAGS) $(MODULE_LDFLAGS) -Wl,-r,-d -o $@ pre-linux16.o mod-linux16.o + if test ! -z $(TARGET_OBJ2ELF); then ./$(TARGET_OBJ2ELF) $@ || (rm -f $@; exit 1); fi + $(STRIP) --strip-unneeded -K grub_mod_init -K grub_mod_fini -K _grub_mod_init -K _grub_mod_fini -R .note -R .comment $@ + +pre-linux16.o: $(linux16_mod_DEPENDENCIES) linux16_mod-loader_i386_pc_linux.o + -rm -f $@ + $(TARGET_CC) $(linux16_mod_LDFLAGS) $(TARGET_LDFLAGS) -Wl,-r,-d -o $@ linux16_mod-loader_i386_pc_linux.o + +mod-linux16.o: mod-linux16.c + $(TARGET_CC) $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(linux16_mod_CFLAGS) -c -o $@ $< + +mod-linux16.c: $(builddir)/moddep.lst $(srcdir)/genmodsrc.sh + sh $(srcdir)/genmodsrc.sh 'linux16' $< > $@ || (rm -f $@; exit 1) + +ifneq ($(linux16_mod_EXPORTS),no) +def-linux16.lst: pre-linux16.o + $(NM) -g --defined-only -P -p $< | sed 's/^\([^ ]*\).*/\1 linux16/' > $@ +endif + +und-linux16.lst: pre-linux16.o + echo 'linux16' > $@ + $(NM) -u -P -p $< | cut -f1 -d' ' >> $@ + +linux16_mod-loader_i386_pc_linux.o: loader/i386/pc/linux.c $(loader/i386/pc/linux.c_DEPENDENCIES) + $(TARGET_CC) -Iloader/i386/pc -I$(srcdir)/loader/i386/pc $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(linux16_mod_CFLAGS) -MD -c -o $@ $< +-include linux16_mod-loader_i386_pc_linux.d + +CLEANFILES += cmd-linux16_mod-loader_i386_pc_linux.lst fs-linux16_mod-loader_i386_pc_linux.lst partmap-linux16_mod-loader_i386_pc_linux.lst +COMMANDFILES += cmd-linux16_mod-loader_i386_pc_linux.lst +FSFILES += fs-linux16_mod-loader_i386_pc_linux.lst +PARTMAPFILES += partmap-linux16_mod-loader_i386_pc_linux.lst + +cmd-linux16_mod-loader_i386_pc_linux.lst: loader/i386/pc/linux.c $(loader/i386/pc/linux.c_DEPENDENCIES) gencmdlist.sh + set -e; $(TARGET_CC) -Iloader/i386/pc -I$(srcdir)/loader/i386/pc $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(linux16_mod_CFLAGS) -E $< | sh $(srcdir)/gencmdlist.sh linux16 > $@ || (rm -f $@; exit 1) + +fs-linux16_mod-loader_i386_pc_linux.lst: loader/i386/pc/linux.c $(loader/i386/pc/linux.c_DEPENDENCIES) genfslist.sh + set -e; $(TARGET_CC) -Iloader/i386/pc -I$(srcdir)/loader/i386/pc $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(linux16_mod_CFLAGS) -E $< | sh $(srcdir)/genfslist.sh linux16 > $@ || (rm -f $@; exit 1) + +partmap-linux16_mod-loader_i386_pc_linux.lst: loader/i386/pc/linux.c $(loader/i386/pc/linux.c_DEPENDENCIES) genpartmaplist.sh + set -e; $(TARGET_CC) -Iloader/i386/pc -I$(srcdir)/loader/i386/pc $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(linux16_mod_CFLAGS) -E $< | sh $(srcdir)/genpartmaplist.sh linux16 > $@ || (rm -f $@; exit 1) + + +linux16_mod_CFLAGS = $(COMMON_CFLAGS) +linux16_mod_LDFLAGS = $(COMMON_LDFLAGS) + +pkglib_MODULES += linux.mod +linux_mod_SOURCES = loader/i386/linux.c +CLEANFILES += linux.mod mod-linux.o mod-linux.c pre-linux.o linux_mod-loader_i386_linux.o und-linux.lst ifneq ($(linux_mod_EXPORTS),no) CLEANFILES += def-linux.lst DEFSYMFILES += def-linux.lst endif -MOSTLYCLEANFILES += linux_mod-loader_i386_pc_linux.d +MOSTLYCLEANFILES += linux_mod-loader_i386_linux.d UNDSYMFILES += und-linux.lst linux.mod: pre-linux.o mod-linux.o $(TARGET_OBJ2ELF) @@ -1148,9 +1205,9 @@ linux.mod: pre-linux.o mod-linux.o $(TARGET_OBJ2ELF) if test ! -z $(TARGET_OBJ2ELF); then ./$(TARGET_OBJ2ELF) $@ || (rm -f $@; exit 1); fi $(STRIP) --strip-unneeded -K grub_mod_init -K grub_mod_fini -K _grub_mod_init -K _grub_mod_fini -R .note -R .comment $@ -pre-linux.o: $(linux_mod_DEPENDENCIES) linux_mod-loader_i386_pc_linux.o +pre-linux.o: $(linux_mod_DEPENDENCIES) linux_mod-loader_i386_linux.o -rm -f $@ - $(TARGET_CC) $(linux_mod_LDFLAGS) $(TARGET_LDFLAGS) -Wl,-r,-d -o $@ linux_mod-loader_i386_pc_linux.o + $(TARGET_CC) $(linux_mod_LDFLAGS) $(TARGET_LDFLAGS) -Wl,-r,-d -o $@ linux_mod-loader_i386_linux.o mod-linux.o: mod-linux.c $(TARGET_CC) $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(linux_mod_CFLAGS) -c -o $@ $< @@ -1167,23 +1224,23 @@ und-linux.lst: pre-linux.o echo 'linux' > $@ $(NM) -u -P -p $< | cut -f1 -d' ' >> $@ -linux_mod-loader_i386_pc_linux.o: loader/i386/pc/linux.c $(loader/i386/pc/linux.c_DEPENDENCIES) - $(TARGET_CC) -Iloader/i386/pc -I$(srcdir)/loader/i386/pc $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(linux_mod_CFLAGS) -MD -c -o $@ $< --include linux_mod-loader_i386_pc_linux.d +linux_mod-loader_i386_linux.o: loader/i386/linux.c $(loader/i386/linux.c_DEPENDENCIES) + $(TARGET_CC) -Iloader/i386 -I$(srcdir)/loader/i386 $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(linux_mod_CFLAGS) -MD -c -o $@ $< +-include linux_mod-loader_i386_linux.d -CLEANFILES += cmd-linux_mod-loader_i386_pc_linux.lst fs-linux_mod-loader_i386_pc_linux.lst partmap-linux_mod-loader_i386_pc_linux.lst -COMMANDFILES += cmd-linux_mod-loader_i386_pc_linux.lst -FSFILES += fs-linux_mod-loader_i386_pc_linux.lst -PARTMAPFILES += partmap-linux_mod-loader_i386_pc_linux.lst +CLEANFILES += cmd-linux_mod-loader_i386_linux.lst fs-linux_mod-loader_i386_linux.lst partmap-linux_mod-loader_i386_linux.lst +COMMANDFILES += cmd-linux_mod-loader_i386_linux.lst +FSFILES += fs-linux_mod-loader_i386_linux.lst +PARTMAPFILES += partmap-linux_mod-loader_i386_linux.lst -cmd-linux_mod-loader_i386_pc_linux.lst: loader/i386/pc/linux.c $(loader/i386/pc/linux.c_DEPENDENCIES) gencmdlist.sh - set -e; $(TARGET_CC) -Iloader/i386/pc -I$(srcdir)/loader/i386/pc $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(linux_mod_CFLAGS) -E $< | sh $(srcdir)/gencmdlist.sh linux > $@ || (rm -f $@; exit 1) +cmd-linux_mod-loader_i386_linux.lst: loader/i386/linux.c $(loader/i386/linux.c_DEPENDENCIES) gencmdlist.sh + set -e; $(TARGET_CC) -Iloader/i386 -I$(srcdir)/loader/i386 $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(linux_mod_CFLAGS) -E $< | sh $(srcdir)/gencmdlist.sh linux > $@ || (rm -f $@; exit 1) -fs-linux_mod-loader_i386_pc_linux.lst: loader/i386/pc/linux.c $(loader/i386/pc/linux.c_DEPENDENCIES) genfslist.sh - set -e; $(TARGET_CC) -Iloader/i386/pc -I$(srcdir)/loader/i386/pc $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(linux_mod_CFLAGS) -E $< | sh $(srcdir)/genfslist.sh linux > $@ || (rm -f $@; exit 1) +fs-linux_mod-loader_i386_linux.lst: loader/i386/linux.c $(loader/i386/linux.c_DEPENDENCIES) genfslist.sh + set -e; $(TARGET_CC) -Iloader/i386 -I$(srcdir)/loader/i386 $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(linux_mod_CFLAGS) -E $< | sh $(srcdir)/genfslist.sh linux > $@ || (rm -f $@; exit 1) -partmap-linux_mod-loader_i386_pc_linux.lst: loader/i386/pc/linux.c $(loader/i386/pc/linux.c_DEPENDENCIES) genpartmaplist.sh - set -e; $(TARGET_CC) -Iloader/i386/pc -I$(srcdir)/loader/i386/pc $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(linux_mod_CFLAGS) -E $< | sh $(srcdir)/genpartmaplist.sh linux > $@ || (rm -f $@; exit 1) +partmap-linux_mod-loader_i386_linux.lst: loader/i386/linux.c $(loader/i386/linux.c_DEPENDENCIES) genpartmaplist.sh + set -e; $(TARGET_CC) -Iloader/i386 -I$(srcdir)/loader/i386 $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) $(linux_mod_CFLAGS) -E $< | sh $(srcdir)/genpartmaplist.sh linux > $@ || (rm -f $@; exit 1) linux_mod_CFLAGS = $(COMMON_CFLAGS) diff --git a/conf/i386-pc.rmk b/conf/i386-pc.rmk index 60d518235..7fa19757f 100644 --- a/conf/i386-pc.rmk +++ b/conf/i386-pc.rmk @@ -167,7 +167,7 @@ grub_install_SOURCES = util/i386/pc/grub-install.in # For grub-mkrescue. grub_mkrescue_SOURCES = util/i386/pc/grub-mkrescue.in -pkglib_MODULES = biosdisk.mod chain.mod linux.mod normal.mod \ +pkglib_MODULES = biosdisk.mod chain.mod normal.mod \ multiboot.mod reboot.mod halt.mod \ vbe.mod vbetest.mod vbeinfo.mod play.mod serial.mod \ ata.mod vga.mod memdisk.mod pci.mod lspci.mod \ @@ -185,8 +185,13 @@ chain_mod_SOURCES = loader/i386/pc/chainloader.c chain_mod_CFLAGS = $(COMMON_CFLAGS) chain_mod_LDFLAGS = $(COMMON_LDFLAGS) -# For _linux.mod. -linux_mod_SOURCES = loader/i386/pc/linux.c +pkglib_MODULES += linux16.mod +linux16_mod_SOURCES = loader/i386/pc/linux.c +linux16_mod_CFLAGS = $(COMMON_CFLAGS) +linux16_mod_LDFLAGS = $(COMMON_LDFLAGS) + +pkglib_MODULES += linux.mod +linux_mod_SOURCES = loader/i386/linux.c linux_mod_CFLAGS = $(COMMON_CFLAGS) linux_mod_LDFLAGS = $(COMMON_LDFLAGS) diff --git a/include/grub/i386/loader.h b/include/grub/i386/loader.h index 305203054..afd3eb93f 100644 --- a/include/grub/i386/loader.h +++ b/include/grub/i386/loader.h @@ -30,7 +30,7 @@ extern grub_int32_t EXPORT_VAR(grub_linux_is_bzimage); extern grub_addr_t EXPORT_VAR(grub_os_area_addr); extern grub_size_t EXPORT_VAR(grub_os_area_size); -grub_err_t EXPORT_FUNC(grub_linux_boot) (void); +grub_err_t EXPORT_FUNC(grub_linux16_boot) (void); void EXPORT_FUNC(grub_unix_real_boot) (grub_addr_t entry, ...) __attribute__ ((cdecl,noreturn)); diff --git a/kern/i386/loader.S b/kern/i386/loader.S index 0e8ded68e..bbd2187fb 100644 --- a/kern/i386/loader.S +++ b/kern/i386/loader.S @@ -59,7 +59,7 @@ VARIABLE(grub_linux_real_addr) VARIABLE(grub_linux_is_bzimage) .long 0 -FUNCTION(grub_linux_boot) +FUNCTION(grub_linux16_boot) /* Must be done before zImage copy. */ call EXT_C(grub_dl_unload_all) diff --git a/loader/i386/linux.c b/loader/i386/linux.c index f8b9862a4..eb0a8859b 100644 --- a/loader/i386/linux.c +++ b/loader/i386/linux.c @@ -263,7 +263,7 @@ struct #endif static grub_err_t -grub_linux32_boot (void) +grub_linux_boot (void) { struct linux_kernel_params *params; int e820_num; @@ -522,7 +522,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), if (grub_errno == GRUB_ERR_NONE) { - grub_loader_set (grub_linux32_boot, grub_linux_unload, + grub_loader_set (grub_linux_boot, grub_linux_unload, 0 /* set noreturn=0 in order to avoid grub_console_fini() */); loaded = 1; } diff --git a/loader/i386/pc/linux.c b/loader/i386/pc/linux.c index 935f21ba1..8ff97f433 100644 --- a/loader/i386/pc/linux.c +++ b/loader/i386/pc/linux.c @@ -269,7 +269,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), if (grub_errno == GRUB_ERR_NONE) { grub_linux_prot_size = prot_size; - grub_loader_set (grub_linux_boot, grub_linux_unload, 1); + grub_loader_set (grub_linux16_boot, grub_linux_unload, 1); loaded = 1; } @@ -378,18 +378,18 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), static grub_command_t cmd_linux, cmd_initrd; -GRUB_MOD_INIT(linux) +GRUB_MOD_INIT(linux16) { cmd_linux = - grub_register_command ("linux", grub_cmd_linux, + grub_register_command ("linux16", grub_cmd_linux, 0, "load linux"); cmd_initrd = - grub_register_command ("initrd", grub_cmd_initrd, + grub_register_command ("initrd16", grub_cmd_initrd, 0, "load initrd"); my_mod = mod; } -GRUB_MOD_FINI(linux) +GRUB_MOD_FINI(linux16) { grub_unregister_command (cmd_linux); grub_unregister_command (cmd_initrd);