pull-in emu-lite branch

This commit is contained in:
BVK Chaitanya 2010-05-26 17:49:05 +05:30
commit 692d7c2855
120 changed files with 3842 additions and 13152 deletions

399
ChangeLog
View file

@ -1,3 +1,402 @@
2010-05-25 BVK Chaitanya <bvk.groups@gmail.com>
* INSTALL: Added flex >= 2.5.35 requirement.
2010-05-23 Vladimir Serbinenko <phcoder@gmail.com>
* commands/usbtest.c (grub_usb_get_string): Properly support UTF-16.
2010-05-23 Vladimir Serbinenko <phcoder@gmail.com>
cmostest support.
* commands/i386/cmostest.c: New file.
* conf/i386-coreboot.rmk (pkglib_MODULES): Add cmostest.mod.
(cmostest_mod_SOURCES): New variable.
(cmostest_mod_CFLAGS): Likewise.
(cmostest_mod_LDFLAGS): Likewise.
* conf/i386-pc.rmk: Likewise.
* docs/grub.texi (Vendor power-on keys): New section.
* util/grub-mkconfig.in: export GRUB_DEFAULT_BUTTON,
GRUB_HIDDEN_TIMEOUT_BUTTON, GRUB_TIMEOUT_BUTTON
and GRUB_BUTTON_CMOS_ADDRESS.
* util/grub.d/00_header.in: Handle powering-on by separate button.
2010-05-23 Vladimir Serbinenko <phcoder@gmail.com>
* gfxmenu/gui_list.c (draw_menu): Don't add scrollbar width to padding.
Removed drawing_scrollbar argument. All users updated
Fixes #29792.
Reported by Jo Shields
2010-05-23 Vladimir Serbinenko <phcoder@gmail.com>
* gfxmenu/view.c (grub_gfxmenu_draw_terminal_box): Apply only to current
buffer since gfxterm handles double repaint.
2010-05-23 Vladimir Serbinenko <phcoder@gmail.com>
* gfxmenu/gfxmenu.c (grub_gfxmenu_try): Change viewport on both buffers.
* term/gfxterm.c (real_scroll): Likewise.
2010-05-21 Vladimir Serbinenko <phcoder@gmail.com>
* kern/i386/pc/mmap.c (grub_machine_mmap_iterate): Zero-fill entry
before calling BIOS.
2010-05-21 Vladimir Serbinenko <phcoder@gmail.com>
* include/grub/i18n.h: Always enable grub_gettext.
2010-05-21 Vladimir Serbinenko <phcoder@gmail.com>
* kern/i386/pc/init.c (make_install_device): Fix a leftover usage of old
partition naming style.
2010-05-21 Colin Watson <cjwatson@ubuntu.com>
* util/grub-mkconfig.in: Fix handling of -o so that it works when
not the first option.
2010-05-20 Colin Watson <cjwatson@ubuntu.com>
* util/grub-mkrelpath.c (usage): Remove excess apostrophe.
2010-05-20 Colin Watson <cjwatson@ubuntu.com>
* util/misc.c: Move inclusion of <limits.h> to ...
* kern/emu/misc.c: ... here. Needed for canonicalize_file_name.
2010-05-20 Grégoire Sutre <gregoire.sutre@gmail.com>
* kern/emu/hostdisk.c (grub_util_biosdisk_get_grub_dev) [__NetBSD__]:
Fix merge error in NetBSD code.
(find_partition_start) [__NetBSD__]: Likewise.
2010-05-19 BVK Chaitanya <bvk.groups@gmail.com>
Fix grub-mkrescue usage unit testing.
* tests/util/grub-shell.in: Use --grub-mkimage with grub-mkrescue.
2010-05-18 Christian Franke <franke@computer.org>
* util/grub.d/10_windows.in: Use path names instead of
drive letters to prevent warning from Cygwin 1.7.
Add drivemap command to menuentry if needed.
2010-05-18 Justus Winter <4winter@informatik.uni-hamburg.de>
* util/grub.d/10_hurd.in: Include all gnumach* kernels, not only
gnumach and gnumach.gz.
2010-05-18 Vladimir Serbinenko <phcoder@gmail.com>
* include/grub/i18n.h (gettext): Inline instead of using #define.
(grub_gettext): Likewise.
(_): Likewise.
2010-05-18 Vladimir Serbinenko <phcoder@gmail.com>
* Makefile.in (CPPFLAGS): Replace -DGRUB_LIBDIR with
-DGRUB_PKGLIBROOTDIR= and prepend @PACKAGE_TARNAME@. All users updated.
* util/grub-mkimage.c (image_targets): Add i386-multiboot.
(main): Add a slash after pkglibdirroot.
2010-05-18 Vladimir Serbinenko <phcoder@gmail.com>
* util/grub-install.in: Add missing "in" keyword.
2010-05-18 Vladimir Serbinenko <phcoder@gmail.com>
* util/grub-mkrescue.in: Remove -O i386-pc duplication.
Reported by: Seth Goldberg.
2010-05-18 Vladimir Serbinenko <phcoder@gmail.com>
* po/POTFILES: Rename util/grub-mkrawimage.c to util/grub-mkimage.c.
2010-05-18 Colin Watson <cjwatson@ubuntu.com>
* configure.ac: Check for Linux device-mapper support.
* util/hostdisk.c (device_is_mapped): New function.
(find_partition_start): New function, partly broken out from
linux_find_partition and grub_util_biosdisk_get_grub_dev but with
device-mapper support added.
(linux_find_partition): Use find_partition_start.
(convert_system_partition_to_system_disk): Add `st' argument.
Support Linux /dev/mapper/* devices if device-mapper support is
available; only DM-RAID devices are understood at present.
(find_system_device): Add `st' argument. Pass it to
convert_system_partition_to_system_disk.
(grub_util_biosdisk_get_grub_dev): Pass stat result to
find_system_device and convert_system_partition_to_system_disk. Use
find_partition_start.
* conf/common.rmk (grub_mkdevicemap_SOURCES): Add kern/env.c,
kern/err.c, kern/list.c, kern/misc.c, and kern/emu/mm.c.
* util/deviceiter.c [__linux__]: Define MINOR.
(grub_util_iterate_devices): Add support for DM-RAID disk devices.
* util/mkdevicemap.c (grub_putchar): New function.
(grub_getkey): New function.
(grub_refresh): New function.
(main): Set debug=all if -v -v is used.
2010-05-18 Colin Watson <cjwatson@ubuntu.com>
Fix build with non-GNU libcs.
* util/misc.c (canonicalize_file_name): Move to ...
* kern/emu/misc.c (canonicalize_file_name): ... here. Needed by
grub_make_system_path_relative_to_its_root.
2010-05-18 Colin Watson <cjwatson@ubuntu.com>
* util/grub-mkrescue.in: Sync up with grub-install in terms of how
we handle finding grub-mkimage. Default to finding grub-mkimage in
${bindir} with program_transform_name applied, and provide a
--grub-mkimage option to override this.
2010-05-17 Vladimir Serbinenko <phcoder@gmail.com>
Remove grub-mkisofs.
* conf/common.rmk (bin_UTILITIES): Remove grub-mkisofs.
(grub_mkisofs_SOURCES): Removed.
(grub_mkisofs_CFLAGS): Removed.
* util/mkisofs/defaults.h: Removed.
* util/mkisofs/eltorito.c: Likewise.
* util/mkisofs/exclude.h: Likewise.
* util/mkisofs/hash.c: Likewise.
* util/mkisofs/include/: Likewise.
* util/mkisofs/include/fctldefs.h: Likewise.
* util/mkisofs/include/mconfig.h: Likewise.
* util/mkisofs/include/prototyp.h: Likewise.
* util/mkisofs/include/statdefs.h: Likewise.
* util/mkisofs/iso9660.h: Likewise.
* util/mkisofs/joliet.c: Likewise.
* util/mkisofs/match.c: Likewise.
* util/mkisofs/match.h: Likewise.
* util/mkisofs/mkisofs.c: Likewise.
* util/mkisofs/mkisofs.h: Likewise.
* util/mkisofs/msdos_partition.h: Likewise.
* util/mkisofs/multi.c: Likewise.
* util/mkisofs/name.c: Likewise.
* util/mkisofs/rock.c: Likewise.
* util/mkisofs/tree.c: Likewise.
* util/mkisofs/write.c: Likewise.
2010-05-17 Vladimir Serbinenko <phcoder@gmail.com>
Unify grub-mkimage accross platforms.
* Makefile.in (CPPFLAGS): Set GRUB_LIBDIR to $(libdir).
* conf/common.rmk (bin_UTILITIES): Removed grub-mkelfimage.
(grub_mkelfimage_SOURCES): Removed.
(util/elf/grub-mkimage.c_DEPENDENCIES): Renamed to ..
(util/grub-mkimage.c_DEPENDENCIES): .. this.
(bin_UTILITIES): Add grub-mkimage.
(grub_mkimage_SOURCES): New variable.
(kernel_img_HEADERS): Remove machine/kernel.h.
* conf/i386-pc.rmk (pkglib_IMAGES): Remove kernel.img.
(pkglib_PROGRAMS): Add kernel.img.
(kernel_img_HEADERS): Add machine/kernel.h.
(kernel_img_FORMAT): Removed.
(bin_UTILITIES): Remove grub-mkimage.
(grub_mkimage_SOURCES): Removed.
(grub_mkimage_CFLAGS): Likewise.
(util/grub-mkrawimage.c_DEPENDENCIES): Likewise.
* conf/i386-qemu.rmk (pkglib_IMAGES): Remove kernel.img.
(pkglib_PROGRAMS): Add kernel.img.
(bin_UTILITIES): Remove grub-mkimage.
(grub_mkimage_SOURCES): Removed.
(grub_mkimage_CFLAGS): Likewise.
(util/grub-mkrawimage.c_DEPENDENCIES): Likewise.
* conf/mips-qemu-mips.rmk (pkglib_IMAGES): Remove kernel.img.
(pkglib_PROGRAMS): Add kernel.img.
* conf/mips-yeeloong.rmk (pkglib_IMAGES): Remove kernel.img.
(pkglib_PROGRAMS): Add kernel.img.
* conf/mips.rmk (bin_UTILITIES): Remove grub-mkimage.
(grub_mkimage_SOURCES): Removed.
(grub_mkimage_CFLAGS): Likewise.
(util/grub-mkrawimage.c_DEPENDENCIES): Likewise.
* conf/sparc64-ieee1275.rmk (pkglib_IMAGES): Remove kernel.img.
(pkglib_PROGRAMS): Add kernel.img.
(bin_UTILITIES): Remove grub-mkimage.
(grub_mkimage_SOURCES): Removed.
(grub_mkimage_CFLAGS): Likewise.
(util/grub-mkrawimage.c_DEPENDENCIES): Likewise.
* conf/x86-efi.rmk (bin_UTILITIES): Remove grub-mkimage.
(grub_mkimage_SOURCES): Removed.
(grub_mkimage_CFLAGS): Likewise.
(util/grub-mkrawimage.c_DEPENDENCIES): Likewise.
* configure.ac (machine_CFLAGS): Add "-DMACHINE".
* include/grub/efi/pe32.h (grub_pe32_optional_header): Split into ...
(grub_pe32_optional_header): ... this.
(grub_pe64_optional_header): ... and this. All users updated.
(GRUB_PE32_PE32_MAGIC): Split into ..
(GRUB_PE32_PE32_MAGIC): .. this.
(GRUB_PE32_PE64_MAGIC): .. and this.
(GRUB_PE32_SIGNATURE_SIZE): New definition.
* include/grub/elf.h (PT_GNU_STACK): New definition.
* include/grub/i386/coreboot/kernel.h: Merged into include/grub/offsets.h. All users updated.
* include/grub/i386/efi/kernel.h: Likewise.
* include/grub/i386/kernel.h: Likewise.
* include/grub/i386/pc/kernel.h: Likewise.
* include/grub/i386/qemu/boot.h: Likewise.
* include/grub/mips/kernel.h: Likewise.
* include/grub/mips/qemu-mips/kernel.h: Likewise.
* include/grub/powerpc/ieee1275/kernel.h: Likewise.
* include/grub/powerpc/kernel.h: Likewise.
* include/grub/sparc64/ieee1275/boot.h: Likewise.
* include/grub/sparc64/ieee1275/kernel.h: Likewise.
* include/grub/sparc64/kernel.h: Likewise.
* include/grub/x86_64/efi/kernel.h: Likewise.
* include/grub/x86_64/kernel.h: Likewise.
* include/grub/offsets.h: New file.
* include/grub/kernel.h (grub_module_info): Split into ...
(grub_module_info32): ... this.
(grub_module_info64): ... and this.
* include/grub/i386/pc/boot.h (GRUB_BOOT_MACHINE_KERNEL_SEG): Moved from here ...
* include/grub/offsets.h (GRUB_BOOT_I386_PC_KERNEL_SEG): ... here.
(grub_boot_blocklist): Moved from here ...
* include/grub/offsets.h (grub_pc_bios_boot_blocklist): ... here.
* include/grub/i386/pc/memory.h (GRUB_MEMORY_MACHINE_UPPER): Moved from here.
* include/grub/offsets.h (GRUB_MEMORY_I386_PC_UPPER): .. here.
* include/grub/types.h (grub_target_to_host16): Removed.
(grub_target_to_host32): Likewise.
(grub_target_to_host64): Likewise.
(grub_host_to_target16): Likewise.
(grub_host_to_target32): Likewise.
(grub_host_to_target64): Likewise.
(grub_host_to_target_addr): Likewise.
Support grub-mkrescue for efi, coreboot and qemu.
* conf/x86-efi.rmk (bin_SCRIPTS): Add grub-mkrescue.
* kern/efi/init.c (grub_efi_set_prefix): Handle baked in prefix.
* util/elf/grub-mkimage.c: Merged into util/grub-mkimage.c.
* util/grub-mkrawimage.c: Moved from here ...
* util/grub-mkimage.c: ... here. All users updated.
(ALIGN_ADDR): Use image_target.
(TARGET_NO_FIELD): New const.
(image_target_desc): New type.
(image_targets): New array.
(grub_target_to_host64): Use image_target.
(grub_target_to_host32): Likewise.
(grub_target_to_host16): Likewise.
(grub_host_to_target64): Likewise.
(grub_host_to_target32): Likewise.
(grub_host_to_target16): Likewise.
(grub_host_to_target_addr): Likewise.
(generate_image): Handle multiimage.
(main): Require -O parameter. All users updated.
* util/grub-mkimagexx.c: New file. Based on util/grub-mkrawimage.c and
util/efi/grub-mkimage.c
* util/grub-mkrescue.in: Handle coreboot, efi and qemu.
New option --rom-directory.
Use xorriso.
* util/i386/efi/grub-mkimage.c: Removed.
* util/i386/pc/grub-setup.c (grub_target_to_host16): New definition.
(grub_target_to_host32): Likewise.
(grub_target_to_host64): Likewise.
(grub_host_to_target16): Likewise.
(grub_host_to_target32): Likewise.
(grub_host_to_target64): Likewise.
* util/sparc64/ieee1275/grub-setup.c (grub_target_to_host16): New definition.
(grub_target_to_host32): Likewise.
(grub_target_to_host64): Likewise.
(grub_host_to_target16): Likewise.
(grub_host_to_target32): Likewise.
(grub_host_to_target64): Likewise.
2010-05-17 BVK Chaitanya <bvk.groups@gmail.com>
Source tree is reorganized for emu build.
* include/grub/util/console.h: Move from here...
* include/grub/emu/console.h: ...to here.
* include/grub/util/getroot.h: Move from here...
* include/grub/emu/getroot.h: ...to here.
* include/grub/util/hostdisk.h: Move from here...
* include/grub/emu/hostdisk.h: ...to here.
* util/console.c: Move from here...
* kern/emu/console.c: ...to here.
* util/getroot.c: Move from here...
* kern/emu/getroot.c: ...to here.
* util/grub-emu.c: Move from here...
* kern/emu/main.c: ...to here.
* util/hostdisk.c: Move from here...
* kern/emu/hostdisk.c: ...to here.
* util/hostfs.c: Move from here...
* kern/emu/hostfs.c: ...to here.
* util/mm.c: Move from here...
* kern/emu/mm.c: ...to here.
* util/pci.c: Move from here...
* bus/emu/pci.c: ...to here.
* util/sdl.c: Move from here...
* video/emu/sdl.c: ...to here.
* util/time.c: Move from here...
* kern/emu/time.c: ...to here.
* util/usb.c: Move from here...
* bus/usb/emu/usb.c: ...to here.
* include/grub/emu/misc.h: New header for grub-emu functions.
* kern/emu/misc.c: grub-emu functions separated from util/misc.c
* conf/any-emu.rmk: Rule updates for above renames.
* conf/common.rmk: Likewise.
* conf/i386-pc.rmk: Likewise.
* conf/i386-qemu.rmk: Likewise.
* conf/mips.rmk: Likewise.
* conf/sparc64-ieee1275.rmk: Likewise.
* conf/x86-efi.rmk: Likewise.
* disk/lvm.h: #include updates for above renames.
* util/grub-mkrelpath.c: Likewise.
* util/grub-probe.c: Likewise.
* util/i386/pc/grub-setup.c: Likewise.
* util/sparc64/ieee1275/grub-setup.c: Likewise.
* kern/emu/console.c: Likewise.
* kern/emu/getroot.c: Likewise.
* kern/emu/hostdisk.c: Likewise.
* kern/emu/main.c: Likewise. (was grub-emu.c earlier)
* include/grub/dl.h: Remove grub_dl_{ref,unref}.
* include/grub/util/misc.h: Move grub-emu functions to emu/misc.h.
* kern/dl.c: Handle null mod in grub_dl_{ref,unref}.
* util/misc.c: Remove grub-emu functions.
2010-05-13 Vladimir Serbinenko <phcoder@gmail.com>
Fix gfxmenu crash.
Reported by: Thorsten Grützmacher.
* gfxmenu/gui_circular_progress.c (circprog_destroy): Unregister
timeout hook.
(circprog_set_property): Register and unregister timeout hook.
* gfxmenu/gui_label.c (grub_gui_label): New fields template and value.
(label_destroy): Free template. and unregister hook.
(label_set_state): New function.
(label_set_property): Handle templates and hooks.
* gfxmenu/gui_progress_bar.c (progress_bar_destroy): Unregister
timeout hook.
(progress_bar_set_property): Register and unregister timeout hook.
* gfxmenu/view.c (TIMEOUT_COMPONENT_ID): Move from here ...
* include/grub/gui.h (GRUB_GFXMENU_TIMEOUT_COMPONENT_ID): ...to here
* gfxmenu/view.c (grub_gfxmenu_timeout_notifications): New variable.
(update_timeout_visit): Removed.
(update_timeouts): New function.
(redraw_timeouts): Likewise.
(grub_gfxmenu_print_timeout): Use update_timeouts and redraw_timeouts.
(grub_gfxmenu_clear_timeout): Likewise.
* include/grub/gui.h (grub_gfxmenu_set_state_t): New type.
(grub_gfxmenu_timeout_notify): Likewise.
(grub_gfxmenu_timeout_notifications): New external variable.
(grub_gfxmenu_timeout_register): New function.
(grub_gfxmenu_timeout_unregister): Likewise.
2010-05-09 Vladimir Serbinenko <phcoder@gmail.com> 2010-05-09 Vladimir Serbinenko <phcoder@gmail.com>
Transform (broken) vga terminal into (working) vga video driver. Transform (broken) vga terminal into (working) vga video driver.

View file

@ -16,6 +16,7 @@ configuring the GRUB.
* GNU Bison 2.3 or later * GNU Bison 2.3 or later
* GNU gettext 0.17 or later * GNU gettext 0.17 or later
* GNU binutils 2.9.1.0.23 or later * GNU binutils 2.9.1.0.23 or later
* Flex 2.5.35 or later
* Other standard GNU/Unix tools * Other standard GNU/Unix tools
If you use a development snapshot or want to hack on GRUB you may If you use a development snapshot or want to hack on GRUB you may

View file

@ -140,6 +140,7 @@ case "$target_cpu" in
sparc64) cpu_CPPFLAGS="$cpu_CPPFLAGS -DGRUB_CPU_SPARC64"; sparc64) cpu_CPPFLAGS="$cpu_CPPFLAGS -DGRUB_CPU_SPARC64";
machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_SPARC64=1" ;; machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_SPARC64=1" ;;
esac esac
machine_CPPFLAGS="$machine_CPPFLAGS -DMACHINE=`echo ${target_cpu}_$platform | sed y,abcdefghijklmnopqrstuvwxyz,ABCDEFGHIJKLMNOPQRSTUVWXYZ,`"
HOST_CPPFLAGS="$HOST_CPPFLAGS $cpu_CPPFLAGS $machine_CPPFLAGS" HOST_CPPFLAGS="$HOST_CPPFLAGS $cpu_CPPFLAGS $machine_CPPFLAGS"
TARGET_CPPFLAGS="$TARGET_CPPFLAGS $cpu_CPPFLAGS $machine_CPPFLAGS" TARGET_CPPFLAGS="$TARGET_CPPFLAGS $cpu_CPPFLAGS $machine_CPPFLAGS"

View file

@ -80,6 +80,7 @@ This edition documents version @value{VERSION}.
* Configuration:: Writing your own configuration file * Configuration:: Writing your own configuration file
* Network:: Downloading OS images from a network * Network:: Downloading OS images from a network
* Serial terminal:: Using GRUB via a serial line * Serial terminal:: Using GRUB via a serial line
* Vendor power-on keys:: Changing GRUB behaviour on vendor power-on keys
* Preset Menu:: Embedding a configuration file into GRUB * Preset Menu:: Embedding a configuration file into GRUB
* Images:: GRUB image files * Images:: GRUB image files
* Filesystem:: Filesystem syntax and semantics * Filesystem:: Filesystem syntax and semantics
@ -747,6 +748,23 @@ implements few VT100 escape sequences. If you specify this option then
GRUB provides you with an alternative menu interface, because the normal GRUB provides you with an alternative menu interface, because the normal
menu requires several fancy features of your terminal. menu requires several fancy features of your terminal.
@node Vendor power-on keys
@chapter Using GRUB with vendor power-on keys
Some laptop vendor provide an additional power-on button which boots another OS.
GRUB supports such buttons with GRUB_TIMEOUT_BUTTON, GRUB_DEFAULT_BUTTON,
GRUB_HIDDEN_TIMEOUT_BUTTON and GRUB_BUTTON_CMOS_ADDRESS variables in
default/grub. GRUB_TIMEOUT_BUTTON, GRUB_DEFAULT_BUTTON and
GRUB_HIDDEN_TIMEOUT_BUTTON are used instead of corresponding variables without
_BUTTON suffix when powered using special button.
GRUB_BUTTON_CMOS_ADDRESS is vendor specific and partially model-specific.
Values known to GRUB team are:
@table @key
@item Dell XPS M1530
85:3
@end table
To take full advantage of this function install GRUB into MBR.
@node Filesystem @node Filesystem
@chapter Filesystem syntax and semantics @chapter Filesystem syntax and semantics

View file

@ -123,7 +123,7 @@ def each_platform(closure):
def canonical_name(): return "[+ % name `echo -n %s | sed -e 's/[^0-9A-Za-z@_]/_/g'` +]" def canonical_name(): return "[+ % name `echo -n %s | sed -e 's/[^0-9A-Za-z@_]/_/g'` +]"
def canonical_module(): return canonical_name() + "_module" def canonical_module(): return canonical_name() + "_module"
def canonical_kernel(): return canonical_name() + "_exec" def canonical_kernel(): return canonical_name() + "_img"
def canonical_image(): return canonical_name() + "_image" def canonical_image(): return canonical_name() + "_image"
def shared_sources(prefix=""): return collect_values("shared", prefix) def shared_sources(prefix=""): return collect_values("shared", prefix)
@ -184,6 +184,7 @@ def module(platform):
r += gvar_add("CLEANFILES", "handler-[+ name +].lst terminal-[+ name +].lst") r += gvar_add("CLEANFILES", "handler-[+ name +].lst terminal-[+ name +].lst")
r += gvar_add("CLEANFILES", "video-[+ name +].lst partmap-[+ name +].lst parttool-[+ name +].lst") r += gvar_add("CLEANFILES", "video-[+ name +].lst partmap-[+ name +].lst parttool-[+ name +].lst")
r += gvar_add("CLEANFILES", "[+ name +].pp")
r += """ r += """
[+ name +].pp: $(""" + canonical_module() + """_SOURCES) $(nodist_""" + canonical_module() + """_SOURCES) [+ name +].pp: $(""" + canonical_module() + """_SOURCES) $(nodist_""" + canonical_module() + """_SOURCES)
$(TARGET_CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(""" + canonical_module() + """_CPPFLAGS) $(CPPFLAGS) $^ > $@ || (rm -f $@; exit 1) $(TARGET_CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(""" + canonical_module() + """_CPPFLAGS) $(CPPFLAGS) $^ > $@ || (rm -f $@; exit 1)
@ -263,7 +264,7 @@ fi
""")) """))
def kernel(platform): def kernel(platform):
r = gvar_add("noinst_PROGRAMS", "[+ name +].exec") r = gvar_add("noinst_PROGRAMS", "[+ name +].img")
r += var_set(canonical_kernel() + "_SOURCES", platform_sources(platform)) r += var_set(canonical_kernel() + "_SOURCES", platform_sources(platform))
r += var_add(canonical_kernel() + "_SOURCES", shared_sources()) r += var_add(canonical_kernel() + "_SOURCES", shared_sources())
r += var_set("nodist_" + canonical_kernel() + "_SOURCES", platform_nodist_sources(platform) + "## platform nodist sources") r += var_set("nodist_" + canonical_kernel() + "_SOURCES", platform_nodist_sources(platform) + "## platform nodist sources")
@ -278,10 +279,6 @@ def kernel(platform):
r += gvar_add("CLEANFILES", "$(nodist_" + canonical_kernel() + "_SOURCES)") r += gvar_add("CLEANFILES", "$(nodist_" + canonical_kernel() + "_SOURCES)")
r += gvar_add("platform_DATA", "[+ name +].img") r += gvar_add("platform_DATA", "[+ name +].img")
r += image_nostrip(platform)
r += image_strip(platform)
r += image_strip_keep_kernel(platform)
r += image_strip_macho2img(platform)
return r return r
def image(platform): def image(platform):

View file

@ -91,7 +91,6 @@ if COND_i386_ieee1275
KERNEL_HEADER_FILES += include/grub/loader.h KERNEL_HEADER_FILES += include/grub/loader.h
KERNEL_HEADER_FILES += include/grub/msdos_partition.h KERNEL_HEADER_FILES += include/grub/msdos_partition.h
KERNEL_HEADER_FILES += include/grub/ieee1275/ieee1275.h KERNEL_HEADER_FILES += include/grub/ieee1275/ieee1275.h
KERNEL_HEADER_FILES += include/grub/machine/kernel.h
KERNEL_HEADER_FILES += include/grub/machine/loader.h KERNEL_HEADER_FILES += include/grub/machine/loader.h
KERNEL_HEADER_FILES += include/grub/machine/memory.h KERNEL_HEADER_FILES += include/grub/machine/memory.h
endif endif
@ -129,7 +128,6 @@ KERNEL_HEADER_FILES += include/grub/boot.h
KERNEL_HEADER_FILES += include/grub/loader.h KERNEL_HEADER_FILES += include/grub/loader.h
KERNEL_HEADER_FILES += include/grub/msdos_partition.h KERNEL_HEADER_FILES += include/grub/msdos_partition.h
KERNEL_HEADER_FILES += include/grub/ieee1275/ieee1275.h KERNEL_HEADER_FILES += include/grub/ieee1275/ieee1275.h
KERNEL_HEADER_FILES += include/grub/machine/kernel.h
KERNEL_HEADER_FILES += include/grub/libgcc.h KERNEL_HEADER_FILES += include/grub/libgcc.h
endif endif

View file

@ -1,5 +1,9 @@
# -*- makefile -*- # -*- makefile -*-
pkglibroot = $(libdir)/$(shell echo $(PACKAGE) | sed "$(transform)")
grubconfdir = $(sysconfdir)/grub.d
platformdir = $(pkglibroot)/$(target_cpu)-$(platform)
# Platform specific options # Platform specific options
if COND_i386_pc if COND_i386_pc
CFLAGS_PLATFORM = -mrtd -mregparm=3 CFLAGS_PLATFORM = -mrtd -mregparm=3
@ -45,9 +49,6 @@ CPPFLAGS_POSIX = -I$(top_srcdir)/lib/posix_wrap
CPPFLAGS_EFIEMU = -I$(top_srcdir)/efiemu/runtime CPPFLAGS_EFIEMU = -I$(top_srcdir)/efiemu/runtime
grubconfdir = $(sysconfdir)/grub.d
platformdir = $(pkglibdir)/$(target_cpu)-$(platform)
# to calm down automake # to calm down automake
BUILT_SOURCES = BUILT_SOURCES =
CLEANFILES = CLEANFILES =

View file

@ -31,7 +31,7 @@ _start:
jmp 1f jmp 1f
. = _start + GRUB_BOOT_MACHINE_CORE_ENTRY_ADDR . = _start + GRUB_BOOT_I386_QEMU_CORE_ENTRY_ADDR
VARIABLE(grub_core_entry_addr) VARIABLE(grub_core_entry_addr)
.long 0 .long 0
1: 1:

View file

@ -19,6 +19,7 @@
#include <grub/boot.h> #include <grub/boot.h>
#include <grub/machine/boot.h> #include <grub/machine/boot.h>
#include <grub/offsets.h>
.text .text
.align 4 .align 4
@ -87,8 +88,8 @@ after_info_block:
call console_write call console_write
mov NOTIFICATION_STRING_LEN, %o3 mov NOTIFICATION_STRING_LEN, %o3
GET_ABS(firstlist - GRUB_BOOT_MACHINE_LIST_SIZE, %l2) GET_ABS(firstlist - GRUB_BOOT_SPARC64_IEEE1275_LIST_SIZE, %l2)
set GRUB_BOOT_MACHINE_IMAGE_ADDRESS, %l3 set GRUB_BOOT_SPARC64_IEEE1275_IMAGE_ADDRESS, %l3
bootloop: bootloop:
lduw [%l2 + 0x08], %o0 lduw [%l2 + 0x08], %o0
brz %o0, bootit brz %o0, bootit
@ -115,7 +116,7 @@ bootloop:
mov NOTIFICATION_STEP_LEN, %o3 mov NOTIFICATION_STEP_LEN, %o3
ba bootloop ba bootloop
sub %l2, GRUB_BOOT_MACHINE_LIST_SIZE, %l2 sub %l2, GRUB_BOOT_SPARC64_IEEE1275_LIST_SIZE, %l2
bootit: bootit:
GET_ABS(prom_close_name, %o0) GET_ABS(prom_close_name, %o0)
@ -127,8 +128,8 @@ bootit:
GET_ABS(notification_done, %o2) GET_ABS(notification_done, %o2)
call console_write call console_write
mov NOTIFICATION_DONE_LEN, %o3 mov NOTIFICATION_DONE_LEN, %o3
sethi %hi(GRUB_BOOT_MACHINE_IMAGE_ADDRESS), %o2 sethi %hi(GRUB_BOOT_SPARC64_IEEE1275_IMAGE_ADDRESS), %o2
jmpl %o2 + %lo(GRUB_BOOT_MACHINE_IMAGE_ADDRESS), %o7 jmpl %o2 + %lo(GRUB_BOOT_SPARC64_IEEE1275_IMAGE_ADDRESS), %o7
mov CIF_REG, %o4 mov CIF_REG, %o4
1: ba,a 1b 1: ba,a 1b
@ -136,7 +137,7 @@ lastlist:
.word 0 .word 0
.word 0 .word 0
. = _start + (0x200 - GRUB_BOOT_MACHINE_LIST_SIZE) . = _start + (0x200 - GRUB_BOOT_SPARC64_IEEE1275_LIST_SIZE)
blocklist_default_start: blocklist_default_start:
.word 0 .word 0
.word 2 .word 2

View file

@ -0,0 +1,59 @@
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2009 Free Software Foundation, Inc.
*
* GRUB 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 3 of the License, or
* (at your option) any later version.
*
* GRUB 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 GRUB. If not, see <http://www.gnu.org/licenses/>.
*/
#include <grub/dl.h>
#include <grub/command.h>
#include <grub/misc.h>
#include <grub/cmos.h>
static grub_err_t
grub_cmd_cmostest (struct grub_command *cmd __attribute__ ((unused)),
int argc, char *argv[])
{
int byte, bit;
char *rest;
if (argc != 1)
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Address required.");
byte = grub_strtoul (argv[0], &rest, 0);
if (*rest != ':')
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Address required.");
bit = grub_strtoul (rest + 1, 0, 0);
if (grub_cmos_read (byte) & (1 << bit))
return GRUB_ERR_NONE;
return grub_error (GRUB_ERR_TEST_FAILURE, "false");
}
static grub_command_t cmd;
GRUB_MOD_INIT(cmostest)
{
cmd = grub_register_command ("cmostest", grub_cmd_cmostest,
"cmostest BYTE:BIT",
"Test bit at BYTE:BIT in CMOS.");
}
GRUB_MOD_FINI(cmostest)
{
grub_unregister_command (cmd);
}

View file

