2006-04-30 Yoshinori K. Okuji <okuji@enbug.org>
Extend the loader so that GRUB can accept a loader which comes back to GRUB when a loaded image exits. Also, this change adds support for a chainloader on EFI. * term/efi/console.c: Include grub/misc.h. (grub_console_checkkey): Display a scan code on the top for debugging. This will be removed once the EFI port gets stable. Correct the scan code mapping. * kern/efi/mm.c (sort_memory_map): Sort in a descending order to allocate memory from larger regions, in order to reduce the number of allocated regions. Otherwise, the MacOSX loader panics. (filter_memory_map): Avoid less than 1MB for compatibility with other loaders. (add_memory_regions): Allocate from the tail of a region, if possible, to avoid allocating a region near to 1MB, for the MacOSX loader. * kern/efi/init.c (grub_efi_set_prefix): Specify GRUB_EFI_IMAGE_HANDLE to grub_efi_get_loaded_image. * kern/efi/efi.c (grub_efi_get_loaded_image): Accept a new argument IMAGE_HANDLE and specify it to get a loaded image. (grub_arch_modules_addr): Specify GRUB_EFI_IMAGE_HANDLE to grub_efi_get_loaded_image. (grub_efi_get_filename): Divide the legnth by the size of grub_efi_char16_t. (grub_efi_get_device_path): New function. (grub_efi_print_device_path): Print End Device Path nodes. Divide the length by the size of grub_efi_char16_t for a file path device path node. * kern/loader.c (grub_loader_noreturn): New variable. (grub_loader_set): Accept a new argument NORETURN. Set GRUB_LOADER_NORETURN to NORETURN. All callers changed. (grub_loader_boot): If GRUB_LOADER_NORETURN is false, do not call grub_machine_fini. * include/grub/efi/efi.h (grub_efi_get_device_path): New prototype. (grub_efi_get_loaded_image): Take an argument to specify an image handle. * include/grub/loader.h (grub_loader_set): Added one more argument NORETURN. * disk/efi/efidisk.c (make_devices): Use grub_efi_get_device_path instead of grub_efi_open_protocol. (grub_efidisk_get_device_name): Likewise. (grub_efidisk_close): Print a newline. (grub_efidisk_get_device_handle): Fixed to use GRUB_EFI_DEVICE_PATH_SUBTYPE instead of GRUB_EFI_DEVICE_PATH_TYPE. * disk/efi/efidisk.c (device_path_guid): Moved to ... * kern/efi/efi.c (device_path_guid): ... here. * conf/i386-efi.rmk (pkgdata_MODULES): Added _chain.mod and chain.mod. (kernel_mod_HEADERS): Added efi/disk.h. (_chain_mod_SOURCES): New variable. (_chain_mod_CFLAGS): Likewise. (_chain_mod_LDFLAGS): Likewise. (chain_mod_SOURCES): Likewise. (chain_mod_CFLAGS): Likewise. (chain_mod_LDFLAGS): Likewise. * DISTLIST: Added include/grub/efi/chainloader.h, loader/efi/chainloader.c and loader/efi/chainloader_normal.c. * include/grub/efi/chainloader.h: New file. * loader/efi/chainloader.c: Likewise. * loader/efi/chainloader_normal.c: Likewise.
This commit is contained in:
parent
c0111d6e92
commit
7f362539b7
19 changed files with 743 additions and 64 deletions
116
conf/i386-efi.mk
116
conf/i386-efi.mk
|
@ -111,7 +111,7 @@ genmoddep-util_genmoddep.d: util/genmoddep.c
|
|||
#grub_install_SOURCES = util/efi/pc/grub-install.in
|
||||
|
||||
# Modules.
|
||||
pkgdata_MODULES = kernel.mod normal.mod
|
||||
pkgdata_MODULES = kernel.mod normal.mod _chain.mod chain.mod
|
||||
|
||||
# For kernel.mod.
|
||||
kernel_mod_EXPORTS = no
|
||||
|
@ -612,7 +612,7 @@ fs-kernel_mod-disk_efi_efidisk.lst: disk/efi/efidisk.c genfslist.sh
|
|||
kernel_mod_HEADERS = arg.h boot.h device.h disk.h dl.h elf.h env.h err.h \
|
||||
file.h fs.h kernel.h loader.h misc.h mm.h net.h parser.h partition.h \
|
||||
pc_partition.h rescue.h symbol.h term.h types.h \
|
||||
i386/efi/time.h efi/efi.h efi/time.h
|
||||
i386/efi/time.h efi/efi.h efi/time.h efi/disk.h
|
||||
kernel_mod_CFLAGS = $(COMMON_CFLAGS)
|
||||
kernel_mod_ASFLAGS = $(COMMON_ASFLAGS)
|
||||
kernel_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
||||
|
@ -954,4 +954,116 @@ normal_mod_CFLAGS = $(COMMON_CFLAGS)
|
|||
normal_mod_ASFLAGS = $(COMMON_ASFLAGS)
|
||||
normal_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
||||
|
||||
# For _chain.mod.
|
||||
_chain_mod_SOURCES = loader/efi/chainloader.c
|
||||
CLEANFILES += _chain.mod mod-_chain.o mod-_chain.c pre-_chain.o _chain_mod-loader_efi_chainloader.o und-_chain.lst
|
||||
ifneq ($(_chain_mod_EXPORTS),no)
|
||||
CLEANFILES += def-_chain.lst
|
||||
DEFSYMFILES += def-_chain.lst
|
||||
endif
|
||||
MOSTLYCLEANFILES += _chain_mod-loader_efi_chainloader.d
|
||||
UNDSYMFILES += und-_chain.lst
|
||||
|
||||
_chain.mod: pre-_chain.o mod-_chain.o
|
||||
-rm -f $@
|
||||
$(CC) $(_chain_mod_LDFLAGS) $(LDFLAGS) -Wl,-r,-d -o $@ $^
|
||||
$(STRIP) --strip-unneeded -K grub_mod_init -K grub_mod_fini -R .note -R .comment $@
|
||||
|
||||
pre-_chain.o: _chain_mod-loader_efi_chainloader.o
|
||||
-rm -f $@
|
||||
$(CC) $(_chain_mod_LDFLAGS) $(LDFLAGS) -Wl,-r,-d -o $@ $^
|
||||
|
||||
mod-_chain.o: mod-_chain.c
|
||||
$(CC) $(CPPFLAGS) $(CFLAGS) $(_chain_mod_CFLAGS) -c -o $@ $<
|
||||
|
||||
mod-_chain.c: moddep.lst genmodsrc.sh
|
||||
sh $(srcdir)/genmodsrc.sh '_chain' $< > $@ || (rm -f $@; exit 1)
|
||||
|
||||
ifneq ($(_chain_mod_EXPORTS),no)
|
||||
def-_chain.lst: pre-_chain.o
|
||||
$(NM) -g --defined-only -P -p $< | sed 's/^\([^ ]*\).*/\1 _chain/' > $@
|
||||
endif
|
||||
|
||||
und-_chain.lst: pre-_chain.o
|
||||
echo '_chain' > $@
|
||||
$(NM) -u -P -p $< | cut -f1 -d' ' >> $@
|
||||
|
||||
_chain_mod-loader_efi_chainloader.o: loader/efi/chainloader.c
|
||||
$(CC) -Iloader/efi -I$(srcdir)/loader/efi $(CPPFLAGS) $(CFLAGS) $(_chain_mod_CFLAGS) -c -o $@ $<
|
||||
|
||||
_chain_mod-loader_efi_chainloader.d: loader/efi/chainloader.c
|
||||
set -e; $(CC) -Iloader/efi -I$(srcdir)/loader/efi $(CPPFLAGS) $(CFLAGS) $(_chain_mod_CFLAGS) -M $< | sed 's,chainloader\.o[ :]*,_chain_mod-loader_efi_chainloader.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
|
||||
|
||||
-include _chain_mod-loader_efi_chainloader.d
|
||||
|
||||
CLEANFILES += cmd-_chain_mod-loader_efi_chainloader.lst fs-_chain_mod-loader_efi_chainloader.lst
|
||||
COMMANDFILES += cmd-_chain_mod-loader_efi_chainloader.lst
|
||||
FSFILES += fs-_chain_mod-loader_efi_chainloader.lst
|
||||
|
||||
cmd-_chain_mod-loader_efi_chainloader.lst: loader/efi/chainloader.c gencmdlist.sh
|
||||
set -e; $(CC) -Iloader/efi -I$(srcdir)/loader/efi $(CPPFLAGS) $(CFLAGS) $(_chain_mod_CFLAGS) -E $< | sh $(srcdir)/gencmdlist.sh _chain > $@ || (rm -f $@; exit 1)
|
||||
|
||||
fs-_chain_mod-loader_efi_chainloader.lst: loader/efi/chainloader.c genfslist.sh
|
||||
set -e; $(CC) -Iloader/efi -I$(srcdir)/loader/efi $(CPPFLAGS) $(CFLAGS) $(_chain_mod_CFLAGS) -E $< | sh $(srcdir)/genfslist.sh _chain > $@ || (rm -f $@; exit 1)
|
||||
|
||||
|
||||
_chain_mod_CFLAGS = $(COMMON_CFLAGS)
|
||||
_chain_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
||||
|
||||
# For chain.mod.
|
||||
chain_mod_SOURCES = loader/efi/chainloader_normal.c
|
||||
CLEANFILES += chain.mod mod-chain.o mod-chain.c pre-chain.o chain_mod-loader_efi_chainloader_normal.o und-chain.lst
|
||||
ifneq ($(chain_mod_EXPORTS),no)
|
||||
CLEANFILES += def-chain.lst
|
||||
DEFSYMFILES += def-chain.lst
|
||||
endif
|
||||
MOSTLYCLEANFILES += chain_mod-loader_efi_chainloader_normal.d
|
||||
UNDSYMFILES += und-chain.lst
|
||||
|
||||
chain.mod: pre-chain.o mod-chain.o
|
||||
-rm -f $@
|
||||
$(CC) $(chain_mod_LDFLAGS) $(LDFLAGS) -Wl,-r,-d -o $@ $^
|
||||
$(STRIP) --strip-unneeded -K grub_mod_init -K grub_mod_fini -R .note -R .comment $@
|
||||
|
||||
pre-chain.o: chain_mod-loader_efi_chainloader_normal.o
|
||||
-rm -f $@
|
||||
$(CC) $(chain_mod_LDFLAGS) $(LDFLAGS) -Wl,-r,-d -o $@ $^
|
||||
|
||||
mod-chain.o: mod-chain.c
|
||||
$(CC) $(CPPFLAGS) $(CFLAGS) $(chain_mod_CFLAGS) -c -o $@ $<
|
||||
|
||||
mod-chain.c: moddep.lst genmodsrc.sh
|
||||
sh $(srcdir)/genmodsrc.sh 'chain' $< > $@ || (rm -f $@; exit 1)
|
||||
|
||||
ifneq ($(chain_mod_EXPORTS),no)
|
||||
def-chain.lst: pre-chain.o
|
||||
$(NM) -g --defined-only -P -p $< | sed 's/^\([^ ]*\).*/\1 chain/' > $@
|
||||
endif
|
||||
|
||||
und-chain.lst: pre-chain.o
|
||||
echo 'chain' > $@
|
||||
$(NM) -u -P -p $< | cut -f1 -d' ' >> $@
|
||||
|
||||
chain_mod-loader_efi_chainloader_normal.o: loader/efi/chainloader_normal.c
|
||||
$(CC) -Iloader/efi -I$(srcdir)/loader/efi $(CPPFLAGS) $(CFLAGS) $(chain_mod_CFLAGS) -c -o $@ $<
|
||||
|
||||
chain_mod-loader_efi_chainloader_normal.d: loader/efi/chainloader_normal.c
|
||||
set -e; $(CC) -Iloader/efi -I$(srcdir)/loader/efi $(CPPFLAGS) $(CFLAGS) $(chain_mod_CFLAGS) -M $< | sed 's,chainloader_normal\.o[ :]*,chain_mod-loader_efi_chainloader_normal.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
|
||||
|
||||
-include chain_mod-loader_efi_chainloader_normal.d
|
||||
|
||||
CLEANFILES += cmd-chain_mod-loader_efi_chainloader_normal.lst fs-chain_mod-loader_efi_chainloader_normal.lst
|
||||
COMMANDFILES += cmd-chain_mod-loader_efi_chainloader_normal.lst
|
||||
FSFILES += fs-chain_mod-loader_efi_chainloader_normal.lst
|
||||
|
||||
cmd-chain_mod-loader_efi_chainloader_normal.lst: loader/efi/chainloader_normal.c gencmdlist.sh
|
||||
set -e; $(CC) -Iloader/efi -I$(srcdir)/loader/efi $(CPPFLAGS) $(CFLAGS) $(chain_mod_CFLAGS) -E $< | sh $(srcdir)/gencmdlist.sh chain > $@ || (rm -f $@; exit 1)
|
||||
|
||||
fs-chain_mod-loader_efi_chainloader_normal.lst: loader/efi/chainloader_normal.c genfslist.sh
|
||||
set -e; $(CC) -Iloader/efi -I$(srcdir)/loader/efi $(CPPFLAGS) $(CFLAGS) $(chain_mod_CFLAGS) -E $< | sh $(srcdir)/genfslist.sh chain > $@ || (rm -f $@; exit 1)
|
||||
|
||||
|
||||
chain_mod_CFLAGS = $(COMMON_CFLAGS)
|
||||
chain_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
||||
|
||||
include $(srcdir)/conf/common.mk
|
||||
|
|
|
@ -67,7 +67,7 @@ genmoddep_SOURCES = util/genmoddep.c
|
|||
#grub_install_SOURCES = util/efi/pc/grub-install.in
|
||||
|
||||
# Modules.
|
||||
pkgdata_MODULES = kernel.mod normal.mod
|
||||
pkgdata_MODULES = kernel.mod normal.mod _chain.mod chain.mod
|
||||
|
||||
# For kernel.mod.
|
||||
kernel_mod_EXPORTS = no
|
||||
|
@ -80,7 +80,7 @@ kernel_mod_SOURCES = kern/i386/efi/startup.S kern/main.c kern/device.c \
|
|||
kernel_mod_HEADERS = arg.h boot.h device.h disk.h dl.h elf.h env.h err.h \
|
||||
file.h fs.h kernel.h loader.h misc.h mm.h net.h parser.h partition.h \
|
||||
pc_partition.h rescue.h symbol.h term.h types.h \
|
||||
i386/efi/time.h efi/efi.h efi/time.h
|
||||
i386/efi/time.h efi/efi.h efi/time.h efi/disk.h
|
||||
kernel_mod_CFLAGS = $(COMMON_CFLAGS)
|
||||
kernel_mod_ASFLAGS = $(COMMON_ASFLAGS)
|
||||
kernel_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
||||
|
@ -105,4 +105,14 @@ normal_mod_CFLAGS = $(COMMON_CFLAGS)
|
|||
normal_mod_ASFLAGS = $(COMMON_ASFLAGS)
|
||||
normal_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
||||
|
||||
# For _chain.mod.
|
||||
_chain_mod_SOURCES = loader/efi/chainloader.c
|
||||
_chain_mod_CFLAGS = $(COMMON_CFLAGS)
|
||||
_chain_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
||||
|
||||
# For chain.mod.
|
||||
chain_mod_SOURCES = loader/efi/chainloader_normal.c
|
||||
chain_mod_CFLAGS = $(COMMON_CFLAGS)
|
||||
chain_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
||||
|
||||
include $(srcdir)/conf/common.mk
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue