merge mainline into intwrap

This commit is contained in:
Vladimir 'phcoder' Serbinenko 2010-05-04 15:57:37 +02:00
commit 4dff488793
94 changed files with 2524 additions and 699 deletions

354
ChangeLog
View file

@ -1,3 +1,357 @@
2010-05-03 Vladimir Serbinenko <phcoder@gmail.com>
* commands/parttool.c (grub_cmd_parttool): Fix #if !GRUB_NO_MODULES
condition.
2010-05-03 Vladimir Serbinenko <phcoder@gmail.com>
* kern/mm.c (grub_real_malloc): Put magic and size assignment in common
part.
2010-05-03 Vladimir Serbinenko <phcoder@gmail.com>
* kern/mm.c (grub_mm_init_region): Check for region size after aligning
pointers.
2010-05-03 Vladimir Serbinenko <phcoder@gmail.com>
* kern/mm.c (grub_real_malloc): Fix size calculation when extra == 0.
2010-05-01 Christian Franke <franke@computer.org>
* util/grub-mkconfig_lib.in (make_system_path_relative_to_its_root):
Remove broken Cygwin path conversion.
* util/misc.c: [__CYGWIN__] Add include and define.
[__CYGWIN__] (get_win32_path): Copy function from getroot.c, modify
for Cygwin 1.7.
(make_system_path_relative_to_its_root): Simplify loop, replace early
return by break.
[__CYGWIN__] Add conversion to win32 path.
Include "/" case in trailing slash removal.
2010-05-01 Vladimir Serbinenko <phcoder@gmail.com>
* kern/main.c (grub_load_config): Fix copy-pasted comment.
Reported by: Seth Goldberg
2010-05-01 Vladimir Serbinenko <phcoder@gmail.com>
* commands/help.c (grub_cmd_help): Fix a typo.
Reported by: Seth Goldberg
2010-05-01 Vladimir Serbinenko <phcoder@gmail.com>
* commands/hashsum.c (GRUB_MOD_INIT): Remove duplication of command
name and add N_.
* commands/i386/pc/drivemap.c (GRUB_MOD_INIT): Likewise.
* commands/iorw.c (GRUB_MOD_INIT): Likewise.
* commands/password_pbkdf2.c (GRUB_MOD_INIT): Likewise.
* commands/regexp.c (GRUB_MOD_INIT): Likewise.
* commands/setpci.c (GRUB_MOD_INIT): Likewise.
* commands/terminal.c (GRUB_MOD_INIT): Likewise.
* efiemu/main.c (GRUB_MOD_INIT): Likewise.
* font/font_cmd.c (GRUB_MOD_INIT): Likewise.
* kern/corecmd.c (GRUB_MOD_INIT): Likewise.
* mmap/mmap.c (GRUB_MOD_INIT): Likewise.
* normal/context.c (GRUB_MOD_INIT): Likewise.
* normal/main.c (GRUB_MOD_INIT): Likewise.
* term/gfxterm.c (GRUB_MOD_INIT): Likewise.
* term/serial.c (GRUB_MOD_INIT): Likewise.
* term/terminfo.c (GRUB_MOD_INIT): Likewise.
2010-05-01 Vladimir Serbinenko <phcoder@gmail.com>
* kern/mm.c (grub_real_malloc): Satisfy alignment requirement when
extra == 0.
2010-05-01 Vladimir Serbinenko <phcoder@gmail.com>
* commands/iorw.c: New file.
* conf/i386.rmk (pkglib_MODULES): Add iorw.mod.
(iorw_mod_SOURCES): New variable.
(iorw_mod_CFLAGS): Likewise.
(iorw_mod_LDFLAGS): Likewise.
2010-05-01 Vladimir Serbinenko <phcoder@gmail.com>
Hotkey support
* include/grub/menu.h (grub_menu_entry): New field 'hotkey'.
* normal/main.c (hotkey_aliases): New variable.
(grub_normal_add_menu_entry): Parse "--hotkey".
* normal/menu_text.c (run_menu): Handle hotkeys.
2010-05-01 Vladimir Serbinenko <phcoder@gmail.com>
* kern/i386/coreboot/init.c (grub_machine_init): Call
grub_machine_mmap_init on qemu.
2010-05-01 Vladimir Serbinenko <phcoder@gmail.com>
* boot/i386/qemu/boot.S: Add a missing .code16.
2010-05-01 Vladimir Serbinenko <phcoder@gmail.com>
Use LBIO on coreboot.
* conf/i386-coreboot.rmk (kernel_img_SOURCES): Change
kern/i386/multiboot_mmap.c to kern/i386/coreboot/mmap.c.
* include/grub/i386/coreboot/memory.h (GRUB_LINUXBIOS_MEMBER_LINK):
New declaration.
* kern/i386/coreboot/init.c (grub_machine_init): Don't call
grub_machine_mmap_init on coreboot.
* kern/i386/coreboot/mmap.c (grub_linuxbios_table_iterate): Handle
GRUB_LINUXBIOS_MEMBER_LINK.
(grub_machine_mmap_iterate): Fix declaration.
* kern/i386/coreboot/startup.S: Don't save mbi location on coreboot.
2010-05-01 Vladimir Serbinenko <phcoder@gmail.com>
Split coreboot and multiboot ports.
* conf/i386-multiboot.rmk: New file.
* configure.ac: Add multiboot port.
* include/grub/i386/multiboot/boot.h: New file.
* include/grub/i386/multiboot/console.h: Likewise.
* include/grub/i386/multiboot/init.h: Likewise.
* include/grub/i386/multiboot/kernel.h: Likewise.
* include/grub/i386/multiboot/loader.h: Likewise.
* include/grub/i386/multiboot/memory.h: Likewise.
* include/grub/i386/multiboot/serial.h: Likewise.
* include/grub/i386/multiboot/time.h: Likewise.
* include/grub/multiboot.h: Add GRUB_MACHINE_MULTIBOOT to ifdef.
* loader/multiboot.c: Likewise.
* loader/multiboot_mbi2.c: Likewise.
* util/grub-mkrescue.in: Generate multiboot rescue.
2010-05-01 Vladimir Serbinenko <phcoder@gmail.com>
* kern/parser.c (grub_parser_execute): Cope with read-only config.
2010-05-01 Vladimir Serbinenko <phcoder@gmail.com>
Merge handling of input and output terminals. Fix a hang.
* commands/terminal.c (abstract_terminal): New struct.
(handle_command): New function. Based on grub_cmd_terminal_input.
(grub_cmd_terminal_input): Use handle_command.
(grub_cmd_terminal_output): Use handle_command.
2010-05-01 BVK Chaitanya <bvk.groups@gmail.com>
Fix comment handling.
* tests/grub_script_comments.in: New testcase.
* conf/tests.rmk: Rules for new testcase.
* script/yylex.l: Updated flex rules.
2010-04-28 Samuel Thibault <samuel.thibault@ens-lyon.org>
* docs/grub.texi (play): Document that zero pitches produce rests.
* commands/i386/pc/play.c (grub_cmd_play): Call 'grub_file_open' only
if argc is 1.
2010-04-27 Vladimir Serbinenko <phcoder@gmail.com>
* conf/x86-efi.rmk (linux_mod_SOURCES): Write explicitly to avoid
autogen issues.
2010-04-26 Christian Franke <franke@computer.org>
* include/grub/util/getroot.h (grub_get_prefix): Remove prototype.
* util/getroot.c [__CYGWIN__] (get_win32_path): Remove function.
(grub_get_prefix): Remove function.
* util/grub-emu.c (main): Replace grub_get_prefix () call by
make_system_path_relative_to_its_root ().
* util/sparc64/ieee1275/grub-setup.c (main): Likewise.
2010-04-24 Christian Franke <franke@computer.org>
* Makefile.in (TARGET_LDFLAGS): Add -static-libgcc.
(kernel_img_LDFLAGS): Remove -static-libgcc.
2010-04-24 Christian Franke <franke@computer.org>
* configure.ac: Do not CHECK_BSS_START_SYMBOL
and CHECK_END_SYMBOL if grub-emu is built.
Unset TARGET_OBJ2ELF if grub-emu is built
without module support.
2010-04-24 Jiro SEKIBA <jir@unicus.jp>
Nilfs2 support.
* conf/common.rmk (grub_probe_SOURCES): Add fs/nilfs2.c.
(grub_fstest_SOURCES): Likewise.
(pkglib_MODULES): Add nilfs2.mod.
(nilfs2_mod_SOURCES): New variable.
(nilfs2_mod_CFLAGS): Likewise.
(nilfs2_mod_LDFLAGS): Likewise.
* conf/i386-pc.rmk (grub_setup_SOURCES): Add fs/nilfs2.c.
* conf/sparc64-ieee1275.rmk (grub_setup_SOURCES): Add fs/nilfs2.c.
* fs/nilfs2.c: New file.
2010-04-21 Vladimir Serbinenko <phcoder@gmail.com>
* configure.ac: Refuse to compile for x86_64-efi is mcmodel=large
is not supported.
2010-04-19 Grégoire Sutre <gregoire.sutre@gmail.com>
Add grub-mkconfig support for NetBSD.
* util/grub.d/10_netbsd.in: grub-mkconfig helper script for NetBSD.
* util/grub-mkconfig.in: export new NetBSD specific variables.
* po/POTFILES-shell: added 10_netbsd.in.
* util/grub-mkconfig_lib.in: check for gettext binary, default to echo.
2010-04-19 BVK Chaitanya <bvk.groups@gmail.com>
Fix emu build with grub-emu-pci and grub-emu-modules.
* include/grub/util/misc.h: Export grub_util_{info,error,warn}
functions.
* include/grub/libpciaccess.h: New file.
* conf/any-emu.rmk: Update kernel headers for emu build.
2010-04-19 Vladimir Serbinenko <phcoder@gmail.com>
* fs/udf.c (grub_udf_iterate_dir): Silence a spurious warning.
2010-04-19 Vladimir Serbinenko <phcoder@gmail.com>
* fs/udf.c (grub_udf_iterate_dir): Decode the Unicode filenames.
2010-04-18 Vladimir Serbinenko <phcoder@gmail.com>
* boot/sparc64/ieee1275/boot.S: Various size-reducing changes.
Retrieve chosen/bootpath if bootpath isn't hardcoded.
* conf/sparc64-ieee1275.rmk (grub_setup_SOURCES): Add
util/ieee1275/ofpath.c.
* util/sparc64/ieee1275/grub-ofpathname.c: Renamed to ...
* util/ieee1275/grub-ofpathname.c: ... this. All users updated
* include/grub/sparc64/ieee1275/boot.h
(GRUB_BOOT_MACHINE_KERNEL_SECTOR): Renamed to ...
(GRUB_BOOT_MACHINE_KERNEL_BYTE): ...this. Moved 8 bytes lower.
* util/hostdisk.c (grub_util_biosdisk_get_osdev): New function.
* util/ieee1275/ofpath.c (grub_util_devname_to_ofpath): Make argument
const char *.
* util/sparc64/ieee1275/grub-setup.c (compute_dest_ofpath): Removed.
(setup): Use KERNEL_BYTE instead of KERNEL_SECTOR.
Use grub_util_devname_to_ofpath. Zero-fill boot_devpath on same disk
install.
2010-04-18 Grégoire Sutre <gregoire.sutre@gmail.com>
* util/grub-mkconfig.in: Corrected two == equality tests.
Set grub_prefix as in grub-install for NetBSD and OpenBSD.
* configure.ac: All definitions and uses of TARGET_IMG_LDFLAGS_AC now
expect a number appended to it.
* acinclude.m4 (grub_PROG_OBJCOPY_ABSOLUTE): ${TARGET_IMG_LDFLAGS_AC}
expects a number appended to it.
2010-04-18 Vladimir Serbinenko <phcoder@gmail.com>
* po/POTFILES: Renamed multiboot_loader.c to multiboot.c
2010-04-18 Vladimir Serbinenko <phcoder@gmail.com>
* util/hostdisk.c (make_device_name): Change to new partition naming.
2010-04-17 Vladimir Serbinenko <phcoder@gmail.com>
* disk/lvm.c (grub_lvm_memberlist): Issue an error if pv->disk = 0.
2010-04-17 Christian Franke <franke@computer.org>
* Makefile.in: Add missing localedir setting.
2010-04-14 Colin Watson <cjwatson@ubuntu.com>
Restore TEXTDOMAINDIR correction from r1889, lost apparently by
mistake in r2156. Noticed by Anthony Fok.
* util/grub.d/10_kfreebsd.in (TEXTDOMAINDIR): Set to lowercased
@localedir@.
* util/grub.d/10_linux.in (TEXTDOMAINDIR): Likewise.
2010-04-14 BVK Chaitanya <bvk.groups@gmail.com>
Fix a spurious, uninitialized variable warning.
* loader/i386/bsdXX.c (grub_freebsd_load_elfmodule_obj):
Initialize variable, shdr.
(grub_freebsd_load_elfmodule): Likewise.
(grub_freebsd_load_elf_meta): Likewise.
2010-04-13 BVK Chaitanya <bvk.groups@gmail.com>
Fix for escaped dollar in double quoted strings.
* script/yylex.l: Updated flex rules.
* conf/tests.rmk: Rule for new testcase.
* tests/grub_script_dollar.in: New testcase.
2010-04-13 Carles Pina i Estany <carles@pina.cat>
2010-04-13 Colin Watson <cjwatson@ubuntu.com>
Enclose all translated strings in grub.cfg in single quotes, and
escape them appropriately (Ubuntu bug #552921).
* util/grub-mkconfig_lib.in (gettext_quoted): New function.
* util/grub.d/10_hurd.in: Use it.
* util/grub.d/10_kfreebsd.in (kfreebsd_entry): Likewise.
* util/grub.d/10_linux.in (linux_entry): Likewise.
2010-04-11 Vladimir Serbinenko <phcoder@gmail.com>
Fix cygwin compilation.
* configure.ac: Define NEED_REGISTER_FRAME_INFO.
* include/grub/misc.h (__register_frame_info)
[NEED_REGISTER_FRAME_INFO && !UTIL]: New export.
(__deregister_frame_info) [NEED_REGISTER_FRAME_INFO && !UTIL]: Likewise.
* kern/misc.c (__register_frame_info)
[NEED_REGISTER_FRAME_INFO && !UTIL]: New empty function.
(__deregister_frame_info) [NEED_REGISTER_FRAME_INFO && !UTIL]: Likewise.
2010-04-11 Vladimir Serbinenko <phcoder@gmail.com>
* configure.ac: Respect grub_cv_asm_uscore when defining dummy symbols.
2010-04-11 Vladimir Serbinenko <phcoder@gmail.com>
Unify libgcc processing.
* Makefile.in (kernel_img_LDFLAGS): New variable.
* conf/common.rmk (kernel_img_HEADERS): Add libgcc.h.
* conf/i386-coreboot.rmk (kernel_img_LDFLAGS): Append instead of
overwriting.
* conf/i386-ieee1275.rmk (kernel_img_LDFLAGS): Likewise.
* conf/i386-pc.rmk (kernel_img_LDFLAGS): Likewise.
* conf/i386-qemu.rmk (kernel_img_LDFLAGS): Likewise.
* conf/x86-efi.rmk (kernel_img_LDFLAGS): Likewise.
* conf/mips-qemu-mips.rmk (kernel_img_LDFLAGS): Append instead of
overwriting. Remove -lgcc and -static-libgcc
* conf/mips-yeeloong.rmk (kernel_img_LDFLAGS): Likewise.
* conf/mips.rmk (kernel_img_HEADERS): Remove cpu/libgcc.h
* conf/powerpc-ieee1275.rmk (kernel_img_HEADERS): Remove cpu/libgcc.h
(kernel_img_LDFLAGS): Append instead of overwriting.
Remove -lgcc and -static-libgcc
* conf/sparc64-ieee1275.rmk: Likewise.
* include/grub/powerpc/libgcc.h: Move to ...
* include/grub/libgcc.h: .. this.
* include/grub/libgcc.h: Don't export most of the function on x86.
(__bswapsi2): New export.
(__bswapdi2): Likewise.
* include/grub/mips/libgcc.h: Removed.
* include/grub/sparc64/libgcc.h: Likewise.
2010-04-10 Vladimir Serbinenko <phcoder@gmail.com>
* util/hostdisk.c (grub_util_biosdisk_get_grub_dev): Remove
disk_info_msg (conflicts with gettexting into languages with cases).
2010-04-10 Grégoire Sutre <gregoire.sutre@gmail.com> 2010-04-10 Grégoire Sutre <gregoire.sutre@gmail.com>
Add grub-probe support for NetBSD. Add grub-probe support for NetBSD.

View file

@ -35,6 +35,7 @@ sysconfdir = @sysconfdir@
sharedstatedir = @sharedstatedir@ sharedstatedir = @sharedstatedir@
localstatedir = @localstatedir@ localstatedir = @localstatedir@
libdir = @libdir@ libdir = @libdir@
localedir = @localedir@
infodir = @infodir@ infodir = @infodir@
mandir = @mandir@ mandir = @mandir@
includedir = @includedir@ includedir = @includedir@
@ -98,11 +99,12 @@ TARGET_APPLE_CC = @TARGET_APPLE_CC@
OBJCONV = @OBJCONV@ OBJCONV = @OBJCONV@
TARGET_CPPFLAGS = @TARGET_CPPFLAGS@ -I$(srcdir)/include -I$(builddir) -I$(builddir)/include \ TARGET_CPPFLAGS = @TARGET_CPPFLAGS@ -I$(srcdir)/include -I$(builddir) -I$(builddir)/include \
-Wall -W -Wall -W
TARGET_LDFLAGS = -nostdlib @TARGET_LDFLAGS@ TARGET_LDFLAGS = -nostdlib -static-libgcc @TARGET_LDFLAGS@
TARGET_IMG_LDSCRIPT = @TARGET_IMG_LDSCRIPT@ TARGET_IMG_LDSCRIPT = @TARGET_IMG_LDSCRIPT@
TARGET_IMG_LDFLAGS = -nostdlib @TARGET_IMG_LDFLAGS@ TARGET_IMG_LDFLAGS = -nostdlib @TARGET_IMG_LDFLAGS@
TARGET_IMG_CFLAGS = @TARGET_IMG_CFLAGS@ TARGET_IMG_CFLAGS = @TARGET_IMG_CFLAGS@
TARGET_OBJ2ELF = @TARGET_OBJ2ELF@ TARGET_OBJ2ELF = @TARGET_OBJ2ELF@
kernel_img_LDFLAGS = -lgcc
EXEEXT = @EXEEXT@ EXEEXT = @EXEEXT@
OBJCOPY = @OBJCOPY@ OBJCOPY = @OBJCOPY@
STRIP = @STRIP@ STRIP = @STRIP@

View file

@ -93,7 +93,7 @@ else
fi fi
grub_cv_prog_objcopy_absolute=yes grub_cv_prog_objcopy_absolute=yes
for link_addr in 0x2000 0x8000 0x7C00; do for link_addr in 0x2000 0x8000 0x7C00; do
if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -nostdlib ${TARGET_IMG_LDFLAGS_AC} -Wl,-Ttext -Wl,$link_addr conftest.o -o conftest.exec]); then : if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -nostdlib ${TARGET_IMG_LDFLAGS_AC}$link_addr conftest.o -o conftest.exec]); then :
else else
AC_MSG_ERROR([${CC-cc} cannot link at address $link_addr]) AC_MSG_ERROR([${CC-cc} cannot link at address $link_addr])
fi fi

View file