@ -83,15 +83,24 @@ grub_usb_get_string (grub_usb_device_t dev, grub_uint8_t index, int langid,
0x06, (3 << 8) | index, 0x06, (3 << 8) | index,
langid, descstr.length, (char *) descstrp); langid, descstr.length, (char *) descstrp);
*string = grub_malloc (descstr.length / 2); if (descstrp->length == 0)
{
grub_free (descstrp);
*string = grub_strdup ("");
if (! *string)
return GRUB_USB_ERR_INTERNAL;
return GRUB_USB_ERR_NONE;
}
*string = grub_malloc (descstr.length * 2 + 1);
if (! *string) if (! *string)
{ {
grub_free (descstrp); grub_free (descstrp);
return GRUB_USB_ERR_INTERNAL; return GRUB_USB_ERR_INTERNAL;
} }
grub_utf16_to_utf8 ((grub_uint8_t *) *string, descstrp->str, descstrp->length / 2 - 1); *grub_utf16_to_utf8 ((grub_uint8_t *) *string, descstrp->str,
(*string)[descstr.length / 2 - 1] = '\0'; descstrp->length / 2 - 1) = 0;
grub_free (descstrp); grub_free (descstrp);
return GRUB_USB_ERR_NONE; return GRUB_USB_ERR_NONE;

View file

@ -1,6 +1,8 @@
# -*- makefile -*- # -*- makefile -*-
COMMON_CFLAGS += -nostdinc -isystem $(shell $(TARGET_CC) -print-file-name=include) ifeq ($(target_cpu), sparc64)
COMMON_LDFLAGS += -mno-relax
endif
kernel_img_RELOCATABLE = yes kernel_img_RELOCATABLE = yes
pkglib_PROGRAMS = kernel.img pkglib_PROGRAMS = kernel.img
@ -42,6 +44,9 @@ cpuid_mod_LDFLAGS = $(COMMON_LDFLAGS)
endif endif
grub_emu_LDFLAGS = $(LIBCURSES) grub_emu_LDFLAGS = $(LIBCURSES)
ifeq ($(target_cpu), sparc64)
grub_emu_LDFLAGS += -m64 -mno-relax
endif
ifeq ($(enable_grub_emu_usb), yes) ifeq ($(enable_grub_emu_usb), yes)
kernel_img_HEADERS += libusb.h kernel_img_HEADERS += libusb.h

View file

@ -6,7 +6,8 @@ script/lexer.c_DEPENDENCIES = grub_script.tab.h
sbin_UTILITIES += grub-mkdevicemap sbin_UTILITIES += grub-mkdevicemap
grub_mkdevicemap_SOURCES = gnulib/progname.c util/grub-mkdevicemap.c \ grub_mkdevicemap_SOURCES = gnulib/progname.c util/grub-mkdevicemap.c \
util/deviceiter.c \ util/deviceiter.c \
util/misc.c kern/emu/misc.c util/misc.c kern/emu/misc.c \
kern/env.c kern/err.c kern/list.c kern/misc.c kern/emu/mm.c
ifeq ($(target_cpu)-$(platform), sparc64-ieee1275) ifeq ($(target_cpu)-$(platform), sparc64-ieee1275)
grub_mkdevicemap_SOURCES += util/ieee1275/ofpath.c util/ieee1275/devicemap.c grub_mkdevicemap_SOURCES += util/ieee1275/ofpath.c util/ieee1275/devicemap.c
@ -14,11 +15,11 @@ else
grub_mkdevicemap_SOURCES += util/devicemap.c grub_mkdevicemap_SOURCES += util/devicemap.c
endif endif
# For grub-mkelfimage. # For grub-mkimage.
bin_UTILITIES += grub-mkelfimage bin_UTILITIES += grub-mkimage
grub_mkelfimage_SOURCES = gnulib/progname.c util/elf/grub-mkimage.c \ grub_mkimage_SOURCES = gnulib/progname.c util/grub-mkimage.c util/misc.c \
util/misc.c kern/emu/misc.c util/resolve.c util/resolve.c kern/emu/misc.c lib/LzmaEnc.c lib/LzFind.c
util/elf/grub-mkimage.c_DEPENDENCIES = Makefile util/grub-mkimage.c_DEPENDENCIES = Makefile
# For grub-probe. # For grub-probe.
sbin_UTILITIES += grub-probe sbin_UTILITIES += grub-probe
@ -43,20 +44,6 @@ ifeq ($(enable_grub_fstest), yes)
bin_UTILITIES += grub-fstest bin_UTILITIES += grub-fstest
endif endif
bin_UTILITIES += grub-mkisofs
grub_mkisofs_SOURCES = util/mkisofs/eltorito.c \
util/mkisofs/hash.c util/mkisofs/joliet.c \
util/mkisofs/match.c util/mkisofs/mkisofs.c \
util/mkisofs/multi.c util/mkisofs/name.c \
util/mkisofs/rock.c util/mkisofs/tree.c \
util/mkisofs/write.c \
\
gnulib/fnmatch.c gnulib/getopt1.c gnulib/getopt.c \
gnulib/error.c gnulib/progname.c
grub_mkisofs_CFLAGS = -D_FILE_OFFSET_BITS=64 \
-I$(srcdir)/util/mkisofs/include \
-Wno-all -Werror $(GNULIB_UTIL_CFLAGS)
# For grub-fstest. # For grub-fstest.
util/grub-fstest.c_DEPENDENCIES = grub_fstest_init.h util/grub-fstest.c_DEPENDENCIES = grub_fstest_init.h
grub_fstest_SOURCES = gnulib/progname.c util/grub-fstest.c kern/emu/hostfs.c \ grub_fstest_SOURCES = gnulib/progname.c util/grub-fstest.c kern/emu/hostfs.c \
@ -118,7 +105,7 @@ kernel_img_HEADERS += boot.h cache.h device.h disk.h dl.h elf.h elfload.h \
list.h handler.h command.h i18n.h env_private.h libgcc.h list.h handler.h command.h i18n.h env_private.h libgcc.h
ifneq ($(platform), emu) ifneq ($(platform), emu)
kernel_img_HEADERS += machine/memory.h machine/loader.h machine/kernel.h kernel_img_HEADERS += machine/memory.h machine/loader.h
endif endif
symlist.c: $(addprefix include/grub/,$(kernel_img_HEADERS)) config.h gensymlist.sh symlist.c: $(addprefix include/grub/,$(kernel_img_HEADERS)) config.h gensymlist.sh

View file

@ -4,8 +4,6 @@ COMMON_CFLAGS = -mrtd -mregparm=3
# Images. # Images.
GRUB_KERNEL_MACHINE_LINK_ADDR = 0x8200
pkglib_PROGRAMS += kernel.img pkglib_PROGRAMS += kernel.img
kernel_img_SOURCES = kern/i386/coreboot/startup.S \ kernel_img_SOURCES = kern/i386/coreboot/startup.S \
kern/i386/misc.S \ kern/i386/misc.S \
@ -26,7 +24,7 @@ kernel_img_SOURCES = kern/i386/coreboot/startup.S \
symlist.c symlist.c
kernel_img_CFLAGS = $(COMMON_CFLAGS) kernel_img_CFLAGS = $(COMMON_CFLAGS)
kernel_img_ASFLAGS = $(COMMON_ASFLAGS) kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
kernel_img_LDFLAGS += $(COMMON_LDFLAGS) -Wl,-N,-S,-Ttext,$(GRUB_KERNEL_MACHINE_LINK_ADDR),-Bstatic kernel_img_LDFLAGS += $(COMMON_LDFLAGS) -Wl,-N,-S,-Ttext,0x8200,-Bstatic
sbin_SCRIPTS += grub-install sbin_SCRIPTS += grub-install
grub_install_SOURCES = util/grub-install.in grub_install_SOURCES = util/grub-install.in
@ -70,5 +68,11 @@ datetime_mod_SOURCES = lib/cmos_datetime.c
datetime_mod_CFLAGS = $(COMMON_CFLAGS) datetime_mod_CFLAGS = $(COMMON_CFLAGS)
datetime_mod_LDFLAGS = $(COMMON_LDFLAGS) datetime_mod_LDFLAGS = $(COMMON_LDFLAGS)
# For cmostest.mod
pkglib_MODULES += cmostest.mod
cmostest_mod_SOURCES = commands/i386/cmostest.c
cmostest_mod_CFLAGS = $(COMMON_CFLAGS)
cmostest_mod_LDFLAGS = $(COMMON_LDFLAGS)
include $(srcdir)/conf/i386.mk include $(srcdir)/conf/i386.mk
include $(srcdir)/conf/common.mk include $(srcdir)/conf/common.mk

View file

@ -1,12 +1,9 @@
# -*- makefile -*- # -*- makefile -*-
GRUB_KERNEL_MACHINE_LINK_ADDR = 0x8200
COMMON_CFLAGS = -mrtd -mregparm=3 COMMON_CFLAGS = -mrtd -mregparm=3
# Images. # Images.
pkglib_IMAGES = boot.img cdboot.img diskboot.img kernel.img lnxboot.img \ pkglib_IMAGES = boot.img cdboot.img diskboot.img lnxboot.img pxeboot.img
pxeboot.img
# For boot.img. # For boot.img.
boot_img_SOURCES = boot/i386/pc/boot.S boot_img_SOURCES = boot/i386/pc/boot.S
@ -39,6 +36,7 @@ cdboot_img_LDFLAGS = $(COMMON_LDFLAGS) $(TARGET_IMG_LDFLAGS)0x7C00
cdboot_img_FORMAT = binary cdboot_img_FORMAT = binary
# For kernel.img. # For kernel.img.
pkglib_PROGRAMS = kernel.img
kernel_img_SOURCES = kern/i386/pc/startup.S \ kernel_img_SOURCES = kern/i386/pc/startup.S \
kern/i386/misc.S \ kern/i386/misc.S \
kern/main.c kern/device.c \ kern/main.c kern/device.c \
@ -55,22 +53,14 @@ kernel_img_SOURCES = kern/i386/pc/startup.S \
term/i386/pc/console.c term/i386/vga_common.c \ term/i386/pc/console.c term/i386/vga_common.c \
symlist.c symlist.c
kernel_img_HEADERS += machine/biosdisk.h machine/vga.h machine/vbe.h \ kernel_img_HEADERS += machine/biosdisk.h machine/vga.h machine/vbe.h \
machine/pxe.h i386/pit.h machine/pxe.h i386/pit.h machine/kernel.h
kernel_img_CFLAGS = $(COMMON_CFLAGS) $(TARGET_IMG_CFLAGS) kernel_img_CFLAGS = $(COMMON_CFLAGS) $(TARGET_IMG_CFLAGS)
kernel_img_ASFLAGS = $(COMMON_ASFLAGS) kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
kernel_img_LDFLAGS += $(COMMON_LDFLAGS) $(TARGET_IMG_LDFLAGS)$(GRUB_KERNEL_MACHINE_LINK_ADDR) $(COMMON_CFLAGS) kernel_img_LDFLAGS += $(COMMON_LDFLAGS) $(TARGET_IMG_LDFLAGS)0x8200 $(COMMON_CFLAGS)
kernel_img_FORMAT = binary
# Utilities. # Utilities.
bin_UTILITIES = grub-mkimage
sbin_UTILITIES = grub-setup sbin_UTILITIES = grub-setup
# For grub-mkimage.
grub_mkimage_SOURCES = gnulib/progname.c util/grub-mkrawimage.c util/misc.c \
kern/emu/misc.c util/resolve.c lib/LzmaEnc.c lib/LzFind.c
grub_mkimage_CFLAGS = -DGRUB_KERNEL_MACHINE_LINK_ADDR=$(GRUB_KERNEL_MACHINE_LINK_ADDR)
util/grub-mkrawimage.c_DEPENDENCIES = Makefile
# For grub-setup. # For grub-setup.
util/i386/pc/grub-setup.c_DEPENDENCIES = grub_setup_init.h util/i386/pc/grub-setup.c_DEPENDENCIES = grub_setup_init.h
grub_setup_SOURCES = gnulib/progname.c util/i386/pc/grub-setup.c \ grub_setup_SOURCES = gnulib/progname.c util/i386/pc/grub-setup.c \
@ -254,6 +244,12 @@ hdparm_mod_SOURCES = commands/hdparm.c lib/hexdump.c
hdparm_mod_CFLAGS = $(COMMON_CFLAGS) hdparm_mod_CFLAGS = $(COMMON_CFLAGS)
hdparm_mod_LDFLAGS = $(COMMON_LDFLAGS) hdparm_mod_LDFLAGS = $(COMMON_LDFLAGS)
# For cmostest.mod
pkglib_MODULES += cmostest.mod
cmostest_mod_SOURCES = commands/i386/cmostest.c
cmostest_mod_CFLAGS = $(COMMON_CFLAGS)
cmostest_mod_LDFLAGS = $(COMMON_LDFLAGS)
ifeq ($(enable_efiemu), yes) ifeq ($(enable_efiemu), yes)
efiemu32.o: efiemu/runtime/efiemu.c $(TARGET_OBJ2ELF) efiemu32.o: efiemu/runtime/efiemu.c $(TARGET_OBJ2ELF)

View file

@ -13,13 +13,7 @@ boot_img_ASFLAGS = $(COMMON_ASFLAGS) -DGRUB_BOOT_MACHINE_LINK_ADDR=$(GRUB_BOOT_M
boot_img_LDFLAGS = $(COMMON_LDFLAGS) $(TARGET_IMG_LDFLAGS)$(GRUB_BOOT_MACHINE_LINK_ADDR) boot_img_LDFLAGS = $(COMMON_LDFLAGS) $(TARGET_IMG_LDFLAGS)$(GRUB_BOOT_MACHINE_LINK_ADDR)
boot_img_FORMAT = binary boot_img_FORMAT = binary
bin_UTILITIES += grub-mkimage pkglib_PROGRAMS += kernel.img
grub_mkimage_SOURCES = util/grub-mkrawimage.c util/misc.c kern/emu/misc.c \
util/resolve.c gnulib/progname.c
grub_mkimage_CFLAGS = -DGRUB_KERNEL_MACHINE_LINK_ADDR=$(GRUB_KERNEL_MACHINE_LINK_ADDR)
util/grub-mkrawimage.c_DEPENDENCIES = Makefile
pkglib_IMAGES += kernel.img
kernel_img_SOURCES = kern/i386/qemu/startup.S \ kernel_img_SOURCES = kern/i386/qemu/startup.S \
kern/i386/misc.S \ kern/i386/misc.S \
kern/i386/coreboot/init.c \ kern/i386/coreboot/init.c \

View file

@ -5,7 +5,7 @@ COMMON_CFLAGS += -march=mips3
COMMON_ASFLAGS += -march=mips3 COMMON_ASFLAGS += -march=mips3
include $(srcdir)/conf/mips.mk include $(srcdir)/conf/mips.mk
pkglib_IMAGES = kernel.img pkglib_PROGRAMS = kernel.img
kernel_img_SOURCES = kern/$(target_cpu)/startup.S \ kernel_img_SOURCES = kern/$(target_cpu)/startup.S \
kern/main.c kern/device.c kern/$(target_cpu)/init.c \ kern/main.c kern/device.c kern/$(target_cpu)/init.c \
kern/$(target_cpu)/$(target_machine)/init.c \ kern/$(target_cpu)/$(target_machine)/init.c \

View file

@ -8,7 +8,7 @@ kernel_img_HEADERS += pci.h bitmap.h video.h gfxterm.h font.h bitmap_scale.h buf
include $(srcdir)/conf/mips.mk include $(srcdir)/conf/mips.mk
pkglib_IMAGES = kernel.img pkglib_PROGRAMS = kernel.img
kernel_img_SOURCES = kern/$(target_cpu)/startup.S \ kernel_img_SOURCES = kern/$(target_cpu)/startup.S \
kern/main.c kern/device.c kern/$(target_cpu)/init.c \ kern/main.c kern/device.c kern/$(target_cpu)/init.c \
kern/$(target_cpu)/$(target_machine)/init.c \ kern/$(target_cpu)/$(target_machine)/init.c \

View file

@ -10,13 +10,6 @@ kernel_img_HEADERS += cpu/cache.h
sbin_SCRIPTS = sbin_SCRIPTS =
bin_SCRIPTS = bin_SCRIPTS =
# For grub-mkimage.
bin_UTILITIES += grub-mkimage
grub_mkimage_SOURCES = gnulib/progname.c util/grub-mkrawimage.c util/misc.c \
kern/emu/misc.c util/resolve.c lib/LzmaEnc.c lib/LzFind.c
grub_mkimage_CFLAGS = -DGRUB_KERNEL_MACHINE_LINK_ADDR=$(LINK_BASE)
util/grub-mkrawimage.c_DEPENDENCIES = Makefile
# For serial.mod. # For serial.mod.
pkglib_MODULES += serial.mod pkglib_MODULES += serial.mod
serial_mod_SOURCES = term/serial.c serial_mod_SOURCES = term/serial.c

View file

@ -5,7 +5,8 @@ COMMON_CFLAGS = -mno-app-regs
COMMON_LDFLAGS = -melf64_sparc -mno-relax COMMON_LDFLAGS = -melf64_sparc -mno-relax
# Images. # Images.
pkglib_IMAGES = boot.img diskboot.img kernel.img pkglib_IMAGES = boot.img diskboot.img
pkglib_PROGRAMS = kernel.img
# For boot.img. # For boot.img.
boot_img_SOURCES = boot/sparc64/ieee1275/boot.S boot_img_SOURCES = boot/sparc64/ieee1275/boot.S
@ -40,13 +41,8 @@ kernel_img_LDFLAGS += -nostdlib -Wl,-N,-Ttext,0x4400,-Bstatic,-melf64_sparc
kernel_img_FORMAT = binary kernel_img_FORMAT = binary
# Utilities. # Utilities.
bin_UTILITIES = grub-mkimage
sbin_UTILITIES = grub-setup grub-ofpathname sbin_UTILITIES = grub-setup grub-ofpathname
# For grub-mkimage.
grub_mkimage_SOURCES = util/grub-mkrawimage.c util/misc.c kern/emu/misc.c \
util/resolve.c gnulib/progname.c
# For grub-setup. # For grub-setup.
util/sparc64/ieee1275/grub-setup.c_DEPENDENCIES = grub_setup_init.h util/sparc64/ieee1275/grub-setup.c_DEPENDENCIES = grub_setup_init.h
grub_setup_SOURCES = util/sparc64/ieee1275/grub-setup.c \ grub_setup_SOURCES = util/sparc64/ieee1275/grub-setup.c \

View file

@ -1,19 +1,14 @@
# -*- makefile -*- # -*- makefile -*-
# Utilities.
bin_UTILITIES = grub-mkimage
# For grub-mkimage.
grub_mkimage_SOURCES = gnulib/progname.c util/i386/efi/grub-mkimage.c \
util/misc.c kern/emu/misc.c util/resolve.c
util/i386/efi/grub-mkimage.c_DEPENDENCIES = Makefile
# Scripts. # Scripts.
sbin_SCRIPTS = grub-install sbin_SCRIPTS = grub-install
# For grub-install. # For grub-install.
grub_install_SOURCES = util/i386/efi/grub-install.in grub_install_SOURCES = util/i386/efi/grub-install.in
bin_SCRIPTS += grub-mkrescue
grub_mkrescue_SOURCES = util/grub-mkrescue.in
# Modules. # Modules.
pkglib_PROGRAMS = kernel.img pkglib_PROGRAMS = kernel.img
pkglib_MODULES = chain.mod appleldr.mod \ pkglib_MODULES = chain.mod appleldr.mod \

View file

@ -110,6 +110,13 @@ grub_gfxmenu_try (int entry, grub_menu_t menu, int nested)
view->nested = nested; view->nested = nested;
view->first_timeout = -1; view->first_timeout = -1;
grub_video_set_viewport (0, 0, mode_info.width, mode_info.height);
if (view->double_repaint)
{
grub_video_swap_buffers ();
grub_video_set_viewport (0, 0, mode_info.width, mode_info.height);
}
grub_gfxmenu_view_draw (view); grub_gfxmenu_view_draw (view);
instance->data = view; instance->data = view;

View file

@ -54,6 +54,7 @@ static void
circprog_destroy (void *vself) circprog_destroy (void *vself)
{ {
circular_progress_t self = vself; circular_progress_t self = vself;
grub_gfxmenu_timeout_unregister ((grub_gui_component_t) self);
grub_free (self); grub_free (self);
} }
@ -211,6 +212,17 @@ circprog_get_bounds (void *vself, grub_video_rect_t *bounds)
*bounds = self->bounds; *bounds = self->bounds;
} }
static void
circprog_set_state (void *vself, int visible, int start,
int current, int end)
{
circular_progress_t self = vself;
self->visible = visible;
self->start = start;
self->value = current;
self->end = end;
}
static grub_err_t static grub_err_t
circprog_set_property (void *vself, const char *name, const char *value) circprog_set_property (void *vself, const char *name, const char *value)
{ {
@ -247,26 +259,20 @@ circprog_set_property (void *vself, const char *name, const char *value)
} }
else if (grub_strcmp (name, "id") == 0) else if (grub_strcmp (name, "id") == 0)
{ {
grub_gfxmenu_timeout_unregister ((grub_gui_component_t) self);
grub_free (self->id); grub_free (self->id);
if (value) if (value)
self->id = grub_strdup (value); self->id = grub_strdup (value);
else else
self->id = 0; self->id = 0;
if (self->id && grub_strcmp (self->id, GRUB_GFXMENU_TIMEOUT_COMPONENT_ID)
== 0)
grub_gfxmenu_timeout_register ((grub_gui_component_t) self,
circprog_set_state);
} }
return grub_errno; return grub_errno;
} }
static void
circprog_set_state (void *vself, int visible, int start,
int current, int end)
{
circular_progress_t self = vself;
self->visible = visible;
self->start = start;
self->value = current;
self->end = end;
}
static struct grub_gui_component_ops circprog_ops = static struct grub_gui_component_ops circprog_ops =
{ {
.destroy = circprog_destroy, .destroy = circprog_destroy,

View file

@ -46,8 +46,10 @@ struct grub_gui_label
char *id; char *id;
int visible; int visible;
char *text; char *text;
char *template;
grub_font_t font; grub_font_t font;
grub_gui_color_t color; grub_gui_color_t color;
int value;
enum align_mode align; enum align_mode align;
}; };
@ -57,7 +59,9 @@ static void
label_destroy (void *vself) label_destroy (void *vself)
{ {
grub_gui_label_t self = vself; grub_gui_label_t self = vself;
grub_gfxmenu_timeout_unregister ((grub_gui_component_t) self);
grub_free (self->text); grub_free (self->text);
grub_free (self->template);
grub_free (self); grub_free (self);
} }
@ -146,6 +150,17 @@ label_get_minimal_size (void *vself, unsigned *width, unsigned *height)
+ grub_font_get_descent (self->font)); + grub_font_get_descent (self->font));
} }
static void
label_set_state (void *vself, int visible, int start __attribute__ ((unused)),
int current, int end __attribute__ ((unused)))
{
grub_gui_label_t self = vself;
self->value = -current;
self->visible = visible;
grub_free (self->text);
self->text = grub_xasprintf (self->template ? : "%d", self->value);
}
static grub_err_t static grub_err_t
label_set_property (void *vself, const char *name, const char *value) label_set_property (void *vself, const char *name, const char *value)
{ {
@ -153,9 +168,17 @@ label_set_property (void *vself, const char *name, const char *value)
if (grub_strcmp (name, "text") == 0) if (grub_strcmp (name, "text") == 0)
{ {
grub_free (self->text); grub_free (self->text);
grub_free (self->template);
if (! value) if (! value)
value = ""; {
self->text = grub_strdup (value); self->template = NULL;
self->text = grub_strdup ("");
}
else
{
self->template = grub_strdup (value);
self->text = grub_xasprintf (value, self->value);
}
} }
else if (grub_strcmp (name, "font") == 0) else if (grub_strcmp (name, "font") == 0)
{ {
@ -183,11 +206,16 @@ label_set_property (void *vself, const char *name, const char *value)
} }
else if (grub_strcmp (name, "id") == 0) else if (grub_strcmp (name, "id") == 0)
{ {
grub_gfxmenu_timeout_unregister ((grub_gui_component_t) self);
grub_free (self->id); grub_free (self->id);
if (value) if (value)
self->id = grub_strdup (value); self->id = grub_strdup (value);
else else
self->id = 0; self->id = 0;
if (self->id && grub_strcmp (self->id, GRUB_GFXMENU_TIMEOUT_COMPONENT_ID)
== 0)
grub_gfxmenu_timeout_register ((grub_gui_component_t) self,
label_set_state);
} }
return GRUB_ERR_NONE; return GRUB_ERR_NONE;
} }

View file

@ -210,8 +210,7 @@ draw_scrollbar (list_impl_t self,
/* Draw the list of items. */ /* Draw the list of items. */
static void static void
draw_menu (list_impl_t self, int width, int drawing_scrollbar, draw_menu (list_impl_t self, int width, int num_shown_items)
int num_shown_items)
{ {
if (! self->menu_box || ! self->selected_item_box) if (! self->menu_box || ! self->selected_item_box)
return; return;
@ -226,8 +225,6 @@ draw_menu (list_impl_t self, int width, int drawing_scrollbar,
make_selected_item_visible (self); make_selected_item_visible (self);
int scrollbar_h_space = drawing_scrollbar ? self->scrollbar_width : 0;
grub_gfxmenu_box_t selbox = self->selected_item_box; grub_gfxmenu_box_t selbox = self->selected_item_box;
int sel_leftpad = selbox->get_left_pad (selbox); int sel_leftpad = selbox->get_left_pad (selbox);
int item_top = boxpad; int item_top = boxpad;
@ -244,12 +241,8 @@ draw_menu (list_impl_t self, int width, int drawing_scrollbar,
if (is_selected) if (is_selected)
{ {
int sel_toppad = selbox->get_top_pad (selbox); int sel_toppad = selbox->get_top_pad (selbox);
selbox->set_content_size (selbox, selbox->set_content_size (selbox, (width - 2 * boxpad), item_height);
(width - 2 * boxpad selbox->draw (selbox, item_left - sel_leftpad,
- scrollbar_h_space),
item_height);
selbox->draw (selbox,
item_left - sel_leftpad,
item_top - sel_toppad); item_top - sel_toppad);
} }
@ -320,7 +313,7 @@ list_paint (void *vself, const grub_video_rect_t *region)
box->draw (box, 0, 0); box->draw (box, 0, 0);
grub_gui_set_viewport (&content_rect, &vpsave2); grub_gui_set_viewport (&content_rect, &vpsave2);
draw_menu (self, content_rect.width, drawing_scrollbar, num_shown_items); draw_menu (self, content_rect.width, num_shown_items);
grub_gui_restore_viewport (&vpsave2); grub_gui_restore_viewport (&vpsave2);
if (drawing_scrollbar) if (drawing_scrollbar)

View file

@ -60,6 +60,7 @@ static void
progress_bar_destroy (void *vself) progress_bar_destroy (void *vself)
{ {
grub_gui_progress_bar_t self = vself; grub_gui_progress_bar_t self = vself;
grub_gfxmenu_timeout_unregister ((grub_gui_component_t) self);
grub_free (self); grub_free (self);
} }
@ -333,11 +334,16 @@ progress_bar_set_property (void *vself, const char *name, const char *value)
} }
else if (grub_strcmp (name, "id") == 0) else if (grub_strcmp (name, "id") == 0)
{ {
grub_gfxmenu_timeout_unregister ((grub_gui_component_t) self);
grub_free (self->id); grub_free (self->id);
if (value) if (value)
self->id = grub_strdup (value); self->id = grub_strdup (value);
else else
self->id = 0; self->id = 0;
/* if (self->id && grub_strcmp (self->id, GRUB_GFXMENU_TIMEOUT_COMPONENT_ID)
== 0)*/
grub_gfxmenu_timeout_register ((grub_gui_component_t) self,
progress_bar_set_state);
} }
return grub_errno; return grub_errno;
} }
@ -368,6 +374,7 @@ grub_gui_progress_bar_new (void)
self = grub_zalloc (sizeof (*self)); self = grub_zalloc (sizeof (*self));
if (! self) if (! self)
return 0; return 0;
self->progress.ops = &progress_bar_pb_ops; self->progress.ops = &progress_bar_pb_ops;
self->progress.component.ops = &progress_bar_ops; self->progress.component.ops = &progress_bar_ops;
self->visible = 1; self->visible = 1;

View file

@ -37,10 +37,6 @@
#include <grub/gui_string_util.h> #include <grub/gui_string_util.h>
#include <grub/icon_manager.h> #include <grub/icon_manager.h>
/* The component ID identifying GUI components to be updated as the timeout
status changes. */
#define TIMEOUT_COMPONENT_ID "__timeout__"
static void static void
init_terminal (grub_gfxmenu_view_t view); init_terminal (grub_gfxmenu_view_t view);
static grub_video_rect_t term_rect; static grub_video_rect_t term_rect;
@ -166,16 +162,28 @@ struct progress_value_data
int value; int value;
}; };
static void struct grub_gfxmenu_timeout_notify *grub_gfxmenu_timeout_notifications;
update_timeout_visit (grub_gui_component_t component,
void *userdata)
{
struct progress_value_data *pv;
pv = (struct progress_value_data *) userdata;
((struct grub_gui_progress *) component)->ops static void
->set_state ((struct grub_gui_progress *) component, update_timeouts (int visible, int start, int value, int end)
pv->visible, pv->start, pv->value, pv->end); {
struct grub_gfxmenu_timeout_notify *cur;
for (cur = grub_gfxmenu_timeout_notifications; cur; cur = cur->next)
cur->set_state (cur->self, visible, start, value, end);
}
static void
redraw_timeouts (struct grub_gfxmenu_view *view)
{
struct grub_gfxmenu_timeout_notify *cur;
for (cur = grub_gfxmenu_timeout_notifications; cur; cur = cur->next)
{
grub_video_rect_t bounds;
cur->self->ops->get_bounds (cur->self, &bounds);
grub_gfxmenu_view_redraw (view, &bounds);
}
} }
void void
@ -183,67 +191,26 @@ grub_gfxmenu_print_timeout (int timeout, void *data)
{ {
struct grub_gfxmenu_view *view = data; struct grub_gfxmenu_view *view = data;
struct progress_value_data pv;
auto void redraw_timeout_visit (grub_gui_component_t component,
void *userdata __attribute__ ((unused)));
auto void redraw_timeout_visit (grub_gui_component_t component,
void *userdata __attribute__ ((unused)))
{
grub_video_rect_t bounds;
component->ops->get_bounds (component, &bounds);
grub_gfxmenu_view_redraw (view, &bounds);
}
if (view->first_timeout == -1) if (view->first_timeout == -1)
view->first_timeout = timeout; view->first_timeout = timeout;
pv.visible = 1; update_timeouts (1, -(view->first_timeout + 1), -timeout, 0);
pv.start = -(view->first_timeout + 1); redraw_timeouts (view);
pv.end = 0;
pv.value = -timeout;
grub_gui_find_by_id ((grub_gui_component_t) view->canvas,
TIMEOUT_COMPONENT_ID, update_timeout_visit, &pv);
grub_gui_find_by_id ((grub_gui_component_t) view->canvas,
TIMEOUT_COMPONENT_ID, redraw_timeout_visit, &pv);
grub_video_swap_buffers (); grub_video_swap_buffers ();
if (view->double_repaint) if (view->double_repaint)
grub_gui_find_by_id ((grub_gui_component_t) view->canvas, redraw_timeouts (view);
TIMEOUT_COMPONENT_ID, redraw_timeout_visit, &pv);
} }
void void
grub_gfxmenu_clear_timeout (void *data) grub_gfxmenu_clear_timeout (void *data)
{ {
struct progress_value_data pv;
struct grub_gfxmenu_view *view = data; struct grub_gfxmenu_view *view = data;
auto void redraw_timeout_visit (grub_gui_component_t component, update_timeouts (0, 1, 0, 0);
void *userdata __attribute__ ((unused))); redraw_timeouts (view);
auto void redraw_timeout_visit (grub_gui_component_t component,
void *userdata __attribute__ ((unused)))
{
grub_video_rect_t bounds;
component->ops->get_bounds (component, &bounds);
grub_gfxmenu_view_redraw (view, &bounds);
}
pv.visible = 0;
pv.start = 1;
pv.end = 0;
pv.value = 0;
grub_gui_find_by_id ((grub_gui_component_t) view->canvas,
TIMEOUT_COMPONENT_ID, update_timeout_visit, &pv);
grub_gui_find_by_id ((grub_gui_component_t) view->canvas,
TIMEOUT_COMPONENT_ID, redraw_timeout_visit, &pv);
grub_video_swap_buffers (); grub_video_swap_buffers ();
if (view->double_repaint) if (view->double_repaint)
grub_gui_find_by_id ((grub_gui_component_t) view->canvas, redraw_timeouts (view);
TIMEOUT_COMPONENT_ID, redraw_timeout_visit, &pv);
} }
static void static void
@ -390,11 +357,6 @@ grub_gfxmenu_draw_terminal_box (void)
term_box->draw (term_box, term_box->draw (term_box,
term_rect.x - term_box->get_left_pad (term_box), term_rect.x - term_box->get_left_pad (term_box),
term_rect.y - term_box->get_top_pad (term_box)); term_rect.y - term_box->get_top_pad (term_box));
grub_video_swap_buffers ();
if (term_view->double_repaint)
term_box->draw (term_box,
term_rect.x - term_box->get_left_pad (term_box),
term_rect.y - term_box->get_top_pad (term_box));
} }
static void static void

