diff --git a/ChangeLog b/ChangeLog index b72d07e88..5d836659c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,683 @@ +2009-09-16 Vladimir Serbinenko + + * mmap/mmap.c (grub_cmd_badram): Fix off-by-one error. + +2009-09-16 Robert Millan + + * aclocal.m4 (AC_LANG_PROGRAM): New macro. Overrides stock + AC_LANG_PROGRAM from autoconf. + (grub_ASM_USCORE, grub_PROG_OBJCOPY_ABSOLUTE): Add missing + prototypes (fixes warning). + + * configure.ac: Add `-Werror' to TARGET_CFLAGS unless + `--disable-werror' was used. + +2009-09-16 Robert Millan + + * partmap/msdos.c (pc_partition_map_iterate): Fix possible use of + uninitialized `lastaddr'. + +2009-09-15 Vladimir Serbinenko + + * partmap/msdos.c (pc_partition_map_iterate): Detect and break loops. + +2009-09-14 Colin Watson + + * commands/test.c (get_fileinfo): Return immediately if + grub_fs_probe fails. + +2009-09-14 José Martínez + + * commands/acpi.c (grub_cmd_acpi): Fix loading ACPI tables from file. + +2009-09-14 Colin Watson + + * util/grub.d/30_os-prober.in: Cope with Windows 7 in os-prober + output. + +2009-09-13 Robert Millan + + * configure.ac: Remove --enable-grub-pe2elf. Only build + grub-pe2elf when needed by the build system itself. + * conf/common.rmk: Remove $(enable_grub_pe2elf) check. + +2009-09-12 Robert Millan + + * configure.ac: Bump version to 1.97~beta3. + * docs/version.texi: Likewise. + +2009-09-12 Robert Millan + + * video/i386/pc/vbe.c (grub_vbe_get_video_mode_info): Move packed + mode special handling (grub_vbe_bios_set_dac_palette_width() call) + from here ... + * loader/i386/linux.c [GRUB_MACHINE_PCBIOS] + (grub_linux_setup_video): ... to here (with some adjustments). + +2009-09-12 Robert Millan + + Fix memory corruption issue (spotted by Colin Watson). + + * kern/i386/pc/startup.S (grub_vbe_bios_getset_dac_palette): Fix bug + causing returned size to be stored in an incorrect memory location. + Fix use of uninitialized value when storing the returned size. + +2009-09-12 Yves Blusseau + + Change clean rules to properly remove files + + * genmk.rb: add new clean rules + * Makefile.in (clean): add the new targets + (mostlyclean): likewise + +2009-09-11 Colin Watson + + * include/grub/ntfs.h (struct grub_fshelp_node): Change `size' + to grub_uint64_t. + * fs/ntfs.c (init_file): Understand 64-bit sizes for + non-resident files. + +2009-09-11 Colin Watson + + * configure.ac: Don't look for help2man when cross-compiling. Fixes + part of bug #27349. + +2009-09-10 Felix Zielcke + + * util/grub-mkconfig.in: Make the created config mode 400 and + print a warning if it fails. + +2009-09-10 Robert Millan + + * util/grub.d/40_custom.in: Ask user to type custom entries below + comment, rather than below 'exec tail' line. + +2009-09-10 Colin Watson + + * util/grub.d/40_custom.in: Make sure that the explanatory text is + visible in grub.cfg. + +2009-09-10 Colin Watson + + * util/grub.d/40_custom.in: Make it a little clearer how to use this + file. + +2009-09-10 Felix Zielcke + + * docs/grub.cfg: Add an example menu entry for memtest86+. + +2009-09-09 Felix Zielcke + + * config.guess: Update to latest version from config git. + * config.sub: Likewise. + +2009-09-08 Colin Watson + + * script/sh/execute.c (grub_script_execute_cmdline): Set "?" in + unknown-command case. Fixes bug #27320. + +2009-09-08 Felix Zielcke + + * kern/rescue_parser.c (grub_rescue_parse_line): Only suggest to try + `help' if the command exists. + +2009-09-06 Robert Millan + + * INSTALL: Require GCC 4.1.3 or later. + +2009-09-06 Yves Blusseau + + * Makefile.in (RMKFILES): add i386-qemu.rmk + (MAINTAINER_CLEANFILES): add $(srcdir)/DISTLIST $(srcdir)/config.h.in + $(srcdir)/stamp-h.in + +2009-09-05 Robert Millan + + * util/grub-probe.c (probe): Comment out buggy codepath, which + was unexpectedly enabled by Colin Watson's 2009-09-02 fix. This + should be re-enabled after 1.97. + +2009-09-05 Felix Zielcke + + * gendistlist.sh: Add `grub-dumpdevtree' and `*.lua' to the list + find searches for. + +2009-09-04 Vladimir Serbinenko + + * loader/i386/xnu.c (grub_cpu_xnu_fill_devicetree): Remove + unnecessary calls to grub_error. + +2009-09-04 Colin Watson + + * NEWS: Mention `keystatus' and Unicode fonts. + +2009-09-04 Robert Millan + + * configure.ac: Bump version to 1.97~beta2. + * docs/version.texi: Likewise. + +2009-09-03 Colin Watson + + * configure.ac: By default, GCC 4.4 generates .eh_frame sections + containing unwind information in some cases where it previously did + not. Use -fno-dwarf2-cfi-asm if available to restore the old + behaviour. See http://patchwork.kernel.org/patch/8555/ for related + discussion. + +2009-09-02 Yves BLUSSEAU + + Embedding loadenv module into grub-emu + + * conf/i386-pc.rmk (grub_emu_SOURCES): add lib/envblk.c and + commands/loadenv.c + * conf/i386-coreboot.rmk (grub_emu_SOURCES): Likewise + * conf/i386-efi.rmk (grub_emu_SOURCES): Likewise + * conf/i386-ieee1275.rmk (grub_emu_SOURCES): Likewise + * conf/powerpc-ieee1275.rmk (grub_emu_SOURCES): Likewise + * conf/sparc64-ieee1275.rmk (grub_emu_SOURCES): Likewise + * conf/x86_64-efi.rmk (grub_emu_SOURCES): Likewise + +2009-09-03 Magnus Granberg + + * aclocal.m4: Add grub_CHECK_PIE. It check if the compiler + include -fPIE in the default specs. + * configure.ac: Check if pie_possible is yes and add -fno-PIE + to TARGET_CFLAGS. + +2009-09-03 Felix Zielcke + + * INSTALL: Note that GNU Bison 2.3 or later is required. + +2009-09-03 Colin Watson + + * kern/i386/pc/startup.S: Fix typo. + +2009-09-02 Vladimir Serbinenko + + * efiemu/loadcore.c (SUFFIX (grub_efiemu_loadcore_load)): Fix style + according to GCS. + +2009-09-02 Colin Watson + + * docs/grub.texi (Naming convention): Describe one-based partition + numbering. + (Device syntax): Likewise. + (File name syntax): Likewise. + (Block list syntax): Likewise. + (Making a GRUB bootable CD-ROM): Talk about grub.cfg rather than + menu.lst. + (File name syntax): Likewise. + (Command-line and menu entry commands): Document acpi, blocklist, + crc, export, insmod, keystatus, ls, set, and unset commands. + +2009-09-02 Colin Watson + + * commands/keystatus.c (GRUB_MOD_INIT (keystatus)): Adjust summary + to avoid implying that only one of --shift, --ctrl, or --alt may be + used. + +2009-09-02 Colin Watson + + * util/grub-probe.c (probe): Test st.st_mode using S_ISREG macro + rather than comparing against S_IFREG, which will almost never work. + +2009-09-01 Vladimir Serbinenko + + * commands/loadenv.c (check_blocklists): Fix off-by-one error. + (write_blocklists): Likewise. + +2009-09-01 Colin Watson + + * script/lua/grub_lua.h (fputs): Supply a format string as the first + argument to grub_printf. + +2009-09-01 Felix Zielcke + + * genmk.rb: Add quotes around $(TARGET_OBJ2ELF) to cope with + non GNU test. + +2009-08-30 Vladimir Serbinenko + + * kern/file.c (grub_file_read): Spelling fix + +2009-08-30 Vladimir Serbinenko + + * loader/i386/bsdXX.c (SUFFIX (grub_freebsd_load_elfmodule)): Fix + loading of headers in some cases. + +2009-08-30 Robert Millan + + * configure.ac: Bump version to 1.97~beta1. + * docs/version.texi: Likewise. + +2009-08-29 Vladimir Serbinenko + + * include/grub/i386/xnu.h: Add license header. + include grub/err.h explicitly. + +2009-08-29 Robert Millan + + * util/grub.d/10_freebsd.in: Detect `ufs1' and `ufs2' and map them + to `ufs' in the vfs.root.mountfrom kernel parameter. + +2009-08-29 Robert Millan + + * term/i386/pc/serial.c: Include `'. + + [GRUB_MACHINE_PCBIOS] (serial_hw_io_addr): Macroify initialization + value (0x0400 -> GRUB_MEMORY_MACHINE_BIOS_DATA_AREA_ADDR). + + [! GRUB_MACHINE_PCBIOS] (GRUB_SERIAL_PORT_NUM): Calculate using + `ARRAY_SIZE' macro. + +2009-08-28 Vladimir Serbinenko + + * kern/file.c (grub_file_read): Check offset. + * fs/hfs.c (grub_hfs_read_file): Remove unnecessary offset check. + * fs/jfs.c (grub_jfs_read_file): Likewise. + * fs/ntfs.c (grub_ntfs_read): Likewise. + * fs/reiserfs.c (grub_reiserfs_read): Likewise. + * fs/minix.c (grub_minix_read_file): Correct offset check. + * fs/ufs.c (grub_ufs_read_file): Likewise. + +2009-08-28 Colin Watson + + * term/i386/pc/console.c (bios_data_area): Cast + GRUB_MEMORY_MACHINE_BIOS_DATA_AREA_ADDR explicitly. + +2009-08-28 Vladimir Serbinenko + + 1-bit optimised blitters. + + * include/grub/fbblit.h (grub_video_fbblit_replace_32bit_1bit): New + prototype. + (grub_video_fbblit_replace_24bit_1bit): Likewise. + (grub_video_fbblit_replace_16bit_1bit): Likewise. + (grub_video_fbblit_replace_8bit_1bit): Likewise. + (grub_video_fbblit_blend_XXXA8888_1bit): Likewise. + (grub_video_fbblit_blend_XXX888_1bit): Likewise. + (grub_video_fbblit_blend_XXX565_1bit): Likewise. + * video/fb/fbblit.c (grub_video_fbblit_replace_32bit_1bit): New + function. + (grub_video_fbblit_replace_24bit_1bit): Likewise. + (grub_video_fbblit_replace_16bit_1bit): Likewise. + (grub_video_fbblit_replace_8bit_1bit): Likewise. + (grub_video_fbblit_blend_XXXA8888_1bit): Likewise. + (grub_video_fbblit_blend_XXX888_1bit): Likewise. + (grub_video_fbblit_blend_XXX565_1bit): Likewise. + * video/fb/video_fb.c (common_blitter): Use 1-bit optimised blitters + when possible. + * video/video.c (grub_video_get_blit_format): Return + GRUB_VIDEO_BLIT_FORMAT_1BIT_PACKED if bpp = 1. + +2009-08-28 Colin Watson + + * normal/cmdline.c (grub_cmdline_get): Supply a format string as + the first argument to grub_printf. + +2009-08-28 Colin Watson +2009-08-28 Robert Millan + + Add `getkeystatus' terminal method. Add a new `keystatus' command + to query it. + + * include/grub/term.h (GRUB_TERM_STATUS_SHIFT, + GRUB_TERM_STATUS_CTRL, GRUB_TERM_STATUS_ALT): Definitions for + modifier key bitmasks. + (struct grub_term_input): Add `getkeystatus' member. + (grub_getkeystatus): Add prototype. + * kern/term.c (grub_getkeystatus): New function. + + * include/grub/i386/pc/memory.h + (GRUB_MEMORY_MACHINE_BIOS_DATA_AREA_ADDR): New macro. + (struct grub_machine_bios_data_area): Define necessary parts of BIOS + Data Area layout. + * term/i386/pc/console.c (grub_console_getkeystatus): New function. + (grub_console_term_input): Set `getkeystatus' member. + * term/usb_keyboard.c (grub_usb_hid): Macroify HID protocol + constants. + (grub_usb_keyboard_getreport): Likewise. + (grub_usb_keyboard_checkkey): Likewise. + (grub_usb_keyboard_getkeystatus): New function. + (grub_usb_keyboard_term): Set `getkeystatus' member. + + * commands/keystatus.c: New file. + * conf/common.rmk (pkglib_MODULES): Add keystatus.mod. + (keystatus_mod_SOURCES): New variable. + (keystatus_mod_CFLAGS): Likewise. + (keystatus_mod_LDFLAGS): Likewise. + * conf/i386-coreboot.rmk (grub_emu_SOURCES): Add + commands/keystatus.c. + * conf/i386-efi.rmk (grub_emu_SOURCES): Likewise. + * conf/i386-ieee1275.rmk (grub_emu_SOURCES): Likewise. + * conf/i386-pc.rmk (grub_emu_SOURCES): Likewise. + * conf/powerpc-ieee1275.rmk (grub_emu_SOURCES): Likewise. + * conf/sparc64-ieee1275.rmk (grub_emu_SOURCES): Likewise. + * conf/x86_64-efi.rmk (grub_emu_SOURCES): Likewise. + +2009-08-28 Vladimir Serbinenko + + Split befs.mod and afs.mod into *_be.mod and *.mod + + * conf/common.rmk (grub_probe_SOURCES): Add afs_be.c and befs_be.c. + (grub_fstest_SOURCES): Likewise. + (pkglib_MODULES): Add afs_be.mod and befs_be.mod. + (afs_be_mod_SOURCES): New variable. + (afs_be_mod_CFLAGS): Likewise. + (afs_be_mod_LDFLAGS): Likewise. + (befs_be_mod_SOURCES): Likewise. + (befs_be_mod_CFLAGS): Likewise. + (befs_be_mod_LDFLAGS): Likewise. + * conf/i386-coreboot.rmk (grub_emu_SOURCES): Add afs_be.c and befs_be.c. + * conf/i386-efi.rmk (grub_emu_SOURCES): Likewise. + * conf/i386-ieee1275.rmk (grub_emu_SOURCES): Likewise. + * conf/i386-pc.rmk (grub_setup_SOURCES): Likewise. + (grub_emu_SOURCES): Likewise. + * conf/powerpc-ieee1275.rmk (grub_emu_SOURCES): Likewise. + * conf/sparc64-ieee1275.rmk (grub_emu_SOURCES): Likewise. + * conf/x86_64-efi.rmk (grub_emu_SOURCES): Likewise. + * fs/afs_be.c: New file. + * fs/befs_be.c: New file. + * fs/afs.c (GRUB_AFS_FSNAME_SUFFIX): New definition. + (GRUB_AFS_FSNAME): Use GRUB_AFS_FSNAME_SUFFIX. + (U16): Replaced with ... + (grub_afs_to_cpu16): ...this. All users updated. + (U32): Replaced with ... + (grub_afs_to_cpu32): ...this. All users updated. + (U64): Replaced with ... + (grub_afs_to_cpu64): ...this. All users updated. + (GRUB_AFS_BO_LITTLE_ENDIAN): Remove. + (GRUB_AFS_BO_BIG_ENDIAN): Likewise. + (grub_afs_validate_sblock): Check only one endianness. + (GRUB_MOD_INIT (befs)) [MODE_BIGENDIAN && MODE_BFS]: Rename to .. + (GRUB_MOD_INIT (befs_be)) [MODE_BIGENDIAN && MODE_BFS]: ... this. + (GRUB_MOD_INIT (afs)) [MODE_BIGENDIAN && !MODE_BFS]: Rename to .. + (GRUB_MOD_INIT (afs_be)) [MODE_BIGENDIAN && !MODE_BFS]: ... this. + (GRUB_MOD_FINI (befs)) [MODE_BIGENDIAN && MODE_BFS]: Rename to .. + (GRUB_MOD_FINI (befs_be)) [MODE_BIGENDIAN && MODE_BFS]: ... this. + (GRUB_MOD_FINI (afs)) [MODE_BIGENDIAN && !MODE_BFS]: Rename to .. + (GRUB_MOD_FINI (afs_be)) [MODE_BIGENDIAN && !MODE_BFS]: ... this. + +2009-08-26 Bean + + * fs/xfs.c (GRUB_XFS_INO_INOINAG): Replace 1L with 1LL to support + 64-bit number. + (GRUB_XFS_FSB_TO_BLOCK): Likewise. + (grub_xfs_inode_block): Change return type to grub_uint64_t. + (grub_xfs_read_inode): Change type of block to grub_uint64_t. + +2009-08-25 Vladimir Serbinenko + + NetBSD memory map support. + + * include/grub/i386/bsd.h (NETBSD_BTINFO_MEMMAP): New definition. + (grub_netbsd_btinfo_mmap_header): New structure. + (grub_netbsd_btinfo_mmap_entry): Likewise. + * loader/i386/bsd.c (grub_netbsd_boot): Pass memory map. + +2009-08-25 Vladimir Serbinenko + + Enable bsd.mod on coreboot. + + * conf/i386-coreboot.rmk (pkglib_MODULES): Add bsd.mod. + (bsd_mod_SOURCES): New variable. + (bsd_mod_CFLAGS): Likewise. + (bsd_mod_LDFLAGS): Likewise. + (bsd_mod_ASFLAGS): Likewise. + * loader/i386/bsd.c [!GRUB_MACHINE_PCBIOS]: Fix includes. + (grub_bsd_get_device) [!GRUB_MACHINE_PCBIOS]: Set *biosdev to 0xff. + +2009-08-25 Vladimir Serbinenko + + Cleanup NetBSD root support. + + * loader/i386/bsd.c (grub_netbsd_boot): Remove call to + grub_bsd_get_device. + Fix typo. + +2009-08-25 Felix Zielcke + + * util/grub.d/00_header.in: Move check for the video backend of + gfxterm from here ... + * util/grub-mkconfig.in: ... to here. Enable gfxterm if there's + a suitable video backend. + +2009-08-25 Vladimir Serbinenko + + Fix breakage in grub-setup. + + * util/i386/pc/grub-setup.c (setup): Use "part_msdos" instead of + "msdos_partition_map". + +2009-08-25 Vladimir Serbinenko + + Fix breakage in normal/auth.c. + + * normal/auth.c (grub_iswordseparator): New function. + +2009-08-25 Vladimir Serbinenko + + Authentication support. + + * commands/password.c: New file. + * conf/common.rmk (pkglib_MODULES): Add password.mod. + (password_mod_SOURCES): New variable. + (password_mod_CFLAGS): Likewise. + (password_mod_LDFLAGS): Likewise. + (normal_mod_SOURCES): Add normal/auth.c. + * conf/i386-coreboot.rmk (grub_emu_SOURCES): Add commands/password.c and + normal/auth.c. + * conf/i386-efi.rmk (grub_emu_SOURCES): Likewise. + * conf/i386-ieee1275.rmk (grub_emu_SOURCES): Likewise. + * conf/i386-pc.rmk (grub_emu_SOURCES): Likewise. + * conf/powerpc-ieee1275.rmk (grub_emu_SOURCES): Likewise. + * conf/sparc64-ieee1275.rmk (grub_emu_SOURCES): Likewise. + * conf/x86_64-efi.rmk (grub_emu_SOURCES): Likewise. + * include/grub/auth.h: New file. + * include/grub/err.h (grub_err_t): New enum value + GRUB_ERR_ACCESS_DENIED. + * include/grub/menu.h (grub_menu_entry): New fields 'restricted' and + 'users'. + * include/grub/normal.h (grub_cmdline_get): New argument 'history'. + * normal/cmdline.c (grub_cmdline_get): New argument 'history'. All + users updated. + * normal/auth.c: New file. + * normal/main.c (grub_normal_add_menu_entry): Handle --users option. + (grub_cmdline_run): Don't allow to go to command line without + authentication. + * normal/menu.c (grub_menu_execute_entry): Handle restricted entries. + * normal/menu_entry.c (grub_menu_entry_run): Don't allow editing + menuentry without superuser rights. + * normal/menu_viewer.c (grub_menu_viewer_show_menu): Don't exit if + user isn't a superuser. + +2009-08-24 Vladimir Serbinenko + + Save space by inlining misc.c functions. + + * kern/misc.c (grub_iswordseparator): Made static. + * kern/misc.c (grub_strcat): Moved from here ... + * include/grub/misc.h (grub_strcat): ... here. Inlined. + * kern/misc.c (grub_strncat): Moved from here ... + * include/grub/misc.h (grub_strncat): ... here. Inlined. + * kern/misc.c (grub_strcasecmp): Moved from here ... + * include/grub/misc.h (grub_strcasecmp): ... here. Inlined. + * kern/misc.c (grub_strncasecmp): Moved from here ... + * include/grub/misc.h (grub_strncasecmp): ... here. Inlined. + * kern/misc.c (grub_isalpha): Moved from here ... + * include/grub/misc.h (grub_isalpha): ... here. Inlined. + * kern/misc.c (grub_isdigit): Moved from here ... + * include/grub/misc.h (grub_isdigit): ... here. Inlined. + * kern/misc.c (grub_isgraph): Moved from here ... + * include/grub/misc.h (grub_isgraph): ... here. Inlined. + * kern/misc.c (grub_tolower): Moved from here ... + * include/grub/misc.h (grub_tolower): ... here. Inlined. + +2009-08-24 Vladimir Serbinenko + + * script/sh/function.c (grub_script_function_find): Cut error message + not to flood terminal. + * script/sh/lexer.c (grub_script_yylex): Remove command line length + limit. + * script/sh/script.c (grub_script_arg_add): Duplicate string. + +2009-08-24 Colin Watson + + * term/usb_keyboard.c (grub_usb_keyboard_getreport): Make + `report' grub_uint8_t *. + (grub_usb_keyboard_checkkey): Make `data' elements grub_uint8_t. + Use a 50-millisecond timeout rather than just repeating + grub_usb_keyboard_getreport 50 times. + (grub_usb_keyboard_getkey): Make `data' elements grub_uint8_t. + +2009-08-24 Vladimir Serbinenko + + Rename *_partition_map to part_* + + * partmap/acorn.c (grub_acorn_partition_map): Set name to 'part_acorn'. + * partmap/amiga.c (grub_amiga_partition_map): Set name to 'part_amiga'. + * partmap/apple.c (grub_apple_partition_map): Set name to 'part_apple'. + * partmap/gpt.c (grub_gpt_partition_map): Set name to 'part_gpt'. + All users updated. + * partmap/msdos.c (grub_msdos_partition_map): Set name to 'part_msdos'. + All users updated. + * partmap/sun.c (grub_sun_partition_map): Set name to 'part_sun'. + * util/grub-probe.c (probe_partmap): Don't transform partition name + to get module name. + +2009-08-24 Vladimir Serbinenko + + Fix OpenBSD and NetBSD support. + + * include/grub/i386/bsd.h (GRUB_BSD_TEMP_BUFFER): Change to resolve + memory address conflict. + (OPENBSD_MMAP_ACPI): New definition. + (OPENBSD_MMAP_NVS): Likewise. + * loader/i386/bsd.c (grub_openbsd_boot): Support OPENBSD_MMAP_ACPI + and OPENBSD_MMAP_NVS. + Add memory map terminator + Explicit cast when calling grub_unix_real_boot. + (grub_netbsd_boot): Explicit cast when calling grub_unix_real_boot. + +2009-08-24 Vladimir Serbinenko + + Let user specify NetBSD root device. + + * loader/i386/bsd.c (netbsd_root): New variable. + (netbsd_opts): New option 'root'. + (NETBSD_ROOT_ARG): New macro. + (grub_netbsd_boot): Use 'netbsd_root'. + (grub_bsd_unload): Free 'netbsd_root'. + (grub_cmd_netbsd): Fill 'netbsd_root'. + +2009-08-24 Vladimir Serbinenko + + Support for 64-bit NetBSD. + + * loader/i386/bsd.c (grub_bsd_load_elf): Apply correct mask to entry + point when booting non-FreeBSD. + +2009-08-24 Vladimir Serbinenko + + Support --no-smp and --no-acpi for NetBSD. + + * include/grub/i386/bsd.h (NETBSD_AB_NOSMP): New definition. + (NETBSD_AB_NOACPI): Likewise. + * loader/i386/bsd.c (netbsd_opts): New entries no-smp and no-acpi. + (netbsd_flags): Add NETBSD_AB_NOSMP, NETBSD_AB_NOACPI. + +2009-08-23 Vladimir Serbinenko + + * fs/hfsplus.c (grub_hfsplus_mount): Don't ignore grub_hfsplus_read_file + errors. + (grub_hfsplus_btree_iterate_node): Don't ignore grub_hfsplus_read_file + errors. Call grub_error when needed. + +2009-08-23 Vladimir Serbinenko + + * commands/search.c (search_fs): Try searching without autoload first. + * util/grub-mkconfig_lib.in (prepare_grub_to_access_device): Load + filesystem module explicitly for faster booting. + +2009-08-23 Colin Watson + + * util/grub-mkconfig.in: Export GRUB_DISABLE_OS_PROBER. + +2009-08-23 Colin Watson + + * util/grub.d/30_os-prober.in: Disable os-prober if + `GRUB_DISABLE_OS_PROBER' was set to true. + +2009-08-23 Robert Millan + + * partmap/pc.c: Rename to ... + * partmap/msdos.c: ... this. Update all users. + (grub_pc_partition_map): Rename to ... + (grub_msdos_partition_map): ... this. Update all users. + + * parttool/pcpart.c: Rename to ... + * parttool/msdospart.c: ... this. Update all users. + + * include/grub/pc_partition.h: Rename to ... + * include/grub/msdos_partition.h: ... this. Update all users. + (grub_pc_partition_bsd_entry): Rename to ... + (grub_msdos_partition_bsd_entry): ... this. Update all users. + (grub_pc_partition_disk_label): Rename to ... + (grub_msdos_partition_disk_label): ... this. Update all users. + (grub_pc_partition_entry): Rename to ... + (grub_msdos_partition_entry): ... this. Update all users. + (grub_pc_partition_mbr): Rename to ... + (grub_msdos_partition_mbr): ... this. Update all users. + (grub_pc_partition): Rename to ... + (grub_msdos_partition): ... this. Update all users. + (grub_pc_partition_is_empty): Rename to ... + (grub_msdos_partition_is_empty): ... this. Update all users. + (grub_pc_partition_is_extended): Rename to ... + (grub_msdos_partition_is_extended): ... this. Update all users. + (grub_pc_partition_is_bsd): Rename to ... + (grub_msdos_partition_is_bsd): ... this. Update all users. + + * conf/common.rmk (amiga_mod_SOURCES, amiga_mod_CFLAGS) + (amiga_mod_LDFLAGS, apple_mod_SOURCES, apple_mod_CFLAGS) + (apple_mod_LDFLAGS, msdos_mod_SOURCES, msdos_mod_CFLAGS) + (msdos_mod_LDFLAGS, sun_mod_SOURCES, sun_mod_CFLAGS) + (sun_mod_LDFLAGS, acorn_mod_SOURCES, acorn_mod_CFLAGS) + (acorn_mod_LDFLAGS, gpt_mod_SOURCES, gpt_mod_CFLAGS) + (gpt_mod_LDFLAGS): Rename to ... + (part_amiga_mod_SOURCES, part_amiga_mod_CFLAGS, part_amiga_mod_LDFLAGS) + (part_apple_mod_SOURCES, part_apple_mod_CFLAGS, part_apple_mod_LDFLAGS) + (part_msdos_mod_SOURCES, part_msdos_mod_CFLAGS, part_msdos_mod_LDFLAGS) + (part_sun_mod_SOURCES, part_sun_mod_CFLAGS, part_sun_mod_LDFLAGS) + (part_acorn_mod_SOURCES, part_acorn_mod_CFLAGS, part_acorn_mod_LDFLAGS) + (part_gpt_mod_SOURCES, part_gpt_mod_CFLAGS) + (part_gpt_mod_LDFLAGS): ... this. + (pkglib_MODULES): Prefix partition modules with `part_'. Rename + `pcpart.mod' to `msdospart.mod'. + (pcpart_mod_SOURCES, pcpart_mod_CFLAGS, pcpart_mod_LDFLAGS): Rename + to ... + (msdospart_mod_SOURCES, msdospart_mod_CFLAGS) + (msdospart_mod_LDFLAGS): ... this. + +2009-08-23 Vladimir Serbinenko + + * loader/i386/bsd.c (freebsd_opts): Rewritten to use extcmd. + (openbsd_opts): Likewise. + (netbsd_opts): Likewise. + (freebsd_flags): Added 0 terminator. + (openbsd_flags): Likewise. + (netbsd_flags): Likewise. + (grub_bsd_parse_flags): Rewritten to use extcmd. All users updated. + (grub_cmd_freebsd): Transformed into extended command. + (grub_cmd_openbsd): Likewise. + (grub_cmd_netbsd): Likewise. + (cmd_freebsd): Changed type to grub_extcmd_t. + (cmd_openbsd): Likewise. + (cmd_netbsd): Likewise. + (GRUB_MOD_INIT (bsd)): Register grub_cmd_freebsd, grub_cmd_netbsd and + grub_cmd_openbsd as extended commands. + (GRUB_MOD_FINI (bsd)): Use grub_unregister_extcmd for cmd_freebsd, + cmd_netbsd and cmd_openbsd + 2009-08-22 Vladimir Serbinenko * commands/xnu_uuid.c (transform): Use grub_memcpy instead of memcpy. @@ -438,7 +1118,7 @@ 2009-07-30 Vladimir Serbinenko * util/i386/pc/grub-setup.c (setup): Check that no partition is in - embeding zone, not only the first one. + embedding zone, not only the first one. 2009-07-29 Joe Auricchio @@ -511,7 +1191,7 @@ instead of WORDS_BIGENDIAN. Use grub_le_to_cpu32(), so that the case of little endian words becomes just an optimization. Respect const modifier. - (md5_final): Use code that doesn't depend on endianess. + (md5_final): Use code that doesn't depend on endianness. * include/grub/misc.h (ALIGN_UP): Cast align to the type of addr to avoid loss of upper bits if align is unsigned and shorter diff --git a/INSTALL b/INSTALL index 6048b1d6e..e751d508f 100644 --- a/INSTALL +++ b/INSTALL @@ -11,9 +11,9 @@ GRUB depends on some software packages installed into your system. If you don't have any of them, please obtain and install them before configuring the GRUB. -* GCC 2.95 or later +* GCC 4.1.3 or later * GNU Make -* GNU Bison +* GNU Bison 2.3 or later * GNU binutils 2.9.1.0.23 or later * Other standard GNU/Unix tools * Ruby 1.6 or later diff --git a/Makefile.in b/Makefile.in index 8e2cdc6c4..ff84afb7b 100644 --- a/Makefile.in +++ b/Makefile.in @@ -111,7 +111,7 @@ enable_efiemu = @enable_efiemu@ ### General variables. RMKFILES = $(addprefix conf/,common.rmk i386-coreboot.rmk i386-efi.rmk \ - i386-ieee1275.rmk i386-pc.rmk i386.rmk powerpc-ieee1275.rmk \ + i386-qemu.rmk i386-ieee1275.rmk i386-pc.rmk i386.rmk powerpc-ieee1275.rmk \ sparc64-ieee1275.rmk x86_64-efi.rmk) MKFILES = $(patsubst %.rmk,%.mk,$(RMKFILES)) @@ -128,7 +128,8 @@ MOSTLYCLEANFILES = DISTCLEANFILES = config.status config.cache config.log config.h \ Makefile stamp-h include/grub/cpu include/grub/machine \ gensymlist.sh genkernsyms.sh build_env.mk -MAINTAINER_CLEANFILES = $(srcdir)/configure $(addprefix $(srcdir)/,$(MKFILES)) +MAINTAINER_CLEANFILES = $(srcdir)/configure $(addprefix $(srcdir)/,$(MKFILES)) \ + $(srcdir)/DISTLIST $(srcdir)/config.h.in $(srcdir)/stamp-h.in # The default target. all: all-local @@ -325,10 +326,10 @@ uninstall: rm -f $(DESTDIR)$(libdir)/grub/$$dest; \ done -clean: +clean: $(CLEAN_IMAGE_TARGETS) $(CLEAN_MODULE_TARGETS) $(CLEAN_UTILITY_TARGETS) -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) -mostlyclean: clean +mostlyclean: clean $(MOSTLYCLEAN_IMAGE_TARGETS) $(MOSTLYCLEAN_MODULE_TARGETS) $(MOSTLYCLEAN_UTILITY_TARGETS) -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) distclean: mostlyclean diff --git a/NEWS b/NEWS index c54095e9b..03ba6a268 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,9 @@ New in 1.97 - : +* Add `keystatus' command. + +* Unicode fonts are now used by default. + * Add `hdparm' command. * Add support for getting the current date and time from CMOS as variables. diff --git a/aclocal.m4 b/aclocal.m4 index bde935dc9..899eca409 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1,3 +1,18 @@ +dnl Redefine AC_LANG_PROGRAM with a "-Wstrict-prototypes -Werror"-friendly +dnl version. Patch submitted to bug-autoconf in 2009-09-16. +m4_define([AC_LANG_PROGRAM(C)], +[$1 +int +main (void) +{ +dnl Do *not* indent the following line: there may be CPP directives. +dnl Don't move the `;' right after for the same reason. +$2 + ; + return 0; +}]) + + dnl Check whether target compiler is working AC_DEFUN(grub_PROG_TARGET_CC, [AC_MSG_CHECKING([whether target compiler is working]) @@ -26,6 +41,7 @@ AC_DEFUN(grub_ASM_USCORE, AC_MSG_CHECKING([if C symbols get an underscore after compilation]) AC_CACHE_VAL(grub_cv_asm_uscore, [cat > conftest.c <<\EOF +int func (int *); int func (int *list) { @@ -63,6 +79,7 @@ AC_DEFUN(grub_PROG_OBJCOPY_ABSOLUTE, [AC_MSG_CHECKING([whether ${OBJCOPY} works for absolute addresses]) AC_CACHE_VAL(grub_cv_prog_objcopy_absolute, [cat > conftest.c <<\EOF +void cmain (void); void cmain (void) { @@ -413,3 +430,31 @@ else [fi rm -rf testdir] ]) + +dnl Check if the C compiler supports `-fPIE'. +AC_DEFUN(grub_CHECK_PIE,[ +[# Position independent executable. +pie_possible=yes] +AC_MSG_CHECKING([whether `$CC' has `-fPIE' as default]) +# Is this a reliable test case? +AC_LANG_CONFTEST([[ +#ifdef __PIE__ +int main() { + return 0; +} +#else +#error NO __PIE__ DEFINED +#endif +]]) + +[# `$CC -c -o ...' might not be portable. But, oh, well... Is calling +# `ac_compile' like this correct, after all? +if eval "$ac_compile -S -o conftest.s" 2> /dev/null; then] + AC_MSG_RESULT([yes]) + [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'? + rm -f conftest.s +else + pie_possible=no] + AC_MSG_RESULT([no]) +[fi] +]) diff --git a/bus/usb/usbtrans.c b/bus/usb/usbtrans.c index e4beb4550..09e7af83e 100644 --- a/bus/usb/usbtrans.c +++ b/bus/usb/usbtrans.c @@ -74,7 +74,7 @@ grub_usb_control_msg (grub_usb_device_t dev, return grub_errno; } - /* Build a Setup packet. XXX: Endianess. */ + /* Build a Setup packet. XXX: Endianness. */ setupdata.reqtype = reqtype; setupdata.request = request; setupdata.value = value; diff --git a/commands/acpi.c b/commands/acpi.c index d903d446d..e7cb9e6b4 100644 --- a/commands/acpi.c +++ b/commands/acpi.c @@ -681,6 +681,9 @@ grub_cmd_acpi (struct grub_extcmd *cmd, table->size = size; table->addr = buf; playground_size += table->size; + + table->next = acpi_tables; + acpi_tables = table; } } diff --git a/commands/gptsync.c b/commands/gptsync.c index 600309f70..a603746a2 100644 --- a/commands/gptsync.c +++ b/commands/gptsync.c @@ -22,7 +22,7 @@ #include #include #include -#include +#include #include #include #include @@ -60,7 +60,7 @@ grub_cmd_gptsync (grub_command_t cmd __attribute__ ((unused)), int argc, char **args) { grub_device_t dev; - struct grub_pc_partition_mbr mbr; + struct grub_msdos_partition_mbr mbr; struct grub_partition *partition; grub_disk_addr_t first_sector; int numactive = 0; diff --git a/commands/keystatus.c b/commands/keystatus.c new file mode 100644 index 000000000..28ceb2d0b --- /dev/null +++ b/commands/keystatus.c @@ -0,0 +1,81 @@ +/* keystatus.c - Command to check key modifier status. */ +/* + * 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 . + */ + +#include +#include +#include +#include + +static const struct grub_arg_option options[] = + { + {"shift", 's', 0, "check Shift key", 0, 0}, + {"ctrl", 'c', 0, "check Control key", 0, 0}, + {"alt", 'a', 0, "check Alt key", 0, 0}, + {0, 0, 0, 0, 0, 0} + }; + +#define grub_cur_term_input grub_term_get_current_input () + +static grub_err_t +grub_cmd_keystatus (grub_extcmd_t cmd, + int argc __attribute__ ((unused)), + char **args __attribute__ ((unused))) +{ + struct grub_arg_list *state = cmd->state; + int expect_mods = 0; + int mods; + + if (state[0].set) + expect_mods |= GRUB_TERM_STATUS_SHIFT; + if (state[1].set) + expect_mods |= GRUB_TERM_STATUS_CTRL; + if (state[2].set) + expect_mods |= GRUB_TERM_STATUS_ALT; + + /* Without arguments, just check whether getkeystatus is supported at + all. */ + if (!grub_cur_term_input->getkeystatus) + return grub_error (GRUB_ERR_TEST_FAILURE, "false"); + grub_dprintf ("keystatus", "expect_mods: %d\n", expect_mods); + if (!expect_mods) + return 0; + + mods = grub_getkeystatus (); + grub_dprintf ("keystatus", "mods: %d\n", mods); + if (mods >= 0 && (mods & expect_mods) != 0) + return 0; + else + return grub_error (GRUB_ERR_TEST_FAILURE, "false"); +} + +static grub_extcmd_t cmd; + +GRUB_MOD_INIT(keystatus) +{ + cmd = grub_register_extcmd ("keystatus", grub_cmd_keystatus, + GRUB_COMMAND_FLAG_BOTH, + "keystatus [--shift] [--ctrl] [--alt]", + "Check key modifier status", + options); +} + +GRUB_MOD_FINI(keystatus) +{ + grub_unregister_extcmd (cmd); +} diff --git a/commands/loadenv.c b/commands/loadenv.c index 22665f9fe..c60eb835c 100644 --- a/commands/loadenv.c +++ b/commands/loadenv.c @@ -242,7 +242,7 @@ check_blocklists (grub_envblk_t envblk, struct blocklist *blocklists, part_start = 0; buf = grub_envblk_buffer (envblk); - for (p = blocklists, index = 0; p; p = p->next, index += p->length) + for (p = blocklists, index = 0; p; index += p->length, p = p->next) { char blockbuf[GRUB_DISK_SECTOR_SIZE]; @@ -278,7 +278,7 @@ write_blocklists (grub_envblk_t envblk, struct blocklist *blocklists, part_start = 0; index = 0; - for (p = blocklists; p; p = p->next, index += p->length) + for (p = blocklists; p; index += p->length, p = p->next) { if (grub_disk_write (disk, p->sector - part_start, p->offset, p->length, buf + index)) diff --git a/commands/password.c b/commands/password.c new file mode 100644 index 000000000..0e048797e --- /dev/null +++ b/commands/password.c @@ -0,0 +1,86 @@ +/* + * 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 . + */ + +#include +#include +#include +#include +#include +#include +#include + +static grub_dl_t my_mod; + +static grub_err_t +check_password (const char *user, + void *password) +{ + char entered[1024]; + + grub_memset (entered, 0, sizeof (entered)); + + if (!GRUB_GET_PASSWORD (entered, sizeof (entered) - 1)) + return GRUB_ACCESS_DENIED; + + if (grub_auth_strcmp (entered, password) != 0) + return GRUB_ACCESS_DENIED; + + grub_auth_authenticate (user); + + return GRUB_ERR_NONE; +} + +static grub_err_t +grub_cmd_password (grub_command_t cmd __attribute__ ((unused)), + int argc, char **args) +{ + grub_err_t err; + char *pass; + + if (argc != 2) + return grub_error (GRUB_ERR_BAD_ARGUMENT, "Two arguments expected."); + + pass = grub_strdup (args[1]); + if (!pass) + return grub_errno; + + err = grub_auth_register_authentication (args[0], check_password, pass); + if (err) + { + grub_free (pass); + return err; + } + grub_dl_ref (my_mod); + return GRUB_ERR_NONE; +} + +static grub_command_t cmd; + +GRUB_MOD_INIT(password) +{ + my_mod = mod; + cmd = grub_register_command ("password", grub_cmd_password, + "password USER PASSWORD", + "Set user password (plaintext). " + "Unrecommended and insecure."); +} + +GRUB_MOD_FINI(password) +{ + grub_unregister_command (cmd); +} diff --git a/commands/search.c b/commands/search.c index d10b51abf..0cfd0ebbc 100644 --- a/commands/search.c +++ b/commands/search.c @@ -51,6 +51,7 @@ search_fs (const char *key, const char *var, int no_floppy, enum options type) { int count = 0; char *buf = NULL; + grub_fs_autoload_hook_t saved_autoload; auto int iterate_device (const char *name); int iterate_device (const char *name) @@ -131,7 +132,22 @@ search_fs (const char *key, const char *var, int no_floppy, enum options type) return (found && var); } - grub_device_iterate (iterate_device); + /* First try without autoloading if we're setting variable. */ + if (var) + { + saved_autoload = grub_fs_autoload_hook; + grub_fs_autoload_hook = 0; + grub_device_iterate (iterate_device); + + /* Restore autoload hook. */ + grub_fs_autoload_hook = saved_autoload; + + /* Retry with autoload if nothing found. */ + if (grub_errno == GRUB_ERR_NONE && count == 0) + grub_device_iterate (iterate_device); + } + else + grub_device_iterate (iterate_device); grub_free (buf); diff --git a/commands/test.c b/commands/test.c index 26df8b5c5..9c813c820 100644 --- a/commands/test.c +++ b/commands/test.c @@ -88,6 +88,13 @@ test_parse (char **args, int *argn, int argc) } fs = grub_fs_probe (dev); + if (! fs) + { + grub_free (device_name); + grub_device_close (dev); + return; + } + pathname = grub_strchr (path, ')'); if (! pathname) pathname = path; diff --git a/conf/common.rmk b/conf/common.rmk index b0d3785d1..e18dd1052 100644 --- a/conf/common.rmk +++ b/conf/common.rmk @@ -17,9 +17,10 @@ grub_probe_SOURCES = util/grub-probe.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/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c \ - fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.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 \ \ - partmap/pc.c partmap/apple.c partmap/sun.c partmap/gpt.c\ + partmap/msdos.c partmap/apple.c partmap/sun.c partmap/gpt.c\ kern/fs.c kern/env.c fs/fshelp.c \ disk/raid.c disk/mdraid_linux.c disk/lvm.c grub_probe_init.c @@ -38,9 +39,10 @@ grub_fstest_SOURCES = util/grub-fstest.c util/hostfs.c util/misc.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/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c \ - fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.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 \ \ - kern/partition.c partmap/pc.c partmap/apple.c partmap/sun.c \ + kern/partition.c partmap/msdos.c partmap/apple.c partmap/sun.c \ partmap/gpt.c \ kern/fs.c kern/env.c fs/fshelp.c disk/raid.c \ disk/raid5_recover.c disk/raid6_recover.c \ @@ -117,21 +119,14 @@ bin_UTILITIES += grub-editenv grub_editenv_SOURCES = util/grub-editenv.c lib/envblk.c util/misc.c kern/misc.c kern/err.c CLEANFILES += grub-editenv -# for grub-pe2elf -ifeq ($(enable_grub_pe2elf), yes) -bin_UTILITIES += grub-pe2elf +# Needed for genmk.rb to work +ifeq (0,1) +bin_UTILITIES += grub-macho2img grub-pe2elf endif grub_pe2elf_SOURCES = util/grub-pe2elf.c util/misc.c CLEANFILES += grub-pe2elf -# grub_macho2img assumes a lot about source file. -# So installing it definitively is useless -# But adding to bin_UTILITIES is needed for -# genmk.rb to work -ifeq (0,1) -bin_UTILITIES += grub-macho2img -endif grub_macho2img_SOURCES = util/grub-macho2img.c CLEANFILES += grub-macho2img @@ -177,7 +172,7 @@ CLEANFILES += grub-dumpbios pkglib_MODULES += fshelp.mod fat.mod ufs1.mod ufs2.mod ext2.mod ntfs.mod \ ntfscomp.mod minix.mod hfs.mod jfs.mod iso9660.mod xfs.mod \ affs.mod sfs.mod hfsplus.mod reiserfs.mod cpio.mod tar.mod \ - udf.mod afs.mod befs.mod + udf.mod afs.mod afs_be.mod befs.mod befs_be.mod # For fshelp.mod. fshelp_mod_SOURCES = fs/fshelp.c @@ -279,43 +274,52 @@ afs_mod_SOURCES = fs/afs.c afs_mod_CFLAGS = $(COMMON_CFLAGS) afs_mod_LDFLAGS = $(COMMON_LDFLAGS) +# For afs_be.mod. +afs_be_mod_SOURCES = fs/afs_be.c +afs_be_mod_CFLAGS = $(COMMON_CFLAGS) +afs_be_mod_LDFLAGS = $(COMMON_LDFLAGS) + # For befs.mod. befs_mod_SOURCES = fs/befs.c befs_mod_CFLAGS = $(COMMON_CFLAGS) befs_mod_LDFLAGS = $(COMMON_LDFLAGS) +# For befs_be.mod. +befs_be_mod_SOURCES = fs/befs_be.c +befs_be_mod_CFLAGS = $(COMMON_CFLAGS) +befs_be_mod_LDFLAGS = $(COMMON_LDFLAGS) + # Partition maps. -pkglib_MODULES += amiga.mod apple.mod pc.mod sun.mod acorn.mod gpt.mod -# For amiga.mod -amiga_mod_SOURCES = partmap/amiga.c -amiga_mod_CFLAGS = $(COMMON_CFLAGS) -amiga_mod_LDFLAGS = $(COMMON_LDFLAGS) +pkglib_MODULES += part_amiga.mod +part_amiga_mod_SOURCES = partmap/amiga.c +part_amiga_mod_CFLAGS = $(COMMON_CFLAGS) +part_amiga_mod_LDFLAGS = $(COMMON_LDFLAGS) -# For apple.mod -apple_mod_SOURCES = partmap/apple.c -apple_mod_CFLAGS = $(COMMON_CFLAGS) -apple_mod_LDFLAGS = $(COMMON_LDFLAGS) +pkglib_MODULES += part_apple.mod +part_apple_mod_SOURCES = partmap/apple.c +part_apple_mod_CFLAGS = $(COMMON_CFLAGS) +part_apple_mod_LDFLAGS = $(COMMON_LDFLAGS) -# For pc.mod -pc_mod_SOURCES = partmap/pc.c -pc_mod_CFLAGS = $(COMMON_CFLAGS) -pc_mod_LDFLAGS = $(COMMON_LDFLAGS) +pkglib_MODULES += part_msdos.mod +part_msdos_mod_SOURCES = partmap/msdos.c +part_msdos_mod_CFLAGS = $(COMMON_CFLAGS) +part_msdos_mod_LDFLAGS = $(COMMON_LDFLAGS) -# For sun.mod -sun_mod_SOURCES = partmap/sun.c -sun_mod_CFLAGS = $(COMMON_CFLAGS) -sun_mod_LDFLAGS = $(COMMON_LDFLAGS) +pkglib_MODULES += part_sun.mod +part_sun_mod_SOURCES = partmap/sun.c +part_sun_mod_CFLAGS = $(COMMON_CFLAGS) +part_sun_mod_LDFLAGS = $(COMMON_LDFLAGS) -# For acorn.mod -acorn_mod_SOURCES = partmap/acorn.c -acorn_mod_CFLAGS = $(COMMON_CFLAGS) -acorn_mod_LDFLAGS = $(COMMON_LDFLAGS) +pkglib_MODULES += part_acorn.mod +part_acorn_mod_SOURCES = partmap/acorn.c +part_acorn_mod_CFLAGS = $(COMMON_CFLAGS) +part_acorn_mod_LDFLAGS = $(COMMON_LDFLAGS) -# For gpt.mod -gpt_mod_SOURCES = partmap/gpt.c -gpt_mod_CFLAGS = $(COMMON_CFLAGS) -gpt_mod_LDFLAGS = $(COMMON_LDFLAGS) +pkglib_MODULES += part_gpt.mod +part_gpt_mod_SOURCES = partmap/gpt.c +part_gpt_mod_CFLAGS = $(COMMON_CFLAGS) +part_gpt_mod_LDFLAGS = $(COMMON_LDFLAGS) # Special disk structures and generic drivers @@ -363,8 +367,14 @@ pkglib_MODULES += minicmd.mod extcmd.mod hello.mod handler.mod \ fs_file.mod fs_uuid.mod configfile.mod echo.mod \ terminfo.mod test.mod blocklist.mod hexdump.mod \ read.mod sleep.mod loadenv.mod crc.mod parttool.mod \ - pcpart.mod memrw.mod normal.mod sh.mod lua.mod \ - gptsync.mod true.mod probe.mod + msdospart.mod memrw.mod normal.mod sh.mod lua.mod \ + gptsync.mod true.mod probe.mod password.mod \ + keystatus.mod + +# For password.mod. +password_mod_SOURCES = commands/password.c +password_mod_CFLAGS = $(COMMON_CFLAGS) +password_mod_LDFLAGS = $(COMMON_LDFLAGS) # For gptsync.mod. gptsync_mod_SOURCES = commands/gptsync.c @@ -391,10 +401,10 @@ parttool_mod_SOURCES = commands/parttool.c parttool_mod_CFLAGS = $(COMMON_CFLAGS) parttool_mod_LDFLAGS = $(COMMON_LDFLAGS) -# For pcpart.mod. -pcpart_mod_SOURCES = parttool/pcpart.c -pcpart_mod_CFLAGS = $(COMMON_CFLAGS) -pcpart_mod_LDFLAGS = $(COMMON_LDFLAGS) +# For msdospart.mod. +msdospart_mod_SOURCES = parttool/msdospart.c +msdospart_mod_CFLAGS = $(COMMON_CFLAGS) +msdospart_mod_LDFLAGS = $(COMMON_LDFLAGS) # For handler.mod. handler_mod_SOURCES = commands/handler.c @@ -506,9 +516,14 @@ probe_mod_SOURCES = commands/probe.c probe_mod_CFLAGS = $(COMMON_CFLAGS) probe_mod_LDFLAGS = $(COMMON_LDFLAGS) +# For keystatus.mod. +keystatus_mod_SOURCES = commands/keystatus.c +keystatus_mod_CFLAGS = $(COMMON_CFLAGS) +keystatus_mod_LDFLAGS = $(COMMON_LDFLAGS) + # For normal.mod. normal_mod_SOURCES = normal/main.c normal/cmdline.c normal/dyncmd.c \ - normal/autofs.c normal/handler.c \ + normal/auth.c normal/autofs.c normal/handler.c \ normal/color.c normal/completion.c normal/datetime.c normal/menu.c \ normal/menu_entry.c normal/menu_text.c normal/menu_viewer.c \ normal/misc.c diff --git a/conf/i386-coreboot.rmk b/conf/i386-coreboot.rmk index ce2576b95..09ec7787c 100644 --- a/conf/i386-coreboot.rmk +++ b/conf/i386-coreboot.rmk @@ -32,7 +32,7 @@ kernel_img_SOURCES = kern/i386/coreboot/startup.S \ symlist.c 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 \ - partition.h pc_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 \ machine/boot.h machine/console.h machine/init.h \ machine/memory.h machine/loader.h list.h handler.h command.h kernel_img_CFLAGS = $(COMMON_CFLAGS) @@ -75,7 +75,7 @@ kernel_img_SOURCES = kern/i386/qemu/startup.S \ symlist.c 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 \ - partition.h pc_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 \ machine/boot.h machine/console.h machine/init.h \ machine/memory.h machine/loader.h list.h handler.h command.h kernel_img_CFLAGS = $(COMMON_CFLAGS) -DGRUB_BOOT_MACHINE_LINK_ADDR=$(GRUB_BOOT_MACHINE_LINK_ADDR) @@ -110,13 +110,16 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c \ commands/handler.c commands/ls.c commands/test.c \ commands/search.c commands/blocklist.c commands/hexdump.c \ commands/gptsync.c commands/probe.c commands/xnu_uuid.c \ + commands/password.c commands/keystatus.c \ lib/hexdump.c commands/i386/cpuid.c \ + lib/envblk.c commands/loadenv.c \ disk/host.c disk/loopback.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/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c \ - fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.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/fshelp.c \ io/gzio.c \ @@ -127,21 +130,21 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c \ kern/partition.c kern/reader.c kern/term.c \ kern/rescue_reader.c kern/rescue_parser.c \ lib/arg.c normal/cmdline.c normal/misc.c \ - normal/handler.c normal/autofs.c \ + normal/handler.c normal/auth.c normal/autofs.c \ normal/completion.c normal/datetime.c normal/main.c \ normal/menu_text.c \ normal/menu.c normal/menu_entry.c normal/menu_viewer.c \ normal/color.c \ script/sh/main.c script/sh/execute.c script/sh/function.c \ script/sh/lexer.c script/sh/script.c grub_script.tab.c \ - partmap/amiga.c partmap/apple.c partmap/pc.c partmap/sun.c \ + partmap/amiga.c partmap/apple.c partmap/msdos.c partmap/sun.c \ partmap/acorn.c partmap/gpt.c \ util/console.c util/hostfs.c util/grub-emu.c util/misc.c \ util/hostdisk.c util/getroot.c \ \ disk/raid.c disk/raid5_recover.c disk/raid6_recover.c \ disk/mdraid_linux.c disk/dmraid_nvidia.c disk/lvm.c \ - commands/parttool.c parttool/pcpart.c \ + commands/parttool.c parttool/msdospart.c \ grub_emu_init.c grub_emu_LDFLAGS = $(LIBCURSES) @@ -203,6 +206,13 @@ 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 play.mod. play_mod_SOURCES = commands/i386/pc/play.c play_mod_CFLAGS = $(COMMON_CFLAGS) diff --git a/conf/i386-efi.rmk b/conf/i386-efi.rmk index 6e3cbcf6d..99ab06f64 100644 --- a/conf/i386-efi.rmk +++ b/conf/i386-efi.rmk @@ -23,7 +23,7 @@ util/i386/efi/grub-mkimage.c_DEPENDENCIES = Makefile #grub_setup_SOURCES = util/i386/pc/grub-setup.c util/hostdisk.c \ # util/misc.c util/getroot.c kern/device.c kern/disk.c \ # kern/err.c kern/misc.c fs/fat.c fs/ext2.c fs/xfs.c fs/affs.c \ -# fs/sfs.c kern/parser.c kern/partition.c partmap/pc.c \ +# fs/sfs.c kern/parser.c kern/partition.c partmap/msdos.c \ # fs/ufs.c fs/ufs2.c fs/minix.c fs/hfs.c fs/jfs.c fs/hfsplus.c kern/file.c \ # kern/fs.c kern/env.c fs/fshelp.c @@ -37,14 +37,17 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c \ commands/configfile.c commands/help.c \ commands/handler.c commands/ls.c commands/test.c \ commands/search.c commands/hexdump.c lib/hexdump.c \ - commands/halt.c commands/reboot.c \ + commands/halt.c commands/reboot.c commands/keystatus.c \ commands/i386/cpuid.c \ + commands/password.c \ + lib/envblk.c commands/loadenv.c \ disk/loopback.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/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c \ - fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.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 \ \ io/gzio.c \ kern/device.c kern/disk.c kern/dl.c kern/elf.c kern/env.c \ @@ -54,21 +57,21 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c \ kern/partition.c kern/reader.c kern/term.c \ kern/rescue_reader.c kern/rescue_parser.c \ lib/arg.c normal/cmdline.c normal/command.c normal/datetime.c \ - normal/autofs.c \ + normal/auth.c normal/autofs.c \ normal/completion.c normal/context.c normal/main.c \ normal/menu.c normal/menu_entry.c normal/menu_viewer.c \ normal/menu_text.c \ normal/color.c \ script/sh/main.c script/sh/execute.c script/sh/function.c \ script/sh/lexer.c script/sh/script.c grub_script.tab.c \ - partmap/amiga.c partmap/apple.c partmap/pc.c partmap/sun.c \ + partmap/amiga.c partmap/apple.c partmap/msdos.c partmap/sun.c \ partmap/acorn.c partmap/gpt.c \ util/console.c util/hostfs.c util/grub-emu.c util/misc.c \ util/hostdisk.c util/getroot.c \ \ disk/raid.c disk/raid5_recover.c disk/raid6_recover.c \ disk/mdraid_linux.c disk/dmraid_nvidia.c disk/lvm.c \ - commands/parttool.c parttool/pcpart.c \ + commands/parttool.c parttool/msdospart.c \ grub_emu_init.c grub_emu_LDFLAGS = $(LIBCURSES) @@ -100,7 +103,7 @@ kernel_mod_SOURCES = kern/i386/efi/startup.S kern/main.c kern/device.c \ kern/generic/millisleep.c kernel_mod_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 \ - partition.h pc_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 \ efi/efi.h efi/time.h efi/disk.h i386/pit.h list.h handler.h command.h kernel_mod_CFLAGS = $(COMMON_CFLAGS) kernel_mod_ASFLAGS = $(COMMON_ASFLAGS) diff --git a/conf/i386-ieee1275.rmk b/conf/i386-ieee1275.rmk index 65d1c6bde..4b640de49 100644 --- a/conf/i386-ieee1275.rmk +++ b/conf/i386-ieee1275.rmk @@ -31,7 +31,7 @@ kernel_img_SOURCES = kern/i386/ieee1275/startup.S \ symlist.c kernel_img_HEADERS = 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 \ - partition.h pc_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 \ ieee1275/ieee1275.h machine/kernel.h machine/loader.h machine/memory.h \ list.h handler.h command.h kernel_img_CFLAGS = $(COMMON_CFLAGS) @@ -64,14 +64,17 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c \ commands/handler.c commands/ls.c commands/test.c \ commands/search.c commands/blocklist.c commands/hexdump.c \ lib/hexdump.c commands/halt.c commands/reboot.c \ + lib/envblk.c commands/loadenv.c \ commands/gptsync.c commands/probe.c commands/xnu_uuid.c \ commands/i386/cpuid.c \ + commands/password.c commands/keystatus.c \ disk/host.c disk/loopback.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/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c \ - fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.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/fshelp.c \ io/gzio.c \ @@ -82,13 +85,13 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c \ kern/partition.c kern/reader.c kern/term.c \ kern/rescue_reader.c kern/rescue_parser.c \ lib/arg.c normal/cmdline.c normal/datetime.c normal/misc.c \ - normal/handler.c normal/autofs.c \ + normal/handler.c normal/auth.c normal/autofs.c \ normal/completion.c normal/main.c normal/menu_text.c \ normal/menu.c normal/menu_entry.c normal/menu_viewer.c \ normal/color.c \ script/sh/main.c script/sh/execute.c script/sh/function.c \ script/sh/lexer.c script/sh/script.c grub_script.tab.c \ - partmap/amiga.c partmap/apple.c partmap/pc.c partmap/sun.c \ + partmap/amiga.c partmap/apple.c partmap/msdos.c partmap/sun.c \ partmap/acorn.c partmap/gpt.c \ util/console.c util/hostfs.c util/grub-emu.c util/misc.c \ util/hostdisk.c util/getroot.c \ diff --git a/conf/i386-pc.rmk b/conf/i386-pc.rmk index 0ef5e4730..bf8fbfb9d 100644 --- a/conf/i386-pc.rmk +++ b/conf/i386-pc.rmk @@ -61,7 +61,7 @@ kernel_img_SOURCES = kern/i386/pc/startup.S \ symlist.c 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 \ - partition.h pc_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 \ machine/biosdisk.h machine/boot.h machine/console.h machine/init.h \ machine/memory.h machine/loader.h machine/vga.h machine/vbe.h \ machine/kernel.h machine/pxe.h i386/pit.h list.h handler.h command.h @@ -102,9 +102,10 @@ grub_setup_SOURCES = util/i386/pc/grub-setup.c util/hostdisk.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/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c \ - fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.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 \ \ - partmap/pc.c partmap/gpt.c \ + partmap/msdos.c partmap/gpt.c \ \ disk/raid.c disk/mdraid_linux.c disk/lvm.c \ util/raid.c util/lvm.c \ @@ -121,8 +122,10 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c \ commands/handler.c commands/ls.c commands/test.c \ commands/search.c commands/blocklist.c commands/hexdump.c \ lib/hexdump.c commands/i386/pc/halt.c commands/reboot.c \ + lib/envblk.c commands/loadenv.c \ commands/gptsync.c commands/probe.c commands/xnu_uuid.c \ commands/i386/cpuid.c \ + commands/password.c commands/keystatus.c \ disk/host.c disk/loopback.c disk/scsi.c \ fs/fshelp.c \ \ @@ -134,26 +137,27 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c \ kern/partition.c kern/reader.c kern/term.c \ kern/rescue_reader.c kern/rescue_parser.c \ lib/arg.c normal/cmdline.c normal/datetime.c normal/misc.c \ - normal/handler.c normal/autofs.c \ + normal/handler.c normal/auth.c normal/autofs.c \ normal/completion.c normal/main.c normal/color.c \ normal/menu.c normal/menu_entry.c normal/menu_viewer.c \ normal/menu_text.c \ script/sh/main.c script/sh/execute.c script/sh/function.c \ script/sh/lexer.c script/sh/script.c grub_script.tab.c \ - partmap/amiga.c partmap/apple.c partmap/pc.c partmap/sun.c \ + partmap/amiga.c partmap/apple.c partmap/msdos.c partmap/sun.c \ partmap/acorn.c partmap/gpt.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/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c \ - fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.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 \ \ util/console.c util/hostfs.c util/grub-emu.c util/misc.c \ util/hostdisk.c util/getroot.c \ \ disk/raid.c disk/raid5_recover.c disk/raid6_recover.c \ disk/mdraid_linux.c disk/dmraid_nvidia.c disk/lvm.c \ - commands/parttool.c parttool/pcpart.c \ + commands/parttool.c parttool/msdospart.c \ grub_emu_init.c grub_emu_LDFLAGS = $(LIBCURSES) diff --git a/conf/powerpc-ieee1275.rmk b/conf/powerpc-ieee1275.rmk index c30f61a48..ee7f9ec27 100644 --- a/conf/powerpc-ieee1275.rmk +++ b/conf/powerpc-ieee1275.rmk @@ -16,7 +16,7 @@ DEFSYMFILES += kernel_syms.lst 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 misc.h mm.h net.h parser.h reader.h \ symbol.h term.h time.h types.h powerpc/libgcc.h loader.h partition.h \ - pc_partition.h ieee1275/ieee1275.h machine/kernel.h handler.h list.h \ + msdos_partition.h ieee1275/ieee1275.h machine/kernel.h handler.h list.h \ command.h symlist.c: $(addprefix include/grub/,$(kernel_img_HEADERS)) config.h gensymlist.sh @@ -45,13 +45,16 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c \ commands/search.c commands/handler.c commands/test.c \ commands/ls.c commands/blocklist.c commands/hexdump.c \ lib/hexdump.c commands/halt.c commands/reboot.c \ + lib/envblk.c commands/loadenv.c \ commands/gptsync.c commands/probe.c commands/xnu_uuid.c \ + commands/password.c commands/keystatus.c \ disk/loopback.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/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c \ - fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.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 \ \ io/gzio.c \ kern/device.c kern/disk.c kern/dl.c kern/elf.c kern/env.c \ @@ -62,21 +65,21 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c \ kern/command.c kern/corecmd.c commands/extcmd.c \ lib/arg.c normal/cmdline.c normal/datetime.c \ normal/completion.c normal/misc.c \ - normal/handler.c normal/autofs.c normal/main.c \ + normal/handler.c normal/auth.c normal/autofs.c normal/main.c \ normal/menu.c \ normal/menu_text.c \ normal/menu_entry.c normal/menu_viewer.c \ normal/color.c \ script/sh/main.c script/sh/execute.c script/sh/function.c \ script/sh/lexer.c script/sh/script.c \ - partmap/amiga.c partmap/apple.c partmap/pc.c partmap/sun.c \ + partmap/amiga.c partmap/apple.c partmap/msdos.c partmap/sun.c \ partmap/acorn.c \ util/console.c util/hostfs.c util/grub-emu.c util/misc.c \ util/hostdisk.c util/getroot.c \ \ disk/raid.c disk/raid5_recover.c disk/raid6_recover.c \ disk/mdraid_linux.c disk/dmraid_nvidia.c disk/lvm.c \ - commands/parttool.c parttool/pcpart.c \ + commands/parttool.c parttool/msdospart.c \ grub_script.tab.c grub_emu_init.c grub_emu_LDFLAGS = $(LIBCURSES) diff --git a/conf/sparc64-ieee1275.rmk b/conf/sparc64-ieee1275.rmk index b26496d20..62e951a5e 100644 --- a/conf/sparc64-ieee1275.rmk +++ b/conf/sparc64-ieee1275.rmk @@ -28,7 +28,7 @@ DEFSYMFILES += kernel_syms.lst 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 \ - partition.h pc_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 \ sparc64/libgcc.h ieee1275/ieee1275.h machine/kernel.h \ sparc64/ieee1275/ieee1275.h @@ -78,9 +78,10 @@ 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/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/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.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 \ \ - partmap/amiga.c partmap/apple.c partmap/pc.c \ + partmap/amiga.c partmap/apple.c partmap/msdos.c \ partmap/sun.c partmap/acorn.c \ \ disk/raid.c disk/mdraid_linux.c disk/lvm.c \ @@ -102,13 +103,16 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c \ commands/search.c commands/handler.c commands/test.c \ commands/ls.c commands/blocklist.c commands/hexdump.c \ lib/hexdump.c commands/halt.c commands/reboot.c \ + lib/envblk.c commands/loadenv.c \ commands/gptsync.c commands/probe.c commands/xnu_uuid.c \ + commands/password.c commands/keystatus.c \ disk/loopback.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/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c \ - fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/befs.c fs/tar.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 \ \ io/gzio.c \ kern/device.c kern/disk.c kern/dl.c kern/elf.c kern/env.c \ @@ -119,21 +123,21 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c \ kern/command.c kern/corecmd.c commands/extcmd.c \ lib/arg.c normal/cmdline.c normal/datetime.c \ normal/completion.c normal/misc.c \ - normal/handler.c normal/autofs.c normal/main.c \ + normal/handler.c normal/auth.c normal/autofs.c normal/main.c \ normal/menu.c \ normal/menu_text.c \ normal/menu_entry.c normal/menu_viewer.c \ normal/color.c \ script/sh/main.c script/sh/execute.c script/sh/function.c \ script/sh/lexer.c script/sh/script.c \ - partmap/amiga.c partmap/apple.c partmap/pc.c partmap/sun.c \ + partmap/amiga.c partmap/apple.c partmap/msdos.c partmap/sun.c \ partmap/acorn.c \ util/console.c util/hostfs.c util/grub-emu.c util/misc.c \ util/hostdisk.c util/getroot.c \ \ disk/raid.c disk/raid5_recover.c disk/raid6_recover.c \ disk/mdraid_linux.c disk/dmraid_nvidia.c disk/lvm.c \ - commands/parttool.c parttool/pcpart.c \ + commands/parttool.c parttool/msdospart.c \ grub_script.tab.c grub_emu_init.c grub_emu_LDFLAGS = $(LIBCURSES) diff --git a/conf/x86_64-efi.rmk b/conf/x86_64-efi.rmk index 71a90ce18..934cd7284 100644 --- a/conf/x86_64-efi.rmk +++ b/conf/x86_64-efi.rmk @@ -22,7 +22,7 @@ grub_mkimage_SOURCES = util/i386/efi/grub-mkimage.c util/misc.c \ #grub_setup_SOURCES = util/i386/pc/grub-setup.c util/hostdisk.c \ # util/misc.c util/getroot.c kern/device.c kern/disk.c \ # kern/err.c kern/misc.c fs/fat.c fs/ext2.c fs/xfs.c fs/affs.c \ -# fs/sfs.c kern/parser.c kern/partition.c partmap/pc.c \ +# fs/sfs.c kern/parser.c kern/partition.c partmap/msdos.c \ # fs/ufs.c fs/ufs2.c fs/minix.c fs/hfs.c fs/jfs.c fs/hfsplus.c kern/file.c \ # kern/fs.c kern/env.c fs/fshelp.c @@ -37,12 +37,14 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c \ commands/search.c commands/hexdump.c lib/hexdump.c \ commands/halt.c commands/reboot.c \ commands/i386/cpuid.c \ + commands/password.c commands/keystatus.c \ + lib/envblk.c commands/loadenv.c \ disk/loopback.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/ntfs.c fs/ntfscomp.c fs/reiserfs.c fs/sfs.c \ - fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c \ + fs/ufs.c fs/ufs2.c fs/xfs.c fs/afs.c fs/afs_be.c \ \ io/gzio.c \ kern/device.c kern/disk.c kern/dl.c kern/elf.c kern/env.c \ @@ -50,7 +52,8 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c \ kern/command.c kern/corecmd.c commands/extcmd.c kern/file.c \ kern/fs.c commands/boot.c kern/main.c kern/misc.c kern/parser.c \ kern/partition.c kern/readerescue.c kern/term.c \ - lib/arg.c normal/cmdline.c normal/misc.c normal/autofs.c \ + lib/arg.c normal/cmdline.c normal/misc.c normal/auth.c \ + normal/autofs.c \ normal/completion.c normal/datetime.c normal/context.c \ normal/main.c \ normal/menu.c normal/menu_entry.c normal/menu_viewer.c \ @@ -58,14 +61,14 @@ grub_emu_SOURCES = commands/minicmd.c commands/cat.c commands/cmp.c \ normal/color.c \ script/sh/main.c script/sh/execute.c script/sh/function.c \ script/sh/lexer.c script/sh/script.c grub_script.tab.c \ - partmap/amiga.c partmap/apple.c partmap/pc.c partmap/sun.c \ + partmap/amiga.c partmap/apple.c partmap/msdos.c partmap/sun.c \ partmap/acorn.c partmap/gpt.c \ util/console.c util/hostfs.c util/grub-emu.c util/misc.c \ util/hostdisk.c util/getroot.c \ \ disk/raid.c disk/raid5_recover.c disk/raid6_recover.c \ disk/mdraid_linux.c disk/dmraid_nvidia.c disk/lvm.c \ - commands/parttool.c parttool/pcpart.c \ + commands/parttool.c parttool/msdospart.c \ grub_emu_init.c grub_emu_LDFLAGS = $(LIBCURSES) @@ -97,7 +100,7 @@ kernel_mod_SOURCES = kern/x86_64/efi/startup.S kern/x86_64/efi/callwrap.S \ term/efi/console.c disk/efi/efidisk.c kernel_mod_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 \ - partition.h pc_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 \ efi/efi.h efi/time.h efi/disk.h machine/loader.h i386/pit.h list.h \ handler.h command.h kernel_mod_CFLAGS = $(COMMON_CFLAGS) diff --git a/config.guess b/config.guess index 3f51f4ea9..bb0b03ea1 100644 --- a/config.guess +++ b/config.guess @@ -1,10 +1,10 @@ #! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 # Free Software Foundation, Inc. -timestamp='2008-12-19' +timestamp='2009-08-19' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -27,16 +27,16 @@ timestamp='2008-12-19' # the same distribution terms that you use for the rest of that program. -# Originally written by Per Bothner . -# Please send patches to . Submit a context -# diff and a properly formatted ChangeLog entry. +# Originally written by Per Bothner. Please send patches (context +# diff format) to and include a ChangeLog +# entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # -# The plan is that this can be called by configure scripts if you -# don't specify an explicit build system type. +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD me=`echo "$0" | sed -e 's,.*/,,'` @@ -170,7 +170,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep __ELF__ >/dev/null + | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? @@ -324,6 +324,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; @@ -653,7 +656,7 @@ EOF # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | - grep __LP64__ >/dev/null + grep -q __LP64__ then HP_ARCH="hppa2.0w" else @@ -819,6 +822,9 @@ EOF [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we @@ -879,40 +885,17 @@ EOF m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; - mips:Linux:*:*) + mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU - #undef mips - #undef mipsel + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=mipsel + CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=mips - #else - CPU= - #endif - #endif -EOF - eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' - /^CPU/{ - s: ::g - p - }'`" - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } - ;; - mips64:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #undef CPU - #undef mips64 - #undef mips64el - #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=mips64el - #else - #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=mips64 + CPU=${UNAME_MACHINE} #else CPU= #endif @@ -944,7 +927,7 @@ EOF EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac - objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null + objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; @@ -998,14 +981,6 @@ EOF elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; - a.out-i386-linux) - echo "${UNAME_MACHINE}-pc-linux-gnuaout" - exit ;; - "") - # Either a pre-BFD a.out linker (linux-gnuoldld) or - # one that does not give us useful --help. - echo "${UNAME_MACHINE}-pc-linux-gnuoldld" - exit ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build @@ -1071,7 +1046,7 @@ EOF i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; - i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) @@ -1115,8 +1090,11 @@ EOF pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about - # the processor, so we play safe by assuming i386. - echo i386-pc-msdosdjgpp + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configury will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 @@ -1176,7 +1154,7 @@ EOF rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; - PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) @@ -1350,6 +1328,9 @@ EOF i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 diff --git a/config.sub b/config.sub index d8573e81c..8ca084bf3 100644 --- a/config.sub +++ b/config.sub @@ -1,10 +1,10 @@ #! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 # Free Software Foundation, Inc. -timestamp='2009-01-19' +timestamp='2009-08-19' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software @@ -32,13 +32,16 @@ timestamp='2009-01-19' # Please send patches to . Submit a context -# diff and a properly formatted ChangeLog entry. +# diff and a properly formatted GNU ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. @@ -149,10 +152,13 @@ case $os in -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis | -knuth | -cray) + -apple | -axis | -knuth | -cray | -microblaze) os= basic_machine=$1 ;; + -bluegene*) + os=-cnk + ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 @@ -272,6 +278,7 @@ case $basic_machine in | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ + | moxie \ | mt \ | msp430 \ | nios | nios2 \ @@ -336,7 +343,7 @@ case $basic_machine in | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ @@ -446,6 +453,10 @@ case $basic_machine in basic_machine=m68k-apollo os=-bsd ;; + aros) + basic_machine=i386-pc + os=-aros + ;; aux) basic_machine=m68k-apple os=-aux @@ -462,6 +473,10 @@ case $basic_machine in basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; c90) basic_machine=c90-cray os=-unicos @@ -714,6 +729,9 @@ case $basic_machine in basic_machine=ns32k-utek os=-sysv ;; + microblaze) + basic_machine=microblaze-xilinx + ;; mingw32) basic_machine=i386-pc os=-mingw32 @@ -1255,11 +1273,11 @@ case $os in # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ - | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ - | -aos* \ + | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ @@ -1608,7 +1626,7 @@ case $basic_machine in -sunos*) vendor=sun ;; - -aix*) + -cnk*|-aix*) vendor=ibm ;; -beos*) diff --git a/configure.ac b/configure.ac index 549b35c9b..59e8510d3 100644 --- a/configure.ac +++ b/configure.ac @@ -31,7 +31,7 @@ dnl (such as TARGET_CC, TARGET_CFLAGS, etc.) are used for the target dnl type. -AC_INIT([GRUB],[1.96],[bug-grub@gnu.org]) +AC_INIT([GRUB],[1.97~beta3],[bug-grub@gnu.org]) AC_PREREQ(2.59) AC_CONFIG_SRCDIR([include/grub/dl.h]) AC_CONFIG_HEADER([config.h]) @@ -147,7 +147,6 @@ AC_PROG_MAKE_SET # These are not a "must". AC_PATH_PROG(RUBY, ruby) -AC_PATH_PROG(HELP2MAN, help2man) # # Checks for host programs. @@ -171,6 +170,12 @@ if test x$grub_cv_apple_cc = xyes ; then ASFLAGS="$ASFLAGS -DAPPLE_CC=1" fi +if test "x$cross_compiling" = xyes; then + AC_MSG_WARN([cannot generate manual pages while cross compiling]) +else + AC_PATH_PROG(HELP2MAN, help2man) +fi + # Check for functions. AC_CHECK_FUNCS(posix_memalign memalign asprintf) @@ -246,6 +251,23 @@ if test "x$TARGET_CFLAGS" = x; then TARGET_CFLAGS="$TARGET_CFLAGS -malign-jumps=1 -malign-loops=1 -malign-functions=1" fi fi + + # By default, GCC 4.4 generates .eh_frame sections containing unwind + # information in some cases where it previously did not. GRUB doesn't need + # these and they just use up vital space. Restore the old compiler + # behaviour. + AC_CACHE_CHECK([whether -fno-dwarf2-cfi-asm works], [grub_cv_cc_fno_dwarf2_cfi_asm], [ + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fno-dwarf2-cfi-asm" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], + [grub_cv_cc_fno_dwarf2_cfi_asm=yes], + [grub_cv_cc_fno_dwarf2_cfi_asm=no]) + CFLAGS="$SAVE_CFLAGS" + ]) + + if test "x$grub_cv_cc_fno_dwarf2_cfi_asm" = xyes; then + TARGET_CFLAGS="$TARGET_CFLAGS -fno-dwarf2-cfi-asm" + fi fi grub_apple_target_cc @@ -346,6 +368,14 @@ fi # Need __enable_execute_stack() for nested function trampolines? grub_CHECK_ENABLE_EXECUTE_STACK +# Position independent executable. +grub_CHECK_PIE +[# Need that, because some distributions ship compilers that include +# `-fPIE' in the default specs. +if [ x"$pie_possible" = xyes ]; then + TARGET_CFLAGS="$TARGET_CFLAGS -fno-PIE" +fi] + # Smashing stack protector. grub_CHECK_STACK_PROTECTOR # Need that, because some distributions ship compilers that include @@ -360,6 +390,13 @@ if test x"$sap_possible" = xyes; then TARGET_CFLAGS="$TARGET_CFLAGS -mno-stack-arg-probe" fi +AC_ARG_ENABLE([werror], + [AS_HELP_STRING([--disable-werror], + [do not use -Werror when building GRUB])]) +if test x"$enable_werror" != xno ; then + TARGET_CFLAGS="$TARGET_CFLAGS -Werror" +fi + AC_SUBST(TARGET_CFLAGS) AC_SUBST(TARGET_MODULE_FORMAT) AC_SUBST(OBJCONV) @@ -527,11 +564,6 @@ enable_grub_fstest=no fi AC_SUBST([enable_grub_fstest]) -AC_ARG_ENABLE([grub-pe2elf], - [AS_HELP_STRING([--enable-grub-pe2elf], - [build and install the `grub-pe2elf' conversion utility])]) -AC_SUBST([enable_grub_pe2elf]) - AC_ARG_ENABLE([grub-mkfont], [AS_HELP_STRING([--enable-grub-mkfont], [build and install the `grub-mkfont' utility (default=guessed)])]) @@ -596,13 +628,6 @@ echo With memory debugging: Yes else echo With memory debugging: No fi -if [ x"$enable_grub_pe2elf" = xyes ]; then -echo grub-pe2elf will be built and installed -elif [ x$TARGET_OBJ2ELF = xgrub-pe2elf ]; then -echo grub-pe2elf will be built but not installed -else -echo grub-pe2elf will not be built -fi if [ x"$efiemu_excuse" = x ]; then echo efiemu runtime: Yes else diff --git a/docs/grub.cfg b/docs/grub.cfg index 7f02727d0..4d1582a8e 100644 --- a/docs/grub.cfg +++ b/docs/grub.cfg @@ -62,6 +62,12 @@ menuentry "Microsoft Windows" { chainloader +1 } +# For booting Memtest86+ +menuentry "Memtest86+" { + set root=(hd0,1) + linux16 /memtest86+.bin +} + # Change the colors. menuentry "Change the colors" { set menu_color_normal=light-green/brown diff --git a/docs/grub.texi b/docs/grub.texi index e3f412565..06059df4d 100644 --- a/docs/grub.texi +++ b/docs/grub.texi @@ -20,7 +20,7 @@ This manual is for GNU GRUB (version @value{VERSION}, @value{UPDATED}). -Copyright @copyright{} 1999,2000,2001,2002,2004,2006,2008 Free Software Foundation, Inc. +Copyright @copyright{} 1999,2000,2001,2002,2004,2006,2008,2009 Free Software Foundation, Inc. @quotation Permission is granted to copy, distribute and/or modify this document @@ -356,25 +356,25 @@ disk. The number @samp{0} is the drive number, which is counted from disk. @example -(hd0,1) +(hd0,2) @end example Here, @samp{hd} means it is a hard disk drive. The first integer @samp{0} indicates the drive number, that is, the first hard disk, while the second integer, @samp{1}, indicates the partition number (or the -@sc{pc} slice number in the BSD terminology). Once again, please note -that the partition numbers are counted from @emph{zero}, not from -one. This expression means the second partition of the first hard disk -drive. In this case, GRUB uses one partition of the disk, instead of the -whole disk. +@sc{pc} slice number in the BSD terminology). The partition numbers are +counted from @emph{one}, not from zero (as was the case in previous +versions of GRUB). This expression means the second partition of the +first hard disk drive. In this case, GRUB uses one partition of the +disk, instead of the whole disk. @example -(hd0,4) +(hd0,5) @end example This specifies the first @dfn{extended partition} of the first hard disk drive. Note that the partition numbers for extended partitions are -counted from @samp{4}, regardless of the actual number of primary +counted from @samp{5}, regardless of the actual number of primary partitions on your hard disk. @example @@ -383,13 +383,13 @@ partitions on your hard disk. This means the BSD @samp{a} partition of the second hard disk. If you need to specify which @sc{pc} slice number should be used, use something -like this: @samp{(hd1,0,a)}. If the @sc{pc} slice number is omitted, +like this: @samp{(hd1,1,a)}. If the @sc{pc} slice number is omitted, GRUB searches for the first @sc{pc} slice which has a BSD @samp{a} partition. Of course, to actually access the disks or partitions with GRUB, you need to use the device specification in a command, like @samp{root -(fd0)} or @samp{unhide (hd0,2)}. To help you find out which number +(fd0)} or @samp{unhide (hd0,3)}. To help you find out which number specifies a partition you want, the GRUB command-line (@pxref{Command-line interface}) options have argument completion. This means that, for example, you only need to type @@ -413,7 +413,7 @@ Now the question is, how to specify a file? Again, consider an example: @example -(hd0,0)/vmlinuz +(hd0,1)/vmlinuz @end example This specifies the file named @samp{vmlinuz}, found on the first @@ -550,7 +550,7 @@ which can cause compatibility problems. For booting from a CD-ROM, GRUB uses a special Stage 2 called @file{stage2_eltorito}. The only GRUB files you need to have in your bootable CD-ROM are this @file{stage2_eltorito} and optionally a config file -@file{menu.lst}. You don't need to use @file{stage1} or @file{stage2}, +@file{grub.cfg}. You don't need to use @file{stage1} or @file{stage2}, because El Torito is quite different from the standard boot process. Here is an example of procedures to make a bootable CD-ROM @@ -573,7 +573,7 @@ Copy the file @file{stage2_eltorito}: $ @kbd{cp /usr/lib/grub/i386-pc/stage2_eltorito iso/boot/grub} @end example -If desired, make the config file @file{menu.lst} under @file{iso/boot/grub} +If desired, make the config file @file{grub.cfg} under @file{iso/boot/grub} (@pxref{Configuration}), and copy any files and directories for the disc to the directory @file{iso/}. @@ -786,7 +786,7 @@ which is a BIOS drive number, so the following are equivalent: @end example @var{part-num} represents the partition number of @var{device}, starting -from zero for primary partitions and from four for extended partitions, +from one for primary partitions and from five for extended partitions, and @var{bsd-subpart-letter} represents the BSD disklabel subpartition, such as @samp{a} or @samp{e}. @@ -800,7 +800,7 @@ finds the subpartition @var{bsd-subpart-letter}. Here is an example: @end example The syntax @samp{(hd0)} represents using the entire disk (or the -MBR when installing GRUB), while the syntax @samp{(hd0,0)} +MBR when installing GRUB), while the syntax @samp{(hd0,1)} represents using the first partition of the disk (or the boot sector of the partition when installing GRUB). @@ -820,12 +820,12 @@ There are two ways to specify files, by @dfn{absolute file name} and by An absolute file name resembles a Unix absolute file name, using @samp{/} for the directory separator (not @samp{\} as in DOS). One -example is @samp{(hd0,0)/boot/grub/menu.lst}. This means the file -@file{/boot/grub/menu.lst} in the first partition of the first hard +example is @samp{(hd0,1)/boot/grub/grub.cfg}. This means the file +@file{/boot/grub/grub.cfg} in the first partition of the first hard disk. If you omit the device name in an absolute file name, GRUB uses GRUB's @dfn{root device} implicitly. So if you set the root device to, -say, @samp{(hd1,0)} by the command @command{root} (@pxref{root}), then -@code{/boot/kernel} is the same as @code{(hd1,0)/boot/kernel}. +say, @samp{(hd1,1)} by the command @command{root} (@pxref{root}), then +@code{/boot/kernel} is the same as @code{(hd1,1)/boot/kernel}. @node Block list syntax @@ -846,8 +846,8 @@ the offset is zero. Like the file name syntax (@pxref{File name syntax}), if a blocklist does not contain a device name, then GRUB uses GRUB's @dfn{root -device}. So @code{(hd0,1)+1} is the same as @code{+1} when the root -device is @samp{(hd0,1)}. +device}. So @code{(hd0,2)+1} is the same as @code{+1} when the root +device is @samp{(hd0,2)}. @node Interface @@ -1110,17 +1110,56 @@ you forget a command, you can run the command @command{help} (@pxref{help}). @menu +* acpi:: Load ACPI tables +* blocklist:: Print a block list * boot:: Start up your operating system * cat:: Show the contents of a file * chainloader:: Chain-load another boot loader * cmp:: Compare two files * configfile:: Load a configuration file +* crc:: Calculate CRC32 checksums +* export:: Export an environment variable * halt:: Shut down your computer * help:: Show help messages +* insmod:: Insert a module +* keystatus:: Check key modifier status +* ls:: List devices or files * reboot:: Reboot your computer +* set:: Set an environment variable +* unset:: Unset an environment variable @end menu +@node acpi +@subsection acpi + +@deffn Command acpi [@option{-1}|@option{-2}] @ + [@option{--exclude=table1,@dots{}}|@option{--load-only=table1,@dots{}}] @ + [@option{--oemid=id}] [@option{--oemtable=table}] @ + [@option{--oemtablerev=rev}] [@option{--oemtablecreator=creator}] @ + [@option{--oemtablecreatorrev=rev}] [@option{--no-ebda}] @ + filename @dots{} +Modern BIOS systems normally implement the Advanced Configuration and Power +Interface (ACPI), and define various tables that describe the interface +between an ACPI-compliant operating system and the firmware. In some cases, +the tables provided by default only work well with certain operating +systems, and it may be necessary to replace some of them. + +Normally, this command will replace the Root System Description Pointer +(RSDP) in the Extended BIOS Data Area to point to the new tables. If the +@option{--no-ebda} option is used, the new tables will be known only to +GRUB, but may be used by GRUB's EFI emulation. +@end deffn + + +@node blocklist +@subsection blocklist + +@deffn Command blocklist file +Print a block list (@pxref{Block list syntax}) for @var{file}. +@end deffn + + @node boot @subsection boot @@ -1187,6 +1226,23 @@ Load @var{file} as a configuration file. @end deffn +@node crc +@subsection crc + +@deffn Command crc file +Display the CRC32 checksum of @var{file}. +@end deffn + + +@node export +@subsection export + +@deffn Command export envvar +Export the environment variable @var{envvar}. Exported variables are visible +to subsidiary configuration files loaded using @command{configfile}. +@end deffn + + @node halt @subsection halt @@ -1212,6 +1268,44 @@ about each of the commands which match those @var{patterns}. @end deffn +@node insmod +@subsection insmod + +@deffn Command insmod module +Insert the dynamic GRUB module called @var{module}. +@end deffn + + +@node keystatus +@subsection keystatus + +@deffn Command keystatus [@option{--shift}] [@option{--ctrl}] [@option{--alt}] +Return true if the Shift, Control, or Alt modifier keys are held down, as +requested by options. This is useful in scripting, to allow some user +control over behaviour without having to wait for a keypress. + +Checking key modifier status is only supported on some platforms. If invoked +without any options, the @command{keystatus} command returns true if and +only if checking key modifier status is supported. +@end deffn + + +@node ls +@subsection ls + +@deffn Command ls [arg] +List devices or files. + +With no arguments, print all devices known to GRUB. + +If the argument is a device name enclosed in parentheses (@pxref{Device +syntax}), then list all files at the root directory of that device. + +If the argument is a directory given as an absolute file name (@pxref{File +name syntax}), then list the contents of that directory. +@end deffn + + @node reboot @subsection reboot @@ -1220,6 +1314,23 @@ Reboot the computer. @end deffn +@node set +@subsection set + +@deffn Command set [envvar=value] +Set the environment variable @var{envvar} to @var{value}. If invoked with no +arguments, print all environment variables with their values. +@end deffn + + +@node unset +@subsection unset + +@deffn Command unset envvar +Unset the environment variable @var{envvar}. +@end deffn + + @node Invoking grub-install @chapter Invoking grub-install diff --git a/docs/version.texi b/docs/version.texi index 5a03fa3c9..65ec1301d 100644 --- a/docs/version.texi +++ b/docs/version.texi @@ -1,4 +1,4 @@ @set UPDATED 7 Ago 2009 @set UPDATED-MONTH Ago 2009 -@set EDITION 1.97~snapshot -@set VERSION 1.97~snapshot +@set EDITION 1.97~beta3 +@set VERSION 1.97~beta3 diff --git a/efiemu/loadcore.c b/efiemu/loadcore.c index ee4c80649..4bf26ee44 100644 --- a/efiemu/loadcore.c +++ b/efiemu/loadcore.c @@ -352,13 +352,18 @@ SUFFIX (grub_efiemu_loadcore_load) (void *core, grub_efiemu_segment_t segments) { grub_err_t err; - if ((err = grub_efiemu_load_segments (segments, core))) + err = grub_efiemu_load_segments (segments, core); + if (err) return err; - if ((err = grub_efiemu_resolve_symbols (segments, core))) + + err = grub_efiemu_resolve_symbols (segments, core); + if (err) return err; - if ((err = SUFFIX (grub_arch_efiemu_relocate_symbols) (segments, - grub_efiemu_elfsyms, - core))) + + err = SUFFIX (grub_arch_efiemu_relocate_symbols) (segments, + grub_efiemu_elfsyms, + core); + if (err) return err; return GRUB_ERR_NONE; diff --git a/fs/afs.c b/fs/afs.c index 971c8bd2e..cd61f4db9 100644 --- a/fs/afs.c +++ b/fs/afs.c @@ -26,10 +26,16 @@ #include #include -#ifdef MODE_BFS -#define GRUB_AFS_FSNAME "befs" +#ifdef MODE_BIGENDIAN +#define GRUB_AFS_FSNAME_SUFFIX "_be" #else -#define GRUB_AFS_FSNAME "afs" +#define GRUB_AFS_FSNAME_SUFFIX "" +#endif + +#ifdef MODE_BFS +#define GRUB_AFS_FSNAME "befs" GRUB_AFS_FSNAME_SUFFIX +#else +#define GRUB_AFS_FSNAME "afs" GRUB_AFS_FSNAME_SUFFIX #endif #define GRUB_AFS_DIRECT_BLOCK_COUNT 12 @@ -65,14 +71,15 @@ #define GRUB_AFS_NULL_VAL ((grub_afs_bvalue_t)-1) -#define U16(sb, u) (((sb)->byte_order == GRUB_AFS_BO_LITTLE_ENDIAN) ? \ - grub_le_to_cpu16 (u) : grub_be_to_cpu16 (u)) - -#define U32(sb, u) (((sb)->byte_order == GRUB_AFS_BO_LITTLE_ENDIAN) ? \ - grub_le_to_cpu32 (u) : grub_be_to_cpu32 (u)) - -#define U64(sb, u) (((sb)->byte_order == GRUB_AFS_BO_LITTLE_ENDIAN) ? \ - grub_le_to_cpu64 (u) : grub_be_to_cpu64 (u)) +#ifdef MODE_BIGENDIAN +#define grub_afs_to_cpu16(x) grub_be_to_cpu16 (x) +#define grub_afs_to_cpu32(x) grub_be_to_cpu32 (x) +#define grub_afs_to_cpu64(x) grub_be_to_cpu64 (x) +#else +#define grub_afs_to_cpu16(x) grub_le_to_cpu16 (x) +#define grub_afs_to_cpu32(x) grub_le_to_cpu32 (x) +#define grub_afs_to_cpu64(x) grub_le_to_cpu64 (x) +#endif #ifdef MODE_BFS #define B_KEY_INDEX_ALIGN 8 @@ -90,12 +97,6 @@ ((char *) B_KEY_INDEX_OFFSET (node) + \ node->key_count * 2)) -enum -{ - GRUB_AFS_BO_LITTLE_ENDIAN, - GRUB_AFS_BO_BIG_ENDIAN -}; - typedef grub_uint64_t grub_afs_off_t; typedef grub_uint64_t grub_afs_bigtime; typedef grub_uint64_t grub_afs_bvalue_t; @@ -154,6 +155,9 @@ struct grub_afs_btree } __attribute__ ((packed)); #endif +/* Beware that following structure describes AtheFS and if you write code + which uses currently unused fields check it with both AtheFS and BeFS. + */ struct grub_afs_sblock { char name[32]; @@ -227,8 +231,8 @@ static grub_afs_off_t grub_afs_run_to_num (struct grub_afs_sblock *sb, struct grub_afs_blockrun *run) { - return ((grub_afs_off_t) U32 (sb, run->group) * sb->block_per_group + - U16 (sb, run->start)); + return ((grub_afs_off_t) grub_afs_to_cpu32 (run->group) + * sb->block_per_group + grub_afs_to_cpu16 (run->start)); } static grub_err_t @@ -248,25 +252,25 @@ grub_afs_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock) struct grub_afs_sblock *sb = &node->data->sblock; struct grub_afs_datastream *ds = &node->inode.stream; - if (fileblock < U64 (sb, ds->max_direct_range)) + if (fileblock < grub_afs_to_cpu64 (ds->max_direct_range)) { int i; for (i = 0; i < GRUB_AFS_DIRECT_BLOCK_COUNT; i++) { - if (fileblock < U16 (sb, ds->direct[i].len)) + if (fileblock < grub_afs_to_cpu16 (ds->direct[i].len)) return grub_afs_run_to_num (sb, &ds->direct[i]) + fileblock; - fileblock -= U16 (sb, ds->direct[i].len); + fileblock -= grub_afs_to_cpu16 (ds->direct[i].len); } } - else if (fileblock < U64 (sb, ds->max_indirect_range)) + else if (fileblock < grub_afs_to_cpu64 (ds->max_indirect_range)) { int ptrs_per_blk = sb->block_size / sizeof (struct grub_afs_blockrun); struct grub_afs_blockrun indir[ptrs_per_blk]; grub_afs_off_t blk = grub_afs_run_to_num (sb, &ds->indirect); int i; - fileblock -= U64 (sb, ds->max_direct_range); + fileblock -= grub_afs_to_cpu64 (ds->max_direct_range); for (i = 0; i < ds->indirect.len; i++, blk++) { int j; @@ -279,10 +283,10 @@ grub_afs_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock) for (j = 0; j < ptrs_per_blk; j++) { - if (fileblock < U16 (sb, indir[j].len)) + if (fileblock < grub_afs_to_cpu16 (indir[j].len)) return grub_afs_run_to_num (sb, &indir[j]) + fileblock; - fileblock -= U16 (sb, indir[j].len); + fileblock -= grub_afs_to_cpu16 (indir[j].len); } } } @@ -292,7 +296,7 @@ grub_afs_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock) struct grub_afs_blockrun indir[ptrs_per_blk]; /* ([idblk][idptr]) ([dblk][dptr]) [blk] */ - int cur_pos = fileblock - U64 (sb, ds->max_indirect_range); + int cur_pos = fileblock - grub_afs_to_cpu64 (ds->max_indirect_range); int dptr_size = GRUB_AFS_BLOCKS_PER_DI_RUN; int dblk_size = dptr_size * ptrs_per_blk; @@ -334,8 +338,7 @@ grub_afs_read_file (grub_fshelp_node_t node, { return grub_fshelp_read_file (node->data->disk, node, read_hook, pos, len, buf, grub_afs_read_block, - U64 (&node->data->sblock, - node->inode.stream.size), + grub_afs_to_cpu64 (node->inode.stream.size), node->data->sblock.block_shift - GRUB_DISK_SECTOR_BITS); } @@ -344,8 +347,7 @@ static char * grub_afs_read_symlink (grub_fshelp_node_t node) { char *ret; - struct grub_afs_sblock *sb = &node->data->sblock; - grub_afs_off_t size = U64 (sb, node->inode.stream.size); + grub_afs_off_t size = grub_afs_to_cpu64 (node->inode.stream.size); if (size == 0) { @@ -374,27 +376,27 @@ grub_afs_iterate_dir (grub_fshelp_node_t dir, struct grub_afs_btree head; char node_data [GRUB_AFS_BNODE_SIZE]; struct grub_afs_bnode *node = (struct grub_afs_bnode *) node_data; - struct grub_afs_sblock *sb = &dir->data->sblock; int i; if ((dir->inode.stream.size == 0) - || ((U32 (sb, dir->inode.mode) & GRUB_AFS_S_IFMT) != GRUB_AFS_S_IFDIR)) + || ((grub_afs_to_cpu32 (dir->inode.mode) & GRUB_AFS_S_IFMT) + != GRUB_AFS_S_IFDIR)) return 0; grub_afs_read_file (dir, 0, 0, sizeof (head), (char *) &head); if (grub_errno) return 0; - grub_afs_read_file (dir, 0, U64 (sb, head.root), + grub_afs_read_file (dir, 0, grub_afs_to_cpu64 (head.root), GRUB_AFS_BNODE_SIZE, (char *) node); if (grub_errno) return 0; - for (i = 0; i < (int) U32 (sb, head.tree_depth) - 1; i++) + for (i = 0; i < (int) grub_afs_to_cpu32 (head.tree_depth) - 1; i++) { grub_afs_bvalue_t blk; - blk = U64(sb, B_KEY_VALUE_OFFSET (node) [0]); + blk = grub_afs_to_cpu64(B_KEY_VALUE_OFFSET (node) [0]); grub_afs_read_file (dir, 0, blk, GRUB_AFS_BNODE_SIZE, (char *) node); if (grub_errno) return 0; @@ -411,8 +413,9 @@ grub_afs_iterate_dir (grub_fshelp_node_t dir, index = B_KEY_INDEX_OFFSET (node); - key_start = U16 (sb, (cur_key > 0) ? index[cur_key - 1] : 0); - key_size = U16 (sb, index[cur_key]) - key_start; + key_start = (cur_key > 0) + ? grub_afs_to_cpu16 (index[cur_key - 1]) : 0; + key_size = grub_afs_to_cpu16 (index[cur_key]) - key_start; if (key_size > 0) { char filename [key_size + 1]; @@ -425,14 +428,15 @@ grub_afs_iterate_dir (grub_fshelp_node_t dir, fdiro->data = dir->data; if (grub_afs_read_inode (dir->data, - U64 (sb, B_KEY_VALUE_OFFSET (node) [cur_key]), + grub_afs_to_cpu64 + (B_KEY_VALUE_OFFSET (node) [cur_key]), &fdiro->inode)) return 0; grub_memcpy (filename, &node->key_data[key_start], key_size); filename [key_size] = 0; - mode = (U32 (sb, fdiro->inode.mode) & GRUB_AFS_S_IFMT); + mode = (grub_afs_to_cpu32 (fdiro->inode.mode) & GRUB_AFS_S_IFMT); if (mode == GRUB_AFS_S_IFDIR) type = GRUB_FSHELP_DIR; else if (mode == GRUB_AFS_S_IFREG) @@ -447,12 +451,12 @@ grub_afs_iterate_dir (grub_fshelp_node_t dir, } cur_key++; - if (cur_key >= U32 (sb, node->key_count)) + if (cur_key >= grub_afs_to_cpu32 (node->key_count)) { if (node->right == GRUB_AFS_NULL_VAL) break; - grub_afs_read_file (dir, 0, U64 (sb, node->right), + grub_afs_read_file (dir, 0, grub_afs_to_cpu64 (node->right), GRUB_AFS_BNODE_SIZE, (char *) node); if (grub_errno) return 0; @@ -468,47 +472,20 @@ grub_afs_iterate_dir (grub_fshelp_node_t dir, static int grub_afs_validate_sblock (struct grub_afs_sblock *sb) { - if (grub_le_to_cpu32 (sb->magic1) == GRUB_AFS_SBLOCK_MAGIC1) + if (grub_afs_to_cpu32 (sb->magic1) == GRUB_AFS_SBLOCK_MAGIC1) { -#ifndef MODE_BFS - if (grub_le_to_cpu32 (sb->byte_order) != GRUB_AFS_BO_LITTLE_ENDIAN) - return 0; -#endif - - sb->byte_order = GRUB_AFS_BO_LITTLE_ENDIAN; - sb->magic2 = grub_le_to_cpu32 (sb->magic2); - sb->magic3 = grub_le_to_cpu32 (sb->magic3); - sb->block_shift = grub_le_to_cpu32 (sb->block_shift); - sb->block_size = grub_le_to_cpu32 (sb->block_size); - sb->used_blocks = grub_le_to_cpu64 (sb->used_blocks); - sb->num_blocks = grub_le_to_cpu64 (sb->num_blocks); - sb->inode_size = grub_le_to_cpu32 (sb->inode_size); - sb->alloc_group_count = grub_le_to_cpu32 (sb->alloc_group_count); - sb->alloc_group_shift = grub_le_to_cpu32 (sb->alloc_group_shift); - sb->block_per_group = grub_le_to_cpu32 (sb->block_per_group); - sb->alloc_group_count = grub_le_to_cpu32 (sb->alloc_group_count); - sb->log_size = grub_le_to_cpu32 (sb->log_size); - } - else if (grub_be_to_cpu32 (sb->magic1) == GRUB_AFS_SBLOCK_MAGIC1) - { -#ifndef MODE_BFS - if (grub_be_to_cpu32 (sb->byte_order) != GRUB_AFS_BO_BIG_ENDIAN) - return 0; -#endif - - sb->byte_order = GRUB_AFS_BO_BIG_ENDIAN; - sb->magic2 = grub_be_to_cpu32 (sb->magic2); - sb->magic3 = grub_be_to_cpu32 (sb->magic3); - sb->block_shift = grub_be_to_cpu32 (sb->block_shift); - sb->block_size = grub_be_to_cpu32 (sb->block_size); - sb->used_blocks = grub_be_to_cpu64 (sb->used_blocks); - sb->num_blocks = grub_be_to_cpu64 (sb->num_blocks); - sb->inode_size = grub_be_to_cpu32 (sb->inode_size); - sb->alloc_group_count = grub_be_to_cpu32 (sb->alloc_group_count); - sb->alloc_group_shift = grub_be_to_cpu32 (sb->alloc_group_shift); - sb->block_per_group = grub_be_to_cpu32 (sb->block_per_group); - sb->alloc_group_count = grub_be_to_cpu32 (sb->alloc_group_count); - sb->log_size = grub_be_to_cpu32 (sb->log_size); + sb->magic2 = grub_afs_to_cpu32 (sb->magic2); + sb->magic3 = grub_afs_to_cpu32 (sb->magic3); + sb->block_shift = grub_afs_to_cpu32 (sb->block_shift); + sb->block_size = grub_afs_to_cpu32 (sb->block_size); + sb->used_blocks = grub_afs_to_cpu64 (sb->used_blocks); + sb->num_blocks = grub_afs_to_cpu64 (sb->num_blocks); + sb->inode_size = grub_afs_to_cpu32 (sb->inode_size); + sb->alloc_group_count = grub_afs_to_cpu32 (sb->alloc_group_count); + sb->alloc_group_shift = grub_afs_to_cpu32 (sb->alloc_group_shift); + sb->block_per_group = grub_afs_to_cpu32 (sb->block_per_group); + sb->alloc_group_count = grub_afs_to_cpu32 (sb->alloc_group_count); + sb->log_size = grub_afs_to_cpu32 (sb->log_size); } else return 0; @@ -529,8 +506,8 @@ grub_afs_validate_sblock (struct grub_afs_sblock *sb) || ((grub_uint32_t) (1 << sb->alloc_group_shift) != sb->block_per_group * sb->block_size) || (sb->alloc_group_count * sb->block_per_group < sb->num_blocks) - || (U16 (sb, sb->log_block.len) != sb->log_size) - || (U32 (sb, sb->valid_log_blocks) > sb->log_size) + || (grub_afs_to_cpu16 (sb->log_block.len) != sb->log_size) + || (grub_afs_to_cpu32 (sb->valid_log_blocks) > sb->log_size) #endif ) return 0; @@ -594,7 +571,7 @@ grub_afs_open (struct grub_file *file, const char *name) grub_memcpy (data->inode, &fdiro->inode, sizeof (struct grub_afs_inode)); grub_free (fdiro); - file->size = U64 (&data->sblock, data->inode->stream.size); + file->size = grub_afs_to_cpu64 (data->inode->stream.size); file->data = data; file->offset = 0; @@ -648,10 +625,10 @@ grub_afs_dir (grub_device_t device, const char *path, info.dir = ((filetype & GRUB_FSHELP_TYPE_MASK) == GRUB_FSHELP_DIR); info.mtimeset = 1; #ifdef MODE_BFS - info.mtime = U64 (&data->sblock, node->inode.modified_time) >> 16; + info.mtime = grub_afs_to_cpu64 (node->inode.modified_time) >> 16; #else - info.mtime = grub_divmod64 (U64 (&data->sblock, - node->inode.modified_time), 1000000, 0); + info.mtime = grub_divmod64 (grub_afs_to_cpu64 (node->inode.modified_time), + 1000000, 0); #endif grub_free (node); return hook (filename, &info); @@ -713,8 +690,12 @@ static struct grub_fs grub_afs_fs = { .next = 0 }; -#ifdef MODE_BFS +#if defined (MODE_BIGENDIAN) && defined (MODE_BFS) +GRUB_MOD_INIT (befs_be) +#elif defined (MODE_BFS) GRUB_MOD_INIT (befs) +#elif defined (MODE_BIGENDIAN) +GRUB_MOD_INIT (afs_be) #else GRUB_MOD_INIT (afs) #endif @@ -723,8 +704,12 @@ GRUB_MOD_INIT (afs) my_mod = mod; } -#ifdef MODE_BFS +#if defined (MODE_BIGENDIAN) && defined (MODE_BFS) +GRUB_MOD_FINI (befs_be) +#elif defined (MODE_BFS) GRUB_MOD_FINI (befs) +#elif defined (MODE_BIGENDIAN) +GRUB_MOD_FINI (afs_be) #else GRUB_MOD_FINI (afs) #endif diff --git a/fs/afs_be.c b/fs/afs_be.c new file mode 100644 index 000000000..1f1f48fbb --- /dev/null +++ b/fs/afs_be.c @@ -0,0 +1,2 @@ +#define MODE_BIGENDIAN 1 +#include "afs.c" diff --git a/fs/befs_be.c b/fs/befs_be.c new file mode 100644 index 000000000..f6e8179f4 --- /dev/null +++ b/fs/befs_be.c @@ -0,0 +1,4 @@ +/* befs.c - The native BeOS/Haiku file-system. */ +#define MODE_BFS 1 +#define MODE_BIGENDIAN 1 +#include "afs.c" diff --git a/fs/hfs.c b/fs/hfs.c index 2f0702cbb..5062b5f71 100644 --- a/fs/hfs.c +++ b/fs/hfs.c @@ -243,10 +243,6 @@ grub_hfs_read_file (struct grub_hfs_data *data, int i; int blockcnt; - /* Adjust len so it we can't read past the end of the file. */ - if (len > grub_le_to_cpu32 (data->size)) - len = grub_le_to_cpu32 (data->size); - blockcnt = ((len + pos) + data->blksz - 1) / data->blksz; diff --git a/fs/hfsplus.c b/fs/hfsplus.c index 31bb54014..5e0ab093f 100644 --- a/fs/hfsplus.c +++ b/fs/hfsplus.c @@ -469,9 +469,9 @@ grub_hfsplus_mount (grub_disk_t disk) grub_be_to_cpu64 (data->volheader.extents_file.size); /* Read the essential information about the trees. */ - if (! grub_hfsplus_read_file (&data->catalog_tree.file, 0, - sizeof (struct grub_hfsplus_btnode), - sizeof (header), (char *) &header)) + if (grub_hfsplus_read_file (&data->catalog_tree.file, 0, + sizeof (struct grub_hfsplus_btnode), + sizeof (header), (char *) &header) <= 0) goto fail; data->catalog_tree.root = grub_be_to_cpu32 (header.root); @@ -479,15 +479,15 @@ grub_hfsplus_mount (grub_disk_t disk) data->case_sensitive = ((magic == GRUB_HFSPLUSX_MAGIC) && (header.key_compare == GRUB_HFSPLUSX_BINARYCOMPARE)); - if (! grub_hfsplus_read_file (&data->extoverflow_tree.file, 0, - sizeof (struct grub_hfsplus_btnode), - sizeof (header), (char *) &header)) + if (grub_hfsplus_read_file (&data->extoverflow_tree.file, 0, + sizeof (struct grub_hfsplus_btnode), + sizeof (header), (char *) &header) <= 0) goto fail; data->extoverflow_tree.root = grub_be_to_cpu32 (header.root); - if (! grub_hfsplus_read_file (&data->extoverflow_tree.file, 0, 0, - sizeof (node), (char *) &node)) + if (grub_hfsplus_read_file (&data->extoverflow_tree.file, 0, 0, + sizeof (node), (char *) &node) <= 0) goto fail; data->extoverflow_tree.root = grub_be_to_cpu32 (header.root); @@ -608,10 +608,10 @@ grub_hfsplus_btree_iterate_node (struct grub_hfsplus_btree *btree, if (! first_node->next) break; - if (! grub_hfsplus_read_file (&btree->file, 0, - (grub_be_to_cpu32 (first_node->next) - * btree->nodesize), - btree->nodesize, cnode)) + if (grub_hfsplus_read_file (&btree->file, 0, + (grub_be_to_cpu32 (first_node->next) + * btree->nodesize), + btree->nodesize, cnode) <= 0) return 1; /* Don't skip any record in the next iteration. */ @@ -647,12 +647,12 @@ grub_hfsplus_btree_search (struct grub_hfsplus_btree *btree, int match = 0; /* Read a node. */ - if (! grub_hfsplus_read_file (&btree->file, 0, - (long)currnode * (long)btree->nodesize, - btree->nodesize, (char *) node)) + if (grub_hfsplus_read_file (&btree->file, 0, + (long)currnode * (long)btree->nodesize, + btree->nodesize, (char *) node) <= 0) { grub_free (node); - return grub_errno; + return grub_error (GRUB_ERR_BAD_FS, "Couldn't read i-node."); } nodedesc = (struct grub_hfsplus_btnode *) node; diff --git a/fs/jfs.c b/fs/jfs.c index 51ca91ad0..b73f9bdd4 100644 --- a/fs/jfs.c +++ b/fs/jfs.c @@ -544,10 +544,6 @@ grub_jfs_read_file (struct grub_jfs_data *data, int i; int blockcnt; - /* Adjust len so it we can't read past the end of the file. */ - if (len > data->currinode.size) - len = data->currinode.size; - blockcnt = ((len + pos + grub_le_to_cpu32 (data->sblock.blksz) - 1) / grub_le_to_cpu32 (data->sblock.blksz)); diff --git a/fs/minix.c b/fs/minix.c index 44218fb89..08eb60729 100644 --- a/fs/minix.c +++ b/fs/minix.c @@ -193,8 +193,8 @@ grub_minix_read_file (struct grub_minix_data *data, int blockcnt; /* Adjust len so it we can't read past the end of the file. */ - if (len > GRUB_MINIX_INODE_SIZE (data)) - len = GRUB_MINIX_INODE_SIZE (data); + if (len + pos > GRUB_MINIX_INODE_SIZE (data)) + len = GRUB_MINIX_INODE_SIZE (data) - pos; blockcnt = (len + pos + GRUB_MINIX_BSIZE - 1) / GRUB_MINIX_BSIZE; diff --git a/fs/ntfs.c b/fs/ntfs.c index d03a94016..f1d0a374e 100644 --- a/fs/ntfs.c +++ b/fs/ntfs.c @@ -543,7 +543,7 @@ init_file (struct grub_ntfs_file *mft, grub_uint32_t mftno) if (!pa[8]) mft->size = u32at (pa, 0x10); else - mft->size = u32at (pa, 0x30); + mft->size = u64at (pa, 0x30); if ((mft->attr.flags & AF_ALST) == 0) mft->attr.attr_end = 0; /* Don't jump to attribute list */ @@ -970,15 +970,6 @@ grub_ntfs_read (grub_file_t file, char *buf, grub_size_t len) if (file->read_hook) mft->attr.save_pos = 1; - if (file->offset > file->size) - { - grub_error (GRUB_ERR_BAD_FS, "Bad offset"); - return -1; - } - - if (file->offset + len > file->size) - len = file->size - file->offset; - read_attr (&mft->attr, buf, file->offset, len, 1, file->read_hook); return (grub_errno) ? 0 : len; } diff --git a/fs/reiserfs.c b/fs/reiserfs.c index 04d33150f..fb4f1bc59 100644 --- a/fs/reiserfs.c +++ b/fs/reiserfs.c @@ -1077,9 +1077,6 @@ grub_reiserfs_read (grub_file_t file, char *buf, grub_size_t len) grub_disk_addr_t block; grub_off_t offset; - if (file->offset >= file->size) - return 0; - key.directory_id = node->header.key.directory_id; key.object_id = node->header.key.object_id; key.u.v2.offset_type = 0; diff --git a/fs/ufs.c b/fs/ufs.c index 797a45d13..c94ad9922 100644 --- a/fs/ufs.c +++ b/fs/ufs.c @@ -290,8 +290,8 @@ grub_ufs_read_file (struct grub_ufs_data *data, int blockcnt; /* Adjust len so it we can't read past the end of the file. */ - if (len > INODE_SIZE (data)) - len = INODE_SIZE (data); + if (len + pos > INODE_SIZE (data)) + len = INODE_SIZE (data) - pos; blockcnt = (len + pos + UFS_BLKSZ (sblock) - 1) / UFS_BLKSZ (sblock); diff --git a/fs/xfs.c b/fs/xfs.c index a143b55a0..1b18bef3b 100644 --- a/fs/xfs.c +++ b/fs/xfs.c @@ -160,13 +160,13 @@ static grub_dl_t my_mod; #define GRUB_XFS_INO_AGBITS(data) \ ((data)->sblock.log2_agblk + (data)->sblock.log2_inop) #define GRUB_XFS_INO_INOINAG(data, ino) \ - (grub_be_to_cpu64 (ino) & ((1 << GRUB_XFS_INO_AGBITS (data)) - 1)) + (grub_be_to_cpu64 (ino) & ((1LL << GRUB_XFS_INO_AGBITS (data)) - 1)) #define GRUB_XFS_INO_AG(data,ino) \ (grub_be_to_cpu64 (ino) >> GRUB_XFS_INO_AGBITS (data)) #define GRUB_XFS_FSB_TO_BLOCK(data, fsb) \ (((fsb) >> (data)->sblock.log2_agblk) * (data)->agsize \ - + ((fsb) & ((1 << (data)->sblock.log2_agblk) - 1))) + + ((fsb) & ((1LL << (data)->sblock.log2_agblk) - 1))) #define GRUB_XFS_EXTENT_OFFSET(exts,ex) \ ((grub_be_to_cpu32 (exts[ex][0]) & ~(1 << 31)) << 23 \ @@ -185,7 +185,7 @@ static grub_dl_t my_mod; #define GRUB_XFS_NEXT_DIRENT(pos,len) \ (pos) + GRUB_XFS_ROUND_TO_DIRENT (8 + 1 + len + 2) -static inline int +static inline grub_uint64_t grub_xfs_inode_block (struct grub_xfs_data *data, grub_uint64_t ino) { @@ -213,7 +213,7 @@ static grub_err_t grub_xfs_read_inode (struct grub_xfs_data *data, grub_uint64_t ino, struct grub_xfs_inode *inode) { - int block = grub_xfs_inode_block (data, ino); + grub_uint64_t block = grub_xfs_inode_block (data, ino); int offset = grub_xfs_inode_offset (data, ino); /* Read the inode. */ diff --git a/gendistlist.sh b/gendistlist.sh old mode 100644 new mode 100755 index 5fe5d186b..3278ed0b3 --- a/gendistlist.sh +++ b/gendistlist.sh @@ -39,6 +39,6 @@ for dir in $DISTDIRS; do find $d -maxdepth 1 -name '*.[chSy]' -o -name '*.mk' -o -name '*.rmk' \ -o -name '*.rb' -o -name '*.in' -o -name '*.tex' -o -name '*.texi' \ -o -name 'grub.cfg' -o -name 'README' -o -name '*.sc' -o -name 'mdate-sh' \ - -o -name '*.sh' | sort + -o -name '*.sh' -o -name 'grub-dumpdevtree' -o -name '*.lua' | sort done done diff --git a/genmk.rb b/genmk.rb index 9574ce98d..50bf88fe1 100644 --- a/genmk.rb +++ b/genmk.rb @@ -39,11 +39,13 @@ class Image def initialize(dir, name) @dir = dir @name = name + @rule_count = 0 end attr_reader :dir, :name def rule(sources) prefix = @name.to_var + @rule_count += 1 exe = @name.suffix('exec') objs = sources.collect do |src| raise "unknown source file `#{src}'" if /\.[cS]$/ !~ src @@ -53,8 +55,16 @@ class Image deps = objs.collect {|obj| obj.suffix('d')} deps_str = deps.join(' ') - "CLEANFILES += #{@name} #{exe} #{objs_str} -MOSTLYCLEANFILES += #{deps_str} +" +clean-image-#{@name}.#{@rule_count}: + rm -f #{@name} #{exe} #{objs_str} + +CLEAN_IMAGE_TARGETS += clean-image-#{@name}.#{@rule_count} + +mostlyclean-image-#{@name}.#{@rule_count}: + rm -f #{deps_str} + +MOSTLYCLEAN_IMAGE_TARGETS += mostlyclean-image-#{@name}.#{@rule_count} ifneq ($(TARGET_APPLE_CC),1) #{@name}: #{exe} @@ -94,11 +104,13 @@ class PModule def initialize(dir, name) @dir = dir @name = name + @rule_count = 0 end attr_reader :dir, :name def rule(sources) prefix = @name.to_var + @rule_count += 1 objs = sources.collect do |src| raise "unknown source file `#{src}'" if /\.[cS]$/ !~ src prefix + '-' + src.to_obj @@ -114,19 +126,30 @@ class PModule mod_name = File.basename(@name, '.mod') symbolic_name = mod_name.sub(/\.[^\.]*$/, '') - "CLEANFILES += #{@name} #{mod_obj} #{mod_src} #{pre_obj} #{objs_str} #{undsym} +" +clean-module-#{@name}.#{@rule_count}: + rm -f #{@name} #{mod_obj} #{mod_src} #{pre_obj} #{objs_str} #{undsym} + +CLEAN_MODULE_TARGETS += clean-module-#{@name}.#{@rule_count} + ifneq ($(#{prefix}_EXPORTS),no) -CLEANFILES += #{defsym} +clean-module-#{@name}-symbol.#{@rule_count}: + rm -f #{defsym} + +CLEAN_MODULE_TARGETS += clean-module-#{@name}-symbol.#{@rule_count} DEFSYMFILES += #{defsym} endif -MOSTLYCLEANFILES += #{deps_str} +mostlyclean-module-#{@name}.#{@rule_count}: + rm -f #{deps_str} + +MOSTLYCLEAN_MODULE_TARGETS += mostlyclean-module-#{@name}.#{@rule_count} UNDSYMFILES += #{undsym} ifneq ($(TARGET_APPLE_CC),1) #{@name}: #{pre_obj} #{mod_obj} $(TARGET_OBJ2ELF) -rm -f $@ $(TARGET_CC) $(#{prefix}_LDFLAGS) $(TARGET_LDFLAGS) -Wl,-r,-d -o $@ #{pre_obj} #{mod_obj} - if test ! -z $(TARGET_OBJ2ELF); then ./$(TARGET_OBJ2ELF) $@ || (rm -f $@; exit 1); fi + if test ! -z \"$(TARGET_OBJ2ELF)\"; then ./$(TARGET_OBJ2ELF) $@ || (rm -f $@; exit 1); fi $(STRIP) --strip-unneeded -K grub_mod_init -K grub_mod_fini -K _grub_mod_init -K _grub_mod_fini -R .note -R .comment $@ else #{@name}: #{pre_obj} #{mod_obj} $(TARGET_OBJ2ELF) @@ -164,6 +187,7 @@ endif " + objs.collect_with_index do |obj, i| src = sources[i] fake_obj = File.basename(src).suffix('o') + extra_target = obj.sub(/\.[^\.]*$/, '') + '-extra' command = 'cmd-' + obj.suffix('lst') fs = 'fs-' + obj.suffix('lst') partmap = 'partmap-' + obj.suffix('lst') @@ -178,7 +202,11 @@ endif $(TARGET_CC) -I#{dir} -I$(srcdir)/#{dir} $(TARGET_CPPFLAGS) #{extra_flags} $(TARGET_#{flag}) $(#{prefix}_#{flag}) -MD -c -o $@ $< -include #{dep} -CLEANFILES += #{command} #{fs} #{partmap} #{handler} #{parttool} +clean-module-#{extra_target}.#{@rule_count}: + rm -f #{command} #{fs} #{partmap} #{handler} #{parttool} + +CLEAN_MODULE_TARGETS += clean-module-#{extra_target}.#{@rule_count} + COMMANDFILES += #{command} FSFILES += #{fs} PARTTOOLFILES += #{parttool} @@ -219,6 +247,7 @@ class Utility def initialize(dir, name) @dir = dir @name = name + @rule_count = 0 end def print_tail() prefix = @name.to_var @@ -231,6 +260,7 @@ class Utility def rule(sources) prefix = @name.to_var + @rule_count += 1 objs = sources.collect do |src| raise "unknown source file `#{src}'" if /\.[cS]$/ !~ src prefix + '-' + src.to_obj @@ -239,8 +269,17 @@ class Utility deps = objs.collect {|obj| obj.suffix('d')} deps_str = deps.join(' '); - "CLEANFILES += #{@name}$(EXEEXT) #{objs_str} -MOSTLYCLEANFILES += #{deps_str} + " +clean-utility-#{@name}.#{@rule_count}: + rm -f #{@name}$(EXEEXT) #{objs_str} + +CLEAN_UTILITY_TARGETS += clean-utility-#{@name}.#{@rule_count} + +mostlyclean-utility-#{@name}.#{@rule_count}: + rm -f #{deps_str} + +MOSTLYCLEAN_UTILITY_TARGETS += mostlyclean-utility-#{@name}.#{@rule_count} + #{prefix}_OBJECTS += #{objs_str} " + objs.collect_with_index do |obj, i| diff --git a/include/grub/auth.h b/include/grub/auth.h new file mode 100644 index 000000000..da930eeda --- /dev/null +++ b/include/grub/auth.h @@ -0,0 +1,45 @@ +/* + * 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 . + */ +#ifndef GRUB_AURH_HEADER +#define GRUB_AUTH_HEADER 1 + +#include + +/* Macros for indistinguishibility. */ +#define GRUB_ACCESS_DENIED grub_error (GRUB_ERR_ACCESS_DENIED, "Access denied.") +#define GRUB_GET_PASSWORD(string, len) grub_cmdline_get ("Enter password: ", \ + string, len, \ + '*', 0, 0) + +/* Like strcmp but untimeable. Accepts NULL as second argument. */ +int grub_auth_strcmp (const char *user_input, const char *template); +/* Like strcmp but untimeable and ignores commas in needle. */ +int grub_auth_strword (const char *haystack, const char *needle); + +typedef grub_err_t (*grub_auth_callback_t) (const char*, void *); + +grub_err_t grub_auth_register_authentication (const char *user, + grub_auth_callback_t callback, + void *arg); +grub_err_t grub_auth_unregister_authentication (const char *user); + +grub_err_t grub_auth_authenticate (const char *user); +grub_err_t grub_auth_deauthenticate (const char *user); +grub_err_t grub_auth_check_authentication (const char *userlist); + +#endif /* ! GRUB_AUTH_HEADER */ diff --git a/include/grub/err.h b/include/grub/err.h index 3435fb769..7a5ce1ae0 100644 --- a/include/grub/err.h +++ b/include/grub/err.h @@ -53,7 +53,8 @@ typedef enum GRUB_ERR_BAD_GZIP_DATA, GRUB_ERR_MENU, GRUB_ERR_TIMEOUT, - GRUB_ERR_IO + GRUB_ERR_IO, + GRUB_ERR_ACCESS_DENIED } grub_err_t; diff --git a/include/grub/fbblit.h b/include/grub/fbblit.h index 664f508c5..af97dfb97 100644 --- a/include/grub/fbblit.h +++ b/include/grub/fbblit.h @@ -131,4 +131,52 @@ grub_video_fbblit_blend_index_RGBA8888 (struct grub_video_fbblit_info *dst, int width, int height, int offset_x, int offset_y); +void +grub_video_fbblit_replace_32bit_1bit (struct grub_video_fbblit_info *dst, + struct grub_video_fbblit_info *src, + int x, int y, + int width, int height, + int offset_x, int offset_y); + +void +grub_video_fbblit_replace_24bit_1bit (struct grub_video_fbblit_info *dst, + struct grub_video_fbblit_info *src, + int x, int y, + int width, int height, + int offset_x, int offset_y); + +void +grub_video_fbblit_replace_16bit_1bit (struct grub_video_fbblit_info *dst, + struct grub_video_fbblit_info *src, + int x, int y, + int width, int height, + int offset_x, int offset_y); + +void +grub_video_fbblit_replace_8bit_1bit (struct grub_video_fbblit_info *dst, + struct grub_video_fbblit_info *src, + int x, int y, + int width, int height, + int offset_x, int offset_y); + +void +grub_video_fbblit_blend_XXXA8888_1bit (struct grub_video_fbblit_info *dst, + struct grub_video_fbblit_info *src, + int x, int y, + int width, int height, + int offset_x, int offset_y); + +void +grub_video_fbblit_blend_XXX888_1bit (struct grub_video_fbblit_info *dst, + struct grub_video_fbblit_info *src, + int x, int y, + int width, int height, + int offset_x, int offset_y); + +void +grub_video_fbblit_blend_XXX565_1bit (struct grub_video_fbblit_info *dst, + struct grub_video_fbblit_info *src, + int x, int y, + int width, int height, + int offset_x, int offset_y); #endif /* ! GRUB_FBBLIT_HEADER */ diff --git a/include/grub/i386/bsd.h b/include/grub/i386/bsd.h index 117ed5c68..8ffaf7d18 100644 --- a/include/grub/i386/bsd.h +++ b/include/grub/i386/bsd.h @@ -29,7 +29,7 @@ enum bsd_kernel_types KERNEL_TYPE_NETBSD, }; -#define GRUB_BSD_TEMP_BUFFER 0x68000 +#define GRUB_BSD_TEMP_BUFFER 0x80000 #define FREEBSD_RB_ASKNAME (1 << 0) /* ask for file name to reboot from */ #define FREEBSD_RB_SINGLE (1 << 1) /* reboot to single user only */ @@ -157,6 +157,8 @@ struct grub_openbsd_bios_mmap grub_uint64_t len; #define OPENBSD_MMAP_AVAILABLE 1 #define OPENBSD_MMAP_RESERVED 2 +#define OPENBSD_MMAP_ACPI 3 +#define OPENBSD_MMAP_NVS 4 grub_uint32_t type; }; @@ -189,6 +191,8 @@ struct grub_openbsd_bootargs #define NETBSD_AB_VERBOSE (1 << 17) /* boot verbosely */ #define NETBSD_AB_SILENT (1 << 18) /* boot silently */ #define NETBSD_AB_DEBUG (1 << 19) /* boot with debug messages */ +#define NETBSD_AB_NOSMP (1 << 28) /* Boot without SMP support. */ +#define NETBSD_AB_NOACPI (1 << 29) /* Boot without ACPI support. */ struct grub_netbsd_bootinfo { @@ -199,6 +203,7 @@ struct grub_netbsd_bootinfo #define NETBSD_BTINFO_BOOTPATH 0 #define NETBSD_BTINFO_ROOTDEVICE 1 #define NETBSD_BTINFO_BOOTDISK 3 +#define NETBSD_BTINFO_MEMMAP 9 struct grub_netbsd_btinfo_common { @@ -206,6 +211,23 @@ struct grub_netbsd_btinfo_common int type; }; +struct grub_netbsd_btinfo_mmap_header +{ + struct grub_netbsd_btinfo_common common; + grub_uint32_t count; +}; + +struct grub_netbsd_btinfo_mmap_entry +{ + grub_uint64_t addr; + grub_uint64_t len; +#define NETBSD_MMAP_AVAILABLE 1 +#define NETBSD_MMAP_RESERVED 2 +#define NETBSD_MMAP_ACPI 3 +#define NETBSD_MMAP_NVS 4 + grub_uint32_t type; +}; + struct grub_netbsd_btinfo_bootpath { struct grub_netbsd_btinfo_common common; diff --git a/include/grub/i386/pc/memory.h b/include/grub/i386/pc/memory.h index 7a132fd24..4b9a627ce 100644 --- a/include/grub/i386/pc/memory.h +++ b/include/grub/i386/pc/memory.h @@ -77,8 +77,19 @@ /* The data segment of the pseudo real mode. */ #define GRUB_MEMORY_MACHINE_PSEUDO_REAL_DSEG 0x20 +#define GRUB_MEMORY_MACHINE_BIOS_DATA_AREA_ADDR 0x400 + #ifndef ASM_FILE +/* See http://heim.ifi.uio.no/~stanisls/helppc/bios_data_area.html for a + description of the BIOS Data Area layout. */ +struct grub_machine_bios_data_area +{ + grub_uint8_t unused1[0x17]; + grub_uint8_t keyboard_flag_lower; /* 0x17 */ + grub_uint8_t unused2[0xf0 - 0x18]; +}; + struct grub_machine_mmap_entry { grub_uint32_t size; diff --git a/include/grub/i386/xnu.h b/include/grub/i386/xnu.h index ebc38eb61..68674e605 100644 --- a/include/grub/i386/xnu.h +++ b/include/grub/i386/xnu.h @@ -1,6 +1,26 @@ +/* + * 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 . + */ + #ifndef GRUB_CPU_XNU_H #define GRUB_CPU_XNU_H 1 +#include + #define GRUB_XNU_PAGESIZE 4096 typedef grub_uint32_t grub_xnu_ptr_t; diff --git a/include/grub/menu.h b/include/grub/menu.h index 3bd25e875..c7114a93b 100644 --- a/include/grub/menu.h +++ b/include/grub/menu.h @@ -32,6 +32,12 @@ struct grub_menu_entry /* The title name. */ const char *title; + /* If set means not everybody is allowed to boot this entry. */ + int restricted; + + /* Allowed users. */ + const char *users; + /* The classes associated with the menu entry: used to choose an icon or other style attributes. This is a dummy head node for the linked list, so for an entry E, diff --git a/include/grub/misc.h b/include/grub/misc.h index 769ec5cd8..a63a0b442 100644 --- a/include/grub/misc.h +++ b/include/grub/misc.h @@ -37,8 +37,42 @@ void *EXPORT_FUNC(grub_memmove) (void *dest, const void *src, grub_size_t n); char *EXPORT_FUNC(grub_strcpy) (char *dest, const char *src); char *EXPORT_FUNC(grub_strncpy) (char *dest, const char *src, int c); char *EXPORT_FUNC(grub_stpcpy) (char *dest, const char *src); -char *EXPORT_FUNC(grub_strcat) (char *dest, const char *src); -char *EXPORT_FUNC(grub_strncat) (char *dest, const char *src, int c); + +static inline char * +grub_strcat (char *dest, const char *src) +{ + char *p = dest; + + while (*p) + p++; + + while ((*p = *src) != '\0') + { + p++; + src++; + } + + return dest; +} + +static inline char * +grub_strncat (char *dest, const char *src, int c) +{ + char *p = dest; + + while (*p) + p++; + + while ((*p = *src) != '\0' && c--) + { + p++; + src++; + } + + *p = '\0'; + + return dest; +} /* Prototypes for aliases. */ #if !defined (GRUB_UTIL) || !defined (APPLE_CC) @@ -49,19 +83,41 @@ void *EXPORT_FUNC(memcpy) (void *dest, const void *src, grub_size_t n); int EXPORT_FUNC(grub_memcmp) (const void *s1, const void *s2, grub_size_t n); int EXPORT_FUNC(grub_strcmp) (const char *s1, const char *s2); int EXPORT_FUNC(grub_strncmp) (const char *s1, const char *s2, grub_size_t n); -int EXPORT_FUNC(grub_strcasecmp) (const char *s1, const char *s2); -int EXPORT_FUNC(grub_strncasecmp) (const char *s1, const char *s2, grub_size_t n); + char *EXPORT_FUNC(grub_strchr) (const char *s, int c); char *EXPORT_FUNC(grub_strrchr) (const char *s, int c); int EXPORT_FUNC(grub_strword) (const char *s, const char *w); char *EXPORT_FUNC(grub_strstr) (const char *haystack, const char *needle); -int EXPORT_FUNC(grub_iswordseparator) (int c); int EXPORT_FUNC(grub_isspace) (int c); int EXPORT_FUNC(grub_isprint) (int c); -int EXPORT_FUNC(grub_isalpha) (int c); -int EXPORT_FUNC(grub_isgraph) (int c); -int EXPORT_FUNC(grub_isdigit) (int c); -int EXPORT_FUNC(grub_tolower) (int c); + +static inline int +grub_isalpha (int c) +{ + return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); +} + +static inline int +grub_isgraph (int c) +{ + return (c >= '!' && c <= '~'); +} + +static inline int +grub_isdigit (int c) +{ + return (c >= '0' && c <= '9'); +} + +static inline int +grub_tolower (int c) +{ + if (c >= 'A' && c <= 'Z') + return c - 'A' + 'a'; + + return c; +} + static inline int grub_toupper (int c) { @@ -71,6 +127,40 @@ grub_toupper (int c) return c; } +static inline int +grub_strcasecmp (const char *s1, const char *s2) +{ + while (*s1 && *s2) + { + if (grub_tolower (*s1) != grub_tolower (*s2)) + break; + + s1++; + s2++; + } + + return (int) grub_tolower (*s1) - (int) grub_tolower (*s2); +} + +static inline int +grub_strncasecmp (const char *s1, const char *s2, grub_size_t n) +{ + if (n == 0) + return 0; + + while (*s1 && *s2 && --n) + { + if (grub_tolower (*s1) != grub_tolower (*s2)) + break; + + s1++; + s2++; + } + + return (int) grub_tolower (*s1) - (int) grub_tolower (*s2); +} + + unsigned long EXPORT_FUNC(grub_strtoul) (const char *str, char **end, int base); unsigned long long EXPORT_FUNC(grub_strtoull) (const char *str, char **end, int base); char *EXPORT_FUNC(grub_strdup) (const char *s); diff --git a/include/grub/pc_partition.h b/include/grub/msdos_partition.h similarity index 93% rename from include/grub/pc_partition.h rename to include/grub/msdos_partition.h index 67c312e64..273d8c95e 100644 --- a/include/grub/pc_partition.h +++ b/include/grub/msdos_partition.h @@ -99,7 +99,7 @@ #define GRUB_PC_PARTITION_OPENBSD_TYPE_RAID 19 /* The BSD partition entry. */ -struct grub_pc_partition_bsd_entry +struct grub_msdos_partition_bsd_entry { grub_uint32_t size; grub_uint32_t offset; @@ -110,7 +110,7 @@ struct grub_pc_partition_bsd_entry } __attribute__ ((packed)); /* The BSD disk label. Only define members useful for GRUB. */ -struct grub_pc_partition_disk_label +struct grub_msdos_partition_disk_label { grub_uint32_t magic; grub_uint8_t padding[128]; @@ -119,11 +119,11 @@ struct grub_pc_partition_disk_label grub_uint16_t num_partitions; grub_uint32_t boot_size; grub_uint32_t superblock_size; - struct grub_pc_partition_bsd_entry entries[GRUB_PC_PARTITION_BSD_MAX_ENTRIES]; + struct grub_msdos_partition_bsd_entry entries[GRUB_PC_PARTITION_BSD_MAX_ENTRIES]; } __attribute__ ((packed)); /* The partition entry. */ -struct grub_pc_partition_entry +struct grub_msdos_partition_entry { /* If active, 0x80, otherwise, 0x00. */ grub_uint8_t flag; @@ -155,20 +155,20 @@ struct grub_pc_partition_entry } __attribute__ ((packed)); /* The structure of MBR. */ -struct grub_pc_partition_mbr +struct grub_msdos_partition_mbr { /* The code area (actually, including BPB). */ grub_uint8_t code[446]; /* Four partition entries. */ - struct grub_pc_partition_entry entries[4]; + struct grub_msdos_partition_entry entries[4]; /* The signature 0xaa55. */ grub_uint16_t signature; } __attribute__ ((packed)); -struct grub_pc_partition +struct grub_msdos_partition { /* The DOS partition number. */ int dos_part; @@ -187,13 +187,13 @@ struct grub_pc_partition }; static inline int -grub_pc_partition_is_empty (int type) +grub_msdos_partition_is_empty (int type) { return (type == GRUB_PC_PARTITION_TYPE_NONE); } static inline int -grub_pc_partition_is_extended (int type) +grub_msdos_partition_is_extended (int type) { return (type == GRUB_PC_PARTITION_TYPE_EXTENDED || type == GRUB_PC_PARTITION_TYPE_WIN95_EXTENDED @@ -201,7 +201,7 @@ grub_pc_partition_is_extended (int type) } static inline int -grub_pc_partition_is_bsd (int type) +grub_msdos_partition_is_bsd (int type) { return (type == GRUB_PC_PARTITION_TYPE_FREEBSD || type == GRUB_PC_PARTITION_TYPE_OPENBSD diff --git a/include/grub/normal.h b/include/grub/normal.h index 7d8122a2b..feebc85b1 100644 --- a/include/grub/normal.h +++ b/include/grub/normal.h @@ -56,7 +56,7 @@ void grub_cmdline_run (int nested); /* Defined in `cmdline.c'. */ int grub_cmdline_get (const char *prompt, char cmdline[], unsigned max_len, - int echo_char, int readline); + int echo_char, int readline, int history); grub_err_t grub_set_history (int newsize); /* Defined in `completion.c'. */ diff --git a/include/grub/ntfs.h b/include/grub/ntfs.h index 9b2ae0a0c..6482e964b 100644 --- a/include/grub/ntfs.h +++ b/include/grub/ntfs.h @@ -133,7 +133,7 @@ struct grub_fshelp_node { struct grub_ntfs_data *data; char *buf; - grub_uint32_t size; + grub_uint64_t size; grub_uint32_t ino; int inode_read; struct grub_ntfs_attr attr; diff --git a/include/grub/partition.h b/include/grub/partition.h index 37c5f2403..d35658cdd 100644 --- a/include/grub/partition.h +++ b/include/grub/partition.h @@ -84,8 +84,8 @@ void EXPORT_FUNC(grub_partition_map_register) (grub_partition_map_t partmap); void EXPORT_FUNC(grub_partition_map_unregister) (grub_partition_map_t partmap); #ifdef GRUB_UTIL -void grub_pc_partition_map_init (void); -void grub_pc_partition_map_fini (void); +void grub_msdos_partition_map_init (void); +void grub_msdos_partition_map_fini (void); void grub_amiga_partition_map_init (void); void grub_amiga_partition_map_fini (void); void grub_apple_partition_map_init (void); diff --git a/include/grub/term.h b/include/grub/term.h index 9ce3be7d1..316d75390 100644 --- a/include/grub/term.h +++ b/include/grub/term.h @@ -1,6 +1,6 @@ /* * GRUB -- GRand Unified Bootloader - * Copyright (C) 2002,2003,2005,2007,2008 Free Software Foundation, Inc. + * Copyright (C) 2002,2003,2005,2007,2008,2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -72,6 +72,12 @@ grub_term_color_state; #define GRUB_TERM_NEED_INIT (1 << 16) +/* Bitmasks for modifier keys returned by grub_getkeystatus. */ +#define GRUB_TERM_STATUS_SHIFT (1 << 0) +#define GRUB_TERM_STATUS_CTRL (1 << 1) +#define GRUB_TERM_STATUS_ALT (1 << 2) + + /* Unicode characters for fancy graphics. */ #define GRUB_TERM_DISP_LEFT 0x2190 #define GRUB_TERM_DISP_UP 0x2191 @@ -157,6 +163,9 @@ struct grub_term_input /* Get a character. */ int (*getkey) (void); + + /* Get keyboard modifier status. */ + int (*getkeystatus) (void); }; typedef struct grub_term_input *grub_term_input_t; @@ -275,6 +284,7 @@ void EXPORT_FUNC(grub_putcode) (grub_uint32_t code); grub_ssize_t EXPORT_FUNC(grub_getcharwidth) (grub_uint32_t code); int EXPORT_FUNC(grub_getkey) (void); int EXPORT_FUNC(grub_checkkey) (void); +int EXPORT_FUNC(grub_getkeystatus) (void); grub_uint16_t EXPORT_FUNC(grub_getwh) (void); grub_uint16_t EXPORT_FUNC(grub_getxy) (void); void EXPORT_FUNC(grub_gotoxy) (grub_uint8_t x, grub_uint8_t y); diff --git a/kern/file.c b/kern/file.c index 9b56b88e4..f713acbca 100644 --- a/kern/file.c +++ b/kern/file.c @@ -112,6 +112,13 @@ grub_file_read (grub_file_t file, void *buf, grub_size_t len) { grub_ssize_t res; + if (file->offset > file->size) + { + grub_error (GRUB_ERR_OUT_OF_RANGE, + "Attempt to read past the end of file."); + return -1; + } + if (len == 0 || len > file->size - file->offset) len = file->size - file->offset; diff --git a/kern/i386/pc/startup.S b/kern/i386/pc/startup.S index 1a896eda1..da3624c89 100644 --- a/kern/i386/pc/startup.S +++ b/kern/i386/pc/startup.S @@ -37,7 +37,7 @@ * Note: GRUB is compiled with the options -mrtd and -mregparm=3. * So the first three arguments are passed in %eax, %edx, and %ecx, * respectively, and if a function has a fixed number of arguments - * and the number if greater than three, the function must return + * and the number is greater than three, the function must return * with "ret $N" where N is ((the number of arguments) - 3) * 4. */ @@ -1761,18 +1761,18 @@ FUNCTION(grub_vbe_bios_getset_dac_palette_width) movw $0x4f08, %ax int $0x10 - movw %ax, %dx /* real_to_prot destroys %eax. */ + movw %ax, %cx /* real_to_prot destroys %eax. */ DATA32 call real_to_prot .code32 /* Move result back to *dac_mask_size. */ + xorl %eax, %eax movb %bh, %al movl %eax, (%edx) /* Return value in %eax. */ - xorl %eax, %eax - movw %dx, %ax + movw %cx, %ax popl %ebx popl %ebp diff --git a/kern/misc.c b/kern/misc.c index d797f1781..1c38fe661 100644 --- a/kern/misc.c +++ b/kern/misc.c @@ -24,6 +24,12 @@ #include #include +static int +grub_iswordseparator (int c) +{ + return (grub_isspace (c) || c == ',' || c == ';' || c == '|' || c == '&'); +} + void * grub_memmove (void *dest, const void *src, grub_size_t n) { @@ -97,42 +103,6 @@ grub_stpcpy (char *dest, const char *src) return d - 1; } -char * -grub_strcat (char *dest, const char *src) -{ - char *p = dest; - - while (*p) - p++; - - while ((*p = *src) != '\0') - { - p++; - src++; - } - - return dest; -} - -char * -grub_strncat (char *dest, const char *src, int c) -{ - char *p = dest; - - while (*p) - p++; - - while ((*p = *src) != '\0' && c--) - { - p++; - src++; - } - - *p = '\0'; - - return dest; -} - int grub_printf (const char *fmt, ...) { @@ -250,39 +220,6 @@ grub_strncmp (const char *s1, const char *s2, grub_size_t n) return (int) *s1 - (int) *s2; } -int -grub_strcasecmp (const char *s1, const char *s2) -{ - while (*s1 && *s2) - { - if (grub_tolower (*s1) != grub_tolower (*s2)) - break; - - s1++; - s2++; - } - - return (int) grub_tolower (*s1) - (int) grub_tolower (*s2); -} - -int -grub_strncasecmp (const char *s1, const char *s2, grub_size_t n) -{ - if (n == 0) - return 0; - - while (*s1 && *s2 && --n) - { - if (grub_tolower (*s1) != grub_tolower (*s2)) - break; - - s1++; - s2++; - } - - return (int) grub_tolower (*s1) - (int) grub_tolower (*s2); -} - char * grub_strchr (const char *s, int c) { @@ -394,12 +331,6 @@ grub_strword (const char *haystack, const char *needle) return 0; } -int -grub_iswordseparator (int c) -{ - return (grub_isspace (c) || c == ',' || c == ';' || c == '|' || c == '&'); -} - int grub_isspace (int c) { @@ -412,33 +343,6 @@ grub_isprint (int c) return (c >= ' ' && c <= '~'); } -int -grub_isalpha (int c) -{ - return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); -} - -int -grub_isdigit (int c) -{ - return (c >= '0' && c <= '9'); -} - -int -grub_isgraph (int c) -{ - return (c >= '!' && c <= '~'); -} - -int -grub_tolower (int c) -{ - if (c >= 'A' && c <= 'Z') - return c - 'A' + 'a'; - - return c; -} - unsigned long grub_strtoul (const char *str, char **end, int base) diff --git a/kern/rescue_parser.c b/kern/rescue_parser.c index 79f32b8fd..1e0841e49 100644 --- a/kern/rescue_parser.c +++ b/kern/rescue_parser.c @@ -61,7 +61,8 @@ grub_rescue_parse_line (char *line, grub_reader_getline_t getline) else { grub_printf ("Unknown command `%s'\n", name); - grub_printf ("Try `help' for usage\n"); + if (grub_command_find ("help")) + grub_printf ("Try `help' for usage\n"); } quit: diff --git a/kern/term.c b/kern/term.c index 3583a301d..03e2ae573 100644 --- a/kern/term.c +++ b/kern/term.c @@ -140,6 +140,15 @@ grub_checkkey (void) return (grub_cur_term_input->checkkey) (); } +int +grub_getkeystatus (void) +{ + if (grub_cur_term_input->getkeystatus) + return (grub_cur_term_input->getkeystatus) (); + else + return 0; +} + grub_uint16_t grub_getxy (void) { diff --git a/loader/i386/bsd.c b/loader/i386/bsd.c index 5badb7932..1accfb660 100644 --- a/loader/i386/bsd.c +++ b/loader/i386/bsd.c @@ -33,12 +33,14 @@ #include #include #include +#include + #ifdef GRUB_MACHINE_PCBIOS #include +#endif #include #include #include -#endif #define ALIGN_DWORD(a) ALIGN_UP (a, 4) #define ALIGN_QWORD(a) ALIGN_UP (a, 8) @@ -54,33 +56,80 @@ static grub_uint32_t bootflags; static char *mod_buf; static grub_uint32_t mod_buf_len, mod_buf_max, kern_end_mdofs; static int is_elf_kernel, is_64bit; +static char *netbsd_root = NULL; + +static const struct grub_arg_option freebsd_opts[] = + { + {"dual", 'D', 0, "Display output on all consoles.", 0, 0}, + {"serial", 'h', 0, "Use serial console.", 0, 0}, + {"askname", 'a', 0, "Ask for file name to reboot from.", 0, 0}, + {"cdrom", 'C', 0, "Use cdrom as root.", 0, 0}, + {"config", 'c', 0, "Invoke user configuration routing.", 0, 0}, + {"kdb", 'd', 0, "Enter in KDB on boot.", 0, 0}, + {"gdb", 'g', 0, "Use GDB remote debugger instead of DDB.", 0, 0}, + {"mute", 'm', 0, "Disable all boot output.", 0, 0}, + {"nointr", 'n', 0, "", 0, 0}, + {"pause", 'p', 0, "Wait for keypress after every line of output.", 0, 0}, + {"quiet", 'q', 0, "", 0, 0}, + {"dfltroot", 'r', 0, "Use compiled-in rootdev.", 0, 0}, + {"single", 's', 0, "Boot into single mode.", 0, 0}, + {"verbose", 'v', 0, "Boot with verbose messages.", 0, 0}, + {0, 0, 0, 0, 0, 0} + }; -static const char freebsd_opts[] = "DhaCcdgmnpqrsv"; static const grub_uint32_t freebsd_flags[] = { FREEBSD_RB_DUAL, FREEBSD_RB_SERIAL, FREEBSD_RB_ASKNAME, FREEBSD_RB_CDROM, FREEBSD_RB_CONFIG, FREEBSD_RB_KDB, FREEBSD_RB_GDB, FREEBSD_RB_MUTE, FREEBSD_RB_NOINTR, FREEBSD_RB_PAUSE, FREEBSD_RB_QUIET, FREEBSD_RB_DFLTROOT, - FREEBSD_RB_SINGLE, FREEBSD_RB_VERBOSE + FREEBSD_RB_SINGLE, FREEBSD_RB_VERBOSE, 0 }; -static const char openbsd_opts[] = "abcsd"; +static const struct grub_arg_option openbsd_opts[] = + { + {"askname", 'a', 0, "Ask for file name to reboot from.", 0, 0}, + {"halt", 'b', 0, "Don't reboot, just halt.", 0, 0}, + {"config", 'c', 0, "Change configured devices.", 0, 0}, + {"single", 's', 0, "Boot into single mode.", 0, 0}, + {"kdb", 'd', 0, "Enter in KDB on boot.", 0, 0}, + {0, 0, 0, 0, 0, 0} + }; + static const grub_uint32_t openbsd_flags[] = { OPENBSD_RB_ASKNAME, OPENBSD_RB_HALT, OPENBSD_RB_CONFIG, - OPENBSD_RB_SINGLE, OPENBSD_RB_KDB + OPENBSD_RB_SINGLE, OPENBSD_RB_KDB, 0 }; -static const char netbsd_opts[] = "abcdmqsvxz"; +static const struct grub_arg_option netbsd_opts[] = + { + {"no-smp", '1', 0, "Disable SMP.", 0, 0}, + {"no-acpi", '2', 0, "Disable ACPI.", 0, 0}, + {"askname", 'a', 0, "Ask for file name to reboot from.", 0, 0}, + {"halt", 'b', 0, "Don't reboot, just halt.", 0, 0}, + {"config", 'c', 0, "Change configured devices.", 0, 0}, + {"kdb", 'd', 0, "Enter in KDB on boot.", 0, 0}, + {"miniroot", 'm', 0, "", 0, 0}, + {"quiet", 'q', 0, "Don't display boot diagnostic messages.", 0, 0}, + {"single", 's', 0, "Boot into single mode.", 0, 0}, + {"verbose", 'v', 0, "Boot with verbose messages.", 0, 0}, + {"debug", 'x', 0, "Boot with debug messages.", 0, 0}, + {"silent", 'z', 0, "Supress normal output (warnings remain).", 0, 0}, + {"root", 'r', 0, "Set root device.", "DEVICE", ARG_TYPE_STRING}, + {0, 0, 0, 0, 0, 0} + }; + static const grub_uint32_t netbsd_flags[] = { - NETBSD_RB_ASKNAME, NETBSD_RB_HALT, NETBSD_RB_USERCONFIG, - NETBSD_RB_KDB, NETBSD_RB_MINIROOT, NETBSD_AB_QUIET, - NETBSD_RB_SINGLE, NETBSD_AB_VERBOSE, NETBSD_AB_DEBUG, - NETBSD_AB_SILENT + NETBSD_AB_NOSMP, NETBSD_AB_NOACPI, NETBSD_RB_ASKNAME, + NETBSD_RB_HALT, NETBSD_RB_USERCONFIG, NETBSD_RB_KDB, + NETBSD_RB_MINIROOT, NETBSD_AB_QUIET, NETBSD_RB_SINGLE, + NETBSD_AB_VERBOSE, NETBSD_AB_DEBUG, NETBSD_AB_SILENT, 0 }; +#define NETBSD_ROOT_ARG (ARRAY_SIZE (netbsd_flags) - 1) + static void grub_bsd_get_device (grub_uint32_t * biosdev, grub_uint32_t * unit, @@ -89,7 +138,11 @@ grub_bsd_get_device (grub_uint32_t * biosdev, char *p; grub_device_t dev; +#ifdef GRUB_MACHINE_PCBIOS *biosdev = grub_get_root_biosnumber () & 0xff; +#else + *biosdev = 0xff; +#endif *unit = (*biosdev & 0x7f); *slice = 0xff; *part = 0xff; @@ -525,6 +578,14 @@ grub_openbsd_boot (void) pm->type = OPENBSD_MMAP_AVAILABLE; break; + case GRUB_MACHINE_MEMORY_ACPI: + pm->type = OPENBSD_MMAP_ACPI; + break; + + case GRUB_MACHINE_MEMORY_NVS: + pm->type = OPENBSD_MMAP_NVS; + break; + default: pm->type = OPENBSD_MMAP_RESERVED; break; @@ -540,6 +601,12 @@ grub_openbsd_boot (void) pm = (struct grub_openbsd_bios_mmap *) (pa + 1); grub_mmap_iterate (hook); + /* Memory map terminator. */ + pm->addr = 0; + pm->len = 0; + pm->type = 0; + pm++; + pa->ba_size = (char *) pm - (char *) pa; pa->ba_next = (struct grub_openbsd_bootargs *) pm; pa = pa->ba_next; @@ -551,8 +618,8 @@ grub_openbsd_boot (void) (part << OPENBSD_B_PARTSHIFT)); grub_unix_real_boot (entry, bootflags, bootdev, OPENBSD_BOOTARG_APIVER, - 0, grub_mmap_get_upper () >> 10, - grub_mmap_get_lower () >> 10, + 0, (grub_uint32_t) (grub_mmap_get_upper () >> 10), + (grub_uint32_t) (grub_mmap_get_lower () >> 10), (char *) pa - buf, buf); /* Not reached. */ @@ -562,26 +629,93 @@ grub_openbsd_boot (void) static grub_err_t grub_netbsd_boot (void) { - struct grub_netbsd_btinfo_rootdevice *rootdev; struct grub_netbsd_bootinfo *bootinfo; - grub_uint32_t biosdev, unit, slice, part; + int count = 0; + struct grub_netbsd_btinfo_mmap_header *mmap; + struct grub_netbsd_btinfo_mmap_entry *pm; + void *curarg; - grub_bsd_get_device (&biosdev, &unit, &slice, &part); + auto int NESTED_FUNC_ATTR count_hook (grub_uint64_t, grub_uint64_t, grub_uint32_t); + int NESTED_FUNC_ATTR count_hook (grub_uint64_t addr __attribute__ ((unused)), + grub_uint64_t size __attribute__ ((unused)), + grub_uint32_t type __attribute__ ((unused))) + { + count++; + return 0; + } - rootdev = (struct grub_netbsd_btinfo_rootdevice *) GRUB_BSD_TEMP_BUFFER; + auto int NESTED_FUNC_ATTR fill_hook (grub_uint64_t, grub_uint64_t, grub_uint32_t); + int NESTED_FUNC_ATTR fill_hook (grub_uint64_t addr, grub_uint64_t size, grub_uint32_t type) + { + pm->addr = addr; + pm->len = size; - rootdev->common.len = sizeof (struct grub_netbsd_btinfo_rootdevice); - rootdev->common.type = NETBSD_BTINFO_ROOTDEVICE; - grub_sprintf (rootdev->devname, "%cd%d%c", (biosdev & 0x80) ? 'w' : 'f', - unit, 'a' + part); + switch (type) + { + case GRUB_MACHINE_MEMORY_AVAILABLE: + pm->type = NETBSD_MMAP_AVAILABLE; + break; - bootinfo = (struct grub_netbsd_bootinfo *) (rootdev + 1); - bootinfo->bi_count = 1; - bootinfo->bi_data[0] = rootdev; + case GRUB_MACHINE_MEMORY_ACPI: + pm->type = NETBSD_MMAP_ACPI; + break; + + case GRUB_MACHINE_MEMORY_NVS: + pm->type = NETBSD_MMAP_NVS; + break; + + default: + pm->type = NETBSD_MMAP_RESERVED; + break; + } + pm++; + + return 0; + } + + grub_mmap_iterate (count_hook); + + if (kern_end + sizeof (struct grub_netbsd_btinfo_rootdevice) + + sizeof (struct grub_netbsd_bootinfo) + + sizeof (struct grub_netbsd_btinfo_mmap_header) + + count * sizeof (struct grub_netbsd_btinfo_mmap_entry) + > grub_os_area_addr + grub_os_area_size) + return grub_error (GRUB_ERR_OUT_OF_MEMORY, "No memory for boot info."); + + curarg = mmap = (struct grub_netbsd_btinfo_mmap_header *) kern_end; + pm = (struct grub_netbsd_btinfo_mmap_entry *) (mmap + 1); + + grub_mmap_iterate (fill_hook); + mmap->common.type = NETBSD_BTINFO_MEMMAP; + mmap->common.len = (char *) pm - (char *) mmap; + mmap->count = count; + curarg = pm; + + if (netbsd_root) + { + struct grub_netbsd_btinfo_rootdevice *rootdev; + + rootdev = (struct grub_netbsd_btinfo_rootdevice *) curarg; + + rootdev->common.len = sizeof (struct grub_netbsd_btinfo_rootdevice); + rootdev->common.type = NETBSD_BTINFO_ROOTDEVICE; + grub_strncpy (rootdev->devname, netbsd_root, sizeof (rootdev->devname)); + + bootinfo = (struct grub_netbsd_bootinfo *) (rootdev + 1); + bootinfo->bi_count = 2; + bootinfo->bi_data[0] = mmap; + bootinfo->bi_data[1] = rootdev; + } + else + { + bootinfo = (struct grub_netbsd_bootinfo *) curarg; + bootinfo->bi_count = 1; + bootinfo->bi_data[0] = mmap; + } grub_unix_real_boot (entry, bootflags, 0, bootinfo, - 0, grub_mmap_get_upper () >> 10, - grub_mmap_get_lower () >> 10); + 0, (grub_uint32_t) (grub_mmap_get_upper () >> 10), + (grub_uint32_t) (grub_mmap_get_lower () >> 10)); /* Not reached. */ return GRUB_ERR_NONE; @@ -600,6 +734,9 @@ grub_bsd_unload (void) kernel_type = KERNEL_TYPE_NONE; grub_dl_unref (my_mod); + grub_free (netbsd_root); + netbsd_root = NULL; + return GRUB_ERR_NONE; } @@ -733,8 +870,18 @@ grub_bsd_load_elf (grub_elf_t elf) else if (grub_elf_is_elf64 (elf)) { is_64bit = 1; - entry = elf->ehdr.ehdr64.e_entry & 0xffffffff; - entry_hi = (elf->ehdr.ehdr64.e_entry >> 32) & 0xffffffff; + + /* FreeBSD has 64-bit entry point. */ + if (kernel_type == KERNEL_TYPE_FREEBSD) + { + entry = elf->ehdr.ehdr64.e_entry & 0xffffffff; + entry_hi = (elf->ehdr.ehdr64.e_entry >> 32) & 0xffffffff; + } + else + { + entry = elf->ehdr.ehdr64.e_entry & 0x0fffffff; + entry_hi = 0; + } return grub_elf64_load (elf, grub_bsd_elf64_hook, 0, 0); } else @@ -785,41 +932,24 @@ fail: } static grub_uint32_t -grub_bsd_parse_flags (char *str, const char *opts, +grub_bsd_parse_flags (const struct grub_arg_list *state, const grub_uint32_t * flags) { grub_uint32_t result = 0; + unsigned i; - while (*str) - { - const char *po; - const grub_uint32_t *pf; - - po = opts; - pf = flags; - while (*po) - { - if (*str == *po) - { - result |= *pf; - break; - } - po++; - pf++; - } - str++; - } + for (i = 0; flags[i]; i++) + if (state[i].set) + result |= flags[i]; return result; } static grub_err_t -grub_cmd_freebsd (grub_command_t cmd __attribute__ ((unused)), - int argc, char *argv[]) +grub_cmd_freebsd (grub_extcmd_t cmd, int argc, char *argv[]) { kernel_type = KERNEL_TYPE_FREEBSD; - bootflags = ((argc <= 1) ? 0 : - grub_bsd_parse_flags (argv[1], freebsd_opts, freebsd_flags)); + bootflags = grub_bsd_parse_flags (cmd->state, freebsd_flags); if (grub_bsd_load (argc, argv) == GRUB_ERR_NONE) { @@ -879,12 +1009,10 @@ grub_cmd_freebsd (grub_command_t cmd __attribute__ ((unused)), } static grub_err_t -grub_cmd_openbsd (grub_command_t cmd __attribute__ ((unused)), - int argc, char *argv[]) +grub_cmd_openbsd (grub_extcmd_t cmd, int argc, char *argv[]) { kernel_type = KERNEL_TYPE_OPENBSD; - bootflags = ((argc <= 1) ? 0 : - grub_bsd_parse_flags (argv[1], openbsd_opts, openbsd_flags)); + bootflags = grub_bsd_parse_flags (cmd->state, openbsd_flags); if (grub_bsd_load (argc, argv) == GRUB_ERR_NONE) grub_loader_set (grub_openbsd_boot, grub_bsd_unload, 1); @@ -893,15 +1021,17 @@ grub_cmd_openbsd (grub_command_t cmd __attribute__ ((unused)), } static grub_err_t -grub_cmd_netbsd (grub_command_t cmd __attribute__ ((unused)), - int argc, char *argv[]) +grub_cmd_netbsd (grub_extcmd_t cmd, int argc, char *argv[]) { kernel_type = KERNEL_TYPE_NETBSD; - bootflags = ((argc <= 1) ? 0 : - grub_bsd_parse_flags (argv[1], netbsd_opts, netbsd_flags)); + bootflags = grub_bsd_parse_flags (cmd->state, netbsd_flags); if (grub_bsd_load (argc, argv) == GRUB_ERR_NONE) - grub_loader_set (grub_netbsd_boot, grub_bsd_unload, 1); + { + grub_loader_set (grub_netbsd_boot, grub_bsd_unload, 1); + if (cmd->state[NETBSD_ROOT_ARG].set) + netbsd_root = grub_strdup (cmd->state[NETBSD_ROOT_ARG].arg); + } return grub_errno; } @@ -1112,21 +1242,24 @@ grub_cmd_freebsd_module_elf (grub_command_t cmd __attribute__ ((unused)), } -static grub_command_t cmd_freebsd, cmd_openbsd, cmd_netbsd; +static grub_extcmd_t cmd_freebsd, cmd_openbsd, cmd_netbsd; static grub_command_t cmd_freebsd_loadenv, cmd_freebsd_module; static grub_command_t cmd_freebsd_module_elf; GRUB_MOD_INIT (bsd) { - cmd_freebsd = - grub_register_command ("freebsd", grub_cmd_freebsd, - 0, "load kernel of FreeBSD"); - cmd_openbsd = - grub_register_command ("openbsd", grub_cmd_openbsd, - 0, "load kernel of OpenBSD"); - cmd_netbsd = - grub_register_command ("netbsd", grub_cmd_netbsd, - 0, "load kernel of NetBSD"); + cmd_freebsd = grub_register_extcmd ("freebsd", grub_cmd_freebsd, + GRUB_COMMAND_FLAG_BOTH, + "freebsd FILE", "Load kernel of FreeBSD.", + freebsd_opts); + cmd_openbsd = grub_register_extcmd ("openbsd", grub_cmd_openbsd, + GRUB_COMMAND_FLAG_BOTH, + "openbsd FILE", "Load kernel of OpenBSD.", + openbsd_opts); + cmd_netbsd = grub_register_extcmd ("netbsd", grub_cmd_netbsd, + GRUB_COMMAND_FLAG_BOTH, + "netbsd FILE", "Load kernel of NetBSD.", + netbsd_opts); cmd_freebsd_loadenv = grub_register_command ("freebsd_loadenv", grub_cmd_freebsd_loadenv, 0, "load FreeBSD env"); @@ -1142,9 +1275,9 @@ GRUB_MOD_INIT (bsd) GRUB_MOD_FINI (bsd) { - grub_unregister_command (cmd_freebsd); - grub_unregister_command (cmd_openbsd); - grub_unregister_command (cmd_netbsd); + grub_unregister_extcmd (cmd_freebsd); + grub_unregister_extcmd (cmd_openbsd); + grub_unregister_extcmd (cmd_netbsd); grub_unregister_command (cmd_freebsd_loadenv); grub_unregister_command (cmd_freebsd_module); diff --git a/loader/i386/bsdXX.c b/loader/i386/bsdXX.c index 3f15579dd..aedc204b2 100644 --- a/loader/i386/bsdXX.c +++ b/loader/i386/bsdXX.c @@ -197,15 +197,15 @@ SUFFIX (grub_freebsd_load_elfmodule) (grub_file_t file, int argc, char *argv[], if (curload < module + sizeof (e)) curload = module + sizeof (e); - load (file, UINT_TO_PTR (module + e.e_shoff), e.e_shoff, + load (file, UINT_TO_PTR (curload), e.e_shoff, e.e_shnum * e.e_shentsize); - if (curload < module + e.e_shoff + e.e_shnum * e.e_shentsize) - curload = module + e.e_shoff + e.e_shnum * e.e_shentsize; + e.e_shoff = curload - module; + curload += e.e_shnum * e.e_shentsize; - load (file, UINT_TO_PTR (module + e.e_phoff), e.e_phoff, + load (file, UINT_TO_PTR (curload), e.e_phoff, e.e_phnum * e.e_phentsize); - if (curload < module + e.e_phoff + e.e_phnum * e.e_phentsize) - curload = module + e.e_phoff + e.e_phnum * e.e_phentsize; + e.e_phoff = curload - module; + curload += e.e_phnum * e.e_phentsize; *kern_end = curload; diff --git a/loader/i386/linux.c b/loader/i386/linux.c index 4144384db..4bdb09b24 100644 --- a/loader/i386/linux.c +++ b/loader/i386/linux.c @@ -33,6 +33,7 @@ #include #include #include +#include #define GRUB_LINUX_CL_OFFSET 0x1000 #define GRUB_LINUX_CL_END_OFFSET 0x2000 @@ -416,6 +417,33 @@ grub_linux_setup_video (struct linux_kernel_params *params) params->reserved_mask_size = mode_info.reserved_mask_size; params->reserved_field_pos = mode_info.reserved_field_pos; + +#ifdef GRUB_MACHINE_PCBIOS + /* VESA packed modes may come with zeroed mask sizes, which need + to be set here according to DAC Palette width. If we don't, + this results in Linux displaying a black screen. */ + if (mode_info.bpp <= 8) + { + struct grub_vbe_info_block controller_info; + int status; + int width = 8; + + status = grub_vbe_bios_get_controller_info (&controller_info); + + if (status == GRUB_VBE_STATUS_OK && + (controller_info.capabilities & GRUB_VBE_CAPABILITY_DACWIDTH)) + status = grub_vbe_bios_set_dac_palette_width (&width); + + if (status != GRUB_VBE_STATUS_OK) + /* 6 is default after mode reset. */ + width = 6; + + params->red_mask_size = params->green_mask_size + = params->blue_mask_size = width; + params->reserved_mask_size = 0; + } +#endif + return 0; } diff --git a/loader/i386/xnu.c b/loader/i386/xnu.c index 06e375c69..275b50dbc 100644 --- a/loader/i386/xnu.c +++ b/loader/i386/xnu.c @@ -247,7 +247,7 @@ grub_cpu_xnu_fill_devicetree (void) curval->datasize = (SYSTEM_TABLE_SIZEOF (firmware_revision)); curval->data = grub_malloc (curval->datasize); if (! curval->data) - return grub_error (GRUB_ERR_OUT_OF_MEMORY, "couldn't create device tree"); + return grub_errno; grub_memcpy (curval->data, (SYSTEM_TABLE_VAR(firmware_revision)), curval->datasize); @@ -258,7 +258,7 @@ grub_cpu_xnu_fill_devicetree (void) 2 * (utf16_strlen (SYSTEM_TABLE_PTR (firmware_vendor)) + 1); curval->data = grub_malloc (curval->datasize); if (! curval->data) - return grub_error (GRUB_ERR_OUT_OF_MEMORY, "couldn't create device tree"); + return grub_errno; grub_memcpy (curval->data, SYSTEM_TABLE_PTR (firmware_vendor), curval->datasize); @@ -268,7 +268,7 @@ grub_cpu_xnu_fill_devicetree (void) curval->datasize = sizeof ("EFI32"); curval->data = grub_malloc (curval->datasize); if (! curval->data) - return grub_error (GRUB_ERR_OUT_OF_MEMORY, "couldn't create device tree"); + return grub_errno; if (SIZEOF_OF_UINTN == 4) grub_memcpy (curval->data, "EFI32", curval->datasize); else @@ -287,7 +287,7 @@ grub_cpu_xnu_fill_devicetree (void) curval->datasize = sizeof (grub_uint64_t); curval->data = grub_malloc (curval->datasize); if (!curval->data) - return grub_error (GRUB_ERR_OUT_OF_MEMORY, "couldn't create device tree"); + return grub_errno; /* First see if user supplies the value. */ char *fsbvar = grub_env_get ("fsb"); @@ -362,8 +362,7 @@ grub_cpu_xnu_fill_devicetree (void) curval->datasize = sizeof (guid); curval->data = grub_malloc (curval->datasize); if (! curval->data) - return grub_error (GRUB_ERR_OUT_OF_MEMORY, - "couldn't create device tree"); + return grub_errno; grub_memcpy (curval->data, &guid, curval->datasize); /* The value "table". */ @@ -373,8 +372,7 @@ grub_cpu_xnu_fill_devicetree (void) curval->datasize = SIZEOF_OF_UINTN; curval->data = grub_malloc (curval->datasize); if (! curval->data) - return grub_error (GRUB_ERR_OUT_OF_MEMORY, - "couldn't create device tree"); + return grub_errno; if (SIZEOF_OF_UINTN == 4) *((grub_uint32_t *)curval->data) = PTR_TO_UINT32 (ptr); else @@ -392,8 +390,7 @@ grub_cpu_xnu_fill_devicetree (void) curval->datasize = grub_strlen (table_aliases[j].name) + 1; curval->data = grub_malloc (curval->datasize); if (!curval->data) - return grub_error (GRUB_ERR_OUT_OF_MEMORY, - "couldn't create device tree"); + return grub_errno; grub_memcpy (curval->data, table_aliases[j].name, curval->datasize); } } @@ -409,8 +406,7 @@ grub_cpu_xnu_fill_devicetree (void) curval->datasize = SIZEOF_OF_UINTN; curval->data = grub_malloc (curval->datasize); if (! curval->data) - return grub_error (GRUB_ERR_OUT_OF_MEMORY, - "couldn't create device tree"); + return grub_errno; if (SIZEOF_OF_UINTN == 4) *((grub_uint32_t *) curval->data) = PTR_TO_UINT32 (SYSTEM_TABLE_PTR (runtime_services)); diff --git a/mmap/mmap.c b/mmap/mmap.c index f2407c0bd..7598cf501 100644 --- a/mmap/mmap.c +++ b/mmap/mmap.c @@ -368,8 +368,8 @@ grub_cmd_badram (grub_command_t cmd __attribute__ ((unused)), iterator++) { grub_dprintf ("badram", "%llx (size %llx) is a badram range\n", - (long long) cur, (long long) (1ULL << tail) - 1); - grub_mmap_register (cur, (1ULL << tail) - 1, GRUB_MACHINE_MEMORY_HOLE); + (unsigned long long) cur, (1ULL << tail)); + grub_mmap_register (cur, (1ULL << tail), GRUB_MACHINE_MEMORY_HOLE); } return 0; } diff --git a/normal/auth.c b/normal/auth.c new file mode 100644 index 000000000..9029ba1ce --- /dev/null +++ b/normal/auth.c @@ -0,0 +1,256 @@ +/* + * 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 . + */ + +#include +#include +#include +#include +#include +#include + +struct grub_auth_user +{ + struct grub_auth_user *next; + char *name; + grub_auth_callback_t callback; + void *arg; + int authenticated; +}; + +struct grub_auth_user *users = NULL; + +int +grub_auth_strcmp (const char *user_input, const char *template) +{ + int ok = 1; + const char *ptr1, *ptr2; + for (ptr1 = user_input, ptr2 = template; *ptr1; ptr1++) + if (*ptr1 == (ptr2 ? *ptr2 : ptr1[1]) && ok && ptr2 != NULL) + ptr2++; + else + ok = 0; + + return !ok; +} + +static int +grub_iswordseparator (int c) +{ + return (grub_isspace (c) || c == ',' || c == ';' || c == '|' || c == '&'); +} + +int +grub_auth_strword (const char *haystack, const char *needle) +{ + const char *n_pos = needle; + int found = 0; + + while (grub_iswordseparator (*haystack)) + haystack++; + + while (*haystack) + { + int ok = 1; + /* Crawl both the needle and the haystack word we're on. */ + while(*haystack && !grub_iswordseparator (*haystack)) + { + if (*haystack == *n_pos && ok) + n_pos++; + else + ok = 0; + + haystack++; + } + + if (ok) + found = 1; + } + + return found; +} + +grub_err_t +grub_auth_register_authentication (const char *user, + grub_auth_callback_t callback, + void *arg) +{ + struct grub_auth_user *cur; + + cur = grub_named_list_find (GRUB_AS_NAMED_LIST (users), user); + if (!cur) + cur = grub_zalloc (sizeof (*cur)); + if (!cur) + return grub_errno; + cur->callback = callback; + cur->arg = arg; + if (! cur->name) + { + cur->name = grub_strdup (user); + if (!cur->name) + { + grub_free (cur); + return grub_errno; + } + grub_list_push (GRUB_AS_LIST_P (&users), GRUB_AS_LIST (cur)); + } + return GRUB_ERR_NONE; +} + +grub_err_t +grub_auth_unregister_authentication (const char *user) +{ + struct grub_auth_user *cur; + cur = grub_named_list_find (GRUB_AS_NAMED_LIST (users), user); + if (!cur) + return grub_error (GRUB_ERR_BAD_ARGUMENT, "user '%s' not found", user); + if (!cur->authenticated) + { + grub_free (cur->name); + grub_list_remove (GRUB_AS_LIST_P (&users), GRUB_AS_LIST (cur)); + grub_free (cur); + } + else + { + cur->callback = NULL; + cur->arg = NULL; + } + return GRUB_ERR_NONE; +} + +grub_err_t +grub_auth_authenticate (const char *user) +{ + struct grub_auth_user *cur; + + cur = grub_named_list_find (GRUB_AS_NAMED_LIST (users), user); + if (!cur) + cur = grub_zalloc (sizeof (*cur)); + if (!cur) + return grub_errno; + + cur->authenticated = 1; + + if (! cur->name) + { + cur->name = grub_strdup (user); + if (!cur->name) + { + grub_free (cur); + return grub_errno; + } + grub_list_push (GRUB_AS_LIST_P (&users), GRUB_AS_LIST (cur)); + } + + return GRUB_ERR_NONE; +} + +grub_err_t +grub_auth_deauthenticate (const char *user) +{ + struct grub_auth_user *cur; + cur = grub_named_list_find (GRUB_AS_NAMED_LIST (users), user); + if (!cur) + return grub_error (GRUB_ERR_BAD_ARGUMENT, "user '%s' not found", user); + if (!cur->callback) + { + grub_free (cur->name); + grub_list_remove (GRUB_AS_LIST_P (&users), GRUB_AS_LIST (cur)); + grub_free (cur); + } + else + cur->authenticated = 0; + return GRUB_ERR_NONE; +} + +static int +is_authenticated (const char *userlist) +{ + const char *superusers; + + auto int hook (grub_list_t item); + int hook (grub_list_t item) + { + const char *name; + if (!((struct grub_auth_user *) item)->authenticated) + return 0; + name = ((struct grub_auth_user *) item)->name; + + return (userlist && grub_auth_strword (userlist, name)) + || grub_auth_strword (superusers, name); + } + + superusers = grub_env_get ("superusers"); + + if (!superusers) + return 1; + + return grub_list_iterate (GRUB_AS_LIST (users), hook); +} + +grub_err_t +grub_auth_check_authentication (const char *userlist) +{ + char login[1024]; + struct grub_auth_user *cur = NULL; + grub_err_t err; + + auto int hook (grub_list_t item); + int hook (grub_list_t item) + { + if (grub_auth_strcmp (login, ((struct grub_auth_user *) item)->name) == 0) + cur = (struct grub_auth_user *) item; + return 0; + } + + auto int hook_any (grub_list_t item); + int hook_any (grub_list_t item) + { + if (((struct grub_auth_user *) item)->callback) + cur = (struct grub_auth_user *) item; + return 0; + } + + grub_memset (login, 0, sizeof (login)); + + if (is_authenticated (userlist)) + return GRUB_ERR_NONE; + + if (!grub_cmdline_get ("Enter username: ", login, sizeof (login) - 1, + 0, 0, 0)) + return GRUB_ACCESS_DENIED; + + grub_list_iterate (GRUB_AS_LIST (users), hook); + + if (!cur || ! cur->callback) + { + grub_list_iterate (GRUB_AS_LIST (users), hook_any); + + /* No users present at all. */ + if (!cur) + return GRUB_ACCESS_DENIED; + + /* Display any of available authentication schemes. */ + err = cur->callback (login, 0); + + return GRUB_ACCESS_DENIED; + } + err = cur->callback (login, cur->arg); + if (is_authenticated (userlist)) + return GRUB_ERR_NONE; + return GRUB_ACCESS_DENIED; +} diff --git a/normal/cmdline.c b/normal/cmdline.c index 9a07d7d59..7a5b6ec84 100644 --- a/normal/cmdline.c +++ b/normal/cmdline.c @@ -181,7 +181,7 @@ print_completion (const char *item, grub_completion_type_t type, int count) /* FIXME: The dumb interface is not supported yet. */ int grub_cmdline_get (const char *prompt, char cmdline[], unsigned max_len, - int echo_char, int readline) + int echo_char, int readline, int history) { unsigned xpos, ypos, ystart; grub_size_t lpos, llen; @@ -273,14 +273,14 @@ grub_cmdline_get (const char *prompt, char cmdline[], unsigned max_len, if ((grub_getxy () >> 8) != 0) grub_putchar ('\n'); - grub_printf (prompt); + grub_printf ("%s", prompt); xpos = plen; ystart = ypos = (grub_getxy () & 0xFF); cl_insert (cmdline); - if (hist_used == 0) + if (history && hist_used == 0) grub_history_add (buf); while ((key = GRUB_TERM_ASCII_CHAR (grub_getkey ())) != '\n' && key != '\r') @@ -468,11 +468,14 @@ grub_cmdline_get (const char *prompt, char cmdline[], unsigned max_len, while (buf[lpos] == ' ') lpos++; - histpos = 0; - if (grub_strlen (buf) > 0) + if (history) { - grub_history_replace (histpos, buf); - grub_history_add (""); + histpos = 0; + if (grub_strlen (buf) > 0) + { + grub_history_replace (histpos, buf); + grub_history_add (""); + } } grub_memcpy (cmdline, buf + lpos, llen - lpos + 1); diff --git a/normal/main.c b/normal/main.c index 66d841867..748eef805 100644 --- a/normal/main.c +++ b/normal/main.c @@ -28,6 +28,7 @@ #include #include #include +#include #define GRUB_DEFAULT_HISTORY_SIZE 50 @@ -164,6 +165,7 @@ grub_normal_add_menu_entry (int argc, const char **args, int i; struct grub_menu_entry_class *classes_head; /* Dummy head node for list. */ struct grub_menu_entry_class *classes_tail; + char *users = NULL; /* Allocate dummy head node for class list. */ classes_head = grub_zalloc (sizeof (struct grub_menu_entry_class)); @@ -218,6 +220,18 @@ grub_normal_add_menu_entry (int argc, const char **args, classes_tail = new_class; continue; } + else if (grub_strcmp(arg, "users") == 0) + { + i++; + users = grub_strdup (args[i]); + if (! users) + { + failed = 1; + break; + } + + continue; + } else { /* Handle invalid argument. */ @@ -275,6 +289,9 @@ grub_normal_add_menu_entry (int argc, const char **args, (*last)->title = menutitle; (*last)->classes = classes_head; + if (users) + (*last)->restricted = 1; + (*last)->users = users; (*last)->sourcecode = menusourcecode; menu->size++; @@ -465,7 +482,19 @@ quit: void grub_cmdline_run (int nested) { - grub_reader_t reader = grub_reader_get_current (); + grub_reader_t reader; + grub_err_t err = GRUB_ERR_NONE; + + err = grub_auth_check_authentication (NULL); + + if (err) + { + grub_print_error (); + grub_errno = GRUB_ERR_NONE; + return; + } + + reader = grub_reader_get_current (); reader_nested = nested; if (reader->init) @@ -501,7 +530,7 @@ grub_normal_read_line (char **line, int cont) while (1) { cmdline[0] = 0; - if (grub_cmdline_get (prompt, cmdline, sizeof (cmdline), 0, 1)) + if (grub_cmdline_get (prompt, cmdline, sizeof (cmdline), 0, 1, 1)) break; if ((reader_nested) || (cont)) diff --git a/normal/menu.c b/normal/menu.c index 59ad83fa7..8ee7d1c22 100644 --- a/normal/menu.c +++ b/normal/menu.c @@ -26,6 +26,7 @@ #include #include #include +#include /* Get a menu entry by its index in the entry list. */ grub_menu_entry_t @@ -124,6 +125,18 @@ get_and_remove_first_entry_number (const char *name) void grub_menu_execute_entry(grub_menu_entry_t entry) { + grub_err_t err = GRUB_ERR_NONE; + + if (entry->restricted) + err = grub_auth_check_authentication (entry->users); + + if (err) + { + grub_print_error (); + grub_errno = GRUB_ERR_NONE; + return; + } + grub_parser_execute ((char *) entry->sourcecode); if (grub_errno == GRUB_ERR_NONE && grub_loader_is_loaded ()) diff --git a/normal/menu_entry.c b/normal/menu_entry.c index f7662ff75..75a63779f 100644 --- a/normal/menu_entry.c +++ b/normal/menu_entry.c @@ -23,6 +23,7 @@ #include #include #include +#include enum update_mode { @@ -1026,6 +1027,16 @@ grub_menu_entry_run (grub_menu_entry_t entry) { struct screen *screen; int prev_c; + grub_err_t err = GRUB_ERR_NONE; + + err = grub_auth_check_authentication (NULL); + + if (err) + { + grub_print_error (); + grub_errno = GRUB_ERR_NONE; + return; + } screen = make_screen (entry); if (! screen) diff --git a/normal/menu_viewer.c b/normal/menu_viewer.c index 37d317b0b..1bd271a21 100644 --- a/normal/menu_viewer.c +++ b/normal/menu_viewer.c @@ -21,6 +21,7 @@ #include #include #include +#include /* The list of menu viewers. */ static grub_menu_viewer_t menu_viewer_list; @@ -55,9 +56,26 @@ grub_err_t grub_menu_viewer_show_menu (grub_menu_t menu, int nested) { grub_menu_viewer_t cur = get_current_menu_viewer (); + grub_err_t err1, err2; if (!cur) return grub_error (GRUB_ERR_BAD_ARGUMENT, "No menu viewer available."); - return cur->show_menu (menu, nested); + while (1) + { + err1 = cur->show_menu (menu, nested); + grub_print_error (); + + err2 = grub_auth_check_authentication (NULL); + if (err2) + { + grub_print_error (); + grub_errno = GRUB_ERR_NONE; + continue; + } + + break; + } + + return err1; } diff --git a/partmap/acorn.c b/partmap/acorn.c index 42fd61f4a..e005975c0 100644 --- a/partmap/acorn.c +++ b/partmap/acorn.c @@ -189,7 +189,7 @@ acorn_partition_map_get_name (const grub_partition_t p) /* Partition map type. */ static struct grub_partition_map grub_acorn_partition_map = { - .name = "Linux/ADFS partition map", + .name = "part_acorn", .iterate = acorn_partition_map_iterate, .probe = acorn_partition_map_probe, .get_name = acorn_partition_map_get_name diff --git a/partmap/amiga.c b/partmap/amiga.c index ffb807f5a..dce9f4f1f 100644 --- a/partmap/amiga.c +++ b/partmap/amiga.c @@ -198,7 +198,7 @@ amiga_partition_map_get_name (const grub_partition_t p) /* Partition map type. */ static struct grub_partition_map grub_amiga_partition_map = { - .name = "amiga_partition_map", + .name = "part_amiga", .iterate = amiga_partition_map_iterate, .probe = amiga_partition_map_probe, .get_name = amiga_partition_map_get_name diff --git a/partmap/apple.c b/partmap/apple.c index 04ccff146..4dea55a32 100644 --- a/partmap/apple.c +++ b/partmap/apple.c @@ -241,7 +241,7 @@ apple_partition_map_get_name (const grub_partition_t p) /* Partition map type. */ static struct grub_partition_map grub_apple_partition_map = { - .name = "apple_partition_map", + .name = "part_apple", .iterate = apple_partition_map_iterate, .probe = apple_partition_map_probe, .get_name = apple_partition_map_get_name diff --git a/partmap/gpt.c b/partmap/gpt.c index d646d41b8..4a4957437 100644 --- a/partmap/gpt.c +++ b/partmap/gpt.c @@ -22,7 +22,7 @@ #include #include #include -#include +#include #include static grub_uint8_t grub_gpt_magic[8] = @@ -45,7 +45,7 @@ gpt_partition_map_iterate (grub_disk_t disk, struct grub_gpt_header gpt; struct grub_gpt_partentry entry; struct grub_disk raw; - struct grub_pc_partition_mbr mbr; + struct grub_msdos_partition_mbr mbr; grub_uint64_t entries; unsigned int i; int last_offset = 0; @@ -176,7 +176,7 @@ gpt_partition_map_get_name (const grub_partition_t p) /* Partition map type. */ static struct grub_partition_map grub_gpt_partition_map = { - .name = "gpt_partition_map", + .name = "part_gpt", .iterate = gpt_partition_map_iterate, .probe = gpt_partition_map_probe, .get_name = gpt_partition_map_get_name diff --git a/partmap/pc.c b/partmap/msdos.c similarity index 80% rename from partmap/pc.c rename to partmap/msdos.c index 6a2efd21e..6ba7fb927 100644 --- a/partmap/pc.c +++ b/partmap/msdos.c @@ -18,13 +18,13 @@ */ #include -#include +#include #include #include #include #include -static struct grub_partition_map grub_pc_partition_map; +static struct grub_partition_map grub_msdos_partition_map; /* Parse the partition representation in STR and return a partition. */ @@ -32,7 +32,7 @@ static grub_partition_t grub_partition_parse (const char *str) { grub_partition_t p; - struct grub_pc_partition *pcdata; + struct grub_msdos_partition *pcdata; char *s = (char *) str; @@ -40,12 +40,12 @@ grub_partition_parse (const char *str) if (! p) return 0; - pcdata = (struct grub_pc_partition *) grub_malloc (sizeof (*pcdata)); + pcdata = (struct grub_msdos_partition *) grub_malloc (sizeof (*pcdata)); if (! pcdata) goto fail; p->data = pcdata; - p->partmap = &grub_pc_partition_map; + p->partmap = &grub_msdos_partition_map; /* Initialize some of the fields with invalid values. */ pcdata->bsd_part = pcdata->dos_type = pcdata->bsd_type = p->index = -1; @@ -93,10 +93,12 @@ pc_partition_map_iterate (grub_disk_t disk, const grub_partition_t partition)) { struct grub_partition p; - struct grub_pc_partition pcdata; - struct grub_pc_partition_mbr mbr; - struct grub_pc_partition_disk_label label; + struct grub_msdos_partition pcdata; + struct grub_msdos_partition_mbr mbr; + struct grub_msdos_partition_disk_label label; struct grub_disk raw; + int labeln = 0; + grub_disk_addr_t lastaddr; /* Enforce raw disk access. */ raw = *disk; @@ -106,17 +108,33 @@ pc_partition_map_iterate (grub_disk_t disk, pcdata.ext_offset = 0; pcdata.dos_part = -1; p.data = &pcdata; - p.partmap = &grub_pc_partition_map; + p.partmap = &grub_msdos_partition_map; + + /* Any value different than `p.offset' will satisfy the check during + first loop. */ + lastaddr = !p.offset; while (1) { int i; - struct grub_pc_partition_entry *e; + struct grub_msdos_partition_entry *e; /* Read the MBR. */ if (grub_disk_read (&raw, p.offset, 0, sizeof (mbr), &mbr)) goto finish; + /* This is our loop-detection algorithm. It works the following way: + It saves last position which was a power of two. Then it compares the + saved value with a current one. This way it's guaranteed that the loop + will be broken by at most third walk. + */ + if (labeln && lastaddr == p.offset) + return grub_error (GRUB_ERR_BAD_PART_TABLE, "loop detected"); + + labeln++; + if ((labeln & (labeln - 1)) == 0) + lastaddr = p.offset; + /* Check if it is valid. */ if (mbr.signature != grub_cpu_to_le16 (GRUB_PC_PARTITION_SIGNATURE)) return grub_error (GRUB_ERR_BAD_PART_TABLE, "no signature"); @@ -147,8 +165,8 @@ pc_partition_map_iterate (grub_disk_t disk, return grub_error (GRUB_ERR_BAD_PART_TABLE, "dummy mbr"); /* If this partition is a normal one, call the hook. */ - if (! grub_pc_partition_is_empty (e->type) - && ! grub_pc_partition_is_extended (e->type)) + if (! grub_msdos_partition_is_empty (e->type) + && ! grub_msdos_partition_is_extended (e->type)) { pcdata.dos_part++; @@ -156,7 +174,7 @@ pc_partition_map_iterate (grub_disk_t disk, return 1; /* Check if this is a BSD partition. */ - if (grub_pc_partition_is_bsd (e->type)) + if (grub_msdos_partition_is_bsd (e->type)) { /* Check if the BSD label is within the DOS partition. */ if (p.len <= GRUB_PC_PARTITION_BSD_LABEL_SECTOR) @@ -186,7 +204,7 @@ pc_partition_map_iterate (grub_disk_t disk, pcdata.bsd_part < grub_cpu_to_le16 (label.num_partitions); pcdata.bsd_part++) { - struct grub_pc_partition_bsd_entry *be + struct grub_msdos_partition_bsd_entry *be = label.entries + pcdata.bsd_part; p.start = grub_le_to_cpu32 (be->offset); @@ -210,7 +228,7 @@ pc_partition_map_iterate (grub_disk_t disk, { e = mbr.entries + i; - if (grub_pc_partition_is_extended (e->type)) + if (grub_msdos_partition_is_extended (e->type)) { p.offset = pcdata.ext_offset + grub_le_to_cpu32 (e->start); if (! pcdata.ext_offset) @@ -234,14 +252,14 @@ static grub_partition_t pc_partition_map_probe (grub_disk_t disk, const char *str) { grub_partition_t p; - struct grub_pc_partition *pcdata; + struct grub_msdos_partition *pcdata; auto int find_func (grub_disk_t d, const grub_partition_t partition); int find_func (grub_disk_t d __attribute__ ((unused)), const grub_partition_t partition) { - struct grub_pc_partition *partdata = partition->data; + struct grub_msdos_partition *partdata = partition->data; if ((pcdata->dos_part == partdata->dos_part || pcdata->dos_part == -1) && pcdata->bsd_part == partdata->bsd_part) @@ -283,7 +301,7 @@ static char * pc_partition_map_get_name (const grub_partition_t p) { char *name; - struct grub_pc_partition *pcdata = p->data; + struct grub_msdos_partition *pcdata = p->data; name = grub_malloc (13); if (! name) @@ -301,9 +319,9 @@ pc_partition_map_get_name (const grub_partition_t p) /* Partition map type. */ -static struct grub_partition_map grub_pc_partition_map = +static struct grub_partition_map grub_msdos_partition_map = { - .name = "pc_partition_map", + .name = "part_msdos", .iterate = pc_partition_map_iterate, .probe = pc_partition_map_probe, .get_name = pc_partition_map_get_name @@ -311,10 +329,10 @@ static struct grub_partition_map grub_pc_partition_map = GRUB_MOD_INIT(pc_partition_map) { - grub_partition_map_register (&grub_pc_partition_map); + grub_partition_map_register (&grub_msdos_partition_map); } GRUB_MOD_FINI(pc_partition_map) { - grub_partition_map_unregister (&grub_pc_partition_map); + grub_partition_map_unregister (&grub_msdos_partition_map); } diff --git a/partmap/sun.c b/partmap/sun.c index ce6d58899..e816ec17a 100644 --- a/partmap/sun.c +++ b/partmap/sun.c @@ -196,7 +196,7 @@ sun_partition_map_get_name (const grub_partition_t p) /* Partition map type. */ static struct grub_partition_map grub_sun_partition_map = { - .name = "sun_partition_map", + .name = "part_sun", .iterate = sun_partition_map_iterate, .probe = sun_partition_map_probe, .get_name = sun_partition_map_get_name diff --git a/parttool/pcpart.c b/parttool/msdospart.c similarity index 92% rename from parttool/pcpart.c rename to parttool/msdospart.c index 6876d0d58..dbb25bc52 100644 --- a/parttool/pcpart.c +++ b/parttool/msdospart.c @@ -22,7 +22,7 @@ #include #include #include -#include +#include #include #include #include @@ -42,7 +42,7 @@ static grub_err_t grub_pcpart_boot (const grub_device_t dev, { int i, index; grub_partition_t part; - struct grub_pc_partition_mbr mbr; + struct grub_msdos_partition_mbr mbr; if (dev->disk->partition->offset) return grub_error (GRUB_ERR_BAD_ARGUMENT, "not a primary partition"); @@ -92,7 +92,7 @@ static grub_err_t grub_pcpart_type (const grub_device_t dev, int index; grub_uint8_t type; grub_partition_t part; - struct grub_pc_partition_mbr mbr; + struct grub_msdos_partition_mbr mbr; index = dev->disk->partition->index; part = dev->disk->partition; @@ -119,8 +119,8 @@ static grub_err_t grub_pcpart_type (const grub_device_t dev, type &= ~GRUB_PC_PARTITION_TYPE_HIDDEN_FLAG; } - if (grub_pc_partition_is_empty (type) - || grub_pc_partition_is_extended (type)) + if (grub_msdos_partition_is_empty (type) + || grub_msdos_partition_is_extended (type)) { dev->disk->partition = part; return grub_error (GRUB_ERR_BAD_ARGUMENT, "invalid type"); @@ -140,10 +140,10 @@ static grub_err_t grub_pcpart_type (const grub_device_t dev, GRUB_MOD_INIT (pcpart) { - activate_table_handle = grub_parttool_register ("pc_partition_map", + activate_table_handle = grub_parttool_register ("part_msdos", grub_pcpart_boot, grub_pcpart_bootargs); - type_table_handle = grub_parttool_register ("pc_partition_map", + type_table_handle = grub_parttool_register ("part_msdos", grub_pcpart_type, grub_pcpart_typeargs); diff --git a/script/lua/grub_lua.h b/script/lua/grub_lua.h index d5181f147..78e6546c7 100644 --- a/script/lua/grub_lua.h +++ b/script/lua/grub_lua.h @@ -58,7 +58,7 @@ #define setjmp grub_setjmp #define longjmp grub_longjmp -#define fputs(s,f) grub_printf(s) +#define fputs(s,f) grub_printf("%s", s) #define isdigit grub_isdigit #define isalpha grub_isalpha diff --git a/script/sh/execute.c b/script/sh/execute.c index e0b7b2ebf..e9064ad2f 100644 --- a/script/sh/execute.c +++ b/script/sh/execute.c @@ -122,6 +122,10 @@ grub_script_execute_cmdline (struct grub_script_cmd *cmd) grub_errno = GRUB_ERR_NONE; } grub_free (assign); + + grub_sprintf (errnobuf, "%d", grub_errno); + grub_env_set ("?", errnobuf); + return 0; } } diff --git a/script/sh/function.c b/script/sh/function.c index 1e49c709f..a3950a8a0 100644 --- a/script/sh/function.c +++ b/script/sh/function.c @@ -99,7 +99,7 @@ grub_script_function_find (char *functionname) break; if (! func) - grub_error (GRUB_ERR_UNKNOWN_COMMAND, "unknown command `%s'", functionname); + grub_error (GRUB_ERR_UNKNOWN_COMMAND, "unknown command `%.20s'", functionname); return func; } diff --git a/script/sh/lexer.c b/script/sh/lexer.c index 44d7da2ad..a30e3c005 100644 --- a/script/sh/lexer.c +++ b/script/sh/lexer.c @@ -134,8 +134,6 @@ grub_script_yylex (union YYSTYPE *yylval, struct grub_parser_param *parsestate) { grub_parser_state_t newstate; char use; - char *buffer; - char *bp; struct grub_lexer_param *state = parsestate->lexerstate; int firstrun = 1; @@ -212,6 +210,14 @@ grub_script_yylex (union YYSTYPE *yylval, struct grub_parser_param *parsestate) /* Check if it is a text. */ if (check_textstate (newstate)) { + char *buffer = NULL; + int bufpos = 0; + /* Buffer is initially large enough to hold most commands + but extends automatically when needed. */ + int bufsize = 128; + + buffer = grub_malloc (bufsize); + /* In case the string is not quoted, this can be a one char length symbol. */ if (newstate == GRUB_PARSER_STATE_TEXT) @@ -254,16 +260,12 @@ grub_script_yylex (union YYSTYPE *yylval, struct grub_parser_param *parsestate) } } if (doexit) - break; + { + grub_free (buffer); + break; + } } - /* XXX: Use a better size. */ - buffer = grub_script_malloc (parsestate, 2048); - if (! buffer) - return 0; - - bp = buffer; - /* Read one token, possible quoted. */ while (*state->script) { @@ -295,32 +297,47 @@ grub_script_yylex (union YYSTYPE *yylval, struct grub_parser_param *parsestate) } if (breakout) break; - if (use) - *(bp++) = use; } - else if (use) - *(bp++) = use; + + if (use) + { + if (bufsize <= bufpos + 1) + { + bufsize <<= 1; + buffer = grub_realloc (buffer, bufsize); + } + buffer[bufpos++] = use; + } state->state = newstate; nextchar (state); } /* A string of text was read in. */ - *bp = '\0'; + if (bufsize <= bufpos + 1) + { + bufsize <<= 1; + buffer = grub_realloc (buffer, bufsize); + } + + buffer[bufpos++] = 0; + grub_dprintf ("scripting", "token=`%s'\n", buffer); yylval->arg = grub_script_arg_add (parsestate, yylval->arg, GRUB_SCRIPT_ARG_TYPE_STR, buffer); + grub_free (buffer); } else if (newstate == GRUB_PARSER_STATE_VAR || newstate == GRUB_PARSER_STATE_QVAR) { - /* XXX: Use a better size. */ - buffer = grub_script_malloc (parsestate, 2096); - if (! buffer) - return 0; + char *buffer = NULL; + int bufpos = 0; + /* Buffer is initially large enough to hold most commands + but extends automatically when needed. */ + int bufsize = 128; - bp = buffer; + buffer = grub_malloc (bufsize); /* This is a variable, read the variable name. */ while (*state->script) @@ -340,16 +357,33 @@ grub_script_yylex (union YYSTYPE *yylval, struct grub_parser_param *parsestate) } if (use) - *(bp++) = use; + { + if (bufsize <= bufpos + 1) + { + bufsize <<= 1; + buffer = grub_realloc (buffer, bufsize); + } + buffer[bufpos++] = use; + } + nextchar (state); state->state = newstate; } - *bp = '\0'; + if (bufsize <= bufpos + 1) + { + bufsize <<= 1; + buffer = grub_realloc (buffer, bufsize); + } + + buffer[bufpos++] = 0; + state->state = newstate; yylval->arg = grub_script_arg_add (parsestate, yylval->arg, GRUB_SCRIPT_ARG_TYPE_VAR, buffer); grub_dprintf ("scripting", "vartoken=`%s'\n", buffer); + + grub_free (buffer); } else { diff --git a/script/sh/script.c b/script/sh/script.c index cefafe605..c04a44966 100644 --- a/script/sh/script.c +++ b/script/sh/script.c @@ -110,10 +110,13 @@ grub_script_arg_add (struct grub_parser_param *state, struct grub_script_arg *ar { struct grub_script_arg *argpart; struct grub_script_arg *ll; + int len; argpart = (struct grub_script_arg *) grub_script_malloc (state, sizeof (*arg)); argpart->type = type; - argpart->str = str; + len = grub_strlen (str) + 1; + argpart->str = grub_script_malloc (state, len); + grub_memcpy (argpart->str, str, len); argpart->next = 0; if (! arg) diff --git a/term/i386/pc/console.c b/term/i386/pc/console.c index c880595e4..66475d456 100644 --- a/term/i386/pc/console.c +++ b/term/i386/pc/console.c @@ -1,6 +1,6 @@ /* * GRUB -- GRand Unified Bootloader - * Copyright (C) 2002,2003,2005,2007,2008 Free Software Foundation, Inc. + * Copyright (C) 2002,2003,2005,2007,2008,2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,15 +16,41 @@ * along with GRUB. If not, see . */ +#include #include #include #include +static const struct grub_machine_bios_data_area *bios_data_area = + (struct grub_machine_bios_data_area *) GRUB_MEMORY_MACHINE_BIOS_DATA_AREA_ADDR; + +#define KEYBOARD_LEFT_SHIFT (1 << 0) +#define KEYBOARD_RIGHT_SHIFT (1 << 1) +#define KEYBOARD_CTRL (1 << 2) +#define KEYBOARD_ALT (1 << 3) + +static int +grub_console_getkeystatus (void) +{ + grub_uint8_t status = bios_data_area->keyboard_flag_lower; + int mods = 0; + + if (status & (KEYBOARD_LEFT_SHIFT | KEYBOARD_RIGHT_SHIFT)) + mods |= GRUB_TERM_STATUS_SHIFT; + if (status & KEYBOARD_CTRL) + mods |= GRUB_TERM_STATUS_CTRL; + if (status & KEYBOARD_ALT) + mods |= GRUB_TERM_STATUS_ALT; + + return mods; +} + static struct grub_term_input grub_console_term_input = { .name = "console", .checkkey = grub_console_checkkey, .getkey = grub_console_getkey, + .getkeystatus = grub_console_getkeystatus, }; static struct grub_term_output grub_console_term_output = diff --git a/term/i386/pc/serial.c b/term/i386/pc/serial.c index 195f73670..1d74dbbc8 100644 --- a/term/i386/pc/serial.c +++ b/term/i386/pc/serial.c @@ -1,6 +1,6 @@ /* * GRUB -- GRand Unified Bootloader - * Copyright (C) 2000,2001,2002,2003,2004,2005,2007,2008 Free Software Foundation, Inc. + * Copyright (C) 2000,2001,2002,2003,2004,2005,2007,2008,2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,6 +17,7 @@ */ #include +#include #include #include #include @@ -64,12 +65,11 @@ struct serial_port static struct serial_port serial_settings; #ifdef GRUB_MACHINE_PCBIOS -/* The BIOS data area. */ -static const unsigned short *serial_hw_io_addr = (const unsigned short *) 0x0400; +static const unsigned short *serial_hw_io_addr = (const unsigned short *) GRUB_MEMORY_MACHINE_BIOS_DATA_AREA_ADDR; #define GRUB_SERIAL_PORT_NUM 4 #else static const unsigned short serial_hw_io_addr[] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8 }; -#define GRUB_SERIAL_PORT_NUM (sizeof(serial_hw_io_addr)/sizeof(serial_hw_io_addr[0])) +#define GRUB_SERIAL_PORT_NUM (ARRAY_SIZE(serial_hw_io_addr)) #endif /* Return the port number for the UNITth serial device. */ diff --git a/term/usb_keyboard.c b/term/usb_keyboard.c index c827955ab..7f5e058f7 100644 --- a/term/usb_keyboard.c +++ b/term/usb_keyboard.c @@ -58,6 +58,19 @@ static char keyboard_map_shift[128] = static grub_usb_device_t usbdev; +/* Valid values for bmRequestType. See HID definition version 1.11 section + 7.2. */ +#define USB_HID_HOST_TO_DEVICE 0x21 +#define USB_HID_DEVICE_TO_HOST 0x61 + +/* Valid values for bRequest. See HID definition version 1.11 section 7.2. */ +#define USB_HID_GET_REPORT 0x01 +#define USB_HID_GET_IDLE 0x02 +#define USB_HID_GET_PROTOCOL 0x03 +#define USB_HID_SET_REPORT 0x09 +#define USB_HID_SET_IDLE 0x0A +#define USB_HID_SET_PROTOCOL 0x0B + static void grub_usb_hid (void) { @@ -90,17 +103,19 @@ grub_usb_hid (void) grub_usb_iterate (usb_iterate); /* Place the device in boot mode. */ - grub_usb_control_msg (usbdev, 0x21, 0x0B, 0, 0, 0, 0); + grub_usb_control_msg (usbdev, USB_HID_HOST_TO_DEVICE, USB_HID_SET_PROTOCOL, + 0, 0, 0, 0); /* Reports every time an event occurs and not more often than that. */ - grub_usb_control_msg (usbdev, 0x21, 0x0A, 0<<8, 0, 0, 0); + grub_usb_control_msg (usbdev, USB_HID_HOST_TO_DEVICE, USB_HID_SET_IDLE, + 0<<8, 0, 0, 0); } static grub_err_t -grub_usb_keyboard_getreport (grub_usb_device_t dev, unsigned char *report) +grub_usb_keyboard_getreport (grub_usb_device_t dev, grub_uint8_t *report) { - return grub_usb_control_msg (dev, (1 << 7) | (1 << 5) | 1, 0x01, 0, 0, - 8, (char *) report); + return grub_usb_control_msg (dev, USB_HID_DEVICE_TO_HOST, USB_HID_GET_REPORT, + 0, 0, 8, (char *) report); } @@ -108,20 +123,24 @@ grub_usb_keyboard_getreport (grub_usb_device_t dev, unsigned char *report) static int grub_usb_keyboard_checkkey (void) { - unsigned char data[8]; + grub_uint8_t data[8]; int key; - int i; grub_err_t err; + grub_uint64_t currtime; + int timeout = 50; data[2] = 0; - for (i = 0; i < 50; i++) + currtime = grub_get_time_ms (); + do { /* Get_Report. */ err = grub_usb_keyboard_getreport (usbdev, data); - if (! err && data[2]) + /* Implement a timeout. */ + if (grub_get_time_ms () > currtime + timeout) break; } + while (err || !data[2]); if (err || !data[2]) return -1; @@ -147,7 +166,8 @@ grub_usb_keyboard_checkkey (void) /* Wait until the key is released. */ while (!err && data[2]) { - err = grub_usb_control_msg (usbdev, (1 << 7) | (1 << 5) | 1, 0x01, 0, 0, + err = grub_usb_control_msg (usbdev, USB_HID_DEVICE_TO_HOST, + USB_HID_GET_REPORT, 0, 0, sizeof (data), (char *) data); grub_dprintf ("usb_keyboard", "report2: 0x%02x 0x%02x 0x%02x 0x%02x" @@ -174,7 +194,7 @@ grub_usb_keyboard_getkey (void) { int key; grub_err_t err; - unsigned char data[8]; + grub_uint8_t data[8]; grub_uint64_t currtime; int timeout; static grub_usb_keyboard_repeat_t repeat = GRUB_HIDBOOT_REPEAT_NONE; @@ -234,11 +254,67 @@ grub_usb_keyboard_getkey (void) return key; } +static int +grub_usb_keyboard_getkeystatus (void) +{ + grub_uint8_t data[8]; + int mods = 0; + grub_err_t err; + grub_uint64_t currtime; + int timeout = 50; + + /* Set idle time to the minimum offered by the spec (4 milliseconds) so + that we can find out the current state. */ + grub_usb_control_msg (usbdev, USB_HID_HOST_TO_DEVICE, USB_HID_SET_IDLE, + 0<<8, 0, 0, 0); + + currtime = grub_get_time_ms (); + do + { + /* Get_Report. */ + err = grub_usb_keyboard_getreport (usbdev, data); + + /* Implement a timeout. */ + if (grub_get_time_ms () > currtime + timeout) + break; + } + while (err || !data[0]); + + /* Go back to reporting every time an event occurs and not more often than + that. */ + grub_usb_control_msg (usbdev, USB_HID_HOST_TO_DEVICE, USB_HID_SET_IDLE, + 0<<8, 0, 0, 0); + + /* We allowed a while for modifiers to show up in the report, but it is + not an error if they never did. */ + if (err) + return -1; + + grub_dprintf ("usb_keyboard", + "report: 0x%02x 0x%02x 0x%02x 0x%02x" + " 0x%02x 0x%02x 0x%02x 0x%02x\n", + data[0], data[1], data[2], data[3], + data[4], data[5], data[6], data[7]); + + /* Check Shift, Control, and Alt status. */ + if (data[0] & 0x02 || data[0] & 0x20) + mods |= GRUB_TERM_STATUS_SHIFT; + if (data[0] & 0x01 || data[0] & 0x10) + mods |= GRUB_TERM_STATUS_CTRL; + if (data[0] & 0x04 || data[0] & 0x40) + mods |= GRUB_TERM_STATUS_ALT; + + grub_errno = GRUB_ERR_NONE; + + return mods; +} + static struct grub_term_input grub_usb_keyboard_term = { .name = "usb_keyboard", .checkkey = grub_usb_keyboard_checkkey, .getkey = grub_usb_keyboard_getkey, + .getkeystatus = grub_usb_keyboard_getkeystatus, .next = 0 }; diff --git a/util/grub-mkconfig.in b/util/grub-mkconfig.in index 93f96525e..a8c267518 100644 --- a/util/grub-mkconfig.in +++ b/util/grub-mkconfig.in @@ -141,7 +141,24 @@ if [ "x${GRUB_TERMINAL}" != "x" ] ; then fi case x${GRUB_TERMINAL_OUTPUT} in - x | xconsole | xserial | xofconsole | xgfxterm) ;; + x | xgfxterm) + # If this platform supports gfxterm, try to use it. + if test -e ${grub_prefix}/gfxterm.mod ; then + GRUB_VIDEO_BACKEND= + for i in vbe ; do + if test -e ${grub_prefix}/$i.mod ; then + GRUB_VIDEO_BACKEND=$i + break + fi + done + if [ -n "${GRUB_VIDEO_BACKEND}" ] ; then + GRUB_TERMINAL_OUTPUT=gfxterm + elif [ "${GRUB_TERMINAL_OUTPUT}" = "gfxterm" ] ; then + echo "No suitable backend could be found for gfxterm." >&2 ; exit 1 + fi + fi + ;; + xconsole | xserial | xofconsole) ;; *) echo "Invalid output terminal \"${GRUB_TERMINAL_OUTPUT}\"" >&2 ; exit 1 ;; esac @@ -190,7 +207,8 @@ export GRUB_DEVICE \ GRUB_DEVICE_BOOT_UUID \ GRUB_FS \ GRUB_FONT_PATH \ - GRUB_PRELOAD_MODULES + GRUB_PRELOAD_MODULES \ + GRUB_VIDEO_BACKEND # These are optional, user-defined variables. export GRUB_DEFAULT \ @@ -205,7 +223,8 @@ export GRUB_DEFAULT \ GRUB_SERIAL_COMMAND \ GRUB_DISABLE_LINUX_UUID \ GRUB_DISABLE_LINUX_RECOVERY \ - GRUB_GFXMODE + GRUB_GFXMODE \ + GRUB_DISABLE_OS_PROBER if test "x${grub_cfg}" != "x"; then rm -f ${grub_cfg}.new @@ -213,7 +232,8 @@ if test "x${grub_cfg}" != "x"; then # Allow this to fail, since /boot/grub/ might need to be fatfs to support some # firmware implementations (e.g. OFW or EFI). - chmod 444 ${grub_cfg}.new || true + chmod 400 ${grub_cfg}.new || grub_warn "Could not make ${grub_cfg}.new readable by only root.\ + This means that if the generated config contains a password it is readable by everyone" fi echo "Generating grub.cfg ..." >&2 diff --git a/util/grub-mkconfig_lib.in b/util/grub-mkconfig_lib.in index 3585a68ef..2385b0878 100644 --- a/util/grub-mkconfig_lib.in +++ b/util/grub-mkconfig_lib.in @@ -140,6 +140,11 @@ prepare_grub_to_access_device () echo "insmod ${module}" done + fs="`${grub_probe} --device ${device} --target=fs`" + for module in ${fs} ; do + echo "insmod ${module}" + done + # If there's a filesystem UUID that GRUB is capable of identifying, use it; # otherwise set root as per value in device.map. echo "set root=`${grub_probe} --device ${device} --target=drive`" diff --git a/util/grub-probe.c b/util/grub-probe.c index 0088028f5..4e3f96451 100644 --- a/util/grub-probe.c +++ b/util/grub-probe.c @@ -25,7 +25,7 @@ #include #include #include -#include +#include #include #include #include @@ -79,26 +79,13 @@ grub_refresh (void) static void probe_partmap (grub_disk_t disk) { - char *name; - char *underscore; - if (disk->partition == NULL) { grub_util_info ("No partition map found for %s", disk->name); return; } - name = strdup (disk->partition->partmap->name); - if (! name) - grub_util_error ("Not enough memory"); - - underscore = strchr (name, '_'); - if (! underscore) - grub_util_error ("Invalid partition map %s", name); - - *underscore = '\0'; - printf ("%s\n", name); - free (name); + printf ("%s\n", disk->partition->partmap->name); } static int @@ -248,11 +235,14 @@ probe (const char *path, char *device_name) if (print == PRINT_FS) { + /* FIXME: `path' can't be used to read a file via GRUB facilities, + because it's not relative to its root. */ +#if 0 struct stat st; stat (path, &st); - if (st.st_mode == S_IFREG) + if (S_ISREG (st.st_mode)) { /* Regular file. Verify that we can read it properly. */ @@ -271,6 +261,8 @@ probe (const char *path, char *device_name) if (memcmp (filebuf_via_grub, filebuf_via_sys, file->size)) grub_util_error ("files differ"); } +#endif + printf ("%s\n", fs->name); } diff --git a/util/grub.d/00_header.in b/util/grub.d/00_header.in index 98c7c004b..9f421dc1c 100644 --- a/util/grub.d/00_header.in +++ b/util/grub.d/00_header.in @@ -73,23 +73,11 @@ case x${GRUB_TERMINAL_OUTPUT} in # Make the font accessible prepare_grub_to_access_device `${grub_probe} --target=device ${GRUB_FONT_PATH}` - # Pick a video backend - video_backend= - for i in vbe ; do - if test -e ${grub_prefix}/$i.mod ; then - video_backend=$i - break - fi - done - if ! [ "${video_backend}" ] ; then - echo "No suitable backend could be found for gfxterm." >&2 ; exit 1 - fi - cat << EOF if loadfont `make_system_path_relative_to_its_root ${GRUB_FONT_PATH}` ; then set gfxmode=${GRUB_GFXMODE} insmod gfxterm - insmod ${video_backend} + insmod ${GRUB_VIDEO_BACKEND} if terminal_output gfxterm ; then true ; else # For backward compatibility with versions of terminal.mod that don't # understand terminal_output diff --git a/util/grub.d/10_freebsd.in b/util/grub.d/10_freebsd.in index 64d2cc4c0..1e3a0de1f 100644 --- a/util/grub.d/10_freebsd.in +++ b/util/grub.d/10_freebsd.in @@ -50,8 +50,10 @@ if [ "x$kfreebsd" != "x" ] ; then devices_rel_dirname=`make_system_path_relative_to_its_root $devices_dirname` fi - # For "ufs" it's the same. Do we care about the others? - kfreebsd_fs=${GRUB_FS} + case ${GRUB_FS} in + ufs1 | ufs2) kfreebsd_fs=ufs ;; + *) kfreebsd_fs=${GRUB_FS} ;; + esac cat << EOF menuentry "${OS}" { diff --git a/util/grub.d/30_os-prober.in b/util/grub.d/30_os-prober.in index b36c2a366..4a1648881 100644 --- a/util/grub.d/30_os-prober.in +++ b/util/grub.d/30_os-prober.in @@ -22,6 +22,10 @@ libdir=@libdir@ . ${libdir}/grub/grub-mkconfig_lib +if [ "x${GRUB_DISABLE_OS_PROBER}" = "xtrue" ]; then + exit 0 +fi + if [ -z "`which os-prober 2> /dev/null`" -o -z "`which linux-boot-prober 2> /dev/null`" ] ; then # missing os-prober and/or linux-boot-prober exit 0 @@ -53,11 +57,16 @@ menuentry "${LONGNAME} (on ${DEVICE})" { EOF prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/" - if [ "${LONGNAME}" != "Windows Vista (loader)" ] ; then - cat << EOF + case ${LONGNAME} in + Windows\ Vista*|Windows\ 7*) + ;; + *) + cat << EOF drivemap -s (hd0) \${root} EOF - fi + ;; + esac + cat < #include -#include +#include #include #include #include @@ -947,9 +947,9 @@ grub_util_biosdisk_get_grub_dev (const char *os_dev) int find_partition (grub_disk_t disk __attribute__ ((unused)), const grub_partition_t partition) { - struct grub_pc_partition *pcdata = NULL; + struct grub_msdos_partition *pcdata = NULL; - if (strcmp (partition->partmap->name, "pc_partition_map") == 0) + if (strcmp (partition->partmap->name, "part_msdos") == 0) pcdata = partition->data; if (pcdata) diff --git a/util/i386/pc/grub-setup.c b/util/i386/pc/grub-setup.c index 92c69ef15..ccfbd1d25 100644 --- a/util/i386/pc/grub-setup.c +++ b/util/i386/pc/grub-setup.c @@ -25,7 +25,7 @@ #include #include #include -#include +#include #include #include #include @@ -121,14 +121,14 @@ setup (const char *dir, int NESTED_FUNC_ATTR find_usable_region_msdos (grub_disk_t disk __attribute__ ((unused)), const grub_partition_t p) { - struct grub_pc_partition *pcdata = p->data; + struct grub_msdos_partition *pcdata = p->data; /* There's always an embed region, and it starts right after the MBR. */ embed_region.start = 1; /* For its end offset, include as many dummy partitions as we can. */ - if (! grub_pc_partition_is_empty (pcdata->dos_type) - && ! grub_pc_partition_is_bsd (pcdata->dos_type) + if (! grub_msdos_partition_is_empty (pcdata->dos_type) + && ! grub_msdos_partition_is_bsd (pcdata->dos_type) && embed_region.end > p->start) embed_region.end = p->start; @@ -279,15 +279,15 @@ setup (const char *dir, if (root_dev->disk->partition) { if (strcmp (root_dev->disk->partition->partmap->name, - "pc_partition_map") == 0) + "part_msdos") == 0) { - struct grub_pc_partition *pcdata = + struct grub_msdos_partition *pcdata = root_dev->disk->partition->data; dos_part = pcdata->dos_part; bsd_part = pcdata->bsd_part; } else if (strcmp (root_dev->disk->partition->partmap->name, - "gpt_partition_map") == 0) + "part_gpt") == 0) { dos_part = root_dev->disk->partition->index; bsd_part = -1; @@ -338,12 +338,12 @@ setup (const char *dir, goto unable_to_embed; } - grub_partition_iterate (dest_dev->disk, (strcmp (dest_partmap, "pc_partition_map") ? + grub_partition_iterate (dest_dev->disk, (strcmp (dest_partmap, "part_msdos") ? find_usable_region_gpt : find_usable_region_msdos)); if (embed_region.end == embed_region.start) { - if (! strcmp (dest_partmap, "pc_partition_map")) + if (! strcmp (dest_partmap, "part_msdos")) grub_util_warn ("This msdos-style partition label has no post-MBR gap; embedding won't be possible!"); else grub_util_warn ("This GPT partition label has no BIOS Boot Partition; embedding won't be possible!"); diff --git a/util/sparc64/ieee1275/grub-setup.c b/util/sparc64/ieee1275/grub-setup.c index 9509eb30b..7008147bf 100644 --- a/util/sparc64/ieee1275/grub-setup.c +++ b/util/sparc64/ieee1275/grub-setup.c @@ -25,7 +25,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/video/fb/fbblit.c b/video/fb/fbblit.c index 5b613bc79..a0f44d268 100644 --- a/video/fb/fbblit.c +++ b/video/fb/fbblit.c @@ -90,6 +90,302 @@ grub_video_fbblit_replace_directN (struct grub_video_fbblit_info *dst, } } +/* Optimized replacing blitter for 1-bit to 32bit. */ +void +grub_video_fbblit_replace_32bit_1bit (struct grub_video_fbblit_info *dst, + struct grub_video_fbblit_info *src, + int x, int y, + int width, int height, + int offset_x, int offset_y) +{ + int i; + int j; + grub_uint8_t *srcptr; + grub_uint8_t *dstptr; + grub_uint8_t srcmask; + unsigned int dstrowskip; + unsigned int srcrowskipbyte, srcrowskipbit; + grub_uint32_t fgcolor, bgcolor; + int bit_index; + + /* Calculate the number of bytes to advance from the end of one line + to the beginning of the next line. */ + dstrowskip = dst->mode_info->pitch - dst->mode_info->bytes_per_pixel * width; + srcrowskipbyte = (src->mode_info->width - width) >> 3; + srcrowskipbit = (src->mode_info->width - width) & 7; + + bit_index = offset_y * src->mode_info->width + offset_x; + srcptr = (grub_uint8_t *) src->data + (bit_index >> 3); + srcmask = 1 << (~bit_index & 7); + dstptr = (grub_uint8_t *) grub_video_fb_get_video_ptr (dst, x, y); + + fgcolor = grub_video_fb_map_rgba (src->mode_info->fg_red, + src->mode_info->fg_green, + src->mode_info->fg_blue, + src->mode_info->fg_alpha); + + bgcolor = grub_video_fb_map_rgba (src->mode_info->bg_red, + src->mode_info->bg_green, + src->mode_info->bg_blue, + src->mode_info->bg_alpha); + + for (j = 0; j < height; j++) + { + for (i = 0; i < width; i++) + { + if (*srcptr & srcmask) + *(grub_uint32_t *) dstptr = fgcolor; + else + *(grub_uint32_t *) dstptr = bgcolor; + srcmask >>= 1; + if (!srcmask) + { + srcptr++; + srcmask = 0x80; + } + + dstptr += 4; + } + + srcptr += srcrowskipbyte; + if (srcmask >> srcrowskipbit) + srcmask >>= srcrowskipbit; + else + { + srcptr++; + srcmask <<= 8 - srcrowskipbit; + } + dstptr += dstrowskip; + } +} + + +/* Optimized replacing blitter for 1-bit to 24-bit. */ +void +grub_video_fbblit_replace_24bit_1bit (struct grub_video_fbblit_info *dst, + struct grub_video_fbblit_info *src, + int x, int y, + int width, int height, + int offset_x, int offset_y) +{ + int i; + int j; + grub_uint8_t *srcptr; + grub_uint8_t *dstptr; + grub_uint8_t srcmask; + unsigned int dstrowskip; + unsigned int srcrowskipbyte, srcrowskipbit; + grub_uint32_t fgcolor, bgcolor; + int bit_index; + + /* Calculate the number of bytes to advance from the end of one line + to the beginning of the next line. */ + dstrowskip = dst->mode_info->pitch - dst->mode_info->bytes_per_pixel * width; + srcrowskipbyte = (src->mode_info->width - width) >> 3; + srcrowskipbit = (src->mode_info->width - width) & 7; + + bit_index = offset_y * src->mode_info->width + offset_x; + srcptr = (grub_uint8_t *) src->data + (bit_index >> 3); + srcmask = 1 << (~bit_index & 7); + dstptr = (grub_uint8_t *) grub_video_fb_get_video_ptr (dst, x, y); + + fgcolor = grub_video_fb_map_rgba (src->mode_info->fg_red, + src->mode_info->fg_green, + src->mode_info->fg_blue, + src->mode_info->fg_alpha); + + bgcolor = grub_video_fb_map_rgba (src->mode_info->bg_red, + src->mode_info->bg_green, + src->mode_info->bg_blue, + src->mode_info->bg_alpha); + + for (j = 0; j < height; j++) + { + for (i = 0; i < width - 1; i++) + { + if (*srcptr & srcmask) + *(grub_uint32_t *) dstptr = fgcolor; + else + *(grub_uint32_t *) dstptr = bgcolor; + srcmask >>= 1; + if (!srcmask) + { + srcptr++; + srcmask = 0x80; + } + + dstptr += 3; + } + + if (*srcptr & srcmask) + { + *dstptr++ = fgcolor & 0xff; + *dstptr++ = (fgcolor & 0xff00) >> 8; + *dstptr++ = (fgcolor & 0xff0000) >> 16; + } + else + { + *dstptr++ = bgcolor & 0xff; + *dstptr++ = (bgcolor & 0xff00) >> 8; + *dstptr++ = (bgcolor & 0xff0000) >> 16; + } + srcmask >>= 1; + if (!srcmask) + { + srcptr++; + srcmask = 0x80; + } + + srcptr += srcrowskipbyte; + if (srcmask >> srcrowskipbit) + srcmask >>= srcrowskipbit; + else + { + srcptr++; + srcmask <<= 8 - srcrowskipbit; + } + dstptr += dstrowskip; + } +} + +/* Optimized replacing blitter for 1-bit to 16-bit. */ +void +grub_video_fbblit_replace_16bit_1bit (struct grub_video_fbblit_info *dst, + struct grub_video_fbblit_info *src, + int x, int y, + int width, int height, + int offset_x, int offset_y) +{ + int i; + int j; + grub_uint8_t *srcptr; + grub_uint8_t *dstptr; + grub_uint8_t srcmask; + unsigned int dstrowskip; + unsigned int srcrowskipbyte, srcrowskipbit; + grub_uint16_t fgcolor, bgcolor; + int bit_index; + + /* Calculate the number of bytes to advance from the end of one line + to the beginning of the next line. */ + dstrowskip = dst->mode_info->pitch - dst->mode_info->bytes_per_pixel * width; + srcrowskipbyte = (src->mode_info->width - width) >> 3; + srcrowskipbit = (src->mode_info->width - width) & 7; + + bit_index = offset_y * src->mode_info->width + offset_x; + srcptr = (grub_uint8_t *) src->data + (bit_index >> 3); + srcmask = 1 << (~bit_index & 7); + dstptr = (grub_uint8_t *) grub_video_fb_get_video_ptr (dst, x, y); + + fgcolor = grub_video_fb_map_rgba (src->mode_info->fg_red, + src->mode_info->fg_green, + src->mode_info->fg_blue, + src->mode_info->fg_alpha); + + bgcolor = grub_video_fb_map_rgba (src->mode_info->bg_red, + src->mode_info->bg_green, + src->mode_info->bg_blue, + src->mode_info->bg_alpha); + + for (j = 0; j < height; j++) + { + for (i = 0; i < width; i++) + { + if (*srcptr & srcmask) + *(grub_uint16_t *) dstptr = fgcolor; + else + *(grub_uint16_t *) dstptr = bgcolor; + srcmask >>= 1; + if (!srcmask) + { + srcptr++; + srcmask = 0x80; + } + + dstptr += 2; + } + + srcptr += srcrowskipbyte; + if (srcmask >> srcrowskipbit) + srcmask >>= srcrowskipbit; + else + { + srcptr++; + srcmask <<= 8 - srcrowskipbit; + } + dstptr += dstrowskip; + } +} + +/* Optimized replacing blitter for 1-bit to 8-bit. */ +void +grub_video_fbblit_replace_8bit_1bit (struct grub_video_fbblit_info *dst, + struct grub_video_fbblit_info *src, + int x, int y, + int width, int height, + int offset_x, int offset_y) +{ + int i; + int j; + grub_uint8_t *srcptr; + grub_uint8_t *dstptr; + grub_uint8_t srcmask; + unsigned int dstrowskip; + unsigned int srcrowskipbyte, srcrowskipbit; + grub_uint8_t fgcolor, bgcolor; + int bit_index; + + /* Calculate the number of bytes to advance from the end of one line + to the beginning of the next line. */ + dstrowskip = dst->mode_info->pitch - dst->mode_info->bytes_per_pixel * width; + srcrowskipbyte = (src->mode_info->width - width) >> 3; + srcrowskipbit = (src->mode_info->width - width) & 7; + + bit_index = offset_y * src->mode_info->width + offset_x; + srcptr = (grub_uint8_t *) src->data + (bit_index >> 3); + srcmask = 1 << (~bit_index & 7); + dstptr = (grub_uint8_t *) grub_video_fb_get_video_ptr (dst, x, y); + + fgcolor = grub_video_fb_map_rgba (src->mode_info->fg_red, + src->mode_info->fg_green, + src->mode_info->fg_blue, + src->mode_info->fg_alpha); + + bgcolor = grub_video_fb_map_rgba (src->mode_info->bg_red, + src->mode_info->bg_green, + src->mode_info->bg_blue, + src->mode_info->bg_alpha); + + for (j = 0; j < height; j++) + { + for (i = 0; i < width; i++) + { + if (*srcptr & srcmask) + *(grub_uint8_t *) dstptr = fgcolor; + else + *(grub_uint8_t *) dstptr = bgcolor; + srcmask >>= 1; + if (!srcmask) + { + srcptr++; + srcmask = 0x80; + } + + dstptr++; + } + + srcptr += srcrowskipbyte; + if (srcmask >> srcrowskipbit) + srcmask >>= srcrowskipbit; + else + { + srcptr++; + srcmask <<= 8 - srcrowskipbit; + } + dstptr += dstrowskip; + } +} + /* Optimized replacing blitter for RGBX8888 to BGRX8888. */ void grub_video_fbblit_replace_BGRX8888_RGBX8888 (struct grub_video_fbblit_info *dst, @@ -826,3 +1122,294 @@ grub_video_fbblit_blend_index_RGBA8888 (struct grub_video_fbblit_info *dst, } } } + +/* Optimized blending blitter for 1-bit to XXXA8888. */ +void +grub_video_fbblit_blend_XXXA8888_1bit (struct grub_video_fbblit_info *dst, + struct grub_video_fbblit_info *src, + int x, int y, + int width, int height, + int offset_x, int offset_y) +{ + int i; + int j; + grub_uint8_t *srcptr; + grub_uint8_t *dstptr; + grub_uint8_t srcmask; + unsigned int dstrowskip; + unsigned int srcrowskipbyte, srcrowskipbit; + grub_uint32_t fgcolor, bgcolor; + int bit_index; + + /* Calculate the number of bytes to advance from the end of one line + to the beginning of the next line. */ + dstrowskip = dst->mode_info->pitch - dst->mode_info->bytes_per_pixel * width; + srcrowskipbyte = (src->mode_info->width - width) >> 3; + srcrowskipbit = (src->mode_info->width - width) & 7; + + bit_index = offset_y * src->mode_info->width + offset_x; + srcptr = (grub_uint8_t *) src->data + (bit_index >> 3); + srcmask = 1 << (~bit_index & 7); + dstptr = (grub_uint8_t *) grub_video_fb_get_video_ptr (dst, x, y); + + fgcolor = grub_video_fb_map_rgba (src->mode_info->fg_red, + src->mode_info->fg_green, + src->mode_info->fg_blue, + src->mode_info->fg_alpha); + + bgcolor = grub_video_fb_map_rgba (src->mode_info->bg_red, + src->mode_info->bg_green, + src->mode_info->bg_blue, + src->mode_info->bg_alpha); + + for (j = 0; j < height; j++) + { + for (i = 0; i < width; i++) + { + grub_uint32_t color; + grub_uint8_t a; + + if (*srcptr & srcmask) + color = fgcolor; + else + color = bgcolor; + a = (color >> 24) & 0xff; + + if (a == 255) + *(grub_uint32_t *) dstptr = color; + else if (a != 0) + { + grub_uint8_t s1 = (color >> 0) & 0xFF; + grub_uint8_t s2 = (color >> 8) & 0xFF; + grub_uint8_t s3 = (color >> 16) & 0xFF; + + grub_uint8_t d1 = (*(grub_uint32_t *) dstptr >> 0) & 0xFF; + grub_uint8_t d2 = (*(grub_uint32_t *) dstptr >> 8) & 0xFF; + grub_uint8_t d3 = (*(grub_uint32_t *) dstptr >> 16) & 0xFF; + + d1 = (d1 * (255 - a) + s1 * a) / 255; + d2 = (d2 * (255 - a) + s2 * a) / 255; + d3 = (d3 * (255 - a) + s3 * a) / 255; + + *(grub_uint32_t *) dstptr = (a << 24) | (d3 << 16) | (d2 << 8) + | d1; + } + + srcmask >>= 1; + if (!srcmask) + { + srcptr++; + srcmask = 0x80; + } + + dstptr += 4; + } + + srcptr += srcrowskipbyte; + if (srcmask >> srcrowskipbit) + srcmask >>= srcrowskipbit; + else + { + srcptr++; + srcmask <<= 8 - srcrowskipbit; + } + dstptr += dstrowskip; + } +} + +/* Optimized blending blitter for 1-bit to XXX888. */ +void +grub_video_fbblit_blend_XXX888_1bit (struct grub_video_fbblit_info *dst, + struct grub_video_fbblit_info *src, + int x, int y, + int width, int height, + int offset_x, int offset_y) +{ + int i; + int j; + grub_uint8_t *srcptr; + grub_uint8_t *dstptr; + grub_uint8_t srcmask; + unsigned int dstrowskip; + unsigned int srcrowskipbyte, srcrowskipbit; + grub_uint32_t fgcolor, bgcolor; + int bit_index; + + /* Calculate the number of bytes to advance from the end of one line + to the beginning of the next line. */ + dstrowskip = dst->mode_info->pitch - dst->mode_info->bytes_per_pixel * width; + srcrowskipbyte = (src->mode_info->width - width) >> 3; + srcrowskipbit = (src->mode_info->width - width) & 7; + + bit_index = offset_y * src->mode_info->width + offset_x; + srcptr = (grub_uint8_t *) src->data + (bit_index >> 3); + srcmask = 1 << (~bit_index & 7); + dstptr = (grub_uint8_t *) grub_video_fb_get_video_ptr (dst, x, y); + + fgcolor = grub_video_fb_map_rgba (src->mode_info->fg_red, + src->mode_info->fg_green, + src->mode_info->fg_blue, + src->mode_info->fg_alpha); + + bgcolor = grub_video_fb_map_rgba (src->mode_info->bg_red, + src->mode_info->bg_green, + src->mode_info->bg_blue, + src->mode_info->bg_alpha); + + for (j = 0; j < height; j++) + { + for (i = 0; i < width; i++) + { + grub_uint32_t color; + grub_uint8_t a; + if (*srcptr & srcmask) + { + color = fgcolor; + a = src->mode_info->fg_alpha; + } + else + { + color = bgcolor; + a = src->mode_info->bg_alpha; + } + + if (a == 255) + { + ((grub_uint8_t *) dstptr)[0] = color & 0xff; + ((grub_uint8_t *) dstptr)[1] = (color & 0xff00) >> 8; + ((grub_uint8_t *) dstptr)[2] = (color & 0xff0000) >> 16; + } + else if (a != 0) + { + grub_uint8_t s1 = (color >> 0) & 0xFF; + grub_uint8_t s2 = (color >> 8) & 0xFF; + grub_uint8_t s3 = (color >> 16) & 0xFF; + + grub_uint8_t d1 = (*(grub_uint32_t *) dstptr >> 0) & 0xFF; + grub_uint8_t d2 = (*(grub_uint32_t *) dstptr >> 8) & 0xFF; + grub_uint8_t d3 = (*(grub_uint32_t *) dstptr >> 16) & 0xFF; + + ((grub_uint8_t *) dstptr)[0] = (d1 * (255 - a) + s1 * a) / 255; + ((grub_uint8_t *) dstptr)[1] = (d2 * (255 - a) + s2 * a) / 255; + ((grub_uint8_t *) dstptr)[2] = (d3 * (255 - a) + s3 * a) / 255; + } + + srcmask >>= 1; + if (!srcmask) + { + srcptr++; + srcmask = 0x80; + } + + dstptr += 3; + } + + srcptr += srcrowskipbyte; + if (srcmask >> srcrowskipbit) + srcmask >>= srcrowskipbit; + else + { + srcptr++; + srcmask <<= 8 - srcrowskipbit; + } + dstptr += dstrowskip; + } +} + +/* Optimized blending blitter for 1-bit to XXX888. */ +void +grub_video_fbblit_blend_XXX565_1bit (struct grub_video_fbblit_info *dst, + struct grub_video_fbblit_info *src, + int x, int y, + int width, int height, + int offset_x, int offset_y) +{ + int i; + int j; + grub_uint8_t *srcptr; + grub_uint8_t *dstptr; + grub_uint8_t srcmask; + unsigned int dstrowskip; + unsigned int srcrowskipbyte, srcrowskipbit; + grub_uint16_t fgcolor, bgcolor; + int bit_index; + + /* Calculate the number of bytes to advance from the end of one line + to the beginning of the next line. */ + dstrowskip = dst->mode_info->pitch - dst->mode_info->bytes_per_pixel * width; + srcrowskipbyte = (src->mode_info->width - width) >> 3; + srcrowskipbit = (src->mode_info->width - width) & 7; + + bit_index = offset_y * src->mode_info->width + offset_x; + srcptr = (grub_uint8_t *) src->data + (bit_index >> 3); + srcmask = 1 << (~bit_index & 7); + dstptr = (grub_uint8_t *) grub_video_fb_get_video_ptr (dst, x, y); + + fgcolor = grub_video_fb_map_rgba (src->mode_info->fg_red, + src->mode_info->fg_green, + src->mode_info->fg_blue, + src->mode_info->fg_alpha); + + bgcolor = grub_video_fb_map_rgba (src->mode_info->bg_red, + src->mode_info->bg_green, + src->mode_info->bg_blue, + src->mode_info->bg_alpha); + + for (j = 0; j < height; j++) + { + for (i = 0; i < width; i++) + { + grub_uint32_t color; + grub_uint8_t a; + if (*srcptr & srcmask) + { + color = fgcolor; + a = src->mode_info->fg_alpha; + } + else + { + color = bgcolor; + a = src->mode_info->bg_alpha; + } + + if (a == 255) + *(grub_uint16_t *) dstptr = color; + else if (a != 0) + { + grub_uint8_t s1 = (color >> 0) & 0x1F; + grub_uint8_t s2 = (color >> 5) & 0x3F; + grub_uint8_t s3 = (color >> 11) & 0x1F; + + grub_uint8_t d1 = (*(grub_uint16_t *) dstptr >> 0) & 0x1F; + grub_uint8_t d2 = (*(grub_uint16_t *) dstptr >> 5) & 0x3F; + grub_uint8_t d3 = (*(grub_uint16_t *) dstptr >> 11) & 0x1F; + + d1 = (d1 * (255 - a) + s1 * a) / 255; + d2 = (d2 * (255 - a) + s2 * a) / 255; + d3 = (d3 * (255 - a) + s3 * a) / 255; + + *(grub_uint16_t *) dstptr = (d1 & 0x1f) | ((d2 & 0x3f) << 5) + | ((d3 & 0x1f) << 11); + } + + srcmask >>= 1; + if (!srcmask) + { + srcptr++; + srcmask = 0x80; + } + + dstptr += 2; + } + + srcptr += srcrowskipbyte; + if (srcmask >> srcrowskipbit) + srcmask >>= srcrowskipbit; + else + { + srcptr++; + srcmask <<= 8 - srcrowskipbit; + } + dstptr += dstrowskip; + } +} diff --git a/video/fb/video_fb.c b/video/fb/video_fb.c index a35dd7a4e..5f2917da6 100644 --- a/video/fb/video_fb.c +++ b/video/fb/video_fb.c @@ -587,6 +587,37 @@ common_blitter (struct grub_video_fbblit_info *target, return; } } + else if (source->mode_info->blit_format == GRUB_VIDEO_BLIT_FORMAT_1BIT_PACKED) + { + if (target->mode_info->bpp == 32) + { + grub_video_fbblit_replace_32bit_1bit (target, source, + x, y, width, height, + offset_x, offset_y); + return; + } + else if (target->mode_info->bpp == 24) + { + grub_video_fbblit_replace_24bit_1bit (target, source, + x, y, width, height, + offset_x, offset_y); + return; + } + else if (target->mode_info->bpp == 16) + { + grub_video_fbblit_replace_16bit_1bit (target, source, + x, y, width, height, + offset_x, offset_y); + return; + } + else if (target->mode_info->bpp == 8) + { + grub_video_fbblit_replace_8bit_1bit (target, source, + x, y, width, height, + offset_x, offset_y); + return; + } + } /* No optimized replace operator found, use default (slow) blitter. */ grub_video_fbblit_replace (target, source, x, y, width, height, @@ -674,6 +705,41 @@ common_blitter (struct grub_video_fbblit_info *target, return; } } + else if (source->mode_info->blit_format == GRUB_VIDEO_BLIT_FORMAT_1BIT_PACKED) + { + if (target->mode_info->blit_format + == GRUB_VIDEO_BLIT_FORMAT_BGRA_8888 + || target->mode_info->blit_format + == GRUB_VIDEO_BLIT_FORMAT_RGBA_8888) + { + grub_video_fbblit_blend_XXXA8888_1bit (target, source, + x, y, width, height, + offset_x, offset_y); + return; + } + else if (target->mode_info->blit_format + == GRUB_VIDEO_BLIT_FORMAT_BGR_888 + || target->mode_info->blit_format + == GRUB_VIDEO_BLIT_FORMAT_RGB_888) + { + grub_video_fbblit_blend_XXX888_1bit (target, source, + x, y, width, height, + offset_x, offset_y); + return; + } + else if (target->mode_info->blit_format + == GRUB_VIDEO_BLIT_FORMAT_BGR_565 + || target->mode_info->blit_format + == GRUB_VIDEO_BLIT_FORMAT_RGB_565) + { + grub_video_fbblit_blend_XXX565_1bit (target, source, + x, y, width, height, + offset_x, offset_y); + return; + } + + } + /* No optimized blend operation found, use default (slow) blitter. */ grub_video_fbblit_blend (target, source, x, y, width, height, diff --git a/video/i386/pc/vbe.c b/video/i386/pc/vbe.c index b41e22fa2..a285b26ba 100644 --- a/video/i386/pc/vbe.c +++ b/video/i386/pc/vbe.c @@ -286,24 +286,6 @@ grub_vbe_get_video_mode_info (grub_uint32_t mode, /* Make copy of mode info block. */ grub_memcpy (mode_info, mi_tmp, sizeof (*mode_info)); - - /* Packed mode. Query DAC Palette width for color sizes. */ - if (mode_info->bits_per_pixel <= 8) - { - int width = 8; - status = 0; - - if (controller_info.capabilities & GRUB_VBE_CAPABILITY_DACWIDTH) - status = grub_vbe_bios_set_dac_palette_width (& width); - - if (status != GRUB_VBE_STATUS_OK) - /* 6 is default after mode reset. */ - width = 6; - - mode_info->red_mask_size = mode_info->green_mask_size - = mode_info->blue_mask_size = width; - mode_info->rsvd_mask_size = 0; - } } else /* Just clear mode info block if it isn't a VESA mode. */ diff --git a/video/video.c b/video/video.c index 36ebfd1b8..c1d66bdd0 100644 --- a/video/video.c +++ b/video/video.c @@ -181,6 +181,8 @@ grub_video_get_blit_format (struct grub_video_mode_info *mode_info) return GRUB_VIDEO_BLIT_FORMAT_RGB_565; } } + else if (mode_info->bpp == 1) + return GRUB_VIDEO_BLIT_FORMAT_1BIT_PACKED; /* Backup route. Unknown format. */