@ -63,5 +63,8 @@ VARIABLE(grub_core_entry_addr)
*right here* and this is why we need this kludge. */ *right here* and this is why we need this kludge. */
. = GRUB_BOOT_MACHINE_SIZE - 16 . = GRUB_BOOT_MACHINE_SIZE - 16
.code16
jmp _start jmp _start
. = GRUB_BOOT_MACHINE_SIZE . = GRUB_BOOT_MACHINE_SIZE

View file

@ -45,8 +45,9 @@ boot_version: .byte GRUB_BOOT_VERSION_MAJOR, GRUB_BOOT_VERSION_MINOR
* load address plus the size of the prepended A.OUT header (32 bytes). * load address plus the size of the prepended A.OUT header (32 bytes).
*/ */
boot_path: boot_path:
. = _start + GRUB_BOOT_MACHINE_KERNEL_SECTOR . = _start + GRUB_BOOT_MACHINE_KERNEL_BYTE
kernel_sector: .xword 2 boot_path_end:
kernel_byte: .xword (2 << 9)
kernel_address: .word GRUB_BOOT_MACHINE_KERNEL_ADDR kernel_address: .word GRUB_BOOT_MACHINE_KERNEL_ADDR
prom_finddev_name: .asciz "finddevice" prom_finddev_name: .asciz "finddevice"
@ -77,10 +78,22 @@ prom_error:
/* %o0: OF call name /* %o0: OF call name
* %o1: input arg 1 * %o1: input arg 1
*/ */
prom_call_1_1: prom_call_1_1_o2:
clr %o2
ba prom_call_x_1
mov 1, %g1 mov 1, %g1
ba prom_call
mov 1, %o5 prom_call_getprop:
mov 4, %g1
stx %g1, [%l1 + 256]
mov CHOSEN_NODE_REG, %o1
ba prom_call_x_1
GET_ABS(prom_getprop_name, %o0)
prom_call_3_1_o1:
ba prom_call_3_1
mov BOOTDEV_REG, %o1
/* %o2: message string /* %o2: message string
* %o3: message length * %o3: message length
@ -97,6 +110,7 @@ console_write:
*/ */
prom_call_3_1: prom_call_3_1:
mov 3, %g1 mov 3, %g1
prom_call_x_1:
mov 1, %o5 mov 1, %o5
/* fallthru */ /* fallthru */
@ -126,23 +140,17 @@ boot_continue:
* chosen_node = prom_finddevice("/chosen") * chosen_node = prom_finddevice("/chosen")
*/ */
GET_ABS(prom_finddev_name, %o0) GET_ABS(prom_finddev_name, %o0)
call prom_call_1_1_o2
GET_ABS(prom_chosen_path, %o1) GET_ABS(prom_chosen_path, %o1)
call prom_call_1_1
clr %o2
ldx [%l1 + 0x20], CHOSEN_NODE_REG ldx [%l1 + 0x20], CHOSEN_NODE_REG
brz CHOSEN_NODE_REG, prom_error brz CHOSEN_NODE_REG, prom_error
/* getprop(chosen_node, "stdout", &buffer, buffer_size) */ /* getprop(chosen_node, "stdout", &buffer, buffer_size) */
GET_ABS(prom_getprop_name, %o0)
mov 4, %g1
mov 1, %o5
mov CHOSEN_NODE_REG, %o1
GET_ABS(prom_stdout_name, %o2) GET_ABS(prom_stdout_name, %o2)
add %l1, 256, %o3 add %l1, 256, %o3
call prom_call_getprop
mov 1024, %o4 mov 1024, %o4
call prom_call
stx %g1, [%l1 + 256]
lduw [%l1 + 256], STDOUT_NODE_REG lduw [%l1 + 256], STDOUT_NODE_REG
brz,pn STDOUT_NODE_REG, prom_error brz,pn STDOUT_NODE_REG, prom_error
@ -152,15 +160,25 @@ boot_continue:
call console_write call console_write
mov GRUB_NAME_LEN, %o3 mov GRUB_NAME_LEN, %o3
GET_ABS(boot_path, %o3)
ldub [%o3], %o1
brnz,pn %o1, bootpath_known
/* getprop(chosen_node, "bootpath", &buffer, buffer_size) */
GET_ABS(prom_bootpath_name, %o2)
call prom_call_getprop
mov (boot_path_end - boot_path), %o4
bootpath_known:
/* Open up the boot_path, and use that handle to read the /* Open up the boot_path, and use that handle to read the
* first block of the GRUB kernel image. * first block of the GRUB kernel image.
* *
* bootdev_handle = open(boot_path) * bootdev_handle = open(boot_path)
*/ */
GET_ABS(prom_open_name, %o0) GET_ABS(prom_open_name, %o0)
call prom_call_1_1_o2
GET_ABS(boot_path, %o1) GET_ABS(boot_path, %o1)
call prom_call_1_1
clr %o2
ldx [%l1 + 0x20], BOOTDEV_REG ldx [%l1 + 0x20], BOOTDEV_REG
brz,pn BOOTDEV_REG, prom_open_error brz,pn BOOTDEV_REG, prom_open_error
@ -168,28 +186,23 @@ boot_continue:
/* Since we have 64-bit cells, the high cell of the seek offset /* Since we have 64-bit cells, the high cell of the seek offset
* is zero and the low cell is the entire value. * is zero and the low cell is the entire value.
* *
* seek(bootdev, 0, *kernel_sector << 9) * seek(bootdev, 0, *kernel_byte)
*/ */
GET_ABS(prom_seek_name, %o0) GET_ABS(prom_seek_name, %o0)
mov BOOTDEV_REG, %o1
clr %o2 clr %o2
LDX_ABS(kernel_sector, 0x00, %o3) call prom_call_3_1_o1
call prom_call_3_1 LDX_ABS(kernel_byte, 0x00, %o3)
sllx %o3, 9, %o3
/* read(bootdev, *kernel_address, 512) */ /* read(bootdev, *kernel_address, 512) */
GET_ABS(prom_read_name, %o0) GET_ABS(prom_read_name, %o0)
mov BOOTDEV_REG, %o1
LDUW_ABS(kernel_address, 0x00, %o2) LDUW_ABS(kernel_address, 0x00, %o2)
call prom_call_3_1 call prom_call_3_1_o1
mov 512, %o3 mov 512, %o3
LDUW_ABS(kernel_address, 0x00, %o2) LDUW_ABS(kernel_address, 0x00, %o2)
jmpl %o2, %o7 jmpl %o2, %o7
nop nop
1: ba,a 1b
. = _start + GRUB_BOOT_MACHINE_CODE_END . = _start + GRUB_BOOT_MACHINE_CODE_END
/* the last 4 bytes in the sector 0 contain the signature */ /* the last 4 bytes in the sector 0 contain the signature */

View file

@ -24,13 +24,14 @@
#include <grub/misc.h> #include <grub/misc.h>
#include <grub/crypto.h> #include <grub/crypto.h>
#include <grub/normal.h> #include <grub/normal.h>
#include <grub/i18n.h>
static const struct grub_arg_option options[] = { static const struct grub_arg_option options[] = {
{"hash", 'h', 0, "Specify hash to use.", "HASH", ARG_TYPE_STRING}, {"hash", 'h', 0, N_("Specify hash to use."), N_("HASH"), ARG_TYPE_STRING},
{"check", 'c', 0, "Check hash list file.", "FILE", ARG_TYPE_STRING}, {"check", 'c', 0, N_("Check hash list file."), N_("FILE"), ARG_TYPE_STRING},
{"prefix", 'p', 0, "Base directory for hash list.", "DIRECTORY", {"prefix", 'p', 0, N_("Base directory for hash list."), N_("DIRECTORY"),
ARG_TYPE_STRING}, ARG_TYPE_STRING},
{"keep-going", 'k', 0, "Don't stop after first error.", 0, 0}, {"keep-going", 'k', 0, N_("Don't stop after first error."), 0, 0},
{0, 0, 0, 0, 0, 0} {0, 0, 0, 0, 0, 0}
}; };
@ -249,21 +250,21 @@ GRUB_MOD_INIT(hashsum)
options); options);
cmd_md5 = grub_register_extcmd ("md5sum", grub_cmd_hashsum, cmd_md5 = grub_register_extcmd ("md5sum", grub_cmd_hashsum,
GRUB_COMMAND_FLAG_BOTH, GRUB_COMMAND_FLAG_BOTH,
"md5sum [-c FILE [-p PREFIX]] " N_("[-c FILE [-p PREFIX]] "
"[FILE1 [FILE2 ...]]", "[FILE1 [FILE2 ...]]"),
"Compute or check hash checksum.", N_("Compute or check hash checksum."),
options); options);
cmd_sha256 = grub_register_extcmd ("sha256sum", grub_cmd_hashsum, cmd_sha256 = grub_register_extcmd ("sha256sum", grub_cmd_hashsum,
GRUB_COMMAND_FLAG_BOTH, GRUB_COMMAND_FLAG_BOTH,
"sha256sum [-c FILE [-p PREFIX]] " N_("[-c FILE [-p PREFIX]] "
"[FILE1 [FILE2 ...]]", "[FILE1 [FILE2 ...]]"),
"Compute or check hash checksum.", "Compute or check hash checksum.",
options); options);
cmd_sha512 = grub_register_extcmd ("sha512sum", grub_cmd_hashsum, cmd_sha512 = grub_register_extcmd ("sha512sum", grub_cmd_hashsum,
GRUB_COMMAND_FLAG_BOTH, GRUB_COMMAND_FLAG_BOTH,
"sha512sum [-c FILE [-p PREFIX]] " N_("[-c FILE [-p PREFIX]] "
"[FILE1 [FILE2 ...]]", "[FILE1 [FILE2 ...]]"),
"Compute or check hash checksum.", N_("Compute or check hash checksum."),
options); options);
} }

View file

@ -100,7 +100,7 @@ grub_cmd_help (grub_extcmd_t ext __attribute__ ((unused)), int argc,
if (cmd->flags & GRUB_COMMAND_FLAG_EXTCMD) if (cmd->flags & GRUB_COMMAND_FLAG_EXTCMD)
grub_arg_show_help ((grub_extcmd_t) cmd->data); grub_arg_show_help ((grub_extcmd_t) cmd->data);
else else
grub_printf ("%s %s %s\n%s\b", _("Usage:"), cmd->name, _(cmd->summary), grub_printf ("%s %s %s\n%s\n", _("Usage:"), cmd->name, _(cmd->summary),
_(cmd->description)); _(cmd->description));
} }
} }

View file

@ -403,7 +403,6 @@ GRUB_MOD_INIT (drivemap)
grub_get_root_biosnumber = grub_get_root_biosnumber_drivemap; grub_get_root_biosnumber = grub_get_root_biosnumber_drivemap;
cmd = grub_register_extcmd ("drivemap", grub_cmd_drivemap, cmd = grub_register_extcmd ("drivemap", grub_cmd_drivemap,
GRUB_COMMAND_FLAG_BOTH, GRUB_COMMAND_FLAG_BOTH,
"drivemap"
N_("-l | -r | [-s] grubdev osdisk."), N_("-l | -r | [-s] grubdev osdisk."),
N_("Manage the BIOS drive mappings."), N_("Manage the BIOS drive mappings."),
options); options);

View file