View file

@ -23,7 +23,8 @@
#include <grub/symbol.h> #include <grub/symbol.h>
#include <grub/types.h> #include <grub/types.h>
#if defined (__i386__) || defined (__x86_64__) #if defined (__i386__) || defined (__x86_64__) || \
(defined (GRUB_MACHINE_EMU) && GRUB_MACHINE_EMU)
static inline void static inline void
grub_arch_sync_caches (void *address __attribute__ ((unused)), grub_arch_sync_caches (void *address __attribute__ ((unused)),
grub_size_t len __attribute__ ((unused))) grub_size_t len __attribute__ ((unused)))

View file

@ -111,7 +111,7 @@ grub_err_t EXPORT_FUNC(grub_dl_register_symbol) (const char *name, void *addr,
grub_err_t grub_arch_dl_check_header (void *ehdr); grub_err_t grub_arch_dl_check_header (void *ehdr);
grub_err_t grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr); grub_err_t grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr);
#if defined (_mips) && ! defined (GRUB_MACHINE_EMU) #if defined (_mips) && (! defined (GRUB_MACHINE_EMU) || ! GRUB_MACHINE_EMU)
#define GRUB_LINKER_HAVE_INIT 1 #define GRUB_LINKER_HAVE_INIT 1
void grub_arch_dl_init_linker (void); void grub_arch_dl_init_linker (void);
#endif #endif

View file

@ -99,12 +99,8 @@ struct grub_pe32_optional_header
grub_uint32_t entry_addr; grub_uint32_t entry_addr;
grub_uint32_t code_base; grub_uint32_t code_base;
#if GRUB_TARGET_SIZEOF_VOID_P == 4
grub_uint32_t data_base; grub_uint32_t data_base;
grub_uint32_t image_base; grub_uint32_t image_base;
#else
grub_uint64_t image_base;
#endif
grub_uint32_t section_alignment; grub_uint32_t section_alignment;
grub_uint32_t file_alignment; grub_uint32_t file_alignment;
@ -121,22 +117,11 @@ struct grub_pe32_optional_header
grub_uint16_t subsystem; grub_uint16_t subsystem;
grub_uint16_t dll_characteristics; grub_uint16_t dll_characteristics;
#if GRUB_TARGET_SIZEOF_VOID_P == 4
grub_uint32_t stack_reserve_size; grub_uint32_t stack_reserve_size;
grub_uint32_t stack_commit_size; grub_uint32_t stack_commit_size;
grub_uint32_t heap_reserve_size; grub_uint32_t heap_reserve_size;
grub_uint32_t heap_commit_size; grub_uint32_t heap_commit_size;
#else
grub_uint64_t stack_reserve_size;
grub_uint64_t stack_commit_size;
grub_uint64_t heap_reserve_size;
grub_uint64_t heap_commit_size;
#endif
grub_uint32_t loader_flags; grub_uint32_t loader_flags;
grub_uint32_t num_data_directories; grub_uint32_t num_data_directories;
@ -159,15 +144,63 @@ struct grub_pe32_optional_header
struct grub_pe32_data_directory reserved_entry; struct grub_pe32_data_directory reserved_entry;
}; };
#if GRUB_TARGET_SIZEOF_VOID_P == 4 struct grub_pe64_optional_header
{
grub_uint16_t magic;
grub_uint8_t major_linker_version;
grub_uint8_t minor_linker_version;
grub_uint32_t code_size;
grub_uint32_t data_size;
grub_uint32_t bss_size;
grub_uint32_t entry_addr;
grub_uint32_t code_base;
grub_uint64_t image_base;
grub_uint32_t section_alignment;
grub_uint32_t file_alignment;
grub_uint16_t major_os_version;
grub_uint16_t minor_os_version;
grub_uint16_t major_image_version;
grub_uint16_t minor_image_version;
grub_uint16_t major_subsystem_version;
grub_uint16_t minor_subsystem_version;
grub_uint32_t reserved;
grub_uint32_t image_size;
grub_uint32_t header_size;
grub_uint32_t checksum;
grub_uint16_t subsystem;
grub_uint16_t dll_characteristics;
grub_uint64_t stack_reserve_size;
grub_uint64_t stack_commit_size;
grub_uint64_t heap_reserve_size;
grub_uint64_t heap_commit_size;
grub_uint32_t loader_flags;
grub_uint32_t num_data_directories;
/* Data directories. */
struct grub_pe32_data_directory export_table;
struct grub_pe32_data_directory import_table;
struct grub_pe32_data_directory resource_table;
struct grub_pe32_data_directory exception_table;
struct grub_pe32_data_directory certificate_table;
struct grub_pe32_data_directory base_relocation_table;
struct grub_pe32_data_directory debug;
struct grub_pe32_data_directory architecture;
struct grub_pe32_data_directory global_ptr;
struct grub_pe32_data_directory tls_table;
struct grub_pe32_data_directory load_config_table;
struct grub_pe32_data_directory bound_import;
struct grub_pe32_data_directory iat;
struct grub_pe32_data_directory delay_import_descriptor;
struct grub_pe32_data_directory com_runtime_header;
struct grub_pe32_data_directory reserved_entry;
};
#define GRUB_PE32_PE32_MAGIC 0x10b #define GRUB_PE32_PE32_MAGIC 0x10b
#define GRUB_PE32_PE64_MAGIC 0x20b
#else
#define GRUB_PE32_PE32_MAGIC 0x20b
#endif
#define GRUB_PE32_SUBSYSTEM_EFI_APPLICATION 10 #define GRUB_PE32_SUBSYSTEM_EFI_APPLICATION 10
@ -205,6 +238,7 @@ struct grub_pe32_section_table
#define GRUB_PE32_SCN_ALIGN_SHIFT 20 #define GRUB_PE32_SCN_ALIGN_SHIFT 20
#define GRUB_PE32_SCN_ALIGN_MASK 7 #define GRUB_PE32_SCN_ALIGN_MASK 7
#define GRUB_PE32_SIGNATURE_SIZE 4
struct grub_pe32_header struct grub_pe32_header
{ {
@ -212,13 +246,18 @@ struct grub_pe32_header
grub_uint8_t msdos_stub[GRUB_PE32_MSDOS_STUB_SIZE]; grub_uint8_t msdos_stub[GRUB_PE32_MSDOS_STUB_SIZE];
/* This is always PE\0\0. */ /* This is always PE\0\0. */
char signature[4]; char signature[GRUB_PE32_SIGNATURE_SIZE];
/* The COFF file header. */ /* The COFF file header. */
struct grub_pe32_coff_header coff_header; struct grub_pe32_coff_header coff_header;
#if GRUB_TARGET_SIZEOF_VOID_P == 8
/* The Optional header. */
struct grub_pe64_optional_header optional_header;
#else
/* The Optional header. */ /* The Optional header. */
struct grub_pe32_optional_header optional_header; struct grub_pe32_optional_header optional_header;
#endif
}; };
struct grub_pe32_fixup_block struct grub_pe32_fixup_block

View file

@ -555,6 +555,7 @@ typedef struct
#define PT_NUM 8 /* Number of defined types */ #define PT_NUM 8 /* Number of defined types */
#define PT_LOOS 0x60000000 /* Start of OS-specific */ #define PT_LOOS 0x60000000 /* Start of OS-specific */
#define PT_GNU_EH_FRAME 0x6474e550 /* GCC .eh_frame_hdr segment */ #define PT_GNU_EH_FRAME 0x6474e550 /* GCC .eh_frame_hdr segment */
#define PT_GNU_STACK 0x6474e551 /* GCC stack segment */
#define PT_LOSUNW 0x6ffffffa #define PT_LOSUNW 0x6ffffffa
#define PT_SUNWBSS 0x6ffffffa /* Sun Specific segment */ #define PT_SUNWBSS 0x6ffffffa /* Sun Specific segment */
#define PT_SUNWSTACK 0x6ffffffb /* Stack segment */ #define PT_SUNWSTACK 0x6ffffffb /* Stack segment */

View file

@ -47,5 +47,6 @@ int EXPORT_FUNC(asprintf) (char **buf, const char *fmt, ...);
#endif #endif
char * EXPORT_FUNC(xasprintf) (const char *fmt, ...); char * EXPORT_FUNC(xasprintf) (const char *fmt, ...);
char * canonicalize_file_name (const char *path);
#endif /* GRUB_EMU_MISC_H */ #endif /* GRUB_EMU_MISC_H */

View file

@ -22,10 +22,15 @@
#include <grub/video.h> #include <grub/video.h>
#include <grub/bitmap.h> #include <grub/bitmap.h>
#include <grub/gfxmenu_view.h> #include <grub/gfxmenu_view.h>
#include <grub/mm.h>
#ifndef GRUB_GUI_H #ifndef GRUB_GUI_H
#define GRUB_GUI_H 1 #define GRUB_GUI_H 1
/* The component ID identifying GUI components to be updated as the timeout
status changes. */
#define GRUB_GFXMENU_TIMEOUT_COMPONENT_ID "__timeout__"
/* A representation of a color. Unlike grub_video_color_t, this /* A representation of a color. Unlike grub_video_color_t, this
representation is independent of any video mode specifics. */ representation is independent of any video mode specifics. */
typedef struct grub_gui_color typedef struct grub_gui_color
@ -79,6 +84,46 @@ struct grub_gui_progress_ops
void (*set_state) (void *self, int visible, int start, int current, int end); void (*set_state) (void *self, int visible, int start, int current, int end);
}; };
typedef void (*grub_gfxmenu_set_state_t) (void *self, int visible, int start,
int current, int end);
struct grub_gfxmenu_timeout_notify
{
struct grub_gfxmenu_timeout_notify *next;
grub_gfxmenu_set_state_t set_state;
grub_gui_component_t self;
};
extern struct grub_gfxmenu_timeout_notify *grub_gfxmenu_timeout_notifications;
static inline grub_err_t
grub_gfxmenu_timeout_register (grub_gui_component_t self,
grub_gfxmenu_set_state_t set_state)
{
struct grub_gfxmenu_timeout_notify *ne = grub_malloc (sizeof (*ne));
if (!ne)
return grub_errno;
ne->set_state = set_state;
ne->self = self;
ne->next = grub_gfxmenu_timeout_notifications;
grub_gfxmenu_timeout_notifications = ne;
return GRUB_ERR_NONE;
}
static inline void
grub_gfxmenu_timeout_unregister (grub_gui_component_t self)
{
struct grub_gfxmenu_timeout_notify **p, *q;
for (p = &grub_gfxmenu_timeout_notifications, q = *p;
q; p = &(q->next), q = q->next)
if (q->self == self)
{
*p = q->next;
break;
}
}
typedef signed grub_fixed_signed_t; typedef signed grub_fixed_signed_t;
#define GRUB_FIXED_1 0x10000 #define GRUB_FIXED_1 0x10000

View file

@ -22,10 +22,10 @@
#include <config.h> #include <config.h>
#include <grub/symbol.h> #include <grub/symbol.h>
extern const char *(*EXPORT_VAR(grub_gettext)) (const char *s);
/* NLS can be disabled through the configure --disable-nls option. */ /* NLS can be disabled through the configure --disable-nls option. */
#if (defined(ENABLE_NLS) && ENABLE_NLS) #if (defined(ENABLE_NLS) && ENABLE_NLS) || !defined (GRUB_UTIL)
extern const char *(*EXPORT_VAR(grub_gettext)) (const char *s);
# ifdef GRUB_UTIL # ifdef GRUB_UTIL
@ -41,18 +41,26 @@ extern const char *(*EXPORT_VAR(grub_gettext)) (const char *s);
for invalid uses of the value returned from these functions. for invalid uses of the value returned from these functions.
On pre-ANSI systems without 'const', the config.h file is supposed to On pre-ANSI systems without 'const', the config.h file is supposed to
contain "#define const". */ contain "#define const". */
# ifdef GRUB_UTIL static inline const char * __attribute__ ((always_inline))
# define gettext(Msgid) ((const char *) (Msgid)) gettext (const char *str)
# else {
# define grub_gettext(str) ((const char *) (str)) return str;
# endif /* GRUB_UTIL */ }
#endif /* (defined(ENABLE_NLS) && ENABLE_NLS) */ #endif /* (defined(ENABLE_NLS) && ENABLE_NLS) */
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
# define _(str) gettext(str) static inline const char * __attribute__ ((always_inline))
_ (const char *str)
{
return gettext(str);
}
#else #else
# define _(str) grub_gettext(str) static inline const char * __attribute__ ((always_inline))
_ (const char *str)
{
return grub_gettext(str);
}
#endif /* GRUB_UTIL */ #endif /* GRUB_UTIL */
#define N_(str) str #define N_(str) str

View file

@ -1,28 +0,0 @@
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2005,2006,2007,2008 Free Software Foundation, Inc.
*
* GRUB 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 3 of the License, or
* (at your option) any later version.
*
* GRUB 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 GRUB. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef GRUB_KERNEL_MACHINE_HEADER
#define GRUB_KERNEL_MACHINE_HEADER 1
#include <grub/symbol.h>
#ifndef ASM_FILE
extern char grub_prefix[];
#endif
#endif /* ! GRUB_KERNEL_MACHINE_HEADER */

View file

@ -1,33 +0,0 @@
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2002,2003,2007 Free Software Foundation, Inc.
*
* GRUB 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 3 of the License, or
* (at your option) any later version.
*
* GRUB 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 GRUB. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef GRUB_MACHINE_KERNEL_HEADER
#define GRUB_MACHINE_KERNEL_HEADER 1
/* The prefix which points to the directory where GRUB modules and its
configuration file are located. */
extern char grub_prefix[];
/* The offset of GRUB_PREFIX. */
#define GRUB_KERNEL_MACHINE_PREFIX 0x8
/* End of the data section. */
#define GRUB_KERNEL_MACHINE_DATA_END 0x50
#endif /* ! GRUB_MACHINE_KERNEL_HEADER */

View file

@ -1 +0,0 @@
#include <grub/powerpc/ieee1275/kernel.h>

View file

@ -1,35 +0,0 @@
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2005,2006,2007,2008,2009 Free Software Foundation, Inc.
*
* GRUB 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 3 of the License, or
* (at your option) any later version.
*
* GRUB 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 GRUB. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef GRUB_KERNEL_CPU_HEADER
#define GRUB_KERNEL_CPU_HEADER 1
#ifdef GRUB_MACHINE_IEEE1275
#define GRUB_MOD_ALIGN 0x1000
#else
#define GRUB_MOD_ALIGN 0x1
#endif
/* Non-zero value is only needed for PowerMacs. */
#define GRUB_MOD_GAP 0x0
#define GRUB_KERNEL_CPU_PREFIX 0x2
#define GRUB_KERNEL_CPU_DATA_END 0x42
#endif

View file

@ -19,6 +19,8 @@
#ifndef GRUB_BOOT_MACHINE_HEADER #ifndef GRUB_BOOT_MACHINE_HEADER
#define GRUB_BOOT_MACHINE_HEADER 1 #define GRUB_BOOT_MACHINE_HEADER 1
#include <grub/offsets.h>
/* The signature for bootloader. */ /* The signature for bootloader. */
#define GRUB_BOOT_MACHINE_SIGNATURE 0xaa55 #define GRUB_BOOT_MACHINE_SIGNATURE 0xaa55
@ -57,9 +59,6 @@
floppy. */ floppy. */
#define GRUB_BOOT_MACHINE_BIOS_HD_FLAG 0x80 #define GRUB_BOOT_MACHINE_BIOS_HD_FLAG 0x80
/* The segment where the kernel is loaded. */
#define GRUB_BOOT_MACHINE_KERNEL_SEG 0x800
/* The address where the kernel is loaded. */ /* The address where the kernel is loaded. */
#define GRUB_BOOT_MACHINE_KERNEL_ADDR (GRUB_BOOT_MACHINE_KERNEL_SEG << 4) #define GRUB_BOOT_MACHINE_KERNEL_ADDR (GRUB_BOOT_MACHINE_KERNEL_SEG << 4)
@ -68,16 +67,7 @@
#define GRUB_BOOT_MACHINE_PXE_DL 0x7f #define GRUB_BOOT_MACHINE_PXE_DL 0x7f
#ifndef ASM_FILE
/* This is the blocklist used in the diskboot image. */ /* This is the blocklist used in the diskboot image. */
struct grub_boot_blocklist #define grub_boot_blocklist grub_pc_bios_boot_blocklist
{
grub_uint64_t start;
grub_uint16_t len;
grub_uint16_t segment;
} __attribute__ ((packed));
#endif /* ! ASM_FILE */
#endif /* ! BOOT_MACHINE_HEADER */ #endif /* ! BOOT_MACHINE_HEADER */

View file

@ -19,29 +19,7 @@
#ifndef KERNEL_MACHINE_HEADER #ifndef KERNEL_MACHINE_HEADER
#define KERNEL_MACHINE_HEADER 1 #define KERNEL_MACHINE_HEADER 1
/* The offset of GRUB_TOTAL_MODULE_SIZE. */ #include <grub/offsets.h>
#define GRUB_KERNEL_MACHINE_TOTAL_MODULE_SIZE 0x8
/* The offset of GRUB_KERNEL_IMAGE_SIZE. */
#define GRUB_KERNEL_MACHINE_KERNEL_IMAGE_SIZE 0xc
/* The offset of GRUB_COMPRESSED_SIZE. */
#define GRUB_KERNEL_MACHINE_COMPRESSED_SIZE 0x10
/* The offset of GRUB_INSTALL_DOS_PART. */
#define GRUB_KERNEL_MACHINE_INSTALL_DOS_PART 0x14
/* The offset of GRUB_INSTALL_BSD_PART. */
#define GRUB_KERNEL_MACHINE_INSTALL_BSD_PART 0x18
/* The offset of GRUB_PREFIX. */
#define GRUB_KERNEL_MACHINE_PREFIX 0x1c
/* End of the data section. */
#define GRUB_KERNEL_MACHINE_DATA_END 0x5c
/* The size of the first region which won't be compressed. */
#define GRUB_KERNEL_MACHINE_RAW_SIZE (GRUB_KERNEL_MACHINE_DATA_END + 0x5F0)
/* Enable LZMA compression */ /* Enable LZMA compression */
#define ENABLE_LZMA 1 #define ENABLE_LZMA 1
@ -63,10 +41,6 @@ extern grub_int32_t grub_install_dos_part;
/* The BSD partition number of the installed partition. */ /* The BSD partition number of the installed partition. */
extern grub_int32_t grub_install_bsd_part; extern grub_int32_t grub_install_bsd_part;
/* The prefix which points to the directory where GRUB modules and its
configuration file are located. */
extern char grub_prefix[];
/* The boot BIOS drive number. */ /* The boot BIOS drive number. */
extern grub_uint8_t EXPORT_VAR(grub_boot_drive); extern grub_uint8_t EXPORT_VAR(grub_boot_drive);

View file

