Merge from trunk
This commit is contained in:
commit
648fb15b29
18 changed files with 199 additions and 118 deletions
110
ChangeLog
110
ChangeLog
|
@ -1,3 +1,113 @@
|
||||||
|
2009-12-13 Robert Millan <rmh.grub@aybabtu.com>
|
||||||
|
|
||||||
|
* loader/i386/multiboot_elfxx.c
|
||||||
|
(CONCAT(grub_multiboot_load_elf, XX)): Fix `grub_multiboot_payload_eip'
|
||||||
|
initialization.
|
||||||
|
|
||||||
|
2009-12-13 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
Relocator framework
|
||||||
|
|
||||||
|
* loader/i386/xnu_helper.S: Removed. All users updated.
|
||||||
|
* conf/i386.rmk (pkglib_MODULES): Add relocator.mod.
|
||||||
|
(relocator_mod_SOURCES): New variable.
|
||||||
|
(relocator_mod_CFLAGS): Likewise.
|
||||||
|
(relocator_mod_LDFLAGS): Likewise.
|
||||||
|
(relocator_mod_ASFLAGS): Likewise.
|
||||||
|
* conf/x86_64.rmk: Likewise.
|
||||||
|
* include/grub/i386/multiboot.h (grub_multiboot_payload_orig): Removed.
|
||||||
|
(grub_multiboot_payload_entry_offset): Likewise.
|
||||||
|
(grub_multiboot_forward_relocator): Likewise.
|
||||||
|
(grub_multiboot_forward_relocator_end): Likewise.
|
||||||
|
(grub_multiboot_backward_relocator): Likewise.
|
||||||
|
(grub_multiboot_backward_relocator_end): Likewise.
|
||||||
|
(grub_multiboot_payload_eip): New variable.
|
||||||
|
(grub_multiboot_payload_orig): Likewise.
|
||||||
|
* include/grub/i386/pc/memory.h: Include grub/i386/memory.h.
|
||||||
|
(GRUB_MEMORY_MACHINE_CR0_PE_ON): Move from here ...
|
||||||
|
* include/grub/i386/memory.h
|
||||||
|
(GRUB_MEMORY_CPU_CR0_PE_ON): ... to here
|
||||||
|
(GRUB_MEMORY_CPU_CR4_PAE_ON): New definition.
|
||||||
|
(GRUB_MEMORY_CPU_CR0_PAGING_ON): Likewise.
|
||||||
|
(GRUB_MEMORY_CPU_AMD64_MSR): Likewise.
|
||||||
|
(GRUB_MEMORY_CPU_AMD64_MSR_ON): Likewise.
|
||||||
|
* include/grub/i386/relocator.h: New file.
|
||||||
|
* include/grub/x86_64/relocator.h: Likewise.
|
||||||
|
* include/grub/i386/xnu.h: Include grub/cpu/relocator.h.
|
||||||
|
(XNU_RELOCATOR): New macro.
|
||||||
|
(grub_xnu_launcher_start): Remove.
|
||||||
|
(grub_xnu_launcher_end): Likewise.
|
||||||
|
* include/grub/xnu.h (grub_xnu_boot_resume): New prototype.
|
||||||
|
(grub_xnu_heap_real_start): Remove.
|
||||||
|
(grub_xnu_heap_start): Change to void *. All users updated.
|
||||||
|
* kern/i386/realmode.S (real_to_prot): Use GRUB_MEMORY_CPU_CR0_PE_ON.
|
||||||
|
* lib/i386/relocator.c: New file.
|
||||||
|
* lib/i386/relocator_asm.S: Likewise.
|
||||||
|
* lib/i386/relocator_backward.S: Likewise.
|
||||||
|
* lib/mips/relocator.c: Likewise.
|
||||||
|
* lib/mips/relocator_asm.S: Likewise.
|
||||||
|
* lib/relocator.c: Likewise.
|
||||||
|
* loader/i386/multiboot.c: Include grub/i386/relocator.h.
|
||||||
|
(entry): Removed.
|
||||||
|
(playground): Likewise.
|
||||||
|
(grub_multiboot_payload_orig): New variable.
|
||||||
|
(grub_multiboot_payload_dest): Likewise.
|
||||||
|
(grub_multiboot_payload_size): Likewise.
|
||||||
|
(grub_multiboot_payload_eip): Likewise.
|
||||||
|
(grub_multiboot_payload_esp): Likewise.
|
||||||
|
(grub_multiboot_boot): Use grub_relocator32_boot.
|
||||||
|
(grub_multiboot_unload): Free relocators.
|
||||||
|
(grub_multiboot): Setup stack. Use relocators.
|
||||||
|
* loader/i386/multiboot_elfxx.c: Include grub/i386/relocator.h.
|
||||||
|
(grub_multiboot_load_elfXX): Use relocators.
|
||||||
|
* loader/i386/multiboot_helper.S (grub_multiboot_payload_orig): Removed.
|
||||||
|
(grub_multiboot_payload_size): Likewise.
|
||||||
|
(grub_multiboot_payload_dest): Likewise.
|
||||||
|
(grub_multiboot_payload_entry_offset): Likewise.
|
||||||
|
(grub_multiboot_forward_relocator): Likewise.
|
||||||
|
(grub_multiboot_backward_relocator): Likewise.
|
||||||
|
(grub_multiboot_real_boot): Likewise.
|
||||||
|
* loader/i386/xnu.c (grub_xnu_heap_will_be_at): New variable.
|
||||||
|
(grub_xnu_entry_point): Likewise.
|
||||||
|
(grub_xnu_arg1): Likewise.
|
||||||
|
(grub_xnu_stack): Likewise.
|
||||||
|
(grub_xnu_launch): Removed.
|
||||||
|
(grub_xnu_boot_resume): New function.
|
||||||
|
(grub_xnu_boot): Use relocators.
|
||||||
|
* loader/i386/xnu_helper.S: Removed.
|
||||||
|
* loader/xnu.c (grub_xnu_heap_start): New variable.
|
||||||
|
(grub_xnu_heap_size): Likewise.
|
||||||
|
(grub_xnu_heap_malloc): Use relocators.
|
||||||
|
* loader/xnu_resume.c (grub_xnu_resume): Use relocators.
|
||||||
|
|
||||||
|
2009-12-13 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* kern/i386/pc/startup.S (multiboot_entry): Setup stack before calling
|
||||||
|
anything.
|
||||||
|
|
||||||
|
2009-12-13 Carles Pina i Estany <carles@pina.cat>
|
||||||
|
|
||||||
|
* script/execute.c (grub_script_execute_cmdline): Set grub_errno to
|
||||||
|
GRUB_ERR_NONE before calling grub_env_set.
|
||||||
|
|
||||||
|
2009-12-12 Robert Millan <rmh@aybabtu.com>
|
||||||
|
|
||||||
|
* gendistlist.sh (EXTRA_DISTFILES): Add `genvideolist.sh'.
|
||||||
|
* genmk.rb (video): New variable.
|
||||||
|
(CLEANFILES, VIDEOFILES): Add #{video}.
|
||||||
|
(#{video}): New target rule.
|
||||||
|
* genvideolist.sh: New file.
|
||||||
|
* Makefile.in (pkglib_DATA): Add video.lst.
|
||||||
|
(video.lst): New target rule.
|
||||||
|
* util/grub-mkconfig.in: Initialize ${GRUB_VIDEO_BACKEND} using
|
||||||
|
`video.lst'.
|
||||||
|
* util/grub.d/30_os-prober.in: Replace `vbe' with
|
||||||
|
${GRUB_VIDEO_BACKEND}.
|
||||||
|
|
||||||
|
2009-12-11 Robert Millan <rmh.grub@aybabtu.com>
|
||||||
|
|
||||||
|
* THANKS: Add David Miller.
|
||||||
|
|
||||||
2009-12-11 Vladimir Serbinenko <phcoder@gmail.com>
|
2009-12-11 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
libpciaccess support.
|
libpciaccess support.
|
||||||
|
|
|
@ -1,77 +0,0 @@
|
||||||
2009-11-28 Vladimir Serbinenko <phcoder@gmail.com>
|
|
||||||
|
|
||||||
Relocator framework
|
|
||||||
|
|
||||||
* THANKS: Add David Miller.
|
|
||||||
* loader/i386/xnu_helper.S: Removed. All users updated.
|
|
||||||
* conf/i386.rmk (pkglib_MODULES): Add relocator.mod.
|
|
||||||
(relocator_mod_SOURCES): New variable.
|
|
||||||
(relocator_mod_CFLAGS): Likewise.
|
|
||||||
(relocator_mod_LDFLAGS): Likewise.
|
|
||||||
(relocator_mod_ASFLAGS): Likewise.
|
|
||||||
* conf/x86_64.rmk: Likewise.
|
|
||||||
* include/grub/i386/multiboot.h (grub_multiboot_payload_orig): Removed.
|
|
||||||
(grub_multiboot_payload_entry_offset): Likewise.
|
|
||||||
(grub_multiboot_forward_relocator): Likewise.
|
|
||||||
(grub_multiboot_forward_relocator_end): Likewise.
|
|
||||||
(grub_multiboot_backward_relocator): Likewise.
|
|
||||||
(grub_multiboot_backward_relocator_end): Likewise.
|
|
||||||
(grub_multiboot_payload_eip): New variable.
|
|
||||||
(grub_multiboot_payload_orig): Likewise.
|
|
||||||
(GRUB_MULTIBOOT_STACK_SIZE): New definition.
|
|
||||||
* include/grub/i386/pc/memory.h: Include grub/i386/memory.h.
|
|
||||||
(GRUB_MEMORY_MACHINE_CR0_PE_ON): Move from here ...
|
|
||||||
* include/grub/i386/memory.h
|
|
||||||
(GRUB_MEMORY_CPU_CR0_PE_ON): ... to here
|
|
||||||
(GRUB_MEMORY_CPU_CR4_PAE_ON): New definition.
|
|
||||||
(GRUB_MEMORY_CPU_CR0_PAGING_ON): Likewise.
|
|
||||||
(GRUB_MEMORY_CPU_AMD64_MSR): Likewise.
|
|
||||||
(GRUB_MEMORY_CPU_AMD64_MSR_ON): Likewise.
|
|
||||||
* include/grub/i386/relocator.h: New file.
|
|
||||||
* include/grub/x86_64/relocator.h: Likewise.
|
|
||||||
* include/grub/i386/xnu.h: Include grub/cpu/relocator.h.
|
|
||||||
(XNU_RELOCATOR): New macro.
|
|
||||||
(grub_xnu_launcher_start): Remove.
|
|
||||||
(grub_xnu_launcher_end): Likewise.
|
|
||||||
* include/grub/xnu.h (grub_xnu_boot_resume): New prototype.
|
|
||||||
(grub_xnu_heap_real_start): Remove.
|
|
||||||
(grub_xnu_heap_start): Change to void *. All users updated.
|
|
||||||
* kern/i386/realmode.S (real_to_prot): Use GRUB_MEMORY_CPU_CR0_PE_ON.
|
|
||||||
* lib/i386/relocator.c: New file.
|
|
||||||
* lib/i386/relocator_asm.S: Likewise.
|
|
||||||
* lib/i386/relocator_backward.S: Likewise.
|
|
||||||
* lib/mips/relocator.c: Likewise.
|
|
||||||
* lib/mips/relocator_asm.S: Likewise.
|
|
||||||
* lib/relocator.c: Likewise.
|
|
||||||
* loader/i386/multiboot.c: Include grub/i386/relocator.h.
|
|
||||||
(entry): Removed.
|
|
||||||
(playground): Likewise.
|
|
||||||
(grub_multiboot_payload_orig): New variable.
|
|
||||||
(grub_multiboot_payload_dest): Likewise.
|
|
||||||
(grub_multiboot_payload_size): Likewise.
|
|
||||||
(grub_multiboot_payload_eip): Likewise.
|
|
||||||
(grub_multiboot_payload_esp): Likewise.
|
|
||||||
(grub_multiboot_boot): Use grub_relocator32_boot.
|
|
||||||
(grub_multiboot_unload): Free relocators.
|
|
||||||
(grub_multiboot): Setup stack. Use relocators.
|
|
||||||
* loader/i386/multiboot_elfxx.c: Include grub/i386/relocator.h.
|
|
||||||
(grub_multiboot_load_elfXX): Use relocators.
|
|
||||||
* loader/i386/multiboot_helper.S (grub_multiboot_payload_orig): Removed.
|
|
||||||
(grub_multiboot_payload_size): Likewise.
|
|
||||||
(grub_multiboot_payload_dest): Likewise.
|
|
||||||
(grub_multiboot_payload_entry_offset): Likewise.
|
|
||||||
(grub_multiboot_forward_relocator): Likewise.
|
|
||||||
(grub_multiboot_backward_relocator): Likewise.
|
|
||||||
(grub_multiboot_real_boot): Likewise.
|
|
||||||
* loader/i386/xnu.c (grub_xnu_heap_will_be_at): New variable.
|
|
||||||
(grub_xnu_entry_point): Likewise.
|
|
||||||
(grub_xnu_arg1): Likewise.
|
|
||||||
(grub_xnu_stack): Likewise.
|
|
||||||
(grub_xnu_launch): Removed.
|
|
||||||
(grub_xnu_boot_resume): New function.
|
|
||||||
(grub_xnu_boot): Use relocators.
|
|
||||||
* loader/i386/xnu_helper.S: Removed.
|
|
||||||
* loader/xnu.c (grub_xnu_heap_start): New variable.
|
|
||||||
(grub_xnu_heap_size): Likewise.
|
|
||||||
(grub_xnu_heap_malloc): Use relocators.
|
|
||||||
* loader/xnu_resume.c (grub_xnu_resume): Use relocators.
|
|
|
@ -169,7 +169,7 @@ endif
|
||||||
### General targets.
|
### General targets.
|
||||||
|
|
||||||
CLEANFILES += $(pkglib_DATA) $(pkgdata_DATA) po/*.mo
|
CLEANFILES += $(pkglib_DATA) $(pkgdata_DATA) po/*.mo
|
||||||
pkglib_DATA += moddep.lst command.lst fs.lst partmap.lst parttool.lst handler.lst
|
pkglib_DATA += moddep.lst command.lst fs.lst partmap.lst parttool.lst handler.lst video.lst
|
||||||
moddep.lst: $(DEFSYMFILES) $(UNDSYMFILES) genmoddep.awk
|
moddep.lst: $(DEFSYMFILES) $(UNDSYMFILES) genmoddep.awk
|
||||||
cat $(DEFSYMFILES) /dev/null \
|
cat $(DEFSYMFILES) /dev/null \
|
||||||
| $(AWK) -f $(srcdir)/genmoddep.awk $(UNDSYMFILES) > $@ \
|
| $(AWK) -f $(srcdir)/genmoddep.awk $(UNDSYMFILES) > $@ \
|
||||||
|
@ -190,6 +190,9 @@ handler.lst: $(HANDLERFILES)
|
||||||
parttool.lst: $(PARTTOOLFILES)
|
parttool.lst: $(PARTTOOLFILES)
|
||||||
cat $^ /dev/null | sort | uniq > $@
|
cat $^ /dev/null | sort | uniq > $@
|
||||||
|
|
||||||
|
video.lst: $(VIDEOFILES)
|
||||||
|
cat $^ /dev/null | sort | uniq > $@
|
||||||
|
|
||||||
ifneq (true, $(MAKEINFO))
|
ifneq (true, $(MAKEINFO))
|
||||||
info_INFOS += docs/grub.info
|
info_INFOS += docs/grub.info
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -19,6 +19,7 @@ EXTRA_DISTFILES="AUTHORS COPYING ChangeLog DISTLIST INSTALL NEWS README \
|
||||||
gendistlist.sh genfslist.sh genhandlerlist.sh geninit.sh \
|
gendistlist.sh genfslist.sh genhandlerlist.sh geninit.sh \
|
||||||
geninitheader.sh genkernsyms.sh.in genmk.rb genmoddep.awk \
|
geninitheader.sh genkernsyms.sh.in genmk.rb genmoddep.awk \
|
||||||
genmodsrc.sh genpartmaplist.sh genparttoollist.sh \
|
genmodsrc.sh genpartmaplist.sh genparttoollist.sh \
|
||||||
|
genvideolist.sh \
|
||||||
gensymlist.sh.in install-sh mkinstalldirs stamp-h.in"
|
gensymlist.sh.in install-sh mkinstalldirs stamp-h.in"
|
||||||
|
|
||||||
DISTDIRS="boot bus commands conf disk docs efiemu font fs hello hook include io \
|
DISTDIRS="boot bus commands conf disk docs efiemu font fs hello hook include io \
|
||||||
|
|
9
genmk.rb
9
genmk.rb
|
@ -193,6 +193,7 @@ endif
|
||||||
partmap = 'partmap-' + obj.suffix('lst')
|
partmap = 'partmap-' + obj.suffix('lst')
|
||||||
handler = 'handler-' + obj.suffix('lst')
|
handler = 'handler-' + obj.suffix('lst')
|
||||||
parttool = 'parttool-' + obj.suffix('lst')
|
parttool = 'parttool-' + obj.suffix('lst')
|
||||||
|
video = 'video-' + obj.suffix('lst')
|
||||||
dep = deps[i]
|
dep = deps[i]
|
||||||
flag = if /\.c$/ =~ src then 'CFLAGS' else 'ASFLAGS' end
|
flag = if /\.c$/ =~ src then 'CFLAGS' else 'ASFLAGS' end
|
||||||
extra_flags = if /\.S$/ =~ src then '-DASM_FILE=1' else '' end
|
extra_flags = if /\.S$/ =~ src then '-DASM_FILE=1' else '' end
|
||||||
|
@ -203,7 +204,7 @@ endif
|
||||||
-include #{dep}
|
-include #{dep}
|
||||||
|
|
||||||
clean-module-#{extra_target}.#{@rule_count}:
|
clean-module-#{extra_target}.#{@rule_count}:
|
||||||
rm -f #{command} #{fs} #{partmap} #{handler} #{parttool}
|
rm -f #{command} #{fs} #{partmap} #{handler} #{parttool} #{video}
|
||||||
|
|
||||||
CLEAN_MODULE_TARGETS += clean-module-#{extra_target}.#{@rule_count}
|
CLEAN_MODULE_TARGETS += clean-module-#{extra_target}.#{@rule_count}
|
||||||
|
|
||||||
|
@ -212,6 +213,7 @@ FSFILES += #{fs}
|
||||||
PARTTOOLFILES += #{parttool}
|
PARTTOOLFILES += #{parttool}
|
||||||
PARTMAPFILES += #{partmap}
|
PARTMAPFILES += #{partmap}
|
||||||
HANDLERFILES += #{handler}
|
HANDLERFILES += #{handler}
|
||||||
|
VIDEOFILES += #{video}
|
||||||
|
|
||||||
#{command}: #{src} $(#{src}_DEPENDENCIES) gencmdlist.sh
|
#{command}: #{src} $(#{src}_DEPENDENCIES) gencmdlist.sh
|
||||||
set -e; \
|
set -e; \
|
||||||
|
@ -238,6 +240,11 @@ HANDLERFILES += #{handler}
|
||||||
$(TARGET_CC) -I#{dir} -I$(srcdir)/#{dir} $(TARGET_CPPFLAGS) #{extra_flags} $(TARGET_#{flag}) $(#{prefix}_#{flag}) -E $< \
|
$(TARGET_CC) -I#{dir} -I$(srcdir)/#{dir} $(TARGET_CPPFLAGS) #{extra_flags} $(TARGET_#{flag}) $(#{prefix}_#{flag}) -E $< \
|
||||||
| sh $(srcdir)/genhandlerlist.sh #{symbolic_name} > $@ || (rm -f $@; exit 1)
|
| sh $(srcdir)/genhandlerlist.sh #{symbolic_name} > $@ || (rm -f $@; exit 1)
|
||||||
|
|
||||||
|
#{video}: #{src} $(#{src}_DEPENDENCIES) genvideolist.sh
|
||||||
|
set -e; \
|
||||||
|
$(TARGET_CC) -I#{dir} -I$(srcdir)/#{dir} $(TARGET_CPPFLAGS) #{extra_flags} $(TARGET_#{flag}) $(#{prefix}_#{flag}) -E $< \
|
||||||
|
| sh $(srcdir)/genvideolist.sh #{symbolic_name} > $@ || (rm -f $@; exit 1)
|
||||||
|
|
||||||
"
|
"
|
||||||
end.join('')
|
end.join('')
|
||||||
end
|
end
|
||||||
|
|
26
genvideolist.sh
Normal file
26
genvideolist.sh
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
#! /bin/sh
|
||||||
|
#
|
||||||
|
# Copyright (C) 2005,2008,2009 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This script is free software; the author
|
||||||
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
# with or without modifications, as long as this notice is preserved.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||||
|
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
# PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
# Read source code from stdin and detect partmap names.
|
||||||
|
|
||||||
|
module=$1
|
||||||
|
|
||||||
|
# Ignore video.mod.
|
||||||
|
if test $module = video; then
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
# For now, this emits only a module name, if the module registers a partition map.
|
||||||
|
if grep -v "^#" | grep '^ *grub_video_register' >/dev/null 2>&1; then
|
||||||
|
echo $module
|
||||||
|
fi
|
|
@ -1,7 +1,7 @@
|
||||||
/* memory.h - describe the memory map */
|
/* memory.h - describe the memory map */
|
||||||
/*
|
/*
|
||||||
* GRUB -- GRand Unified Bootloader
|
* GRUB -- GRand Unified Bootloader
|
||||||
* Copyright (C) 2002,2007,2008 Free Software Foundation, Inc.
|
* Copyright (C) 2002,2007,2008,2009 Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* GRUB is free software: you can redistribute it and/or modify
|
* GRUB is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -32,6 +32,4 @@ extern char *grub_multiboot_payload_orig;
|
||||||
extern grub_addr_t grub_multiboot_payload_dest;
|
extern grub_addr_t grub_multiboot_payload_dest;
|
||||||
extern grub_size_t grub_multiboot_payload_size;
|
extern grub_size_t grub_multiboot_payload_size;
|
||||||
|
|
||||||
#define GRUB_MULTIBOOT_STACK_SIZE 4096
|
|
||||||
|
|
||||||
#endif /* ! GRUB_MULTIBOOT_CPU_HEADER */
|
#endif /* ! GRUB_MULTIBOOT_CPU_HEADER */
|
||||||
|
|
|
@ -146,6 +146,9 @@ multiboot_entry:
|
||||||
/* obtain the boot device */
|
/* obtain the boot device */
|
||||||
movl 12(%ebx), %edx
|
movl 12(%ebx), %edx
|
||||||
|
|
||||||
|
movl $GRUB_MEMORY_MACHINE_PROT_STACK, %ebp
|
||||||
|
movl %ebp, %esp
|
||||||
|
|
||||||
/* relocate the code */
|
/* relocate the code */
|
||||||
movl $(GRUB_KERNEL_MACHINE_RAW_SIZE + 0x200), %ecx
|
movl $(GRUB_KERNEL_MACHINE_RAW_SIZE + 0x200), %ecx
|
||||||
addl EXT_C(grub_compressed_size) - _start + 0x100000 + 0x200, %ecx
|
addl EXT_C(grub_compressed_size) - _start + 0x100000 + 0x200, %ecx
|
||||||
|
|
|
@ -138,7 +138,7 @@ LOCAL(cont0):
|
||||||
|
|
||||||
lgdt (LOCAL(gdtdesc) - LOCAL(base)) (RSI, 1)
|
lgdt (LOCAL(gdtdesc) - LOCAL(base)) (RSI, 1)
|
||||||
|
|
||||||
/* Update %cs. Thanks to David Miller for pointing this mistake out. */
|
/* Update %cs. */
|
||||||
ljmp *(LOCAL(jump_vector) - LOCAL(base)) (RSI, 1)
|
ljmp *(LOCAL(jump_vector) - LOCAL(base)) (RSI, 1)
|
||||||
|
|
||||||
LOCAL(cont1):
|
LOCAL(cont1):
|
||||||
|
|
|
@ -78,10 +78,10 @@ PREFIX (boot) (void *relocator, grub_uint32_t dest,
|
||||||
|
|
||||||
/* Very unlikely condition: Relocator may risk overwrite itself.
|
/* Very unlikely condition: Relocator may risk overwrite itself.
|
||||||
Just move it a bit up. */
|
Just move it a bit up. */
|
||||||
if ((grub_uint8_t *) UINT_TO_PTR (dest) - (grub_uint8_t *) relocator
|
if ((grub_addr_t) dest < (grub_addr_t) relocator
|
||||||
< (signed) (RELOCATOR_SIZEOF (backward) + RELOCATOR_ALIGN)
|
+ (RELOCATOR_SIZEOF (backward) + RELOCATOR_ALIGN)
|
||||||
&& (grub_uint8_t *) UINT_TO_PTR (dest) - (grub_uint8_t *) relocator
|
&& (grub_addr_t) dest + (RELOCATOR_SIZEOF (forward) + RELOCATOR_ALIGN)
|
||||||
> - (signed) (RELOCATOR_SIZEOF (forward) + RELOCATOR_ALIGN))
|
> (grub_addr_t) relocator)
|
||||||
{
|
{
|
||||||
void *relocator_new = ((grub_uint8_t *) relocator)
|
void *relocator_new = ((grub_uint8_t *) relocator)
|
||||||
+ (RELOCATOR_SIZEOF (forward) + RELOCATOR_ALIGN)
|
+ (RELOCATOR_SIZEOF (forward) + RELOCATOR_ALIGN)
|
||||||
|
@ -95,7 +95,7 @@ PREFIX (boot) (void *relocator, grub_uint32_t dest,
|
||||||
relocator = relocator_new;
|
relocator = relocator_new;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (UINT_TO_PTR (dest) >= relocator)
|
if ((grub_addr_t) dest >= (grub_addr_t) relocator)
|
||||||
{
|
{
|
||||||
int overhead;
|
int overhead;
|
||||||
overhead = dest -
|
overhead = dest -
|
||||||
|
|
|
@ -59,7 +59,6 @@ char *grub_multiboot_payload_orig;
|
||||||
grub_addr_t grub_multiboot_payload_dest;
|
grub_addr_t grub_multiboot_payload_dest;
|
||||||
grub_size_t grub_multiboot_payload_size;
|
grub_size_t grub_multiboot_payload_size;
|
||||||
grub_uint32_t grub_multiboot_payload_eip;
|
grub_uint32_t grub_multiboot_payload_eip;
|
||||||
grub_uint32_t grub_multiboot_payload_esp;
|
|
||||||
|
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
grub_multiboot_boot (void)
|
grub_multiboot_boot (void)
|
||||||
|
@ -71,7 +70,9 @@ grub_multiboot_boot (void)
|
||||||
.ecx = 0,
|
.ecx = 0,
|
||||||
.edx = 0,
|
.edx = 0,
|
||||||
.eip = grub_multiboot_payload_eip,
|
.eip = grub_multiboot_payload_eip,
|
||||||
.esp = grub_multiboot_payload_esp
|
/* Set esp to some random location in low memory to avoid breaking
|
||||||
|
non-compliant kernels. */
|
||||||
|
.esp = 0x7ff00
|
||||||
};
|
};
|
||||||
|
|
||||||
grub_relocator32_boot (grub_multiboot_payload_orig,
|
grub_relocator32_boot (grub_multiboot_payload_orig,
|
||||||
|
@ -290,13 +291,11 @@ grub_multiboot (int argc, char *argv[])
|
||||||
((void *) ((x) + code_size + cmdline_length))
|
((void *) ((x) + code_size + cmdline_length))
|
||||||
#define mbi_addr(x) ((void *) ((x) + code_size + cmdline_length + boot_loader_name_length))
|
#define mbi_addr(x) ((void *) ((x) + code_size + cmdline_length + boot_loader_name_length))
|
||||||
#define mmap_addr(x) ((void *) ((x) + code_size + cmdline_length + boot_loader_name_length + sizeof (struct multiboot_info)))
|
#define mmap_addr(x) ((void *) ((x) + code_size + cmdline_length + boot_loader_name_length + sizeof (struct multiboot_info)))
|
||||||
#define stack_addr(x) ((void *) ((x) + code_size + cmdline_length + boot_loader_name_length + sizeof (struct multiboot_info) + mmap_length + GRUB_MULTIBOOT_STACK_SIZE))
|
|
||||||
|
|
||||||
grub_multiboot_payload_size = cmdline_length
|
grub_multiboot_payload_size = cmdline_length
|
||||||
/* boot_loader_name_length might need to grow for mbi,etc to be aligned (see below) */
|
/* boot_loader_name_length might need to grow for mbi,etc to be aligned (see below) */
|
||||||
+ boot_loader_name_length + 3
|
+ boot_loader_name_length + 3
|
||||||
+ sizeof (struct multiboot_info) + mmap_length
|
+ sizeof (struct multiboot_info) + mmap_length;
|
||||||
+ GRUB_MULTIBOOT_STACK_SIZE;
|
|
||||||
|
|
||||||
if (header->flags & MULTIBOOT_AOUT_KLUDGE)
|
if (header->flags & MULTIBOOT_AOUT_KLUDGE)
|
||||||
{
|
{
|
||||||
|
@ -319,7 +318,7 @@ grub_multiboot (int argc, char *argv[])
|
||||||
if (! grub_multiboot_payload_orig)
|
if (! grub_multiboot_payload_orig)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
if ((grub_file_seek (file, offset)) == (grub_off_t) - 1)
|
if ((grub_file_seek (file, offset)) == (grub_off_t) -1)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
grub_file_read (file, (void *) grub_multiboot_payload_orig, load_size);
|
grub_file_read (file, (void *) grub_multiboot_payload_orig, load_size);
|
||||||
|
@ -382,8 +381,6 @@ grub_multiboot (int argc, char *argv[])
|
||||||
if (grub_multiboot_get_bootdev (&mbi->boot_device))
|
if (grub_multiboot_get_bootdev (&mbi->boot_device))
|
||||||
mbi->flags |= MULTIBOOT_INFO_BOOTDEV;
|
mbi->flags |= MULTIBOOT_INFO_BOOTDEV;
|
||||||
|
|
||||||
grub_multiboot_payload_esp = PTR_TO_UINT32 (stack_addr (grub_multiboot_payload_dest));
|
|
||||||
|
|
||||||
grub_loader_set (grub_multiboot_boot, grub_multiboot_unload, 1);
|
grub_loader_set (grub_multiboot_boot, grub_multiboot_unload, 1);
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
|
|
|
@ -138,7 +138,8 @@ CONCAT(grub_multiboot_load_elf, XX) (grub_file_t file, void *buffer)
|
||||||
if (phdr(i)->p_vaddr <= ehdr->e_entry
|
if (phdr(i)->p_vaddr <= ehdr->e_entry
|
||||||
&& phdr(i)->p_vaddr + phdr(i)->p_memsz > ehdr->e_entry)
|
&& phdr(i)->p_vaddr + phdr(i)->p_memsz > ehdr->e_entry)
|
||||||
{
|
{
|
||||||
grub_multiboot_payload_eip = ehdr->e_entry;
|
grub_multiboot_payload_eip = grub_multiboot_payload_dest
|
||||||
|
+ (ehdr->e_entry - phdr(i)->p_vaddr) + (phdr(i)->p_paddr - phdr(lowest_segment)->p_paddr);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -110,7 +110,7 @@ grub_linux_load32 (grub_elf_t elf)
|
||||||
if (entry == 0)
|
if (entry == 0)
|
||||||
entry = 0x01400000;
|
entry = 0x01400000;
|
||||||
|
|
||||||
linux_size = grub_elf32_size (elf, 0);
|
linux_size = grub_elf32_size (elf);
|
||||||
if (linux_size == 0)
|
if (linux_size == 0)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
/* Pad it; the kernel scribbles over memory beyond its load address. */
|
/* Pad it; the kernel scribbles over memory beyond its load address. */
|
||||||
|
@ -160,7 +160,7 @@ grub_linux_load64 (grub_elf_t elf)
|
||||||
if (entry == 0)
|
if (entry == 0)
|
||||||
entry = 0x01400000;
|
entry = 0x01400000;
|
||||||
|
|
||||||
linux_size = grub_elf64_size (elf, 0);
|
linux_size = grub_elf64_size (elf);
|
||||||
if (linux_size == 0)
|
if (linux_size == 0)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
/* Pad it; the kernel scribbles over memory beyond its load address. */
|
/* Pad it; the kernel scribbles over memory beyond its load address. */
|
||||||
|
|
|
@ -94,16 +94,28 @@ grub_xnu_resume (char *imagename)
|
||||||
/* Try to allocate necessary space.
|
/* Try to allocate necessary space.
|
||||||
FIXME: mm isn't good enough yet to handle huge allocations.
|
FIXME: mm isn't good enough yet to handle huge allocations.
|
||||||
*/
|
*/
|
||||||
grub_xnu_hibernate_image = buf = XNU_RELOCATOR (alloc) (hibhead.image_size);
|
grub_xnu_hibernate_image = buf = XNU_RELOCATOR (alloc) (hibhead.image_size
|
||||||
|
+ codesize
|
||||||
|
+ GRUB_XNU_PAGESIZE);
|
||||||
if (! buf)
|
if (! buf)
|
||||||
{
|
{
|
||||||
grub_file_close (file);
|
grub_file_close (file);
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Read code part. */
|
||||||
|
if (grub_file_seek (file, total_header_size) == (grub_off_t) -1
|
||||||
|
|| grub_file_read (file, buf, codesize)
|
||||||
|
!= (grub_ssize_t) codesize)
|
||||||
|
{
|
||||||
|
grub_file_close (file);
|
||||||
|
return grub_error (GRUB_ERR_READ_ERROR, "Cannot read resume image.");
|
||||||
|
}
|
||||||
|
|
||||||
/* Read image. */
|
/* Read image. */
|
||||||
if (grub_file_seek (file, 0) == (grub_off_t)-1
|
if (grub_file_seek (file, 0) == (grub_off_t) -1
|
||||||
|| grub_file_read (file, buf, hibhead.image_size)
|
|| grub_file_read (file, buf + codesize + GRUB_XNU_PAGESIZE,
|
||||||
|
hibhead.image_size)
|
||||||
!= (grub_ssize_t) hibhead.image_size)
|
!= (grub_ssize_t) hibhead.image_size)
|
||||||
{
|
{
|
||||||
grub_file_close (file);
|
grub_file_close (file);
|
||||||
|
@ -114,10 +126,14 @@ grub_xnu_resume (char *imagename)
|
||||||
/* Setup variables needed by asm helper. */
|
/* Setup variables needed by asm helper. */
|
||||||
grub_xnu_heap_will_be_at = codedest;
|
grub_xnu_heap_will_be_at = codedest;
|
||||||
grub_xnu_heap_start = buf;
|
grub_xnu_heap_start = buf;
|
||||||
grub_xnu_heap_size = codesize;
|
grub_xnu_heap_size = codesize + GRUB_XNU_PAGESIZE + hibhead.image_size;
|
||||||
grub_xnu_stack = (codedest + hibhead.stack);
|
grub_xnu_stack = (codedest + hibhead.stack);
|
||||||
grub_xnu_entry_point = (codedest + hibhead.entry_point);
|
grub_xnu_entry_point = (codedest + hibhead.entry_point);
|
||||||
grub_xnu_arg1 = (long) buf;
|
grub_xnu_arg1 = codedest + codesize + GRUB_XNU_PAGESIZE;
|
||||||
|
|
||||||
|
grub_dprintf ("xnu", "entry point 0x%x\n", codedest + hibhead.entry_point);
|
||||||
|
grub_dprintf ("xnu", "image at 0x%x\n",
|
||||||
|
codedest + codesize + GRUB_XNU_PAGESIZE);
|
||||||
|
|
||||||
/* We're ready now. */
|
/* We're ready now. */
|
||||||
grub_loader_set (grub_xnu_boot_resume,
|
grub_loader_set (grub_xnu_boot_resume,
|
||||||
|
|
|
@ -113,13 +113,13 @@ grub_script_execute_cmdline (struct grub_script_cmd *cmd)
|
||||||
|
|
||||||
if (eq)
|
if (eq)
|
||||||
{
|
{
|
||||||
|
/* This was set because the command was not found. */
|
||||||
|
grub_errno = GRUB_ERR_NONE;
|
||||||
|
|
||||||
/* Create two strings and set the variable. */
|
/* Create two strings and set the variable. */
|
||||||
*eq = '\0';
|
*eq = '\0';
|
||||||
eq++;
|
eq++;
|
||||||
grub_env_set (assign, eq);
|
grub_env_set (assign, eq);
|
||||||
|
|
||||||
/* This was set because the command was not found. */
|
|
||||||
grub_errno = GRUB_ERR_NONE;
|
|
||||||
}
|
}
|
||||||
grub_free (assign);
|
grub_free (assign);
|
||||||
|
|
||||||
|
|
|
@ -144,13 +144,9 @@ case x${GRUB_TERMINAL_OUTPUT} in
|
||||||
x | xgfxterm)
|
x | xgfxterm)
|
||||||
# If this platform supports gfxterm, try to use it.
|
# If this platform supports gfxterm, try to use it.
|
||||||
if test -e ${grub_prefix}/gfxterm.mod ; then
|
if test -e ${grub_prefix}/gfxterm.mod ; then
|
||||||
GRUB_VIDEO_BACKEND=
|
# FIXME: this should do something smarter than just loading first
|
||||||
for i in vbe ; do
|
# video backend.
|
||||||
if test -e ${grub_prefix}/$i.mod ; then
|
GRUB_VIDEO_BACKEND=$(head -n 1 ${grub_prefix}/video.lst || true)
|
||||||
GRUB_VIDEO_BACKEND=$i
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
if [ -n "${GRUB_VIDEO_BACKEND}" ] ; then
|
if [ -n "${GRUB_VIDEO_BACKEND}" ] ; then
|
||||||
GRUB_TERMINAL_OUTPUT=gfxterm
|
GRUB_TERMINAL_OUTPUT=gfxterm
|
||||||
elif [ "${GRUB_TERMINAL_OUTPUT}" = "gfxterm" ] ; then
|
elif [ "${GRUB_TERMINAL_OUTPUT}" = "gfxterm" ] ; then
|
||||||
|
|
|
@ -120,7 +120,7 @@ menuentry "${LONGNAME} (on ${DEVICE})" {
|
||||||
EOF
|
EOF
|
||||||
prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/"
|
prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/"
|
||||||
cat << EOF
|
cat << EOF
|
||||||
insmod vbe
|
insmod ${GRUB_VIDEO_BACKEND}
|
||||||
do_resume=0
|
do_resume=0
|
||||||
if [ /var/vm/sleepimage -nt10 / ]; then
|
if [ /var/vm/sleepimage -nt10 / ]; then
|
||||||
if xnu_resume /var/vm/sleepimage; then
|
if xnu_resume /var/vm/sleepimage; then
|
||||||
|
|
Loading…
Add table
Reference in a new issue