@ -177,16 +177,20 @@ static grub_err_t
grub_cmd_play (grub_command_t cmd __attribute__ ((unused)), grub_cmd_play (grub_command_t cmd __attribute__ ((unused)),
int argc, char **args) int argc, char **args)
{ {
grub_file_t file;
if (argc < 1) if (argc < 1)
return grub_error (GRUB_ERR_BAD_ARGUMENT, "file name or tempo and notes required"); return grub_error (GRUB_ERR_BAD_ARGUMENT, "file name or tempo and notes required");
file = grub_file_open (args[0]); if (argc == 1)
if (file)
{ {
struct note buf; struct note buf;
grub_uint32_t tempo; grub_uint32_t tempo;
grub_file_t file;
file = grub_file_open (args[0]);
if (! file)
return grub_error (GRUB_ERR_FILE_NOT_FOUND, "file not found");
if (grub_file_read (file, &tempo, sizeof (tempo)) != sizeof (tempo)) if (grub_file_read (file, &tempo, sizeof (tempo)) != sizeof (tempo))
{ {

150
commands/iorw.c Normal file
View file

@ -0,0 +1,150 @@
/* memrw.c - command to read / write physical memory */
/*
* 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/misc.h>
#include <grub/extcmd.h>
#include <grub/env.h>
#include <grub/cpu/io.h>
#include <grub/i18n.h>
static grub_extcmd_t cmd_read_byte, cmd_read_word, cmd_read_dword;
static grub_command_t cmd_write_byte, cmd_write_word, cmd_write_dword;
static const struct grub_arg_option options[] =
{
{0, 'v', 0, N_("Save read value into variable VARNAME."),
N_("VARNAME"), ARG_TYPE_STRING},
{0, 0, 0, 0, 0, 0}
};
static grub_err_t
grub_cmd_read (grub_extcmd_t cmd, int argc, char **argv)
{
grub_target_addr_t addr;
grub_uint32_t value = 0;
char buf[sizeof ("XXXXXXXX")];
if (argc != 1)
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid number of arguments");
addr = grub_strtoul (argv[0], 0, 0);
switch (cmd->cmd->name[sizeof ("in") - 1])
{
case 'l':
value = grub_inl (addr);
break;
case 'w':
value = grub_inw (addr);
break;
case 'b':
value = grub_inb (addr);
break;
}
if (cmd->state[0].set)
{
grub_snprintf (buf, sizeof (buf), "%x", value);
grub_env_set (cmd->state[0].arg, buf);
}
else
grub_printf ("0x%x\n", value);
return 0;
}
static grub_err_t
grub_cmd_write (grub_command_t cmd, int argc, char **argv)
{
grub_target_addr_t addr;
grub_uint32_t value;
grub_uint32_t mask = 0xffffffff;
if (argc != 2 && argc != 3)
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid number of arguments");
addr = grub_strtoul (argv[0], 0, 0);
value = grub_strtoul (argv[1], 0, 0);
if (argc == 3)
mask = grub_strtoul (argv[2], 0, 0);
value &= mask;
switch (cmd->name[sizeof ("out") - 1])
{
case 'l':
if (mask != 0xffffffff)
grub_outl ((grub_inl (addr) & ~mask) | value, addr);
else
grub_outl (value, addr);
break;
case 'w':
if ((mask & 0xffff) != 0xffff)
grub_outw ((grub_inw (addr) & ~mask) | value, addr);
else
grub_outw (value, addr);
break;
case 'b':
if ((mask & 0xff) != 0xff)
grub_outb ((grub_inb (addr) & ~mask) | value, addr);
else
grub_outb (value, addr);
break;
}
return 0;
}
GRUB_MOD_INIT(memrw)
{
cmd_read_byte =
grub_register_extcmd ("inb", grub_cmd_read, GRUB_COMMAND_FLAG_BOTH,
N_("PORT"), N_("Read byte from PORT."), options);
cmd_read_word =
grub_register_extcmd ("inw", grub_cmd_read, GRUB_COMMAND_FLAG_BOTH,
N_("PORT"), N_("Read word from PORT."), options);
cmd_read_dword =
grub_register_extcmd ("inl", grub_cmd_read, GRUB_COMMAND_FLAG_BOTH,
N_("PORT"), N_("Read dword from PORT."), options);
cmd_write_byte =
grub_register_command ("outb", grub_cmd_write,
N_("PORT VALUE [MASK]"),
N_("Write byte VALUE to PORT."));
cmd_write_word =
grub_register_command ("outw", grub_cmd_write,
N_("PORT VALUE [MASK]"),
N_("Write word VALUE to PORT."));
cmd_write_dword =
grub_register_command ("outl", grub_cmd_write,
N_("ADDR VALUE [MASK]"),
N_("Write dword VALUE to PORT."));
}
GRUB_MOD_FINI(memrw)
{
grub_unregister_extcmd (cmd_read_byte);
grub_unregister_extcmd (cmd_read_word);
grub_unregister_extcmd (cmd_read_dword);
grub_unregister_command (cmd_write_byte);
grub_unregister_command (cmd_write_word);
grub_unregister_command (cmd_write_dword);
}

View file

@ -175,7 +175,7 @@ grub_cmd_parttool (grub_command_t cmd __attribute__ ((unused)),
} }
/* Load modules. */ /* Load modules. */
#if GRUB_NO_MODULES #if !GRUB_NO_MODULES
{ {
const char *prefix; const char *prefix;
prefix = grub_env_get ("prefix"); prefix = grub_env_get ("prefix");

View file

@ -24,6 +24,7 @@
#include <grub/env.h> #include <grub/env.h>
#include <grub/normal.h> #include <grub/normal.h>
#include <grub/dl.h> #include <grub/dl.h>
#include <grub/i18n.h>
static grub_dl_t my_mod; static grub_dl_t my_mod;
@ -186,8 +187,8 @@ GRUB_MOD_INIT(password_pbkdf2)
{ {
my_mod = mod; my_mod = mod;
cmd = grub_register_command ("password_pbkdf2", grub_cmd_password, cmd = grub_register_command ("password_pbkdf2", grub_cmd_password,
"password_pbkdf2 USER PBKDF2_PASSWORD", N_("USER PBKDF2_PASSWORD"),
"Set user password (PBKDF2). "); N_("Set user password (PBKDF2). "));
} }
GRUB_MOD_FINI(password_pbkdf2) GRUB_MOD_FINI(password_pbkdf2)

View file

@ -21,6 +21,7 @@
#include <grub/misc.h> #include <grub/misc.h>
#include <grub/mm.h> #include <grub/mm.h>
#include <grub/command.h> #include <grub/command.h>
#include <grub/i18n.h>
#include <regex.h> #include <regex.h>
static grub_err_t static grub_err_t
@ -69,8 +70,8 @@ static grub_command_t cmd;
GRUB_MOD_INIT(regexp) GRUB_MOD_INIT(regexp)
{ {
cmd = grub_register_command ("regexp", grub_cmd_regexp, cmd = grub_register_command ("regexp", grub_cmd_regexp,
"REGEXP STRING", N_("REGEXP STRING"),
"Test if REGEXP matches STRING."); N_("Test if REGEXP matches STRING."));
} }
GRUB_MOD_FINI(regexp) GRUB_MOD_FINI(regexp)

View file

@ -23,6 +23,7 @@
#include <grub/extcmd.h> #include <grub/extcmd.h>
#include <grub/env.h> #include <grub/env.h>
#include <grub/mm.h> #include <grub/mm.h>
#include <grub/i18n.h>
struct pci_register struct pci_register
{ {
@ -329,9 +330,9 @@ static grub_extcmd_t cmd;
GRUB_MOD_INIT(setpci) GRUB_MOD_INIT(setpci)
{ {
cmd = grub_register_extcmd ("setpci", grub_cmd_setpci, GRUB_COMMAND_FLAG_BOTH, cmd = grub_register_extcmd ("setpci", grub_cmd_setpci, GRUB_COMMAND_FLAG_BOTH,
"setpci [-s POSITION] [-d DEVICE] [-v VAR] " N_("[-s POSITION] [-d DEVICE] [-v VAR] "
"[REGISTER][=VALUE[:MASK]]", "[REGISTER][=VALUE[:MASK]]"),
"Manipulate PCI devices.", options); N_("Manipulate PCI devices."), options);
} }
GRUB_MOD_FINI(setpci) GRUB_MOD_FINI(setpci)

View file

@ -26,32 +26,43 @@
struct grub_term_autoload *grub_term_input_autoload = NULL; struct grub_term_autoload *grub_term_input_autoload = NULL;
struct grub_term_autoload *grub_term_output_autoload = NULL; struct grub_term_autoload *grub_term_output_autoload = NULL;
struct abstract_terminal
{
struct abstract_terminal *next;
const char *name;
grub_err_t (*init) (void);
grub_err_t (*fini) (void);
};
static grub_err_t static grub_err_t
grub_cmd_terminal_input (grub_command_t cmd __attribute__ ((unused)), handle_command (int argc, char **args, struct abstract_terminal **enabled,
int argc, char **args) struct abstract_terminal **disabled,
struct grub_term_autoload *autoloads,
const char *active_str,
const char *available_str)
{ {
int i; int i;
grub_term_input_t term; struct abstract_terminal *term;
struct grub_term_autoload *aut; struct grub_term_autoload *aut;
if (argc == 0) if (argc == 0)
{ {
grub_puts_ (N_ ("Active input terminals:")); grub_puts_ (active_str);
FOR_ACTIVE_TERM_INPUTS(term) for (term = *enabled; term; term = term->next)
grub_printf ("%s ", term->name); grub_printf ("%s ", term->name);
grub_printf ("\n"); grub_printf ("\n");
grub_puts_ (N_ ("Available input terminals:")); grub_puts_ (available_str);
FOR_DISABLED_TERM_INPUTS(term) for (term = *disabled; term; term = term->next)
grub_printf ("%s ", term->name); grub_printf ("%s ", term->name);
/* This is quadratic but we don't expect mode than 30 terminal /* This is quadratic but we don't expect mode than 30 terminal
modules ever. */ modules ever. */
for (aut = grub_term_input_autoload; aut; aut = aut->next) for (aut = autoloads; aut; aut = aut->next)
{ {
FOR_DISABLED_TERM_INPUTS(term) for (term = *disabled; term; term = term->next)
if (grub_strcmp (term->name, aut->name) == 0) if (grub_strcmp (term->name, aut->name) == 0)
break; break;
if (!term) if (!term)
FOR_ACTIVE_TERM_INPUTS(term) for (term = *enabled; term; term = term->next)
if (grub_strcmp (term->name, aut->name) == 0) if (grub_strcmp (term->name, aut->name) == 0)
break; break;
if (!term) if (!term)
@ -74,11 +85,11 @@ grub_cmd_terminal_input (grub_command_t cmd __attribute__ ((unused)),
int again = 0; int again = 0;
while (1) while (1)
{ {
FOR_DISABLED_TERM_INPUTS(term) for (term = *disabled; term; term = term->next)
if (grub_strcmp (args[i], term->name) == 0) if (grub_strcmp (args[i], term->name) == 0)
break; break;
if (term == 0) if (term == 0)
FOR_ACTIVE_TERM_INPUTS(term) for (term = *enabled; term; term = term->next)
if (grub_strcmp (args[i], term->name) == 0) if (grub_strcmp (args[i], term->name) == 0)
break; break;
if (term) if (term)
@ -86,7 +97,7 @@ grub_cmd_terminal_input (grub_command_t cmd __attribute__ ((unused)),
if (again) if (again)
return grub_error (GRUB_ERR_BAD_ARGUMENT, "unknown terminal '%s'\n", return grub_error (GRUB_ERR_BAD_ARGUMENT, "unknown terminal '%s'\n",
args[i]); args[i]);
for (aut = grub_term_input_autoload; aut; aut = aut->next) for (aut = autoloads; aut; aut = aut->next)
if (grub_strcmp (args[i], aut->name) == 0) if (grub_strcmp (args[i], aut->name) == 0)
{ {
grub_dl_t mod; grub_dl_t mod;
@ -107,7 +118,7 @@ grub_cmd_terminal_input (grub_command_t cmd __attribute__ ((unused)),
{ {
for (i = 1; i < argc; i++) for (i = 1; i < argc; i++)
{ {
FOR_DISABLED_TERM_INPUTS(term) for (term = *disabled; term; term = term->next)
if (grub_strcmp (args[i], term->name) == 0) if (grub_strcmp (args[i], term->name) == 0)
break; break;
if (term) if (term)
@ -115,10 +126,8 @@ grub_cmd_terminal_input (grub_command_t cmd __attribute__ ((unused)),
if (term->init && term->init () != GRUB_ERR_NONE) if (term->init && term->init () != GRUB_ERR_NONE)
return grub_errno; return grub_errno;
grub_list_remove (GRUB_AS_LIST_P (&(grub_term_inputs_disabled)), grub_list_remove (GRUB_AS_LIST_P (disabled), GRUB_AS_LIST (term));
GRUB_AS_LIST (term)); grub_list_push (GRUB_AS_LIST_P (enabled), GRUB_AS_LIST (term));
grub_list_push (GRUB_AS_LIST_P (&grub_term_inputs),
GRUB_AS_LIST (term));
} }
} }
return GRUB_ERR_NONE; return GRUB_ERR_NONE;
@ -128,27 +137,25 @@ grub_cmd_terminal_input (grub_command_t cmd __attribute__ ((unused)),
{ {
for (i = 1; i < argc; i++) for (i = 1; i < argc; i++)
{ {
FOR_ACTIVE_TERM_INPUTS(term) for (term = *enabled; term; term = term->next)
if (grub_strcmp (args[i], term->name) == 0) if (grub_strcmp (args[i], term->name) == 0)
break; break;
if (term) if (term)
{ {
if (!term->next && term == grub_term_inputs) if (!term->next && term == *enabled)
return grub_error (GRUB_ERR_BAD_ARGUMENT, return grub_error (GRUB_ERR_BAD_ARGUMENT,
"can't remove the last terminal"); "can't remove the last terminal");
grub_list_remove (GRUB_AS_LIST_P (&(grub_term_inputs)), grub_list_remove (GRUB_AS_LIST_P (enabled), GRUB_AS_LIST (term));
GRUB_AS_LIST (term));
if (term->fini) if (term->fini)
term->fini (); term->fini ();
grub_list_push (GRUB_AS_LIST_P (&grub_term_inputs_disabled), grub_list_push (GRUB_AS_LIST_P (disabled), GRUB_AS_LIST (term));
GRUB_AS_LIST (term));
} }
} }
return GRUB_ERR_NONE; return GRUB_ERR_NONE;
} }
for (i = 0; i < argc; i++) for (i = 0; i < argc; i++)
{ {
FOR_DISABLED_TERM_INPUTS(term) for (term = *disabled; term; term = term->next)
if (grub_strcmp (args[i], term->name) == 0) if (grub_strcmp (args[i], term->name) == 0)
break; break;
if (term) if (term)
@ -156,193 +163,64 @@ grub_cmd_terminal_input (grub_command_t cmd __attribute__ ((unused)),
if (term->init && term->init () != GRUB_ERR_NONE) if (term->init && term->init () != GRUB_ERR_NONE)
return grub_errno; return grub_errno;
grub_list_remove (GRUB_AS_LIST_P (&(grub_term_inputs_disabled)), grub_list_remove (GRUB_AS_LIST_P (disabled), GRUB_AS_LIST (term));
GRUB_AS_LIST (term)); grub_list_push (GRUB_AS_LIST_P (enabled), GRUB_AS_LIST (term));
grub_list_push (GRUB_AS_LIST_P (&grub_term_inputs),
GRUB_AS_LIST (term));
} }
} }
FOR_ACTIVE_TERM_INPUTS(term)
{ {
struct abstract_terminal *next;
for (term = *enabled; term; term = next)
{
next = term->next;
for (i = 0; i < argc; i++) for (i = 0; i < argc; i++)
if (grub_strcmp (args[i], term->name) == 0) if (grub_strcmp (args[i], term->name) == 0)
break; break;
if (i == argc) if (i == argc)
{ {
if (!term->next && term == grub_term_inputs) if (!term->next && term == *enabled)
return grub_error (GRUB_ERR_BAD_ARGUMENT, return grub_error (GRUB_ERR_BAD_ARGUMENT,
"can't remove the last terminal"); "can't remove the last terminal");
grub_list_remove (GRUB_AS_LIST_P (&(grub_term_inputs)), grub_list_remove (GRUB_AS_LIST_P (enabled), GRUB_AS_LIST (term));
GRUB_AS_LIST (term));
if (term->fini) if (term->fini)
term->fini (); term->fini ();
grub_list_push (GRUB_AS_LIST_P (&grub_term_inputs_disabled), grub_list_push (GRUB_AS_LIST_P (disabled), GRUB_AS_LIST (term));
GRUB_AS_LIST (term)); }
} }
} }
return GRUB_ERR_NONE; return GRUB_ERR_NONE;
} }
static grub_err_t
grub_cmd_terminal_input (grub_command_t cmd __attribute__ ((unused)),
int argc, char **args)
{
(void) GRUB_FIELD_MATCH (grub_term_inputs, struct abstract_terminal *, next);
(void) GRUB_FIELD_MATCH (grub_term_inputs, struct abstract_terminal *, name);
(void) GRUB_FIELD_MATCH (grub_term_inputs, struct abstract_terminal *, init);
(void) GRUB_FIELD_MATCH (grub_term_inputs, struct abstract_terminal *, fini);
return handle_command (argc, args,
(struct abstract_terminal **) &grub_term_inputs,
(struct abstract_terminal **) &grub_term_inputs_disabled,
grub_term_input_autoload,
N_ ("Active input terminals:"),
N_ ("Available input terminals:"));
}
static grub_err_t static grub_err_t
grub_cmd_terminal_output (grub_command_t cmd __attribute__ ((unused)), grub_cmd_terminal_output (grub_command_t cmd __attribute__ ((unused)),
int argc, char **args) int argc, char **args)
{ {
int i; (void) GRUB_FIELD_MATCH (grub_term_outputs, struct abstract_terminal *, next);
grub_term_output_t term; (void) GRUB_FIELD_MATCH (grub_term_outputs, struct abstract_terminal *, name);
struct grub_term_autoload *aut; (void) GRUB_FIELD_MATCH (grub_term_outputs, struct abstract_terminal *, init);
(void) GRUB_FIELD_MATCH (grub_term_outputs, struct abstract_terminal *, fini);
if (argc == 0) return handle_command (argc, args, (struct abstract_terminal **) &grub_term_outputs,
{ (struct abstract_terminal **) &grub_term_outputs_disabled,
grub_puts_ (N_ ("Active output terminals:")); grub_term_output_autoload,
FOR_ACTIVE_TERM_OUTPUTS(term) N_ ("Active output terminals:"),
grub_printf ("%s ", term->name); N_ ("Available output terminals:"));
grub_printf ("\n");
grub_puts_ (N_ ("Available output terminals:"));
FOR_DISABLED_TERM_OUTPUTS(term)
grub_printf ("%s ", term->name);
/* This is quadratic but we don't expect mode than 30 terminal
modules ever. */
for (aut = grub_term_output_autoload; aut; aut = aut->next)
{
FOR_DISABLED_TERM_OUTPUTS(term)
if (grub_strcmp (term->name, aut->name) == 0)
break;
if (!term)
FOR_ACTIVE_TERM_OUTPUTS(term)
if (grub_strcmp (term->name, aut->name) == 0)
break;
if (!term)
grub_printf ("%s ", aut->name);
}
grub_printf ("\n");
return GRUB_ERR_NONE;
}
i = 0;
if (grub_strcmp (args[0], "--append") == 0
|| grub_strcmp (args[0], "--remove") == 0)
i++;
if (i == argc)
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_ ("no terminal specified"));
for (; i < argc; i++)
{
int again = 0;
while (1)
{
FOR_DISABLED_TERM_OUTPUTS(term)
if (grub_strcmp (args[i], term->name) == 0)
break;
if (term == 0)
FOR_ACTIVE_TERM_OUTPUTS(term)
if (grub_strcmp (args[i], term->name) == 0)
break;
if (term)
break;
if (again)
return grub_error (GRUB_ERR_BAD_ARGUMENT, "unknown terminal '%s'\n",
args[i]);
for (aut = grub_term_output_autoload; aut; aut = aut->next)
if (grub_strcmp (args[i], aut->name) == 0)
{
grub_dl_t mod;
mod = grub_dl_load (aut->modname);
if (mod)
grub_dl_ref (mod);
grub_errno = GRUB_ERR_NONE;
break;
}
if (!aut)
return grub_error (GRUB_ERR_BAD_ARGUMENT, "unknown terminal '%s'\n",
args[i]);
again = 1;
}
}
if (grub_strcmp (args[0], "--append") == 0)
{
for (i = 1; i < argc; i++)
{
FOR_DISABLED_TERM_OUTPUTS(term)
if (grub_strcmp (args[i], term->name) == 0)
break;
if (term)
{
if (term->init && term->init () != GRUB_ERR_NONE)
return grub_errno;
grub_list_remove (GRUB_AS_LIST_P (&(grub_term_outputs_disabled)),
GRUB_AS_LIST (term));
grub_list_push (GRUB_AS_LIST_P (&grub_term_outputs),
GRUB_AS_LIST (term));
}
}
return GRUB_ERR_NONE;
}
if (grub_strcmp (args[0], "--remove") == 0)
{
for (i = 1; i < argc; i++)
{
FOR_ACTIVE_TERM_OUTPUTS(term)
if (grub_strcmp (args[i], term->name) == 0)
break;
if (term)
{
if (!term->next && term == grub_term_outputs)
return grub_error (GRUB_ERR_BAD_ARGUMENT,
"can't remove the last terminal");
grub_list_remove (GRUB_AS_LIST_P (&(grub_term_outputs)),
GRUB_AS_LIST (term));
if (term->fini)
term->fini ();
grub_list_push (GRUB_AS_LIST_P (&grub_term_outputs_disabled),
GRUB_AS_LIST (term));
}
}
return GRUB_ERR_NONE;
}
for (i = 0; i < argc; i++)
{
FOR_DISABLED_TERM_OUTPUTS(term)
if (grub_strcmp (args[i], term->name) == 0)
break;
if (term)
{
if (term->init && term->init () != GRUB_ERR_NONE)
return grub_errno;
grub_list_remove (GRUB_AS_LIST_P (&(grub_term_outputs_disabled)),
GRUB_AS_LIST (term));
grub_list_push (GRUB_AS_LIST_P (&grub_term_outputs),
GRUB_AS_LIST (term));
}
}
FOR_ACTIVE_TERM_OUTPUTS(term)
{
for (i = 0; i < argc; i++)
if (grub_strcmp (args[i], term->name) == 0)
break;
if (i == argc)
{
if (!term->next && term == grub_term_outputs)
return grub_error (GRUB_ERR_BAD_ARGUMENT,
"can't remove the last terminal");
grub_list_remove (GRUB_AS_LIST_P (&(grub_term_outputs)),
GRUB_AS_LIST (term));
if (term->fini)
term->fini ();
grub_list_push (GRUB_AS_LIST_P (&grub_term_outputs_disabled),
GRUB_AS_LIST (term));
}
}
return GRUB_ERR_NONE;
} }
static grub_command_t cmd_terminal_input, cmd_terminal_output; static grub_command_t cmd_terminal_input, cmd_terminal_output;
@ -351,14 +229,14 @@ GRUB_MOD_INIT(terminal)
{ {
cmd_terminal_input = cmd_terminal_input =
grub_register_command ("terminal_input", grub_cmd_terminal_input, grub_register_command ("terminal_input", grub_cmd_terminal_input,
"[--append|--remove] " N_("[--append|--remove] "
"[TERMINAL1] [TERMINAL2] ...", "[TERMINAL1] [TERMINAL2] ..."),
"List or select an input terminal."); N_("List or select an input terminal."));
cmd_terminal_output = cmd_terminal_output =
grub_register_command ("terminal_output", grub_cmd_terminal_output, grub_register_command ("terminal_output", grub_cmd_terminal_output,
"[--append|--remove] " N_("[--append|--remove] "
"[TERMINAL1] [TERMINAL2] ...", "[TERMINAL1] [TERMINAL2] ..."),
"List or select an output terminal."); N_("List or select an output terminal."));
} }
GRUB_MOD_FINI(terminal) GRUB_MOD_FINI(terminal)

View file

@ -14,7 +14,7 @@ kernel_img_SOURCES = kern/device.c kern/disk.c kern/dl.c kern/env.c \
util/hostdisk.c util/getroot.c util/mm.c util/time.c \ util/hostdisk.c util/getroot.c util/mm.c util/time.c \
\ \
gnulib/progname.c util/hostfs.c disk/host.c gnulib/progname.c util/hostfs.c disk/host.c
kernel_img_HEADERS += datetime.h kernel_img_HEADERS += datetime.h util/misc.h
kernel_img_CFLAGS = $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) -Wno-undef -I$(srcdir)/gnulib kernel_img_CFLAGS = $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) -Wno-undef -I$(srcdir)/gnulib
kernel_img_LDFLAGS = $(COMMON_LDFLAGS) kernel_img_LDFLAGS = $(COMMON_LDFLAGS)
TARGET_NO_STRIP = yes TARGET_NO_STRIP = yes
@ -88,6 +88,7 @@ pkglib_MODULES += pci.mod
pci_mod_SOURCES = util/pci.c commands/lspci.c pci_mod_SOURCES = util/pci.c commands/lspci.c
pci_mod_LDFLAGS = $(COMMON_LDFLAGS) pci_mod_LDFLAGS = $(COMMON_LDFLAGS)
grub_emu_LDFLAGS += $(LIBPCIACCESS) grub_emu_LDFLAGS += $(LIBPCIACCESS)
kernel_img_HEADERS += libpciaccess.h
endif endif
include $(srcdir)/conf/common.mk include $(srcdir)/conf/common.mk

View file

@ -31,9 +31,9 @@ grub_probe_SOURCES = gnulib/progname.c util/grub-probe.c \
\ \
fs/affs.c fs/cpio.c fs/fat.c fs/ext2.c fs/hfs.c \ fs/affs.c fs/cpio.c fs/fat.c fs/ext2.c fs/hfs.c \
fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c \ fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c \
fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c \ fs/nilfs2.c fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c \
fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/afs_be.c \ fs/sfs.c fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c \
fs/befs.c fs/befs_be.c fs/tar.c \ fs/afs_be.c fs/befs.c fs/befs_be.c fs/tar.c \
\ \
partmap/msdos.c partmap/bsdlabel.c partmap/apple.c \ partmap/msdos.c partmap/bsdlabel.c partmap/apple.c \
partmap/sun.c partmap/sunpc.c partmap/gpt.c \ partmap/sun.c partmap/sunpc.c partmap/gpt.c \
@ -69,7 +69,7 @@ grub_fstest_SOURCES = gnulib/progname.c util/grub-fstest.c util/hostfs.c \
\ \
fs/affs.c fs/cpio.c fs/fat.c fs/ext2.c fs/hfs.c \ fs/affs.c fs/cpio.c fs/fat.c fs/ext2.c fs/hfs.c \
fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c \ fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c \
fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c \ fs/nilfs2.c fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c \
fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/afs_be.c fs/befs.c \ fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/afs_be.c fs/befs.c \
fs/befs_be.c fs/tar.c \ fs/befs_be.c fs/tar.c \
\ \
@ -116,7 +116,7 @@ DEFSYMFILES += kernel_syms.lst
kernel_img_HEADERS += boot.h cache.h device.h disk.h dl.h elf.h elfload.h \ kernel_img_HEADERS += boot.h cache.h device.h disk.h dl.h elf.h elfload.h \
env.h err.h file.h fs.h kernel.h loader.h misc.h mm.h net.h parser.h \ env.h err.h file.h fs.h kernel.h loader.h misc.h mm.h net.h parser.h \
partition.h msdos_partition.h reader.h symbol.h term.h time.h types.h \ partition.h msdos_partition.h reader.h symbol.h term.h time.h types.h \
list.h handler.h command.h i18n.h env_private.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 machine/kernel.h
@ -298,6 +298,12 @@ minix_mod_SOURCES = fs/minix.c
minix_mod_CFLAGS = $(COMMON_CFLAGS) minix_mod_CFLAGS = $(COMMON_CFLAGS)
minix_mod_LDFLAGS = $(COMMON_LDFLAGS) minix_mod_LDFLAGS = $(COMMON_LDFLAGS)
# For nilfs2.mod.
pkglib_MODULES += nilfs2.mod
nilfs2_mod_SOURCES = fs/nilfs2.c
nilfs2_mod_CFLAGS = $(COMMON_CFLAGS)
nilfs2_mod_LDFLAGS = $(COMMON_LDFLAGS)
# For hfs.mod. # For hfs.mod.
hfs_mod_SOURCES = fs/hfs.c hfs_mod_SOURCES = fs/hfs.c
hfs_mod_CFLAGS = $(COMMON_CFLAGS) hfs_mod_CFLAGS = $(COMMON_CFLAGS)

View file

@ -10,7 +10,7 @@ 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 \
kern/i386/coreboot/init.c \ kern/i386/coreboot/init.c \
kern/i386/multiboot_mmap.c \ kern/i386/coreboot/mmap.c \
kern/i386/halt.c \ kern/i386/halt.c \
kern/main.c kern/device.c \ kern/main.c kern/device.c \
kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c \ kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c \
@ -26,7 +26,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,$(GRUB_KERNEL_MACHINE_LINK_ADDR),-Bstatic
sbin_SCRIPTS += grub-install sbin_SCRIPTS += grub-install
grub_install_SOURCES = util/grub-install.in grub_install_SOURCES = util/grub-install.in

View file

@ -26,7 +26,7 @@ kernel_img_SOURCES = kern/i386/ieee1275/startup.S \
kernel_img_HEADERS += ieee1275/ieee1275.h kernel_img_HEADERS += ieee1275/ieee1275.h
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,0x10000,-Bstatic kernel_img_LDFLAGS += $(COMMON_LDFLAGS) -Wl,-N,-S,-Ttext,0x10000,-Bstatic
# Scripts. # Scripts.
sbin_SCRIPTS = grub-install sbin_SCRIPTS = grub-install

74
conf/i386-multiboot.rmk Normal file
View file

@ -0,0 +1,74 @@
# -*- makefile -*-
COMMON_CFLAGS = -mrtd -mregparm=3
# Images.
GRUB_KERNEL_MACHINE_LINK_ADDR = 0x8200
pkglib_PROGRAMS += kernel.img
kernel_img_SOURCES = kern/i386/coreboot/startup.S \
kern/i386/misc.S \
kern/i386/coreboot/init.c \
kern/i386/multiboot_mmap.c \
kern/i386/halt.c \
kern/main.c kern/device.c \
kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c \
kern/misc.c kern/mm.c kern/term.c \
kern/rescue_parser.c kern/rescue_reader.c \
kern/time.c kern/list.c kern/handler.c kern/command.c kern/corecmd.c \
kern/$(target_cpu)/dl.c kern/parser.c kern/partition.c \
kern/i386/tsc.c kern/i386/pit.c \
kern/generic/rtc_get_time_ms.c \
kern/generic/millisleep.c \
kern/env.c \
term/i386/pc/vga_text.c term/i386/vga_common.c \
symlist.c
kernel_img_CFLAGS = $(COMMON_CFLAGS)
kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
kernel_img_LDFLAGS += $(COMMON_LDFLAGS) -Wl,-N,-S,-Ttext,$(GRUB_KERNEL_MACHINE_LINK_ADDR),-Bstatic
sbin_SCRIPTS += grub-install
grub_install_SOURCES = util/grub-install.in
bin_SCRIPTS += grub-mkrescue
grub_mkrescue_SOURCES = util/grub-mkrescue.in
# Modules.
pkglib_MODULES = linux.mod aout.mod halt.mod datetime.mod mmap.mod
# For mmap.mod.
mmap_mod_SOURCES = mmap/mmap.c mmap/i386/uppermem.c mmap/i386/mmap.c
mmap_mod_CFLAGS = $(COMMON_CFLAGS)
mmap_mod_LDFLAGS = $(COMMON_LDFLAGS)
mmap_mod_ASFLAGS = $(COMMON_ASFLAGS)
# For linux.mod.
linux_mod_SOURCES = loader/i386/linux.c
linux_mod_CFLAGS = $(COMMON_CFLAGS)
linux_mod_LDFLAGS = $(COMMON_LDFLAGS)
# For halt.mod.
halt_mod_SOURCES = commands/halt.c
halt_mod_CFLAGS = $(COMMON_CFLAGS)
halt_mod_LDFLAGS = $(COMMON_LDFLAGS)
# For aout.mod.
aout_mod_SOURCES = loader/aout.c
aout_mod_CFLAGS = $(COMMON_CFLAGS)
aout_mod_LDFLAGS = $(COMMON_LDFLAGS)
# For bsd.mod
pkglib_MODULES += bsd.mod
bsd_mod_SOURCES = loader/i386/bsd.c loader/i386/bsd32.c loader/i386/bsd64.c loader/i386/bsd_helper.S loader/i386/bsd_trampoline.S
bsd_mod_CFLAGS = $(COMMON_CFLAGS)
bsd_mod_LDFLAGS = $(COMMON_LDFLAGS)
bsd_mod_ASFLAGS = $(COMMON_ASFLAGS)
# For datetime.mod
datetime_mod_SOURCES = lib/cmos_datetime.c
datetime_mod_CFLAGS = $(COMMON_CFLAGS)
datetime_mod_LDFLAGS = $(COMMON_LDFLAGS)
include $(srcdir)/conf/i386.mk
include $(srcdir)/conf/common.mk

View file

@ -56,7 +56,7 @@ kernel_img_SOURCES = kern/i386/pc/startup.S \
kernel_img_HEADERS += machine/pxe.h i386/pit.h machine/int.h kernel_img_HEADERS += machine/pxe.h i386/pit.h machine/int.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)$(GRUB_KERNEL_MACHINE_LINK_ADDR) $(COMMON_CFLAGS)
kernel_img_FORMAT = binary kernel_img_FORMAT = binary
# Utilities. # Utilities.
@ -80,9 +80,9 @@ grub_setup_SOURCES = gnulib/progname.c \
\ \
fs/affs.c fs/cpio.c fs/ext2.c fs/fat.c fs/hfs.c \ fs/affs.c fs/cpio.c fs/ext2.c fs/fat.c fs/hfs.c \
fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c \ fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c \
fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c \ fs/nilfs2.c fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c \
fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/afs_be.c \ fs/sfs.c fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c \
fs/befs.c fs/befs_be.c fs/tar.c \ fs/afs_be.c fs/befs.c fs/befs_be.c fs/tar.c \
\ \
partmap/msdos.c partmap/bsdlabel.c partmap/sunpc.c \ partmap/msdos.c partmap/bsdlabel.c partmap/sunpc.c \
partmap/gpt.c \ partmap/gpt.c \

View file

@ -39,7 +39,7 @@ kernel_img_SOURCES = kern/i386/qemu/startup.S \
symlist.c symlist.c
kernel_img_CFLAGS = $(COMMON_CFLAGS) -DGRUB_BOOT_MACHINE_LINK_ADDR=$(GRUB_BOOT_MACHINE_LINK_ADDR) kernel_img_CFLAGS = $(COMMON_CFLAGS) -DGRUB_BOOT_MACHINE_LINK_ADDR=$(GRUB_BOOT_MACHINE_LINK_ADDR)
kernel_img_ASFLAGS = $(COMMON_ASFLAGS) -DGRUB_KERNEL_MACHINE_LINK_ADDR=$(GRUB_KERNEL_MACHINE_LINK_ADDR) kernel_img_ASFLAGS = $(COMMON_ASFLAGS) -DGRUB_KERNEL_MACHINE_LINK_ADDR=$(GRUB_KERNEL_MACHINE_LINK_ADDR)
kernel_img_LDFLAGS = $(COMMON_LDFLAGS) $(TARGET_IMG_LDFLAGS)$(GRUB_KERNEL_MACHINE_LINK_ADDR) kernel_img_LDFLAGS += $(COMMON_LDFLAGS) $(TARGET_IMG_LDFLAGS)$(GRUB_KERNEL_MACHINE_LINK_ADDR)
kernel_img_FORMAT = binary kernel_img_FORMAT = binary
sbin_SCRIPTS += grub-install sbin_SCRIPTS += grub-install

View file

@ -68,3 +68,8 @@ play_mod_SOURCES = commands/i386/pc/play.c
play_mod_CFLAGS = $(COMMON_CFLAGS) play_mod_CFLAGS = $(COMMON_CFLAGS)
play_mod_LDFLAGS = $(COMMON_LDFLAGS) play_mod_LDFLAGS = $(COMMON_LDFLAGS)
# For iorw.mod.
pkglib_MODULES += iorw.mod
iorw_mod_SOURCES = commands/iorw.c
iorw_mod_CFLAGS = $(COMMON_CFLAGS)
iorw_mod_LDFLAGS = $(COMMON_LDFLAGS)

View file

@ -18,6 +18,5 @@ kernel_img_SOURCES = kern/$(target_cpu)/startup.S \
symlist.c kern/$(target_cpu)/cache.S symlist.c kern/$(target_cpu)/cache.S
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) -static-libgcc -lgcc \ kernel_img_LDFLAGS = $(COMMON_LDFLAGS) -Wl,-N,-S,-Ttext,$(LINK_BASE),-Bstatic
-Wl,-N,-S,-Ttext,$(LINK_BASE),-Bstatic
kernel_img_FORMAT = binary kernel_img_FORMAT = binary

View file

@ -29,8 +29,7 @@ kernel_img_SOURCES = kern/$(target_cpu)/startup.S \
symlist.c symlist.c
kernel_img_CFLAGS = $(COMMON_CFLAGS) -DUSE_ASCII_FAILBACK kernel_img_CFLAGS = $(COMMON_CFLAGS) -DUSE_ASCII_FAILBACK
kernel_img_ASFLAGS = $(COMMON_ASFLAGS) kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
kernel_img_LDFLAGS = $(COMMON_LDFLAGS) -static-libgcc -lgcc \ kernel_img_LDFLAGS += $(COMMON_LDFLAGS) -Wl,-N,-S,-Ttext,$(LINK_BASE),-Bstatic
-Wl,-N,-S,-Ttext,$(LINK_BASE),-Bstatic
kernel_img_FORMAT = binary kernel_img_FORMAT = binary
# For ata.mod. # For ata.mod.

View file

@ -4,7 +4,7 @@
COMMON_CFLAGS += -mexplicit-relocs -mflush-func=grub_cpu_flush_cache COMMON_CFLAGS += -mexplicit-relocs -mflush-func=grub_cpu_flush_cache
# Images. # Images.
kernel_img_HEADERS += cpu/libgcc.h cpu/cache.h kernel_img_HEADERS += cpu/cache.h
# Scripts. # Scripts.
sbin_SCRIPTS = sbin_SCRIPTS =

View file

@ -3,7 +3,7 @@
# Images. # Images.
kernel_img_HEADERS += cpu/libgcc.h ieee1275/ieee1275.h kernel_img_HEADERS += ieee1275/ieee1275.h
# Programs # Programs
pkglib_PROGRAMS = kernel.img pkglib_PROGRAMS = kernel.img
@ -23,8 +23,7 @@ kernel_img_SOURCES = kern/powerpc/ieee1275/startup.S kern/ieee1275/cmain.c \
symlist.c kern/$(target_cpu)/cache.S symlist.c kern/$(target_cpu)/cache.S
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) -static-libgcc -lgcc \ kernel_img_LDFLAGS += $(COMMON_LDFLAGS) -Wl,-N,-S,-Ttext,0x200000,-Bstatic
-Wl,-N,-S,-Ttext,0x200000,-Bstatic
# Scripts. # Scripts.
sbin_SCRIPTS = grub-install sbin_SCRIPTS = grub-install

View file

@ -19,7 +19,7 @@ diskboot_img_ASFLAGS = $(COMMON_ASFLAGS)
diskboot_img_LDFLAGS = $(COMMON_LDFLAGS) -Wl,-N,-Ttext,0x4200 diskboot_img_LDFLAGS = $(COMMON_LDFLAGS) -Wl,-N,-Ttext,0x4200
diskboot_img_FORMAT = binary diskboot_img_FORMAT = binary
kernel_img_HEADERS += cpu/libgcc.h ieee1275/ieee1275.h cpu/ieee1275/ieee1275.h kernel_img_HEADERS += ieee1275/ieee1275.h cpu/ieee1275/ieee1275.h
kernel_img_SOURCES = kern/sparc64/ieee1275/crt0.S kern/ieee1275/cmain.c \ kernel_img_SOURCES = kern/sparc64/ieee1275/crt0.S kern/ieee1275/cmain.c \
kern/ieee1275/ieee1275.c kern/main.c kern/device.c \ kern/ieee1275/ieee1275.c kern/main.c kern/device.c \
kern/disk.c kern/dl.c kern/err.c kern/file.c kern/fs.c \ kern/disk.c kern/dl.c kern/err.c kern/file.c kern/fs.c \
@ -36,7 +36,7 @@ kernel_img_SOURCES = kern/sparc64/ieee1275/crt0.S kern/ieee1275/cmain.c \
symlist.c kern/$(target_cpu)/cache.S symlist.c kern/$(target_cpu)/cache.S
kernel_img_CFLAGS = $(COMMON_CFLAGS) kernel_img_CFLAGS = $(COMMON_CFLAGS)
kernel_img_ASFLAGS = $(COMMON_ASFLAGS) kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
kernel_img_LDFLAGS = -nostdlib -Wl,-N,-Ttext,0x4400,-Bstatic,-melf64_sparc -static-libgcc -lgcc kernel_img_LDFLAGS += -nostdlib -Wl,-N,-Ttext,0x4400,-Bstatic,-melf64_sparc
kernel_img_FORMAT = binary kernel_img_FORMAT = binary
# Utilities. # Utilities.
@ -50,6 +50,7 @@ grub_mkimage_SOURCES = util/grub-mkrawimage.c util/misc.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 util/hostdisk.c \ grub_setup_SOURCES = util/sparc64/ieee1275/grub-setup.c util/hostdisk.c \
util/ieee1275/ofpath.c \
util/misc.c util/getroot.c kern/device.c kern/disk.c \ util/misc.c util/getroot.c kern/device.c kern/disk.c \
kern/err.c kern/misc.c kern/parser.c kern/partition.c \ kern/err.c kern/misc.c kern/parser.c kern/partition.c \
kern/file.c kern/fs.c kern/env.c kern/list.c \ kern/file.c kern/fs.c kern/env.c kern/list.c \
@ -57,9 +58,9 @@ grub_setup_SOURCES = util/sparc64/ieee1275/grub-setup.c util/hostdisk.c \
\ \
fs/affs.c fs/cpio.c fs/ext2.c fs/fat.c fs/hfs.c \ fs/affs.c fs/cpio.c fs/ext2.c fs/fat.c fs/hfs.c \
fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c \ fs/hfsplus.c fs/iso9660.c fs/udf.c fs/jfs.c fs/minix.c \
fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c \ fs/nilfs2.c fs/ntfs.c fs/ntfscomp.c fs/reiserfs.c \
fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/afs_be.c \ fs/sfs.c fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c \
fs/befs.c fs/befs_be.c fs/tar.c \ fs/afs_be.c fs/befs.c fs/befs_be.c fs/tar.c \
\ \
partmap/amiga.c partmap/apple.c partmap/msdos.c \ partmap/amiga.c partmap/apple.c partmap/msdos.c \
partmap/bsdlabel.c partmap/sun.c partmap/acorn.c \ partmap/bsdlabel.c partmap/sun.c partmap/acorn.c \
@ -69,7 +70,7 @@ grub_setup_SOURCES = util/sparc64/ieee1275/grub-setup.c util/hostdisk.c \
grub_setup_init.c grub_setup_init.c
# For grub-ofpathname. # For grub-ofpathname.
grub_ofpathname_SOURCES = util/sparc64/ieee1275/grub-ofpathname.c \ grub_ofpathname_SOURCES = util/ieee1275/grub-ofpathname.c \
util/ieee1275/ofpath.c util/misc.c gnulib/progname.c util/ieee1275/ofpath.c util/misc.c gnulib/progname.c
# Scripts. # Scripts.

View file

@ -65,6 +65,12 @@ grub_script_blanklines_SOURCES = tests/grub_script_blanklines.in
check_SCRIPTS += grub_script_final_semicolon check_SCRIPTS += grub_script_final_semicolon
grub_script_final_semicolon_SOURCES = tests/grub_script_final_semicolon.in grub_script_final_semicolon_SOURCES = tests/grub_script_final_semicolon.in
check_SCRIPTS += grub_script_dollar
grub_script_dollar_SOURCES = tests/grub_script_dollar.in
check_SCRIPTS += grub_script_comments
grub_script_comments_SOURCES = tests/grub_script_comments.in
# List of tests to execute on "make check" # List of tests to execute on "make check"
# SCRIPTED_TESTS = example_scripted_test # SCRIPTED_TESTS = example_scripted_test
# SCRIPTED_TESTS += example_grub_script_test # SCRIPTED_TESTS += example_grub_script_test
@ -79,7 +85,8 @@ SCRIPTED_TESTS += grub_script_while1
SCRIPTED_TESTS += grub_script_if SCRIPTED_TESTS += grub_script_if
SCRIPTED_TESTS += grub_script_blanklines SCRIPTED_TESTS += grub_script_blanklines
SCRIPTED_TESTS += grub_script_final_semicolon SCRIPTED_TESTS += grub_script_final_semicolon
SCRIPTED_TESTS += grub_script_dollar
SCRIPTED_TESTS += grub_script_comments
# dependencies between tests and testing-tools # dependencies between tests and testing-tools
$(SCRIPTED_TESTS): grub-shell grub-shell-tester $(SCRIPTED_TESTS): grub-shell grub-shell-tester

View file

@ -40,7 +40,7 @@ endif
kernel_img_HEADERS += efi/efi.h efi/time.h efi/disk.h i386/pit.h kernel_img_HEADERS += efi/efi.h efi/time.h efi/disk.h i386/pit.h
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) kernel_img_LDFLAGS += $(COMMON_LDFLAGS)
# For acpi.mod. # For acpi.mod.
acpi_mod_SOURCES = commands/acpi.c commands/efi/acpi.c acpi_mod_SOURCES = commands/acpi.c commands/efi/acpi.c
@ -64,13 +64,17 @@ appleldr_mod_CFLAGS = $(COMMON_CFLAGS)
appleldr_mod_LDFLAGS = $(COMMON_LDFLAGS) appleldr_mod_LDFLAGS = $(COMMON_LDFLAGS)
# For linux.mod. # For linux.mod.
linux_mod_SOURCES = loader/i386/efi/linux.c
ifeq ($(target_cpu), x86_64) ifeq ($(target_cpu), x86_64)
linux_mod_SOURCES += loader/i386/linux_trampoline.S linux_mod_SOURCES = loader/i386/efi/linux.c loader/i386/linux_trampoline.S
endif
linux_mod_CFLAGS = $(COMMON_CFLAGS) linux_mod_CFLAGS = $(COMMON_CFLAGS)
linux_mod_ASFLAGS = $(COMMON_ASFLAGS) linux_mod_ASFLAGS = $(COMMON_ASFLAGS)
linux_mod_LDFLAGS = $(COMMON_LDFLAGS) linux_mod_LDFLAGS = $(COMMON_LDFLAGS)
else
linux_mod_SOURCES = loader/i386/efi/linux.c
linux_mod_CFLAGS = $(COMMON_CFLAGS)
linux_mod_ASFLAGS = $(COMMON_ASFLAGS)
linux_mod_LDFLAGS = $(COMMON_LDFLAGS)
endif
# For halt.mod. # For halt.mod.
halt_mod_SOURCES = commands/halt.c halt_mod_SOURCES = commands/halt.c

View file

@ -102,6 +102,7 @@ case "$target_cpu"-"$platform" in
i386-efi) ;; i386-efi) ;;
x86_64-efi) ;; x86_64-efi) ;;
i386-pc) ;; i386-pc) ;;
i386-multiboot) ;;
i386-coreboot) ;; i386-coreboot) ;;
i386-linuxbios) platform=coreboot ;; i386-linuxbios) platform=coreboot ;;
i386-ieee1275) ;; i386-ieee1275) ;;
@ -136,6 +137,7 @@ esac
case "$platform" in case "$platform" in
coreboot) machine_CFLAGS="-DGRUB_MACHINE_COREBOOT=1" ;; coreboot) machine_CFLAGS="-DGRUB_MACHINE_COREBOOT=1" ;;
multiboot) machine_CFLAGS="-DGRUB_MACHINE_MULTIBOOT=1" ;;
efi) machine_CFLAGS="-DGRUB_MACHINE_EFI=1" ;; efi) machine_CFLAGS="-DGRUB_MACHINE_EFI=1" ;;
ieee1275) machine_CFLAGS="-DGRUB_MACHINE_IEEE1275=1" ;; ieee1275) machine_CFLAGS="-DGRUB_MACHINE_IEEE1275=1" ;;
qemu) machine_CFLAGS="-DGRUB_MACHINE_QEMU=1" ;; qemu) machine_CFLAGS="-DGRUB_MACHINE_QEMU=1" ;;
@ -360,7 +362,7 @@ else
if test -f "${srcdir}/conf/${target_cpu}-${platform}-${host_os}-img-ld.sc"; then if test -f "${srcdir}/conf/${target_cpu}-${platform}-${host_os}-img-ld.sc"; then
TARGET_IMG_LDSCRIPT='$(top_srcdir)'"/conf/${target_cpu}-${platform}-${host_os}-img-ld.sc" TARGET_IMG_LDSCRIPT='$(top_srcdir)'"/conf/${target_cpu}-${platform}-${host_os}-img-ld.sc"
TARGET_IMG_LDFLAGS="-Wl,-T${TARGET_IMG_LDSCRIPT} -Wl,-Ttext," TARGET_IMG_LDFLAGS="-Wl,-T${TARGET_IMG_LDSCRIPT} -Wl,-Ttext,"
TARGET_IMG_LDFLAGS_AC="-Wl,-T${srcdir}/conf/${target_cpu}-${platform}-${host_os}-img-ld.sc" TARGET_IMG_LDFLAGS_AC="-Wl,-T${srcdir}/conf/${target_cpu}-${platform}-${host_os}-img-ld.sc -Wl,-Ttext,"
else else
TARGET_IMG_LDSCRIPT= TARGET_IMG_LDSCRIPT=
TARGET_IMG_LDFLAGS='-Wl,-N -Wl,-Ttext,' TARGET_IMG_LDFLAGS='-Wl,-N -Wl,-Ttext,'
@ -376,7 +378,11 @@ AC_SUBST(TARGET_IMG_CFLAGS)
# For platforms where ELF is not the default link format. # For platforms where ELF is not the default link format.
AC_MSG_CHECKING([for command to convert module to ELF format]) AC_MSG_CHECKING([for command to convert module to ELF format])
case "${host_os}" in case "${host_os}" in
cygwin) TARGET_OBJ2ELF='grub-pe2elf' ;; cygwin) TARGET_OBJ2ELF='grub-pe2elf';
# FIXME: put proper test here
AC_DEFINE([NEED_REGISTER_FRAME_INFO], 1,
[Define to 1 if GCC generates calls to __register_frame_info()])
;;
*) ;; *) ;;
esac esac
AC_SUBST(TARGET_OBJ2ELF) AC_SUBST(TARGET_OBJ2ELF)
@ -409,9 +415,7 @@ if test "$target_cpu"-"$platform" = x86_64-efi; then
[grub_cv_cc_mcmodel=no]) [grub_cv_cc_mcmodel=no])
]) ])
if test "x$grub_cv_cc_mcmodel" = xno; then if test "x$grub_cv_cc_mcmodel" = xno; then
CFLAGS="$SAVED_CFLAGS -m64 -DMCMODEL_SMALL=1" AC_MSG_ERROR([-mcmodel=large not supported. Upgrade your gcc.])
TARGET_CFLAGS="$TARGET_CFLAGS -DMCMODEL_SMALL=1"
AC_MSG_WARN([-mcmodel=large not supported. You won't be able to use the memory over 4GiB. Upgrade your gcc])
else else
TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=large" TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=large"
fi fi
@ -479,12 +483,19 @@ CC="$TARGET_CC"
if test "x$TARGET_APPLE_CC" = x1 ; then if test "x$TARGET_APPLE_CC" = x1 ; then
CFLAGS="$TARGET_CFLAGS -nostdlib -Wno-error" CFLAGS="$TARGET_CFLAGS -nostdlib -Wno-error"
else else
CFLAGS="$TARGET_CFLAGS -nostdlib -Wl,--defsym,___main=0x8100 -Wl,--defsym,abort=main -Wno-error" CFLAGS="$TARGET_CFLAGS -nostdlib -Wl,--defsym,___main=0x8100 -Wno-error"
fi fi
CPPFLAGS="$TARGET_CPPFLAGS" CPPFLAGS="$TARGET_CPPFLAGS"
LDFLAGS="$TARGET_LDFLAGS" LDFLAGS="$TARGET_LDFLAGS"
LIBS=-lgcc LIBS=-lgcc
grub_ASM_USCORE
if test x$grub_cv_asm_uscore = xyes; then
CFLAGS="$CFLAGS -Wl,--defsym,_abort=_main"
else
CFLAGS="$CFLAGS -Wl,--defsym,abort=main"
fi
# Check for libgcc symbols # Check for libgcc symbols
AC_CHECK_FUNCS(__bswapsi2 __bswapdi2 __ashldi3 __ashrdi3 __lshrdi3 __trampoline_setup __ucmpdi2 _restgpr_14_x) AC_CHECK_FUNCS(__bswapsi2 __bswapdi2 __ashldi3 __ashrdi3 __lshrdi3 __trampoline_setup __ucmpdi2 _restgpr_14_x)
@ -501,13 +512,12 @@ if test "x$TARGET_APPLE_CC" != x1 ; then
grub_PROG_OBJCOPY_ABSOLUTE grub_PROG_OBJCOPY_ABSOLUTE
fi fi
grub_PROG_LD_BUILD_ID_NONE grub_PROG_LD_BUILD_ID_NONE
grub_ASM_USCORE
if test "x$target_cpu" = xi386; then if test "x$target_cpu" = xi386; then
if test "$platform" != emu && test "x$TARGET_APPLE_CC" != x1 ; then
if test ! -z "$TARGET_IMG_LDSCRIPT"; then if test ! -z "$TARGET_IMG_LDSCRIPT"; then
# Check symbols provided by linker script. # Check symbols provided by linker script.
CFLAGS="$TARGET_CFLAGS -nostdlib $TARGET_IMG_LDFLAGS_AC -Wl,-Ttext,8000,--defsym,___main=0x8100" CFLAGS="$TARGET_CFLAGS -nostdlib ${TARGET_IMG_LDFLAGS_AC}8000 -Wl,--defsym,___main=0x8100"
fi fi
if test "x$TARGET_APPLE_CC" != x1 ; then
grub_CHECK_BSS_START_SYMBOL grub_CHECK_BSS_START_SYMBOL
grub_CHECK_END_SYMBOL grub_CHECK_END_SYMBOL
fi fi
@ -627,6 +637,12 @@ else
fi fi
AC_SUBST(TARGET_NO_MODULES) AC_SUBST(TARGET_NO_MODULES)
if test "$TARGET_NO_MODULES" = yes ; then
# Do not convert modules, otherwise linkage may fail (Cygwin only).
# FIXME: Should be checked above before TARGET_OBJ2ELF is set first.
TARGET_OBJ2ELF=
fi
if test x"$enable_grub_emu_usb" = xno ; then if test x"$enable_grub_emu_usb" = xno ; then
grub_emu_usb_excuse="explicitly disabled" grub_emu_usb_excuse="explicitly disabled"
fi fi

View file

@ -24,6 +24,10 @@
#include <grub/misc.h> #include <grub/misc.h>
#include <grub/lvm.h> #include <grub/lvm.h>
#ifdef GRUB_UTIL
#include <grub/util/misc.h>
#endif
static struct grub_lvm_vg *vg_list; static struct grub_lvm_vg *vg_list;
static int lv_count; static int lv_count;
@ -68,6 +72,9 @@ grub_lvm_memberlist (grub_disk_t disk)
if (lv->vg->pvs) if (lv->vg->pvs)
for (pv = lv->vg->pvs; pv; pv = pv->next) for (pv = lv->vg->pvs; pv; pv = pv->next)
{ {
if (!pv->disk)
grub_util_error ("Couldn't find PV %s. Check your device.map",
pv->name);
tmp = grub_malloc (sizeof (*tmp)); tmp = grub_malloc (sizeof (*tmp));
tmp->disk = pv->disk; tmp->disk = pv->disk;
tmp->next = list; tmp->next = list;

View file

@ -1379,7 +1379,8 @@ pitch and duration pairs.
If the arguments are a series of numbers, play the inline tune. If the arguments are a series of numbers, play the inline tune.
The tempo is the base for all note durations. 60 gives a 1-second base, 120 The tempo is the base for all note durations. 60 gives a 1-second base, 120
gives a half-second base, etc. Pitches are Hz. gives a half-second base, etc. Pitches are Hz. Set pitch to 0 to produce
a rest.
@end deffn @end deffn

View file

@ -31,6 +31,7 @@
#include <grub/efiemu/efiemu.h> #include <grub/efiemu/efiemu.h>
#include <grub/machine/efiemu.h> #include <grub/machine/efiemu.h>
#include <grub/command.h> #include <grub/command.h>
#include <grub/i18n.h>
/* System table. Two version depending on mode */ /* System table. Two version depending on mode */
grub_efi_system_table32_t *grub_efiemu_system_table32 = 0; grub_efi_system_table32_t *grub_efiemu_system_table32 = 0;
@ -327,15 +328,15 @@ GRUB_MOD_INIT(efiemu)
{ {
cmd_loadcore = grub_register_command ("efiemu_loadcore", cmd_loadcore = grub_register_command ("efiemu_loadcore",
grub_cmd_efiemu_load, grub_cmd_efiemu_load,
"FILE", N_("FILE"),
"Load and initialize EFI emulator."); N_("Load and initialize EFI emulator."));
cmd_prepare = grub_register_command ("efiemu_prepare", cmd_prepare = grub_register_command ("efiemu_prepare",
grub_cmd_efiemu_prepare, grub_cmd_efiemu_prepare,
0, 0,
"Finalize loading of EFI emulator."); N_("Finalize loading of EFI emulator."));
cmd_unload = grub_register_command ("efiemu_unload", grub_cmd_efiemu_unload, cmd_unload = grub_register_command ("efiemu_unload", grub_cmd_efiemu_unload,
0, 0,
"Unload EFI emulator."); N_("Unload EFI emulator."));
} }
GRUB_MOD_FINI(efiemu) GRUB_MOD_FINI(efiemu)

View file

@ -21,6 +21,7 @@
#include <grub/dl.h> #include <grub/dl.h>
#include <grub/misc.h> #include <grub/misc.h>
#include <grub/command.h> #include <grub/command.h>
#include <grub/i18n.h>
static grub_err_t static grub_err_t
loadfont_command (grub_command_t cmd __attribute__ ((unused)), loadfont_command (grub_command_t cmd __attribute__ ((unused)),
@ -62,11 +63,11 @@ GRUB_MOD_INIT(font)
cmd_loadfont = cmd_loadfont =
grub_register_command ("loadfont", loadfont_command, grub_register_command ("loadfont", loadfont_command,
"FILE...", N_("FILE..."),
"Specify one or more font files to load."); N_("Specify one or more font files to load."));
cmd_lsfonts = cmd_lsfonts =
grub_register_command ("lsfonts", lsfonts_command, grub_register_command ("lsfonts", lsfonts_command,
0, "List the loaded fonts."); 0, N_("List the loaded fonts."));
} }
GRUB_MOD_FINI(font) GRUB_MOD_FINI(font)

1133
fs/nilfs2.c Normal file

File diff suppressed because it is too large Load diff

View file

@ -25,6 +25,7 @@
#include <grub/dl.h> #include <grub/dl.h>
#include <grub/types.h> #include <grub/types.h>
#include <grub/fshelp.h> #include <grub/fshelp.h>
#include <grub/charset.h>
#define GRUB_UDF_MAX_PDS 2 #define GRUB_UDF_MAX_PDS 2
#define GRUB_UDF_MAX_PMS 6 #define GRUB_UDF_MAX_PMS 6
@ -745,20 +746,42 @@ grub_udf_iterate_dir (grub_fshelp_node_t dir,
else else
{ {
enum grub_fshelp_filetype type; enum grub_fshelp_filetype type;
char filename[dirent.file_ident_length + 1]; grub_uint8_t raw[dirent.file_ident_length];
grub_uint16_t utf16[dirent.file_ident_length - 1];
grub_uint8_t filename[dirent.file_ident_length * 2];
grub_size_t utf16len = 0;
type = ((dirent.characteristics & GRUB_UDF_FID_CHAR_DIRECTORY) ? type = ((dirent.characteristics & GRUB_UDF_FID_CHAR_DIRECTORY) ?
(GRUB_FSHELP_DIR) : (GRUB_FSHELP_REG)); (GRUB_FSHELP_DIR) : (GRUB_FSHELP_REG));
if ((grub_udf_read_file (dir, 0, offset, if ((grub_udf_read_file (dir, 0, offset,
dirent.file_ident_length, filename)) dirent.file_ident_length,
(char *) raw))
!= dirent.file_ident_length) != dirent.file_ident_length)
return 0; return 0;
filename[dirent.file_ident_length] = 0; if (raw[0] == 8)
if (hook (&filename[1], type, child)) {
unsigned i;
utf16len = dirent.file_ident_length - 1;
for (i = 0; i < utf16len; i++)
utf16[i] = raw[i + 1];
}
if (raw[0] == 16)
{
unsigned i;
utf16len = (dirent.file_ident_length - 1) / 2;
for (i = 0; i < utf16len; i++)
utf16[i] = (raw[2 * i + 1] << 8) | raw[2*i + 2];
}
if (raw[0] == 8 || raw[0] == 16)
{
*grub_utf16_to_utf8 (filename, utf16, utf16len) = '\0';
if (hook ((char *) filename, type, child))
return 1; return 1;
} }
}
/* Align to dword boundary. */ /* Align to dword boundary. */
offset = (offset + dirent.file_ident_length + 3) & (~3); offset = (offset + dirent.file_ident_length + 3) & (~3);

View file

@ -44,8 +44,9 @@ typedef struct grub_linuxbios_table_header *grub_linuxbios_table_header_t;
struct grub_linuxbios_table_item struct grub_linuxbios_table_item
{ {
#define GRUB_LINUXBIOS_MEMBER_UNUSED 0 #define GRUB_LINUXBIOS_MEMBER_UNUSED 0x00
#define GRUB_LINUXBIOS_MEMBER_MEMORY 1 #define GRUB_LINUXBIOS_MEMBER_MEMORY 0x01
#define GRUB_LINUXBIOS_MEMBER_LINK 0x11
grub_uint32_t tag; grub_uint32_t tag;
grub_uint32_t size; grub_uint32_t size;
}; };

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -18,21 +18,31 @@
#include <config.h> #include <config.h>
#ifdef HAVE___ASHLDI3 /* On x86 these functions aren't really needed. Save some space. */
#if !defined (__i386__) && !defined (__x86_64__)
# ifdef HAVE___ASHLDI3
void EXPORT_FUNC (__ashldi3) (void); void EXPORT_FUNC (__ashldi3) (void);
#endif # endif
#ifdef HAVE___ASHRDI3 # ifdef HAVE___ASHRDI3
void EXPORT_FUNC (__ashrdi3) (void); void EXPORT_FUNC (__ashrdi3) (void);
#endif # endif
#ifdef HAVE___LSHRDI3 # ifdef HAVE___LSHRDI3
void EXPORT_FUNC (__lshrdi3) (void); void EXPORT_FUNC (__lshrdi3) (void);
# endif
# ifdef HAVE___UCMPDI2
void EXPORT_FUNC (__ucmpdi2) (void);
# endif
# ifdef HAVE___BSWAPSI2
void EXPORT_FUNC (__bswapsi2) (void);
# endif
# ifdef HAVE___BSWAPDI2
void EXPORT_FUNC (__bswapdi2) (void);
# endif
#endif #endif
#ifdef HAVE___TRAMPOLINE_SETUP #ifdef HAVE___TRAMPOLINE_SETUP
void EXPORT_FUNC (__trampoline_setup) (void); void EXPORT_FUNC (__trampoline_setup) (void);
#endif #endif
#ifdef HAVE___UCMPDI2
void EXPORT_FUNC (__ucmpdi2) (void);
#endif
#ifdef HAVE__RESTGPR_14_X #ifdef HAVE__RESTGPR_14_X
void EXPORT_FUNC (_restgpr_14_x) (void); void EXPORT_FUNC (_restgpr_14_x) (void);

View file

@ -1,6 +1,6 @@
/* /*
* GRUB -- GRand Unified Bootloader * GRUB -- GRand Unified Bootloader
* Copyright (C) 2004,2007,2009 Free Software Foundation, Inc. * Copyright (C) 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
@ -16,14 +16,11 @@
* along with GRUB. If not, see <http://www.gnu.org/licenses/>. * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include <config.h> void EXPORT_FUNC (pci_slot_match_iterator_create) (void);
void EXPORT_FUNC (pci_system_cleanup) (void);
#ifdef HAVE___BSWAPSI2 void EXPORT_FUNC (pci_device_unmap_range) (void);
typedef int SItype __attribute__ ((mode (SI))); void EXPORT_FUNC (pci_iterator_destroy) (void);
SItype EXPORT_FUNC (__bswapsi2) (SItype); void EXPORT_FUNC (pci_device_map_range) (void);
#endif void EXPORT_FUNC (pci_device_cfg_read_u32) (void);
void EXPORT_FUNC (pci_device_next) (void);
#ifdef HAVE___BSWAPDI2 void EXPORT_FUNC (pci_system_init) (void);
typedef int DItype __attribute__ ((mode (DI)));
DItype EXPORT_FUNC (__bswapdi2) (DItype);
#endif

View file

@ -47,6 +47,8 @@ struct grub_menu_entry
/* The sourcecode of the menu entry, used by the editor. */ /* The sourcecode of the menu entry, used by the editor. */
const char *sourcecode; const char *sourcecode;
int hotkey;
/* The next element. */ /* The next element. */
struct grub_menu_entry *next; struct grub_menu_entry *next;
}; };

View file

@ -1,38 +0,0 @@
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2004,2007,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 <config.h>
#ifdef HAVE___ASHLDI3
void EXPORT_FUNC (__ashldi3) (void);
#endif
#ifdef HAVE___ASHRDI3
void EXPORT_FUNC (__ashrdi3) (void);
#endif
#ifdef HAVE___LSHRDI3
void EXPORT_FUNC (__lshrdi3) (void);
#endif
#ifdef HAVE___UCMPDI2
void EXPORT_FUNC (__ucmpdi2) (void);
#endif
#ifdef HAVE___BSWAPSI2
void EXPORT_FUNC (__bswapsi2) (void);
#endif
#ifdef HAVE___BSWAPDI2
void EXPORT_FUNC (__bswapdi2) (void);
#endif

View file

@ -265,6 +265,11 @@ grub_uint64_t EXPORT_FUNC(grub_divmod64) (grub_uint64_t n,
void EXPORT_FUNC(__enable_execute_stack) (void *addr); void EXPORT_FUNC(__enable_execute_stack) (void *addr);
#endif #endif
#if defined (NEED_REGISTER_FRAME_INFO) && !defined(GRUB_UTIL)
void EXPORT_FUNC (__register_frame_info) (void);
void EXPORT_FUNC (__deregister_frame_info) (void);
#endif
/* Inline functions. */ /* Inline functions. */
static inline unsigned int static inline unsigned int

View file

@ -49,7 +49,7 @@ void grub_multiboot_set_bootdev (void);
grub_uint32_t grub_get_multiboot_mmap_count (void); grub_uint32_t grub_get_multiboot_mmap_count (void);
grub_err_t grub_multiboot_set_video_mode (void); grub_err_t grub_multiboot_set_video_mode (void);
#if defined (GRUB_MACHINE_PCBIOS) || defined (GRUB_MACHINE_COREBOOT) || defined (GRUB_MACHINE_QEMU) #if defined (GRUB_MACHINE_PCBIOS) || defined (GRUB_MACHINE_COREBOOT) || defined (GRUB_MACHINE_MULTIBOOT) || defined (GRUB_MACHINE_QEMU)
#include <grub/i386/pc/vbe.h> #include <grub/i386/pc/vbe.h>
#define GRUB_MACHINE_HAS_VGA_TEXT 1 #define GRUB_MACHINE_HAS_VGA_TEXT 1
#else #else

View file

@ -45,7 +45,7 @@
#define GRUB_BOOT_MACHINE_BOOT_DEVPATH_END 0x80 #define GRUB_BOOT_MACHINE_BOOT_DEVPATH_END 0x80
#define GRUB_BOOT_MACHINE_KERNEL_SECTOR 0x88 #define GRUB_BOOT_MACHINE_KERNEL_BYTE 0x80
#define GRUB_BOOT_MACHINE_CODE_END \ #define GRUB_BOOT_MACHINE_CODE_END \
(0x1fc - GRUB_BOOT_AOUT_HEADER_SIZE) (0x1fc - GRUB_BOOT_AOUT_HEADER_SIZE)

View file

@ -26,7 +26,6 @@ enum grub_dev_abstraction_types {
}; };
char *grub_guess_root_device (const char *dir); char *grub_guess_root_device (const char *dir);
char *grub_get_prefix (const char *dir);
int grub_util_get_dev_abstraction (const char *os_dev); int grub_util_get_dev_abstraction (const char *os_dev);
char *grub_util_get_grub_dev (const char *os_dev); char *grub_util_get_grub_dev (const char *os_dev);
const char *grub_util_check_block_device (const char *blk_dev); const char *grub_util_check_block_device (const char *blk_dev);

View file

@ -20,8 +20,11 @@
#ifndef GRUB_BIOSDISK_MACHINE_UTIL_HEADER #ifndef GRUB_BIOSDISK_MACHINE_UTIL_HEADER
#define GRUB_BIOSDISK_MACHINE_UTIL_HEADER 1 #define GRUB_BIOSDISK_MACHINE_UTIL_HEADER 1
#include <grub/disk.h>
void grub_util_biosdisk_init (const char *dev_map); void grub_util_biosdisk_init (const char *dev_map);
void grub_util_biosdisk_fini (void); void grub_util_biosdisk_fini (void);
char *grub_util_biosdisk_get_grub_dev (const char *os_dev); char *grub_util_biosdisk_get_grub_dev (const char *os_dev);
const char *grub_util_biosdisk_get_osdev (grub_disk_t disk);
#endif /* ! GRUB_BIOSDISK_MACHINE_UTIL_HEADER */ #endif /* ! GRUB_BIOSDISK_MACHINE_UTIL_HEADER */

View file

@ -27,6 +27,7 @@
#include <config.h> #include <config.h>
#include <grub/types.h> #include <grub/types.h>
#include <grub/symbol.h>
#ifdef __NetBSD__ #ifdef __NetBSD__
/* NetBSD uses /boot for its boot block. */ /* NetBSD uses /boot for its boot block. */
@ -40,9 +41,9 @@
extern char *progname; extern char *progname;
extern int verbosity; extern int verbosity;
void grub_util_warn (const char *fmt, ...); void EXPORT_FUNC(grub_util_warn) (const char *fmt, ...);
void grub_util_info (const char *fmt, ...); void EXPORT_FUNC(grub_util_info) (const char *fmt, ...);
void grub_util_error (const char *fmt, ...) __attribute__ ((noreturn)); void EXPORT_FUNC(grub_util_error) (const char *fmt, ...) __attribute__ ((noreturn));
void *xmalloc (size_t size); void *xmalloc (size_t size);
void *xrealloc (void *ptr, size_t size); void *xrealloc (void *ptr, size_t size);

View file

@ -1,6 +1,6 @@
#ifndef GRUB_OFPATH_MACHINE_UTIL_HEADER #ifndef GRUB_OFPATH_MACHINE_UTIL_HEADER
#define GRUB_OFPATH_MACHINE_UTIL_HEADER 1 #define GRUB_OFPATH_MACHINE_UTIL_HEADER 1
char *grub_util_devname_to_ofpath (char *devname); char *grub_util_devname_to_ofpath (const char *devname);
#endif /* ! GRUB_OFPATH_MACHINE_UTIL_HEADER */ #endif /* ! GRUB_OFPATH_MACHINE_UTIL_HEADER */

View file

@ -26,6 +26,7 @@
#include <grub/file.h> #include <grub/file.h>
#include <grub/device.h> #include <grub/device.h>
#include <grub/command.h> #include <grub/command.h>
#include <grub/i18n.h>
/* set ENVVAR=VALUE */ /* set ENVVAR=VALUE */
static grub_err_t static grub_err_t
@ -178,11 +179,13 @@ void
grub_register_core_commands (void) grub_register_core_commands (void)
{ {
grub_register_command ("set", grub_core_cmd_set, grub_register_command ("set", grub_core_cmd_set,
"[ENVVAR=VALUE]", "Set an environment variable."); N_("[ENVVAR=VALUE]"),
N_("Set an environment variable."));
grub_register_command ("unset", grub_core_cmd_unset, grub_register_command ("unset", grub_core_cmd_unset,
"ENVVAR", "Remove an environment variable."); N_("ENVVAR"),
N_("Remove an environment variable."));
grub_register_command ("ls", grub_core_cmd_ls, grub_register_command ("ls", grub_core_cmd_ls,
"[ARG]", "List devices or files."); N_("[ARG]"), N_("List devices or files."));
grub_register_command ("insmod", grub_core_cmd_insmod, grub_register_command ("insmod", grub_core_cmd_insmod,
"MODULE", "Insert a module."); N_("MODULE"), N_("Insert a module."));
} }

View file

@ -107,7 +107,9 @@ grub_machine_init (void)
return 0; return 0;
} }
#if defined (GRUB_MACHINE_MULTIBOOT) || defined (GRUB_MACHINE_QEMU)
grub_machine_mmap_init (); grub_machine_mmap_init ();
#endif
grub_machine_mmap_iterate (heap_init); grub_machine_mmap_iterate (heap_init);
grub_tsc_init (); grub_tsc_init ();

View file

@ -57,13 +57,23 @@ signature_found:
(long) table_header->size); (long) table_header->size);
for (; table_item->size; for (; table_item->size;
table_item = (grub_linuxbios_table_item_t) ((long) table_item + (long) table_item->size)) table_item = (grub_linuxbios_table_item_t) ((long) table_item + (long) table_item->size))
{
if (table_item->tag == GRUB_LINUXBIOS_MEMBER_LINK
&& check_signature ((grub_linuxbios_table_header_t) (grub_addr_t)
*(grub_uint64_t *) (table_item + 1)))
{
table_header = (grub_linuxbios_table_header_t) (grub_addr_t)
*(grub_uint64_t *) (table_item + 1);
goto signature_found;
}
if (hook (table_item)) if (hook (table_item))
return 1; return 1;
}
return 0; return 0;
} }
void 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))
{ {
mem_region_t mem_region; mem_region_t mem_region;

View file

@ -66,10 +66,12 @@ multiboot_header:
.long -0x1BADB002 - MULTIBOOT_MEMORY_INFO .long -0x1BADB002 - MULTIBOOT_MEMORY_INFO
codestart: codestart:
#ifdef GRUB_MACHINE_MULTIBOOT
cmpl $MULTIBOOT_BOOTLOADER_MAGIC, %eax cmpl $MULTIBOOT_BOOTLOADER_MAGIC, %eax
jne 0f jne 0f
movl %ebx, EXT_C(startup_multiboot_info) movl %ebx, EXT_C(startup_multiboot_info)
0: 0:
#endif
/* initialize the stack */ /* initialize the stack */
movl $GRUB_MEMORY_MACHINE_PROT_STACK, %esp movl $GRUB_MEMORY_MACHINE_PROT_STACK, %esp

View file

@ -102,7 +102,7 @@ grub_load_config (void)
auto int hook (struct grub_module_header *); auto int hook (struct grub_module_header *);
int hook (struct grub_module_header *header) int hook (struct grub_module_header *header)
{ {
/* Not an ELF module, skip. */ /* Not an embedded config, skip. */
if (header->type != OBJ_TYPE_CONFIG) if (header->type != OBJ_TYPE_CONFIG)
return 0; return 0;

View file

@ -1066,3 +1066,12 @@ void __enable_execute_stack (void *addr __attribute__ ((unused)))
} }
#endif #endif
#if defined (NEED_REGISTER_FRAME_INFO) && !defined(GRUB_UTIL)
void __register_frame_info (void)
{
}
void __deregister_frame_info (void)
{
}
#endif

View file

@ -148,15 +148,14 @@ grub_mm_init_region (void *addr, grub_size_t size)
grub_printf ("Using memory for heap: start=%p, end=%p\n", addr, addr + (unsigned int) size); grub_printf ("Using memory for heap: start=%p, end=%p\n", addr, addr + (unsigned int) size);
#endif #endif
/* If this region is too small, ignore it. */
if (size < GRUB_MM_ALIGN * 2)
return;
/* Allocate a region from the head. */ /* Allocate a region from the head. */
r = (grub_mm_region_t) (((grub_addr_t) addr + GRUB_MM_ALIGN - 1) r = (grub_mm_region_t) ALIGN_UP ((grub_addr_t) addr, GRUB_MM_ALIGN);
& (~(GRUB_MM_ALIGN - 1)));
size -= (char *) r - (char *) addr + sizeof (*r); size -= (char *) r - (char *) addr + sizeof (*r);
/* If this region is too small, ignore it. */
if (size < GRUB_MM_ALIGN)
return;
h = (grub_mm_header_t) ((char *) r + GRUB_MM_ALIGN); h = (grub_mm_header_t) ((char *) r + GRUB_MM_ALIGN);
h->next = h; h->next = h;
h->magic = GRUB_MM_FREE_MAGIC; h->magic = GRUB_MM_FREE_MAGIC;
@ -221,9 +220,8 @@ grub_real_malloc (grub_mm_header_t *first, grub_size_t n, grub_size_t align)
+---------------+ v +---------------+ v
*/ */
q->next = p->next; q->next = p->next;
p->magic = GRUB_MM_ALLOC_MAGIC;
} }
else if (extra == 0 || p->size == n + extra) else if (align == 1 || p->size == n + extra)
{ {
/* There might be alignment requirement, when taking it into /* There might be alignment requirement, when taking it into
account memory block fits in. account memory block fits in.
@ -240,10 +238,25 @@ grub_real_malloc (grub_mm_header_t *first, grub_size_t n, grub_size_t align)
| alloc, size=n | | | alloc, size=n | |
+---------------+ v +---------------+ v
*/ */
p->size -= n; p->size -= n;
p += p->size; p += p->size;
p->size = n; }
p->magic = GRUB_MM_ALLOC_MAGIC; else if (extra == 0)
{
grub_mm_header_t r;
r = p + extra + n;
r->magic = GRUB_MM_FREE_MAGIC;
r->size = p->size - extra - n;
r->next = p->next;
q->next = r;
if (q == p)
{
q = r;
r->next = r;
}
} }
else else
{ {
@ -276,10 +289,11 @@ grub_real_malloc (grub_mm_header_t *first, grub_size_t n, grub_size_t align)
p->size = extra; p->size = extra;
p->next = r; p->next = r;
p += extra; p += extra;
p->size = n;
p->magic = GRUB_MM_ALLOC_MAGIC;
} }
p->magic = GRUB_MM_ALLOC_MAGIC;
p->size = n;
/* Mark find as a start marker for next allocation to fasten it. /* Mark find as a start marker for next allocation to fasten it.
This will have side effect of fragmenting memory as small This will have side effect of fragmenting memory as small
pieces before this will be un-used. */ pieces before this will be un-used. */