@ -29,6 +29,8 @@
#include <grub/i386/memory.h> #include <grub/i386/memory.h>
#include <grub/offsets.h>
/* The scratch buffer used in real mode code. */ /* The scratch buffer used in real mode code. */
#define GRUB_MEMORY_MACHINE_SCRATCH_ADDR 0x68000 #define GRUB_MEMORY_MACHINE_SCRATCH_ADDR 0x68000
#define GRUB_MEMORY_MACHINE_SCRATCH_SEG (GRUB_MEMORY_MACHINE_SCRATCH_ADDR >> 4) #define GRUB_MEMORY_MACHINE_SCRATCH_SEG (GRUB_MEMORY_MACHINE_SCRATCH_ADDR >> 4)
@ -40,9 +42,6 @@
/* The size of the protect mode stack. */ /* The size of the protect mode stack. */
#define GRUB_MEMORY_MACHINE_PROT_STACK_SIZE 0x8000 #define GRUB_MEMORY_MACHINE_PROT_STACK_SIZE 0x8000
/* The upper memory area (starting at 640 kiB). */
#define GRUB_MEMORY_MACHINE_UPPER 0xa0000
/* The protected mode stack. */ /* The protected mode stack. */
#define GRUB_MEMORY_MACHINE_PROT_STACK \ #define GRUB_MEMORY_MACHINE_PROT_STACK \
(GRUB_MEMORY_MACHINE_SCRATCH_ADDR + GRUB_MEMORY_MACHINE_SCRATCH_SIZE \ (GRUB_MEMORY_MACHINE_SCRATCH_ADDR + GRUB_MEMORY_MACHINE_SCRATCH_SIZE \

View file

@ -22,7 +22,4 @@
/* The size of boot.img. */ /* The size of boot.img. */
#define GRUB_BOOT_MACHINE_SIZE (0x100000 - GRUB_BOOT_MACHINE_LINK_ADDR) #define GRUB_BOOT_MACHINE_SIZE (0x100000 - GRUB_BOOT_MACHINE_LINK_ADDR)
/* The offset of GRUB_CORE_ENTRY_ADDR. */
#define GRUB_BOOT_MACHINE_CORE_ENTRY_ADDR 0x4
#endif #endif

View file

@ -19,17 +19,7 @@
#ifndef GRUB_KERNEL_MACHINE_HEADER #ifndef GRUB_KERNEL_MACHINE_HEADER
#define GRUB_KERNEL_MACHINE_HEADER 1 #define GRUB_KERNEL_MACHINE_HEADER 1
/* The offset of GRUB_CORE_ENTRY_ADDR. */ #include <grub/offsets.h>
#define GRUB_KERNEL_MACHINE_CORE_ENTRY_ADDR 0x8
/* The offset of GRUB_KERNEL_IMAGE_SIZE. */
#define GRUB_KERNEL_MACHINE_KERNEL_IMAGE_SIZE 0xc
/* The offset of GRUB_PREFIX. */
#define GRUB_KERNEL_MACHINE_PREFIX 0x10
/* End of the data section. */
#define GRUB_KERNEL_MACHINE_DATA_END 0x50
#ifndef ASM_FILE #ifndef ASM_FILE
@ -44,10 +34,6 @@ extern grub_int32_t grub_kernel_image_size;
/* The total size of module images following the kernel. */ /* The total size of module images following the kernel. */
extern grub_int32_t grub_total_module_size; extern grub_int32_t grub_total_module_size;
/* The prefix which points to the directory where GRUB modules and its
configuration file are located. */
extern char grub_prefix[];
#endif /* ! ASM_FILE */ #endif /* ! ASM_FILE */
#endif /* ! GRUB_KERNEL_MACHINE_HEADER */ #endif /* ! GRUB_KERNEL_MACHINE_HEADER */

View file

@ -42,19 +42,33 @@ struct grub_module_header
/* "gmim" (GRUB Module Info Magic). */ /* "gmim" (GRUB Module Info Magic). */
#define GRUB_MODULE_MAGIC 0x676d696d #define GRUB_MODULE_MAGIC 0x676d696d
struct grub_module_info struct grub_module_info32
{ {
/* Magic number so we know we have modules present. */ /* Magic number so we know we have modules present. */
grub_uint32_t magic; grub_uint32_t magic;
#if GRUB_TARGET_SIZEOF_VOID_P == 8
grub_uint32_t padding;
#endif
/* The offset of the modules. */ /* The offset of the modules. */
grub_target_off_t offset; grub_uint32_t offset;
/* The size of all modules plus this header. */ /* The size of all modules plus this header. */
grub_target_size_t size; grub_uint32_t size;
}; };
struct grub_module_info64
{
/* Magic number so we know we have modules present. */
grub_uint32_t magic;
grub_uint32_t padding;
/* The offset of the modules. */
grub_uint64_t offset;
/* The size of all modules plus this header. */
grub_uint64_t size;
};
#if GRUB_TARGET_SIZEOF_VOID_P == 8
#define grub_module_info grub_module_info64
#else
#define grub_module_info grub_module_info32
#endif
extern grub_addr_t grub_arch_modules_addr (void); extern grub_addr_t grub_arch_modules_addr (void);
extern void EXPORT_FUNC(grub_module_iterate) (int (*hook) (struct grub_module_header *)); extern void EXPORT_FUNC(grub_module_iterate) (int (*hook) (struct grub_module_header *));
@ -76,4 +90,8 @@ void grub_machine_set_prefix (void);
/* Register all the exported symbols. This is automatically generated. */ /* Register all the exported symbols. This is automatically generated. */
void grub_register_exported_symbols (void); void grub_register_exported_symbols (void);
#if ! defined (ASM_FILE) && !defined (GRUB_MACHINE_EMU)
extern char grub_prefix[];
#endif
#endif /* ! GRUB_KERNEL_HEADER */ #endif /* ! GRUB_KERNEL_HEADER */

View file

@ -1,65 +0,0 @@
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2005,2006,2007,2008 Free Software Foundation, Inc.
*
* GRUB 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 3 of the License, or
* (at your option) any later version.
*
* GRUB 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 GRUB. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef GRUB_KERNEL_CPU_HEADER
#define GRUB_KERNEL_CPU_HEADER 1
#define GRUB_MOD_ALIGN 0x1
/* Non-zero value is only needed for PowerMacs. */
#define GRUB_MOD_GAP 0x0
#define GRUB_KERNEL_MACHINE_LINK_ALIGN 32
#define GRUB_KERNEL_CPU_RAW_SIZE 0x200
#define GRUB_KERNEL_CPU_COMPRESSED_SIZE 0x8
#define GRUB_KERNEL_CPU_TOTAL_MODULE_SIZE 0xc
#define GRUB_KERNEL_CPU_KERNEL_IMAGE_SIZE 0x10
#define GRUB_KERNEL_CPU_PREFIX GRUB_KERNEL_CPU_RAW_SIZE
#define GRUB_KERNEL_CPU_DATA_END GRUB_KERNEL_CPU_RAW_SIZE + 0x48
#define GRUB_KERNEL_MACHINE_RAW_SIZE GRUB_KERNEL_CPU_RAW_SIZE
#define GRUB_KERNEL_MACHINE_PREFIX GRUB_KERNEL_CPU_PREFIX
#define GRUB_KERNEL_MACHINE_DATA_END GRUB_KERNEL_CPU_DATA_END
#define GRUB_KERNEL_MACHINE_KERNEL_IMAGE_SIZE GRUB_KERNEL_CPU_KERNEL_IMAGE_SIZE
#define GRUB_KERNEL_MACHINE_TOTAL_MODULE_SIZE GRUB_KERNEL_CPU_TOTAL_MODULE_SIZE
#define GRUB_KERNEL_MACHINE_COMPRESSED_SIZE GRUB_KERNEL_CPU_COMPRESSED_SIZE
#define GRUB_PLATFORM_IMAGE_FORMATS "raw, elf"
#define GRUB_PLATFORM_IMAGE_DEFAULT_FORMAT "raw"
#define GRUB_PLATFORM_IMAGE_DEFAULT GRUB_PLATFORM_IMAGE_RAW
#ifndef ASM_FILE
typedef enum {
GRUB_PLATFORM_IMAGE_RAW,
GRUB_PLATFORM_IMAGE_ELF
}
grub_platform_image_format_t;
#define GRUB_PLATFORM_IMAGE_RAW GRUB_PLATFORM_IMAGE_RAW
#define GRUB_PLATFORM_IMAGE_ELF GRUB_PLATFORM_IMAGE_ELF
/* The prefix which points to the directory where GRUB modules and its
configuration file are located. */
extern char grub_prefix[];
#endif
#endif

View file

@ -27,10 +27,6 @@
void EXPORT_FUNC (grub_reboot) (void); void EXPORT_FUNC (grub_reboot) (void);
void EXPORT_FUNC (grub_halt) (void); void EXPORT_FUNC (grub_halt) (void);
/* The prefix which points to the directory where GRUB modules and its
configuration file are located. */
extern char grub_prefix[];
#endif #endif
#endif /* ! GRUB_KERNEL_MACHINE_HEADER */ #endif /* ! GRUB_KERNEL_MACHINE_HEADER */

View file

@ -20,7 +20,6 @@
#define GRUB_KERNEL_MACHINE_HEADER 1 #define GRUB_KERNEL_MACHINE_HEADER 1
#include <grub/symbol.h> #include <grub/symbol.h>
#include <grub/cpu/kernel.h>
#ifndef ASM_FILE #ifndef ASM_FILE

View file

@ -0,0 +1,173 @@
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2002,2003,2007,2008 Free Software Foundation, Inc.
*
* GRUB 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 3 of the License, or
* (at your option) any later version.
*
* GRUB 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 GRUB. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef OFFSETS_HEADER
#define OFFSETS_HEADER 1
/* The offset of GRUB_TOTAL_MODULE_SIZE. */
#define GRUB_KERNEL_I386_PC_TOTAL_MODULE_SIZE 0x8
/* The offset of GRUB_KERNEL_IMAGE_SIZE. */
#define GRUB_KERNEL_I386_PC_KERNEL_IMAGE_SIZE 0xc
/* The offset of GRUB_COMPRESSED_SIZE. */
#define GRUB_KERNEL_I386_PC_COMPRESSED_SIZE 0x10
/* The offset of GRUB_INSTALL_DOS_PART. */
#define GRUB_KERNEL_I386_PC_INSTALL_DOS_PART 0x14
/* The offset of GRUB_INSTALL_BSD_PART. */
#define GRUB_KERNEL_I386_PC_INSTALL_BSD_PART 0x18
/* The offset of GRUB_PREFIX. */
#define GRUB_KERNEL_I386_PC_PREFIX 0x1c
/* End of the data section. */
#define GRUB_KERNEL_I386_PC_DATA_END 0x5c
/* The size of the first region which won't be compressed. */
#define GRUB_KERNEL_I386_PC_RAW_SIZE (GRUB_KERNEL_I386_PC_DATA_END + 0x5F0)
/* The segment where the kernel is loaded. */
#define GRUB_BOOT_I386_PC_KERNEL_SEG 0x800
#define GRUB_KERNEL_I386_PC_LINK_ADDR 0x8200
/* The upper memory area (starting at 640 kiB). */
#define GRUB_MEMORY_I386_PC_UPPER 0xa0000
#define GRUB_MEMORY_I386_QEMU_UPPER GRUB_MEMORY_I386_PC_UPPER
/* The offset of GRUB_CORE_ENTRY_ADDR. */
#define GRUB_BOOT_I386_QEMU_CORE_ENTRY_ADDR 0x4
/* The offset of GRUB_CORE_ENTRY_ADDR. */
#define GRUB_KERNEL_I386_QEMU_CORE_ENTRY_ADDR 0x8
/* The offset of GRUB_KERNEL_IMAGE_SIZE. */
#define GRUB_KERNEL_I386_QEMU_KERNEL_IMAGE_SIZE 0xc
/* The offset of GRUB_PREFIX. */
#define GRUB_KERNEL_I386_QEMU_PREFIX 0x10
/* End of the data section. */
#define GRUB_KERNEL_I386_QEMU_DATA_END 0x50
#define GRUB_KERNEL_I386_QEMU_LINK_ADDR 0x8200
/* The offset of GRUB_TOTAL_MODULE_SIZE. */
#define GRUB_KERNEL_SPARC64_IEEE1275_TOTAL_MODULE_SIZE 0x8
/* The offset of GRUB_KERNEL_IMAGE_SIZE. */
#define GRUB_KERNEL_SPARC64_IEEE1275_KERNEL_IMAGE_SIZE 0xc
/* The offset of GRUB_COMPRESSED_SIZE. */
#define GRUB_KERNEL_SPARC64_IEEE1275_COMPRESSED_SIZE 0x10
/* The offset of GRUB_PREFIX. */
#define GRUB_KERNEL_SPARC64_IEEE1275_PREFIX 0x14
/* End of the data section. */
#define GRUB_KERNEL_SPARC64_IEEE1275_DATA_END 0x114
#define GRUB_BOOT_SPARC64_IEEE1275_LIST_SIZE 12
#define GRUB_BOOT_SPARC64_IEEE1275_IMAGE_ADDRESS 0x4400
#define GRUB_KERNEL_SPARC64_IEEE1275_RAW_SIZE 0
#define GRUB_KERNEL_SPARC64_IEEE1275_LINK_ADDR 0x4400
#define GRUB_KERNEL_POWERPC_IEEE1275_PREFIX 0x4
#define GRUB_KERNEL_POWERPC_IEEE1275_DATA_END 0x44
#define GRUB_KERNEL_POWERPC_IEEE1275_LINK_ALIGN 4
#define GRUB_KERNEL_POWERPC_IEEE1275_LINK_ADDR 0x200000
#define GRUB_KERNEL_MIPS_YEELOONG_LINK_ADDR 0x80200000
#define GRUB_KERNEL_MIPS_YEELOONG_LINK_ALIGN 32
#define GRUB_KERNEL_MIPS_YEELOONG_RAW_SIZE 0x200
#define GRUB_KERNEL_MIPS_YEELOONG_COMPRESSED_SIZE 0x8
#define GRUB_KERNEL_MIPS_YEELOONG_TOTAL_MODULE_SIZE 0xc
#define GRUB_KERNEL_MIPS_YEELOONG_KERNEL_IMAGE_SIZE 0x10
#define GRUB_KERNEL_MIPS_YEELOONG_PREFIX GRUB_KERNEL_MIPS_YEELOONG_RAW_SIZE
#define GRUB_KERNEL_MIPS_YEELOONG_DATA_END GRUB_KERNEL_MIPS_YEELOONG_RAW_SIZE + 0x48
/* The offset of GRUB_PREFIX. */
#define GRUB_KERNEL_I386_EFI_PREFIX 0x8
/* End of the data section. */
#define GRUB_KERNEL_I386_EFI_DATA_END 0x50
/* The offset of GRUB_PREFIX. */
#define GRUB_KERNEL_X86_64_EFI_PREFIX 0x8
/* End of the data section. */
#define GRUB_KERNEL_X86_64_EFI_DATA_END 0x50
#define GRUB_KERNEL_I386_COREBOOT_PREFIX 0x2
#define GRUB_KERNEL_I386_COREBOOT_DATA_END 0x42
#define GRUB_KERNEL_I386_COREBOOT_LINK_ADDR 0x8200
#define GRUB_KERNEL_I386_IEEE1275_PREFIX 0x2
#define GRUB_KERNEL_I386_IEEE1275_DATA_END 0x42
#define GRUB_KERNEL_I386_IEEE1275_LINK_ADDR 0x10000
#define GRUB_KERNEL_I386_IEEE1275_MOD_ALIGN 0x1000
#define GRUB_KERNEL_I386_COREBOOT_MOD_ALIGN 0x1
/* Non-zero value is only needed for PowerMacs. */
#define GRUB_KERNEL_I386_IEEE1275_MOD_GAP 0x0
#define GRUB_KERNEL_I386_COREBOOT_MOD_GAP 0x0
#define GRUB_KERNEL_POWERPC_IEEE1275_MOD_ALIGN 0x1000
#define GRUB_KERNEL_MIPS_YEELOONG_MOD_ALIGN 0x1
/* Minimal gap between _end and the start of the modules. It's a hack
for PowerMac to prevent "CLAIM failed" error. The real fix is to
rewrite grub-mkimage to generate valid ELF files. */
#define GRUB_KERNEL_POWERPC_IEEE1275_MOD_GAP 0x8000
#ifdef MACHINE
#define GRUB_OFFSETS_CONCAT_(a,b,c) a ## b ## c
#define GRUB_OFFSETS_CONCAT(a,b,c) GRUB_OFFSETS_CONCAT_(a,b,c)
#define GRUB_KERNEL_MACHINE_MOD_ALIGN GRUB_OFFSETS_CONCAT (GRUB_KERNEL_, MACHINE, _MOD_ALIGN)
#define GRUB_KERNEL_MACHINE_MOD_GAP GRUB_OFFSETS_CONCAT (GRUB_KERNEL_, MACHINE, _MOD_GAP)
#define GRUB_KERNEL_MACHINE_TOTAL_MODULE_SIZE GRUB_OFFSETS_CONCAT (GRUB_KERNEL_, MACHINE, _TOTAL_MODULE_SIZE)
#define GRUB_KERNEL_MACHINE_KERNEL_IMAGE_SIZE GRUB_OFFSETS_CONCAT (GRUB_KERNEL_, MACHINE, _KERNEL_IMAGE_SIZE)
#define GRUB_KERNEL_MACHINE_COMPRESSED_SIZE GRUB_OFFSETS_CONCAT (GRUB_KERNEL_, MACHINE, _COMPRESSED_SIZE)
#define GRUB_KERNEL_MACHINE_PREFIX GRUB_OFFSETS_CONCAT (GRUB_KERNEL_, MACHINE, _PREFIX)
#define GRUB_KERNEL_MACHINE_DATA_END GRUB_OFFSETS_CONCAT (GRUB_KERNEL_, MACHINE, _DATA_END)
#define GRUB_BOOT_MACHINE_KERNEL_SEG GRUB_OFFSETS_CONCAT (GRUB_BOOT_, MACHINE, _KERNEL_SEG)
#define GRUB_MEMORY_MACHINE_UPPER GRUB_OFFSETS_CONCAT (GRUB_MEMORY_, MACHINE, _UPPER)
#define GRUB_KERNEL_MACHINE_RAW_SIZE GRUB_OFFSETS_CONCAT (GRUB_KERNEL_, MACHINE, _RAW_SIZE)
#define GRUB_KERNEL_MACHINE_INSTALL_BSD_PART GRUB_OFFSETS_CONCAT (GRUB_KERNEL_, MACHINE, _INSTALL_BSD_PART)
#define GRUB_KERNEL_MACHINE_INSTALL_DOS_PART GRUB_OFFSETS_CONCAT (GRUB_KERNEL_, MACHINE, _INSTALL_DOS_PART)
#endif
#ifndef ASM_FILE
struct grub_pc_bios_boot_blocklist
{
grub_uint64_t start;
grub_uint16_t len;
grub_uint16_t segment;
} __attribute__ ((packed));
#endif
#endif

View file

@ -1,32 +0,0 @@
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2005,2006,2007,2008 Free Software Foundation, Inc.
*
* GRUB 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 3 of the License, or
* (at your option) any later version.
*
* GRUB 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 GRUB. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef GRUB_KERNEL_MACHINE_HEADER
#define GRUB_KERNEL_MACHINE_HEADER 1
#include <grub/symbol.h>
#ifndef ASM_FILE
/* The prefix which points to the directory where GRUB modules and its
configuration file are located. */
extern char grub_prefix[];
#endif
#endif /* ! GRUB_KERNEL_MACHINE_HEADER */

View file

@ -19,14 +19,4 @@
#ifndef GRUB_KERNEL_CPU_HEADER #ifndef GRUB_KERNEL_CPU_HEADER
#define GRUB_KERNEL_CPU_HEADER 1 #define GRUB_KERNEL_CPU_HEADER 1
#define GRUB_MOD_ALIGN 0x1000
/* Minimal gap between _end and the start of the modules. It's a hack
for PowerMac to prevent "CLAIM failed" error. The real fix is to
rewrite grub-mkimage to generate valid ELF files. */
#define GRUB_MOD_GAP 0x8000
#define GRUB_KERNEL_CPU_PREFIX 0x4
#define GRUB_KERNEL_CPU_DATA_END 0x44
#endif #endif

View file

@ -50,10 +50,6 @@
#define GRUB_BOOT_MACHINE_CODE_END \ #define GRUB_BOOT_MACHINE_CODE_END \
(0x1fc - GRUB_BOOT_AOUT_HEADER_SIZE) (0x1fc - GRUB_BOOT_AOUT_HEADER_SIZE)
#define GRUB_BOOT_MACHINE_LIST_SIZE 12
#define GRUB_BOOT_MACHINE_IMAGE_ADDRESS 0x4400
#define GRUB_BOOT_MACHINE_KERNEL_ADDR 0x4200 #define GRUB_BOOT_MACHINE_KERNEL_ADDR 0x4200
#endif /* ! BOOT_MACHINE_HEADER */ #endif /* ! BOOT_MACHINE_HEADER */

View file

@ -19,44 +19,10 @@
#ifndef GRUB_KERNEL_MACHINE_HEADER #ifndef GRUB_KERNEL_MACHINE_HEADER
#define GRUB_KERNEL_MACHINE_HEADER 1 #define GRUB_KERNEL_MACHINE_HEADER 1
#define GRUB_MOD_ALIGN 0x2000
/* Non-zero value is only needed for PowerMacs. */
#define GRUB_MOD_GAP 0x0
/* The offset of GRUB_TOTAL_MODULE_SIZE. */
#define GRUB_KERNEL_MACHINE_TOTAL_MODULE_SIZE 0x8
/* The offset of GRUB_KERNEL_IMAGE_SIZE. */
#define GRUB_KERNEL_MACHINE_KERNEL_IMAGE_SIZE 0xc
/* The offset of GRUB_COMPRESSED_SIZE. */
#define GRUB_KERNEL_MACHINE_COMPRESSED_SIZE 0x10
/* The offset of GRUB_PREFIX. */
#define GRUB_KERNEL_MACHINE_PREFIX 0x14
/* End of the data section. */
#define GRUB_KERNEL_MACHINE_DATA_END 0x114
#define GRUB_KERNEL_MACHINE_RAW_SIZE 0
#define GRUB_KERNEL_MACHINE_STACK_SIZE 0x40000 #define GRUB_KERNEL_MACHINE_STACK_SIZE 0x40000
#define GRUB_PLATFORM_IMAGE_FORMATS "raw, aout"
#define GRUB_PLATFORM_IMAGE_DEFAULT_FORMAT "raw"
#define GRUB_PLATFORM_IMAGE_DEFAULT GRUB_PLATFORM_IMAGE_RAW
#ifndef ASM_FILE #ifndef ASM_FILE
typedef enum {
GRUB_PLATFORM_IMAGE_RAW,
GRUB_PLATFORM_IMAGE_AOUT
}
grub_platform_image_format_t;
#define GRUB_PLATFORM_IMAGE_RAW GRUB_PLATFORM_IMAGE_RAW
#define GRUB_PLATFORM_IMAGE_AOUT GRUB_PLATFORM_IMAGE_AOUT
#include <grub/symbol.h> #include <grub/symbol.h>
#include <grub/types.h> #include <grub/types.h>
@ -66,10 +32,6 @@ extern grub_int32_t grub_kernel_image_size;
/* The total size of module images following the kernel. */ /* The total size of module images following the kernel. */
extern grub_int32_t grub_total_module_size; extern grub_int32_t grub_total_module_size;
/* The prefix which points to the directory where GRUB modules and its
configuration file are located. */
extern char grub_prefix[];
#endif /* ! ASM_FILE */ #endif /* ! ASM_FILE */
#endif /* ! GRUB_KERNEL_MACHINE_HEADER */ #endif /* ! GRUB_KERNEL_MACHINE_HEADER */

View file

@ -1,30 +0,0 @@
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2005,2006,2007,2008 Free Software Foundation, Inc.
*
* GRUB 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 3 of the License, or
* (at your option) any later version.
*
* GRUB 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 GRUB. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef GRUB_KERNEL_CPU_HEADER
#define GRUB_KERNEL_CPU_HEADER 1
#define GRUB_MOD_ALIGN 0x2000
/* Non-zero value is only needed for PowerMacs. */
#define GRUB_MOD_GAP 0x0
#define GRUB_KERNEL_CPU_PREFIX 0x2
#define GRUB_KERNEL_CPU_DATA_END 0x42
#endif

View file

@ -178,21 +178,6 @@ static inline grub_uint64_t grub_swap_bytes64(grub_uint64_t x)
# define grub_be_to_cpu16(x) ((grub_uint16_t) (x)) # define grub_be_to_cpu16(x) ((grub_uint16_t) (x))
# define grub_be_to_cpu32(x) ((grub_uint32_t) (x)) # define grub_be_to_cpu32(x) ((grub_uint32_t) (x))
# define grub_be_to_cpu64(x) ((grub_uint64_t) (x)) # define grub_be_to_cpu64(x) ((grub_uint64_t) (x))
# ifdef GRUB_TARGET_WORDS_BIGENDIAN
# define grub_target_to_host16(x) ((grub_uint16_t) (x))
# define grub_target_to_host32(x) ((grub_uint32_t) (x))
# define grub_target_to_host64(x) ((grub_uint64_t) (x))
# define grub_host_to_target16(x) ((grub_uint16_t) (x))
# define grub_host_to_target32(x) ((grub_uint32_t) (x))
# define grub_host_to_target64(x) ((grub_uint64_t) (x))
# else /* ! GRUB_TARGET_WORDS_BIGENDIAN */
# define grub_target_to_host16(x) grub_swap_bytes16(x)
# define grub_target_to_host32(x) grub_swap_bytes32(x)
# define grub_target_to_host64(x) grub_swap_bytes64(x)
# define grub_host_to_target16(x) grub_swap_bytes16(x)
# define grub_host_to_target32(x) grub_swap_bytes32(x)
# define grub_host_to_target64(x) grub_swap_bytes64(x)
# endif
#else /* ! WORDS_BIGENDIAN */ #else /* ! WORDS_BIGENDIAN */
# define grub_cpu_to_le16(x) ((grub_uint16_t) (x)) # define grub_cpu_to_le16(x) ((grub_uint16_t) (x))
# define grub_cpu_to_le32(x) ((grub_uint32_t) (x)) # define grub_cpu_to_le32(x) ((grub_uint32_t) (x))
@ -206,27 +191,6 @@ static inline grub_uint64_t grub_swap_bytes64(grub_uint64_t x)
# define grub_be_to_cpu16(x) grub_swap_bytes16(x) # define grub_be_to_cpu16(x) grub_swap_bytes16(x)
# define grub_be_to_cpu32(x) grub_swap_bytes32(x) # define grub_be_to_cpu32(x) grub_swap_bytes32(x)
# define grub_be_to_cpu64(x) grub_swap_bytes64(x) # define grub_be_to_cpu64(x) grub_swap_bytes64(x)
# ifdef GRUB_TARGET_WORDS_BIGENDIAN
# define grub_target_to_host16(x) grub_swap_bytes16(x)
# define grub_target_to_host32(x) grub_swap_bytes32(x)
# define grub_target_to_host64(x) grub_swap_bytes64(x)
# define grub_host_to_target16(x) grub_swap_bytes16(x)
# define grub_host_to_target32(x) grub_swap_bytes32(x)
# define grub_host_to_target64(x) grub_swap_bytes64(x)
# else /* ! GRUB_TARGET_WORDS_BIGENDIAN */
# define grub_target_to_host16(x) ((grub_uint16_t) (x))
# define grub_target_to_host32(x) ((grub_uint32_t) (x))
# define grub_target_to_host64(x) ((grub_uint64_t) (x))
# define grub_host_to_target16(x) ((grub_uint16_t) (x))
# define grub_host_to_target32(x) ((grub_uint32_t) (x))
# define grub_host_to_target64(x) ((grub_uint64_t) (x))
# endif
#endif /* ! WORDS_BIGENDIAN */ #endif /* ! WORDS_BIGENDIAN */
#if GRUB_TARGET_SIZEOF_VOID_P == 8
# define grub_host_to_target_addr(x) grub_host_to_target64(x)
#else
# define grub_host_to_target_addr(x) grub_host_to_target32(x)
#endif
#endif /* ! GRUB_TYPES_HEADER */ #endif /* ! GRUB_TYPES_HEADER */

View file

@ -1,33 +0,0 @@
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2002,2003,2007 Free Software Foundation, Inc.
*
* GRUB 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 3 of the License, or
* (at your option) any later version.
*
* GRUB 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 GRUB. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef GRUB_MACHINE_KERNEL_HEADER
#define GRUB_MACHINE_KERNEL_HEADER 1
/* The prefix which points to the directory where GRUB modules and its
configuration file are located. */
extern char grub_prefix[];
/* The offset of GRUB_PREFIX. */
#define GRUB_KERNEL_MACHINE_PREFIX 0x8
/* End of the data section. */
#define GRUB_KERNEL_MACHINE_DATA_END 0x50
#endif /* ! GRUB_MACHINE_KERNEL_HEADER */

View file

@ -1 +0,0 @@
#include <grub/i386/kernel.h>

View file

@ -24,7 +24,7 @@
#include <grub/misc.h> #include <grub/misc.h>
#include <grub/env.h> #include <grub/env.h>
#include <grub/mm.h> #include <grub/mm.h>
#include <grub/machine/kernel.h> #include <grub/kernel.h>
void void
grub_efi_init (void) grub_efi_init (void)
@ -42,39 +42,58 @@ grub_efi_init (void)
void void
grub_efi_set_prefix (void) grub_efi_set_prefix (void)
{ {
grub_efi_loaded_image_t *image; grub_efi_loaded_image_t *image = NULL;
char *device = NULL;
char *path = NULL;
image = grub_efi_get_loaded_image (grub_efi_image_handle); {
if (image) char *pptr = NULL;
if (grub_prefix[0] == '(')
{
pptr = grub_strrchr (grub_prefix, ')');
if (pptr)
{
device = grub_strndup (grub_prefix + 1, pptr - grub_prefix - 1);
pptr++;
}
}
if (!pptr)
pptr = grub_prefix;
if (pptr[0])
path = grub_strdup (pptr);
}
if (!device || !path)
image = grub_efi_get_loaded_image (grub_efi_image_handle);
if (image && !device)
device = grub_efidisk_get_device_name (image->device_handle);
if (image && !path)
{ {
char *device; char *p;
char *file;
device = grub_efidisk_get_device_name (image->device_handle); path = grub_efi_get_filename (image->file_path);
file = grub_efi_get_filename (image->file_path);
if (device && file) /* Get the directory. */
{ p = grub_strrchr (path, '/');
char *p; if (p)
char *prefix; *p = '\0';
/* Get the directory. */
p = grub_strrchr (file, '/');
if (p)
*p = '\0';
prefix = grub_xasprintf ("(%s)%s", device, file);
if (prefix)
{
grub_env_set ("prefix", prefix);
grub_free (prefix);
}
}
grub_free (device);
grub_free (file);
} }
if (device && path)
{
char *prefix;
prefix = grub_xasprintf ("(%s)%s", device, path);
if (prefix)
{
grub_env_set ("prefix", prefix);
grub_free (prefix);
}
}
grub_free (device);
grub_free (path);
} }
void void

View file

@ -98,6 +98,10 @@ struct hd_geometry
# include <sys/disk.h> # include <sys/disk.h>
#endif #endif
#ifdef HAVE_DEVICE_MAPPER
# include <libdevmapper.h>
#endif
#if defined(__NetBSD__) #if defined(__NetBSD__)
# include <sys/ioctl.h> # include <sys/ioctl.h>
# include <sys/disklabel.h> /* struct disklabel */ # include <sys/disklabel.h> /* struct disklabel */
@ -312,6 +316,138 @@ grub_util_biosdisk_open (const char *name, grub_disk_t disk)
return GRUB_ERR_NONE; return GRUB_ERR_NONE;
} }
#ifdef HAVE_DEVICE_MAPPER
static int
device_is_mapped (const char *dev)
{
struct stat st;
if (stat (dev, &st) < 0)
return 0;
return dm_is_dm_major (major (st.st_rdev));
}
#endif /* HAVE_DEVICE_MAPPER */
#if defined(__linux__) || defined(__CYGWIN__) || defined(__NetBSD__)
static grub_disk_addr_t
find_partition_start (const char *dev)
{
int fd;
# if !defined(__NetBSD__)
struct hd_geometry hdg;
# else /* defined(__NetBSD__) */
struct disklabel label;
int index;
# endif /* !defined(__NetBSD__) */
# ifdef HAVE_DEVICE_MAPPER
if (device_is_mapped (dev)) {
struct dm_task *task = NULL;
grub_uint64_t start, length;
char *target_type, *params, *space;
grub_disk_addr_t partition_start;
/* If any device-mapper operation fails, we fall back silently to
HDIO_GETGEO. */
task = dm_task_create (DM_DEVICE_TABLE);
if (! task)
{
grub_dprintf ("hostdisk", "dm_task_create failed\n");
goto devmapper_fail;
}
if (! dm_task_set_name (task, dev))
{
grub_dprintf ("hostdisk", "dm_task_set_name failed\n");
goto devmapper_fail;
}
if (! dm_task_run (task))
{
grub_dprintf ("hostdisk", "dm_task_run failed\n");
goto devmapper_fail;
}
dm_get_next_target (task, NULL, &start, &length, &target_type, &params);
if (! target_type)
{
grub_dprintf ("hostdisk", "no dm target\n");
goto devmapper_fail;
}
if (strcmp (target_type, "linear") != 0)
{
grub_dprintf ("hostdisk", "ignoring dm target %s (not linear)\n",
target_type);
goto devmapper_fail;
}
if (! params)
{
grub_dprintf ("hostdisk", "no dm params\n");
goto devmapper_fail;
}
/* The params string for a linear target looks like this:
DEVICE-NAME START-SECTOR
Parse this out. */
space = strchr (params, ' ');
if (! space)
goto devmapper_fail;
errno = 0;
partition_start = strtoull (space + 1, NULL, 10);
if (errno == 0)
{
grub_dprintf ("hostdisk", "dm %s starts at %llu\n",
dev, (unsigned long long) partition_start);
dm_task_destroy (task);
return partition_start;
}
devmapper_fail:
if (task)
dm_task_destroy (task);
}
# endif /* HAVE_DEVICE_MAPPER */
fd = open (dev, O_RDONLY);
if (fd == -1)
{
grub_error (GRUB_ERR_BAD_DEVICE,
"cannot open `%s' while attempting to get disk geometry", dev);
return 0;
}
# if !defined(__NetBSD__)
if (ioctl (fd, HDIO_GETGEO, &hdg))
# else /* defined(__NetBSD__) */
configure_device_driver (fd);
if (ioctl (fd, DIOCGDINFO, &label) == -1)
# endif /* !defined(__NetBSD__) */
{
grub_error (GRUB_ERR_BAD_DEVICE,
"cannot get disk geometry of `%s'", dev);
close (fd);
return 0;
}
close (fd);
# if !defined(__NetBSD__)
return hdg.start;
# else /* defined(__NetBSD__) */
index = dev[strlen(dev) - 1] - 'a';
if (index >= label.d_npartitions)
{
grub_error (GRUB_ERR_BAD_DEVICE,
"no disk label entry for `%s'", dev);
return 0;
}
return (grub_disk_addr_t) label.d_partitions[index].p_offset;
# endif /* !defined(__NetBSD__) */
}
#endif /* __linux__ || __CYGWIN__ */
#ifdef __linux__ #ifdef __linux__
/* Cache of partition start sectors for each disk. */ /* Cache of partition start sectors for each disk. */
struct linux_partition_cache struct linux_partition_cache
@ -365,28 +501,26 @@ linux_find_partition (char *dev, unsigned long sector)
for (i = 1; i < 10000; i++) for (i = 1; i < 10000; i++)
{ {
int fd; int fd;
struct hd_geometry hdg; grub_disk_addr_t start;
sprintf (p, format, i); sprintf (p, format, i);
fd = open (real_dev, O_RDONLY); fd = open (real_dev, O_RDONLY);
if (fd == -1) if (fd == -1)
return 0; return 0;
if (ioctl (fd, HDIO_GETGEO, &hdg))
{
close (fd);
return 0;
}
close (fd); close (fd);
if (hdg.start == sector) start = find_partition_start (real_dev);
/* We don't care about errors here. */
grub_errno = GRUB_ERR_NONE;
if (start == sector)
{ {
struct linux_partition_cache *new_cache_item; struct linux_partition_cache *new_cache_item;
new_cache_item = xmalloc (sizeof *new_cache_item); new_cache_item = xmalloc (sizeof *new_cache_item);
new_cache_item->dev = xstrdup (dev); new_cache_item->dev = xstrdup (dev);
new_cache_item->start = hdg.start; new_cache_item->start = start;
new_cache_item->partno = i; new_cache_item->partno = i;
grub_list_push (GRUB_AS_LIST_P (&linux_partition_cache_list), grub_list_push (GRUB_AS_LIST_P (&linux_partition_cache_list),
GRUB_AS_LIST (new_cache_item)); GRUB_AS_LIST (new_cache_item));
@ -877,7 +1011,7 @@ make_device_name (int drive, int dos_part, int bsd_part)
} }
static char * static char *
convert_system_partition_to_system_disk (const char *os_dev) convert_system_partition_to_system_disk (const char *os_dev, struct stat *st)
{ {
#if defined(__linux__) #if defined(__linux__)
char *path = xmalloc (PATH_MAX); char *path = xmalloc (PATH_MAX);
@ -995,6 +1129,96 @@ convert_system_partition_to_system_disk (const char *os_dev)
p[4] = '\0'; p[4] = '\0';
return path; return path;
} }
#ifdef HAVE_DEVICE_MAPPER
/* If this is a DM-RAID device. */
if ((strncmp ("mapper/", p, 7) == 0))
{
static struct dm_tree *tree = NULL;
uint32_t maj, min;
struct dm_tree_node *node, *child;
void *handle;
const char *node_uuid, *mapper_name, *child_uuid, *child_name;
if (! tree)
tree = dm_tree_create ();
if (! tree)
{
grub_dprintf ("hostdisk", "dm_tree_create failed\n");
return NULL;
}
maj = major (st->st_rdev);
min = minor (st->st_rdev);
if (! dm_tree_add_dev (tree, maj, min))
{
grub_dprintf ("hostdisk", "dm_tree_add_dev failed\n");
return NULL;
}
node = dm_tree_find_node (tree, maj, min);
if (! node)
{
grub_dprintf ("hostdisk", "dm_tree_find_node failed\n");
return NULL;
}
node_uuid = dm_tree_node_get_uuid (node);
if (! node_uuid)
{
grub_dprintf ("hostdisk", "%s has no DM uuid\n", path);
return NULL;
}
else if (strncmp (node_uuid, "DMRAID-", 7) != 0)
{
grub_dprintf ("hostdisk", "%s is not DM-RAID\n", path);
return NULL;
}
handle = NULL;
mapper_name = NULL;
/* Counter-intuitively, device-mapper refers to the disk-like
device containing a DM-RAID partition device as a "child" of
the partition device. */
child = dm_tree_next_child (&handle, node, 0);
if (! child)
{
grub_dprintf ("hostdisk", "%s has no DM children\n", path);
goto devmapper_out;
}
child_uuid = dm_tree_node_get_uuid (child);
if (! child_uuid)
{
grub_dprintf ("hostdisk", "%s child has no DM uuid\n", path);
goto devmapper_out;
}
else if (strncmp (child_uuid, "DMRAID-", 7) != 0)
{
grub_dprintf ("hostdisk", "%s child is not DM-RAID\n", path);
goto devmapper_out;
}
child_name = dm_tree_node_get_name (child);
if (! child_name)
{
grub_dprintf ("hostdisk", "%s child has no DM name\n", path);
goto devmapper_out;
}
mapper_name = child_name;
devmapper_out:
if (! mapper_name)
{
/* This is a DM-RAID disk, not a partition. */
mapper_name = dm_tree_node_get_name (node);
if (! mapper_name)
{
grub_dprintf ("hostdisk", "%s has no DM name\n", path);
return NULL;
}
}
return xasprintf ("/dev/mapper/%s", mapper_name);
}
#endif /* HAVE_DEVICE_MAPPER */
} }
return path; return path;
@ -1091,12 +1315,12 @@ device_is_wholedisk (const char *os_dev)
#endif /* defined(__NetBSD__) */ #endif /* defined(__NetBSD__) */
static int static int
find_system_device (const char *os_dev) find_system_device (const char *os_dev, struct stat *st)
{ {
unsigned int i; unsigned int i;
char *os_disk; char *os_disk;
os_disk = convert_system_partition_to_system_disk (os_dev); os_disk = convert_system_partition_to_system_disk (os_dev, st);
if (! os_disk) if (! os_disk)
return -1; return -1;
@ -1130,7 +1354,7 @@ grub_util_biosdisk_get_grub_dev (const char *os_dev)
return 0; return 0;
} }
drive = find_system_device (os_dev); drive = find_system_device (os_dev, &st);
if (drive < 0) if (drive < 0)
{ {
grub_error (GRUB_ERR_UNKNOWN_DEVICE, grub_error (GRUB_ERR_UNKNOWN_DEVICE,
@ -1138,8 +1362,8 @@ grub_util_biosdisk_get_grub_dev (const char *os_dev)
return 0; return 0;
} }
if (grub_strcmp (os_dev, convert_system_partition_to_system_disk (os_dev)) if (grub_strcmp (os_dev,
== 0) convert_system_partition_to_system_disk (os_dev, &st)) == 0)
return make_device_name (drive, -1, -1); return make_device_name (drive, -1, -1);
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__APPLE__) || defined(__NetBSD__) #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__APPLE__) || defined(__NetBSD__)
@ -1164,15 +1388,7 @@ grub_util_biosdisk_get_grub_dev (const char *os_dev)
{ {
char *name; char *name;
grub_disk_t disk; grub_disk_t disk;
int fd; grub_disk_addr_t start;
# if !defined(__NetBSD__)
struct hd_geometry hdg;
typeof (hdg.start) p_offset;
# else /* defined(__NetBSD__) */
struct disklabel label;
int index;
u_int32_t p_offset;
# endif /* !defined(__NetBSD__) */
int dos_part = -1; int dos_part = -1;
int bsd_part = -1; int bsd_part = -1;
auto int find_partition (grub_disk_t dsk, auto int find_partition (grub_disk_t dsk,
@ -1187,7 +1403,7 @@ grub_util_biosdisk_get_grub_dev (const char *os_dev)
part_start = grub_partition_get_start (partition); part_start = grub_partition_get_start (partition);
if (p_offset == part_start) if (start == part_start)
{ {
if (partition->parent) if (partition->parent)
{ {
@ -1215,49 +1431,18 @@ grub_util_biosdisk_get_grub_dev (const char *os_dev)
/* Since os_dev and convert_system_partition_to_system_disk (os_dev) are /* Since os_dev and convert_system_partition_to_system_disk (os_dev) are
* different, we know that os_dev is of the form /dev/r[wsc]d[0-9]+[a-z] * different, we know that os_dev is of the form /dev/r[wsc]d[0-9]+[a-z]
* and in particular it cannot be a floppy device. */ * and in particular it cannot be a floppy device. */
index = os_dev[strlen(os_dev) - 1] - 'a';
# endif /* !defined(__NetBSD__) */ # endif /* !defined(__NetBSD__) */
fd = open (os_dev, O_RDONLY); start = find_partition_start (os_dev);
if (fd == -1) if (grub_errno != GRUB_ERR_NONE)
{ {
grub_error (GRUB_ERR_BAD_DEVICE, "cannot open `%s' while attempting to get disk geometry", os_dev);
free (name); free (name);
return 0; return 0;
} }
# if !defined(__NetBSD__) grub_util_info ("%s starts from %lu", os_dev, start);
if (ioctl (fd, HDIO_GETGEO, &hdg))
# else /* defined(__NetBSD__) */
configure_device_driver (fd);
if (ioctl (fd, DIOCGDINFO, &label) == -1)
# endif /* !defined(__NetBSD__) */
{
grub_error (GRUB_ERR_BAD_DEVICE,
"cannot get disk geometry of `%s'", os_dev);
close (fd);
free (name);
return 0;
}
close (fd); if (start == 0 && device_is_wholedisk (os_dev))
# if !defined(__NetBSD__)
p_offset = hdg.start;
# else /* defined(__NetBSD__) */
if (index >= label.d_npartitions)
{
grub_error (GRUB_ERR_BAD_DEVICE,
"no disk label entry for `%s'", os_dev);
free (name);
return 0;
}
p_offset = label.d_partitions[index].p_offset;
# endif /* !defined(__NetBSD__) */
grub_util_info ("%s starts from %lu", os_dev, p_offset);
if (p_offset == 0 && device_is_wholedisk (os_dev))
return name; return name;
grub_util_info ("opening the device %s", name); grub_util_info ("opening the device %s", name);

View file

@ -9,6 +9,9 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <unistd.h> #include <unistd.h>
#ifdef HAVE_LIMITS_H
#include <limits.h>
#endif
#include <grub/mm.h> #include <grub/mm.h>
#include <grub/err.h> #include <grub/err.h>
@ -176,6 +179,19 @@ grub_get_rtc (void)
* GRUB_TICKS_PER_SECOND / 1000000)); * GRUB_TICKS_PER_SECOND / 1000000));
} }
char *
canonicalize_file_name (const char *path)
{
char *ret;
#ifdef PATH_MAX
ret = xmalloc (PATH_MAX);
(void) realpath (path, ret);
#else
ret = realpath (path, NULL);
#endif
return ret;
}
#ifdef __CYGWIN__ #ifdef __CYGWIN__
/* Convert POSIX path to Win32 path, /* Convert POSIX path to Win32 path,
remove drive letter, replace backslashes. */ remove drive letter, replace backslashes. */

View file

@ -22,7 +22,6 @@
#include <grub/machine/init.h> #include <grub/machine/init.h>
#include <grub/machine/memory.h> #include <grub/machine/memory.h>
#include <grub/machine/console.h> #include <grub/machine/console.h>
#include <grub/machine/kernel.h>
#include <grub/types.h> #include <grub/types.h>
#include <grub/err.h> #include <grub/err.h>
#include <grub/dl.h> #include <grub/dl.h>
@ -33,8 +32,10 @@
#include <grub/time.h> #include <grub/time.h>
#include <grub/symbol.h> #include <grub/symbol.h>
#include <grub/cpu/io.h> #include <grub/cpu/io.h>
#include <grub/cpu/kernel.h>
#include <grub/cpu/tsc.h> #include <grub/cpu/tsc.h>
#ifdef GRUB_MACHINE_QEMU
#include <grub/machine/kernel.h>
#endif
#define GRUB_FLOPPY_REG_DIGITAL_OUTPUT 0x3f2 #define GRUB_FLOPPY_REG_DIGITAL_OUTPUT 0x3f2
@ -146,6 +147,6 @@ grub_arch_modules_addr (void)
#ifdef GRUB_MACHINE_QEMU #ifdef GRUB_MACHINE_QEMU
return grub_core_entry_addr + grub_kernel_image_size; return grub_core_entry_addr + grub_kernel_image_size;
#else #else
return ALIGN_UP((grub_addr_t) _end, GRUB_MOD_ALIGN); return ALIGN_UP((grub_addr_t) _end, GRUB_KERNEL_MACHINE_MOD_ALIGN);
#endif #endif
} }

View file

@ -19,7 +19,7 @@
#include <grub/symbol.h> #include <grub/symbol.h>
#include <grub/machine/memory.h> #include <grub/machine/memory.h>
#include <grub/cpu/linux.h> #include <grub/cpu/linux.h>
#include <grub/cpu/kernel.h> #include <grub/offsets.h>
#include <multiboot.h> #include <multiboot.h>
#include <multiboot2.h> #include <multiboot2.h>
@ -42,7 +42,7 @@ _start:
* This is a special data area at a fixed offset from the beginning. * This is a special data area at a fixed offset from the beginning.
*/ */
. = _start + GRUB_KERNEL_CPU_PREFIX . = _start + GRUB_KERNEL_MACHINE_PREFIX
VARIABLE(grub_prefix) VARIABLE(grub_prefix)
/* to be filled by grub-mkimage */ /* to be filled by grub-mkimage */
@ -51,7 +51,7 @@ VARIABLE(grub_prefix)
* Leave some breathing room for the prefix. * Leave some breathing room for the prefix.
*/ */
. = _start + GRUB_KERNEL_CPU_DATA_END . = _start + GRUB_KERNEL_MACHINE_DATA_END
/* /*
* Support for booting GRUB from a Multiboot boot loader (e.g. GRUB itself). * Support for booting GRUB from a Multiboot boot loader (e.g. GRUB itself).

View file

@ -19,7 +19,6 @@
#include <grub/symbol.h> #include <grub/symbol.h>
#include <grub/machine/memory.h> #include <grub/machine/memory.h>
#include <grub/cpu/linux.h> #include <grub/cpu/linux.h>
#include <grub/cpu/kernel.h>
#include <multiboot.h> #include <multiboot.h>
#include <multiboot2.h> #include <multiboot2.h>
@ -43,7 +42,7 @@ _start:
* This is a special data area at a fixed offset from the beginning. * This is a special data area at a fixed offset from the beginning.
*/ */
. = _start + GRUB_KERNEL_CPU_PREFIX . = _start + GRUB_KERNEL_MACHINE_PREFIX
VARIABLE(grub_prefix) VARIABLE(grub_prefix)
/* to be filled by grub-mkimage */ /* to be filled by grub-mkimage */
@ -52,7 +51,7 @@ VARIABLE(grub_prefix)
* Leave some breathing room for the prefix. * Leave some breathing room for the prefix.
*/ */
. = _start + GRUB_KERNEL_CPU_DATA_END . = _start + GRUB_KERNEL_MACHINE_DATA_END
codestart: codestart:
movl %eax, EXT_C(grub_ieee1275_entry_fn) movl %eax, EXT_C(grub_ieee1275_entry_fn)

View file

@ -75,8 +75,8 @@ make_install_device (void)
ptr += grub_strlen (ptr); ptr += grub_strlen (ptr);
if (grub_install_bsd_part >= 0) if (grub_install_bsd_part >= 0)
grub_snprintf (ptr, sizeof (dev) - (ptr - dev), ",%c", grub_snprintf (ptr, sizeof (dev) - (ptr - dev), ",%u",
grub_install_bsd_part + 'a'); grub_install_bsd_part + 1);
ptr += grub_strlen (ptr); ptr += grub_strlen (ptr);
} }