View file

@ -249,12 +249,11 @@ grub_parser_execute (char *source)
} }
p = grub_strchr (source, '\n'); p = grub_strchr (source, '\n');
if (p)
*p = 0;
*line = grub_strdup (source);
if (p) if (p)
*p = '\n'; *line = grub_strndup (source, p - source);
else
*line = grub_strdup (source);
source = p ? p + 1 : 0; source = p ? p + 1 : 0;
return 0; return 0;
} }

View file

@ -80,7 +80,7 @@ SUFFIX (grub_freebsd_load_elfmodule_obj) (grub_file_t file, int argc,
{ {
Elf_Ehdr e; Elf_Ehdr e;
Elf_Shdr *s; Elf_Shdr *s;
char *shdr; char *shdr = 0;
grub_addr_t curload, module; grub_addr_t curload, module;
grub_err_t err; grub_err_t err;
@ -148,7 +148,7 @@ SUFFIX (grub_freebsd_load_elfmodule) (grub_file_t file, int argc, char *argv[],
{ {
Elf_Ehdr e; Elf_Ehdr e;
Elf_Shdr *s; Elf_Shdr *s;
char *shdr; char *shdr = 0;
grub_addr_t curload, module; grub_addr_t curload, module;
grub_err_t err; grub_err_t err;
@ -223,7 +223,7 @@ SUFFIX (grub_freebsd_load_elf_meta) (grub_file_t file, grub_addr_t *kern_end)
grub_err_t err; grub_err_t err;
Elf_Ehdr e; Elf_Ehdr e;
Elf_Shdr *s; Elf_Shdr *s;
char *shdr; char *shdr = 0;
unsigned symoff, stroff, symsize, strsize; unsigned symoff, stroff, symsize, strsize;
grub_addr_t curload; grub_addr_t curload;
grub_freebsd_addr_t symstart, symend, symentsize, dynamic; grub_freebsd_addr_t symstart, symend, symentsize, dynamic;

View file

@ -50,7 +50,7 @@
#include <grub/efi/efi.h> #include <grub/efi/efi.h>
#endif #endif
#if defined (GRUB_MACHINE_PCBIOS) || defined (GRUB_MACHINE_COREBOOT) || defined (GRUB_MACHINE_QEMU) #if defined (GRUB_MACHINE_PCBIOS) || defined (GRUB_MACHINE_MULTIBOOT) || defined (GRUB_MACHINE_COREBOOT) || defined (GRUB_MACHINE_QEMU)
#define DEFAULT_VIDEO_MODE "text" #define DEFAULT_VIDEO_MODE "text"
#else #else
#define DEFAULT_VIDEO_MODE "auto" #define DEFAULT_VIDEO_MODE "auto"

View file

@ -32,7 +32,7 @@
#include <grub/env.h> #include <grub/env.h>
#include <grub/video.h> #include <grub/video.h>
#if defined (GRUB_MACHINE_PCBIOS) || defined (GRUB_MACHINE_COREBOOT) || defined (GRUB_MACHINE_QEMU) #if defined (GRUB_MACHINE_PCBIOS) || defined (GRUB_MACHINE_COREBOOT) || defined (GRUB_MACHINE_MULTIBOOT) || defined (GRUB_MACHINE_QEMU)
#include <grub/i386/pc/vbe.h> #include <grub/i386/pc/vbe.h>
#define HAS_VGA_TEXT 1 #define HAS_VGA_TEXT 1
#else #else

View file

@ -24,6 +24,7 @@
#include <grub/mm.h> #include <grub/mm.h>
#include <grub/command.h> #include <grub/command.h>
#include <grub/dl.h> #include <grub/dl.h>
#include <grub/i18n.h>
#ifndef GRUB_MMAP_REGISTER_BY_FIRMWARE #ifndef GRUB_MMAP_REGISTER_BY_FIRMWARE
@ -414,8 +415,8 @@ static grub_command_t cmd;
GRUB_MOD_INIT(mmap) GRUB_MOD_INIT(mmap)
{ {
cmd = grub_register_command ("badram", grub_cmd_badram, cmd = grub_register_command ("badram", grub_cmd_badram,
"ADDR1,MASK1[,ADDR2,MASK2[,...]]", N_("ADDR1,MASK1[,ADDR2,MASK2[,...]]"),
"Declare memory regions as badram."); N_("Declare memory regions as badram."));
} }
GRUB_MOD_FINI(mmap) GRUB_MOD_FINI(mmap)

View file

@ -23,6 +23,7 @@
#include <grub/mm.h> #include <grub/mm.h>
#include <grub/command.h> #include <grub/command.h>
#include <grub/normal.h> #include <grub/normal.h>
#include <grub/i18n.h>
struct menu_pointer struct menu_pointer
{ {
@ -172,7 +173,7 @@ grub_context_init (void)
grub_env_export ("prefix"); grub_env_export ("prefix");
export_cmd = grub_register_command ("export", grub_cmd_export, export_cmd = grub_register_command ("export", grub_cmd_export,
"export ENVVAR", "Export a variable."); N_("ENVVAR"), N_("Export a variable."));
} }
void void

View file

@ -155,6 +155,17 @@ free_menu_entry_classes (struct grub_menu_entry_class *head)
} }
} }
static struct
{
char *name;
int key;
} hotkey_aliases[] =
{
{"backspace", '\b'},
{"tab", '\t'},
{"delete", GRUB_TERM_DC}
};
/* Add a menu entry to the current menu context (as given by the environment /* Add a menu entry to the current menu context (as given by the environment
variable data slot `menu'). As the configuration file is read, the script variable data slot `menu'). As the configuration file is read, the script
parser calls this when a menu entry is to be created. */ parser calls this when a menu entry is to be created. */
@ -171,6 +182,7 @@ grub_normal_add_menu_entry (int argc, const char **args,
struct grub_menu_entry_class *classes_head; /* Dummy head node for list. */ struct grub_menu_entry_class *classes_head; /* Dummy head node for list. */
struct grub_menu_entry_class *classes_tail; struct grub_menu_entry_class *classes_tail;
char *users = NULL; char *users = NULL;
int hotkey = 0;
/* Allocate dummy head node for class list. */ /* Allocate dummy head node for class list. */
classes_head = grub_zalloc (sizeof (struct grub_menu_entry_class)); classes_head = grub_zalloc (sizeof (struct grub_menu_entry_class));
@ -237,6 +249,32 @@ grub_normal_add_menu_entry (int argc, const char **args,
continue; continue;
} }
else if (grub_strcmp(arg, "hotkey") == 0)
{
unsigned j;
i++;
if (args[i][1] == 0)
{
hotkey = args[i][0];
continue;
}
for (j = 0; j < ARRAY_SIZE (hotkey_aliases); j++)
if (grub_strcmp (args[i], hotkey_aliases[j].name) == 0)
{
hotkey = hotkey_aliases[j].key;
break;
}
if (j < ARRAY_SIZE (hotkey_aliases))
continue;
failed = 1;
grub_error (GRUB_ERR_MENU,
"Invalid hotkey: '%s'.", args[i]);
break;
}
else else
{ {
/* Handle invalid argument. */ /* Handle invalid argument. */
@ -293,6 +331,7 @@ grub_normal_add_menu_entry (int argc, const char **args,
} }
(*last)->title = menutitle; (*last)->title = menutitle;
(*last)->hotkey = hotkey;
(*last)->classes = classes_head; (*last)->classes = classes_head;
if (users) if (users)
(*last)->restricted = 1; (*last)->restricted = 1;
@ -666,9 +705,9 @@ GRUB_MOD_INIT(normal)
/* Register a command "normal" for the rescue mode. */ /* Register a command "normal" for the rescue mode. */
grub_register_command ("normal", grub_cmd_normal, grub_register_command ("normal", grub_cmd_normal,
0, "Enter normal mode."); 0, N_("Enter normal mode."));
grub_register_command ("normal_exit", grub_cmd_normal_exit, grub_register_command ("normal_exit", grub_cmd_normal_exit,
0, "Exit from normal mode."); 0, N_("Exit from normal mode."));
/* Reload terminal colors when these variables are written to. */ /* Reload terminal colors when these variables are written to. */
grub_register_variable_hook ("color_normal", NULL, grub_env_write_color_normal); grub_register_variable_hook ("color_normal", NULL, grub_env_write_color_normal);

View file

@ -478,6 +478,18 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot)
goto refresh; goto refresh;
default: default:
{
grub_menu_entry_t entry;
int i;
for (i = 0, entry = menu->entry_list; i < menu->size;
i++, entry = entry->next)
if (entry->hotkey == c)
{
menu_fini ();
*auto_boot = 0;
return i;
}
}
break; break;
} }
} }

View file

@ -62,7 +62,7 @@ loader/i386/linux.c
loader/i386/pc/chainloader.c loader/i386/pc/chainloader.c
loader/i386/pc/linux.c loader/i386/pc/linux.c
loader/i386/xnu.c loader/i386/xnu.c
loader/multiboot_loader.c loader/multiboot.c
loader/powerpc/ieee1275/linux.c loader/powerpc/ieee1275/linux.c
loader/sparc64/ieee1275/linux.c loader/sparc64/ieee1275/linux.c
loader/xnu.c loader/xnu.c

View file

@ -2,3 +2,4 @@
# Shell language are included here. # Shell language are included here.
util/grub.d/10_kfreebsd.in util/grub.d/10_kfreebsd.in
util/grub.d/10_linux.in util/grub.d/10_linux.in
util/grub.d/10_netbsd.in

View file

@ -112,9 +112,9 @@ typedef size_t yy_size_t;
%option extra-type="struct grub_parser_param*" %option extra-type="struct grub_parser_param*"
BLANK [ \t] BLANK [ \t]
COMMENT ^[ \t]*#.*$ COMMENT #.*$
CHAR [^|&$;<> \t\n\'\"\\] CHAR [^{}|&$;<> \t\n\'\"\\]
DIGITS [[:digit:]]+ DIGITS [[:digit:]]+
NAME [[:alpha:]_][[:alnum:][:digit:]_]* NAME [[:alpha:]_][[:alnum:][:digit:]_]*
@ -211,7 +211,7 @@ WORD ({CHAR}|{DQSTR}|{SQSTR}|{ESC}|{VARIABLE})+
ARG (GRUB_SCRIPT_ARG_TYPE_TEXT); ARG (GRUB_SCRIPT_ARG_TYPE_TEXT);
} }
\\ | \\ |
[^\"\'$\\]+ { COPY (yytext, yyleng); } [^\"\'\$\\]+ { COPY (yytext, yyleng); }
<<EOF>> { <<EOF>> {
yy_pop_state (yyscanner); yy_pop_state (yyscanner);
yypop_buffer_state (yyscanner); yypop_buffer_state (yyscanner);
@ -254,6 +254,11 @@ WORD ({CHAR}|{DQSTR}|{SQSTR}|{ESC}|{VARIABLE})+
} }
<DQUOTE>{ <DQUOTE>{
\\\$ { COPY ("$", 1); }
\\\\ { COPY ("\\", 1); }
\\\" { COPY ("\"", 1); }
\\\n { /* ignore */ }
[^\"\$\\\n]+ { COPY (yytext, yyleng); }
\" { \" {
yy_pop_state (yyscanner); yy_pop_state (yyscanner);
ARG (GRUB_SCRIPT_ARG_TYPE_DQSTR); ARG (GRUB_SCRIPT_ARG_TYPE_DQSTR);
@ -262,10 +267,6 @@ WORD ({CHAR}|{DQSTR}|{SQSTR}|{ESC}|{VARIABLE})+
yy_push_state (VAR, yyscanner); yy_push_state (VAR, yyscanner);
ARG (GRUB_SCRIPT_ARG_TYPE_DQSTR); ARG (GRUB_SCRIPT_ARG_TYPE_DQSTR);
} }
\\\\ { COPY ("\\", 1); }
\\\" { COPY ("\"", 1); }
\\\n { /* ignore */ }
[^\"$\\\n]+ { COPY (yytext, yyleng); }
(.|\n) { COPY (yytext, yyleng); } (.|\n) { COPY (yytext, yyleng); }
} }