View file

@ -20,6 +20,7 @@
#include <grub/machine/memory.h> #include <grub/machine/memory.h>
#include <grub/err.h> #include <grub/err.h>
#include <grub/types.h> #include <grub/types.h>
#include <grub/misc.h>
grub_err_t grub_err_t
grub_machine_mmap_iterate (int NESTED_FUNC_ATTR (*hook) (grub_uint64_t, grub_uint64_t, grub_uint32_t)) grub_machine_mmap_iterate (int NESTED_FUNC_ATTR (*hook) (grub_uint64_t, grub_uint64_t, grub_uint32_t))
@ -28,6 +29,8 @@ grub_machine_mmap_iterate (int NESTED_FUNC_ATTR (*hook) (grub_uint64_t, grub_uin
struct grub_machine_mmap_entry *entry struct grub_machine_mmap_entry *entry
= (struct grub_machine_mmap_entry *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR; = (struct grub_machine_mmap_entry *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR;
grub_memset (entry, 0, sizeof (entry));
/* Check if grub_get_mmap_entry works. */ /* Check if grub_get_mmap_entry works. */
cont = grub_get_mmap_entry (entry, 0); cont = grub_get_mmap_entry (entry, 0);
@ -43,6 +46,8 @@ grub_machine_mmap_iterate (int NESTED_FUNC_ATTR (*hook) (grub_uint64_t, grub_uin
if (! cont) if (! cont)
break; break;
grub_memset (entry, 0, sizeof (entry));
cont = grub_get_mmap_entry (entry, cont); cont = grub_get_mmap_entry (entry, cont);
} }
while (entry->size); while (entry->size);

View file

@ -27,7 +27,7 @@
_start: _start:
jmp codestart jmp codestart
. = _start + GRUB_KERNEL_MACHINE_CORE_ENTRY_ADDR . = _start + GRUB_KERNEL_I386_QEMU_CORE_ENTRY_ADDR
VARIABLE(grub_core_entry_addr) VARIABLE(grub_core_entry_addr)
.long 0 .long 0
VARIABLE(grub_kernel_image_size) VARIABLE(grub_kernel_image_size)

View file

@ -20,7 +20,6 @@
#include <grub/kernel.h> #include <grub/kernel.h>
#include <grub/misc.h> #include <grub/misc.h>
#include <grub/types.h> #include <grub/types.h>
#include <grub/machine/kernel.h>
#include <grub/ieee1275/ieee1275.h> #include <grub/ieee1275/ieee1275.h>
int (*grub_ieee1275_entry_fn) (void *); int (*grub_ieee1275_entry_fn) (void *);

View file

@ -29,10 +29,9 @@
#include <grub/misc.h> #include <grub/misc.h>
#include <grub/time.h> #include <grub/time.h>
#include <grub/machine/console.h> #include <grub/machine/console.h>
#include <grub/machine/kernel.h>
#include <grub/cpu/kernel.h>
#include <grub/ieee1275/ofdisk.h> #include <grub/ieee1275/ofdisk.h>
#include <grub/ieee1275/ieee1275.h> #include <grub/ieee1275/ieee1275.h>
#include <grub/offsets.h>
/* The minimal heap size we can live with. */ /* The minimal heap size we can live with. */
#define HEAP_MIN_SIZE (unsigned long) (2 * 1024 * 1024) #define HEAP_MIN_SIZE (unsigned long) (2 * 1024 * 1024)
@ -295,5 +294,5 @@ grub_get_rtc (void)
grub_addr_t grub_addr_t
grub_arch_modules_addr (void) grub_arch_modules_addr (void)
{ {
return ALIGN_UP((grub_addr_t) _end + GRUB_MOD_GAP, GRUB_MOD_ALIGN); return ALIGN_UP((grub_addr_t) _end + GRUB_KERNEL_MACHINE_MOD_GAP, GRUB_KERNEL_MACHINE_MOD_ALIGN);
} }

View file

@ -21,7 +21,6 @@
#include <grub/err.h> #include <grub/err.h>
#include <grub/misc.h> #include <grub/misc.h>
#include <grub/mm.h> #include <grub/mm.h>
#include <grub/machine/kernel.h>
#include <grub/ieee1275/ieee1275.h> #include <grub/ieee1275/ieee1275.h>
enum grub_ieee1275_parse_type enum grub_ieee1275_parse_type

View file

@ -18,7 +18,6 @@
#include <grub/kernel.h> #include <grub/kernel.h>
#include <grub/env.h> #include <grub/env.h>
#include <grub/mips/kernel.h>
void void
grub_machine_set_prefix (void) grub_machine_set_prefix (void)

View file

@ -18,8 +18,9 @@
*/ */
#include <grub/symbol.h> #include <grub/symbol.h>
#include <grub/cpu/kernel.h> #include <grub/offsets.h>
#include <grub/machine/memory.h> #include <grub/machine/memory.h>
#include <grub/offsets.h>
#define BASE_ADDR 8 #define BASE_ADDR 8
@ -32,13 +33,13 @@ _start:
start: start:
bal codestart bal codestart
base: base:
. = _start + GRUB_KERNEL_CPU_COMPRESSED_SIZE . = _start + GRUB_KERNEL_MACHINE_COMPRESSED_SIZE
compressed_size: compressed_size:
.long 0 .long 0
. = _start + GRUB_KERNEL_CPU_TOTAL_MODULE_SIZE . = _start + GRUB_KERNEL_MACHINE_TOTAL_MODULE_SIZE
total_module_size: total_module_size:
.long 0 .long 0
. = _start + GRUB_KERNEL_CPU_KERNEL_IMAGE_SIZE . = _start + GRUB_KERNEL_MACHINE_KERNEL_IMAGE_SIZE
kernel_image_size: kernel_image_size:
.long 0 .long 0
codestart: codestart:
@ -105,10 +106,10 @@ argdone:
#endif #endif
/* Decompress the payload. */ /* Decompress the payload. */
addiu $a0, $s0, GRUB_KERNEL_CPU_RAW_SIZE - BASE_ADDR addiu $a0, $s0, GRUB_KERNEL_MACHINE_RAW_SIZE - BASE_ADDR
lui $a1, %hi(compressed) lui $a1, %hi(compressed)
addiu $a1, %lo(compressed) addiu $a1, %lo(compressed)
lw $a2, (GRUB_KERNEL_CPU_COMPRESSED_SIZE - BASE_ADDR)($s0) lw $a2, (GRUB_KERNEL_MACHINE_COMPRESSED_SIZE - BASE_ADDR)($s0)
move $s1, $a1 move $s1, $a1
/* $a0 contains source compressed address, $a1 is destination, /* $a0 contains source compressed address, $a1 is destination,
@ -134,9 +135,9 @@ reloccont:
addiu $t1, %lo(cont) addiu $t1, %lo(cont)
jr $t1 jr $t1
. = _start + GRUB_KERNEL_CPU_RAW_SIZE . = _start + GRUB_KERNEL_MACHINE_RAW_SIZE
compressed: compressed:
. = _start + GRUB_KERNEL_CPU_PREFIX . = _start + GRUB_KERNEL_MACHINE_PREFIX
VARIABLE(grub_prefix) VARIABLE(grub_prefix)
@ -146,7 +147,7 @@ VARIABLE(grub_prefix)
* Leave some breathing room for the prefix. * Leave some breathing room for the prefix.
*/ */
. = _start + GRUB_KERNEL_CPU_DATA_END . = _start + GRUB_KERNEL_MACHINE_DATA_END
#ifdef GRUB_MACHINE_MIPS_YEELOONG #ifdef GRUB_MACHINE_MIPS_YEELOONG
VARIABLE (grub_arch_busclock) VARIABLE (grub_arch_busclock)
.long 0 .long 0
@ -171,17 +172,17 @@ cont:
/* Move the modules out of BSS. */ /* Move the modules out of BSS. */
lui $t1, %hi(_start) lui $t1, %hi(_start)
addiu $t1, %lo(_start) addiu $t1, %lo(_start)
lw $t2, (GRUB_KERNEL_CPU_KERNEL_IMAGE_SIZE - BASE_ADDR)($s0) lw $t2, (GRUB_KERNEL_MACHINE_KERNEL_IMAGE_SIZE - BASE_ADDR)($s0)
addu $t2, $t1, $t2 addu $t2, $t1, $t2
lui $t1, %hi(_end) lui $t1, %hi(_end)
addiu $t1, %lo(_end) addiu $t1, %lo(_end)
addiu $t1, (GRUB_MOD_ALIGN-1) addiu $t1, (GRUB_KERNEL_MACHINE_MOD_ALIGN-1)
li $t3, (GRUB_MOD_ALIGN-1) li $t3, (GRUB_KERNEL_MACHINE_MOD_ALIGN-1)
nor $t3, $t3, $0 nor $t3, $t3, $0
and $t1, $t1, $t3 and $t1, $t1, $t3
lw $t3, (GRUB_KERNEL_CPU_TOTAL_MODULE_SIZE - BASE_ADDR)($s0) lw $t3, (GRUB_KERNEL_MACHINE_TOTAL_MODULE_SIZE - BASE_ADDR)($s0)
/* Backward copy. */ /* Backward copy. */
add $t1, $t1, $t3 add $t1, $t1, $t3

View file

@ -26,7 +26,6 @@
#include <grub/time.h> #include <grub/time.h>
#include <grub/machine/kernel.h> #include <grub/machine/kernel.h>
#include <grub/machine/memory.h> #include <grub/machine/memory.h>
#include <grub/cpu/kernel.h>
extern void grub_video_sm712_init (void); extern void grub_video_sm712_init (void);
extern void grub_video_init (void); extern void grub_video_init (void);

View file

@ -18,7 +18,7 @@
*/ */
#include <grub/symbol.h> #include <grub/symbol.h>
#include <grub/cpu/kernel.h> #include <grub/offsets.h>
.extern __bss_start .extern __bss_start
.extern _end .extern _end
@ -30,7 +30,7 @@ start:
_start: _start:
b codestart b codestart
. = _start + GRUB_KERNEL_CPU_PREFIX . = _start + GRUB_KERNEL_MACHINE_PREFIX
VARIABLE(grub_prefix) VARIABLE(grub_prefix)
/* to be filled by grub-mkelfimage */ /* to be filled by grub-mkelfimage */
@ -39,7 +39,7 @@ VARIABLE(grub_prefix)
* Leave some breathing room for the prefix. * Leave some breathing room for the prefix.
*/ */
. = _start + GRUB_KERNEL_CPU_DATA_END . = _start + GRUB_KERNEL_MACHINE_DATA_END
codestart: codestart:
li 2, 0 li 2, 0

View file

@ -18,6 +18,7 @@
*/ */
#include <grub/symbol.h> #include <grub/symbol.h>
#include <grub/machine/kernel.h> #include <grub/machine/kernel.h>
#include <grub/offsets.h>
.text .text
.align 4 .align 4

View file

@ -215,11 +215,6 @@ kernel = {
emu = kern/emu/console.c; emu = kern/emu/console.c;
emu = disk/host.c; emu = disk/host.c;
emu = gnulib/progname.c; emu = gnulib/progname.c;
image_nostrip = { emu; };
image_strip_keep_kernel = { i386_efi; x86_64_efi; };
image_strip = { powerpc_ieee1275; i386_coreboot; i386_multiboot; i386_ieee1275; };
image_strip_macho2img = { mips_yeeloong; i386_pc; i386_qemu; sparc64_ieee1275; };
}; };
program = { program = {
@ -229,7 +224,7 @@ program = {
source = kern/emu/full.c; source = kern/emu/full.c;
nodist = grub_emu_init.c; nodist = grub_emu_init.c;
ldadd = kernel.exec; ldadd = kernel.img;
ldadd = '$(MODULE_FILES)'; ldadd = '$(MODULE_FILES)';
ldadd = '$(LIBCURSES) $(LIBSDL) $(LIBUSB) $(LIBPCIACCESS)'; ldadd = '$(LIBCURSES) $(LIBSDL) $(LIBUSB) $(LIBPCIACCESS)';
@ -243,7 +238,7 @@ program = {
source = kern/emu/cache.S; source = kern/emu/cache.S;
nodist = symlist.c; nodist = symlist.c;
ldadd = kernel.exec; ldadd = kernel.img;
ldadd = '$(LIBCURSES) $(LIBSDL) $(LIBUSB) $(LIBPCIACCESS)'; ldadd = '$(LIBCURSES) $(LIBSDL) $(LIBUSB) $(LIBPCIACCESS)';
emu; emu;

View file

@ -77,5 +77,5 @@ normal/misc.c
term/serial.c term/serial.c
util/grub-mkrawimage.c util/grub-mkimage.c
util/i386/pc/grub-setup.c util/i386/pc/grub-setup.c

View file

@ -707,12 +707,6 @@ real_scroll (void)
draw_cursor (0); draw_cursor (0);
grub_video_set_active_render_target (render_target); grub_video_set_active_render_target (render_target);
/* Save viewport and set it to our window. */
grub_video_get_viewport ((unsigned *) &saved_view.x,
(unsigned *) &saved_view.y,
(unsigned *) &saved_view.width,
(unsigned *) &saved_view.height);
grub_video_set_viewport (window.x, window.y, window.width, window.height);
i = window.double_repaint ? 2 : 1; i = window.double_repaint ? 2 : 1;
@ -720,6 +714,15 @@ real_scroll (void)
while (i--) while (i--)
{ {
/* Save viewport and set it to our window. */
grub_video_get_viewport ((unsigned *) &saved_view.x,
(unsigned *) &saved_view.y,
(unsigned *) &saved_view.width,
(unsigned *) &saved_view.height);
grub_video_set_viewport (window.x, window.y, window.width,
window.height);
/* Clear new border area. */ /* Clear new border area. */
grub_video_fill_rect (color, grub_video_fill_rect (color,
virtual_screen.offset_x, virtual_screen.offset_x,
@ -735,6 +738,10 @@ real_scroll (void)
grub_video_scroll (color, 0, -virtual_screen.normal_char_height grub_video_scroll (color, 0, -virtual_screen.normal_char_height
* virtual_screen.total_scroll); * virtual_screen.total_scroll);
/* Restore saved viewport. */
grub_video_set_viewport (saved_view.x, saved_view.y,
saved_view.width, saved_view.height);
if (i) if (i)
grub_video_swap_buffers (); grub_video_swap_buffers ();
} }
@ -746,9 +753,6 @@ real_scroll (void)
grub_video_scroll (color, 0, -virtual_screen.normal_char_height grub_video_scroll (color, 0, -virtual_screen.normal_char_height
* virtual_screen.total_scroll); * virtual_screen.total_scroll);
/* Restore saved viewport. */
grub_video_set_viewport (saved_view.x, saved_view.y,
saved_view.width, saved_view.height);
grub_video_set_active_render_target (render_target); grub_video_set_active_render_target (render_target);
} }

View file

@ -107,49 +107,12 @@ program = {
name = grub-mkimage; name = grub-mkimage;
mansection = 1; mansection = 1;
source = util/grub-mkrawimage.c; source = util/grub-mkimage.c;
source = util/resolve.c;
x86_efi = util/i386/efi/grub-mkimage.c;
x86_efi = util/resolve.c;
ldadd = libutil.a;
sparc64_ieee1275_cppflags = '-DGRUB_KERNEL_MACHINE_LINK_ADDR=$(GRUB_KERNEL_MACHINE_LINK_ADDR)';
mips_cppflags = '-DGRUB_KERNEL_MACHINE_LINK_ADDR=$(GRUB_KERNEL_MACHINE_LINK_ADDR)';
i386_pc_cppflags = '-DGRUB_KERNEL_MACHINE_LINK_ADDR=$(GRUB_KERNEL_MACHINE_LINK_ADDR)';
i386_qemu_cppflags = '-DGRUB_KERNEL_MACHINE_LINK_ADDR=$(GRUB_KERNEL_MACHINE_LINK_ADDR)';
i386_pc; i386_qemu; mips; sparc64_ieee1275;
};
program = {
name = grub-mkelfimage;
mansection = 1;
source = util/elf/grub-mkimage.c;
source = util/resolve.c; source = util/resolve.c;
ldadd = libutil.a; ldadd = libutil.a;
common;
};
program = { cppflags = '-DGRUB_PKGLIBROOTDIR=\"$(pkglibroot)\"';
name = grub-mkisofs;
mansection = 1;
source = util/mkisofs/eltorito.c;
source = util/mkisofs/hash.c;
source = util/mkisofs/joliet.c;
source = util/mkisofs/match.c;
source = util/mkisofs/mkisofs.c;
source = util/mkisofs/multi.c;
source = util/mkisofs/name.c;
source = util/mkisofs/rock.c;
source = util/mkisofs/tree.c;
source = util/mkisofs/write.c;
source = grub-core/gnulib/progname.c;
source = grub-core/gnulib/error.c;
cflags = '$(CFLAGS_MKISOFS)';
cppflags = '$(CPPFLAGS_MKISOFS)';
common; common;
}; };

View file

@ -127,7 +127,8 @@ rootdir=`mktemp -d`
(cd @abs_top_builddir@ && make DESTDIR=$rootdir install) >/dev/null 2>&1 (cd @abs_top_builddir@ && make DESTDIR=$rootdir install) >/dev/null 2>&1
isofile=`mktemp` isofile=`mktemp`
sh @abs_top_builddir@/grub-mkrescue --output=${isofile} \ sh @abs_top_builddir@/grub-mkrescue --grub-mkimage=${builddir}/grub-mkimage \
--override-directory=${builddir}/grub-core --output=${isofile} \
--root-directory=${rootdir} /boot/grub/grub.cfg=${cfgfile} \ --root-directory=${rootdir} /boot/grub/grub.cfg=${cfgfile} \
/boot/grub/testcase.cfg=${source} >/dev/null 2>&1 /boot/grub/testcase.cfg=${source} >/dev/null 2>&1
rm -rf $rootdir rm -rf $rootdir

View file

@ -31,6 +31,8 @@
#include <grub/util/misc.h> #include <grub/util/misc.h>
#include <grub/util/deviceiter.h> #include <grub/util/deviceiter.h>
#include <grub/list.h>
#include <grub/misc.h>
#ifdef __linux__ #ifdef __linux__
# if !defined(__GLIBC__) || \ # if !defined(__GLIBC__) || \
@ -62,12 +64,23 @@ struct hd_geometry
| ((unsigned int) (__dev >> 32) & ~0xfff); \ | ((unsigned int) (__dev >> 32) & ~0xfff); \
}) })
# endif /* ! MAJOR */ # endif /* ! MAJOR */
# ifndef MINOR
# define MINOR(dev) \
({ \
unsigned long long __dev = (dev); \
(unsigned) (__dev & 0xff) | ((unsigned int) (__dev >> 12) & ~0xff); \
})
# endif /* ! MINOR */
# ifndef CDROM_GET_CAPABILITY # ifndef CDROM_GET_CAPABILITY
# define CDROM_GET_CAPABILITY 0x5331 /* get capabilities */ # define CDROM_GET_CAPABILITY 0x5331 /* get capabilities */
# endif /* ! CDROM_GET_CAPABILITY */ # endif /* ! CDROM_GET_CAPABILITY */
# ifndef BLKGETSIZE # ifndef BLKGETSIZE
# define BLKGETSIZE _IO(0x12,96) /* return device size */ # define BLKGETSIZE _IO(0x12,96) /* return device size */
# endif /* ! BLKGETSIZE */ # endif /* ! BLKGETSIZE */
#ifdef HAVE_DEVICE_MAPPER
# include <libdevmapper.h>
#endif
#endif /* __linux__ */ #endif /* __linux__ */
/* Use __FreeBSD_kernel__ instead of __FreeBSD__ for compatibility with /* Use __FreeBSD_kernel__ instead of __FreeBSD__ for compatibility with
@ -411,6 +424,16 @@ check_device (const char *device)
return 1; return 1;
} }
#ifdef __linux__
# ifdef HAVE_DEVICE_MAPPER
struct dmraid_seen
{
struct dmraid_seen *next;
const char *name;
};
# endif /* HAVE_DEVICE_MAPPER */
#endif /* __linux__ */
void void
grub_util_iterate_devices (int NESTED_FUNC_ATTR (*hook) (const char *, int), grub_util_iterate_devices (int NESTED_FUNC_ATTR (*hook) (const char *, int),
int floppy_disks) int floppy_disks)
@ -643,6 +666,123 @@ grub_util_iterate_devices (int NESTED_FUNC_ATTR (*hook) (const char *, int),
return; return;
} }
} }
# ifdef HAVE_DEVICE_MAPPER
# define dmraid_check(cond, ...) \
if (! (cond)) \
{ \
grub_dprintf ("deviceiter", __VA_ARGS__); \
goto dmraid_end; \
}
/* DM-RAID. */
{
struct dm_tree *tree = NULL;
struct dm_task *task = NULL;
struct dm_names *names = NULL;
unsigned int next = 0;
void *top_handle, *second_handle;
struct dm_tree_node *root, *top, *second;
struct dmraid_seen *seen = NULL;
/* Build DM tree for all devices. */
tree = dm_tree_create ();
dmraid_check (tree, "dm_tree_create failed\n");
task = dm_task_create (DM_DEVICE_LIST);
dmraid_check (task, "dm_task_create failed\n");
dmraid_check (dm_task_run (task), "dm_task_run failed\n");
names = dm_task_get_names (task);
dmraid_check (names, "dm_task_get_names failed\n");
dmraid_check (names->dev, "No DM devices found\n");
do
{
names = (void *) names + next;
dmraid_check (dm_tree_add_dev (tree, MAJOR (names->dev),
MINOR (names->dev)),
"dm_tree_add_dev (%s) failed\n", names->name);
next = names->next;
}
while (next);
/* Walk the second-level children of the inverted tree; that is, devices
which are directly composed of non-DM devices such as hard disks.
This class includes all DM-RAID disks and excludes all DM-RAID
partitions. */
root = dm_tree_find_node (tree, 0, 0);
top_handle = NULL;
top = dm_tree_next_child (&top_handle, root, 1);
while (top)
{
second_handle = NULL;
second = dm_tree_next_child (&second_handle, top, 1);
while (second)
{
const char *node_name, *node_uuid;
char *name;
struct dmraid_seen *seen_elt;
node_name = dm_tree_node_get_name (second);
dmraid_check (node_name, "dm_tree_node_get_name failed\n");
node_uuid = dm_tree_node_get_uuid (second);
dmraid_check (node_uuid, "dm_tree_node_get_uuid failed\n");
if (strncmp (node_uuid, "DMRAID-", 7) != 0)
{
grub_dprintf ("deviceiter", "%s is not DM-RAID\n", node_name);
goto dmraid_next_child;
}
/* Have we already seen this node? There are typically very few
DM-RAID disks, so a list should be fast enough. */
if (grub_named_list_find (GRUB_AS_NAMED_LIST (seen), node_name))
{
grub_dprintf ("deviceiter", "Already seen DM device %s\n",
node_name);
goto dmraid_next_child;
}
name = xasprintf ("/dev/mapper/%s", node_name);
if (check_device (name))
{
if (hook (name, 0))
{
free (name);
while (seen)
{
struct dmraid_seen *seen_elt =
grub_list_pop (GRUB_AS_LIST_P (&seen));
free (seen_elt);
}
if (task)
dm_task_destroy (task);
if (tree)
dm_tree_free (tree);
return;
}
}
free (name);
seen_elt = xmalloc (sizeof *seen_elt);
seen_elt->name = node_name;
grub_list_push (GRUB_AS_LIST_P (&seen), GRUB_AS_LIST (seen_elt));
dmraid_next_child:
second = dm_tree_next_child (&second_handle, top, 1);
}
top = dm_tree_next_child (&top_handle, root, 1);
}
dmraid_end:
while (seen)
{
struct dmraid_seen *seen_elt = grub_list_pop (GRUB_AS_LIST_P (&seen));
free (seen_elt);
}
if (task)
dm_task_destroy (task);
if (tree)
dm_tree_free (tree);
}
# endif /* HAVE_DEVICE_MAPPER */
#endif /* __linux__ */ #endif /* __linux__ */
} }

View file