View file

@ -29,6 +29,7 @@
#include <grub/command.h> #include <grub/command.h>
#include <grub/extcmd.h> #include <grub/extcmd.h>
#include <grub/bitmap_scale.h> #include <grub/bitmap_scale.h>
#include <grub/i18n.h>
#define DEFAULT_VIDEO_MODE "auto" #define DEFAULT_VIDEO_MODE "auto"
#define DEFAULT_BORDER_WIDTH 10 #define DEFAULT_BORDER_WIDTH 10
@ -1187,8 +1188,8 @@ GRUB_MOD_INIT(gfxterm)
grub_register_extcmd ("background_image", grub_register_extcmd ("background_image",
grub_gfxterm_background_image_cmd, grub_gfxterm_background_image_cmd,
GRUB_COMMAND_FLAG_BOTH, GRUB_COMMAND_FLAG_BOTH,
"[-m (stretch|normal)] FILE", N_("[-m (stretch|normal)] FILE"),
"Load background image for active terminal.", N_("Load background image for active terminal."),
background_image_cmd_options); background_image_cmd_options);
} }

View file

@ -616,8 +616,8 @@ GRUB_MOD_INIT(serial)
{ {
cmd = grub_register_extcmd ("serial", grub_cmd_serial, cmd = grub_register_extcmd ("serial", grub_cmd_serial,
GRUB_COMMAND_FLAG_BOTH, GRUB_COMMAND_FLAG_BOTH,
"serial [OPTIONS...]", N_("[OPTIONS...]"),
"Configure serial port.", options); N_("Configure serial port."), options);
/* Set default settings. */ /* Set default settings. */
serial_settings.port = serial_hw_get_port (0); serial_settings.port = serial_hw_get_port (0);

View file

@ -31,6 +31,7 @@
#include <grub/terminfo.h> #include <grub/terminfo.h>
#include <grub/tparm.h> #include <grub/tparm.h>
#include <grub/command.h> #include <grub/command.h>
#include <grub/i18n.h>
struct terminfo struct terminfo
{ {
@ -178,7 +179,7 @@ static grub_command_t cmd;
GRUB_MOD_INIT(terminfo) GRUB_MOD_INIT(terminfo)
{ {
cmd = grub_register_command ("terminfo", grub_cmd_terminfo, cmd = grub_register_command ("terminfo", grub_cmd_terminfo,
"[TERM]", "Set terminfo type."); N_("[TERM]"), N_("Set terminfo type."));
grub_terminfo_set_current ("vt100"); grub_terminfo_set_current ("vt100");
} }

View file

@ -0,0 +1,28 @@
#! @builddir@/grub-shell-tester
#
# Copyright (C) 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/>.
echo a###b
echo a# #b
echo #
echo \#
echo '#'
echo "#"
echo '\#'
echo "\#"

View file

@ -0,0 +1,5 @@
#! /bin/sh -e
@builddir@/grub-script-check << EOF
echo "\\\$"
EOF

View file

@ -79,103 +79,6 @@ xgetcwd (void)
return path; return path;
} }
#ifdef __CYGWIN__
/* Convert POSIX path to Win32 path,
remove drive letter, replace backslashes. */
static char *
get_win32_path (const char *path)
{
char winpath[PATH_MAX];
cygwin_conv_to_full_win32_path (path, winpath);
int len = strlen (winpath);
if (len > 2 && winpath[1] == ':')
{
len -= 2;
memmove (winpath, winpath + 2, len + 1);
}
int i;
for (i = 0; i < len; i++)
if (winpath[i] == '\\')
winpath[i] = '/';
return xstrdup (winpath);
}
#endif
char *
grub_get_prefix (const char *dir)
{
char *saved_cwd;
char *abs_dir, *prev_dir;
char *prefix;
struct stat st, prev_st;
/* Save the current directory. */
saved_cwd = xgetcwd ();
if (chdir (dir) < 0)
grub_util_error ("cannot change directory to `%s'", dir);
abs_dir = xgetcwd ();
strip_extra_slashes (abs_dir);
prev_dir = xstrdup (abs_dir);
if (stat (".", &prev_st) < 0)
grub_util_error ("cannot stat `%s'", dir);
if (! S_ISDIR (prev_st.st_mode))
grub_util_error ("`%s' is not a directory", dir);
while (1)
{
if (chdir ("..") < 0)
grub_util_error ("cannot change directory to the parent");
if (stat (".", &st) < 0)
grub_util_error ("cannot stat current directory");
if (! S_ISDIR (st.st_mode))
grub_util_error ("current directory is not a directory???");
if (prev_st.st_dev != st.st_dev || prev_st.st_ino == st.st_ino)
break;
free (prev_dir);
prev_dir = xgetcwd ();
prev_st = st;
}
strip_extra_slashes (prev_dir);
prefix = xmalloc (strlen (abs_dir) - strlen (prev_dir) + 2);
prefix[0] = '/';
strcpy (prefix + 1, abs_dir + strlen (prev_dir));
strip_extra_slashes (prefix);
if (chdir (saved_cwd) < 0)
grub_util_error ("cannot change directory to `%s'", dir);
#ifdef __CYGWIN__
if (st.st_dev != (DEV_CYGDRIVE_MAJOR << 16))
{
/* Reached some mount point not below /cygdrive.
GRUB does not know Cygwin's emulated mounts,
convert to Win32 path. */
grub_util_info ("Cygwin prefix = %s", prefix);
char * wprefix = get_win32_path (prefix);
free (prefix);
prefix = wprefix;
}
#endif
free (saved_cwd);
free (abs_dir);
free (prev_dir);
grub_util_info ("prefix = %s", prefix);
return prefix;
}
#ifdef __MINGW32__ #ifdef __MINGW32__
static char * static char *

View file

@ -242,7 +242,7 @@ main (int argc, char *argv[])
if (strcmp (root_dev, "host") == 0) if (strcmp (root_dev, "host") == 0)
dir = xstrdup (dir); dir = xstrdup (dir);
else else
dir = grub_get_prefix (dir); dir = make_system_path_relative_to_its_root (dir);
prefix = xmalloc (strlen (root_dev) + 2 + strlen (dir) + 1); prefix = xmalloc (strlen (root_dev) + 2 + strlen (dir) + 1);
sprintf (prefix, "(%s)%s", root_dev, dir); sprintf (prefix, "(%s)%s", root_dev, dir);
free (dir); free (dir);

View file

@ -24,10 +24,10 @@ sbindir=@sbindir@
libdir=@libdir@ libdir=@libdir@
sysconfdir=@sysconfdir@ sysconfdir=@sysconfdir@
package_version=@PACKAGE_VERSION@ package_version=@PACKAGE_VERSION@
host_os=@host_os@
datarootdir=@datarootdir@ datarootdir=@datarootdir@
datadir=@datadir@ datadir=@datadir@
pkgdatadir=${datadir}/`echo @PACKAGE_TARNAME@ | sed "${transform}"` pkgdatadir=${datadir}/`echo @PACKAGE_TARNAME@ | sed "${transform}"`
grub_prefix=`echo /boot/grub | sed ${transform}`
grub_cfg="" grub_cfg=""
grub_mkconfig_dir=${sysconfdir}/grub.d grub_mkconfig_dir=${sysconfdir}/grub.d
@ -75,6 +75,18 @@ done
. ${libdir}/grub/grub-mkconfig_lib . ${libdir}/grub/grub-mkconfig_lib
case "$host_os" in
netbsd* | openbsd*)
# Because /boot is used for the boot block in NetBSD and OpenBSD, use /grub
# instead of /boot/grub.
grub_prefix=`echo /grub | sed ${transform}`
;;
*)
# Use /boot/grub by default.
grub_prefix=`echo /boot/grub | sed ${transform}`
;;
esac
if [ "x$EUID" = "x" ] ; then if [ "x$EUID" = "x" ] ; then
EUID=`id -u` EUID=`id -u`
fi fi
@ -141,13 +153,13 @@ if [ "x${GRUB_TERMINAL}" != "x" ] ; then
fi fi
termoutdefault=0 termoutdefault=0
if [ "x${GRUB_TERMINAL_OUTPUT}" == x ]; then if [ "x${GRUB_TERMINAL_OUTPUT}" = "x" ]; then
GRUB_TERMINAL_OUTPUT=gfxterm; GRUB_TERMINAL_OUTPUT=gfxterm;
termoutdefault=1; termoutdefault=1;
fi fi
for x in ${GRUB_TERMINAL_OUTPUT}; do for x in ${GRUB_TERMINAL_OUTPUT}; do
if [ x${x} == xgfxterm ]; then if [ "x${x}" = "xgfxterm" ]; then
# If this platform supports gfxterm, try to use it. # If this platform supports gfxterm, try to use it.
if ! test -e ${grub_prefix}/gfxterm.mod ; then if ! test -e ${grub_prefix}/gfxterm.mod ; then
if [ "x$termoutdefault" != "x1" ]; then if [ "x$termoutdefault" != "x1" ]; then
@ -227,11 +239,14 @@ export GRUB_DEFAULT \
GRUB_DISTRIBUTOR \ GRUB_DISTRIBUTOR \
GRUB_CMDLINE_LINUX \ GRUB_CMDLINE_LINUX \
GRUB_CMDLINE_LINUX_DEFAULT \ GRUB_CMDLINE_LINUX_DEFAULT \
GRUB_CMDLINE_NETBSD \
GRUB_CMDLINE_NETBSD_DEFAULT \
GRUB_TERMINAL_INPUT \ GRUB_TERMINAL_INPUT \
GRUB_TERMINAL_OUTPUT \ GRUB_TERMINAL_OUTPUT \
GRUB_SERIAL_COMMAND \ GRUB_SERIAL_COMMAND \
GRUB_DISABLE_LINUX_UUID \ GRUB_DISABLE_LINUX_UUID \
GRUB_DISABLE_LINUX_RECOVERY \ GRUB_DISABLE_LINUX_RECOVERY \
GRUB_DISABLE_NETBSD_RECOVERY \
GRUB_GFXMODE \ GRUB_GFXMODE \
GRUB_BACKGROUND \ GRUB_BACKGROUND \
GRUB_THEME \ GRUB_THEME \

View file

@ -1,5 +1,5 @@
# Helper library for grub-mkconfig # Helper library for grub-mkconfig
# Copyright (C) 2007,2008,2009 Free Software Foundation, Inc. # Copyright (C) 2007,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
@ -31,6 +31,12 @@ if test "x$grub_mkrelpath" = x; then
grub_mkrelpath=${bindir}/`echo grub-mkrelpath | sed ${transform}` grub_mkrelpath=${bindir}/`echo grub-mkrelpath | sed ${transform}`
fi fi
if $(which gettext >/dev/null 2>/dev/null) ; then
gettext="gettext"
else
gettext="echo"
fi
grub_warn () grub_warn ()
{ {
echo "Warning: $@" >&2 echo "Warning: $@" >&2
@ -38,21 +44,7 @@ grub_warn ()
make_system_path_relative_to_its_root () make_system_path_relative_to_its_root ()
{ {
path="`${grub_mkrelpath} $1`" ${grub_mkrelpath} $1
case "`uname 2>/dev/null`" in
CYGWIN*)
# Cygwin: Check if regular or emulated mount.
if [ -z "$dir" ] || [ "`stat -c %D "$dir/.."`" != 620000 ] ; then
# Reached some mount point not below /cygdrive.
# GRUB does not know Cygwin's emulated mounts,
# convert to Win32 path and remove drive letter.
path=`cygpath -m "$path" | sed -n 's,^[A-Za-z]:,,p'`
test ! -z "$path" || return 1
fi ;;
esac
echo "$path"
} }
is_path_readable_by_grub () is_path_readable_by_grub ()
@ -188,3 +180,7 @@ version_find_latest ()
done done
echo "$a" echo "$a"
} }
gettext_quoted () {
$gettext "$@" | sed "s/'/'\\\\''/g"
}

View file

@ -30,7 +30,7 @@ target_cpu=@target_cpu@
native_platform=@platform@ native_platform=@platform@
pkglib_DATA="@pkglib_DATA@" pkglib_DATA="@pkglib_DATA@"
coreboot_dir=${libdir}/$(echo ${PACKAGE_TARNAME} | sed ${transform})/${target_cpu}-coreboot multiboot_dir=${libdir}/$(echo ${PACKAGE_TARNAME} | sed ${transform})/${target_cpu}-multiboot
pc_dir=${libdir}/$(echo ${PACKAGE_TARNAME} | sed ${transform})/${target_cpu}-pc pc_dir=${libdir}/$(echo ${PACKAGE_TARNAME} | sed ${transform})/${target_cpu}-pc
# Usage: usage # Usage: usage
@ -122,45 +122,45 @@ process_input_dir ()
} }
if [ "${override_dir}" = "" ] ; then if [ "${override_dir}" = "" ] ; then
if test -e "${coreboot_dir}" ; then if test -e "${multiboot_dir}" ; then
process_input_dir ${coreboot_dir} coreboot process_input_dir ${multiboot_dir} multiboot
fi fi
if test -e "${pc_dir}" ; then if test -e "${pc_dir}" ; then
process_input_dir ${pc_dir} pc process_input_dir ${pc_dir} pc
fi fi
else else
process_input_dir ${override_dir} ${native_platform} process_input_dir ${override_dir} ${native_platform}
coreboot_dir= multiboot_dir=
pc_dir= pc_dir=
case "${native_platform}" in case "${native_platform}" in
coreboot) coreboot_dir=${override_dir} ;; multiboot) multiboot_dir=${override_dir} ;;
pc) pc_dir=${override_dir} ;; pc) pc_dir=${override_dir} ;;
esac esac
fi fi
# build coreboot core.img # build multiboot core.img
if test -e "${coreboot_dir}" ; then if test -e "${multiboot_dir}" ; then
echo "Enabling coreboot support ..." 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 # obtain date-based UUID
iso_uuid=$(date -u +%Y-%m-%d-%H-%M-%S-00) iso_uuid=$(date -u +%Y-%m-%d-%H-%M-%S-00)
modules="$(cat ${coreboot_dir}/partmap.lst) ${modules}" modules="$(cat ${multiboot_dir}/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}-coreboot set prefix=(\${root})/boot/grub/${target_cpu}-multiboot
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-coreboot/grub.cfg > ${iso9660_dir}/boot/grub/i386-multiboot/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}
grub-mkelfimage -d ${coreboot_dir}/ -m ${memdisk_img} -o ${iso9660_dir}/boot/multiboot.img \ grub-mkelfimage -d ${multiboot_dir}/ -m ${memdisk_img} -o ${iso9660_dir}/boot/multiboot.img \
memdisk tar search iso9660 configfile sh \ memdisk tar search iso9660 configfile sh \
ata at_keyboard ata at_keyboard
rm -f ${memdisk_img} rm -f ${memdisk_img}