@ -1,463 +0,0 @@
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2004,2005,2006,2007,2008,2009,2010 Free Software Foundation, Inc.
*
* GRUB 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 3 of the License, or
* (at your option) any later version.
*
* GRUB 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 GRUB. If not, see <http://www.gnu.org/licenses/>.
*/
#include <config.h>
#include <stdio.h>
#include <stdint.h>
#include <unistd.h>
#include <fcntl.h>
#include <getopt.h>
#include <stdlib.h>
#include <string.h>
#include <grub/elf.h>
#include <grub/misc.h>
#include <grub/emu/misc.h>
#include <grub/util/misc.h>
#include <grub/util/resolve.h>
#include <grub/kernel.h>
#include <grub/cpu/kernel.h>
#include <grub/i18n.h>
#include "progname.h"
#define GRUB_IEEE1275_NOTE_NAME "PowerPC"
#define GRUB_IEEE1275_NOTE_TYPE 0x1275
/* These structures are defined according to the CHRP binding to IEEE1275,
"Client Program Format" section. */
struct grub_ieee1275_note_hdr
{
grub_uint32_t namesz;
grub_uint32_t descsz;
grub_uint32_t type;
char name[sizeof (GRUB_IEEE1275_NOTE_NAME)];
};
struct grub_ieee1275_note_desc
{
grub_uint32_t real_mode;
grub_uint32_t real_base;
grub_uint32_t real_size;
grub_uint32_t virt_base;
grub_uint32_t virt_size;
grub_uint32_t load_base;
};
struct grub_ieee1275_note
{
struct grub_ieee1275_note_hdr header;
struct grub_ieee1275_note_desc descriptor;
};
void
load_note (Elf32_Phdr *phdr, FILE *out)
{
struct grub_ieee1275_note note;
int note_size = sizeof (struct grub_ieee1275_note);
grub_util_info ("adding CHRP NOTE segment");
note.header.namesz = grub_host_to_target32 (sizeof (GRUB_IEEE1275_NOTE_NAME));
note.header.descsz = grub_host_to_target32 (note_size);
note.header.type = grub_host_to_target32 (GRUB_IEEE1275_NOTE_TYPE);
strcpy (note.header.name, GRUB_IEEE1275_NOTE_NAME);
note.descriptor.real_mode = grub_host_to_target32 (0xffffffff);
note.descriptor.real_base = grub_host_to_target32 (0x00c00000);
note.descriptor.real_size = grub_host_to_target32 (0xffffffff);
note.descriptor.virt_base = grub_host_to_target32 (0xffffffff);
note.descriptor.virt_size = grub_host_to_target32 (0xffffffff);
note.descriptor.load_base = grub_host_to_target32 (0x00004000);
/* Write the note data to the new segment. */
grub_util_write_image_at (&note, note_size,
grub_target_to_host32 (phdr->p_offset), out);
/* Fill in the rest of the segment header. */
phdr->p_type = grub_host_to_target32 (PT_NOTE);
phdr->p_flags = grub_host_to_target32 (PF_R);
phdr->p_align = grub_host_to_target32 (GRUB_TARGET_SIZEOF_LONG);
phdr->p_vaddr = 0;
phdr->p_paddr = 0;
phdr->p_filesz = grub_host_to_target32 (note_size);
phdr->p_memsz = 0;
}
void
load_modules (grub_addr_t modbase, Elf32_Phdr *phdr, const char *dir,
char *mods[], FILE *out, char *memdisk_path, char *config_path)
{
char *module_img;
struct grub_util_path_list *path_list;
struct grub_util_path_list *p;
struct grub_module_info *modinfo;
size_t offset;
size_t total_module_size;
size_t memdisk_size = 0;
size_t config_size = 0;
path_list = grub_util_resolve_dependencies (dir, "moddep.lst", mods);
offset = sizeof (struct grub_module_info);
total_module_size = sizeof (struct grub_module_info);
if (memdisk_path)
{
memdisk_size = ALIGN_UP(grub_util_get_image_size (memdisk_path), 512);
grub_util_info ("the size of memory disk is 0x%x", memdisk_size);
total_module_size += memdisk_size + sizeof (struct grub_module_header);
}
if (config_path)
{
config_size = ALIGN_UP(grub_util_get_image_size (config_path), 512);
grub_util_info ("the size of memory disk is 0x%x", config_size);
total_module_size += config_size + sizeof (struct grub_module_header);
}
for (p = path_list; p; p = p->next)
{
total_module_size += (grub_util_get_image_size (p->name)
+ sizeof (struct grub_module_header));
}
grub_util_info ("the total module size is 0x%x", total_module_size);
module_img = xmalloc (total_module_size);
modinfo = (struct grub_module_info *) module_img;
modinfo->magic = grub_host_to_target32 (GRUB_MODULE_MAGIC);
modinfo->offset = grub_host_to_target32 (sizeof (struct grub_module_info));
modinfo->size = grub_host_to_target32 (total_module_size);
/* Load all the modules, with headers, into module_img. */
for (p = path_list; p; p = p->next)
{
struct grub_module_header *header;
size_t mod_size;
grub_util_info ("adding module %s", p->name);
mod_size = grub_util_get_image_size (p->name);
header = (struct grub_module_header *) (module_img + offset);
header->type = OBJ_TYPE_ELF;
header->size = grub_host_to_target32 (mod_size + sizeof (*header));
grub_util_load_image (p->name, module_img + offset + sizeof (*header));
offset += sizeof (*header) + mod_size;
}
if (memdisk_path)
{
struct grub_module_header *header;
header = (struct grub_module_header *) (module_img + offset);
header->type = OBJ_TYPE_MEMDISK;
header->size = grub_host_to_target32 (memdisk_size + sizeof (*header));
offset += sizeof (*header);
grub_util_load_image (memdisk_path, module_img + offset);
offset += memdisk_size;
}
if (config_path)
{
struct grub_module_header *header;
header = (struct grub_module_header *) (module_img + offset);
header->type = OBJ_TYPE_CONFIG;
header->size = grub_host_to_target32 (config_size + sizeof (*header));
offset += sizeof (*header);
grub_util_load_image (config_path, module_img + offset);
offset += config_size;
}
/* Write the module data to the new segment. */
grub_util_write_image_at (module_img, total_module_size,
grub_host_to_target32 (phdr->p_offset), out);
/* Fill in the rest of the segment header. */
phdr->p_type = grub_host_to_target32 (PT_LOAD);
phdr->p_flags = grub_host_to_target32 (PF_R | PF_W | PF_X);
phdr->p_align = grub_host_to_target32 (GRUB_TARGET_SIZEOF_LONG);
phdr->p_vaddr = grub_host_to_target32 (modbase);
phdr->p_paddr = grub_host_to_target32 (modbase);
phdr->p_filesz = grub_host_to_target32 (total_module_size);
phdr->p_memsz = grub_host_to_target32 (total_module_size);
}
void
add_segments (char *dir, char *prefix, FILE *out, int chrp, char *mods[], char *memdisk_path, char *config_path)
{
Elf32_Ehdr ehdr;
Elf32_Phdr *phdrs = NULL;
Elf32_Phdr *phdr;
FILE *in;
char *kernel_path;
grub_addr_t grub_end = 0;
off_t offset, first_segment;
int i, phdr_size;
/* Read ELF header. */
kernel_path = grub_util_get_path (dir, "kernel.img");
in = fopen (kernel_path, "rb");
if (! in)
grub_util_error ("cannot open %s", kernel_path);
grub_util_read_at (&ehdr, sizeof (ehdr), 0, in);
offset = ALIGN_UP (sizeof (ehdr), GRUB_TARGET_SIZEOF_LONG);
ehdr.e_phoff = grub_host_to_target32 (offset);
phdr_size = (grub_target_to_host16 (ehdr.e_phentsize) *
grub_target_to_host16 (ehdr.e_phnum));
if (mods[0] != NULL)
phdr_size += grub_target_to_host16 (ehdr.e_phentsize);
if (chrp)
phdr_size += grub_target_to_host16 (ehdr.e_phentsize);
phdrs = xmalloc (phdr_size);
offset += ALIGN_UP (phdr_size, GRUB_TARGET_SIZEOF_LONG);
first_segment = offset;
/* Copy all existing segments. */
for (i = 0; i < grub_target_to_host16 (ehdr.e_phnum); i++)
{
char *segment_img;
grub_size_t segment_end;
phdr = phdrs + i;
/* Read segment header. */
grub_util_read_at (phdr, sizeof (Elf32_Phdr),
(grub_target_to_host32 (ehdr.e_phoff)
+ (i * grub_target_to_host16 (ehdr.e_phentsize))),
in);
grub_util_info ("copying segment %d, type %d", i,
grub_target_to_host32 (phdr->p_type));
/* Locate _end. */
segment_end = grub_target_to_host32 (phdr->p_paddr)
+ grub_target_to_host32 (phdr->p_memsz);
grub_util_info ("segment %u end 0x%lx", i, segment_end);
if (segment_end > grub_end)
grub_end = segment_end;
/* Read segment data and write it to new file. */
segment_img = xmalloc (grub_target_to_host32 (phdr->p_filesz));
grub_util_read_at (segment_img, grub_target_to_host32 (phdr->p_filesz),
grub_target_to_host32 (phdr->p_offset), in);
phdr->p_offset = grub_host_to_target32 (offset);
grub_util_write_image_at (segment_img, grub_target_to_host32 (phdr->p_filesz),
offset, out);
offset += ALIGN_UP (grub_target_to_host32 (phdr->p_filesz),
GRUB_TARGET_SIZEOF_LONG);
free (segment_img);
}
if (mods[0] != NULL)
{
grub_addr_t modbase;
/* Place modules just after grub segment. */
modbase = ALIGN_UP(grub_end + GRUB_MOD_GAP, GRUB_MOD_ALIGN);
/* Construct new segment header for modules. */
phdr = phdrs + grub_target_to_host16 (ehdr.e_phnum);
ehdr.e_phnum = grub_host_to_target16 (grub_target_to_host16 (ehdr.e_phnum) + 1);
/* Fill in p_offset so the callees know where to write. */
phdr->p_offset = grub_host_to_target32 (ALIGN_UP (grub_util_get_fp_size (out),
GRUB_TARGET_SIZEOF_LONG));
load_modules (modbase, phdr, dir, mods, out, memdisk_path, config_path);
}
if (chrp)
{
/* Construct new segment header for the CHRP note. */
phdr = phdrs + grub_target_to_host16 (ehdr.e_phnum);
ehdr.e_phnum = grub_host_to_target16 (grub_target_to_host16 (ehdr.e_phnum) + 1);
/* Fill in p_offset so the callees know where to write. */
phdr->p_offset = grub_host_to_target32 (ALIGN_UP (grub_util_get_fp_size (out),
GRUB_TARGET_SIZEOF_LONG));
load_note (phdr, out);
}
/* Don't bother preserving the section headers. */
ehdr.e_shoff = 0;
ehdr.e_shnum = 0;
ehdr.e_shstrndx = 0;
/* Write entire segment table to the file. */
grub_util_write_image_at (phdrs, phdr_size, grub_target_to_host32 (ehdr.e_phoff), out);
/* Write ELF header. */
grub_util_write_image_at (&ehdr, sizeof (ehdr), 0, out);
if (prefix)
{
if (GRUB_KERNEL_CPU_PREFIX + strlen (prefix) + 1 > GRUB_KERNEL_CPU_DATA_END)
grub_util_error ("prefix too long");
grub_util_write_image_at (prefix, strlen (prefix) + 1, first_segment + GRUB_KERNEL_CPU_PREFIX, out);
}
free (phdrs);
free (kernel_path);
}
static struct option options[] =
{
{"directory", required_argument, 0, 'd'},
{"prefix", required_argument, 0, 'p'},
{"memdisk", required_argument, 0, 'm'},
{"config", required_argument, 0, 'c'},
{"output", required_argument, 0, 'o'},
{"help", no_argument, 0, 'h'},
{"note", no_argument, 0, 'n'},
{"version", no_argument, 0, 'V'},
{"verbose", no_argument, 0, 'v'},
{ 0, 0, 0, 0 },
};
static void
usage (int status)
{
if (status)
fprintf (stderr, "Try `%s --help' for more information.\n", program_name);
else
printf ("\
Usage: %s -o FILE [OPTION]... [MODULES]\n\
\n\
Make a bootable image of GRUB.\n\
\n\
-d, --directory=DIR use images and modules under DIR [default=%s]\n\
-p, --prefix=DIR set grub_prefix directory\n\
-m, --memdisk=FILE embed FILE as a memdisk image\n\
-c, --config=FILE embed FILE as boot config\n\
-o, --output=FILE output a generated image to FILE\n\
-h, --help display this message and exit\n\
-n, --note add NOTE segment for CHRP Open Firmware\n\
-V, --version print version information and exit\n\
-v, --verbose print verbose messages\n\
\n\
Report bugs to <%s>.\n\
", program_name, GRUB_LIBDIR, PACKAGE_BUGREPORT);
exit (status);
}
int
main (int argc, char *argv[])
{
FILE *fp;
char *output = NULL;
char *dir = NULL;
char *prefix = NULL;
char *memdisk = NULL;
char *config = NULL;
int chrp = 0;
set_program_name (argv[0]);
grub_util_init_nls ();
while (1)
{
int c = getopt_long (argc, argv, "d:p:m:c:o:hVvn", options, 0);
if (c == -1)
break;
switch (c)
{
case 'd':
if (dir)
free (dir);
dir = xstrdup (optarg);
break;
case 'p':
if (prefix)
free (prefix);
prefix = xstrdup (optarg);
break;
case 'm':
if (memdisk)
free (memdisk);
memdisk = xstrdup (optarg);
if (prefix)
free (prefix);
prefix = xstrdup ("(memdisk)/boot/grub");
break;
case 'c':
if (config)
free (config);
config = xstrdup (optarg);
break;
case 'h':
usage (0);
break;
case 'n':
chrp = 1;
break;
case 'o':
if (output)
free (output);
output = xstrdup (optarg);
break;
case 'V':
printf ("grub-mkimage (%s) %s\n", PACKAGE_NAME, PACKAGE_VERSION);
return 0;
case 'v':
verbosity++;
break;
default:
usage (1);
break;
}
}
if (!output)
usage (1);
fp = fopen (output, "wb");
if (! fp)
grub_util_error ("cannot open %s", output);
add_segments (dir ? : GRUB_LIBDIR, prefix, fp, chrp, argv + optind, memdisk,
config);
fclose (fp);
return 0;
}

View file

@ -35,11 +35,7 @@ pkglibdir=${libdir}/`echo ${PACKAGE_TARNAME}/${target_cpu}-${platform} | sed ${t
localedir=@datadir@/locale localedir=@datadir@/locale
grub_setup=${sbindir}/`echo grub-setup | sed ${transform}` grub_setup=${sbindir}/`echo grub-setup | sed ${transform}`
if [ "${target_cpu}-${platform}" = "i386-pc" ] || [ "${target_cpu}-${platform}" = "sparc64-ieee1275" ] || [ "${target_cpu}-${platform}" = "mips-yeeloong" ] ; then grub_mkimage=${bindir}/`echo grub-mkimage | sed ${transform}`
grub_mkimage=${bindir}/`echo grub-mkimage | sed ${transform}`
else
grub_mkimage=${bindir}/`echo grub-mkelfimage | sed ${transform}`
fi
grub_mkdevicemap=${sbindir}/`echo grub-mkdevicemap | sed ${transform}` grub_mkdevicemap=${sbindir}/`echo grub-mkdevicemap | sed ${transform}`
grub_probe=${sbindir}/`echo grub-probe | sed ${transform}` grub_probe=${sbindir}/`echo grub-probe | sed ${transform}`
grub_editenv=${bindir}/`echo grub-editenv | sed ${transform}` grub_editenv=${bindir}/`echo grub-editenv | sed ${transform}`
@ -346,16 +342,23 @@ else
prefix_drive=`$grub_probe --target=drive --device ${grub_device}` || exit 1 prefix_drive=`$grub_probe --target=drive --device ${grub_device}` || exit 1
fi fi
case "${target_cpu}-${platform}" in
i386-pc) mkimage_target=i386-pc ;;
sparc64-ieee1275) mkimage_target=sparc64-ieee1275-raw ;;
mips-yeeloong) mkimage_target=mipsel-yeeloong-elf ;;
*) mkimage_target=i386-coreboot;
esac
if [ "${target_cpu}-${platform}" = "i386-pc" ] || [ "${target_cpu}-${platform}" = "sparc64-ieee1275" ] ; then if [ "${target_cpu}-${platform}" = "i386-pc" ] || [ "${target_cpu}-${platform}" = "sparc64-ieee1275" ] ; then
$grub_mkimage ${config_opt} --output=${grubdir}/core.img --prefix=${prefix_drive}${relative_grubdir} $modules || exit 1 $grub_mkimage ${config_opt} -O ${mkimage_target} --output=${grubdir}/core.img --prefix=${prefix_drive}${relative_grubdir} $modules || exit 1
# Now perform the installation. # Now perform the installation.
$grub_setup ${setup_verbose} ${setup_force} --directory=${grubdir} --device-map=${device_map} \ $grub_setup ${setup_verbose} ${setup_force} --directory=${grubdir} --device-map=${device_map} \
${install_device} || exit 1 ${install_device} || exit 1
elif [ "${target_cpu}-${platform}" = "mips-yeeloong" ] ; then elif [ "${target_cpu}-${platform}" = "mips-yeeloong" ] ; then
$grub_mkimage ${config_opt} -f ${font} -d ${pkglibdir} -O elf --output=/boot/grub.elf --prefix=${prefix_drive}${relative_grubdir} $modules || exit 1 $grub_mkimage ${config_opt} -f ${font} -d ${pkglibdir} -O ${mkimage_target} --output=/boot/grub.elf --prefix=${prefix_drive}${relative_grubdir} $modules || exit 1
else else
$grub_mkimage ${config_opt} -d ${pkglibdir} --output=/boot/multiboot.img --prefix=${prefix_drive}${relative_grubdir} $modules || exit 1 $grub_mkimage -O ${mkimage_target} ${config_opt} -d ${pkglibdir} --output=/boot/multiboot.img --prefix=${prefix_drive}${relative_grubdir} $modules || exit 1
fi fi
echo "Installation finished. No error reported." echo "Installation finished. No error reported."

View file

@ -50,7 +50,13 @@ EOF
} }
# Check the arguments. # Check the arguments.
next_grub_cfg=false
for option in "$@"; do for option in "$@"; do
if $next_grub_cfg; then
grub_cfg=$option
next_grub_cfg=false
continue
fi
case "$option" in case "$option" in
-h | --help) -h | --help)
usage usage
@ -59,8 +65,7 @@ for option in "$@"; do
echo "$0 (GNU GRUB ${package_version})" echo "$0 (GNU GRUB ${package_version})"
exit 0 ;; exit 0 ;;
-o) -o)
shift next_grub_cfg=:
grub_cfg=$1
;; ;;
--output=*) --output=*)
grub_cfg=`echo "$option" | sed 's/--output=//'` grub_cfg=`echo "$option" | sed 's/--output=//'`
@ -72,6 +77,11 @@ for option in "$@"; do
;; ;;
esac esac
done done
if $next_grub_cfg; then
echo "Missing argument to \`-o'" 1>&2
usage
exit 1
fi
. ${libdir}/grub/grub-mkconfig_lib . ${libdir}/grub/grub-mkconfig_lib
@ -236,6 +246,10 @@ export GRUB_DEFAULT \
GRUB_HIDDEN_TIMEOUT \ GRUB_HIDDEN_TIMEOUT \
GRUB_HIDDEN_TIMEOUT_QUIET \ GRUB_HIDDEN_TIMEOUT_QUIET \
GRUB_TIMEOUT \ GRUB_TIMEOUT \
GRUB_DEFAULT_BUTTON \
GRUB_HIDDEN_TIMEOUT_BUTTON \
GRUB_TIMEOUT_BUTTON \
GRUB_BUTTON_CMOS_ADDRESS \
GRUB_DISTRIBUTOR \ GRUB_DISTRIBUTOR \
GRUB_CMDLINE_LINUX \ GRUB_CMDLINE_LINUX \
GRUB_CMDLINE_LINUX_DEFAULT \ GRUB_CMDLINE_LINUX_DEFAULT \

View file

@ -32,6 +32,7 @@
#include <grub/emu/misc.h> #include <grub/emu/misc.h>
#include <grub/util/misc.h> #include <grub/util/misc.h>
#include <grub/util/deviceiter.h> #include <grub/util/deviceiter.h>
#include <grub/env.h>
#include <grub/i18n.h> #include <grub/i18n.h>
#define _GNU_SOURCE 1 #define _GNU_SOURCE 1
@ -159,6 +160,9 @@ main (int argc, char *argv[])
} }
} }
if (verbosity > 1)
grub_env_set ("debug", "all");
make_device_map (dev_map ? : DEFAULT_DEVICE_MAP, floppy_disks); make_device_map (dev_map ? : DEFAULT_DEVICE_MAP, floppy_disks);
free (dev_map); free (dev_map);

1365
util/grub-mkimage.c Normal file

File diff suppressed because it is too large Load diff

756
util/grub-mkimagexx.c Normal file
View file

@ -0,0 +1,756 @@
/* grub-mkimage.c - make a bootable image */
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2002,2003,2004,2005,2006,2007,2008,2009,2010 Free Software Foundation, Inc.
*
* GRUB 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 3 of the License, or
* (at your option) any later version.
*
* GRUB 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 GRUB. If not, see <http://www.gnu.org/licenses/>.
*/
#undef ELF_R_SYM
#undef ELF_R_TYPE
#if defined(MKIMAGE_ELF32)
# define SUFFIX(x) x ## 32
# define ELFCLASSXX ELFCLASS32
# define Elf_Ehdr Elf32_Ehdr
# define Elf_Phdr Elf32_Phdr
# define Elf_Addr Elf32_Addr
# define Elf_Sym Elf32_Sym
# define Elf_Off Elf32_Off
# define Elf_Shdr Elf32_Shdr
# define Elf_Rela Elf32_Rela
# define Elf_Rel Elf32_Rel
# define ELF_R_SYM(val) ELF32_R_SYM(val)
# define ELF_R_TYPE(val) ELF32_R_TYPE(val)
#elif defined(MKIMAGE_ELF64)
# define SUFFIX(x) x ## 64
# define ELFCLASSXX ELFCLASS64
# define Elf_Ehdr Elf64_Ehdr
# define Elf_Phdr Elf64_Phdr
# define Elf_Addr Elf64_Addr
# define Elf_Sym Elf64_Sym
# define Elf_Off Elf64_Off
# define Elf_Shdr Elf64_Shdr
# define Elf_Rela Elf64_Rela
# define Elf_Rel Elf64_Rel
# define ELF_R_SYM(val) ELF64_R_SYM(val)
# define ELF_R_TYPE(val) ELF64_R_TYPE(val)
#else
#error "I'm confused"
#endif
/* Relocate symbols; note that this function overwrites the symbol table.
Return the address of a start symbol. */
static Elf_Addr
SUFFIX (relocate_symbols) (Elf_Ehdr *e, Elf_Shdr *sections,
Elf_Shdr *symtab_section, Elf_Addr *section_addresses,
Elf_Half section_entsize, Elf_Half num_sections,
struct image_target_desc *image_target)
{
Elf_Word symtab_size, sym_size, num_syms;
Elf_Off symtab_offset;
Elf_Addr start_address = 0;
Elf_Sym *sym;
Elf_Word i;
Elf_Shdr *strtab_section;
const char *strtab;
strtab_section
= (Elf_Shdr *) ((char *) sections
+ (grub_target_to_host32 (symtab_section->sh_link)
* section_entsize));
strtab = (char *) e + grub_target_to_host (strtab_section->sh_offset);
symtab_size = grub_target_to_host (symtab_section->sh_size);
sym_size = grub_target_to_host (symtab_section->sh_entsize);
symtab_offset = grub_target_to_host (symtab_section->sh_offset);
num_syms = symtab_size / sym_size;
for (i = 0, sym = (Elf_Sym *) ((char *) e + symtab_offset);
i < num_syms;
i++, sym = (Elf_Sym *) ((char *) sym + sym_size))
{
Elf_Section index;
const char *name;
name = strtab + grub_target_to_host32 (sym->st_name);
index = grub_target_to_host16 (sym->st_shndx);
if (index == STN_ABS)
{
continue;
}
else if ((index == STN_UNDEF))
{
if (sym->st_name)
grub_util_error ("undefined symbol %s", name);
else
continue;
}
else if (index >= num_sections)
grub_util_error ("section %d does not exist", index);
sym->st_value = (grub_target_to_host32 (sym->st_value)
+ section_addresses[index]);
grub_util_info ("locating %s at 0x%x", name, sym->st_value);
if (! start_address)
if (strcmp (name, "_start") == 0 || strcmp (name, "start") == 0)
start_address = sym->st_value;
}
return start_address;
}
/* Return the address of a symbol at the index I in the section S. */
static Elf_Addr
SUFFIX (get_symbol_address) (Elf_Ehdr *e, Elf_Shdr *s, Elf_Word i,
struct image_target_desc *image_target)
{
Elf_Sym *sym;
sym = (Elf_Sym *) ((char *) e
+ grub_target_to_host32 (s->sh_offset)
+ i * grub_target_to_host32 (s->sh_entsize));
return sym->st_value;
}
/* Return the address of a modified value. */
static Elf_Addr *
SUFFIX (get_target_address) (Elf_Ehdr *e, Elf_Shdr *s, Elf_Addr offset,
struct image_target_desc *image_target)
{
return (Elf_Addr *) ((char *) e + grub_target_to_host32 (s->sh_offset) + offset);
}
/* Deal with relocation information. This function relocates addresses
within the virtual address space starting from 0. So only relative
addresses can be fully resolved. Absolute addresses must be relocated
again by a PE32 relocator when loaded. */
static void
SUFFIX (relocate_addresses) (Elf_Ehdr *e, Elf_Shdr *sections,
Elf_Addr *section_addresses,
Elf_Half section_entsize, Elf_Half num_sections,
const char *strtab, struct image_target_desc *image_target)
{
Elf_Half i;
Elf_Shdr *s;
for (i = 0, s = sections;
i < num_sections;
i++, s = (Elf_Shdr *) ((char *) s + section_entsize))
if ((s->sh_type == grub_host_to_target32 (SHT_REL)) ||
(s->sh_type == grub_host_to_target32 (SHT_RELA)))
{
Elf_Rela *r;
Elf_Word rtab_size, r_size, num_rs;
Elf_Off rtab_offset;
Elf_Shdr *symtab_section;
Elf_Word target_section_index;
Elf_Addr target_section_addr;
Elf_Shdr *target_section;
Elf_Word j;
symtab_section = (Elf_Shdr *) ((char *) sections
+ (grub_target_to_host32 (s->sh_link)
* section_entsize));
target_section_index = grub_target_to_host32 (s->sh_info);
target_section_addr = section_addresses[target_section_index];
target_section = (Elf_Shdr *) ((char *) sections
+ (target_section_index
* section_entsize));
grub_util_info ("dealing with the relocation section %s for %s",
strtab + grub_target_to_host32 (s->sh_name),
strtab + grub_target_to_host32 (target_section->sh_name));
rtab_size = grub_target_to_host32 (s->sh_size);
r_size = grub_target_to_host32 (s->sh_entsize);
rtab_offset = grub_target_to_host32 (s->sh_offset);
num_rs = rtab_size / r_size;
for (j = 0, r = (Elf_Rela *) ((char *) e + rtab_offset);
j < num_rs;
j++, r = (Elf_Rela *) ((char *) r + r_size))
{
Elf_Addr info;
Elf_Addr offset;
Elf_Addr sym_addr;
Elf_Addr *target;
Elf_Addr addend;
offset = grub_target_to_host (r->r_offset);
target = SUFFIX (get_target_address) (e, target_section,
offset, image_target);
info = grub_target_to_host (r->r_info);
sym_addr = SUFFIX (get_symbol_address) (e, symtab_section,
ELF_R_SYM (info), image_target);
addend = (s->sh_type == grub_target_to_host32 (SHT_RELA)) ?
r->r_addend : 0;
if (image_target->voidp_sizeof == 4)
switch (ELF_R_TYPE (info))
{
case R_386_NONE:
break;
case R_386_32:
/* This is absolute. */
*target = grub_host_to_target32 (grub_target_to_host32 (*target)
+ addend + sym_addr);
grub_util_info ("relocating an R_386_32 entry to 0x%x at the offset 0x%x",
*target, offset);
break;
case R_386_PC32:
/* This is relative. */
*target = grub_host_to_target32 (grub_target_to_host32 (*target)
+ addend + sym_addr
- target_section_addr - offset
- image_target->vaddr_offset);
grub_util_info ("relocating an R_386_PC32 entry to 0x%x at the offset 0x%x",
*target, offset);
break;
default:
grub_util_error ("unknown relocation type %d",
ELF_R_TYPE (info));
break;
}
else
switch (ELF_R_TYPE (info))
{
case R_X86_64_NONE:
break;
case R_X86_64_64:
*target = grub_host_to_target64 (grub_target_to_host64 (*target)
+ addend + sym_addr);
grub_util_info ("relocating an R_X86_64_64 entry to 0x%llx at the offset 0x%llx",
*target, offset);
break;
case R_X86_64_PC32:
{
grub_uint32_t *t32 = (grub_uint32_t *) target;
*t32 = grub_host_to_target64 (grub_target_to_host32 (*t32)
+ addend + sym_addr
- target_section_addr - offset
- image_target->vaddr_offset);
grub_util_info ("relocating an R_X86_64_PC32 entry to 0x%x at the offset 0x%llx",
*t32, offset);
break;
}
case R_X86_64_32:
case R_X86_64_32S:
{
grub_uint32_t *t32 = (grub_uint32_t *) target;
*t32 = grub_host_to_target64 (grub_target_to_host32 (*t32)
+ addend + sym_addr);
grub_util_info ("relocating an R_X86_64_32(S) entry to 0x%x at the offset 0x%llx",
*t32, offset);
break;
}
default:
grub_util_error ("unknown relocation type %d",
ELF_R_TYPE (info));
break;
}
}
}
}
/* Add a PE32's fixup entry for a relocation. Return the resulting address
after having written to the file OUT. */
static Elf_Addr
SUFFIX (add_fixup_entry) (struct fixup_block_list **cblock, grub_uint16_t type,
Elf_Addr addr, int flush, Elf_Addr current_address,
struct image_target_desc *image_target)
{
struct grub_pe32_fixup_block *b;
b = &((*cblock)->b);
/* First, check if it is necessary to write out the current block. */
if ((*cblock)->state)
{
if (flush || addr < b->page_rva || b->page_rva + 0x1000 <= addr)
{
grub_uint32_t size;
if (flush)
{
/* Add as much padding as necessary to align the address
with a section boundary. */
Elf_Addr next_address;
unsigned padding_size;
size_t index;
next_address = current_address + b->block_size;
padding_size = ((ALIGN_UP (next_address, image_target->section_align)
- next_address)
>> 1);
index = ((b->block_size - sizeof (*b)) >> 1);
grub_util_info ("adding %d padding fixup entries", padding_size);
while (padding_size--)
{
b->entries[index++] = 0;
b->block_size += 2;
}
}
else if (b->block_size & (8 - 1))
{
/* If not aligned with a 32-bit boundary, add
a padding entry. */
size_t index;
grub_util_info ("adding a padding fixup entry");
index = ((b->block_size - sizeof (*b)) >> 1);
b->entries[index] = 0;
b->block_size += 2;
}
/* Flush it. */
grub_util_info ("writing %d bytes of a fixup block starting at 0x%x",
b->block_size, b->page_rva);
size = b->block_size;
current_address += size;
b->page_rva = grub_host_to_target32 (b->page_rva);
b->block_size = grub_host_to_target32 (b->block_size);
(*cblock)->next = xmalloc (sizeof (**cblock) + 2 * 0x1000);
memset ((*cblock)->next, 0, sizeof (**cblock) + 2 * 0x1000);
*cblock = (*cblock)->next;
}
}
b = &((*cblock)->b);
if (! flush)
{
grub_uint16_t entry;
size_t index;
/* If not allocated yet, allocate a block with enough entries. */
if (! (*cblock)->state)
{
(*cblock)->state = 1;
/* The spec does not mention the requirement of a Page RVA.
Here, align the address with a 4K boundary for safety. */
b->page_rva = (addr & ~(0x1000 - 1));
b->block_size = sizeof (*b);
}
/* Sanity check. */
if (b->block_size >= sizeof (*b) + 2 * 0x1000)
grub_util_error ("too many fixup entries");
/* Add a new entry. */
index = ((b->block_size - sizeof (*b)) >> 1);
entry = GRUB_PE32_FIXUP_ENTRY (type, addr - b->page_rva);
b->entries[index] = grub_host_to_target16 (entry);
b->block_size += 2;
}
return current_address;
}
/* Make a .reloc section. */
static Elf_Addr
SUFFIX (make_reloc_section) (Elf_Ehdr *e, void **out,
Elf_Addr *section_addresses, Elf_Shdr *sections,
Elf_Half section_entsize, Elf_Half num_sections,
const char *strtab, struct image_target_desc *image_target)
{
Elf_Half i;
Elf_Shdr *s;
struct fixup_block_list *lst, *lst0;
Elf_Addr current_address = 0;
lst = lst0 = xmalloc (sizeof (*lst) + 2 * 0x1000);
memset (lst, 0, sizeof (*lst) + 2 * 0x1000);
for (i = 0, s = sections;
i < num_sections;
i++, s = (Elf_Shdr *) ((char *) s + section_entsize))
if ((s->sh_type == grub_cpu_to_le32 (SHT_REL)) ||
(s->sh_type == grub_cpu_to_le32 (SHT_RELA)))
{
Elf_Rel *r;
Elf_Word rtab_size, r_size, num_rs;
Elf_Off rtab_offset;
Elf_Addr section_address;
Elf_Word j;
grub_util_info ("translating the relocation section %s",
strtab + grub_le_to_cpu32 (s->sh_name));
rtab_size = grub_le_to_cpu32 (s->sh_size);
r_size = grub_le_to_cpu32 (s->sh_entsize);
rtab_offset = grub_le_to_cpu32 (s->sh_offset);
num_rs = rtab_size / r_size;
section_address = section_addresses[grub_le_to_cpu32 (s->sh_info)];
for (j = 0, r = (Elf_Rel *) ((char *) e + rtab_offset);
j < num_rs;
j++, r = (Elf_Rel *) ((char *) r + r_size))
{
Elf_Addr info;
Elf_Addr offset;
offset = grub_le_to_cpu32 (r->r_offset);
info = grub_le_to_cpu32 (r->r_info);
/* Necessary to relocate only absolute addresses. */
if (image_target->voidp_sizeof == 4)
{
if (ELF_R_TYPE (info) == R_386_32)
{
Elf_Addr addr;
addr = section_address + offset;
grub_util_info ("adding a relocation entry for 0x%x", addr);
current_address
= SUFFIX (add_fixup_entry) (&lst,
GRUB_PE32_REL_BASED_HIGHLOW,
addr, 0, current_address,
image_target);
}
}
else
{
if ((ELF_R_TYPE (info) == R_X86_64_32) ||
(ELF_R_TYPE (info) == R_X86_64_32S))
{
grub_util_error ("can\'t add fixup entry for R_X86_64_32(S)");
}
else if (ELF_R_TYPE (info) == R_X86_64_64)
{
Elf_Addr addr;
addr = section_address + offset;
grub_util_info ("adding a relocation entry for 0x%llx", addr);
current_address
= SUFFIX (add_fixup_entry) (&lst,
GRUB_PE32_REL_BASED_DIR64,
addr,
0, current_address,
image_target);
}
}
}
}
current_address = SUFFIX (add_fixup_entry) (&lst, 0, 0, 1, current_address, image_target);
{
grub_uint8_t *ptr;
ptr = *out = xmalloc (current_address);
for (lst = lst0; lst; lst = lst->next)
if (lst->state)
{
memcpy (ptr, &lst->b, grub_target_to_host32 (lst->b.block_size));
ptr += grub_target_to_host32 (lst->b.block_size);
}
if (current_address + *out != ptr)
{
grub_util_error ("Bug detected %d != %d\n", ptr - (grub_uint8_t *) *out,
current_address);
}
}
return current_address;
}
/* Determine if this section is a text section. Return false if this
section is not allocated. */
static int
SUFFIX (is_text_section) (Elf_Shdr *s, struct image_target_desc *image_target)
{
if (image_target->id != IMAGE_EFI
&& grub_target_to_host32 (s->sh_type) != SHT_PROGBITS)
return 0;
return ((grub_target_to_host (s->sh_flags) & (SHF_EXECINSTR | SHF_ALLOC))
== (SHF_EXECINSTR | SHF_ALLOC));
}
/* Determine if this section is a data section. This assumes that
BSS is also a data section, since the converter initializes BSS
when producing PE32 to avoid a bug in EFI implementations. */
static int
SUFFIX (is_data_section) (Elf_Shdr *s, struct image_target_desc *image_target)
{
if (image_target->id != IMAGE_EFI
&& grub_target_to_host32 (s->sh_type) != SHT_PROGBITS)
return 0;
return ((grub_target_to_host (s->sh_flags) & (SHF_EXECINSTR | SHF_ALLOC))
== SHF_ALLOC);
}
/* Return if the ELF header is valid. */
static int
SUFFIX (check_elf_header) (Elf_Ehdr *e, size_t size, struct image_target_desc *image_target)
{
if (size < sizeof (*e)
|| e->e_ident[EI_MAG0] != ELFMAG0
|| e->e_ident[EI_MAG1] != ELFMAG1
|| e->e_ident[EI_MAG2] != ELFMAG2
|| e->e_ident[EI_MAG3] != ELFMAG3
|| e->e_ident[EI_VERSION] != EV_CURRENT
|| e->e_ident[EI_CLASS] != ELFCLASSXX
|| e->e_version != grub_host_to_target32 (EV_CURRENT))
return 0;
return 1;
}
/* Locate section addresses by merging code sections and data sections
into .text and .data, respectively. Return the array of section
addresses. */
static Elf_Addr *
SUFFIX (locate_sections) (Elf_Shdr *sections, Elf_Half section_entsize,
Elf_Half num_sections, const char *strtab,
grub_size_t *exec_size, grub_size_t *kernel_sz,
grub_size_t *all_align,
struct image_target_desc *image_target)
{
int i;
Elf_Addr current_address;
Elf_Addr *section_addresses;
Elf_Shdr *s;
*all_align = 1;
section_addresses = xmalloc (sizeof (*section_addresses) * num_sections);
memset (section_addresses, 0, sizeof (*section_addresses) * num_sections);
current_address = 0;
for (i = 0, s = sections;
i < num_sections;
i++, s = (Elf_Shdr *) ((char *) s + section_entsize))
if ((grub_target_to_host (s->sh_flags) & SHF_ALLOC)
&& grub_host_to_target32 (s->sh_addralign) > *all_align)
*all_align = grub_host_to_target32 (s->sh_addralign);
/* .text */
for (i = 0, s = sections;
i < num_sections;
i++, s = (Elf_Shdr *) ((char *) s + section_entsize))
if (SUFFIX (is_text_section) (s, image_target))
{
Elf_Word align = grub_host_to_target32 (s->sh_addralign);
const char *name = strtab + grub_host_to_target32 (s->sh_name);
if (align)
current_address = ALIGN_UP (current_address + image_target->vaddr_offset,
align) - image_target->vaddr_offset;
grub_util_info ("locating the section %s at 0x%x",
name, current_address);
section_addresses[i] = current_address;
current_address += grub_host_to_target_addr (s->sh_size);
}
current_address = ALIGN_UP (current_address + image_target->vaddr_offset,
image_target->section_align)
- image_target->vaddr_offset;
*exec_size = current_address;
/* .data */
for (i = 0, s = sections;
i < num_sections;
i++, s = (Elf_Shdr *) ((char *) s + section_entsize))
if (SUFFIX (is_data_section) (s, image_target))
{
Elf_Word align = grub_host_to_target32 (s->sh_addralign);
const char *name = strtab + grub_host_to_target32 (s->sh_name);
if (align)
current_address = ALIGN_UP (current_address + image_target->vaddr_offset,
align)
- image_target->vaddr_offset;
grub_util_info ("locating the section %s at 0x%x",
name, current_address);
section_addresses[i] = current_address;
current_address += grub_host_to_target_addr (s->sh_size);
}
current_address = ALIGN_UP (current_address + image_target->vaddr_offset,
image_target->section_align) - image_target->vaddr_offset;
*kernel_sz = current_address;
return section_addresses;
}
static char *
SUFFIX (load_image) (const char *kernel_path, grub_size_t *exec_size,
grub_size_t *kernel_sz, grub_size_t *bss_size,
grub_size_t total_module_size, grub_uint64_t *start,
void **reloc_section, grub_size_t *reloc_size,
grub_size_t *align,
struct image_target_desc *image_target)
{
char *kernel_img, *out_img;
const char *strtab;
Elf_Ehdr *e;
Elf_Shdr *sections;
Elf_Addr *section_addresses;
Elf_Addr *section_vaddresses;
int i;
Elf_Shdr *s;
Elf_Half num_sections;
Elf_Off section_offset;
Elf_Half section_entsize;
grub_size_t kernel_size;
Elf_Shdr *symtab_section;
*start = 0;
kernel_size = grub_util_get_image_size (kernel_path);
kernel_img = xmalloc (kernel_size);
grub_util_load_image (kernel_path, kernel_img);
e = (Elf_Ehdr *) kernel_img;
if (! SUFFIX (check_elf_header) (e, kernel_size, image_target))
grub_util_error ("invalid ELF header");
section_offset = grub_target_to_host (e->e_shoff);
section_entsize = grub_target_to_host16 (e->e_shentsize);
num_sections = grub_target_to_host16 (e->e_shnum);
if (kernel_size < section_offset + section_entsize * num_sections)
grub_util_error ("invalid ELF format");
sections = (Elf_Shdr *) (kernel_img + section_offset);
/* Relocate sections then symbols in the virtual address space. */
s = (Elf_Shdr *) ((char *) sections
+ grub_host_to_target16 (e->e_shstrndx) * section_entsize);
strtab = (char *) e + grub_host_to_target32 (s->sh_offset);
section_addresses = SUFFIX (locate_sections) (sections, section_entsize,
num_sections, strtab,
exec_size, kernel_sz, align,
image_target);
section_vaddresses = xmalloc (sizeof (*section_addresses) * num_sections);
for (i = 0; i < num_sections; i++)
section_vaddresses[i] = section_addresses[i] + image_target->vaddr_offset;
if (image_target->id != IMAGE_EFI)
{
Elf_Addr current_address = *kernel_sz;
for (i = 0, s = sections;
i < num_sections;
i++, s = (Elf_Shdr *) ((char *) s + section_entsize))
if (grub_target_to_host32 (s->sh_type) == SHT_NOBITS)
{
Elf_Word align = grub_host_to_target32 (s->sh_addralign);
const char *name = strtab + grub_host_to_target32 (s->sh_name);
if (align)
current_address = ALIGN_UP (current_address
+ image_target->vaddr_offset, align)
- image_target->vaddr_offset;
grub_util_info ("locating the section %s at 0x%x",
name, current_address);
section_vaddresses[i] = current_address
+ image_target->vaddr_offset;
current_address += grub_host_to_target_addr (s->sh_size);
}
current_address = ALIGN_UP (current_address + image_target->vaddr_offset,
image_target->section_align)
- image_target->vaddr_offset;
*bss_size = current_address - *kernel_sz;
}
else
*bss_size = 0;
if (image_target->id == IMAGE_EFI)
{
symtab_section = NULL;
for (i = 0, s = sections;
i < num_sections;
i++, s = (Elf_Shdr *) ((char *) s + section_entsize))
if (s->sh_type == grub_host_to_target32 (SHT_SYMTAB))
{
symtab_section = s;
break;
}
if (! symtab_section)
grub_util_error ("no symbol table");
*start = SUFFIX (relocate_symbols) (e, sections, symtab_section,
section_vaddresses, section_entsize,
num_sections, image_target);
if (*start == 0)
grub_util_error ("start symbol is not defined");
/* Resolve addresses in the virtual address space. */
SUFFIX (relocate_addresses) (e, sections, section_addresses, section_entsize,
num_sections, strtab, image_target);
*reloc_size = SUFFIX (make_reloc_section) (e, reloc_section,
section_vaddresses, sections,
section_entsize, num_sections,
strtab, image_target);
}
else
{
*reloc_size = 0;
*reloc_section = NULL;
}
out_img = xmalloc (*kernel_sz + total_module_size);
for (i = 0, s = sections;
i < num_sections;
i++, s = (Elf_Shdr *) ((char *) s + section_entsize))
if (SUFFIX (is_data_section) (s, image_target)
|| SUFFIX (is_text_section) (s, image_target))
{
if (grub_target_to_host32 (s->sh_type) == SHT_NOBITS)
memset (out_img + section_addresses[i], 0,
grub_host_to_target_addr (s->sh_size));
else
memcpy (out_img + section_addresses[i],
kernel_img + grub_host_to_target_addr (s->sh_offset),
grub_host_to_target_addr (s->sh_size));
}
free (kernel_img);
return out_img;
}
#undef SUFFIX
#undef ELFCLASSXX
#undef Elf_Ehdr
#undef Elf_Phdr
#undef Elf_Shdr
#undef Elf_Addr
#undef Elf_Sym
#undef Elf_Off
#undef Elf_Rela
#undef Elf_Rel
#undef ELF_R_TYPE
#undef ELF_R_SYM

View file

@ -1,649 +0,0 @@
/* grub-mkimage.c - make a bootable image */
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2002,2003,2004,2005,2006,2007,2008,2009,2010 Free Software Foundation, Inc.
*
* GRUB 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 3 of the License, or
* (at your option) any later version.
*
* GRUB 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 GRUB. If not, see <http://www.gnu.org/licenses/>.
*/
#include <config.h>
#include <grub/types.h>
#include <grub/machine/boot.h>
#include <grub/machine/kernel.h>
#include <grub/machine/memory.h>
#include <grub/elf.h>
#include <grub/aout.h>
#include <grub/i18n.h>
#include <grub/kernel.h>
#include <grub/disk.h>
#include <grub/emu/misc.h>
#include <grub/util/misc.h>
#include <grub/util/resolve.h>
#include <grub/misc.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#define _GNU_SOURCE 1
#include <getopt.h>
#include "progname.h"
#define ALIGN_ADDR(x) (ALIGN_UP((x), GRUB_TARGET_SIZEOF_VOID_P))
#ifdef ENABLE_LZMA
#include <grub/lib/LzmaEnc.h>
static void *SzAlloc(void *p, size_t size) { p = p; return xmalloc(size); }
static void SzFree(void *p, void *address) { p = p; free(address); }
static ISzAlloc g_Alloc = { SzAlloc, SzFree };
static void
compress_kernel (char *kernel_img, size_t kernel_size,
char **core_img, size_t *core_size)
{
CLzmaEncProps props;
unsigned char out_props[5];
size_t out_props_size = 5;
LzmaEncProps_Init(&props);
props.dictSize = 1 << 16;
props.lc = 3;
props.lp = 0;
props.pb = 2;
props.numThreads = 1;
if (kernel_size < GRUB_KERNEL_MACHINE_RAW_SIZE)
grub_util_error (_("the core image is too small"));
*core_img = xmalloc (kernel_size);
memcpy (*core_img, kernel_img, GRUB_KERNEL_MACHINE_RAW_SIZE);
*core_size = kernel_size - GRUB_KERNEL_MACHINE_RAW_SIZE;
if (LzmaEncode((unsigned char *) *core_img + GRUB_KERNEL_MACHINE_RAW_SIZE,
core_size,
(unsigned char *) kernel_img + GRUB_KERNEL_MACHINE_RAW_SIZE,
kernel_size - GRUB_KERNEL_MACHINE_RAW_SIZE,
&props, out_props, &out_props_size,
0, NULL, &g_Alloc, &g_Alloc) != SZ_OK)
grub_util_error (_("cannot compress the kernel image"));
*core_size += GRUB_KERNEL_MACHINE_RAW_SIZE;
}
#else /* No lzma compression */
static void
compress_kernel (char *kernel_img, size_t kernel_size,
char **core_img, size_t *core_size)
{
*core_img = xmalloc (kernel_size);
memcpy (*core_img, kernel_img, kernel_size);
*core_size = kernel_size;
}
#endif /* No lzma compression */
static void
generate_image (const char *dir, char *prefix, FILE *out, char *mods[],
char *memdisk_path, char *font_path, char *config_path,
#ifdef GRUB_PLATFORM_IMAGE_DEFAULT
grub_platform_image_format_t format
#else
int dummy __attribute__ ((unused))
#endif
)
{
char *kernel_img, *core_img;
size_t kernel_size, total_module_size, core_size;
size_t memdisk_size = 0, font_size = 0, config_size = 0, config_size_pure = 0;
char *kernel_path;
size_t offset;
struct grub_util_path_list *path_list, *p, *next;
struct grub_module_info *modinfo;
path_list = grub_util_resolve_dependencies (dir, "moddep.lst", mods);
kernel_path = grub_util_get_path (dir, "kernel.img");
kernel_size = grub_util_get_image_size (kernel_path);
total_module_size = sizeof (struct grub_module_info);
if (memdisk_path)
{
memdisk_size = ALIGN_UP(grub_util_get_image_size (memdisk_path), 512);
grub_util_info ("the size of memory disk is 0x%x", memdisk_size);
total_module_size += memdisk_size + sizeof (struct grub_module_header);
}
if (font_path)
{
font_size = ALIGN_ADDR (grub_util_get_image_size (font_path));
total_module_size += font_size + sizeof (struct grub_module_header);
}
if (config_path)
{
config_size_pure = grub_util_get_image_size (config_path) + 1;
config_size = ALIGN_ADDR (config_size_pure);
grub_util_info ("the size of config file is 0x%x", config_size);
total_module_size += config_size + sizeof (struct grub_module_header);
}
for (p = path_list; p; p = p->next)
total_module_size += (ALIGN_ADDR (grub_util_get_image_size (p->name))
+ sizeof (struct grub_module_header));
grub_util_info ("the total module size is 0x%x", total_module_size);
kernel_img = xmalloc (kernel_size + total_module_size);
grub_util_load_image (kernel_path, kernel_img);
if (GRUB_KERNEL_MACHINE_PREFIX + strlen (prefix) + 1 > GRUB_KERNEL_MACHINE_DATA_END)
grub_util_error (_("prefix is too long"));
strcpy (kernel_img + GRUB_KERNEL_MACHINE_PREFIX, prefix);
/* Fill in the grub_module_info structure. */
modinfo = (struct grub_module_info *) (kernel_img + kernel_size);
memset (modinfo, 0, sizeof (struct grub_module_info));
modinfo->magic = grub_host_to_target32 (GRUB_MODULE_MAGIC);
modinfo->offset = grub_host_to_target_addr (sizeof (struct grub_module_info));
modinfo->size = grub_host_to_target_addr (total_module_size);
offset = kernel_size + sizeof (struct grub_module_info);
for (p = path_list; p; p = p->next)
{
struct grub_module_header *header;
size_t mod_size, orig_size;
orig_size = grub_util_get_image_size (p->name);
mod_size = ALIGN_ADDR (orig_size);
header = (struct grub_module_header *) (kernel_img + offset);
memset (header, 0, sizeof (struct grub_module_header));
header->type = grub_host_to_target32 (OBJ_TYPE_ELF);
header->size = grub_host_to_target32 (mod_size + sizeof (*header));
offset += sizeof (*header);
memset (kernel_img + offset + orig_size, 0, mod_size - orig_size);
grub_util_load_image (p->name, kernel_img + offset);
offset += mod_size;
}
if (memdisk_path)
{
struct grub_module_header *header;
header = (struct grub_module_header *) (kernel_img + offset);
memset (header, 0, sizeof (struct grub_module_header));
header->type = grub_host_to_target32 (OBJ_TYPE_MEMDISK);
header->size = grub_host_to_target32 (memdisk_size + sizeof (*header));
offset += sizeof (*header);
grub_util_load_image (memdisk_path, kernel_img + offset);
offset += memdisk_size;
}
if (font_path)
{
struct grub_module_header *header;
header = (struct grub_module_header *) (kernel_img + offset);
memset (header, 0, sizeof (struct grub_module_header));
header->type = grub_host_to_target32 (OBJ_TYPE_FONT);
header->size = grub_host_to_target32 (font_size + sizeof (*header));
offset += sizeof (*header);
grub_util_load_image (font_path, kernel_img + offset);
offset += font_size;
}
if (config_path)
{
struct grub_module_header *header;
header = (struct grub_module_header *) (kernel_img + offset);
memset (header, 0, sizeof (struct grub_module_header));
header->type = grub_host_to_target32 (OBJ_TYPE_CONFIG);
header->size = grub_host_to_target32 (config_size + sizeof (*header));
offset += sizeof (*header);
grub_util_load_image (config_path, kernel_img + offset);
*(kernel_img + offset + config_size_pure - 1) = 0;
offset += config_size;
}
grub_util_info ("kernel_img=%p, kernel_size=0x%x", kernel_img, kernel_size);
compress_kernel (kernel_img, kernel_size + total_module_size,
&core_img, &core_size);
grub_util_info ("the core size is 0x%x", core_size);
#ifdef GRUB_KERNEL_MACHINE_TOTAL_MODULE_SIZE
*((grub_uint32_t *) (core_img + GRUB_KERNEL_MACHINE_TOTAL_MODULE_SIZE))
= grub_host_to_target32 (total_module_size);
#endif
*((grub_uint32_t *) (core_img + GRUB_KERNEL_MACHINE_KERNEL_IMAGE_SIZE))
= grub_host_to_target32 (kernel_size);
#ifdef GRUB_KERNEL_MACHINE_COMPRESSED_SIZE
*((grub_uint32_t *) (core_img + GRUB_KERNEL_MACHINE_COMPRESSED_SIZE))
= grub_host_to_target32 (core_size - GRUB_KERNEL_MACHINE_RAW_SIZE);
#endif
#if defined(GRUB_KERNEL_MACHINE_INSTALL_DOS_PART) && defined(GRUB_KERNEL_MACHINE_INSTALL_BSD_PART)
/* If we included a drive in our prefix, let GRUB know it doesn't have to
prepend the drive told by BIOS. */
if (prefix[0] == '(')
{
*((grub_int32_t *) (core_img + GRUB_KERNEL_MACHINE_INSTALL_DOS_PART))
= grub_host_to_target32 (-2);
*((grub_int32_t *) (core_img + GRUB_KERNEL_MACHINE_INSTALL_BSD_PART))
= grub_host_to_target32 (-2);
}
#endif
#ifdef GRUB_MACHINE_PCBIOS
if (GRUB_KERNEL_MACHINE_LINK_ADDR + core_size > GRUB_MEMORY_MACHINE_UPPER)
grub_util_error (_("core image is too big (%p > %p)"),
GRUB_KERNEL_MACHINE_LINK_ADDR + core_size,
GRUB_MEMORY_MACHINE_UPPER);
#endif
#if defined(GRUB_MACHINE_PCBIOS)
{
unsigned num;
char *boot_path, *boot_img;
size_t boot_size;
num = ((core_size + GRUB_DISK_SECTOR_SIZE - 1) >> GRUB_DISK_SECTOR_BITS);
if (num > 0xffff)
grub_util_error (_("the core image is too big"));
boot_path = grub_util_get_path (dir, "diskboot.img");
boot_size = grub_util_get_image_size (boot_path);
if (boot_size != GRUB_DISK_SECTOR_SIZE)
grub_util_error (_("diskboot.img size must be %u bytes"),
GRUB_DISK_SECTOR_SIZE);
boot_img = grub_util_read_image (boot_path);
{
struct grub_boot_blocklist *block;
block = (struct grub_boot_blocklist *) (boot_img
+ GRUB_DISK_SECTOR_SIZE
- sizeof (*block));
block->len = grub_host_to_target16 (num);
/* This is filled elsewhere. Verify it just in case. */
assert (block->segment
== grub_host_to_target16 (GRUB_BOOT_MACHINE_KERNEL_SEG
+ (GRUB_DISK_SECTOR_SIZE >> 4)));
}
grub_util_write_image (boot_img, boot_size, out);
free (boot_img);
free (boot_path);
}
#elif defined(GRUB_MACHINE_QEMU)
{
char *rom_img;
size_t rom_size;
char *boot_path, *boot_img;
size_t boot_size;
boot_path = grub_util_get_path (dir, "boot.img");
boot_size = grub_util_get_image_size (boot_path);
boot_img = grub_util_read_image (boot_path);
/* Rom sizes must be 64k-aligned. */
rom_size = ALIGN_UP (core_size + boot_size, 64 * 1024);
rom_img = xmalloc (rom_size);
memset (rom_img, 0, rom_size);
*((grub_int32_t *) (core_img + GRUB_KERNEL_MACHINE_CORE_ENTRY_ADDR))
= grub_host_to_target32 ((grub_uint32_t) -rom_size);
memcpy (rom_img, core_img, core_size);
*((grub_int32_t *) (boot_img + GRUB_BOOT_MACHINE_CORE_ENTRY_ADDR))
= grub_host_to_target32 ((grub_uint32_t) -rom_size);
memcpy (rom_img + rom_size - boot_size, boot_img, boot_size);
free (core_img);
core_img = rom_img;
core_size = rom_size;
free (boot_img);
free (boot_path);
}
#elif defined (GRUB_MACHINE_SPARC64)
if (format == GRUB_PLATFORM_IMAGE_AOUT)
{
void *aout_img;
size_t aout_size;
struct grub_aout32_header *aout_head;
aout_size = core_size + sizeof (*aout_head);
aout_img = xmalloc (aout_size);
aout_head = aout_img;
aout_head->a_midmag = grub_host_to_target32 ((AOUT_MID_SUN << 16)
| AOUT32_OMAGIC);
aout_head->a_text = grub_host_to_target32 (core_size);
aout_head->a_entry
= grub_host_to_target32 (GRUB_BOOT_MACHINE_IMAGE_ADDRESS);
memcpy (aout_img + sizeof (*aout_head), core_img, core_size);
free (core_img);
core_img = aout_img;
core_size = aout_size;
}
else
{
unsigned int num;
char *boot_path, *boot_img;
size_t boot_size;
num = ((core_size + GRUB_DISK_SECTOR_SIZE - 1) >> GRUB_DISK_SECTOR_BITS);
num <<= GRUB_DISK_SECTOR_BITS;
boot_path = grub_util_get_path (dir, "diskboot.img");
boot_size = grub_util_get_image_size (boot_path);
if (boot_size != GRUB_DISK_SECTOR_SIZE)
grub_util_error ("diskboot.img is not one sector size");
boot_img = grub_util_read_image (boot_path);
*((grub_uint32_t *) (boot_img + GRUB_DISK_SECTOR_SIZE
- GRUB_BOOT_MACHINE_LIST_SIZE + 8))
= grub_host_to_target32 (num);
grub_util_write_image (boot_img, boot_size, out);
free (boot_img);
free (boot_path);
}
#elif defined(GRUB_MACHINE_MIPS)
if (format == GRUB_PLATFORM_IMAGE_ELF)
{
char *elf_img;
size_t program_size;
Elf32_Ehdr *ehdr;
Elf32_Phdr *phdr;
grub_uint32_t target_addr;
program_size = ALIGN_ADDR (core_size);
elf_img = xmalloc (program_size + sizeof (*ehdr) + sizeof (*phdr));
memset (elf_img, 0, program_size + sizeof (*ehdr) + sizeof (*phdr));
memcpy (elf_img + sizeof (*ehdr) + sizeof (*phdr), core_img, core_size);
ehdr = (void *) elf_img;
phdr = (void *) (elf_img + sizeof (*ehdr));
memcpy (ehdr->e_ident, ELFMAG, SELFMAG);
ehdr->e_ident[EI_CLASS] = ELFCLASS32;
#ifdef GRUB_CPU_MIPSEL
ehdr->e_ident[EI_DATA] = ELFDATA2LSB;
#else
ehdr->e_ident[EI_DATA] = ELFDATA2MSB;
#endif
ehdr->e_ident[EI_VERSION] = EV_CURRENT;
ehdr->e_ident[EI_OSABI] = ELFOSABI_NONE;
ehdr->e_type = grub_host_to_target16 (ET_EXEC);
ehdr->e_machine = grub_host_to_target16 (EM_MIPS);
ehdr->e_version = grub_host_to_target32 (EV_CURRENT);
ehdr->e_phoff = grub_host_to_target32 ((char *) phdr - (char *) ehdr);
ehdr->e_phentsize = grub_host_to_target16 (sizeof (*phdr));
ehdr->e_phnum = grub_host_to_target16 (1);
/* No section headers. */
ehdr->e_shoff = grub_host_to_target32 (0);
ehdr->e_shentsize = grub_host_to_target16 (0);
ehdr->e_shnum = grub_host_to_target16 (0);
ehdr->e_shstrndx = grub_host_to_target16 (0);
ehdr->e_ehsize = grub_host_to_target16 (sizeof (*ehdr));
phdr->p_type = grub_host_to_target32 (PT_LOAD);
phdr->p_offset = grub_host_to_target32 (sizeof (*ehdr) + sizeof (*phdr));
phdr->p_flags = grub_host_to_target32 (PF_R | PF_W | PF_X);
target_addr = ALIGN_UP (GRUB_KERNEL_MACHINE_LINK_ADDR
+ kernel_size + total_module_size, 32);
ehdr->e_entry = grub_host_to_target32 (target_addr);
phdr->p_vaddr = grub_host_to_target32 (target_addr);
phdr->p_paddr = grub_host_to_target32 (target_addr);
phdr->p_align = grub_host_to_target32 (GRUB_KERNEL_MACHINE_LINK_ALIGN);
ehdr->e_flags = grub_host_to_target32 (0x1000 | EF_MIPS_NOREORDER
| EF_MIPS_PIC | EF_MIPS_CPIC);
phdr->p_filesz = grub_host_to_target32 (core_size);
phdr->p_memsz = grub_host_to_target32 (core_size);
free (core_img);
core_img = elf_img;
core_size = program_size + sizeof (*ehdr) + sizeof (*phdr);
}
#endif
grub_util_write_image (core_img, core_size, out);
free (kernel_img);
free (core_img);
free (kernel_path);
while (path_list)
{
next = path_list->next;
free ((void *) path_list->name);
free (path_list);
path_list = next;
}
}
static struct option options[] =
{
{"directory", required_argument, 0, 'd'},
{"prefix", required_argument, 0, 'p'},
{"memdisk", required_argument, 0, 'm'},
{"font", required_argument, 0, 'f'},
{"config", required_argument, 0, 'c'},
{"output", required_argument, 0, 'o'},
#ifdef GRUB_PLATFORM_IMAGE_DEFAULT
{"format", required_argument, 0, 'O'},
#endif
{"help", no_argument, 0, 'h'},
{"version", no_argument, 0, 'V'},
{"verbose", no_argument, 0, 'v'},
{0, 0, 0, 0}
};
static void
usage (int status)
{
if (status)
fprintf (stderr, _("Try `%s --help' for more information.\n"), program_name);
else
printf (_("\
Usage: %s [OPTION]... [MODULES]\n\
\n\
Make a bootable image of GRUB.\n\
\n\
-d, --directory=DIR use images and modules under DIR [default=%s]\n\
-p, --prefix=DIR set grub_prefix directory [default=%s]\n\
-m, --memdisk=FILE embed FILE as a memdisk image\n\
-f, --font=FILE embed FILE as a boot font\n\
-c, --config=FILE embed FILE as boot config\n\
-o, --output=FILE output a generated image to FILE [default=stdout]\n"
#ifdef GRUB_PLATFORM_IMAGE_DEFAULT
"\
-O, --format=FORMAT generate an image in format [default=%s]\n\
available formats: %s\n"
#endif
"\
-h, --help display this message and exit\n\
-V, --version print version information and exit\n\
-v, --verbose print verbose messages\n\
\n\
Report bugs to <%s>.\n\
"),
program_name, GRUB_LIBDIR, DEFAULT_DIRECTORY,
#ifdef GRUB_PLATFORM_IMAGE_DEFAULT
GRUB_PLATFORM_IMAGE_DEFAULT_FORMAT, GRUB_PLATFORM_IMAGE_FORMATS,
#endif
PACKAGE_BUGREPORT);
exit (status);
}
int
main (int argc, char *argv[])
{
char *output = NULL;
char *dir = NULL;
char *prefix = NULL;
char *memdisk = NULL;
char *font = NULL;
char *config = NULL;
FILE *fp = stdout;
#ifdef GRUB_PLATFORM_IMAGE_DEFAULT
grub_platform_image_format_t format = GRUB_PLATFORM_IMAGE_DEFAULT;
#endif
set_program_name (argv[0]);
grub_util_init_nls ();
while (1)
{
int c = getopt_long (argc, argv, "d:p:m:c:o:O:f:hVv", options, 0);
if (c == -1)
break;
else
switch (c)
{
case 'o':
if (output)
free (output);
output = xstrdup (optarg);
break;
#ifdef GRUB_PLATFORM_IMAGE_DEFAULT
case 'O':
#ifdef GRUB_PLATFORM_IMAGE_RAW
if (strcmp (optarg, "raw") == 0)
format = GRUB_PLATFORM_IMAGE_RAW;
else
#endif
#ifdef GRUB_PLATFORM_IMAGE_ELF
if (strcmp (optarg, "elf") == 0)
format = GRUB_PLATFORM_IMAGE_ELF;
else
#endif
#ifdef GRUB_PLATFORM_IMAGE_AOUT
if (strcmp (optarg, "aout") == 0)
format = GRUB_PLATFORM_IMAGE_AOUT;
else
#endif
usage (1);
break;
#endif
case 'd':
if (dir)
free (dir);
dir = xstrdup (optarg);
break;
case 'm':
if (memdisk)
free (memdisk);
memdisk = xstrdup (optarg);
if (prefix)
free (prefix);
prefix = xstrdup ("(memdisk)/boot/grub");
break;
case 'f':
if (font)
free (font);
font = xstrdup (optarg);
break;
case 'c':
if (config)
free (config);
config = xstrdup (optarg);
break;
case 'h':
usage (0);
break;
case 'p':
if (prefix)
free (prefix);
prefix = xstrdup (optarg);
break;
case 'V':
printf ("grub-mkimage (%s) %s\n", PACKAGE_NAME, PACKAGE_VERSION);
return 0;
case 'v':
verbosity++;
break;
default:
usage (1);
break;
}
}
if (output)
{
fp = fopen (output, "wb");
if (! fp)
grub_util_error (_("cannot open %s"), output);
free (output);
}
generate_image (dir ? : GRUB_LIBDIR, prefix ? : DEFAULT_DIRECTORY, fp,
argv + optind, memdisk, font, config,
#ifdef GRUB_PLATFORM_IMAGE_DEFAULT
format
#else
0
#endif
);
fclose (fp);
if (dir)
free (dir);
return 0;
}

View file