View file

@ -76,13 +76,13 @@ menuentry "${OS}" ${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 "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 "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}' \\
--host-priv-port='\${host-port}' \\ --host-priv-port='\${host-port}' \\
@ -98,13 +98,13 @@ menuentry "${OS} (recovery mode)" {
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 "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 "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}' \\
--host-priv-port='\${host-port}' \\ --host-priv-port='\${host-port}' \\

View file

@ -23,7 +23,7 @@ libdir=@libdir@
. ${libdir}/grub/grub-mkconfig_lib . ${libdir}/grub/grub-mkconfig_lib
export TEXTDOMAIN=@PACKAGE@ export TEXTDOMAIN=@PACKAGE@
export TEXTDOMAINDIR=@LOCALEDIR@ export TEXTDOMAINDIR=@localedir@
CLASS="--class os" CLASS="--class os"
@ -44,15 +44,15 @@ kfreebsd_entry ()
version="$2" version="$2"
recovery="$3" # not used yet recovery="$3" # not used yet
args="$4" # not used yet args="$4" # not used yet
title="$(gettext "%s, with kFreeBSD %s")" title="$(gettext_quoted "%s, with kFreeBSD %s")"
printf "menuentry \"${title}\" ${CLASS} {\n" "${os}" "${version}" printf "menuentry '${title}' ${CLASS} {\n" "${os}" "${version}"
save_default_entry | sed -e "s/^/\t/" save_default_entry | sed -e "s/^/\t/"
if [ -z "${prepare_boot_cache}" ]; then if [ -z "${prepare_boot_cache}" ]; then
prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | sed -e "s/^/\t/")" prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | sed -e "s/^/\t/")"
fi fi
printf '%s\n' "${prepare_boot_cache}" printf '%s\n' "${prepare_boot_cache}"
cat << EOF cat << EOF
echo $(printf "$(gettext "Loading kernel of FreeBSD %s ...")" ${version}) echo '$(printf "$(gettext_quoted "Loading kernel of FreeBSD %s ...")" ${version})'
kfreebsd ${rel_dirname}/${basename} kfreebsd ${rel_dirname}/${basename}
EOF EOF

View file

@ -23,7 +23,7 @@ libdir=@libdir@
. ${libdir}/grub/grub-mkconfig_lib . ${libdir}/grub/grub-mkconfig_lib
export TEXTDOMAIN=@PACKAGE@ export TEXTDOMAIN=@PACKAGE@
export TEXTDOMAINDIR=@LOCALEDIR@ export TEXTDOMAINDIR=@localedir@
CLASS="--class gnu-linux --class gnu --class os" CLASS="--class gnu-linux --class gnu --class os"
@ -56,11 +56,11 @@ linux_entry ()
recovery="$3" recovery="$3"
args="$4" args="$4"
if ${recovery} ; then if ${recovery} ; then
title="$(gettext "%s, with Linux %s (recovery mode)")" title="$(gettext_quoted "%s, with Linux %s (recovery mode)")"
else else
title="$(gettext "%s, with Linux %s")" title="$(gettext_quoted "%s, with Linux %s")"
fi fi
printf "menuentry \"${title}\" ${CLASS} {\n" "${os}" "${version}" printf "menuentry '${title}' ${CLASS} {\n" "${os}" "${version}"
save_default_entry | sed -e "s/^/\t/" save_default_entry | sed -e "s/^/\t/"
# Use ELILO's generic "efifb" when it's known to be available. # Use ELILO's generic "efifb" when it's known to be available.
@ -83,12 +83,12 @@ EOF
fi fi
printf '%s\n' "${prepare_boot_cache}" printf '%s\n' "${prepare_boot_cache}"
cat << EOF cat << EOF
echo $(printf "$(gettext "Loading Linux %s ...")" ${version}) echo '$(printf "$(gettext_quoted "Loading Linux %s ...")" ${version})'
linux ${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro ${args} linux ${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro ${args}
EOF EOF
if test -n "${initrd}" ; then if test -n "${initrd}" ; then
cat << EOF cat << EOF
echo $(gettext "Loading initial ramdisk ...") echo '$(gettext_quoted "Loading initial ramdisk ...")'
initrd ${rel_dirname}/${initrd} initrd ${rel_dirname}/${initrd}
EOF EOF
fi fi

86
util/grub.d/10_netbsd.in Normal file
View file

@ -0,0 +1,86 @@
#! /bin/sh -e
# grub-mkconfig helper script.
# Copyright (C) 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/>.
prefix=@prefix@
exec_prefix=@exec_prefix@
bindir=@bindir@
libdir=@libdir@
. ${libdir}/grub/grub-mkconfig_lib
export TEXTDOMAIN=@PACKAGE@
export TEXTDOMAINDIR=@localedir@
if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then
OS=NetBSD
else
OS="${GRUB_DISTRIBUTOR} NetBSD"
fi
netbsd_entry ()
{
loader="$1" # "knetbsd" or "multiboot"
kernel="$2" # absolute path to the kernel file
recovery="$3" # is this is a recovery entry?
args="$4" # extra arguments appended to loader command
kroot_device="$(echo ${GRUB_DEVICE} | sed -e 's,^/dev/r,,')"
if ${recovery} ; then
title="$(gettext_quoted "%s, with kernel %s (via %s, recovery mode)")"
else
title="$(gettext_quoted "%s, with kernel %s (via %s)")"
fi
printf "menuentry \"${title}\" {\n" \
"${OS}" "$(echo ${kernel} | sed -e 's,^.*/,,')" "${loader}"
printf "%s\n" "${prepare_boot_cache}"
case "${loader}" in
knetbsd)
printf "\tknetbsd %s -r %s %s\n" \
"${kernel}" "${kroot_device}" "${GRUB_CMDLINE_NETBSD} ${args}"
;;
multiboot)
printf "\tmultiboot %s %s root=%s %s\n" \
"${kernel}" "${kernel}" "${kroot_device}" "${GRUB_CMDLINE_NETBSD} ${args}"
;;
esac
printf "}\n"
}
prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE} | sed -e 's,^, ,')"
# We look for NetBSD kernels in / but not in subdirectories. We simply
# pick all statically linked ELF executable files (or links) in / with a
# name that starts with `netbsd'.
pattern="^ELF[^,]*executable.*statically linked"
for k in $(ls -t /netbsd*) ; do
if ! grub_file_is_not_garbage "$k" ; then
continue
fi
if ! ((file -bL "$k" | grep -q "${pattern}") ||
(zcat "$k" | file -bL - | grep -q "${pattern}")) 2>/dev/null ; then
continue
fi
echo "Found NetBSD kernel: $k" >&2
netbsd_entry "knetbsd" "$k" false "${GRUB_CMDLINE_NETBSD_DEFAULT}"
netbsd_entry "multiboot" "$k" false "${GRUB_CMDLINE_NETBSD_DEFAULT}"
if [ "x${GRUB_DISABLE_NETBSD_RECOVERY}" != "xtrue" ]; then
netbsd_entry "knetbsd" "$k" true "-s"
netbsd_entry "multiboot" "$k" true "-s"
fi
done

View file

@ -861,7 +861,7 @@ make_device_name (int drive, int dos_part, int bsd_part)
dos_part_str = xasprintf (",%d", dos_part + 1); dos_part_str = xasprintf (",%d", dos_part + 1);
if (bsd_part >= 0) if (bsd_part >= 0)
bsd_part_str = xasprintf (",%c", bsd_part + 'a'); bsd_part_str = xasprintf (",%d", bsd_part + 1);
ret = xasprintf ("%s%s%s", map[drive].drive, ret = xasprintf ("%s%s%s", map[drive].drive,
dos_part_str ? : "", dos_part_str ? : "",
@ -1166,11 +1166,9 @@ grub_util_biosdisk_get_grub_dev (const char *os_dev)
grub_disk_t disk; grub_disk_t disk;
int fd; int fd;
# if !defined(__NetBSD__) # if !defined(__NetBSD__)
const char *disk_info_msg = "geometry";
struct hd_geometry hdg; struct hd_geometry hdg;
typeof (hdg.start) p_offset; typeof (hdg.start) p_offset;
# else /* defined(__NetBSD__) */ # else /* defined(__NetBSD__) */
const char *disk_info_msg = "label";
struct disklabel label; struct disklabel label;
int index; int index;
u_int32_t p_offset; u_int32_t p_offset;
@ -1223,7 +1221,7 @@ grub_util_biosdisk_get_grub_dev (const char *os_dev)
fd = open (os_dev, O_RDONLY); fd = open (os_dev, O_RDONLY);
if (fd == -1) if (fd == -1)
{ {
grub_error (GRUB_ERR_BAD_DEVICE, "cannot open `%s' while attempting to get disk %s", os_dev, disk_info_msg); 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;
} }
@ -1236,7 +1234,7 @@ grub_util_biosdisk_get_grub_dev (const char *os_dev)
# endif /* !defined(__NetBSD__) */ # endif /* !defined(__NetBSD__) */
{ {
grub_error (GRUB_ERR_BAD_DEVICE, grub_error (GRUB_ERR_BAD_DEVICE,
"cannot get disk %s of `%s'", disk_info_msg, os_dev); "cannot get disk geometry of `%s'", os_dev);
close (fd); close (fd);
free (name); free (name);
return 0; return 0;
@ -1354,3 +1352,9 @@ grub_util_biosdisk_get_grub_dev (const char *os_dev)
return make_device_name (drive, -1, -1); return make_device_name (drive, -1, -1);
#endif #endif
} }
const char *
grub_util_biosdisk_get_osdev (grub_disk_t disk)
{
return map[disk->id].device;
}

View file

@ -368,7 +368,7 @@ strip_trailing_digits (const char *p)
} }
char * char *
grub_util_devname_to_ofpath (char *devname) grub_util_devname_to_ofpath (const char *devname)
{ {
char *name_buf, *device, *devnode, *devicenode, *ofpath; char *name_buf, *device, *devnode, *devicenode, *ofpath;

View file

@ -53,6 +53,11 @@
# include <malloc.h> # include <malloc.h>
#endif #endif
#ifdef __CYGWIN__
# include <sys/cygwin.h>
# define DEV_CYGDRIVE_MAJOR 98
#endif
#ifdef __MINGW32__ #ifdef __MINGW32__
#include <windows.h> #include <windows.h>
#include <winioctl.h> #include <winioctl.h>
@ -456,6 +461,27 @@ canonicalize_file_name (const char *path)
return ret; return ret;
} }
#ifdef __CYGWIN__
/* Convert POSIX path to Win32 path,
remove drive letter, replace backslashes. */
static char *
get_win32_path (const char *path)
{
char winpath[PATH_MAX];
if (cygwin_conv_path (CCP_POSIX_TO_WIN_A, path, winpath, sizeof(winpath)))
grub_util_error ("cygwin_conv_path() failed");
int len = strlen (winpath);
int offs = (len > 2 && winpath[1] == ':' ? 2 : 0);
int i;
for (i = offs; i < len; i++)
if (winpath[i] == '\\')
winpath[i] = '/';
return xstrdup (winpath + offs);
}
#endif
/* This function never prints trailing slashes (so that its output /* This function never prints trailing slashes (so that its output
can be appended a slash unconditionally). */ can be appended a slash unconditionally). */
char * char *
@ -521,30 +547,31 @@ make_system_path_relative_to_its_root (const char *path)
/* offset == 1 means root directory. */ /* offset == 1 means root directory. */
if (offset == 1) if (offset == 1)
{ {
free (buf); /* Include leading slash. */
len = strlen (buf2); offset = 0;
while (buf2[len - 1] == '/' && len > 1) break;
{
buf2[len - 1] = '\0';
len--;
}
if (len > 1)
return buf2;
else
{
/* This means path given is just a backslash. As above
we have to return an empty string. */
free (buf2);
return xstrdup ("");
}
} }
} }
free (buf); free (buf);
buf3 = xstrdup (buf2 + offset); buf3 = xstrdup (buf2 + offset);
free (buf2); free (buf2);
#ifdef __CYGWIN__
if (st.st_dev != (DEV_CYGDRIVE_MAJOR << 16))
{
/* Reached some mount point not below /cygdrive.
GRUB does not know Cygwin's emulated mounts,
convert to Win32 path. */
grub_util_info ("Cygwin path = %s\n", buf3);
char * temp = get_win32_path (buf3);
free (buf3);
buf3 = temp;
}
#endif
/* Remove trailing slashes, return empty string if root directory. */
len = strlen (buf3); len = strlen (buf3);
while (buf3[len - 1] == '/' && len > 1) while (len > 0 && buf3[len - 1] == '/')
{ {
buf3[len - 1] = '\0'; buf3[len - 1] = '\0';
len--; len--;

View file

@ -35,6 +35,7 @@
#include <grub/term.h> #include <grub/term.h>
#include <grub/util/raid.h> #include <grub/util/raid.h>
#include <grub/util/lvm.h> #include <grub/util/lvm.h>
#include <grub/util/ofpath.h>
#include <grub_setup_init.h> #include <grub_setup_init.h>
@ -103,28 +104,6 @@ grub_refresh (void)
fflush (stdout); fflush (stdout);
} }
static char *compute_dest_ofpath (const char *dest)
{
int len = strlen (dest);
char *res, *p, c;
res = xmalloc (len);
p = res;
while ((c = *dest++) != '\0')
{
if (c == '\\' && *dest == ',')
{
*p++ = ',';
dest++;
}
else
*p++ = c;
}
*p++ = '\0';
return res;
}
static void static void
setup (const char *prefix, const char *dir, setup (const char *prefix, const char *dir,
const char *boot_file, const char *core_file, const char *boot_file, const char *core_file,
@ -135,8 +114,8 @@ setup (const char *prefix, const char *dir,
size_t boot_size, core_size; size_t boot_size, core_size;
grub_uint16_t core_sectors; grub_uint16_t core_sectors;
grub_device_t root_dev, dest_dev; grub_device_t root_dev, dest_dev;
char *boot_devpath, *dest_ofpath; char *boot_devpath;
grub_disk_addr_t *kernel_sector; grub_disk_addr_t *kernel_byte;
struct boot_blocklist *first_block, *block; struct boot_blocklist *first_block, *block;
char *tmp_img; char *tmp_img;
int i; int i;
@ -195,8 +174,6 @@ setup (const char *prefix, const char *dir,
last_length = length; last_length = length;
} }
dest_ofpath = compute_dest_ofpath (dest);
/* Read the boot image by the OS service. */ /* Read the boot image by the OS service. */
boot_path = grub_util_get_path (dir, boot_file); boot_path = grub_util_get_path (dir, boot_file);
boot_size = grub_util_get_image_size (boot_path); boot_size = grub_util_get_image_size (boot_path);
@ -210,9 +187,9 @@ setup (const char *prefix, const char *dir,
boot_devpath = (char *) (boot_img boot_devpath = (char *) (boot_img
+ GRUB_BOOT_AOUT_HEADER_SIZE + GRUB_BOOT_AOUT_HEADER_SIZE
+ GRUB_BOOT_MACHINE_BOOT_DEVPATH); + GRUB_BOOT_MACHINE_BOOT_DEVPATH);
kernel_sector = (grub_disk_addr_t *) (boot_img kernel_byte = (grub_disk_addr_t *) (boot_img
+ GRUB_BOOT_AOUT_HEADER_SIZE + GRUB_BOOT_AOUT_HEADER_SIZE
+ GRUB_BOOT_MACHINE_KERNEL_SECTOR); + GRUB_BOOT_MACHINE_KERNEL_BYTE);
core_path = grub_util_get_path (dir, core_file); core_path = grub_util_get_path (dir, core_file);
core_size = grub_util_get_image_size (core_path); core_size = grub_util_get_image_size (core_path);
@ -229,8 +206,7 @@ setup (const char *prefix, const char *dir,
+ GRUB_DISK_SECTOR_SIZE + GRUB_DISK_SECTOR_SIZE
- sizeof (*block)); - sizeof (*block));
grub_util_info ("root is `%s', dest is `%s', and dest_ofpath is `%s'", grub_util_info ("root is `%s', dest is `%s'", root, dest);
root, dest, dest_ofpath);
/* Open the root device and the destination device. */ /* Open the root device and the destination device. */
grub_util_info ("Opening root"); grub_util_info ("Opening root");
@ -351,14 +327,30 @@ setup (const char *prefix, const char *dir,
!= (grub_ssize_t) core_size - GRUB_DISK_SECTOR_SIZE) != (grub_ssize_t) core_size - GRUB_DISK_SECTOR_SIZE)
grub_util_error ("failed to read the rest sectors of the core image"); grub_util_error ("failed to read the rest sectors of the core image");
if (file->device->disk->id != dest_dev->disk->id)
{
const char *dest_ofpath;
dest_ofpath
= grub_util_devname_to_ofpath (grub_util_biosdisk_get_osdev (file->device->disk));
grub_util_info ("dest_ofpath is `%s'", dest_ofpath);
strncpy (boot_devpath, dest_ofpath, GRUB_BOOT_MACHINE_BOOT_DEVPATH_END
- GRUB_BOOT_MACHINE_BOOT_DEVPATH - 1);
boot_devpath[GRUB_BOOT_MACHINE_BOOT_DEVPATH_END
- GRUB_BOOT_MACHINE_BOOT_DEVPATH - 1] = 0;
}
else
{
grub_util_info ("non cross-disk install");
memset (boot_devpath, 0, GRUB_BOOT_MACHINE_BOOT_DEVPATH_END
- GRUB_BOOT_MACHINE_BOOT_DEVPATH);
}
grub_file_close (file); grub_file_close (file);
free (core_path); free (core_path);
free (tmp_img); free (tmp_img);
*kernel_sector = grub_cpu_to_be64 (first_sector); *kernel_byte = grub_cpu_to_be64 (first_sector << GRUB_DISK_SECTOR_BITS);
strcpy(boot_devpath, dest_ofpath);
grub_util_info ("boot device path %s, prefix is %s, dest is %s", grub_util_info ("boot device path %s, prefix is %s, dest is %s",
boot_devpath, prefix, dest); boot_devpath, prefix, dest);
@ -635,7 +627,8 @@ main (int argc, char *argv[])
find_dest_dev (&ginfo, argv); find_dest_dev (&ginfo, argv);
ginfo.prefix = grub_get_prefix (ginfo.dir ? : DEFAULT_DIRECTORY); ginfo.prefix = make_system_path_relative_to_its_root (ginfo.dir ?
: DEFAULT_DIRECTORY);
check_root_dev (&ginfo); check_root_dev (&ginfo);