@ -41,7 +41,7 @@ usage (int status)
printf ("\ printf ("\
Usage: %s [OPTIONS] PATH\n\ Usage: %s [OPTIONS] PATH\n\
\n\ \n\
Make a system path relative to it's root.\n\ Make a system path relative to its root.\n\
\n\ \n\
Options:\n\ Options:\n\
-h, --help display this message and exit\n\ -h, --help display this message and exit\n\

View file

@ -30,11 +30,14 @@ target_cpu=@target_cpu@
native_platform=@platform@ native_platform=@platform@
pkglib_DATA="moddep.lst command.lst fs.lst partmap.lst parttool.lst handler.lst video.lst crypto.lst terminal.lst" pkglib_DATA="moddep.lst command.lst fs.lst partmap.lst parttool.lst handler.lst video.lst crypto.lst terminal.lst"
mkimage=${bindir}/grub-mkimage multiboot_dir=${libdir}/$(echo ${PACKAGE_TARNAME} | sed ${transform})/i386-multiboot
mkisofs=${bindir}/grub-mkisofs coreboot_dir=${libdir}/$(echo ${PACKAGE_TARNAME} | sed ${transform})/i386-coreboot
mkelfimage=${bindir}/grub-mkelfimage qemu_dir=${libdir}/$(echo ${PACKAGE_TARNAME} | sed ${transform})/i386-qemu
multiboot_dir=${libdir}/$(echo ${PACKAGE_TARNAME} | sed ${transform})/${target_cpu}-multiboot pc_dir=${libdir}/$(echo ${PACKAGE_TARNAME} | sed ${transform})/i386-pc
pc_dir=${libdir}/$(echo ${PACKAGE_TARNAME} | sed ${transform})/${target_cpu}-pc efi32_dir=${libdir}/$(echo ${PACKAGE_TARNAME} | sed ${transform})/i386-efi
efi64_dir=${libdir}/$(echo ${PACKAGE_TARNAME} | sed ${transform})/x86_64-efi
rom_directory=
grub_mkimage=${bindir}/`echo grub-mkimage | sed ${transform}`
# Usage: usage # Usage: usage
# Print the usage. # Print the usage.
@ -45,8 +48,10 @@ Make GRUB rescue image.
-h, --help print this message and exit -h, --help print this message and exit
-v, --version print the version information and exit -v, --version print the version information and exit
--modules=MODULES pre-load specified modules MODULES
--output=FILE save output in FILE [required] --output=FILE save output in FILE [required]
--modules=MODULES pre-load specified modules MODULES
--rom-directory=DIR save rom images in DIR [optional]
--grub-mkimage=FILE use FILE as grub-mkimage
$0 generates a bootable rescue image with specified source files or directories. $0 generates a bootable rescue image with specified source files or directories.
@ -67,14 +72,16 @@ for option in "$@"; do
modules=`echo "$option" | sed 's/--modules=//'` ;; modules=`echo "$option" | sed 's/--modules=//'` ;;
--output=*) --output=*)
output_image=`echo "$option" | sed 's/--output=//'` ;; output_image=`echo "$option" | sed 's/--output=//'` ;;
--rom-directory=*)
rom_directory=`echo "$option" | sed 's/--rom-directory=//'` ;;
# Intentionally undocumented # Intentionally undocumented
--override-directory=*) --override-directory=*)
override_dir=`echo "${option}/" | sed 's/--override-directory=//'` override_dir=`echo "${option}/" | sed 's/--override-directory=//'`
PATH=${override_dir}:$PATH PATH=${override_dir}:$PATH
export PATH export PATH
;; ;;
--root-directory=*) --grub-mkimage=*)
rootdir=`echo "${option}/" | sed 's/--root-directory=//'` ;; grub_mkimage=`echo "$option" | sed 's/--grub-mkimage=//'` ;;
-*) -*)
echo "Unrecognized option \`$option'" 1>&2 echo "Unrecognized option \`$option'" 1>&2
usage usage
@ -91,6 +98,14 @@ if [ "x${output_image}" = x ] ; then
exit 1 exit 1
fi fi
set $grub_mkimage dummy
if test -f "$1"; then
:
else
echo "$1: Not found." 1>&2
exit 1
fi
if test "x$TMP" != x; then if test "x$TMP" != x; then
MKTEMP_TEMPLATE="$TMP/grub-mkrescue.XXXXXXXXXX" MKTEMP_TEMPLATE="$TMP/grub-mkrescue.XXXXXXXXXX"
elif test "x$TEMP" != x; then elif test "x$TEMP" != x; then
@ -106,15 +121,15 @@ process_input_dir ()
{ {
input_dir="$1" input_dir="$1"
platform="$2" platform="$2"
mkdir -p ${iso9660_dir}/boot/grub/${target_cpu}-${platform} mkdir -p ${iso9660_dir}/boot/grub/${platform}
for file in ${input_dir}/*.mod; do for file in ${input_dir}/*.mod; do
if test -f "$file"; then if test -f "$file"; then
cp -f "$file" ${iso9660_dir}/boot/grub/${target_cpu}-${platform}/ cp -f "$file" ${iso9660_dir}/boot/grub/${platform}/
fi fi
done done
for file in ${pkglib_DATA}; do for file in ${pkglib_DATA}; do
if test -f "${input_dir}/${file}"; then if test -f "${input_dir}/${file}"; then
cp -f "${input_dir}/${file}" ${iso9660_dir}/boot/grub/${target_cpu}-${platform}/ cp -f "${input_dir}/${file}" ${iso9660_dir}/boot/grub/${platform}/
fi fi
done done
@ -126,65 +141,85 @@ process_input_dir ()
done done
} }
if [ "${rootdir}" != "" ] ; then make_image ()
coreboot_dir="${rootdir}/${coreboot_dir}" {
pc_dir="${rootdir}/${pc_dir}" source_directory="$1"
mkimage="${rootdir}/${mkimage}" platform=$2
mkisofs="${rootdir}/${mkisofs}" if ! test -e "${source_directory}"; then
mkelfimage="${rootdir}/${mkelfimage}" return;
fi
if [ "${override_dir}" = "" ] ; then
if test -e "${multiboot_dir}" ; then
process_input_dir ${multiboot_dir} multiboot
fi fi
if test -e "${pc_dir}" ; then
process_input_dir ${pc_dir} pc
fi
else
process_input_dir ${override_dir} ${native_platform}
multiboot_dir=
pc_dir=
case "${native_platform}" in
multiboot) multiboot_dir=${override_dir} ;;
pc) pc_dir=${override_dir} ;;
esac
fi
# build multiboot core.img echo "Enabling $2 support ..."
if test -e "${multiboot_dir}" ; then
echo "Enabling multiboot support ..."
memdisk_img=`mktemp "$MKTEMP_TEMPLATE"` memdisk_img=`mktemp "$MKTEMP_TEMPLATE"`
memdisk_dir=`mktemp -d "$MKTEMP_TEMPLATE"` memdisk_dir=`mktemp -d "$MKTEMP_TEMPLATE"`
mkdir -p ${memdisk_dir}/boot/grub mkdir -p ${memdisk_dir}/boot/grub
# obtain date-based UUID
iso_uuid=$(date -u +%Y-%m-%d-%H-%M-%S-00)
modules="$(cat ${multiboot_dir}/partmap.lst) ${modules}" modules="$(cat ${source_directory}/partmap.lst) ${modules}"
cat << EOF > ${memdisk_dir}/boot/grub/grub.cfg cat << EOF > ${memdisk_dir}/boot/grub/grub.cfg
search --fs-uuid --set ${iso_uuid} search --fs-uuid --set ${iso_uuid}
set prefix=(\${root})/boot/grub/${target_cpu}-multiboot set prefix=(\${root})/boot/grub/${platform}
source \$prefix/grub.cfg
EOF EOF
(for i in ${modules} ; do (for i in ${modules} ; do
echo "insmod $i" echo "insmod $i"
done ; \ done ; \
echo "source /boot/grub/grub.cfg") \ echo "source /boot/grub/grub.cfg") \
> ${iso9660_dir}/boot/grub/i386-multiboot/grub.cfg > ${iso9660_dir}/boot/grub/${platform}/grub.cfg
tar -C ${memdisk_dir} -cf ${memdisk_img} boot tar -C ${memdisk_dir} -cf ${memdisk_img} boot
rm -rf ${memdisk_dir} rm -rf ${memdisk_dir}
${mkelfimage} -d ${multiboot_dir}/ -m ${memdisk_img} -o ${iso9660_dir}/boot/multiboot.img \ $grub_mkimage -O ${platform} -d "${source_directory}" -m "${memdisk_img}" -o "$3" --prefix='(memdisk)/boot/grub' \
memdisk tar search iso9660 configfile sh \ search iso9660 configfile normal sh memdisk tar $4
ata at_keyboard rm -rf ${memdisk_img}
rm -f ${memdisk_img} }
grub_mkisofs_arguments="${grub_mkisofs_arguments} --modification-date=$(echo ${iso_uuid} | sed -e s/-//g)"
if [ "${override_dir}" = "" ] ; then
if test -e "${multiboot_dir}" ; then
process_input_dir ${multiboot_dir} i386-multiboot
fi
if test -e "${coreboot_dir}" ; then
process_input_dir ${coreboot_dir} i386-coreboot
fi
if test -e "${qemu_dir}" ; then
process_input_dir ${qemu_dir} i386-qemu
fi
if test -e "${pc_dir}" ; then
process_input_dir ${pc_dir} i386-pc
fi
if test -e "${efi32_dir}" ; then
process_input_dir ${efi32_dir} i386-efi
fi
if test -e "${efi64_dir}" ; then
process_input_dir ${efi64_dir} x86_64-efi
fi
else
process_input_dir ${override_dir} ${target_cpu}-${native_platform}
multiboot_dir=
pc_dir=
efi32_dir=
efi64_dir=
coreboot_dir=
qemu_dir=
case "${target_cpu}-${native_platform}" in
i386-multiboot) multiboot_dir=${override_dir} ;;
i386-coreboot) coreboot_dir=${override_dir} ;;
i386-qemu) qemu_dir=${override_dir} ;;
i386-pc) pc_dir=${override_dir} ;;
i386-efi) efi32_dir=${override_dir} ;;
x86_64-efi) efi64_dir=${override_dir} ;;
esac
fi fi
# obtain date-based UUID
iso_uuid=$(date -u +%Y-%m-%d-%H-%M-%S-00)
grub_mkisofs_arguments="${grub_mkisofs_arguments} --modification-date=$(echo ${iso_uuid} | sed -e s/-//g)"
# build BIOS core.img # build BIOS core.img
if test -e "${pc_dir}" ; then if test -e "${pc_dir}" ; then
echo "Enabling BIOS support ..." echo "Enabling BIOS support ..."
core_img=`mktemp "$MKTEMP_TEMPLATE"` core_img=`mktemp "$MKTEMP_TEMPLATE"`
${mkimage} -d ${pc_dir}/ -o ${core_img} --prefix=/boot/grub/i386-pc \ $grub_mkimage -O i386-pc -d ${pc_dir}/ -o ${core_img} --prefix=/boot/grub/i386-pc \
iso9660 biosdisk iso9660 biosdisk
cat ${pc_dir}/cdboot.img ${core_img} > ${iso9660_dir}/boot/grub/i386-pc/eltorito.img cat ${pc_dir}/cdboot.img ${core_img} > ${iso9660_dir}/boot/grub/i386-pc/eltorito.img
@ -204,8 +239,34 @@ if test -e "${pc_dir}" ; then
--embedded-boot ${embed_img}" --embedded-boot ${embed_img}"
fi fi
# build multiboot core.img
make_image "${multiboot_dir}" i386-multiboot "${iso9660_dir}/boot/multiboot.img" "ata at_keyboard"
if test -e "${efi64_dir}" || test -e "${efi32_dir}"; then
efi_dir=`mktemp -d "$MKTEMP_TEMPLATE"`
mkdir -p "${efi_dir}/efi/boot"
# build bootx64.efi
make_image "${efi64_dir}" x86_64-efi "${efi_dir}"/efi/boot/bootx64.efi ""
# build bootia32.efi
make_image "${efi32_dir}" i386-efi "${efi_dir}"/efi/boot/bootia32.efi ""
mformat -C -f 2880 -L 16 -i "${iso9660_dir}"/efi.img ::
mcopy -s -i "${iso9660_dir}"/efi.img ${efi_dir}/efi ::/
grub_mkisofs_arguments="${grub_mkisofs_arguments} --efi-boot efi.img"
fi
make_image "${qemu_dir}" i386-qemu "${iso9660_dir}/boot/qemu.img" "ata at_keyboard"
if [ -e "${iso9660_dir}/boot/qemu.img" ] && [ -d "${rom_directory}" ]; then
cp "${iso9660_dir}/boot/qemu.img" "${rom_directory}/qemu.img"
fi
make_image "${coreboot_dir}" i386-coreboot "${iso9660_dir}/boot/coreboot.elf" "ata at_keyboard"
if [ -e "${iso9660_dir}/boot/coreboot.elf" ] && [ -d "${rom_directory}" ]; then
cp "${iso9660_dir}/boot/coreboot.elf" "${rom_directory}/coreboot.elf"
fi
# build iso image # build iso image
${mkisofs} ${grub_mkisofs_arguments} --protective-msdos-label -o ${output_image} -r ${iso9660_dir} ${source} xorriso -pathspecs on -as mkisofs ${grub_mkisofs_arguments} --protective-msdos-label -o ${output_image} -r ${iso9660_dir} ${source}
rm -rf ${iso9660_dir} rm -rf ${iso9660_dir}
rm -f ${embed_img} rm -f ${embed_img}

View file

@ -38,11 +38,29 @@ if [ "x${GRUB_DEFAULT}" = "xsaved" ] ; then GRUB_DEFAULT='${saved_entry}' ; fi
if [ "x${GRUB_TIMEOUT}" = "x" ] ; then GRUB_TIMEOUT=5 ; fi if [ "x${GRUB_TIMEOUT}" = "x" ] ; then GRUB_TIMEOUT=5 ; fi
if [ "x${GRUB_GFXMODE}" = "x" ] ; then GRUB_GFXMODE=640x480 ; fi if [ "x${GRUB_GFXMODE}" = "x" ] ; then GRUB_GFXMODE=640x480 ; fi
if [ "x${GRUB_DEFAULT_BUTTON}" = "x" ] ; then GRUB_DEFAULT_BUTTON="$GRUB_DEFAULT" ; fi
if [ "x${GRUB_DEFAULT_BUTTON}" = "xsaved" ] ; then GRUB_DEFAULT_BUTTON='${saved_entry}' ; fi
if [ "x${GRUB_TIMEOUT_BUTTON}" = "x" ] ; then GRUB_TIMEOUT_BUTTON="$GRUB_TIMEOUT" ; fi
cat << EOF cat << EOF
if [ -s \$prefix/grubenv ]; then if [ -s \$prefix/grubenv ]; then
load_env load_env
fi fi
EOF
if [ "x$GRUB_BUTTON_CMOS_ADDRESS" != "x" ]; then
cat <<EOF
if cmostest $GRUB_BUTTON_CMOS_ADDRESS ; then
set default="${GRUB_DEFAULT_BUTTON}"
else
set default="${GRUB_DEFAULT}"
fi
EOF
else
cat <<EOF
set default="${GRUB_DEFAULT}" set default="${GRUB_DEFAULT}"
EOF
fi
cat <<EOF
if [ \${prev_saved_entry} ]; then if [ \${prev_saved_entry} ]; then
set saved_entry=\${prev_saved_entry} set saved_entry=\${prev_saved_entry}
save_env saved_entry save_env saved_entry
@ -186,21 +204,36 @@ insmod gettext
EOF EOF
fi fi
if [ "x${GRUB_HIDDEN_TIMEOUT}" != "x" ] ; then make_timeout ()
if [ "x${GRUB_HIDDEN_TIMEOUT_QUIET}" = "xtrue" ] ; then {
verbose= if [ "x${1}" != "x" ] ; then
else if [ "x${GRUB_HIDDEN_TIMEOUT_QUIET}" = "xtrue" ] ; then
verbose=" --verbose" verbose=
fi else
cat << EOF verbose=" --verbose"
if sleep$verbose --interruptible ${GRUB_HIDDEN_TIMEOUT} ; then fi
set timeout=${GRUB_TIMEOUT} cat << EOF
if sleep$verbose --interruptible ${1} ; then
set timeout=${2}
fi fi
EOF EOF
else else
cat << EOF cat << EOF
set timeout=${GRUB_TIMEOUT} set timeout=${2}
EOF EOF
fi
}
if [ "x$GRUB_BUTTON_CMOS_ADDRESS" != "x" ]; then
cat <<EOF
if cmostest $GRUB_BUTTON_CMOS_ADDRESS ; then
EOF
make_timeout "${GRUB_HIDDEN_TIMEOUT_BUTTON}" "${GRUB_TIMEOUT_BUTTON}"
echo else
make_timeout "${GRUB_HIDDEN_TIMEOUT}" "${GRUB_TIMEOUT}"
echo fi
else
make_timeout "${GRUB_HIDDEN_TIMEOUT}" "${GRUB_TIMEOUT}"
fi fi
# Play an initial tune # Play an initial tune

View file

@ -35,13 +35,13 @@ all_of_them=true
# FIXME: add l4 here? # FIXME: add l4 here?
kernel= kernel=
for i in /boot/gnumach.gz /boot/gnumach ; do for i in /boot/gnumach* ; do
if test -e $i ; then if test -e $i ; then
basename=`basename $i` basename=`basename $i`
dirname=`dirname $i` dirname=`dirname $i`
rel_dirname=`make_system_path_relative_to_its_root $dirname` rel_dirname=`make_system_path_relative_to_its_root $dirname`
echo "Found GNU Mach: $i" >&2 echo "Found GNU Mach: $i" >&2
kernel=${rel_dirname}/${basename} kernels="${kernels} ${rel_dirname}/${basename}"
at_least_one=true at_least_one=true
fi fi
done done
@ -71,17 +71,22 @@ if ${all_of_them} && test -e /lib/ld.so.1 ; then : ; else
exit 1 exit 1
fi fi
cat << EOF for kernel in ${kernels}
menuentry "${OS}" ${CLASS} { do
kernel_base="`basename "${kernel}"`"
KERNEL="using ${kernel_base}"
cat << EOF
menuentry "${OS} ${KERNEL}" ${CLASS} {
EOF EOF
prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | sed -e "s/^/\t/" prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | sed -e "s/^/\t/"
cat << EOF cat << EOF
echo '$(gettext_quoted "Loading GNU Mach ...")' echo '$(gettext_quoted "Loading GNU Mach ...")'
multiboot ${kernel} root=device:${GRUB_DEVICE#/dev/} multiboot ${kernel} root=device:${GRUB_DEVICE#/dev/}
EOF EOF
save_default_entry | sed -e "s/^/\t/" save_default_entry | sed -e "s/^/\t/"
prepare_grub_to_access_device ${GRUB_DEVICE} | sed -e "s/^/\t/" prepare_grub_to_access_device ${GRUB_DEVICE} | sed -e "s/^/\t/"
cat << EOF cat << EOF
echo '$(gettext_quoted "Loading the Hurd ...")' echo '$(gettext_quoted "Loading the Hurd ...")'
module /hurd/${hurd_fs}.static ${hurd_fs} --readonly \\ module /hurd/${hurd_fs}.static ${hurd_fs} --readonly \\
--multiboot-command-line='\${kernel-command-line}' \\ --multiboot-command-line='\${kernel-command-line}' \\
@ -93,17 +98,17 @@ cat << EOF
} }
EOF EOF
cat << EOF cat << EOF
menuentry "${OS} (recovery mode)" { menuentry "${OS} ${KERNEL} (recovery mode)" ${CLASS} {
EOF EOF
prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | sed -e "s/^/\t/" prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | sed -e "s/^/\t/"
cat << EOF cat << EOF
echo '$(gettext_quoted "Loading GNU Mach ...")' echo '$(gettext_quoted "Loading GNU Mach ...")'
multiboot ${kernel} root=device:${GRUB_DEVICE#/dev/} -s multiboot ${kernel} root=device:${GRUB_DEVICE#/dev/} -s
EOF EOF
save_default_entry | sed -e "s/^/\t/" save_default_entry | sed -e "s/^/\t/"
prepare_grub_to_access_device ${GRUB_DEVICE} | sed -e "s/^/\t/" prepare_grub_to_access_device ${GRUB_DEVICE} | sed -e "s/^/\t/"
cat << EOF cat << EOF
echo '$(gettext_quoted "Loading the Hurd ...")' echo '$(gettext_quoted "Loading the Hurd ...")'
module /hurd/${hurd_fs}.static ${hurd_fs} \\ module /hurd/${hurd_fs}.static ${hurd_fs} \\
--multiboot-command-line='\${kernel-command-line}' \\ --multiboot-command-line='\${kernel-command-line}' \\
@ -114,3 +119,5 @@ cat << EOF
module /lib/ld.so.1 exec /hurd/exec '\$(exec-task=task-create)' module /lib/ld.so.1 exec /hurd/exec '\$(exec-task=task-create)'
} }
EOF EOF
done

View file

@ -1,7 +1,7 @@
#! /bin/sh -e #! /bin/sh -e
# grub-mkconfig helper script. # grub-mkconfig helper script.
# Copyright (C) 2008 Free Software Foundation, Inc. # Copyright (C) 2008,2009,2010 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
@ -28,8 +28,8 @@ esac
# Try C: even if current system is on other partition. # Try C: even if current system is on other partition.
case "$SYSTEMDRIVE" in case "$SYSTEMDRIVE" in
[Cc]:) dirlist="C:" ;; [Cc]:) drives="C:" ;;
[D-Zd-z]:) dirlist="C: $SYSTEMDRIVE" ;; [D-Zd-z]:) drives="C: $SYSTEMDRIVE" ;;
*) exit 0 ;; *) exit 0 ;;
esac esac
@ -51,7 +51,13 @@ get_os_name_from_boot_ini ()
} }
for dir in $dirlist ; do for drv in $drives ; do
# Convert to Cygwin path.
dir=`cygpath "$drv"`
test -n "$dir" || continue
needmap=
# Check for Vista bootmgr. # Check for Vista bootmgr.
if [ -f "$dir"/bootmgr -a -f "$dir"/boot/bcd ] ; then if [ -f "$dir"/bootmgr -a -f "$dir"/boot/bcd ] ; then
@ -60,6 +66,7 @@ for dir in $dirlist ; do
# Check for NTLDR. # Check for NTLDR.
elif [ -f "$dir"/ntldr -a -f "$dir"/ntdetect.com -a -f "$dir"/boot.ini ] ; then elif [ -f "$dir"/ntldr -a -f "$dir"/ntdetect.com -a -f "$dir"/boot.ini ] ; then
OS=`get_os_name_from_boot_ini "$dir"/boot.ini` || OS="Windows NT/2000/XP loader" OS=`get_os_name_from_boot_ini "$dir"/boot.ini` || OS="Windows NT/2000/XP loader"
needmap=t
else else
continue continue
@ -68,14 +75,16 @@ for dir in $dirlist ; do
# Get boot /dev/ice. # Get boot /dev/ice.
dev=`${grub_probe} -t device "$dir" 2>/dev/null` || continue dev=`${grub_probe} -t device "$dir" 2>/dev/null` || continue
echo "Found $OS on $dir ($dev)" >&2 echo "Found $OS on $drv ($dev)" >&2
cat << EOF cat << EOF
menuentry "$OS" { menuentry "$OS" {
EOF EOF
save_default_entry | sed -e 's,^,\t,' save_default_entry | sed -e 's,^,\t,'
prepare_grub_to_access_device "$dev" | sed 's,^,\t,' prepare_grub_to_access_device "$dev" | sed 's,^,\t,'
test -z "$needmap" || cat <<EOF
drivemap -s (hd0) \$root
EOF
cat << EOF cat << EOF
chainloader +1 chainloader +1
} }

View file

@ -213,7 +213,7 @@ devabstraction_module=`$grub_probe --target=abstraction --device-map=${device_ma
# The order in this list is critical. Be careful when modifying it. # The order in this list is critical. Be careful when modifying it.
modules="$modules $fs_module $partmap_module $devabstraction_module" modules="$modules $fs_module $partmap_module $devabstraction_module"
$grub_mkimage --output=${grubdir}/grub.efi $modules || exit 1 $grub_mkimage -O ${target_cpu}-efi --output=${grubdir}/grub.efi $modules || exit 1
# Prompt the user to check if the device map is correct. # Prompt the user to check if the device map is correct.
echo "Installation finished. No error reported." echo "Installation finished. No error reported."

File diff suppressed because it is too large Load diff

View file

@ -56,6 +56,13 @@ static const grub_gpt_part_type_t grub_gpt_partition_type_bios_boot = GRUB_GPT_P
#define DEFAULT_BOOT_FILE "boot.img" #define DEFAULT_BOOT_FILE "boot.img"
#define DEFAULT_CORE_FILE "core.img" #define DEFAULT_CORE_FILE "core.img"
#define grub_target_to_host16(x) grub_le_to_cpu16(x)
#define grub_target_to_host32(x) grub_le_to_cpu32(x)
#define grub_target_to_host64(x) grub_le_to_cpu64(x)
#define grub_host_to_target16(x) grub_cpu_to_le16(x)
#define grub_host_to_target32(x) grub_cpu_to_le32(x)
#define grub_host_to_target64(x) grub_cpu_to_le64(x)
static void static void
setup (const char *dir, setup (const char *dir,
const char *boot_file, const char *core_file, const char *boot_file, const char *core_file,

View file

@ -34,7 +34,7 @@ target_cpu=@target_cpu@
platform=@platform@ platform=@platform@
pkglibdir=${libdir}/`echo ${PACKAGE_TARNAME}/${target_cpu}-${platform} | sed ${transform}` pkglibdir=${libdir}/`echo ${PACKAGE_TARNAME}/${target_cpu}-${platform} | sed ${transform}`
grub_mkimage=${bindir}/`echo grub-mkelfimage | sed ${transform}` grub_mkimage=${bindir}/`echo grub-mkimage | sed ${transform}`
grub_mkdevicemap=${sbindir}/`echo grub-mkdevicemap | sed ${transform}` grub_mkdevicemap=${sbindir}/`echo grub-mkdevicemap | sed ${transform}`
grub_probe=${sbindir}/`echo grub-probe | sed ${transform}` grub_probe=${sbindir}/`echo grub-probe | sed ${transform}`
grub_editenv=${bindir}/`echo grub-editenv | sed ${transform}` grub_editenv=${bindir}/`echo grub-editenv | sed ${transform}`
@ -189,7 +189,7 @@ devabstraction_module=`$grub_probe --target=abstraction --device-map=${device_ma
modules="$modules $fs_module $partmap_module $devabstraction_module" modules="$modules $fs_module $partmap_module $devabstraction_module"
# Now perform the installation. # Now perform the installation.
"$grub_mkimage" --directory=${pkglibdir} --output=${grubdir}/grub $modules || exit 1 "$grub_mkimage" -O ${target_cpu}-ieee1275 --directory=${pkglibdir} --output=${grubdir}/grub $modules || exit 1
if test $update_nvram = yes; then if test $update_nvram = yes; then
set $ofpathname dummy set $ofpathname dummy

View file

@ -30,9 +30,6 @@
#include <sys/time.h> #include <sys/time.h>
#include <unistd.h> #include <unistd.h>
#include <time.h> #include <time.h>
#ifdef HAVE_LIMITS_H
#include <limits.h>
#endif
#include <grub/kernel.h> #include <grub/kernel.h>
#include <grub/dl.h> #include <grub/dl.h>
@ -300,14 +297,6 @@ grub_millisleep (grub_uint32_t ms)
#endif #endif
#if !(defined (__i386__) || defined (__x86_64__)) && GRUB_MACHINE_EMU
void
grub_arch_sync_caches (void *address __attribute__ ((unused)),
grub_size_t len __attribute__ ((unused)))
{
}
#endif
#ifdef __MINGW32__ #ifdef __MINGW32__
void sync (void) void sync (void)
@ -369,19 +358,6 @@ fail:
#endif /* __MINGW32__ */ #endif /* __MINGW32__ */
char *
canonicalize_file_name (const char *path)
{
char *ret;
#ifdef PATH_MAX
ret = xmalloc (PATH_MAX);
(void) realpath (path, ret);
#else
ret = realpath (path, NULL);
#endif
return ret;
}
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
void void
grub_util_init_nls (void) grub_util_init_nls (void)

View file

@ -1,20 +0,0 @@
/*
* Header file defaults.h - assorted default values for character strings in
* the volume descriptor.
*
* $Id: defaults.h,v 1.8 1999/03/02 03:41:25 eric Exp $
*/
#define PREPARER_DEFAULT NULL
#define PUBLISHER_DEFAULT NULL
#ifndef APPID_DEFAULT
#define APPID_DEFAULT PACKAGE_NAME " ISO 9660 filesystem builder"
#endif
#define COPYRIGHT_DEFAULT NULL
#define BIBLIO_DEFAULT NULL
#define ABSTRACT_DEFAULT NULL
#define VOLSET_ID_DEFAULT NULL
#define VOLUME_ID_DEFAULT "CDROM"
#define BOOT_CATALOG_DEFAULT "boot.catalog"
#define BOOT_IMAGE_DEFAULT NULL
#define SYSTEM_ID_DEFAULT "GNU"

View file

@ -1,343 +0,0 @@
/*
* Program eltorito.c - Handle El Torito specific extensions to iso9660.
*
Written by Michael Fulbright <msf@redhat.com> (1996).
Copyright 1996 RedHat Software, Incorporated
Copyright (C) 2009 Free Software Foundation, Inc.
Boot Info Table generation based on code from genisoimage.c
(from cdrkit 1.1.9), which was originally licensed under GPLv2+.
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 3, 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, see <http://www.gnu.org/licenses/>.
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
#include "config.h"
#include "mkisofs.h"
#include "iso9660.h"
/* used by Win32 for opening binary file - not used by Unix */
#ifndef O_BINARY
#define O_BINARY 0
#endif /* O_BINARY */
#undef MIN
#define MIN(a, b) (((a) < (b))? (a): (b))
static struct eltorito_validation_entry valid_desc;
static struct eltorito_defaultboot_entry default_desc;
static struct eltorito_boot_descriptor gboot_desc;
static int tvd_write __PR((FILE * outfile));
/*
* Check for presence of boot catalog. If it does not exist then make it
*/
void FDECL1(init_boot_catalog, const char *, path)
{
FILE *bcat;
char * bootpath; /* filename of boot catalog */
char * buf;
struct stat statbuf;
bootpath = (char *) e_malloc(strlen(boot_catalog)+strlen(path)+2);
strcpy(bootpath, path);
if (bootpath[strlen(bootpath)-1] != '/')
{
strcat(bootpath,"/");
}
strcat(bootpath, boot_catalog);
/*
* check for the file existing
*/
#ifdef DEBUG_TORITO
fprintf(stderr,"Looking for boot catalog file %s\n",bootpath);
#endif
if (!stat_filter(bootpath, &statbuf))
{
/*
* make sure its big enough to hold what we want
*/
if (statbuf.st_size == 2048)
{
/*
* printf("Boot catalog exists, so we do nothing\n");
*/
free(bootpath);
return;
}
else
{
fprintf (stderr, _("A boot catalog exists and appears corrupted.\n"));
fprintf (stderr, _("Please check the following file: %s.\n"), bootpath);
fprintf (stderr, _("This file must be removed before a bootable CD can be done.\n"));
free (bootpath);
exit (1);
}
}
/*
* file does not exist, so we create it
* make it one CD sector long
*/
bcat = fopen (bootpath, "wb");
if (bcat == NULL)
error (1, errno, _("Error creating boot catalog (%s)"), bootpath);
buf = (char *) e_malloc( 2048 );
if (fwrite (buf, 1, 2048, bcat) != 2048)
error (1, errno, _("Error writing to boot catalog (%s)"), bootpath);
fclose (bcat);
chmod (bootpath, S_IROTH | S_IRGRP | S_IRWXU);
free(bootpath);
} /* init_boot_catalog(... */
void FDECL1(get_torito_desc, struct eltorito_boot_descriptor *, boot_desc)
{
FILE *bootcat;
int checksum;
unsigned char * checksum_ptr;
struct directory_entry * de;
struct directory_entry * de2;
unsigned int i;
int nsectors;
memset(boot_desc, 0, sizeof(*boot_desc));
boot_desc->id[0] = 0;
memcpy(boot_desc->id2, ISO_STANDARD_ID, sizeof(ISO_STANDARD_ID));
boot_desc->version[0] = 1;
memcpy(boot_desc->system_id, EL_TORITO_ID, sizeof(EL_TORITO_ID));
/*
* search from root of iso fs to find boot catalog
*/
de2 = search_tree_file(root, boot_catalog);
if (!de2)
{
fprintf (stderr, _("Boot catalog cannot be found!\n"));
exit (1);
}
set_731(boot_desc->bootcat_ptr,
(unsigned int) get_733(de2->isorec.extent));
/*
* now adjust boot catalog
* lets find boot image first
*/
de=search_tree_file(root, boot_image);
if (!de)
{
fprintf (stderr, _("Boot image cannot be found!\n"));
exit (1);
}
/*
* we have the boot image, so write boot catalog information
* Next we write out the primary descriptor for the disc
*/
memset(&valid_desc, 0, sizeof(valid_desc));
valid_desc.headerid[0] = 1;
valid_desc.arch[0] = EL_TORITO_ARCH_x86;
/*
* we'll shove start of publisher id into id field, may get truncated
* but who really reads this stuff!
*/
if (publisher)
memcpy_max(valid_desc.id, publisher, MIN(23, strlen(publisher)));
valid_desc.key1[0] = 0x55;
valid_desc.key2[0] = 0xAA;
/*
* compute the checksum
*/
checksum=0;
checksum_ptr = (unsigned char *) &valid_desc;
for (i=0; i<sizeof(valid_desc); i+=2)
{
/*
* skip adding in ckecksum word, since we dont have it yet!
*/
if (i == 28)
{
continue;
}
checksum += (unsigned int)checksum_ptr[i];
checksum += ((unsigned int)checksum_ptr[i+1])*256;
}
/*
* now find out the real checksum
*/
checksum = -checksum;
set_721(valid_desc.cksum, (unsigned int) checksum);
/*
* now make the initial/default entry for boot catalog
*/
memset(&default_desc, 0, sizeof(default_desc));
default_desc.boot_id[0] = EL_TORITO_BOOTABLE;
/*
* use default BIOS loadpnt
*/
set_721(default_desc.loadseg, 0);
default_desc.arch[0] = EL_TORITO_ARCH_x86;
/*
* figure out size of boot image in sectors, for now hard code to
* assume 512 bytes/sector on a bootable floppy
*/
nsectors = ((de->size + 511) & ~(511))/512;
fprintf (stderr, _("\nSize of boot image is %d sectors"), nsectors);
fprintf (stderr, " -> ");
if (! use_eltorito_emul_floppy)
{
default_desc.boot_media[0] = EL_TORITO_MEDIA_NOEMUL;
fprintf (stderr, _("No emulation\n"));
}
else if (nsectors == 2880 )
/*
* choose size of emulated floppy based on boot image size
*/
{
default_desc.boot_media[0] = EL_TORITO_MEDIA_144FLOP;
fprintf (stderr, _("Emulating a 1.44 meg floppy\n"));
}
else if (nsectors == 5760 )
{
default_desc.boot_media[0] = EL_TORITO_MEDIA_288FLOP;
fprintf (stderr, _("Emulating a 2.88 meg floppy\n"));
}
else if (nsectors == 2400 )
{
default_desc.boot_media[0] = EL_TORITO_MEDIA_12FLOP;
fprintf (stderr, _("Emulating a 1.2 meg floppy\n"));
}
else
{
fprintf (stderr, _("\nError - boot image is not the an allowable size.\n"));
exit (1);
}
/*
* FOR NOW LOAD 1 SECTOR, JUST LIKE FLOPPY BOOT!!!
*/
nsectors = 1;
set_721(default_desc.nsect, (unsigned int) nsectors );
#ifdef DEBUG_TORITO
fprintf(stderr,"Extent of boot images is %d\n",get_733(de->isorec.extent));
#endif
set_731(default_desc.bootoff,
(unsigned int) get_733(de->isorec.extent));
/*
* now write it to disk
*/
bootcat = fopen (de2->whole_name, "r+b");
if (bootcat == NULL)
error (1, errno, _("Error opening boot catalog for update"));
/*
* write out
*/
if (fwrite (&valid_desc, 1, 32, bootcat) != 32)
error (1, errno, _("Error writing to boot catalog"));
if (fwrite (&default_desc, 1, 32, bootcat) != 32)
error (1, errno, _("Error writing to boot catalog"));
fclose (bootcat);
/* If the user has asked for it, patch the boot image */
if (use_boot_info_table)
{
FILE *bootimage;
uint32_t bi_checksum;
unsigned int total_len;
static char csum_buffer[SECTOR_SIZE];
int len;
struct eltorito_boot_info bi_table;
bootimage = fopen (de->whole_name, "r+b");
if (bootimage == NULL)
error (1, errno, _("Error opening boot image file `%s' for update"),
de->whole_name);
/* Compute checksum of boot image, sans 64 bytes */
total_len = 0;
bi_checksum = 0;
while ((len = fread (csum_buffer, 1, SECTOR_SIZE, bootimage)) > 0)
{
if (total_len & 3)
error (1, 0, _("Odd alignment at non-end-of-file in boot image `%s'"),
de->whole_name);
if (total_len < 64)
memset (csum_buffer, 0, 64 - total_len);
if (len < SECTOR_SIZE)
memset (csum_buffer + len, 0, SECTOR_SIZE - len);
for (i = 0; i < SECTOR_SIZE; i += 4)
bi_checksum += get_731 (&csum_buffer[i]);
total_len += len;
}
if (total_len != de->size)
error (1, 0, _("Boot image file `%s' changed unexpectedly"),
de->whole_name);
/* End of file, set position to byte 8 */
fseeko (bootimage, (off_t) 8, SEEK_SET);
memset (&bi_table, 0, sizeof (bi_table));
/* Is it always safe to assume PVD is at session_start+16? */
set_731 (bi_table.pvd_addr, session_start + 16);
set_731 (bi_table.file_addr, de->starting_block);
set_731 (bi_table.file_length, de->size);
set_731 (bi_table.file_checksum, bi_checksum);
if (fwrite (&bi_table, 1, sizeof (bi_table), bootimage) != sizeof (bi_table))
error (1, errno, _("Error writing to boot image (%s)"), bootimage);
fclose (bootimage);
}
} /* get_torito_desc(... */
/*
* Function to write the EVD for the disc.
*/
static int FDECL1(tvd_write, FILE *, outfile)
{
/*
* Next we write out the boot volume descriptor for the disc
*/
get_torito_desc(&gboot_desc);
xfwrite(&gboot_desc, 1, 2048, outfile);
last_extent_written ++;
return 0;
}
struct output_fragment torito_desc = {NULL, oneblock_size, NULL, tvd_write};

Some files were not shown because too many files have changed in this diff Show more