From e1531466e1ea4d929bfb0a2c23f5095a764eb02a Mon Sep 17 00:00:00 2001 From: Javier Martinez Canillas Date: Thu, 15 Aug 2019 08:01:31 +0200 Subject: [PATCH] Update to grub 2.04 This change updates grub to the 2.04 release. The new release changed how grub is built, so the bootstrap and bootstrap.conf files have to be added to the dist-git. Also, the gitignore file changed so it has to be updated. Since the patches have been forward ported to 2.04, there's no need for a logic to maintain a patch with the delta between the release and the grub master branch. So the release-to-master.patch is dropped and no longer is updated by the do-rebase script. Also since gnulib isn't part of the grub repository anymore and cloned by the boostrap tool, a gnulib tarball is included as other source file and copied before calling the bootstrap tool. That way grub can be built even in builders that only have access to the sources lookaside cache. Resolves: rhbz#1727279 Signed-off-by: Javier Martinez Canillas --- .gitignore | 1 + ...d-support-for-Linux-EFI-stub-loading.patch | 109 +- 0002-Rework-linux-command.patch | 31 +- 0003-Rework-linux16-command.patch | 15 +- ...ecureboot-support-on-efi-chainloader.patch | 60 +- ...loaders-that-link-in-efi-mode-honor-.patch | 54 +- ...rch-64-on-32-boot-in-linuxefi-loader.patch | 23 +- 0007-re-write-.gitignore.patch | 168 +- ...ient-architecture-CAS-reboot-support.patch | 18 +- ...video-support-for-IBM-power-machines.patch | 12 +- ...when-generating-configuration-by-gru.patch | 2 +- 0012-Move-bash-completion-script-922997.patch | 6 +- ...o-include-entries-by-title-not-just-.patch | 2 +- 0015-Add-GRUB_DISABLE_UUID.patch | 4 +- 0016-Make-exit-take-a-return-code.patch | 20 +- ...es-load-an-env-block-from-a-variable.patch | 4 +- ...HCP-client-ID-and-UUID-options-added.patch | 114 +- ...Fix-bad-test-on-GRUB_DISABLE_SUBMENU.patch | 2 +- 0022-Migrate-PPC-from-Yaboot-to-Grub2.patch | 4 +- 0023-Add-fw_path-variable-revised.patch | 4 +- ...-hex-hex-straight-through-unmolested.patch | 16 +- ...for-specific-config-file-for-netboot.patch | 10 +- ...g-module-to-parse-Boot-Loader-Specif.patch | 26 +- 0028-Add-devicetree-loading.patch | 4 +- 0029-Don-t-write-messages-to-the-screen.patch | 4 +- 0030-Don-t-print-GNU-GRUB-header.patch | 2 +- ...t-indentation-for-the-term-help-text.patch | 2 +- ...n-t-say-GNU-Linux-in-generated-menus.patch | 4 +- ...rame-to-list-of-relocations-stripped.patch | 2 +- ...spaces-when-we-re-doing-our-cmdline-.patch | 4 +- ...password-to-boot-entries-generated-b.patch | 2 +- 0046-Don-t-emit-Booting-.-message.patch | 4 +- ...f-man-pages-with-slightly-nicer-ones.patch | 10 +- ...ix-when-fallback-searching-for-grub-.patch | 2 +- ...-before-grub.cfg-on-tftp-config-file.patch | 100 +- 0051-Add-grub_util_readlink.patch | 3665 +--- ...se-symlinks-including-those-across-d.patch | 8 +- ...CLASS-in-10_linux-from-etc-os-releas.patch | 2 +- 0055-Try-prefix-if-fw_path-doesn-t-work.patch | 126 +- ...-grub.cfg-netboot-selection-order-11.patch | 2 +- ...-Package-Sort-for-grub2-mkconfig-112.patch | 30 +- ...fig-construct-titles-that-look-like-.patch | 2 +- ...ly-grub2-password-config-tool-985962.patch | 28 +- 0063-Add-a-url-parser.patch | 6 +- ...net-and-bootp-add-support-for-dhcpv6.patch | 26 +- ...rnel-settings-and-use-it-in-10_linux.patch | 30 +- ...1374141-fix-incorrect-mask-for-ppc64.patch | 2 +- 0068-Make-grub_fatal-also-backtrace.patch | 6 +- ...ix-up-some-man-pages-rpmdiff-noticed.patch | 6 +- ...fdt-has-address-cells-and-size-cells.patch | 4 +- ...fo-pages-say-grub2-where-appropriate.patch | 58 +- ...more-debug-info-in-our-module-loader.patch | 2 +- ...-Add-ability-to-boot-from-subvolumes.patch | 40 +- ...port-btrfs_subvol-and-btrfs_subvolid.patch | 4 +- 0076-grub2-btrfs-03-follow_default.patch | 20 +- 0077-grub2-btrfs-04-grub2-install.patch | 8 +- 0078-grub2-btrfs-05-grub2-mkconfig.patch | 6 +- 0079-grub2-btrfs-06-subvol-mount.patch | 28 +- ...subvol-name-scheme-to-support-old-sn.patch | 4 +- ...-correctly-with-btrfs-snapshots-bsc-.patch | 10 +- ...ocate_pool-and-grub_efi_free_pool-wr.patch | 2 +- ...fi_.-memory-helpers-where-reasonable.patch | 14 +- 0084-Add-PRIxGRUB_EFI_STATUS-and-use-it.patch | 6 +- ...c-sized-arrays-since-we-don-t-build-.patch | 2 +- 0087-don-t-use-int-for-efi-status.patch | 2 +- ...INIT-declare-its-function-prototypes.patch | 2 +- 0089-editenv-handle-relative-symlinks.patch | 4 +- ...e-libgrub.pp-depend-on-config-util.h.patch | 2 +- ...-efi-as-HFS-on-ppc-machines-in-grub-.patch | 4 +- ...d-xen-or-multiboot-2-modules-as-need.patch | 10 +- 0094-align-struct-efi_variable-better.patch | 2 +- 0095-Add-BLS-support-to-grub-mkconfig.patch | 8 +- ...nux-and-initrd-commands-for-grub-emu.patch | 28 +- 0098-Add-grub2-switch-to-blscfg.patch | 20 +- 0099-Add-grub_debug_enabled.patch | 2 +- 0100-make-better-backtraces.patch | 36 +- ...w-our-startup-message-if-debug-is-se.patch | 2 +- ...it-possible-to-enabled-build-id-sha1.patch | 4 +- ...f-grub_dprintf-without-the-file-line.patch | 2 +- ...dprintf-that-tells-us-load-addresses.patch | 10 +- ...tch => 0106-Fixup-for-newer-compiler.patch | 4 +- 0106-TPM-support.patch | 891 - ...-export-the-start-and-_start-symbols.patch | 4 +- ...tch => 0108-Fixup-for-newer-compiler.patch | 2 +- ...pport-for-non-Ethernet-network-cards.patch | 61 +- 0110-Use-xid-to-match-DHCP-replies.patch | 65 - ...lid-character-recongition-in-strto-l.patch | 0 ...racketed-ipv6-addrs-and-port-numbers.patch | 4 +- ...=> 0112-bootp-New-net_bootp6-command.patch | 662 +- ...=> 0113-efinet-UEFI-IPv6-PXE-support.patch | 2 +- ...114-grub.texi-Add-net_bootp6-doument.patch | 6 +- ...essing-DHCPACK-packet-from-HTTP-Boot.patch | 108 + ...etting-network-from-UEFI-device-path.patch | 2 +- ...essing-DHCPACK-packet-from-HTTP-Boot.patch | 135 - ...etting-DNS-server-from-UEFI-protocol.patch | 6 +- ...0118-Fix-one-more-coverity-complaint.patch | 4 +- ...19-Support-UEFI-networking-protocols.patch | 46 +- ...> 0120-AUDIT-0-http-boot-tracker-bug.patch | 2 +- ...efi_gop.c-Add-support-for-BLT_ONLY-a.patch | 0 ... 0122-efi-uga-use-64-bit-for-fb_base.patch | 0 ...ot-set-text-mode-until-we-actually-n.patch | 0 ...grub_console_read_key_stroke-helper-.patch | 0 ...nsole-Implement-getkeystatus-support.patch | 0 ...status-helper-funtion-available-ever.patch | 0 ...d-holding-SHIFT-as-user-interrupt-ke.patch | 2 +- ...-incr-command-to-increment-integer-v.patch | 6 +- ...h => 0129-Add-auto-hide-menu-support.patch | 4 +- ...try-for-firmware-setup-on-UEFI-FastB.patch | 4 +- ...> 0131-Add-grub-set-bootflag-utility.patch | 24 +- ...b-boot-indeterminate.service-example.patch | 0 ...h => 0133-gentpl-add-disable-support.patch | 6 +- ... => 0134-gentpl-add-pc-firmware-type.patch | 12 +- ...e-the-firmware-acceleration-for-http.patch | 2 +- ...ot_url-reflect-the-protocol-hostname.patch | 0 ...n-tell-configure-which-cflags-utils-.patch | 12 +- ...make-it-possible-to-run-checkers-on-.patch | 2 +- 0139-Force-everything-to-use-python3.patch | 42 - ...39-Rework-how-the-fdt-command-builds.patch | 28 +- ...able-non-wordsize-allocations-on-arm.patch | 4 +- 0140-Fix-an-8-year-old-typo.patch | 23 - ...n-don-t-run-autoreconf-in-the-topdir.patch | 21 - ...-R-.note.gnu.property-at-more-places.patch | 6 +- ...nd-prefix-when-HTTP-path-is-relative.patch | 0 ...ernel_header.hdr_offset-be-at-the-ri.patch | 2 +- ...=> 0144-Make-grub_error-more-verbose.patch | 6 +- ...fier-report-the-filename-or-modname-.patch | 250 - ...eset-an-alias-for-the-reboot-command.patch | 0 ...-debug-output-on-GOP-and-UGA-probing.patch | 0 ....patch => 0147-Add-a-version-command.patch | 8 +- ...dprintf-and-nerf-dprintf-in-script.c.patch | 6 +- ...-Better-memory-allocation-and-error-.patch | 62 +- ...tter-locations-for-kernel-and-initrd.patch | 18 +- ...p-all-the-places-Wsign-compare-error.patch | 396 + ...gn-compare-Wno-conversion-Wno-error-.patch | 12 +- ...ce-buffers-for-reading-to-addresses-.patch | 14 +- ...-arrange-grub_cmd_linux-a-little-bit.patch | 10 +- ...e-our-own-allocator-for-kernel-stuff.patch | 22 +- ...itrd-params-cmdline-allocations-abov.patch | 20 +- ...p-all-the-places-Wsign-compare-error.patch | 392 - ... => 0157-Fix-getroot.c-s-trampolines.patch | 0 ...not-allow-stack-trampolines-anywhere.patch | 10 +- ...tch => 0159-Reimplement-boot_counter.patch | 8 +- ...l-end-pointer-have-the-right-constif.patch | 26 +- ...ntry-selection-based-on-ID-and-title.patch | 2 +- ...try-users-option-argument-to-be-opti.patch | 0 ...export-env-and-efi-load-env-commands.patch | 10 +- ...le-to-subtract-conditions-from-debug.patch | 0 ...bles-from-the-initial-context-when-c.patch | 2 +- ...g-up-grub.cfg-XXX-while-tftp-booting.patch | 2 +- ...-to-set-fPIE-and-friends-on-libgnu.a.patch | 37 +- ...strtoull-print-an-error-if-no-conver.patch | 0 ...69-Fix-the-type-of-grub_efi_status_t.patch | 2 +- ...-boot-success-reset-from-menu-auto-h.patch | 6 +- ...ix-systemctl-kexec-exit-status-check.patch | 0 ...b-emu-linux-loader-messages-as-debug.patch | 0 ...t-boot-commands-will-only-return-on-.patch | 2 +- ...ferences-for-fdt-when-building-with-.patch | 2 +- 0175-Do-better-in-bootstrap.conf.patch | 28 + 0176-Use-git-to-apply-gnulib-patches.patch | 474 + ...2_HEADER_SIZE-define-in-arm-efi-case.patch | 35 - ...find-wholename-for-long-path-matches.patch | 23 + ...ge-Align-efi-sections-on-4k-boundary.patch | 55 - ...ap.conf-don-t-clobber-AM_CFLAGS-here.patch | 23 + ...e-Clarify-file-alignment-in-efi-case.patch | 71 - ...m-Move-trampolines-into-code-section.patch | 78 - ...n-alignment-with-manual-relocation-o.patch | 41 - ...-efi-fdt.c-Do-not-copy-random-memory.patch | 29 - ...t-break-FDT-extra-allocation-space-o.patch | 48 - bootstrap | 1073 + bootstrap.conf | 91 + do-rebase | 18 +- gitignore | 34 +- grub.macros | 25 +- grub.patches | 155 +- grub2.spec | 30 +- release-to-master.patch | 16760 ---------------- sources | 3 +- 177 files changed, 3634 insertions(+), 24119 deletions(-) rename 0107-Fixup-for-newer-compiler.patch => 0106-Fixup-for-newer-compiler.patch (92%) delete mode 100644 0106-TPM-support.patch rename 0108-Don-t-attempt-to-export-the-start-and-_start-symbols.patch => 0107-Don-t-attempt-to-export-the-start-and-_start-symbols.patch (94%) rename 0109-Fixup-for-newer-compiler.patch => 0108-Fixup-for-newer-compiler.patch (96%) rename 0111-Add-support-for-non-Ethernet-network-cards.patch => 0109-Add-support-for-non-Ethernet-network-cards.patch (94%) delete mode 100644 0110-Use-xid-to-match-DHCP-replies.patch rename 0112-misc-fix-invalid-character-recongition-in-strto-l.patch => 0110-misc-fix-invalid-character-recongition-in-strto-l.patch (100%) rename 0113-net-read-bracketed-ipv6-addrs-and-port-numbers.patch => 0111-net-read-bracketed-ipv6-addrs-and-port-numbers.patch (99%) rename 0114-bootp-New-net_bootp6-command.patch => 0112-bootp-New-net_bootp6-command.patch (84%) rename 0115-efinet-UEFI-IPv6-PXE-support.patch => 0113-efinet-UEFI-IPv6-PXE-support.patch (99%) rename 0116-grub.texi-Add-net_bootp6-doument.patch => 0114-grub.texi-Add-net_bootp6-doument.patch (90%) create mode 100644 0115-bootp-Add-processing-DHCPACK-packet-from-HTTP-Boot.patch rename 0118-efinet-Setting-network-from-UEFI-device-path.patch => 0116-efinet-Setting-network-from-UEFI-device-path.patch (99%) delete mode 100644 0117-bootp-Add-processing-DHCPACK-packet-from-HTTP-Boot.patch rename 0119-efinet-Setting-DNS-server-from-UEFI-protocol.patch => 0117-efinet-Setting-DNS-server-from-UEFI-protocol.patch (99%) rename 0120-Fix-one-more-coverity-complaint.patch => 0118-Fix-one-more-coverity-complaint.patch (90%) rename 0121-Support-UEFI-networking-protocols.patch => 0119-Support-UEFI-networking-protocols.patch (99%) rename 0122-AUDIT-0-http-boot-tracker-bug.patch => 0120-AUDIT-0-http-boot-tracker-bug.patch (98%) rename 0123-grub-core-video-efi_gop.c-Add-support-for-BLT_ONLY-a.patch => 0121-grub-core-video-efi_gop.c-Add-support-for-BLT_ONLY-a.patch (100%) rename 0124-efi-uga-use-64-bit-for-fb_base.patch => 0122-efi-uga-use-64-bit-for-fb_base.patch (100%) rename 0125-EFI-console-Do-not-set-text-mode-until-we-actually-n.patch => 0123-EFI-console-Do-not-set-text-mode-until-we-actually-n.patch (100%) rename 0126-EFI-console-Add-grub_console_read_key_stroke-helper-.patch => 0124-EFI-console-Add-grub_console_read_key_stroke-helper-.patch (100%) rename 0127-EFI-console-Implement-getkeystatus-support.patch => 0125-EFI-console-Implement-getkeystatus-support.patch (100%) rename 0128-Make-grub_getkeystatus-helper-funtion-available-ever.patch => 0126-Make-grub_getkeystatus-helper-funtion-available-ever.patch (100%) rename 0129-Accept-ESC-F8-and-holding-SHIFT-as-user-interrupt-ke.patch => 0127-Accept-ESC-F8-and-holding-SHIFT-as-user-interrupt-ke.patch (98%) rename 0130-grub-editenv-Add-incr-command-to-increment-integer-v.patch => 0128-grub-editenv-Add-incr-command-to-increment-integer-v.patch (94%) rename 0131-Add-auto-hide-menu-support.patch => 0129-Add-auto-hide-menu-support.patch (98%) rename 0132-Output-a-menu-entry-for-firmware-setup-on-UEFI-FastB.patch => 0130-Output-a-menu-entry-for-firmware-setup-on-UEFI-FastB.patch (97%) rename 0133-Add-grub-set-bootflag-utility.patch => 0131-Add-grub-set-bootflag-utility.patch (93%) rename 0134-docs-Add-grub-boot-indeterminate.service-example.patch => 0132-docs-Add-grub-boot-indeterminate.service-example.patch (100%) rename 0135-gentpl-add-disable-support.patch => 0133-gentpl-add-disable-support.patch (89%) rename 0136-gentpl-add-pc-firmware-type.patch => 0134-gentpl-add-pc-firmware-type.patch (68%) rename 0137-efinet-also-use-the-firmware-acceleration-for-http.patch => 0135-efinet-also-use-the-firmware-acceleration-for-http.patch (96%) rename 0138-efi-http-Make-root_url-reflect-the-protocol-hostname.patch => 0136-efi-http-Make-root_url-reflect-the-protocol-hostname.patch (100%) rename 0142-Make-it-so-we-can-tell-configure-which-cflags-utils-.patch => 0137-Make-it-so-we-can-tell-configure-which-cflags-utils-.patch (95%) rename 0143-module-verifier-make-it-possible-to-run-checkers-on-.patch => 0138-module-verifier-make-it-possible-to-run-checkers-on-.patch (98%) delete mode 100644 0139-Force-everything-to-use-python3.patch rename 0145-Rework-how-the-fdt-command-builds.patch => 0139-Rework-how-the-fdt-command-builds.patch (86%) rename 0146-Disable-non-wordsize-allocations-on-arm.patch => 0140-Disable-non-wordsize-allocations-on-arm.patch (93%) delete mode 100644 0140-Fix-an-8-year-old-typo.patch delete mode 100644 0141-autogen-don-t-run-autoreconf-in-the-topdir.patch rename 0147-strip-R-.note.gnu.property-at-more-places.patch => 0141-strip-R-.note.gnu.property-at-more-places.patch (96%) rename 0148-Prepend-prefix-when-HTTP-path-is-relative.patch => 0142-Prepend-prefix-when-HTTP-path-is-relative.patch (100%) rename 0149-Make-linux_arm_kernel_header.hdr_offset-be-at-the-ri.patch => 0143-Make-linux_arm_kernel_header.hdr_offset-be-at-the-ri.patch (98%) rename 0150-Make-grub_error-more-verbose.patch => 0144-Make-grub_error-more-verbose.patch (96%) delete mode 100644 0144-grub-module-verifier-report-the-filename-or-modname-.patch rename 0151-Make-reset-an-alias-for-the-reboot-command.patch => 0145-Make-reset-an-alias-for-the-reboot-command.patch (100%) rename 0152-EFI-more-debug-output-on-GOP-and-UGA-probing.patch => 0146-EFI-more-debug-output-on-GOP-and-UGA-probing.patch (100%) rename 0153-Add-a-version-command.patch => 0147-Add-a-version-command.patch (96%) rename 0154-Add-more-dprintf-and-nerf-dprintf-in-script.c.patch => 0148-Add-more-dprintf-and-nerf-dprintf-in-script.c.patch (94%) rename 0155-arm-arm64-loader-Better-memory-allocation-and-error-.patch => 0149-arm-arm64-loader-Better-memory-allocation-and-error-.patch (85%) rename 0156-Try-to-pick-better-locations-for-kernel-and-initrd.patch => 0150-Try-to-pick-better-locations-for-kernel-and-initrd.patch (94%) create mode 100644 0151-Attempt-to-fix-up-all-the-places-Wsign-compare-error.patch rename 0158-Don-t-use-Wno-sign-compare-Wno-conversion-Wno-error-.patch => 0152-Don-t-use-Wno-sign-compare-Wno-conversion-Wno-error-.patch (85%) rename 0159-x86-efi-Use-bounce-buffers-for-reading-to-addresses-.patch => 0153-x86-efi-Use-bounce-buffers-for-reading-to-addresses-.patch (88%) rename 0160-x86-efi-Re-arrange-grub_cmd_linux-a-little-bit.patch => 0154-x86-efi-Re-arrange-grub_cmd_linux-a-little-bit.patch (94%) rename 0161-x86-efi-Make-our-own-allocator-for-kernel-stuff.patch => 0155-x86-efi-Make-our-own-allocator-for-kernel-stuff.patch (93%) rename 0162-x86-efi-Allow-initrd-params-cmdline-allocations-abov.patch => 0156-x86-efi-Allow-initrd-params-cmdline-allocations-abov.patch (91%) delete mode 100644 0157-Attempt-to-fix-up-all-the-places-Wsign-compare-error.patch rename 0163-Fix-getroot.c-s-trampolines.patch => 0157-Fix-getroot.c-s-trampolines.patch (100%) rename 0164-Do-not-allow-stack-trampolines-anywhere.patch => 0158-Do-not-allow-stack-trampolines-anywhere.patch (81%) rename 0165-Reimplement-boot_counter.patch => 0159-Reimplement-boot_counter.patch (97%) rename 0166-Make-grub_strtoul-end-pointer-have-the-right-constif.patch => 0160-Make-grub_strtoul-end-pointer-have-the-right-constif.patch (97%) rename 0167-Fix-menu-entry-selection-based-on-ID-and-title.patch => 0161-Fix-menu-entry-selection-based-on-ID-and-title.patch (99%) rename 0168-Make-the-menu-entry-users-option-argument-to-be-opti.patch => 0162-Make-the-menu-entry-users-option-argument-to-be-opti.patch (100%) rename 0169-Add-efi-export-env-and-efi-load-env-commands.patch => 0163-Add-efi-export-env-and-efi-load-env-commands.patch (98%) rename 0170-Make-it-possible-to-subtract-conditions-from-debug.patch => 0164-Make-it-possible-to-subtract-conditions-from-debug.patch (100%) rename 0171-Export-all-variables-from-the-initial-context-when-c.patch => 0165-Export-all-variables-from-the-initial-context-when-c.patch (97%) rename 0172-Fix-the-looking-up-grub.cfg-XXX-while-tftp-booting.patch => 0166-Fix-the-looking-up-grub.cfg-XXX-while-tftp-booting.patch (97%) rename 0173-Try-to-set-fPIE-and-friends-on-libgnu.a.patch => 0167-Try-to-set-fPIE-and-friends-on-libgnu.a.patch (51%) rename 0174-Don-t-make-grub_strtoull-print-an-error-if-no-conver.patch => 0168-Don-t-make-grub_strtoull-print-an-error-if-no-conver.patch (100%) rename 0175-Fix-the-type-of-grub_efi_status_t.patch => 0169-Fix-the-type-of-grub_efi_status_t.patch (98%) rename 0179-grub.d-Split-out-boot-success-reset-from-menu-auto-h.patch => 0170-grub.d-Split-out-boot-success-reset-from-menu-auto-h.patch (98%) rename 0180-Fix-systemctl-kexec-exit-status-check.patch => 0171-Fix-systemctl-kexec-exit-status-check.patch (100%) rename 0181-Print-grub-emu-linux-loader-messages-as-debug.patch => 0172-Print-grub-emu-linux-loader-messages-as-debug.patch (100%) rename 0182-Don-t-assume-that-boot-commands-will-only-return-on-.patch => 0173-Don-t-assume-that-boot-commands-will-only-return-on-.patch (98%) rename 0183-Fix-undefined-references-for-fdt-when-building-with-.patch => 0174-Fix-undefined-references-for-fdt-when-building-with-.patch (98%) create mode 100644 0175-Do-better-in-bootstrap.conf.patch create mode 100644 0176-Use-git-to-apply-gnulib-patches.patch delete mode 100644 0176-mkimage-Use-EFI32_HEADER_SIZE-define-in-arm-efi-case.patch create mode 100644 0177-autogen.sh-use-find-wholename-for-long-path-matches.patch delete mode 100644 0177-mkimage-Align-efi-sections-on-4k-boundary.patch create mode 100644 0178-bootstrap.conf-don-t-clobber-AM_CFLAGS-here.patch delete mode 100644 0178-mkimage-Clarify-file-alignment-in-efi-case.patch delete mode 100644 0184-arm-Move-trampolines-into-code-section.patch delete mode 100644 0185-arm-Align-section-alignment-with-manual-relocation-o.patch delete mode 100644 0186-grub-core-loader-efi-fdt.c-Do-not-copy-random-memory.patch delete mode 100644 0187-linux-efi-arm-fdt-break-FDT-extra-allocation-space-o.patch create mode 100755 bootstrap create mode 100644 bootstrap.conf delete mode 100644 release-to-master.patch diff --git a/.gitignore b/.gitignore index a592bad..19364b8 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ kojilogs tmp/ .*.sw? results_grub2/ +/gnulib-*.tar.?z diff --git a/0001-Add-support-for-Linux-EFI-stub-loading.patch b/0001-Add-support-for-Linux-EFI-stub-loading.patch index 88fae3c..95c7cd5 100644 --- a/0001-Add-support-for-Linux-EFI-stub-loading.patch +++ b/0001-Add-support-for-Linux-EFI-stub-loading.patch @@ -1,6 +1,6 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Matthew Garrett -Date: Tue, 10 Jul 2012 11:58:52 -0400 +Date: Fri, 5 Jul 2019 18:36:44 +0200 Subject: [PATCH] Add support for Linux EFI stub loading. Also: @@ -38,17 +38,16 @@ moves the check into grub_dl_load_file. include/grub/arm64/linux.h | 10 ++ include/grub/efi/efi.h | 7 +- include/grub/efi/linux.h | 31 ++++ - include/grub/i386/linux.h | 1 + - 14 files changed, 620 insertions(+), 69 deletions(-) + 13 files changed, 619 insertions(+), 69 deletions(-) create mode 100644 grub-core/loader/efi/linux.c create mode 100644 grub-core/loader/i386/efi/linux.c create mode 100644 include/grub/efi/linux.h diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def -index 9590e87d9c0..0b4b0c2122d 100644 +index 474a63e68c5..581d9dfc3b3 100644 --- a/grub-core/Makefile.core.def +++ b/grub-core/Makefile.core.def -@@ -1626,13 +1626,6 @@ module = { +@@ -1709,13 +1709,6 @@ module = { enable = i386_pc; }; @@ -62,7 +61,7 @@ index 9590e87d9c0..0b4b0c2122d 100644 module = { name = ntldr; i386_pc = loader/i386/pc/ntldr.c; -@@ -1685,7 +1678,9 @@ module = { +@@ -1771,7 +1764,9 @@ module = { module = { name = linux; @@ -70,13 +69,13 @@ index 9590e87d9c0..0b4b0c2122d 100644 + i386_pc = loader/i386/pc/linux.c; + x86_64_efi = loader/i386/efi/linux.c; + i386_efi = loader/i386/efi/linux.c; + i386_xen_pvh = loader/i386/linux.c; xen = loader/i386/xen.c; i386_pc = lib/i386/pc/vesa_modes_table.c; - mips = loader/mips/linux.c; -@@ -1696,9 +1691,14 @@ module = { - arm_efi = loader/arm64/linux.c; - arm_uboot = loader/arm/linux.c; +@@ -1786,9 +1781,14 @@ module = { arm64 = loader/arm64/linux.c; + riscv32 = loader/riscv/linux.c; + riscv64 = loader/riscv/linux.c; + emu = loader/emu/linux.c; + fdt = lib/fdt.c; + @@ -89,7 +88,7 @@ index 9590e87d9c0..0b4b0c2122d 100644 module = { diff --git a/grub-core/kern/dl.c b/grub-core/kern/dl.c -index e394cd96f8c..04e804d1668 100644 +index 48eb5e7b627..896bebfd57e 100644 --- a/grub-core/kern/dl.c +++ b/grub-core/kern/dl.c @@ -38,6 +38,14 @@ @@ -126,9 +125,9 @@ index e394cd96f8c..04e804d1668 100644 + grub_boot_time ("Loading module %s", filename); - file = grub_file_open (filename); + file = grub_file_open (filename, GRUB_FILE_TYPE_GRUB_MODULE); diff --git a/grub-core/kern/efi/efi.c b/grub-core/kern/efi/efi.c -index 708581fcbde..c8a9d8307c0 100644 +index 6e1ceb90516..a0faa40ecf0 100644 --- a/grub-core/kern/efi/efi.c +++ b/grub-core/kern/efi/efi.c @@ -273,6 +273,34 @@ grub_efi_get_variable (const char *var, const grub_efi_guid_t *guid, @@ -167,7 +166,7 @@ index 708581fcbde..c8a9d8307c0 100644 /* Search the mods section from the PE32/PE32+ image. This code uses diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c -index 42ad7c570a5..5cdf6c943f2 100644 +index b02fab1b102..a9e37108c6d 100644 --- a/grub-core/kern/efi/mm.c +++ b/grub-core/kern/efi/mm.c @@ -113,6 +113,38 @@ grub_efi_drop_alloc (grub_efi_physical_address_t address, @@ -210,7 +209,7 @@ index 42ad7c570a5..5cdf6c943f2 100644 void * grub_efi_allocate_pages_real (grub_efi_physical_address_t address, diff --git a/grub-core/loader/arm64/linux.c b/grub-core/loader/arm64/linux.c -index 1f86229f86b..6c00af98dce 100644 +index ef3e9f9444c..a312c668685 100644 --- a/grub-core/loader/arm64/linux.c +++ b/grub-core/loader/arm64/linux.c @@ -29,6 +29,7 @@ @@ -221,7 +220,7 @@ index 1f86229f86b..6c00af98dce 100644 #include #include #include -@@ -40,6 +41,7 @@ static int loaded; +@@ -41,6 +42,7 @@ static int loaded; static void *kernel_addr; static grub_uint64_t kernel_size; @@ -229,7 +228,7 @@ index 1f86229f86b..6c00af98dce 100644 static char *linux_args; static grub_uint32_t cmdline_size; -@@ -66,7 +68,8 @@ grub_armxx_efi_linux_check_image (struct linux_armxx_kernel_header * lh) +@@ -67,7 +69,8 @@ grub_arch_efi_linux_check_image (struct linux_arch_kernel_header * lh) static grub_err_t finalize_params_linux (void) { @@ -239,7 +238,7 @@ index 1f86229f86b..6c00af98dce 100644 void *fdt; -@@ -101,79 +104,70 @@ finalize_params_linux (void) +@@ -102,79 +105,70 @@ finalize_params_linux (void) if (grub_fdt_install() != GRUB_ERR_NONE) goto failure; @@ -251,7 +250,7 @@ index 1f86229f86b..6c00af98dce 100644 -} - -grub_err_t --grub_armxx_efi_linux_boot_image (grub_addr_t addr, grub_size_t size, char *args) +-grub_arch_efi_linux_boot_image (grub_addr_t addr, grub_size_t size, char *args) -{ - grub_efi_memory_mapped_device_path_t *mempath; - grub_efi_handle_t image_handle; @@ -284,7 +283,7 @@ index 1f86229f86b..6c00af98dce 100644 - - grub_dprintf ("linux", "linux command line: '%s'\n", args); + grub_dprintf ("linux", "Installed/updated FDT configuration table @ %p\n", -+ fdt); ++ fdt); /* Convert command line to UCS-2 */ - loaded_image = grub_efi_get_loaded_image (image_handle); @@ -304,7 +303,7 @@ index 1f86229f86b..6c00af98dce 100644 loaded_image->load_options_size = 2 * grub_utf8_to_utf16 (loaded_image->load_options, len, - (grub_uint8_t *) args, len, NULL); -+ (grub_uint8_t *) linux_args, len, NULL); ++ (grub_uint8_t *) linux_args, len, NULL); - grub_dprintf ("linux", "starting image %p\n", image_handle); - status = b->start_image (image_handle, 0, NULL); @@ -329,15 +328,15 @@ index 1f86229f86b..6c00af98dce 100644 + if (loaded_image) + { + if (loaded_image->load_options) -+ grub_efi_free_pages ((grub_efi_physical_address_t)(grub_efi_uintn_t)loaded_image->load_options, -+ GRUB_EFI_BYTES_TO_PAGES (loaded_image->load_options_size)); ++ grub_efi_free_pages ((grub_efi_physical_address_t)(grub_efi_uintn_t)loaded_image->load_options, ++ GRUB_EFI_BYTES_TO_PAGES (loaded_image->load_options_size)); + loaded_image->load_options = NULL; + loaded_image->load_options_size = 0; + } +} + +grub_err_t -+grub_armxx_efi_linux_boot_image (grub_addr_t addr, char *args) ++grub_arch_efi_linux_boot_image (grub_addr_t addr, char *args) +{ + grub_err_t retval; + @@ -360,21 +359,21 @@ index 1f86229f86b..6c00af98dce 100644 - if (finalize_params_linux () != GRUB_ERR_NONE) - return grub_errno; - -- return (grub_armxx_efi_linux_boot_image((grub_addr_t)kernel_addr, +- return (grub_arch_efi_linux_boot_image((grub_addr_t)kernel_addr, - kernel_size, linux_args)); -+ return grub_armxx_efi_linux_boot_image((grub_addr_t)kernel_addr, linux_args); ++ return (grub_arch_efi_linux_boot_image((grub_addr_t)kernel_addr, linux_args)); } static grub_err_t -@@ -287,6 +281,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), +@@ -288,6 +282,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), { grub_file_t file = 0; - struct linux_armxx_kernel_header lh; + struct linux_arch_kernel_header lh; + struct grub_armxx_linux_pe_header *pe; + grub_err_t err; grub_dl_ref (my_mod); - -@@ -331,6 +326,15 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), +@@ -333,6 +328,15 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), grub_dprintf ("linux", "kernel @ %p\n", kernel_addr); @@ -391,13 +390,13 @@ index 1f86229f86b..6c00af98dce 100644 linux_args = grub_malloc (cmdline_size); if (!linux_args) diff --git a/grub-core/loader/arm64/xen_boot.c b/grub-core/loader/arm64/xen_boot.c -index 1003a0b9997..f35b16caa92 100644 +index 22cc25eccd9..d9b7a9ba400 100644 --- a/grub-core/loader/arm64/xen_boot.c +++ b/grub-core/loader/arm64/xen_boot.c @@ -266,7 +266,6 @@ xen_boot (void) return err; - return grub_armxx_efi_linux_boot_image (xen_hypervisor->start, + return grub_arch_efi_linux_boot_image (xen_hypervisor->start, - xen_hypervisor->size, xen_hypervisor->cmdline); } @@ -480,7 +479,7 @@ index 00000000000..c24202a5dd1 +#pragma GCC diagnostic pop diff --git a/grub-core/loader/i386/efi/linux.c b/grub-core/loader/i386/efi/linux.c new file mode 100644 -index 00000000000..3db82e782df +index 00000000000..bb2616a8092 --- /dev/null +++ b/grub-core/loader/i386/efi/linux.c @@ -0,0 +1,335 @@ @@ -589,8 +588,7 @@ index 00000000000..3db82e782df + + for (i = 0; i < argc; i++) + { -+ grub_file_filter_disable_compression (); -+ files[i] = grub_file_open (argv[i]); ++ files[i] = grub_file_open (argv[i], GRUB_FILE_TYPE_LINUX_INITRD | GRUB_FILE_TYPE_NO_DECOMPRESS); + if (! files[i]) + goto fail; + nfiles++; @@ -643,7 +641,7 @@ index 00000000000..3db82e782df + int argc, char *argv[]) +{ + grub_file_t file = 0; -+ struct linux_kernel_header lh; ++ struct linux_i386_kernel_header lh; + grub_ssize_t len, start, filelen; + void *kernel = NULL; + @@ -655,7 +653,7 @@ index 00000000000..3db82e782df + goto fail; + } + -+ file = grub_file_open (argv[0]); ++ file = grub_file_open (argv[0], GRUB_FILE_TYPE_LINUX_KERNEL); + if (! file) + goto fail; + @@ -731,7 +729,8 @@ index 00000000000..3db82e782df + grub_memcpy (linux_cmdline, LINUX_IMAGE, sizeof (LINUX_IMAGE)); + grub_create_loader_cmdline (argc, argv, + linux_cmdline + sizeof (LINUX_IMAGE) - 1, -+ lh.cmdline_size - (sizeof (LINUX_IMAGE) - 1)); ++ lh.cmdline_size - (sizeof (LINUX_IMAGE) - 1), ++ GRUB_VERIFY_KERNEL_CMDLINE); + + lh.cmd_line_ptr = (grub_uint32_t)(grub_addr_t)linux_cmdline; + @@ -820,10 +819,10 @@ index 00000000000..3db82e782df + grub_unregister_command (cmd_initrdefi); +} diff --git a/grub-core/loader/i386/pc/linux.c b/grub-core/loader/i386/pc/linux.c -index b69cb7a3a7f..a3c87cf2fc2 100644 +index 47ea2945e4f..eea25ea39ca 100644 --- a/grub-core/loader/i386/pc/linux.c +++ b/grub-core/loader/i386/pc/linux.c -@@ -468,14 +468,20 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), +@@ -470,14 +470,20 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), return grub_errno; } @@ -845,7 +844,7 @@ index b69cb7a3a7f..a3c87cf2fc2 100644 grub_register_command ("initrd16", grub_cmd_initrd, 0, N_("Load initrd.")); my_mod = mod; -@@ -484,5 +490,7 @@ GRUB_MOD_INIT(linux16) +@@ -486,5 +492,7 @@ GRUB_MOD_INIT(linux16) GRUB_MOD_FINI(linux16) { grub_unregister_command (cmd_linux); @@ -854,7 +853,7 @@ index b69cb7a3a7f..a3c87cf2fc2 100644 + grub_unregister_command (cmd_initrd16); } diff --git a/include/grub/arm/linux.h b/include/grub/arm/linux.h -index 712ba17b9ba..5900fc8a40c 100644 +index 2e98a668969..775297db869 100644 --- a/include/grub/arm/linux.h +++ b/include/grub/arm/linux.h @@ -20,6 +20,7 @@ @@ -878,13 +877,13 @@ index 712ba17b9ba..5900fc8a40c 100644 + #if defined(__arm__) # define GRUB_LINUX_ARMXX_MAGIC_SIGNATURE GRUB_LINUX_ARM_MAGIC_SIGNATURE - # define linux_armxx_kernel_header linux_arm_kernel_header + # define linux_arch_kernel_header linux_arm_kernel_header +# define grub_armxx_linux_pe_header grub_arm_linux_pe_header #endif #if defined GRUB_MACHINE_UBOOT diff --git a/include/grub/arm64/linux.h b/include/grub/arm64/linux.h -index 8655067e039..7b533b57139 100644 +index 4269adc6dae..a3be9dd7003 100644 --- a/include/grub/arm64/linux.h +++ b/include/grub/arm64/linux.h @@ -19,6 +19,8 @@ @@ -909,13 +908,13 @@ index 8655067e039..7b533b57139 100644 + #if defined(__aarch64__) # define GRUB_LINUX_ARMXX_MAGIC_SIGNATURE GRUB_LINUX_ARM64_MAGIC_SIGNATURE - # define linux_armxx_kernel_header linux_arm64_kernel_header + # define linux_arch_kernel_header linux_arm64_kernel_header +# define grub_armxx_linux_pe_header grub_arm64_linux_pe_header #endif #endif /* ! GRUB_ARM64_LINUX_HEADER */ diff --git a/include/grub/efi/efi.h b/include/grub/efi/efi.h -index 2c6648d46fc..1061aee9726 100644 +index e90e00dc431..6840bfee9b7 100644 --- a/include/grub/efi/efi.h +++ b/include/grub/efi/efi.h @@ -47,6 +47,9 @@ EXPORT_FUNC(grub_efi_allocate_fixed) (grub_efi_physical_address_t address, @@ -939,10 +938,10 @@ index 2c6648d46fc..1061aee9726 100644 @@ -95,8 +99,7 @@ void *EXPORT_FUNC(grub_efi_get_firmware_fdt)(void); grub_err_t EXPORT_FUNC(grub_efi_get_ram_base)(grub_addr_t *); #include - grub_err_t grub_armxx_efi_linux_check_image(struct linux_armxx_kernel_header *lh); --grub_err_t grub_armxx_efi_linux_boot_image(grub_addr_t addr, grub_size_t size, + grub_err_t grub_arch_efi_linux_check_image(struct linux_arch_kernel_header *lh); +-grub_err_t grub_arch_efi_linux_boot_image(grub_addr_t addr, grub_size_t size, - char *args); -+grub_err_t grub_armxx_efi_linux_boot_image(grub_addr_t addr, char *args); ++grub_err_t grub_arch_efi_linux_boot_image(grub_addr_t addr, char *args); #endif grub_addr_t grub_efi_modules_addr (void); @@ -983,15 +982,3 @@ index 00000000000..d9ede36773b + void *kernel_param); + +#endif /* ! GRUB_EFI_LINUX_HEADER */ -diff --git a/include/grub/i386/linux.h b/include/grub/i386/linux.h -index 60c7c3b5e66..bb19dbd5a77 100644 ---- a/include/grub/i386/linux.h -+++ b/include/grub/i386/linux.h -@@ -142,6 +142,7 @@ struct linux_i386_kernel_header - grub_uint64_t setup_data; - grub_uint64_t pref_address; - grub_uint32_t init_size; -+ grub_uint32_t handover_offset; - } GRUB_PACKED; - - /* Boot parameters for Linux based on 2.6.12. This is used by the setup diff --git a/0002-Rework-linux-command.patch b/0002-Rework-linux-command.patch index 485541f..bd136d6 100644 --- a/0002-Rework-linux-command.patch +++ b/0002-Rework-linux-command.patch @@ -1,20 +1,20 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Matthew Garrett -Date: Sun, 9 Aug 2015 16:12:39 -0700 +Date: Fri, 5 Jul 2019 20:54:51 +0200 Subject: [PATCH] Rework linux command We want a single buffer that contains the entire kernel image in order to perform a TPM measurement. Allocate one and copy the entire kernel into it before pulling out the individual blocks later on. --- - grub-core/loader/i386/linux.c | 37 ++++++++++++++++++++++++------------- - 1 file changed, 24 insertions(+), 13 deletions(-) + grub-core/loader/i386/linux.c | 36 +++++++++++++++++++++++------------- + 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/grub-core/loader/i386/linux.c b/grub-core/loader/i386/linux.c -index 9b53d3168f9..f7186be4002 100644 +index d0501e22957..b255c950526 100644 --- a/grub-core/loader/i386/linux.c +++ b/grub-core/loader/i386/linux.c -@@ -685,13 +685,15 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), +@@ -641,13 +641,15 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), { grub_file_t file = 0; struct linux_i386_kernel_header lh; @@ -31,7 +31,7 @@ index 9b53d3168f9..f7186be4002 100644 grub_dl_ref (my_mod); -@@ -705,7 +707,15 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), +@@ -661,7 +663,15 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), if (! file) goto fail; @@ -48,7 +48,7 @@ index 9b53d3168f9..f7186be4002 100644 { if (!grub_errno) grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"), -@@ -713,6 +723,9 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), +@@ -669,6 +679,9 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), goto fail; } @@ -58,7 +58,7 @@ index 9b53d3168f9..f7186be4002 100644 if (lh.boot_flag != grub_cpu_to_le16_compile_time (0xaa55)) { grub_error (GRUB_ERR_BAD_OS, "invalid magic number"); -@@ -804,6 +817,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), +@@ -760,6 +773,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), preferred_address)) goto fail; @@ -66,10 +66,10 @@ index 9b53d3168f9..f7186be4002 100644 grub_memset (&linux_params, 0, sizeof (linux_params)); grub_memcpy (&linux_params.setup_sects, &lh.setup_sects, sizeof (lh) - 0x1F1); -@@ -812,13 +826,10 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), - linux_params.ps_mouse = linux_params.padding10 = 0; +@@ -782,13 +796,9 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), + /* We've already read lh so there is no need to read it second time. */ + len -= sizeof(lh); - len = sizeof (linux_params) - sizeof (lh); - if (grub_file_read (file, (char *) &linux_params + sizeof (lh), len) != len) - { - if (!grub_errno) @@ -77,14 +77,13 @@ index 9b53d3168f9..f7186be4002 100644 - argv[0]); - goto fail; - } -+ + linux_params_ptr = (void *)&linux_params; + grub_memcpy (linux_params_ptr + sizeof (lh), kernel + kernel_offset, len); + kernel_offset += len; linux_params.type_of_loader = GRUB_LINUX_BOOT_LOADER_TYPE; -@@ -877,7 +888,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), +@@ -847,7 +857,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), /* The other parameters are filled when booting. */ @@ -93,8 +92,8 @@ index 9b53d3168f9..f7186be4002 100644 grub_dprintf ("linux", "bzImage, setup=0x%x, size=0x%x\n", (unsigned) real_size, (unsigned) prot_size); -@@ -1025,9 +1036,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), - - (sizeof (LINUX_IMAGE) - 1)); +@@ -1001,9 +1011,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), + } len = prot_file_size; - if (grub_file_read (file, prot_mode_mem, len) != len && !grub_errno) @@ -104,7 +103,7 @@ index 9b53d3168f9..f7186be4002 100644 if (grub_errno == GRUB_ERR_NONE) { -@@ -1038,6 +1047,8 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), +@@ -1014,6 +1022,8 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), fail: diff --git a/0003-Rework-linux16-command.patch b/0003-Rework-linux16-command.patch index 99d6e7c..e73423b 100644 --- a/0003-Rework-linux16-command.patch +++ b/0003-Rework-linux16-command.patch @@ -1,17 +1,17 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Matthew Garrett -Date: Sun, 9 Aug 2015 16:20:58 -0700 +Date: Fri, 5 Jul 2019 21:12:00 +0200 Subject: [PATCH] Rework linux16 command We want a single buffer that contains the entire kernel image in order to perform a TPM measurement. Allocate one and copy the entire kernel int it before pulling out the individual blocks later on. --- - grub-core/loader/i386/pc/linux.c | 34 +++++++++++++++++++++------------- - 1 file changed, 21 insertions(+), 13 deletions(-) + grub-core/loader/i386/pc/linux.c | 33 +++++++++++++++++++++------------ + 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/grub-core/loader/i386/pc/linux.c b/grub-core/loader/i386/pc/linux.c -index a3c87cf2fc2..caa76bee8af 100644 +index eea25ea39ca..73fb91e0570 100644 --- a/grub-core/loader/i386/pc/linux.c +++ b/grub-core/loader/i386/pc/linux.c @@ -123,13 +123,14 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), @@ -74,12 +74,11 @@ index a3c87cf2fc2..caa76bee8af 100644 if (lh.header != grub_cpu_to_le32_compile_time (GRUB_LINUX_I386_MAGIC_SIGNATURE) || grub_le_to_cpu16 (lh.version) < 0x0200) -@@ -355,10 +363,8 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), +@@ -358,9 +366,8 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), } len = grub_linux16_prot_size; -- if (grub_file_read (file, grub_linux_prot_chunk, grub_linux16_prot_size) -- != (grub_ssize_t) grub_linux16_prot_size && !grub_errno) +- if (grub_file_read (file, grub_linux_prot_chunk, len) != len && !grub_errno) - grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"), - argv[0]); + grub_memcpy (grub_linux_prot_chunk, kernel + kernel_offset, len); @@ -87,7 +86,7 @@ index a3c87cf2fc2..caa76bee8af 100644 if (grub_errno == GRUB_ERR_NONE) { -@@ -368,6 +374,8 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), +@@ -370,6 +377,8 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), fail: diff --git a/0004-Add-secureboot-support-on-efi-chainloader.patch b/0004-Add-secureboot-support-on-efi-chainloader.patch index 6a347d8..092032b 100644 --- a/0004-Add-secureboot-support-on-efi-chainloader.patch +++ b/0004-Add-secureboot-support-on-efi-chainloader.patch @@ -1,6 +1,6 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Raymund Will -Date: Fri, 10 Apr 2015 01:45:02 -0400 +Date: Mon, 8 Jul 2019 11:55:18 +0200 Subject: [PATCH] Add secureboot support on efi chainloader Expand the chainloader to be able to verify the image by means of shim @@ -175,7 +175,7 @@ Signed-off-by: Laszlo Ersek 7 files changed, 840 insertions(+), 91 deletions(-) diff --git a/grub-core/kern/efi/efi.c b/grub-core/kern/efi/efi.c -index c8a9d8307c0..91129e33566 100644 +index a0faa40ecf0..3487b0623a4 100644 --- a/grub-core/kern/efi/efi.c +++ b/grub-core/kern/efi/efi.c @@ -283,14 +283,20 @@ grub_efi_secure_boot (void) @@ -204,18 +204,18 @@ index c8a9d8307c0..91129e33566 100644 if (*secure_boot && !*setup_mode) ret = 1; diff --git a/grub-core/loader/arm64/linux.c b/grub-core/loader/arm64/linux.c -index 6c00af98dce..a1ac7a38867 100644 +index a312c668685..04994d5c67d 100644 --- a/grub-core/loader/arm64/linux.c +++ b/grub-core/loader/arm64/linux.c -@@ -282,6 +282,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), - grub_file_t file = 0; - struct linux_armxx_kernel_header lh; +@@ -284,6 +284,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), + struct linux_arch_kernel_header lh; struct grub_armxx_linux_pe_header *pe; + grub_err_t err; + int rc; grub_dl_ref (my_mod); -@@ -326,7 +327,8 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), +@@ -328,7 +329,8 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), grub_dprintf ("linux", "kernel @ %p\n", kernel_addr); @@ -226,7 +226,7 @@ index 6c00af98dce..a1ac7a38867 100644 grub_error (GRUB_ERR_INVALID_COMMAND, N_("%s has invalid signature"), argv[0]); goto fail; diff --git a/grub-core/loader/efi/chainloader.c b/grub-core/loader/efi/chainloader.c -index adc85636633..af2189619a3 100644 +index cd92ea3f24b..ef87b06cf70 100644 --- a/grub-core/loader/efi/chainloader.c +++ b/grub-core/loader/efi/chainloader.c @@ -32,6 +32,8 @@ @@ -261,7 +261,7 @@ index adc85636633..af2189619a3 100644 grub_dl_unref (my_mod); return GRUB_ERR_NONE; -@@ -173,7 +181,6 @@ make_file_path (grub_efi_device_path_t *dp, const char *filename) +@@ -179,7 +187,6 @@ make_file_path (grub_efi_device_path_t *dp, const char *filename) /* Fill the file path for the directory. */ d = (grub_efi_device_path_t *) ((char *) file_path + ((char *) d - (char *) dp)); @@ -269,7 +269,7 @@ index adc85636633..af2189619a3 100644 copy_file_path ((grub_efi_file_path_device_path_t *) d, dir_start, dir_end - dir_start); -@@ -191,20 +198,690 @@ make_file_path (grub_efi_device_path_t *dp, const char *filename) +@@ -197,20 +204,690 @@ make_file_path (grub_efi_device_path_t *dp, const char *filename) return file_path; } @@ -963,7 +963,7 @@ index adc85636633..af2189619a3 100644 if (argc == 0) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); -@@ -216,15 +893,45 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)), +@@ -222,15 +899,45 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)), address = 0; image_handle = 0; file_path = 0; @@ -997,7 +997,7 @@ index adc85636633..af2189619a3 100644 + *(--p16) = 0; + } + - file = grub_file_open (filename); + file = grub_file_open (filename, GRUB_FILE_TYPE_EFI_CHAINLOADED_IMAGE); if (! file) goto fail; @@ -1011,7 +1011,7 @@ index adc85636633..af2189619a3 100644 if (! dev) goto fail; -@@ -261,17 +968,14 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)), +@@ -267,17 +974,14 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)), if (! file_path) goto fail; @@ -1032,7 +1032,7 @@ index adc85636633..af2189619a3 100644 status = efi_call_4 (b->allocate_pages, GRUB_EFI_ALLOCATE_ANY_PAGES, GRUB_EFI_LOADER_CODE, -@@ -285,7 +989,7 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)), +@@ -291,7 +995,7 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)), } boot_image = (void *) ((grub_addr_t) address); @@ -1041,7 +1041,7 @@ index adc85636633..af2189619a3 100644 { if (grub_errno == GRUB_ERR_NONE) grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"), -@@ -295,7 +999,7 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)), +@@ -301,7 +1005,7 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)), } #if defined (__i386__) || defined (__x86_64__) @@ -1050,7 +1050,7 @@ index adc85636633..af2189619a3 100644 { struct grub_macho_fat_header *head = boot_image; if (head->magic -@@ -304,6 +1008,14 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)), +@@ -310,6 +1014,14 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)), grub_uint32_t i; struct grub_macho_fat_arch *archs = (struct grub_macho_fat_arch *) (head + 1); @@ -1065,7 +1065,7 @@ index adc85636633..af2189619a3 100644 for (i = 0; i < grub_cpu_to_le32 (head->nfat_arch); i++) { if (GRUB_MACHO_CPUTYPE_IS_HOST_CURRENT (archs[i].cputype)) -@@ -318,79 +1030,39 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)), +@@ -324,79 +1036,39 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)), > ~grub_cpu_to_le32 (archs[i].size) || grub_cpu_to_le32 (archs[i].offset) + grub_cpu_to_le32 (archs[i].size) @@ -1162,7 +1162,7 @@ index adc85636633..af2189619a3 100644 if (dev) grub_device_close (dev); -@@ -402,6 +1074,9 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)), +@@ -408,6 +1080,9 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)), if (address) efi_call_2 (b->free_pages, address, pages); @@ -1218,10 +1218,10 @@ index c24202a5dd1..c8ecce6dfd0 100644 #pragma GCC diagnostic push diff --git a/grub-core/loader/i386/efi/linux.c b/grub-core/loader/i386/efi/linux.c -index 3db82e782df..8db228c5bf5 100644 +index bb2616a8092..6b24cbb9483 100644 --- a/grub-core/loader/i386/efi/linux.c +++ b/grub-core/loader/i386/efi/linux.c -@@ -118,6 +118,8 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), +@@ -117,6 +117,8 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), goto fail; } @@ -1230,15 +1230,15 @@ index 3db82e782df..8db228c5bf5 100644 params->ramdisk_size = size; params->ramdisk_image = (grub_uint32_t)(grub_addr_t) initrd_mem; -@@ -160,6 +162,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), - struct linux_kernel_header lh; +@@ -159,6 +161,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), + struct linux_i386_kernel_header lh; grub_ssize_t len, start, filelen; void *kernel = NULL; + int rc; grub_dl_ref (my_mod); -@@ -185,11 +188,13 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), +@@ -184,11 +187,13 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), if (grub_file_read (file, kernel, filelen) != filelen) { @@ -1254,7 +1254,7 @@ index 3db82e782df..8db228c5bf5 100644 { grub_error (GRUB_ERR_INVALID_COMMAND, N_("%s has invalid signature"), argv[0]); -@@ -204,6 +209,8 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), +@@ -203,6 +208,8 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), goto fail; } @@ -1263,7 +1263,7 @@ index 3db82e782df..8db228c5bf5 100644 grub_memset (params, 0, 16384); grub_memcpy (&lh, kernel, sizeof (lh)); -@@ -242,6 +249,9 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), +@@ -241,6 +248,9 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), goto fail; } @@ -1299,10 +1299,10 @@ index d9ede36773b..0033d9305a9 100644 grub_err_t EXPORT_FUNC(grub_efi_linux_boot) (void *kernel_address, grub_off_t offset, diff --git a/include/grub/efi/pe32.h b/include/grub/efi/pe32.h -index 7d44732d2c3..c03cc599f63 100644 +index 0ed8781f037..a43adf27464 100644 --- a/include/grub/efi/pe32.h +++ b/include/grub/efi/pe32.h -@@ -214,7 +214,11 @@ struct grub_pe64_optional_header +@@ -223,7 +223,11 @@ struct grub_pe64_optional_header struct grub_pe32_section_table { char name[8]; @@ -1315,7 +1315,7 @@ index 7d44732d2c3..c03cc599f63 100644 grub_uint32_t virtual_address; grub_uint32_t raw_data_size; grub_uint32_t raw_data_offset; -@@ -225,12 +229,18 @@ struct grub_pe32_section_table +@@ -234,12 +238,18 @@ struct grub_pe32_section_table grub_uint32_t characteristics; }; @@ -1338,7 +1338,7 @@ index 7d44732d2c3..c03cc599f63 100644 #define GRUB_PE32_SCN_ALIGN_1BYTES 0x00100000 #define GRUB_PE32_SCN_ALIGN_2BYTES 0x00200000 -@@ -239,10 +249,28 @@ struct grub_pe32_section_table +@@ -248,10 +258,28 @@ struct grub_pe32_section_table #define GRUB_PE32_SCN_ALIGN_16BYTES 0x00500000 #define GRUB_PE32_SCN_ALIGN_32BYTES 0x00600000 #define GRUB_PE32_SCN_ALIGN_64BYTES 0x00700000 @@ -1367,7 +1367,7 @@ index 7d44732d2c3..c03cc599f63 100644 #define GRUB_PE32_SIGNATURE_SIZE 4 struct grub_pe32_header -@@ -265,6 +293,20 @@ struct grub_pe32_header +@@ -274,6 +302,20 @@ struct grub_pe32_header #endif }; diff --git a/0005-Make-any-of-the-loaders-that-link-in-efi-mode-honor-.patch b/0005-Make-any-of-the-loaders-that-link-in-efi-mode-honor-.patch index 3c86bee..382fd23 100644 --- a/0005-Make-any-of-the-loaders-that-link-in-efi-mode-honor-.patch +++ b/0005-Make-any-of-the-loaders-that-link-in-efi-mode-honor-.patch @@ -38,10 +38,10 @@ Signed-off-by: Peter Jones create mode 100644 include/grub/sparc64/linux.h diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def -index 0b4b0c2122d..e92a7ef322f 100644 +index 581d9dfc3b3..eb1088fd654 100644 --- a/grub-core/Makefile.core.def +++ b/grub-core/Makefile.core.def -@@ -195,6 +195,7 @@ kernel = { +@@ -207,6 +207,7 @@ kernel = { i386_multiboot = kern/i386/pc/acpi.c; i386_coreboot = kern/acpi.c; i386_multiboot = kern/acpi.c; @@ -114,7 +114,7 @@ index 98769eadb34..088cbe9e2bc 100644 grub_unregister_extcmd (cmd_read_word); grub_unregister_extcmd (cmd_read_dword); diff --git a/grub-core/kern/dl.c b/grub-core/kern/dl.c -index 04e804d1668..621070918d4 100644 +index 896bebfd57e..d7718d26abc 100644 --- a/grub-core/kern/dl.c +++ b/grub-core/kern/dl.c @@ -32,6 +32,7 @@ @@ -126,7 +126,7 @@ index 04e804d1668..621070918d4 100644 /* Platforms where modules are in a readonly area of memory. */ #if defined(GRUB_MACHINE_QEMU) diff --git a/grub-core/kern/efi/efi.c b/grub-core/kern/efi/efi.c -index 91129e33566..708581fcbde 100644 +index 3487b0623a4..6e1ceb90516 100644 --- a/grub-core/kern/efi/efi.c +++ b/grub-core/kern/efi/efi.c @@ -273,40 +273,6 @@ grub_efi_get_variable (const char *var, const grub_efi_guid_t *guid, @@ -272,7 +272,7 @@ index 74888c463ba..69c2a10d351 100644 grub_unregister_command (cmd); } diff --git a/grub-core/loader/efi/chainloader.c b/grub-core/loader/efi/chainloader.c -index af2189619a3..5cd9b6e08a8 100644 +index ef87b06cf70..5aa3a5dc7dd 100644 --- a/grub-core/loader/efi/chainloader.c +++ b/grub-core/loader/efi/chainloader.c @@ -34,6 +34,7 @@ @@ -284,10 +284,10 @@ index af2189619a3..5cd9b6e08a8 100644 #include #include diff --git a/grub-core/loader/i386/bsd.c b/grub-core/loader/i386/bsd.c -index 7f96515da65..87709aa23e8 100644 +index 3730ed38247..5b9b92d6ba5 100644 --- a/grub-core/loader/i386/bsd.c +++ b/grub-core/loader/i386/bsd.c -@@ -38,6 +38,7 @@ +@@ -39,6 +39,7 @@ #ifdef GRUB_MACHINE_PCBIOS #include #endif @@ -295,7 +295,7 @@ index 7f96515da65..87709aa23e8 100644 GRUB_MOD_LICENSE ("GPLv3+"); -@@ -2124,6 +2125,9 @@ static grub_command_t cmd_netbsd_module_elf, cmd_openbsd_ramdisk; +@@ -2130,6 +2131,9 @@ static grub_command_t cmd_netbsd_module_elf, cmd_openbsd_ramdisk; GRUB_MOD_INIT (bsd) { @@ -305,7 +305,7 @@ index 7f96515da65..87709aa23e8 100644 /* Net and OpenBSD kernels are often compressed. */ grub_dl_load ("gzio"); -@@ -2163,6 +2167,9 @@ GRUB_MOD_INIT (bsd) +@@ -2169,6 +2173,9 @@ GRUB_MOD_INIT (bsd) GRUB_MOD_FINI (bsd) { @@ -316,18 +316,18 @@ index 7f96515da65..87709aa23e8 100644 grub_unregister_extcmd (cmd_openbsd); grub_unregister_extcmd (cmd_netbsd); diff --git a/grub-core/loader/i386/linux.c b/grub-core/loader/i386/linux.c -index f7186be4002..c84747ea857 100644 +index b255c950526..376c726928a 100644 --- a/grub-core/loader/i386/linux.c +++ b/grub-core/loader/i386/linux.c -@@ -35,6 +35,7 @@ - #include +@@ -36,6 +36,7 @@ #include #include + #include +#include GRUB_MOD_LICENSE ("GPLv3+"); -@@ -1156,6 +1157,9 @@ static grub_command_t cmd_linux, cmd_initrd; +@@ -1131,6 +1132,9 @@ static grub_command_t cmd_linux, cmd_initrd; GRUB_MOD_INIT(linux) { @@ -337,7 +337,7 @@ index f7186be4002..c84747ea857 100644 cmd_linux = grub_register_command ("linux", grub_cmd_linux, 0, N_("Load Linux.")); cmd_initrd = grub_register_command ("initrd", grub_cmd_initrd, -@@ -1165,6 +1169,9 @@ GRUB_MOD_INIT(linux) +@@ -1140,6 +1144,9 @@ GRUB_MOD_INIT(linux) GRUB_MOD_FINI(linux) { @@ -348,7 +348,7 @@ index f7186be4002..c84747ea857 100644 grub_unregister_command (cmd_initrd); } diff --git a/grub-core/loader/i386/pc/linux.c b/grub-core/loader/i386/pc/linux.c -index caa76bee8af..783a3cd93bc 100644 +index 73fb91e0570..fe3e1d41d09 100644 --- a/grub-core/loader/i386/pc/linux.c +++ b/grub-core/loader/i386/pc/linux.c @@ -35,6 +35,7 @@ @@ -359,7 +359,7 @@ index caa76bee8af..783a3cd93bc 100644 GRUB_MOD_LICENSE ("GPLv3+"); -@@ -480,6 +481,9 @@ static grub_command_t cmd_linux, cmd_linux16, cmd_initrd, cmd_initrd16; +@@ -483,6 +484,9 @@ static grub_command_t cmd_linux, cmd_linux16, cmd_initrd, cmd_initrd16; GRUB_MOD_INIT(linux16) { @@ -369,7 +369,7 @@ index caa76bee8af..783a3cd93bc 100644 cmd_linux = grub_register_command ("linux", grub_cmd_linux, 0, N_("Load Linux.")); -@@ -497,6 +501,9 @@ GRUB_MOD_INIT(linux16) +@@ -500,6 +504,9 @@ GRUB_MOD_INIT(linux16) GRUB_MOD_FINI(linux16) { @@ -380,7 +380,7 @@ index caa76bee8af..783a3cd93bc 100644 grub_unregister_command (cmd_linux16); grub_unregister_command (cmd_initrd); diff --git a/grub-core/loader/multiboot.c b/grub-core/loader/multiboot.c -index 40c67e82489..26df46a4161 100644 +index 4a98d708259..3e6ad166dc9 100644 --- a/grub-core/loader/multiboot.c +++ b/grub-core/loader/multiboot.c @@ -50,6 +50,7 @@ @@ -391,7 +391,7 @@ index 40c67e82489..26df46a4161 100644 GRUB_MOD_LICENSE ("GPLv3+"); -@@ -446,6 +447,9 @@ static grub_command_t cmd_multiboot, cmd_module; +@@ -444,6 +445,9 @@ static grub_command_t cmd_multiboot, cmd_module; GRUB_MOD_INIT(multiboot) { @@ -401,7 +401,7 @@ index 40c67e82489..26df46a4161 100644 cmd_multiboot = #ifdef GRUB_USE_MULTIBOOT2 grub_register_command ("multiboot2", grub_cmd_multiboot, -@@ -466,6 +470,9 @@ GRUB_MOD_INIT(multiboot) +@@ -464,6 +468,9 @@ GRUB_MOD_INIT(multiboot) GRUB_MOD_FINI(multiboot) { @@ -412,18 +412,18 @@ index 40c67e82489..26df46a4161 100644 grub_unregister_command (cmd_module); } diff --git a/grub-core/loader/xnu.c b/grub-core/loader/xnu.c -index c9885b1bcd7..df8dfdb4ba0 100644 +index 7f74d1d6fc9..e0f47e72b06 100644 --- a/grub-core/loader/xnu.c +++ b/grub-core/loader/xnu.c -@@ -33,6 +33,7 @@ - #include +@@ -34,6 +34,7 @@ #include #include + #include +#include GRUB_MOD_LICENSE ("GPLv3+"); -@@ -1469,6 +1470,9 @@ static grub_extcmd_t cmd_splash; +@@ -1478,6 +1479,9 @@ static grub_extcmd_t cmd_splash; GRUB_MOD_INIT(xnu) { @@ -433,7 +433,7 @@ index c9885b1bcd7..df8dfdb4ba0 100644 cmd_kernel = grub_register_command ("xnu_kernel", grub_cmd_xnu_kernel, 0, N_("Load XNU image.")); cmd_kernel64 = grub_register_command ("xnu_kernel64", grub_cmd_xnu_kernel64, -@@ -1509,6 +1513,9 @@ GRUB_MOD_INIT(xnu) +@@ -1518,6 +1522,9 @@ GRUB_MOD_INIT(xnu) GRUB_MOD_FINI(xnu) { @@ -444,7 +444,7 @@ index c9885b1bcd7..df8dfdb4ba0 100644 grub_unregister_command (cmd_resume); #endif diff --git a/include/grub/efi/efi.h b/include/grub/efi/efi.h -index 1061aee9726..39480b38674 100644 +index 6840bfee9b7..090c8621066 100644 --- a/include/grub/efi/efi.h +++ b/include/grub/efi/efi.h @@ -85,7 +85,6 @@ EXPORT_FUNC (grub_efi_set_variable) (const char *var, @@ -503,7 +503,7 @@ diff --git a/include/grub/sparc64/linux.h b/include/grub/sparc64/linux.h new file mode 100644 index 00000000000..e69de29bb2d diff --git a/grub-core/Makefile.am b/grub-core/Makefile.am -index f4ff62b769a..9c69aa88626 100644 +index 3ea8e7ff45f..c6ba5b2d763 100644 --- a/grub-core/Makefile.am +++ b/grub-core/Makefile.am @@ -71,6 +71,7 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/command.h diff --git a/0006-Handle-multi-arch-64-on-32-boot-in-linuxefi-loader.patch b/0006-Handle-multi-arch-64-on-32-boot-in-linuxefi-loader.patch index 76b1183..274321e 100644 --- a/0006-Handle-multi-arch-64-on-32-boot-in-linuxefi-loader.patch +++ b/0006-Handle-multi-arch-64-on-32-boot-in-linuxefi-loader.patch @@ -1,6 +1,6 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Peter Jones -Date: Tue, 14 Feb 2017 16:18:54 -0500 +Date: Mon, 8 Jul 2019 12:32:37 +0200 Subject: [PATCH] Handle multi-arch (64-on-32) boot in linuxefi loader. Allow booting 64-bit kernels on 32-bit EFI on x86. @@ -37,7 +37,7 @@ index c8ecce6dfd0..0622dfa48d4 100644 return GRUB_ERR_BUG; diff --git a/grub-core/loader/i386/efi/linux.c b/grub-core/loader/i386/efi/linux.c -index 8db228c5bf5..800c3e54022 100644 +index 6b24cbb9483..3017d0f3e52 100644 --- a/grub-core/loader/i386/efi/linux.c +++ b/grub-core/loader/i386/efi/linux.c @@ -44,14 +44,10 @@ static char *linux_cmdline; @@ -57,12 +57,12 @@ index 8db228c5bf5..800c3e54022 100644 params); } -@@ -154,14 +150,20 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), +@@ -153,14 +149,20 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), return grub_errno; } +#define MIN(a, b) \ -+ ({ typeof (a) _a = (a); \ ++ ({ typeof (a) _a = (a); \ + typeof (b) _b = (b); \ + _a < _b ? _a : _b; }) + @@ -71,7 +71,7 @@ index 8db228c5bf5..800c3e54022 100644 int argc, char *argv[]) { grub_file_t file = 0; -- struct linux_kernel_header lh; +- struct linux_i386_kernel_header lh; - grub_ssize_t len, start, filelen; + struct linux_i386_kernel_header *lh = NULL; + grub_ssize_t start, filelen; @@ -80,7 +80,7 @@ index 8db228c5bf5..800c3e54022 100644 int rc; grub_dl_ref (my_mod); -@@ -201,48 +203,79 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), +@@ -200,48 +202,79 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), goto fail; } @@ -172,12 +172,13 @@ index 8db228c5bf5..800c3e54022 100644 if (!linux_cmdline) { grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("can't allocate cmdline")); -@@ -255,21 +288,23 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), +@@ -254,22 +287,24 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), grub_memcpy (linux_cmdline, LINUX_IMAGE, sizeof (LINUX_IMAGE)); grub_create_loader_cmdline (argc, argv, linux_cmdline + sizeof (LINUX_IMAGE) - 1, -- lh.cmdline_size - (sizeof (LINUX_IMAGE) - 1)); -+ lh->cmdline_size - (sizeof (LINUX_IMAGE) - 1)); +- lh.cmdline_size - (sizeof (LINUX_IMAGE) - 1), ++ lh->cmdline_size - (sizeof (LINUX_IMAGE) - 1), + GRUB_VERIFY_KERNEL_CMDLINE); - lh.cmd_line_ptr = (grub_uint32_t)(grub_addr_t)linux_cmdline; + grub_dprintf ("linux", "cmdline:%s\n", linux_cmdline); @@ -244,10 +245,10 @@ index 8db228c5bf5..800c3e54022 100644 if (kernel_mem && !loaded) grub_efi_free_pages ((grub_efi_physical_address_t)(grub_addr_t)kernel_mem, diff --git a/include/grub/i386/linux.h b/include/grub/i386/linux.h -index bb19dbd5a77..8474a857ed2 100644 +index ce30e7fb01b..a093679cb80 100644 --- a/include/grub/i386/linux.h +++ b/include/grub/i386/linux.h -@@ -133,7 +133,12 @@ struct linux_i386_kernel_header +@@ -136,7 +136,12 @@ struct linux_i386_kernel_header grub_uint32_t kernel_alignment; grub_uint8_t relocatable; grub_uint8_t min_alignment; diff --git a/0007-re-write-.gitignore.patch b/0007-re-write-.gitignore.patch index 34deea7..2573139 100644 --- a/0007-re-write-.gitignore.patch +++ b/0007-re-write-.gitignore.patch @@ -1,33 +1,42 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Peter Jones -Date: Tue, 8 Aug 2017 12:48:04 -0400 +Date: Mon, 8 Jul 2019 12:55:29 +0200 Subject: [PATCH] re-write .gitignore --- - .gitignore | 357 +++++++++++++------------------------- - build-aux/.gitignore | 9 + - docs/.gitignore | 4 + - grub-core/.gitignore | 15 ++ - grub-core/gnulib/.gitignore | 22 +++ + .gitignore | 366 +++++++++++++++----------------------- + docs/.gitignore | 5 + + grub-core/.gitignore | 16 ++ grub-core/lib/.gitignore | 1 + include/grub/gcrypt/.gitignore | 2 + - po/.gitignore | 4 + - util/bash-completion.d/.gitignore | 1 + - 9 files changed, 175 insertions(+), 240 deletions(-) - create mode 100644 build-aux/.gitignore + po/.gitignore | 5 + + util/bash-completion.d/.gitignore | 2 + + 7 files changed, 171 insertions(+), 226 deletions(-) create mode 100644 docs/.gitignore create mode 100644 grub-core/.gitignore - create mode 100644 grub-core/gnulib/.gitignore create mode 100644 grub-core/lib/.gitignore create mode 100644 include/grub/gcrypt/.gitignore create mode 100644 po/.gitignore create mode 100644 util/bash-completion.d/.gitignore diff --git a/.gitignore b/.gitignore -index eca17bec9b8..43f04d47277 100644 +index 819cd185d44..b45a633f3d1 100644 --- a/.gitignore +++ b/.gitignore -@@ -1,249 +1,126 @@ +@@ -1,237 +1,151 @@ ++# things ./autogen.sh will create ++/Makefile.utilgcry.def ++/ABOUT-NLS ++/aclocal.m4 ++/autom4te.cache ++/build-aux ++/configure ++/gnulib ++/grub-core/lib/gnulib/ ++/Makefile ++ ++# things very common editors create that we never want + *~ -00_header -10_* -20_linux_xen @@ -36,11 +45,13 @@ index eca17bec9b8..43f04d47277 100644 -41_custom -*.1 -*.8 +-ABOUT-NLS -aclocal.m4 -ahci_test -ascii.bitmaps -ascii.h -autom4te.cache +-build-aux -build-grub-gen-asciih -build-grub-gen-widthspec -build-grub-mkfont @@ -64,26 +75,18 @@ index eca17bec9b8..43f04d47277 100644 -example_grub_script_test -example_scripted_test -example_unit_test -+# things ./autogen.sh will create -+/Makefile.utilgcry.def -+/aclocal.m4 -+/autom4te.cache -+/configure -+Makefile -+# we want to enable building in a subdirectory, but we don't want to exclude -+# /build-aux so explicitly don't ignore it. -+/build*/ -+!/build-aux/ -+ -+# things very common editors create that we never want -+*~ +.*.sw? +*.patch + ++# stuff you're likely to make while building test trees ++grub.cfg ++/build*/ ++ +# built objects across the whole tree +Makefile.in +*.a +*.am ++*.efi *.exec -*.exec.exe -fddboot_test @@ -92,6 +95,7 @@ index eca17bec9b8..43f04d47277 100644 -gentrigtables -gentrigtables.exe -gettext_strings_test +-/gnulib -grub-bin2h -/grub-bios-setup -/grub-bios-setup.exe @@ -184,6 +188,7 @@ index eca17bec9b8..43f04d47277 100644 -*.image.exe -include/grub/cpu -include/grub/machine +-INSTALL.grub -install-sh -lib/libgcrypt-grub -libgrub_a_init.c @@ -194,6 +199,7 @@ index eca17bec9b8..43f04d47277 100644 -lzocompress_test *.marker -Makefile + /m4 *.mod -mod-*.c -missing @@ -208,7 +214,11 @@ index eca17bec9b8..43f04d47277 100644 -*.pp -po/*.mo -po/grub.pot +-po/Makefile.in.in +-po/Makevars +-po/Makevars.template -po/POTFILES +-po/Rules-quot -po/stamp-po -printf_test -priority_queue_unit_test @@ -259,25 +269,7 @@ index eca17bec9b8..43f04d47277 100644 -grub-core/*.pp -grub-core/kernel.img.bin -util/bash-completion.d/grub --grub-core/gnulib/alloca.h --grub-core/gnulib/arg-nonnull.h --grub-core/gnulib/c++defs.h --grub-core/gnulib/charset.alias --grub-core/gnulib/configmake.h --grub-core/gnulib/float.h --grub-core/gnulib/getopt.h --grub-core/gnulib/langinfo.h --grub-core/gnulib/ref-add.sed --grub-core/gnulib/ref-del.sed --grub-core/gnulib/stdio.h --grub-core/gnulib/stdlib.h --grub-core/gnulib/string.h --grub-core/gnulib/strings.h --grub-core/gnulib/sys --grub-core/gnulib/unistd.h --grub-core/gnulib/warn-on-use.h --grub-core/gnulib/wchar.h --grub-core/gnulib/wctype.h +-grub-core/lib/gnulib -grub-core/rs_decoder.h -widthspec.bin -widthspec.h @@ -296,10 +288,6 @@ index eca17bec9b8..43f04d47277 100644 -/grub-render-label -/grub-glue-efi.exe -/grub-render-label.exe --grub-core/gnulib/locale.h --grub-core/gnulib/unitypes.h --grub-core/gnulib/uniwidth.h --build-aux/test-driver + +# next are things you get if you do ./configure in the topdir (for e.g. +# "make dist" invocation. @@ -307,9 +295,16 @@ index eca17bec9b8..43f04d47277 100644 +/config.h +/include/grub/cpu +/include/grub/machine ++/INSTALL ++/INSTALL.grub ++/po/Makefile.in.in ++/po/Makevars ++/po/Makevars.template +/po/POTFILES ++/po/Rules-quot +/stamp-h +/stamp-h1 ++bootstrap.log +config.log +config.status + @@ -338,6 +333,8 @@ index eca17bec9b8..43f04d47277 100644 +/grub*-fs-tester +/grub*-fstest +/grub*-fstest.1 ++/grub*-get-kernel-settings ++/grub*-get-kernel-settings.3 +/grub*-glue-efi +/grub*-glue-efi.1 +/grub*-install @@ -348,6 +345,8 @@ index eca17bec9b8..43f04d47277 100644 +/grub*-macbless.8 +/grub*-menulst2cfg +/grub*-menulst2cfg.1 ++/grub*-mount ++/grub*-mount.1 +/grub*-mkconfig +/grub*-mkconfig.8 +/grub*-mkconfig_lib @@ -375,16 +374,24 @@ index eca17bec9b8..43f04d47277 100644 +/grub*-reboot.8 +/grub*-render-label +/grub*-render-label.1 ++/grub*-rpm-sort ++/grub*-rpm-sort.8 +/grub*-script-check +/grub*-script-check.1 ++/grub*-set-bootflag ++/grub*-set-bootflag.1 +/grub*-set-default +/grub*-set-default.8 ++/grub*-set-password ++/grub*-set-password.8 +/grub*-shell +/grub*-shell-tester +/grub*-sparc64-setup +/grub*-sparc64-setup.8 +/grub*-syslinux2cfg +/grub*-syslinux2cfg.1 ++/grub*-switch-to-blscfg ++/grub*-switch-to-blscfg.8 +/grub_fstest.pp +/grub_fstest_init.c +/grub_fstest_init.lst @@ -394,38 +401,25 @@ index eca17bec9b8..43f04d47277 100644 +/libgrub_a_init.lst +/stamp-h.in +/widthspec.h -diff --git a/build-aux/.gitignore b/build-aux/.gitignore -new file mode 100644 -index 00000000000..f2f17aab9ff ---- /dev/null -+++ b/build-aux/.gitignore -@@ -0,0 +1,9 @@ -+/compile -+/config.guess -+/config.sub -+/depcomp -+/install-sh -+/mdate-sh -+/missing -+/test-driver -+/texinfo.tex diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 -index 00000000000..91aee84d3e9 +index 00000000000..e1d849ef95b --- /dev/null +++ b/docs/.gitignore -@@ -0,0 +1,4 @@ +@@ -0,0 +1,5 @@ +/*.in ++/Makefile +/stamp-1 +/stamp-vti +/version*.texi diff --git a/grub-core/.gitignore b/grub-core/.gitignore new file mode 100644 -index 00000000000..c738ac6c649 +index 00000000000..2acce281159 --- /dev/null +++ b/grub-core/.gitignore -@@ -0,0 +1,15 @@ +@@ -0,0 +1,16 @@ +/*.lst ++/Makefile +/Makefile.gcry.def +/unidata.c +/build-grub-module-verifier @@ -440,34 +434,6 @@ index 00000000000..c738ac6c649 +/symlist.c +/symlist.h +/trigtables.c -diff --git a/grub-core/gnulib/.gitignore b/grub-core/gnulib/.gitignore -new file mode 100644 -index 00000000000..29e199c2db4 ---- /dev/null -+++ b/grub-core/gnulib/.gitignore -@@ -0,0 +1,22 @@ -+/alloca.h -+/arg-nonnull.h -+/c++defs.h -+/charset.alias -+/configmake.h -+/getopt.h -+/langinfo.h -+/libgnu.a -+/locale.h -+/ref-add.sed -+/ref-del.sed -+/stdio.h -+/stdlib.h -+/string.h -+/strings.h -+/sys/ -+/unistd.h -+/unitypes.h -+/uniwidth.h -+/warn-on-use.h -+/wchar.h -+/wctype.h diff --git a/grub-core/lib/.gitignore b/grub-core/lib/.gitignore new file mode 100644 index 00000000000..68154591404 @@ -485,18 +451,20 @@ index 00000000000..8fbf5646246 +gcrypt.h diff --git a/po/.gitignore b/po/.gitignore new file mode 100644 -index 00000000000..97b679c3138 +index 00000000000..f507e7741e3 --- /dev/null +++ b/po/.gitignore -@@ -0,0 +1,4 @@ +@@ -0,0 +1,5 @@ ++/Makefile +/POTFILES*.in +/grub.pot +/remove-potcdate.sed +/stamp-po diff --git a/util/bash-completion.d/.gitignore b/util/bash-completion.d/.gitignore new file mode 100644 -index 00000000000..b7e1eb12428 +index 00000000000..6813a527ad3 --- /dev/null +++ b/util/bash-completion.d/.gitignore -@@ -0,0 +1 @@ +@@ -0,0 +1,2 @@ ++Makefile +grub diff --git a/0008-IBM-client-architecture-CAS-reboot-support.patch b/0008-IBM-client-architecture-CAS-reboot-support.patch index 0dcaa0a..4c12e5a 100644 --- a/0008-IBM-client-architecture-CAS-reboot-support.patch +++ b/0008-IBM-client-architecture-CAS-reboot-support.patch @@ -25,10 +25,10 @@ parameters 4 files changed, 91 insertions(+) diff --git a/grub-core/kern/ieee1275/openfw.c b/grub-core/kern/ieee1275/openfw.c -index 62929d983bf..2d53c0e8608 100644 +index 4d493ab7661..3a6689abb11 100644 --- a/grub-core/kern/ieee1275/openfw.c +++ b/grub-core/kern/ieee1275/openfw.c -@@ -588,3 +588,66 @@ grub_ieee1275_get_boot_dev (void) +@@ -591,3 +591,66 @@ grub_ieee1275_get_boot_dev (void) return bootpath; } @@ -96,7 +96,7 @@ index 62929d983bf..2d53c0e8608 100644 + return 0; +} diff --git a/grub-core/normal/main.c b/grub-core/normal/main.c -index 78a70a8bf47..249e19bc788 100644 +index 1b03dfd57b9..222e239c1be 100644 --- a/grub-core/normal/main.c +++ b/grub-core/normal/main.c @@ -33,6 +33,9 @@ @@ -133,20 +133,20 @@ index 78a70a8bf47..249e19bc788 100644 grub_errno = GRUB_ERR_NONE; } diff --git a/grub-core/script/execute.c b/grub-core/script/execute.c -index a8502d90711..ab78ca87f90 100644 +index ee299fd0ea6..0d05d6b0709 100644 --- a/grub-core/script/execute.c +++ b/grub-core/script/execute.c -@@ -27,6 +27,9 @@ - #include +@@ -28,6 +28,9 @@ #include #include + #include +#ifdef GRUB_MACHINE_IEEE1275 +#include +#endif /* Max digits for a char is 3 (0xFF is 255), similarly for an int it is sizeof (int) * 3, and one extra for a possible -ve sign. */ -@@ -877,6 +880,10 @@ grub_script_execute_sourcecode (const char *source) +@@ -878,6 +881,10 @@ grub_script_execute_sourcecode (const char *source) grub_err_t ret = 0; struct grub_script *parsed_script; @@ -158,10 +158,10 @@ index a8502d90711..ab78ca87f90 100644 { char *line; diff --git a/include/grub/ieee1275/ieee1275.h b/include/grub/ieee1275/ieee1275.h -index 8868f3a756f..2310f33dbc2 100644 +index 73e2f464475..0a599607f31 100644 --- a/include/grub/ieee1275/ieee1275.h +++ b/include/grub/ieee1275/ieee1275.h -@@ -252,6 +252,8 @@ int EXPORT_FUNC(grub_ieee1275_devalias_next) (struct grub_ieee1275_devalias *ali +@@ -254,6 +254,8 @@ int EXPORT_FUNC(grub_ieee1275_devalias_next) (struct grub_ieee1275_devalias *ali void EXPORT_FUNC(grub_ieee1275_children_peer) (struct grub_ieee1275_devalias *alias); void EXPORT_FUNC(grub_ieee1275_children_first) (const char *devpath, struct grub_ieee1275_devalias *alias); diff --git a/0010-Disable-GRUB-video-support-for-IBM-power-machines.patch b/0010-Disable-GRUB-video-support-for-IBM-power-machines.patch index ab411af..430f600 100644 --- a/0010-Disable-GRUB-video-support-for-IBM-power-machines.patch +++ b/0010-Disable-GRUB-video-support-for-IBM-power-machines.patch @@ -12,7 +12,7 @@ https://bugzilla.redhat.com/show_bug.cgi?id=973205 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/grub-core/kern/ieee1275/cmain.c b/grub-core/kern/ieee1275/cmain.c -index 3e12e6b24e1..3e14f539368 100644 +index 20cbbd761ec..04df9d2c667 100644 --- a/grub-core/kern/ieee1275/cmain.c +++ b/grub-core/kern/ieee1275/cmain.c @@ -90,7 +90,10 @@ grub_ieee1275_find_options (void) @@ -48,14 +48,14 @@ index 17a3dbbb575..b8e4b3feb32 100644 GRUB_MOD_FINI(ieee1275_fb) diff --git a/include/grub/ieee1275/ieee1275.h b/include/grub/ieee1275/ieee1275.h -index 2310f33dbc2..ca08bd96681 100644 +index 0a599607f31..b5a1d49bbc3 100644 --- a/include/grub/ieee1275/ieee1275.h +++ b/include/grub/ieee1275/ieee1275.h -@@ -146,6 +146,8 @@ enum grub_ieee1275_flag - GRUB_IEEE1275_FLAG_BROKEN_REPEAT, - +@@ -148,6 +148,8 @@ enum grub_ieee1275_flag GRUB_IEEE1275_FLAG_CURSORONOFF_ANSI_BROKEN, -+ + + GRUB_IEEE1275_FLAG_RAW_DEVNAMES, ++ + GRUB_IEEE1275_FLAG_DISABLE_VIDEO_SUPPORT }; diff --git a/0011-Honor-a-symlink-when-generating-configuration-by-gru.patch b/0011-Honor-a-symlink-when-generating-configuration-by-gru.patch index 1ea476c..2b953a6 100644 --- a/0011-Honor-a-symlink-when-generating-configuration-by-gru.patch +++ b/0011-Honor-a-symlink-when-generating-configuration-by-gru.patch @@ -11,7 +11,7 @@ the -o option follows it rather than overwriting it with a regular file. 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/util/grub-mkconfig.in b/util/grub-mkconfig.in -index 33332360eec..bc5a3f17541 100644 +index 9f477ff0546..523d4e029bb 100644 --- a/util/grub-mkconfig.in +++ b/util/grub-mkconfig.in @@ -287,7 +287,8 @@ and /etc/grub.d/* files or please file a bug report with diff --git a/0012-Move-bash-completion-script-922997.patch b/0012-Move-bash-completion-script-922997.patch index 6c3c773..e3af586 100644 --- a/0012-Move-bash-completion-script-922997.patch +++ b/0012-Move-bash-completion-script-922997.patch @@ -10,10 +10,10 @@ Apparently these go in a new place now. 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac -index c7888e40f66..783118ccdcd 100644 +index 7656f2434e5..d283af64c8c 100644 --- a/configure.ac +++ b/configure.ac -@@ -289,6 +289,14 @@ AC_SUBST(grubdirname) +@@ -305,6 +305,14 @@ AC_SUBST(grubdirname) AC_DEFINE_UNQUOTED(GRUB_DIR_NAME, "$grubdirname", [Default grub directory name]) @@ -28,7 +28,7 @@ index c7888e40f66..783118ccdcd 100644 # # Checks for build programs. # -@@ -498,6 +506,9 @@ HOST_CFLAGS="$HOST_CFLAGS $grub_cv_cc_w_extra_flags" +@@ -516,6 +524,9 @@ HOST_CFLAGS="$HOST_CFLAGS $grub_cv_cc_w_extra_flags" # Check for target programs. # diff --git a/0014-Allow-fallback-to-include-entries-by-title-not-just-.patch b/0014-Allow-fallback-to-include-entries-by-title-not-just-.patch index bee65ed..ee5d1da 100644 --- a/0014-Allow-fallback-to-include-entries-by-title-not-just-.patch +++ b/0014-Allow-fallback-to-include-entries-by-title-not-just-.patch @@ -12,7 +12,7 @@ Signed-off-by: Peter Jones 1 file changed, 58 insertions(+), 27 deletions(-) diff --git a/grub-core/normal/menu.c b/grub-core/normal/menu.c -index e7a83c2d6e2..d2f64b05e0a 100644 +index d5e0c79a70e..9175ad297d8 100644 --- a/grub-core/normal/menu.c +++ b/grub-core/normal/menu.c @@ -163,16 +163,41 @@ grub_menu_set_timeout (int timeout) diff --git a/0015-Add-GRUB_DISABLE_UUID.patch b/0015-Add-GRUB_DISABLE_UUID.patch index a6856d2..7051dd7 100644 --- a/0015-Add-GRUB_DISABLE_UUID.patch +++ b/0015-Add-GRUB_DISABLE_UUID.patch @@ -15,7 +15,7 @@ Signed-off-by: Peter Jones 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/docs/grub.texi b/docs/grub.texi -index 2adfa97bee8..2fd32608c01 100644 +index 87795075a87..6f524305085 100644 --- a/docs/grub.texi +++ b/docs/grub.texi @@ -1441,6 +1441,13 @@ enable the use of partition UUIDs, set this option to @samp{false}. @@ -33,7 +33,7 @@ index 2adfa97bee8..2fd32608c01 100644 If graphical video support is required, either because the @samp{gfxterm} graphical terminal is in use or because @samp{GRUB_GFXPAYLOAD_LINUX} is set, diff --git a/util/grub-mkconfig.in b/util/grub-mkconfig.in -index bc5a3f17541..b0a8626dd1c 100644 +index 523d4e029bb..9ecbcfb5b43 100644 --- a/util/grub-mkconfig.in +++ b/util/grub-mkconfig.in @@ -133,12 +133,12 @@ fi diff --git a/0016-Make-exit-take-a-return-code.patch b/0016-Make-exit-take-a-return-code.patch index 40c848f..0cd25b2 100644 --- a/0016-Make-exit-take-a-return-code.patch +++ b/0016-Make-exit-take-a-return-code.patch @@ -27,10 +27,10 @@ Signed-off-by: Peter Jones 14 files changed, 48 insertions(+), 21 deletions(-) diff --git a/grub-core/commands/minicmd.c b/grub-core/commands/minicmd.c -index a3a11824172..b25ca4b9f17 100644 +index 6bbce3128cf..6d66b7c453a 100644 --- a/grub-core/commands/minicmd.c +++ b/grub-core/commands/minicmd.c -@@ -176,12 +176,24 @@ grub_mini_cmd_lsmod (struct grub_command *cmd __attribute__ ((unused)), +@@ -179,12 +179,24 @@ grub_mini_cmd_lsmod (struct grub_command *cmd __attribute__ ((unused)), } /* exit */ @@ -60,7 +60,7 @@ index a3a11824172..b25ca4b9f17 100644 } diff --git a/grub-core/kern/efi/efi.c b/grub-core/kern/efi/efi.c -index 708581fcbde..e339f264b3a 100644 +index 6e1ceb90516..370ce03c5d7 100644 --- a/grub-core/kern/efi/efi.c +++ b/grub-core/kern/efi/efi.c @@ -164,11 +164,16 @@ grub_reboot (void) @@ -96,10 +96,10 @@ index 425bb960347..55ea5a11ccd 100644 grub_reboot (); } diff --git a/grub-core/kern/emu/misc.c b/grub-core/kern/emu/misc.c -index 76661337f10..82012a72fcb 100644 +index 65db79baa10..19cd007d448 100644 --- a/grub-core/kern/emu/misc.c +++ b/grub-core/kern/emu/misc.c -@@ -137,9 +137,10 @@ xasprintf (const char *fmt, ...) +@@ -139,9 +139,10 @@ xasprintf (const char *fmt, ...) #if !defined (GRUB_MACHINE_EMU) || defined (GRUB_UTIL) void @@ -139,10 +139,10 @@ index 271b6fbfabd..9fafe98f015 100644 /* We can't use grub_fatal() in this function. This would create an infinite loop, since grub_fatal() calls grub_abort() which in turn calls grub_exit(). */ diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c -index 0d8ebf58b95..f5423ce27d9 100644 +index d483e35eed2..e71d1584164 100644 --- a/grub-core/kern/ieee1275/init.c +++ b/grub-core/kern/ieee1275/init.c -@@ -68,7 +68,7 @@ grub_addr_t grub_ieee1275_original_stack; +@@ -71,7 +71,7 @@ grub_addr_t grub_ieee1275_original_stack; #endif void @@ -240,10 +240,10 @@ index 3e338645c57..be2a5be1d07 100644 else if (ver > API_SIG_VERSION) { diff --git a/grub-core/kern/xen/init.c b/grub-core/kern/xen/init.c -index 0559c033c3d..fce526d417b 100644 +index 782ca72952a..708b060f324 100644 --- a/grub-core/kern/xen/init.c +++ b/grub-core/kern/xen/init.c -@@ -549,7 +549,7 @@ grub_machine_init (void) +@@ -584,7 +584,7 @@ grub_machine_init (void) } void @@ -253,7 +253,7 @@ index 0559c033c3d..fce526d417b 100644 struct sched_shutdown arg; diff --git a/include/grub/misc.h b/include/grub/misc.h -index 372f009e84f..83fd69f4ada 100644 +index ee48eb7a726..f9135b62e35 100644 --- a/include/grub/misc.h +++ b/include/grub/misc.h @@ -334,7 +334,7 @@ int EXPORT_FUNC(grub_vsnprintf) (char *str, grub_size_t n, const char *fmt, diff --git a/0018-Make-efi-machines-load-an-env-block-from-a-variable.patch b/0018-Make-efi-machines-load-an-env-block-from-a-variable.patch index 2748c1c..9665d7b 100644 --- a/0018-Make-efi-machines-load-an-env-block-from-a-variable.patch +++ b/0018-Make-efi-machines-load-an-env-block-from-a-variable.patch @@ -10,10 +10,10 @@ Signed-off-by: Peter Jones 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def -index e92a7ef322f..f8065388213 100644 +index eb1088fd654..41b5e16a3ce 100644 --- a/grub-core/Makefile.core.def +++ b/grub-core/Makefile.core.def -@@ -191,6 +191,7 @@ kernel = { +@@ -203,6 +203,7 @@ kernel = { efi = term/efi/console.c; efi = kern/acpi.c; efi = kern/efi/acpi.c; diff --git a/0019-DHCP-client-ID-and-UUID-options-added.patch b/0019-DHCP-client-ID-and-UUID-options-added.patch index ddc17fe..6167b62 100644 --- a/0019-DHCP-client-ID-and-UUID-options-added.patch +++ b/0019-DHCP-client-ID-and-UUID-options-added.patch @@ -1,31 +1,31 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Paulo Flabiano Smorigo -Date: Tue, 27 Nov 2012 17:18:53 -0200 +Date: Mon, 8 Jul 2019 14:10:58 +0200 Subject: [PATCH] DHCP client ID and UUID options added. --- - grub-core/net/bootp.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++----- + grub-core/net/bootp.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++----- include/grub/net.h | 2 ++ - 2 files changed, 81 insertions(+), 8 deletions(-) + 2 files changed, 79 insertions(+), 8 deletions(-) diff --git a/grub-core/net/bootp.c b/grub-core/net/bootp.c -index 9e2fdb795f5..f03eeab2fb4 100644 +index 04cfbb04504..0e6e41a1699 100644 --- a/grub-core/net/bootp.c +++ b/grub-core/net/bootp.c -@@ -25,6 +25,49 @@ - #include - #include +@@ -95,6 +95,49 @@ enum + /* Max timeout when waiting for BOOTP/DHCP reply */ + #define GRUB_DHCP_MAX_PACKET_TIMEOUT 32 +static char * +grub_env_write_readonly (struct grub_env_var *var __attribute__ ((unused)), -+ const char *val __attribute__ ((unused))) ++ const char *val __attribute__ ((unused))) +{ + return NULL; +} + +static void +set_env_limn_ro (const char *intername, const char *suffix, -+ const char *value, grub_size_t len) ++ const char *value, grub_size_t len) +{ + char *varname, *varvalue; + char *ptr; @@ -59,60 +59,58 @@ index 9e2fdb795f5..f03eeab2fb4 100644 + return val + 'a' - 10; +} + - static void - parse_dhcp_vendor (const char *name, const void *vend, int limit, int *mask) - { -@@ -55,6 +98,9 @@ parse_dhcp_vendor (const char *name, const void *vend, int limit, int *mask) - - taglength = *ptr++; + static const void * + find_dhcp_option (const struct grub_net_bootp_packet *bp, grub_size_t size, + grub_uint8_t opt_code, grub_uint8_t *opt_len) +@@ -152,6 +195,9 @@ again: + if (i + taglength >= size) + return NULL; + grub_dprintf("net", "DHCP option %u (0x%02x) found with length %u.\n", + tagtype, tagtype, taglength); + - switch (tagtype) + /* FIXME RFC 3396 options concatentation */ + if (tagtype == opt_code) { - case GRUB_NET_BOOTP_NETMASK: -@@ -120,6 +166,39 @@ parse_dhcp_vendor (const char *name, const void *vend, int limit, int *mask) - taglength); - break; +@@ -354,6 +400,37 @@ grub_net_configure_by_dhcp_ack (const char *name, + } + grub_net_add_ipv4_local (inter, mask); -+ case GRUB_NET_BOOTP_CLIENT_ID: -+ set_env_limn_ro (name, "clientid", (char *) ptr, taglength); -+ break; ++ opt = find_dhcp_option (bp, size, GRUB_NET_BOOTP_CLIENT_ID, &opt_len); ++ if (opt) ++ { ++ set_env_limn_ro (name, "clientid", (char *) opt, opt_len); ++ } + -+ case GRUB_NET_BOOTP_CLIENT_UUID: ++ opt = find_dhcp_option (bp, size, GRUB_NET_BOOTP_CLIENT_UUID, &opt_len); ++ if (opt && opt_len == 17) ++ { ++ /* The format is 9cfe245e-d0c8-bd45-a79f-54ea5fbd3d97 */ ++ ++ opt += 1; ++ opt_len -= 1; ++ ++ char *val = grub_malloc (2 * opt_len + 4 + 1); ++ int i = 0; ++ int j = 0; ++ for (i = 0; i < opt_len; i++) ++ { ++ val[2 * i + j] = hexdigit (opt[i] >> 4); ++ val[2 * i + 1 + j] = hexdigit (opt[i] & 0xf); ++ ++ if ((i == 3) || (i == 5) || (i == 7) || (i == 9)) + { -+ if (taglength != 17) -+ break; -+ -+ /* The format is 9cfe245e-d0c8-bd45-a79f-54ea5fbd3d97 */ -+ -+ ptr += 1; -+ taglength -= 1; -+ -+ char *val = grub_malloc (2 * taglength + 4 + 1); -+ int i = 0; -+ int j = 0; -+ for (i = 0; i < taglength; i++) -+ { -+ val[2 * i + j] = hexdigit (ptr[i] >> 4); -+ val[2 * i + 1 + j] = hexdigit (ptr[i] & 0xf); -+ -+ if ((i == 3) || (i == 5) || (i == 7) || (i == 9)) -+ { -+ j++; -+ val[2 * i + 1+ j] = '-'; -+ } -+ } -+ -+ set_env_limn_ro (name, "clientuuid", (char *) val, 2 * taglength + 4); ++ j++; ++ val[2 * i + 1+ j] = '-'; + } -+ break; ++ } ++ set_env_limn_ro (name, "clientuuid", (char *) val, 2 * opt_len + 4); ++ } + - /* If you need any other options please contact GRUB - development team. */ - } -@@ -302,14 +381,6 @@ grub_net_process_dhcp (struct grub_net_buff *nb, + /* We do not implement dead gateway detection and the first entry SHOULD + be preferred one */ + opt = find_dhcp_option (bp, size, GRUB_NET_BOOTP_ROUTER, &opt_len); +@@ -631,14 +708,6 @@ grub_net_process_dhcp (struct grub_net_buff *nb, } } @@ -128,15 +126,15 @@ index 9e2fdb795f5..f03eeab2fb4 100644 grub_cmd_dhcpopt (struct grub_command *cmd __attribute__ ((unused)), int argc, char **args) diff --git a/include/grub/net.h b/include/grub/net.h -index 1096b24322e..e266bae23f4 100644 +index 4a9069a1474..556c54e579f 100644 --- a/include/grub/net.h +++ b/include/grub/net.h -@@ -457,6 +457,8 @@ enum +@@ -462,6 +462,8 @@ enum GRUB_NET_BOOTP_DOMAIN = 0x0f, GRUB_NET_BOOTP_ROOT_PATH = 0x11, GRUB_NET_BOOTP_EXTENSIONS_PATH = 0x12, + GRUB_NET_BOOTP_CLIENT_ID = 0x3d, + GRUB_NET_BOOTP_CLIENT_UUID = 0x61, - GRUB_NET_BOOTP_END = 0xff - }; - + GRUB_NET_DHCP_REQUESTED_IP_ADDRESS = 50, + GRUB_NET_DHCP_OVERLOAD = 52, + GRUB_NET_DHCP_MESSAGE_TYPE = 53, diff --git a/0020-Fix-bad-test-on-GRUB_DISABLE_SUBMENU.patch b/0020-Fix-bad-test-on-GRUB_DISABLE_SUBMENU.patch index e219fa5..265e777 100644 --- a/0020-Fix-bad-test-on-GRUB_DISABLE_SUBMENU.patch +++ b/0020-Fix-bad-test-on-GRUB_DISABLE_SUBMENU.patch @@ -20,7 +20,7 @@ Resolves: rhbz#1063414 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in -index 61ebd7dc714..87a7da34982 100644 +index 4532266be68..58defdbd83f 100644 --- a/util/grub.d/10_linux.in +++ b/util/grub.d/10_linux.in @@ -261,7 +261,11 @@ while [ "x$list" != "x" ] ; do diff --git a/0022-Migrate-PPC-from-Yaboot-to-Grub2.patch b/0022-Migrate-PPC-from-Yaboot-to-Grub2.patch index 7008926..3fbb18a 100644 --- a/0022-Migrate-PPC-from-Yaboot-to-Grub2.patch +++ b/0022-Migrate-PPC-from-Yaboot-to-Grub2.patch @@ -12,10 +12,10 @@ maximum screen size so that text is not overwritten. create mode 100644 util/grub.d/20_ppc_terminfo.in diff --git a/Makefile.util.def b/Makefile.util.def -index 3180ac880a9..c7b775bce73 100644 +index 969d32f0097..8717774d510 100644 --- a/Makefile.util.def +++ b/Makefile.util.def -@@ -487,6 +487,13 @@ script = { +@@ -496,6 +496,13 @@ script = { condition = COND_HOST_LINUX; }; diff --git a/0023-Add-fw_path-variable-revised.patch b/0023-Add-fw_path-variable-revised.patch index 3126d2e..36c3b1f 100644 --- a/0023-Add-fw_path-variable-revised.patch +++ b/0023-Add-fw_path-variable-revised.patch @@ -41,7 +41,7 @@ index 9cad0c4485c..8ab7794c47b 100644 } diff --git a/grub-core/normal/main.c b/grub-core/normal/main.c -index 249e19bc788..759c475c4d9 100644 +index 222e239c1be..394bfbea868 100644 --- a/grub-core/normal/main.c +++ b/grub-core/normal/main.c @@ -338,7 +338,30 @@ grub_cmd_normal (struct grub_command *cmd __attribute__ ((unused)), @@ -59,7 +59,7 @@ index 249e19bc788..759c475c4d9 100644 + { + grub_file_t file; + -+ file = grub_file_open (config); ++ file = grub_file_open (config, GRUB_FILE_TYPE_CONFIG); + if (file) + { + grub_file_close (file); diff --git a/0024-Pass-x-hex-hex-straight-through-unmolested.patch b/0024-Pass-x-hex-hex-straight-through-unmolested.patch index 5f4884d..4fd7811 100644 --- a/0024-Pass-x-hex-hex-straight-through-unmolested.patch +++ b/0024-Pass-x-hex-hex-straight-through-unmolested.patch @@ -10,7 +10,7 @@ Subject: [PATCH] Pass "\x[[:hex:]][[:hex:]]" straight through unmolested. 3 files changed, 84 insertions(+), 9 deletions(-) diff --git a/grub-core/commands/wildcard.c b/grub-core/commands/wildcard.c -index 9b4e72766ff..02c46f9fdfa 100644 +index 4a106ca040b..560d437cdc6 100644 --- a/grub-core/commands/wildcard.c +++ b/grub-core/commands/wildcard.c @@ -462,6 +462,12 @@ check_file (const char *dir, const char *basename) @@ -44,7 +44,7 @@ index 9b4e72766ff..02c46f9fdfa 100644 *optr++ = iptr[1]; iptr += 2; diff --git a/grub-core/lib/cmdline.c b/grub-core/lib/cmdline.c -index d5e10ee8798..0a5b2afb94b 100644 +index ed0b149dca5..e0fb0a9e48a 100644 --- a/grub-core/lib/cmdline.c +++ b/grub-core/lib/cmdline.c @@ -20,6 +20,12 @@ @@ -75,7 +75,7 @@ index d5e10ee8798..0a5b2afb94b 100644 size++; else if (*c == ' ') space = 1; -@@ -85,7 +97,25 @@ int grub_create_loader_cmdline (int argc, char *argv[], char *buf, +@@ -86,7 +98,25 @@ grub_create_loader_cmdline (int argc, char *argv[], char *buf, while (*c) { @@ -103,10 +103,10 @@ index d5e10ee8798..0a5b2afb94b 100644 *buf++ = *c; diff --git a/grub-core/script/execute.c b/grub-core/script/execute.c -index ab78ca87f90..cf6cd6601d6 100644 +index 0d05d6b0709..ba38b5e8aef 100644 --- a/grub-core/script/execute.c +++ b/grub-core/script/execute.c -@@ -55,6 +55,12 @@ static struct grub_script_scope *scope = 0; +@@ -56,6 +56,12 @@ static struct grub_script_scope *scope = 0; /* Wildcard translator for GRUB script. */ struct grub_script_wildcard_translator *grub_wildcard_translator; @@ -119,7 +119,7 @@ index ab78ca87f90..cf6cd6601d6 100644 static char* wildcard_escape (const char *s) { -@@ -71,7 +77,15 @@ wildcard_escape (const char *s) +@@ -72,7 +78,15 @@ wildcard_escape (const char *s) i = 0; while ((ch = *s++)) { @@ -136,7 +136,7 @@ index ab78ca87f90..cf6cd6601d6 100644 p[i++] = '\\'; p[i++] = ch; } -@@ -95,7 +109,14 @@ wildcard_unescape (const char *s) +@@ -96,7 +110,14 @@ wildcard_unescape (const char *s) i = 0; while ((ch = *s++)) { @@ -152,7 +152,7 @@ index ab78ca87f90..cf6cd6601d6 100644 p[i++] = *s++; else p[i++] = ch; -@@ -397,10 +418,20 @@ parse_string (const char *str, +@@ -398,10 +419,20 @@ parse_string (const char *str, switch (*ptr) { case '\\': diff --git a/0026-Search-for-specific-config-file-for-netboot.patch b/0026-Search-for-specific-config-file-for-netboot.patch index 7436e03..f94911c 100644 --- a/0026-Search-for-specific-config-file-for-netboot.patch +++ b/0026-Search-for-specific-config-file-for-netboot.patch @@ -22,7 +22,7 @@ https://bugzilla.redhat.com/show_bug.cgi?id=873406 3 files changed, 135 insertions(+), 4 deletions(-) diff --git a/grub-core/net/net.c b/grub-core/net/net.c -index 10773fc3435..0769bf850d3 100644 +index d5d726a315e..06454564b8f 100644 --- a/grub-core/net/net.c +++ b/grub-core/net/net.c @@ -1735,6 +1735,124 @@ grub_net_restore_hw (void) @@ -43,7 +43,7 @@ index 10773fc3435..0769bf850d3 100644 + grub_dprintf ("net", "probe %s\n", config); + + grub_file_t file; -+ file = grub_file_open (config); ++ file = grub_file_open (config, GRUB_FILE_TYPE_CONFIG); + + if (file) + { @@ -151,7 +151,7 @@ index 10773fc3435..0769bf850d3 100644 static grub_command_t cmd_addaddr, cmd_deladdr, cmd_addroute, cmd_delroute; diff --git a/grub-core/normal/main.c b/grub-core/normal/main.c -index 759c475c4d9..b2654ef62e8 100644 +index 394bfbea868..9ef98481f70 100644 --- a/grub-core/normal/main.c +++ b/grub-core/normal/main.c @@ -33,6 +33,7 @@ @@ -187,10 +187,10 @@ index 759c475c4d9..b2654ef62e8 100644 grub_enter_normal_mode (config); grub_free (config); diff --git a/include/grub/net.h b/include/grub/net.h -index e266bae23f4..50d62ab0c8c 100644 +index 556c54e579f..ff6d347f7da 100644 --- a/include/grub/net.h +++ b/include/grub/net.h -@@ -566,4 +566,7 @@ extern char *grub_net_default_server; +@@ -578,4 +578,7 @@ extern char *grub_net_default_server; #define VLANTAG_IDENTIFIER 0x8100 diff --git a/0027-blscfg-add-blscfg-module-to-parse-Boot-Loader-Specif.patch b/0027-blscfg-add-blscfg-module-to-parse-Boot-Loader-Specif.patch index 107f16e..ada4564 100644 --- a/0027-blscfg-add-blscfg-module-to-parse-Boot-Loader-Specif.patch +++ b/0027-blscfg-add-blscfg-module-to-parse-Boot-Loader-Specif.patch @@ -28,10 +28,10 @@ Signed-off-by: Will Thompson create mode 100644 grub-core/commands/loadenv.h diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def -index f8065388213..8bd220a41ba 100644 +index 41b5e16a3ce..57e253ab1a1 100644 --- a/grub-core/Makefile.core.def +++ b/grub-core/Makefile.core.def -@@ -768,6 +768,16 @@ module = { +@@ -811,6 +811,16 @@ module = { common = commands/blocklist.c; }; @@ -48,7 +48,7 @@ index f8065388213..8bd220a41ba 100644 module = { name = boot; common = commands/boot.c; -@@ -929,6 +939,7 @@ module = { +@@ -988,6 +998,7 @@ module = { module = { name = loadenv; common = commands/loadenv.c; @@ -58,7 +58,7 @@ index f8065388213..8bd220a41ba 100644 diff --git a/grub-core/commands/blscfg.c b/grub-core/commands/blscfg.c new file mode 100644 -index 00000000000..26dbe873fe4 +index 00000000000..54458b14518 --- /dev/null +++ b/grub-core/commands/blscfg.c @@ -0,0 +1,1096 @@ @@ -500,7 +500,7 @@ index 00000000000..26dbe873fe4 + + p = grub_xasprintf ("(%s)%s/%s", info->devid, info->dirname, filename); + -+ f = grub_file_open (p); ++ f = grub_file_open (p, GRUB_FILE_TYPE_CONFIG); + if (!f) + goto finish; + } @@ -886,7 +886,7 @@ index 00000000000..26dbe873fe4 + } + + src = grub_xasprintf ("load_video\n" -+ "set gfx_payload=keep\n" ++ "set gfxpayload=keep\n" + "insmod gzio\n" + "linux %s%s%s%s\n" + "%s", @@ -943,8 +943,8 @@ index 00000000000..26dbe873fe4 + read_entry_info.devid = info->devid; + +read_fallback: -+ r = blsdir_fs->dir (blsdir_dev, read_entry_info.dirname, read_entry, -+ &read_entry_info); ++ r = blsdir_fs->fs_dir (blsdir_dev, read_entry_info.dirname, read_entry, ++ &read_entry_info); + if (r != 0) { + grub_dprintf ("blscfg", "read_entry returned error\n"); + grub_err_t e; @@ -987,7 +987,7 @@ index 00000000000..26dbe873fe4 + if (path) { + len = grub_strlen (path); + if (grub_strcmp (path + len - 5, ".conf") == 0) { -+ rei.file = grub_file_open (path); ++ rei.file = grub_file_open (path, GRUB_FILE_TYPE_CONFIG); + if (!rei.file) + return grub_errno; + /* @@ -1159,7 +1159,7 @@ index 00000000000..26dbe873fe4 + grub_unregister_extcmd (oldcmd); +} diff --git a/grub-core/commands/legacycfg.c b/grub-core/commands/legacycfg.c -index b32f3c74cb1..ef8dd74c589 100644 +index db7a8f00273..891eac5a33f 100644 --- a/grub-core/commands/legacycfg.c +++ b/grub-core/commands/legacycfg.c @@ -133,7 +133,7 @@ legacy_file (const char *filename) @@ -1182,7 +1182,7 @@ index b32f3c74cb1..ef8dd74c589 100644 } diff --git a/grub-core/commands/loadenv.c b/grub-core/commands/loadenv.c -index acd93d123ed..91c99456091 100644 +index 3fd664aac33..163b9a09042 100644 --- a/grub-core/commands/loadenv.c +++ b/grub-core/commands/loadenv.c @@ -28,6 +28,8 @@ @@ -1194,7 +1194,7 @@ index acd93d123ed..91c99456091 100644 GRUB_MOD_LICENSE ("GPLv3+"); static const struct grub_arg_option options[] = -@@ -84,81 +86,6 @@ open_envblk_file (char *filename, int untrusted) +@@ -79,81 +81,6 @@ open_envblk_file (char *filename, return file; } @@ -1349,7 +1349,7 @@ index 2c5363da7f5..9faf2be0f64 100644 src[len - 1] = ch; args[argc - 1] = src; diff --git a/grub-core/normal/main.c b/grub-core/normal/main.c -index b2654ef62e8..5116aac6614 100644 +index 9ef98481f70..a326b192c89 100644 --- a/grub-core/normal/main.c +++ b/grub-core/normal/main.c @@ -20,6 +20,7 @@ diff --git a/0028-Add-devicetree-loading.patch b/0028-Add-devicetree-loading.patch index 4cb1a2a..2558faa 100644 --- a/0028-Add-devicetree-loading.patch +++ b/0028-Add-devicetree-loading.patch @@ -20,7 +20,7 @@ Signed-off-by: David A. Marlin 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/util/grub-mkconfig.in b/util/grub-mkconfig.in -index b0a8626dd1c..f68d4925ee6 100644 +index 9ecbcfb5b43..c645351dd2a 100644 --- a/util/grub-mkconfig.in +++ b/util/grub-mkconfig.in @@ -254,7 +254,8 @@ export GRUB_DEFAULT \ @@ -34,7 +34,7 @@ index b0a8626dd1c..f68d4925ee6 100644 if test "x${grub_cfg}" != "x"; then rm -f "${grub_cfg}.new" diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in -index 87a7da34982..233754ff296 100644 +index 58defdbd83f..dd3128440c4 100644 --- a/util/grub.d/10_linux.in +++ b/util/grub.d/10_linux.in @@ -153,6 +153,13 @@ EOF diff --git a/0029-Don-t-write-messages-to-the-screen.patch b/0029-Don-t-write-messages-to-the-screen.patch index e96a234..5677434 100644 --- a/0029-Don-t-write-messages-to-the-screen.patch +++ b/0029-Don-t-write-messages-to-the-screen.patch @@ -15,7 +15,7 @@ very appealing. 5 files changed, 5 insertions(+), 40 deletions(-) diff --git a/grub-core/gettext/gettext.c b/grub-core/gettext/gettext.c -index 4880cefe3f8..b22e1bcc94b 100644 +index 4d02e62c109..84d520cd494 100644 --- a/grub-core/gettext/gettext.c +++ b/grub-core/gettext/gettext.c @@ -434,16 +434,12 @@ static char * @@ -143,7 +143,7 @@ index c1addc0df29..68d31de0c4c 100644 movw $LOCAL(firstlist), %di diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in -index 233754ff296..3a5aa0f8dc9 100644 +index dd3128440c4..ceb413fc2e3 100644 --- a/util/grub.d/10_linux.in +++ b/util/grub.d/10_linux.in @@ -138,27 +138,20 @@ linux_entry () diff --git a/0030-Don-t-print-GNU-GRUB-header.patch b/0030-Don-t-print-GNU-GRUB-header.patch index 505c6f7..ce45d4b 100644 --- a/0030-Don-t-print-GNU-GRUB-header.patch +++ b/0030-Don-t-print-GNU-GRUB-header.patch @@ -9,7 +9,7 @@ No one cares. 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/grub-core/normal/main.c b/grub-core/normal/main.c -index 5116aac6614..31b624a23cf 100644 +index a326b192c89..09d0dfe76f1 100644 --- a/grub-core/normal/main.c +++ b/grub-core/normal/main.c @@ -208,15 +208,16 @@ read_config_file (const char *config) diff --git a/0034-Use-the-correct-indentation-for-the-term-help-text.patch b/0034-Use-the-correct-indentation-for-the-term-help-text.patch index b20f0e9..5a1f0b5 100644 --- a/0034-Use-the-correct-indentation-for-the-term-help-text.patch +++ b/0034-Use-the-correct-indentation-for-the-term-help-text.patch @@ -9,7 +9,7 @@ That is consistent with the menu help text 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/grub-core/normal/main.c b/grub-core/normal/main.c -index 31b624a23cf..7f295e3946b 100644 +index 09d0dfe76f1..7f61c5b618b 100644 --- a/grub-core/normal/main.c +++ b/grub-core/normal/main.c @@ -432,8 +432,8 @@ grub_normal_reader_init (int nested) diff --git a/0040-Don-t-say-GNU-Linux-in-generated-menus.patch b/0040-Don-t-say-GNU-Linux-in-generated-menus.patch index 85b0cde..ced2560 100644 --- a/0040-Don-t-say-GNU-Linux-in-generated-menus.patch +++ b/0040-Don-t-say-GNU-Linux-in-generated-menus.patch @@ -9,7 +9,7 @@ Subject: [PATCH] Don't say "GNU/Linux" in generated menus. 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in -index 3a5aa0f8dc9..6299836b5cd 100644 +index ceb413fc2e3..2b402d85a52 100644 --- a/util/grub.d/10_linux.in +++ b/util/grub.d/10_linux.in @@ -29,9 +29,9 @@ export TEXTDOMAINDIR="@localedir@" @@ -25,7 +25,7 @@ index 3a5aa0f8dc9..6299836b5cd 100644 fi diff --git a/util/grub.d/20_linux_xen.in b/util/grub.d/20_linux_xen.in -index e8143b079dc..972a4b5a03d 100644 +index 96179ea613c..47e0d3f5cd6 100644 --- a/util/grub.d/20_linux_xen.in +++ b/util/grub.d/20_linux_xen.in @@ -29,9 +29,9 @@ export TEXTDOMAINDIR="@localedir@" diff --git a/0043-Add-.eh_frame-to-list-of-relocations-stripped.patch b/0043-Add-.eh_frame-to-list-of-relocations-stripped.patch index d837061..4ab92e5 100644 --- a/0043-Add-.eh_frame-to-list-of-relocations-stripped.patch +++ b/0043-Add-.eh_frame-to-list-of-relocations-stripped.patch @@ -8,7 +8,7 @@ Subject: [PATCH] Add .eh_frame to list of relocations stripped 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/Makefile.common b/conf/Makefile.common -index 311da61c6c5..044ab3abe88 100644 +index 6cd71cbb2ab..4ba729e14d8 100644 --- a/conf/Makefile.common +++ b/conf/Makefile.common @@ -38,7 +38,7 @@ CFLAGS_KERNEL = $(CFLAGS_PLATFORM) -ffreestanding diff --git a/0044-Don-t-munge-raw-spaces-when-we-re-doing-our-cmdline-.patch b/0044-Don-t-munge-raw-spaces-when-we-re-doing-our-cmdline-.patch index 33bdad2..b8dbff5 100644 --- a/0044-Don-t-munge-raw-spaces-when-we-re-doing-our-cmdline-.patch +++ b/0044-Don-t-munge-raw-spaces-when-we-re-doing-our-cmdline-.patch @@ -10,10 +10,10 @@ Signed-off-by: Peter Jones 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/grub-core/lib/cmdline.c b/grub-core/lib/cmdline.c -index 0a5b2afb94b..970ea868c14 100644 +index e0fb0a9e48a..8e2294d8ff6 100644 --- a/grub-core/lib/cmdline.c +++ b/grub-core/lib/cmdline.c -@@ -97,16 +97,7 @@ int grub_create_loader_cmdline (int argc, char *argv[], char *buf, +@@ -98,16 +98,7 @@ grub_create_loader_cmdline (int argc, char *argv[], char *buf, while (*c) { diff --git a/0045-Don-t-require-a-password-to-boot-entries-generated-b.patch b/0045-Don-t-require-a-password-to-boot-entries-generated-b.patch index b0b2b0e..c737029 100644 --- a/0045-Don-t-require-a-password-to-boot-entries-generated-b.patch +++ b/0045-Don-t-require-a-password-to-boot-entries-generated-b.patch @@ -14,7 +14,7 @@ Signed-off-by: Peter Jones 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in -index 6299836b5cd..b744438e04a 100644 +index 2b402d85a52..d35b0f406bc 100644 --- a/util/grub.d/10_linux.in +++ b/util/grub.d/10_linux.in @@ -26,7 +26,7 @@ datarootdir="@datarootdir@" diff --git a/0046-Don-t-emit-Booting-.-message.patch b/0046-Don-t-emit-Booting-.-message.patch index 725ae09..63d1812 100644 --- a/0046-Don-t-emit-Booting-.-message.patch +++ b/0046-Don-t-emit-Booting-.-message.patch @@ -14,10 +14,10 @@ Signed-off-by: Peter Jones 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/grub-core/normal/menu.c b/grub-core/normal/menu.c -index d2f64b05e0a..5e2f5283d3d 100644 +index 9175ad297d8..783bde55b9e 100644 --- a/grub-core/normal/menu.c +++ b/grub-core/normal/menu.c -@@ -838,12 +838,14 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot) +@@ -839,12 +839,14 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot) /* Callback invoked immediately before a menu entry is executed. */ static void diff --git a/0047-Replace-a-lot-of-man-pages-with-slightly-nicer-ones.patch b/0047-Replace-a-lot-of-man-pages-with-slightly-nicer-ones.patch index d6169aa..11d8a62 100644 --- a/0047-Replace-a-lot-of-man-pages-with-slightly-nicer-ones.patch +++ b/0047-Replace-a-lot-of-man-pages-with-slightly-nicer-ones.patch @@ -122,10 +122,10 @@ Replace a bunch of machine generated ones with ones that look nicer. create mode 100644 util/grub-sparc64-setup.8 diff --git a/configure.ac b/configure.ac -index 783118ccdcd..d5db2803ec4 100644 +index d283af64c8c..8df400e0a8b 100644 --- a/configure.ac +++ b/configure.ac -@@ -70,6 +70,29 @@ grub_TRANSFORM([grub-set-default]) +@@ -74,6 +74,29 @@ grub_TRANSFORM([grub-set-default]) grub_TRANSFORM([grub-sparc64-setup]) grub_TRANSFORM([grub-render-label]) grub_TRANSFORM([grub-file]) @@ -156,7 +156,7 @@ index 783118ccdcd..d5db2803ec4 100644 # Optimization flag. Allow user to override. if test "x$TARGET_CFLAGS" = x; then diff --git a/conf/Makefile.extra-dist b/conf/Makefile.extra-dist -index b16bd925320..39eb94bded6 100644 +index 46c4e95e2fa..58d7d9540be 100644 --- a/conf/Makefile.extra-dist +++ b/conf/Makefile.extra-dist @@ -11,7 +11,6 @@ EXTRA_DIST += unicode @@ -498,10 +498,10 @@ index ad25c8ab753..00000000000 -[SEE ALSO] -.BR grub-menulst2cfg (8) diff --git a/gentpl.py b/gentpl.py -index da67965a41a..bf8439fa743 100644 +index 387588c0589..f05812eace3 100644 --- a/gentpl.py +++ b/gentpl.py -@@ -802,10 +802,7 @@ def manpage(defn, adddeps): +@@ -805,10 +805,7 @@ def manpage(defn, adddeps): output("if COND_MAN_PAGES\n") gvar_add("man_MANS", name + "." + mansection) diff --git a/0048-use-fw_path-prefix-when-fallback-searching-for-grub-.patch b/0048-use-fw_path-prefix-when-fallback-searching-for-grub-.patch index bac4eee..65b8855 100644 --- a/0048-use-fw_path-prefix-when-fallback-searching-for-grub-.patch +++ b/0048-use-fw_path-prefix-when-fallback-searching-for-grub-.patch @@ -17,7 +17,7 @@ Signed-off-by: Mark Salter 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/grub-core/normal/main.c b/grub-core/normal/main.c -index 7f295e3946b..231f3f86371 100644 +index 7f61c5b618b..8add30e605f 100644 --- a/grub-core/normal/main.c +++ b/grub-core/normal/main.c @@ -349,7 +349,7 @@ grub_cmd_normal (struct grub_command *cmd __attribute__ ((unused)), diff --git a/0049-Try-mac-guid-etc-before-grub.cfg-on-tftp-config-file.patch b/0049-Try-mac-guid-etc-before-grub.cfg-on-tftp-config-file.patch index 2e8dffd..45a0982 100644 --- a/0049-Try-mac-guid-etc-before-grub.cfg-on-tftp-config-file.patch +++ b/0049-Try-mac-guid-etc-before-grub.cfg-on-tftp-config-file.patch @@ -1,15 +1,15 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Peter Jones -Date: Thu, 6 Mar 2014 11:51:33 -0500 +Date: Mon, 8 Jul 2019 17:33:22 +0200 Subject: [PATCH] Try mac/guid/etc before grub.cfg on tftp config files. Signed-off-by: Peter Jones --- - grub-core/normal/main.c | 80 ++++++++++++++++++++++++++----------------------- - 1 file changed, 43 insertions(+), 37 deletions(-) + grub-core/normal/main.c | 84 ++++++++++++++++++++++++++----------------------- + 1 file changed, 45 insertions(+), 39 deletions(-) diff --git a/grub-core/normal/main.c b/grub-core/normal/main.c -index 231f3f86371..cf5c0b273ce 100644 +index 8add30e605f..d93bee613ac 100644 --- a/grub-core/normal/main.c +++ b/grub-core/normal/main.c @@ -347,53 +347,59 @@ grub_cmd_normal (struct grub_command *cmd __attribute__ ((unused)), @@ -26,7 +26,7 @@ index 231f3f86371..cf5c0b273ce 100644 - { - grub_file_t file; - -- file = grub_file_open (config); +- file = grub_file_open (config, GRUB_FILE_TYPE_CONFIG); - if (file) - { - grub_file_close (file); @@ -47,65 +47,67 @@ index 231f3f86371..cf5c0b273ce 100644 prefix = grub_env_get ("prefix"); + if (prefix) -- { + { - grub_size_t config_len; - config_len = grub_strlen (prefix) + - sizeof ("/grub.cfg-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"); - config = grub_malloc (config_len); -+ { -+ if (grub_strncmp (prefix + 1, "tftp", sizeof ("tftp") - 1) == 0) -+ { -+ grub_size_t config_len; -+ config_len = grub_strlen (prefix) + -+ sizeof ("/grub.cfg-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"); -+ config = grub_malloc (config_len); - +- - if (! config) - goto quit; -+ if (! config) -+ goto quit; - +- - grub_snprintf (config, config_len, "%s/grub.cfg", prefix); -+ grub_snprintf (config, config_len, "%s/grub.cfg", prefix); - -- if (grub_strncmp (prefix + 1, "tftp", sizeof ("tftp") - 1) == 0) +- + if (grub_strncmp (prefix + 1, "tftp", sizeof ("tftp") - 1) == 0) - grub_net_search_configfile (config); -+ grub_net_search_configfile (config); ++ { ++ grub_size_t config_len; ++ config_len = grub_strlen (prefix) + ++ sizeof ("/grub.cfg-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"); ++ config = grub_malloc (config_len); - grub_enter_normal_mode (config); - grub_free (config); -+ grub_enter_normal_mode (config); -+ grub_free (config); -+ config = NULL; -+ } +- } ++ if (! config) ++ goto quit; + -+ if (!config) -+ { -+ config = grub_xasprintf ("%s/grub.cfg", prefix); -+ if (config) -+ { -+ grub_file_t file; ++ grub_snprintf (config, config_len, "%s/grub.cfg", prefix); + -+ file = grub_file_open (config); -+ if (file) -+ { -+ grub_file_close (file); -+ grub_enter_normal_mode (config); -+ } -+ else -+ { -+ /* Ignore all errors. */ -+ grub_errno = 0; -+ } -+ grub_free (config); -+ } -+ } - } ++ grub_net_search_configfile (config); ++ ++ grub_enter_normal_mode (config); ++ grub_free (config); ++ config = NULL; ++ } ++ ++ if (!config) ++ { ++ config = grub_xasprintf ("%s/grub.cfg", prefix); ++ if (config) ++ { ++ grub_file_t file; ++ ++ file = grub_file_open (config, GRUB_FILE_TYPE_CONFIG); ++ if (file) ++ { ++ grub_file_close (file); ++ grub_enter_normal_mode (config); ++ } ++ else ++ { ++ /* Ignore all errors. */ ++ grub_errno = 0; ++ } ++ grub_free (config); ++ } ++ } ++ } else - grub_enter_normal_mode (0); -+ { -+ grub_enter_normal_mode (0); -+ } ++ { ++ grub_enter_normal_mode (0); ++ } } else grub_enter_normal_mode (argv[0]); diff --git a/0051-Add-grub_util_readlink.patch b/0051-Add-grub_util_readlink.patch index 6ea7df1..060a837 100644 --- a/0051-Add-grub_util_readlink.patch +++ b/0051-Add-grub_util_readlink.patch @@ -1,6 +1,6 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Peter Jones -Date: Wed, 3 Sep 2014 10:01:03 -0400 +Date: Mon, 8 Jul 2019 21:46:52 +0200 Subject: [PATCH] Add grub_util_readlink() Add grub_util_readlink(). This requires pulling in stat and readlink from @@ -10,437 +10,17 @@ implementation is straightforward. Signed-off-by: Peter Jones Reviewed-by: Adam Jackson --- - grub-core/gnulib/gettimeofday.c | 154 +++++++ - grub-core/gnulib/readlink.c | 74 ++++ - grub-core/gnulib/stat.c | 138 +++++++ - grub-core/osdep/windows/hostdisk.c | 6 + - grub-core/gnulib/pathmax.h | 83 ++++ - grub-core/gnulib/sys_stat.in.h | 732 ++++++++++++++++++++++++++++++++++ - grub-core/gnulib/sys_time.in.h | 213 ++++++++++ - grub-core/gnulib/sys_types.in.h | 2 + - grub-core/gnulib/time.h | 586 +++++++++++++++++++++++++++ - grub-core/gnulib/time.in.h | 274 +++++++++++++ - include/grub/osdep/hostfile_aros.h | 6 + - include/grub/osdep/hostfile_unix.h | 6 + - include/grub/osdep/hostfile_windows.h | 2 + - grub-core/gnulib/Makefile.am | 177 +++++++- - m4/gettimeofday.m4 | 138 +++++++ - m4/gnulib-cache.m4 | 3 +- - m4/gnulib-comp.m4 | 49 +++ - m4/largefile.m4 | 146 +++++++ - m4/pathmax.m4 | 42 ++ - m4/readlink.m4 | 71 ++++ - m4/stat.m4 | 71 ++++ - m4/sys_stat_h.m4 | 96 +++++ - m4/sys_time_h.m4 | 110 +++++ - m4/time_h.m4 | 118 ++++++ - 24 files changed, 3295 insertions(+), 2 deletions(-) - create mode 100644 grub-core/gnulib/gettimeofday.c - create mode 100644 grub-core/gnulib/readlink.c - create mode 100644 grub-core/gnulib/stat.c - create mode 100644 grub-core/gnulib/pathmax.h - create mode 100644 grub-core/gnulib/sys_stat.in.h - create mode 100644 grub-core/gnulib/sys_time.in.h - create mode 100644 grub-core/gnulib/time.h - create mode 100644 grub-core/gnulib/time.in.h - create mode 100644 m4/gettimeofday.m4 - create mode 100644 m4/largefile.m4 - create mode 100644 m4/pathmax.m4 - create mode 100644 m4/readlink.m4 - create mode 100644 m4/stat.m4 - create mode 100644 m4/sys_stat_h.m4 - create mode 100644 m4/sys_time_h.m4 - create mode 100644 m4/time_h.m4 + grub-core/osdep/windows/hostdisk.c | 6 ++++++ + include/grub/osdep/hostfile_aros.h | 6 ++++++ + include/grub/osdep/hostfile_unix.h | 6 ++++++ + include/grub/osdep/hostfile_windows.h | 2 ++ + 4 files changed, 20 insertions(+) -diff --git a/grub-core/gnulib/gettimeofday.c b/grub-core/gnulib/gettimeofday.c -new file mode 100644 -index 00000000000..8b2058e8c87 ---- /dev/null -+++ b/grub-core/gnulib/gettimeofday.c -@@ -0,0 +1,154 @@ -+/* Provide gettimeofday for systems that don't have it or for which it's broken. -+ -+ Copyright (C) 2001-2003, 2005-2007, 2009-2014 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3, or (at your option) -+ any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, see . */ -+ -+/* written by Jim Meyering */ -+ -+#include -+ -+/* Specification. */ -+#include -+ -+#include -+ -+#if HAVE_SYS_TIMEB_H -+# include -+#endif -+ -+#if GETTIMEOFDAY_CLOBBERS_LOCALTIME || TZSET_CLOBBERS_LOCALTIME -+ -+/* Work around the bug in some systems whereby gettimeofday clobbers -+ the static buffer that localtime uses for its return value. The -+ gettimeofday function from Mac OS X 10.0.4 (i.e., Darwin 1.3.7) has -+ this problem. The tzset replacement is necessary for at least -+ Solaris 2.5, 2.5.1, and 2.6. */ -+ -+static struct tm tm_zero_buffer; -+static struct tm *localtime_buffer_addr = &tm_zero_buffer; -+ -+# undef localtime -+extern struct tm *localtime (time_t const *); -+ -+# undef gmtime -+extern struct tm *gmtime (time_t const *); -+ -+/* This is a wrapper for localtime. It is used only on systems for which -+ gettimeofday clobbers the static buffer used for localtime's result. -+ -+ On the first call, record the address of the static buffer that -+ localtime uses for its result. */ -+ -+struct tm * -+rpl_localtime (time_t const *timep) -+{ -+ struct tm *tm = localtime (timep); -+ -+ if (localtime_buffer_addr == &tm_zero_buffer) -+ localtime_buffer_addr = tm; -+ -+ return tm; -+} -+ -+/* Same as above, since gmtime and localtime use the same buffer. */ -+struct tm * -+rpl_gmtime (time_t const *timep) -+{ -+ struct tm *tm = gmtime (timep); -+ -+ if (localtime_buffer_addr == &tm_zero_buffer) -+ localtime_buffer_addr = tm; -+ -+ return tm; -+} -+ -+#endif /* GETTIMEOFDAY_CLOBBERS_LOCALTIME || TZSET_CLOBBERS_LOCALTIME */ -+ -+#if TZSET_CLOBBERS_LOCALTIME -+ -+# undef tzset -+extern void tzset (void); -+ -+/* This is a wrapper for tzset, for systems on which tzset may clobber -+ the static buffer used for localtime's result. */ -+void -+rpl_tzset (void) -+{ -+ /* Save and restore the contents of the buffer used for localtime's -+ result around the call to tzset. */ -+ struct tm save = *localtime_buffer_addr; -+ tzset (); -+ *localtime_buffer_addr = save; -+} -+#endif -+ -+/* This is a wrapper for gettimeofday. It is used only on systems -+ that lack this function, or whose implementation of this function -+ causes problems. */ -+ -+int -+gettimeofday (struct timeval *restrict tv, void *restrict tz) -+{ -+#undef gettimeofday -+#if HAVE_GETTIMEOFDAY -+# if GETTIMEOFDAY_CLOBBERS_LOCALTIME -+ /* Save and restore the contents of the buffer used for localtime's -+ result around the call to gettimeofday. */ -+ struct tm save = *localtime_buffer_addr; -+# endif -+ -+# if defined timeval /* 'struct timeval' overridden by gnulib? */ -+# undef timeval -+ struct timeval otv; -+ int result = gettimeofday (&otv, (struct timezone *) tz); -+ if (result == 0) -+ { -+ tv->tv_sec = otv.tv_sec; -+ tv->tv_usec = otv.tv_usec; -+ } -+# else -+ int result = gettimeofday (tv, (struct timezone *) tz); -+# endif -+ -+# if GETTIMEOFDAY_CLOBBERS_LOCALTIME -+ *localtime_buffer_addr = save; -+# endif -+ -+ return result; -+ -+#else -+ -+# if HAVE__FTIME -+ -+ struct _timeb timebuf; -+ _ftime (&timebuf); -+ tv->tv_sec = timebuf.time; -+ tv->tv_usec = timebuf.millitm * 1000; -+ -+# else -+ -+# if !defined OK_TO_USE_1S_CLOCK -+# error "Only 1-second nominal clock resolution found. Is that intended?" \ -+ "If so, compile with the -DOK_TO_USE_1S_CLOCK option." -+# endif -+ tv->tv_sec = time (NULL); -+ tv->tv_usec = 0; -+ -+# endif -+ -+ return 0; -+ -+#endif -+} -diff --git a/grub-core/gnulib/readlink.c b/grub-core/gnulib/readlink.c -new file mode 100644 -index 00000000000..4c496395176 ---- /dev/null -+++ b/grub-core/gnulib/readlink.c -@@ -0,0 +1,74 @@ -+/* Stub for readlink(). -+ Copyright (C) 2003-2007, 2009-2014 Free Software Foundation, Inc. -+ -+ This program is free software: you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+#include -+ -+/* Specification. */ -+#include -+ -+#include -+#include -+#include -+ -+#if !HAVE_READLINK -+ -+/* readlink() substitute for systems that don't have a readlink() function, -+ such as DJGPP 2.03 and mingw32. */ -+ -+ssize_t -+readlink (const char *name, char *buf _GL_UNUSED, -+ size_t bufsize _GL_UNUSED) -+{ -+ struct stat statbuf; -+ -+ /* In general we should use lstat() here, not stat(). But on platforms -+ without symbolic links, lstat() - if it exists - would be equivalent to -+ stat(), therefore we can use stat(). This saves us a configure check. */ -+ if (stat (name, &statbuf) >= 0) -+ errno = EINVAL; -+ return -1; -+} -+ -+#else /* HAVE_READLINK */ -+ -+# undef readlink -+ -+/* readlink() wrapper that uses correct types, for systems like cygwin -+ 1.5.x where readlink returns int, and which rejects trailing slash, -+ for Solaris 9. */ -+ -+ssize_t -+rpl_readlink (const char *name, char *buf, size_t bufsize) -+{ -+# if READLINK_TRAILING_SLASH_BUG -+ size_t len = strlen (name); -+ if (len && name[len - 1] == '/') -+ { -+ /* Even if name without the slash is a symlink to a directory, -+ both lstat() and stat() must resolve the trailing slash to -+ the directory rather than the symlink. We can therefore -+ safely use stat() to distinguish between EINVAL and -+ ENOTDIR/ENOENT, avoiding extra overhead of rpl_lstat(). */ -+ struct stat st; -+ if (stat (name, &st) == 0) -+ errno = EINVAL; -+ return -1; -+ } -+# endif /* READLINK_TRAILING_SLASH_BUG */ -+ return readlink (name, buf, bufsize); -+} -+ -+#endif /* HAVE_READLINK */ -diff --git a/grub-core/gnulib/stat.c b/grub-core/gnulib/stat.c -new file mode 100644 -index 00000000000..35f4b0b1a51 ---- /dev/null -+++ b/grub-core/gnulib/stat.c -@@ -0,0 +1,138 @@ -+/* Work around platform bugs in stat. -+ Copyright (C) 2009-2014 Free Software Foundation, Inc. -+ -+ This program is free software: you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+/* written by Eric Blake */ -+ -+/* If the user's config.h happens to include , let it include only -+ the system's here, so that orig_stat doesn't recurse to -+ rpl_stat. */ -+#define __need_system_sys_stat_h -+#include -+ -+/* Get the original definition of stat. It might be defined as a macro. */ -+#include -+#include -+#undef __need_system_sys_stat_h -+ -+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ -+# if _GL_WINDOWS_64_BIT_ST_SIZE -+# undef stat /* avoid warning on mingw64 with _FILE_OFFSET_BITS=64 */ -+# define stat _stati64 -+# define REPLACE_FUNC_STAT_DIR 1 -+# undef REPLACE_FUNC_STAT_FILE -+# elif REPLACE_FUNC_STAT_FILE -+/* mingw64 has a broken stat() function, based on _stat(), in libmingwex.a. -+ Bypass it. */ -+# define stat _stat -+# define REPLACE_FUNC_STAT_DIR 1 -+# undef REPLACE_FUNC_STAT_FILE -+# endif -+#endif -+ -+static int -+orig_stat (const char *filename, struct stat *buf) -+{ -+ return stat (filename, buf); -+} -+ -+/* Specification. */ -+/* Write "sys/stat.h" here, not , otherwise OSF/1 5.1 DTK cc -+ eliminates this include because of the preliminary #include -+ above. */ -+#include "sys/stat.h" -+ -+#include -+#include -+#include -+#include -+#include "dosname.h" -+#include "verify.h" -+ -+#if REPLACE_FUNC_STAT_DIR -+# include "pathmax.h" -+ /* The only known systems where REPLACE_FUNC_STAT_DIR is needed also -+ have a constant PATH_MAX. */ -+# ifndef PATH_MAX -+# error "Please port this replacement to your platform" -+# endif -+#endif -+ -+/* Store information about NAME into ST. Work around bugs with -+ trailing slashes. Mingw has other bugs (such as st_ino always -+ being 0 on success) which this wrapper does not work around. But -+ at least this implementation provides the ability to emulate fchdir -+ correctly. */ -+ -+int -+rpl_stat (char const *name, struct stat *st) -+{ -+ int result = orig_stat (name, st); -+#if REPLACE_FUNC_STAT_FILE -+ /* Solaris 9 mistakenly succeeds when given a non-directory with a -+ trailing slash. */ -+ if (result == 0 && !S_ISDIR (st->st_mode)) -+ { -+ size_t len = strlen (name); -+ if (ISSLASH (name[len - 1])) -+ { -+ errno = ENOTDIR; -+ return -1; -+ } -+ } -+#endif /* REPLACE_FUNC_STAT_FILE */ -+#if REPLACE_FUNC_STAT_DIR -+ -+ if (result == -1 && errno == ENOENT) -+ { -+ /* Due to mingw's oddities, there are some directories (like -+ c:\) where stat() only succeeds with a trailing slash, and -+ other directories (like c:\windows) where stat() only -+ succeeds without a trailing slash. But we want the two to be -+ synonymous, since chdir() manages either style. Likewise, Mingw also -+ reports ENOENT for names longer than PATH_MAX, when we want -+ ENAMETOOLONG, and for stat("file/"), when we want ENOTDIR. -+ Fortunately, mingw PATH_MAX is small enough for stack -+ allocation. */ -+ char fixed_name[PATH_MAX + 1] = {0}; -+ size_t len = strlen (name); -+ bool check_dir = false; -+ verify (PATH_MAX <= 4096); -+ if (PATH_MAX <= len) -+ errno = ENAMETOOLONG; -+ else if (len) -+ { -+ strcpy (fixed_name, name); -+ if (ISSLASH (fixed_name[len - 1])) -+ { -+ check_dir = true; -+ while (len && ISSLASH (fixed_name[len - 1])) -+ fixed_name[--len] = '\0'; -+ if (!len) -+ fixed_name[0] = '/'; -+ } -+ else -+ fixed_name[len++] = '/'; -+ result = orig_stat (fixed_name, st); -+ if (result == 0 && check_dir && !S_ISDIR (st->st_mode)) -+ { -+ result = -1; -+ errno = ENOTDIR; -+ } -+ } -+ } -+#endif /* REPLACE_FUNC_STAT_DIR */ -+ return result; -+} diff --git a/grub-core/osdep/windows/hostdisk.c b/grub-core/osdep/windows/hostdisk.c -index 85507af88e3..6f49df465d7 100644 +index 355100789a7..87a106c9b82 100644 --- a/grub-core/osdep/windows/hostdisk.c +++ b/grub-core/osdep/windows/hostdisk.c -@@ -353,6 +353,12 @@ grub_util_mkdir (const char *dir) +@@ -365,6 +365,12 @@ grub_util_mkdir (const char *dir) free (windows_name); } @@ -453,1938 +33,6 @@ index 85507af88e3..6f49df465d7 100644 int grub_util_rename (const char *from, const char *to) { -diff --git a/grub-core/gnulib/pathmax.h b/grub-core/gnulib/pathmax.h -new file mode 100644 -index 00000000000..33fc3553d75 ---- /dev/null -+++ b/grub-core/gnulib/pathmax.h -@@ -0,0 +1,83 @@ -+/* Define PATH_MAX somehow. Requires sys/types.h. -+ Copyright (C) 1992, 1999, 2001, 2003, 2005, 2009-2014 Free Software -+ Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3, or (at your option) -+ any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, see . */ -+ -+#ifndef _PATHMAX_H -+# define _PATHMAX_H -+ -+/* POSIX:2008 defines PATH_MAX to be the maximum number of bytes in a filename, -+ including the terminating NUL byte. -+ -+ PATH_MAX is not defined on systems which have no limit on filename length, -+ such as GNU/Hurd. -+ -+ This file does *not* define PATH_MAX always. Programs that use this file -+ can handle the GNU/Hurd case in several ways: -+ - Either with a package-wide handling, or with a per-file handling, -+ - Either through a -+ #ifdef PATH_MAX -+ or through a fallback like -+ #ifndef PATH_MAX -+ # define PATH_MAX 8192 -+ #endif -+ or through a fallback like -+ #ifndef PATH_MAX -+ # define PATH_MAX pathconf ("/", _PC_PATH_MAX) -+ #endif -+ */ -+ -+# include -+ -+# include -+ -+# ifndef _POSIX_PATH_MAX -+# define _POSIX_PATH_MAX 256 -+# endif -+ -+/* Don't include sys/param.h if it already has been. */ -+# if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN -+# include -+# endif -+ -+# if !defined PATH_MAX && defined MAXPATHLEN -+# define PATH_MAX MAXPATHLEN -+# endif -+ -+# ifdef __hpux -+/* On HP-UX, PATH_MAX designates the maximum number of bytes in a filename, -+ *not* including the terminating NUL byte, and is set to 1023. -+ Additionally, when _XOPEN_SOURCE is defined to 500 or more, PATH_MAX is -+ not defined at all any more. */ -+# undef PATH_MAX -+# define PATH_MAX 1024 -+# endif -+ -+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ -+/* The page "Naming Files, Paths, and Namespaces" on msdn.microsoft.com, -+ section "Maximum Path Length Limitation", -+ -+ explains that the maximum size of a filename, including the terminating -+ NUL byte, is 260 = 3 + 256 + 1. -+ This is the same value as -+ - FILENAME_MAX in , -+ - _MAX_PATH in , -+ - MAX_PATH in . -+ Undefine the original value, because mingw's gets it wrong. */ -+# undef PATH_MAX -+# define PATH_MAX 260 -+# endif -+ -+#endif /* _PATHMAX_H */ -diff --git a/grub-core/gnulib/sys_stat.in.h b/grub-core/gnulib/sys_stat.in.h -new file mode 100644 -index 00000000000..b47a7ff0ae7 ---- /dev/null -+++ b/grub-core/gnulib/sys_stat.in.h -@@ -0,0 +1,732 @@ -+/* Provide a more complete sys/stat header file. -+ Copyright (C) 2005-2014 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3, or (at your option) -+ any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, see . */ -+ -+/* Written by Eric Blake, Paul Eggert, and Jim Meyering. */ -+ -+/* This file is supposed to be used on platforms where is -+ incomplete. It is intended to provide definitions and prototypes -+ needed by an application. Start with what the system provides. */ -+ -+#if __GNUC__ >= 3 -+@PRAGMA_SYSTEM_HEADER@ -+#endif -+@PRAGMA_COLUMNS@ -+ -+#if defined __need_system_sys_stat_h -+/* Special invocation convention. */ -+ -+#@INCLUDE_NEXT@ @NEXT_SYS_STAT_H@ -+ -+#else -+/* Normal invocation convention. */ -+ -+#ifndef _@GUARD_PREFIX@_SYS_STAT_H -+ -+/* Get nlink_t. -+ May also define off_t to a 64-bit type on native Windows. */ -+#include -+ -+/* Get struct timespec. */ -+#include -+ -+/* The include_next requires a split double-inclusion guard. */ -+#@INCLUDE_NEXT@ @NEXT_SYS_STAT_H@ -+ -+#ifndef _@GUARD_PREFIX@_SYS_STAT_H -+#define _@GUARD_PREFIX@_SYS_STAT_H -+ -+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ -+ -+/* The definition of _GL_ARG_NONNULL is copied here. */ -+ -+/* The definition of _GL_WARN_ON_USE is copied here. */ -+ -+/* Before doing "#define mkdir rpl_mkdir" below, we need to include all -+ headers that may declare mkdir(). Native Windows platforms declare mkdir -+ in and/or , not in . */ -+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ -+# include /* mingw32, mingw64 */ -+# include /* mingw64, MSVC 9 */ -+#endif -+ -+/* Native Windows platforms declare umask() in . */ -+#if 0 && ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__) -+# include -+#endif -+ -+/* Large File Support on native Windows. */ -+#if @WINDOWS_64_BIT_ST_SIZE@ -+# define stat _stati64 -+#endif -+ -+#ifndef S_IFIFO -+# ifdef _S_IFIFO -+# define S_IFIFO _S_IFIFO -+# endif -+#endif -+ -+#ifndef S_IFMT -+# define S_IFMT 0170000 -+#endif -+ -+#if STAT_MACROS_BROKEN -+# undef S_ISBLK -+# undef S_ISCHR -+# undef S_ISDIR -+# undef S_ISFIFO -+# undef S_ISLNK -+# undef S_ISNAM -+# undef S_ISMPB -+# undef S_ISMPC -+# undef S_ISNWK -+# undef S_ISREG -+# undef S_ISSOCK -+#endif -+ -+#ifndef S_ISBLK -+# ifdef S_IFBLK -+# define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) -+# else -+# define S_ISBLK(m) 0 -+# endif -+#endif -+ -+#ifndef S_ISCHR -+# ifdef S_IFCHR -+# define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) -+# else -+# define S_ISCHR(m) 0 -+# endif -+#endif -+ -+#ifndef S_ISDIR -+# ifdef S_IFDIR -+# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) -+# else -+# define S_ISDIR(m) 0 -+# endif -+#endif -+ -+#ifndef S_ISDOOR /* Solaris 2.5 and up */ -+# define S_ISDOOR(m) 0 -+#endif -+ -+#ifndef S_ISFIFO -+# ifdef S_IFIFO -+# define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) -+# else -+# define S_ISFIFO(m) 0 -+# endif -+#endif -+ -+#ifndef S_ISLNK -+# ifdef S_IFLNK -+# define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) -+# else -+# define S_ISLNK(m) 0 -+# endif -+#endif -+ -+#ifndef S_ISMPB /* V7 */ -+# ifdef S_IFMPB -+# define S_ISMPB(m) (((m) & S_IFMT) == S_IFMPB) -+# define S_ISMPC(m) (((m) & S_IFMT) == S_IFMPC) -+# else -+# define S_ISMPB(m) 0 -+# define S_ISMPC(m) 0 -+# endif -+#endif -+ -+#ifndef S_ISMPX /* AIX */ -+# define S_ISMPX(m) 0 -+#endif -+ -+#ifndef S_ISNAM /* Xenix */ -+# ifdef S_IFNAM -+# define S_ISNAM(m) (((m) & S_IFMT) == S_IFNAM) -+# else -+# define S_ISNAM(m) 0 -+# endif -+#endif -+ -+#ifndef S_ISNWK /* HP/UX */ -+# ifdef S_IFNWK -+# define S_ISNWK(m) (((m) & S_IFMT) == S_IFNWK) -+# else -+# define S_ISNWK(m) 0 -+# endif -+#endif -+ -+#ifndef S_ISPORT /* Solaris 10 and up */ -+# define S_ISPORT(m) 0 -+#endif -+ -+#ifndef S_ISREG -+# ifdef S_IFREG -+# define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) -+# else -+# define S_ISREG(m) 0 -+# endif -+#endif -+ -+#ifndef S_ISSOCK -+# ifdef S_IFSOCK -+# define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) -+# else -+# define S_ISSOCK(m) 0 -+# endif -+#endif -+ -+ -+#ifndef S_TYPEISMQ -+# define S_TYPEISMQ(p) 0 -+#endif -+ -+#ifndef S_TYPEISTMO -+# define S_TYPEISTMO(p) 0 -+#endif -+ -+ -+#ifndef S_TYPEISSEM -+# ifdef S_INSEM -+# define S_TYPEISSEM(p) (S_ISNAM ((p)->st_mode) && (p)->st_rdev == S_INSEM) -+# else -+# define S_TYPEISSEM(p) 0 -+# endif -+#endif -+ -+#ifndef S_TYPEISSHM -+# ifdef S_INSHD -+# define S_TYPEISSHM(p) (S_ISNAM ((p)->st_mode) && (p)->st_rdev == S_INSHD) -+# else -+# define S_TYPEISSHM(p) 0 -+# endif -+#endif -+ -+/* high performance ("contiguous data") */ -+#ifndef S_ISCTG -+# define S_ISCTG(p) 0 -+#endif -+ -+/* Cray DMF (data migration facility): off line, with data */ -+#ifndef S_ISOFD -+# define S_ISOFD(p) 0 -+#endif -+ -+/* Cray DMF (data migration facility): off line, with no data */ -+#ifndef S_ISOFL -+# define S_ISOFL(p) 0 -+#endif -+ -+/* 4.4BSD whiteout */ -+#ifndef S_ISWHT -+# define S_ISWHT(m) 0 -+#endif -+ -+/* If any of the following are undefined, -+ define them to their de facto standard values. */ -+#if !S_ISUID -+# define S_ISUID 04000 -+#endif -+#if !S_ISGID -+# define S_ISGID 02000 -+#endif -+ -+/* S_ISVTX is a common extension to POSIX. */ -+#ifndef S_ISVTX -+# define S_ISVTX 01000 -+#endif -+ -+#if !S_IRUSR && S_IREAD -+# define S_IRUSR S_IREAD -+#endif -+#if !S_IRUSR -+# define S_IRUSR 00400 -+#endif -+#if !S_IRGRP -+# define S_IRGRP (S_IRUSR >> 3) -+#endif -+#if !S_IROTH -+# define S_IROTH (S_IRUSR >> 6) -+#endif -+ -+#if !S_IWUSR && S_IWRITE -+# define S_IWUSR S_IWRITE -+#endif -+#if !S_IWUSR -+# define S_IWUSR 00200 -+#endif -+#if !S_IWGRP -+# define S_IWGRP (S_IWUSR >> 3) -+#endif -+#if !S_IWOTH -+# define S_IWOTH (S_IWUSR >> 6) -+#endif -+ -+#if !S_IXUSR && S_IEXEC -+# define S_IXUSR S_IEXEC -+#endif -+#if !S_IXUSR -+# define S_IXUSR 00100 -+#endif -+#if !S_IXGRP -+# define S_IXGRP (S_IXUSR >> 3) -+#endif -+#if !S_IXOTH -+# define S_IXOTH (S_IXUSR >> 6) -+#endif -+ -+#if !S_IRWXU -+# define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR) -+#endif -+#if !S_IRWXG -+# define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP) -+#endif -+#if !S_IRWXO -+# define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH) -+#endif -+ -+/* S_IXUGO is a common extension to POSIX. */ -+#if !S_IXUGO -+# define S_IXUGO (S_IXUSR | S_IXGRP | S_IXOTH) -+#endif -+ -+#ifndef S_IRWXUGO -+# define S_IRWXUGO (S_IRWXU | S_IRWXG | S_IRWXO) -+#endif -+ -+/* Macros for futimens and utimensat. */ -+#ifndef UTIME_NOW -+# define UTIME_NOW (-1) -+# define UTIME_OMIT (-2) -+#endif -+ -+ -+#if @GNULIB_FCHMODAT@ -+# if !@HAVE_FCHMODAT@ -+_GL_FUNCDECL_SYS (fchmodat, int, -+ (int fd, char const *file, mode_t mode, int flag) -+ _GL_ARG_NONNULL ((2))); -+# endif -+_GL_CXXALIAS_SYS (fchmodat, int, -+ (int fd, char const *file, mode_t mode, int flag)); -+_GL_CXXALIASWARN (fchmodat); -+#elif defined GNULIB_POSIXCHECK -+# undef fchmodat -+# if HAVE_RAW_DECL_FCHMODAT -+_GL_WARN_ON_USE (fchmodat, "fchmodat is not portable - " -+ "use gnulib module openat for portability"); -+# endif -+#endif -+ -+ -+#if @GNULIB_FSTAT@ -+# if @REPLACE_FSTAT@ -+# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+# undef fstat -+# define fstat rpl_fstat -+# endif -+_GL_FUNCDECL_RPL (fstat, int, (int fd, struct stat *buf) _GL_ARG_NONNULL ((2))); -+_GL_CXXALIAS_RPL (fstat, int, (int fd, struct stat *buf)); -+# else -+_GL_CXXALIAS_SYS (fstat, int, (int fd, struct stat *buf)); -+# endif -+_GL_CXXALIASWARN (fstat); -+#elif @WINDOWS_64_BIT_ST_SIZE@ -+/* Above, we define stat to _stati64. */ -+# define fstat _fstati64 -+#elif defined GNULIB_POSIXCHECK -+# undef fstat -+# if HAVE_RAW_DECL_FSTAT -+_GL_WARN_ON_USE (fstat, "fstat has portability problems - " -+ "use gnulib module fstat for portability"); -+# endif -+#endif -+ -+ -+#if @GNULIB_FSTATAT@ -+# if @REPLACE_FSTATAT@ -+# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+# undef fstatat -+# define fstatat rpl_fstatat -+# endif -+_GL_FUNCDECL_RPL (fstatat, int, -+ (int fd, char const *name, struct stat *st, int flags) -+ _GL_ARG_NONNULL ((2, 3))); -+_GL_CXXALIAS_RPL (fstatat, int, -+ (int fd, char const *name, struct stat *st, int flags)); -+# else -+# if !@HAVE_FSTATAT@ -+_GL_FUNCDECL_SYS (fstatat, int, -+ (int fd, char const *name, struct stat *st, int flags) -+ _GL_ARG_NONNULL ((2, 3))); -+# endif -+_GL_CXXALIAS_SYS (fstatat, int, -+ (int fd, char const *name, struct stat *st, int flags)); -+# endif -+_GL_CXXALIASWARN (fstatat); -+#elif defined GNULIB_POSIXCHECK -+# undef fstatat -+# if HAVE_RAW_DECL_FSTATAT -+_GL_WARN_ON_USE (fstatat, "fstatat is not portable - " -+ "use gnulib module openat for portability"); -+# endif -+#endif -+ -+ -+#if @GNULIB_FUTIMENS@ -+/* Use the rpl_ prefix also on Solaris <= 9, because on Solaris 9 our futimens -+ implementation relies on futimesat, which on Solaris 10 makes an invocation -+ to futimens that is meant to invoke the libc's futimens(), not gnulib's -+ futimens(). */ -+# if @REPLACE_FUTIMENS@ || (!@HAVE_FUTIMENS@ && defined __sun) -+# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+# undef futimens -+# define futimens rpl_futimens -+# endif -+_GL_FUNCDECL_RPL (futimens, int, (int fd, struct timespec const times[2])); -+_GL_CXXALIAS_RPL (futimens, int, (int fd, struct timespec const times[2])); -+# else -+# if !@HAVE_FUTIMENS@ -+_GL_FUNCDECL_SYS (futimens, int, (int fd, struct timespec const times[2])); -+# endif -+_GL_CXXALIAS_SYS (futimens, int, (int fd, struct timespec const times[2])); -+# endif -+# if @HAVE_FUTIMENS@ -+_GL_CXXALIASWARN (futimens); -+# endif -+#elif defined GNULIB_POSIXCHECK -+# undef futimens -+# if HAVE_RAW_DECL_FUTIMENS -+_GL_WARN_ON_USE (futimens, "futimens is not portable - " -+ "use gnulib module futimens for portability"); -+# endif -+#endif -+ -+ -+#if @GNULIB_LCHMOD@ -+/* Change the mode of FILENAME to MODE, without dereferencing it if FILENAME -+ denotes a symbolic link. */ -+# if !@HAVE_LCHMOD@ -+/* The lchmod replacement follows symbolic links. Callers should take -+ this into account; lchmod should be applied only to arguments that -+ are known to not be symbolic links. On hosts that lack lchmod, -+ this can lead to race conditions between the check and the -+ invocation of lchmod, but we know of no workarounds that are -+ reliable in general. You might try requesting support for lchmod -+ from your operating system supplier. */ -+# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+# define lchmod chmod -+# endif -+/* Need to cast, because on mingw, the second parameter of chmod is -+ int mode. */ -+_GL_CXXALIAS_RPL_CAST_1 (lchmod, chmod, int, -+ (const char *filename, mode_t mode)); -+# else -+# if 0 /* assume already declared */ -+_GL_FUNCDECL_SYS (lchmod, int, (const char *filename, mode_t mode) -+ _GL_ARG_NONNULL ((1))); -+# endif -+_GL_CXXALIAS_SYS (lchmod, int, (const char *filename, mode_t mode)); -+# endif -+# if @HAVE_LCHMOD@ -+_GL_CXXALIASWARN (lchmod); -+# endif -+#elif defined GNULIB_POSIXCHECK -+# undef lchmod -+# if HAVE_RAW_DECL_LCHMOD -+_GL_WARN_ON_USE (lchmod, "lchmod is unportable - " -+ "use gnulib module lchmod for portability"); -+# endif -+#endif -+ -+ -+#if @GNULIB_LSTAT@ -+# if ! @HAVE_LSTAT@ -+/* mingw does not support symlinks, therefore it does not have lstat. But -+ without links, stat does just fine. */ -+# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+# define lstat stat -+# endif -+_GL_CXXALIAS_RPL_1 (lstat, stat, int, (const char *name, struct stat *buf)); -+# elif @REPLACE_LSTAT@ -+# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+# undef lstat -+# define lstat rpl_lstat -+# endif -+_GL_FUNCDECL_RPL (lstat, int, (const char *name, struct stat *buf) -+ _GL_ARG_NONNULL ((1, 2))); -+_GL_CXXALIAS_RPL (lstat, int, (const char *name, struct stat *buf)); -+# else -+_GL_CXXALIAS_SYS (lstat, int, (const char *name, struct stat *buf)); -+# endif -+# if @HAVE_LSTAT@ -+_GL_CXXALIASWARN (lstat); -+# endif -+#elif defined GNULIB_POSIXCHECK -+# undef lstat -+# if HAVE_RAW_DECL_LSTAT -+_GL_WARN_ON_USE (lstat, "lstat is unportable - " -+ "use gnulib module lstat for portability"); -+# endif -+#endif -+ -+ -+#if @REPLACE_MKDIR@ -+# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+# undef mkdir -+# define mkdir rpl_mkdir -+# endif -+_GL_FUNCDECL_RPL (mkdir, int, (char const *name, mode_t mode) -+ _GL_ARG_NONNULL ((1))); -+_GL_CXXALIAS_RPL (mkdir, int, (char const *name, mode_t mode)); -+#else -+/* mingw's _mkdir() function has 1 argument, but we pass 2 arguments. -+ Additionally, it declares _mkdir (and depending on compile flags, an -+ alias mkdir), only in the nonstandard includes and , -+ which are included above. */ -+# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ -+ -+# if !GNULIB_defined_rpl_mkdir -+static int -+rpl_mkdir (char const *name, mode_t mode) -+{ -+ return _mkdir (name); -+} -+# define GNULIB_defined_rpl_mkdir 1 -+# endif -+ -+# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+# define mkdir rpl_mkdir -+# endif -+_GL_CXXALIAS_RPL (mkdir, int, (char const *name, mode_t mode)); -+# else -+_GL_CXXALIAS_SYS (mkdir, int, (char const *name, mode_t mode)); -+# endif -+#endif -+_GL_CXXALIASWARN (mkdir); -+ -+ -+#if @GNULIB_MKDIRAT@ -+# if !@HAVE_MKDIRAT@ -+_GL_FUNCDECL_SYS (mkdirat, int, (int fd, char const *file, mode_t mode) -+ _GL_ARG_NONNULL ((2))); -+# endif -+_GL_CXXALIAS_SYS (mkdirat, int, (int fd, char const *file, mode_t mode)); -+_GL_CXXALIASWARN (mkdirat); -+#elif defined GNULIB_POSIXCHECK -+# undef mkdirat -+# if HAVE_RAW_DECL_MKDIRAT -+_GL_WARN_ON_USE (mkdirat, "mkdirat is not portable - " -+ "use gnulib module openat for portability"); -+# endif -+#endif -+ -+ -+#if @GNULIB_MKFIFO@ -+# if @REPLACE_MKFIFO@ -+# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+# undef mkfifo -+# define mkfifo rpl_mkfifo -+# endif -+_GL_FUNCDECL_RPL (mkfifo, int, (char const *file, mode_t mode) -+ _GL_ARG_NONNULL ((1))); -+_GL_CXXALIAS_RPL (mkfifo, int, (char const *file, mode_t mode)); -+# else -+# if !@HAVE_MKFIFO@ -+_GL_FUNCDECL_SYS (mkfifo, int, (char const *file, mode_t mode) -+ _GL_ARG_NONNULL ((1))); -+# endif -+_GL_CXXALIAS_SYS (mkfifo, int, (char const *file, mode_t mode)); -+# endif -+_GL_CXXALIASWARN (mkfifo); -+#elif defined GNULIB_POSIXCHECK -+# undef mkfifo -+# if HAVE_RAW_DECL_MKFIFO -+_GL_WARN_ON_USE (mkfifo, "mkfifo is not portable - " -+ "use gnulib module mkfifo for portability"); -+# endif -+#endif -+ -+ -+#if @GNULIB_MKFIFOAT@ -+# if !@HAVE_MKFIFOAT@ -+_GL_FUNCDECL_SYS (mkfifoat, int, (int fd, char const *file, mode_t mode) -+ _GL_ARG_NONNULL ((2))); -+# endif -+_GL_CXXALIAS_SYS (mkfifoat, int, (int fd, char const *file, mode_t mode)); -+_GL_CXXALIASWARN (mkfifoat); -+#elif defined GNULIB_POSIXCHECK -+# undef mkfifoat -+# if HAVE_RAW_DECL_MKFIFOAT -+_GL_WARN_ON_USE (mkfifoat, "mkfifoat is not portable - " -+ "use gnulib module mkfifoat for portability"); -+# endif -+#endif -+ -+ -+#if @GNULIB_MKNOD@ -+# if @REPLACE_MKNOD@ -+# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+# undef mknod -+# define mknod rpl_mknod -+# endif -+_GL_FUNCDECL_RPL (mknod, int, (char const *file, mode_t mode, dev_t dev) -+ _GL_ARG_NONNULL ((1))); -+_GL_CXXALIAS_RPL (mknod, int, (char const *file, mode_t mode, dev_t dev)); -+# else -+# if !@HAVE_MKNOD@ -+_GL_FUNCDECL_SYS (mknod, int, (char const *file, mode_t mode, dev_t dev) -+ _GL_ARG_NONNULL ((1))); -+# endif -+/* Need to cast, because on OSF/1 5.1, the third parameter is '...'. */ -+_GL_CXXALIAS_SYS_CAST (mknod, int, (char const *file, mode_t mode, dev_t dev)); -+# endif -+_GL_CXXALIASWARN (mknod); -+#elif defined GNULIB_POSIXCHECK -+# undef mknod -+# if HAVE_RAW_DECL_MKNOD -+_GL_WARN_ON_USE (mknod, "mknod is not portable - " -+ "use gnulib module mknod for portability"); -+# endif -+#endif -+ -+ -+#if @GNULIB_MKNODAT@ -+# if !@HAVE_MKNODAT@ -+_GL_FUNCDECL_SYS (mknodat, int, -+ (int fd, char const *file, mode_t mode, dev_t dev) -+ _GL_ARG_NONNULL ((2))); -+# endif -+_GL_CXXALIAS_SYS (mknodat, int, -+ (int fd, char const *file, mode_t mode, dev_t dev)); -+_GL_CXXALIASWARN (mknodat); -+#elif defined GNULIB_POSIXCHECK -+# undef mknodat -+# if HAVE_RAW_DECL_MKNODAT -+_GL_WARN_ON_USE (mknodat, "mknodat is not portable - " -+ "use gnulib module mkfifoat for portability"); -+# endif -+#endif -+ -+ -+#if @GNULIB_STAT@ -+# if @REPLACE_STAT@ -+/* We can't use the object-like #define stat rpl_stat, because of -+ struct stat. This means that rpl_stat will not be used if the user -+ does (stat)(a,b). Oh well. */ -+# if defined _AIX && defined stat && defined _LARGE_FILES -+ /* With _LARGE_FILES defined, AIX (only) defines stat to stat64, -+ so we have to replace stat64() instead of stat(). */ -+# undef stat64 -+# define stat64(name, st) rpl_stat (name, st) -+# elif @WINDOWS_64_BIT_ST_SIZE@ -+ /* Above, we define stat to _stati64. */ -+# if defined __MINGW32__ && defined _stati64 -+# ifndef _USE_32BIT_TIME_T -+ /* The system headers define _stati64 to _stat64. */ -+# undef _stat64 -+# define _stat64(name, st) rpl_stat (name, st) -+# endif -+# elif defined _MSC_VER && defined _stati64 -+# ifdef _USE_32BIT_TIME_T -+ /* The system headers define _stati64 to _stat32i64. */ -+# undef _stat32i64 -+# define _stat32i64(name, st) rpl_stat (name, st) -+# else -+ /* The system headers define _stati64 to _stat64. */ -+# undef _stat64 -+# define _stat64(name, st) rpl_stat (name, st) -+# endif -+# else -+# undef _stati64 -+# define _stati64(name, st) rpl_stat (name, st) -+# endif -+# elif defined __MINGW32__ && defined stat -+# ifdef _USE_32BIT_TIME_T -+ /* The system headers define stat to _stat32i64. */ -+# undef _stat32i64 -+# define _stat32i64(name, st) rpl_stat (name, st) -+# else -+ /* The system headers define stat to _stat64. */ -+# undef _stat64 -+# define _stat64(name, st) rpl_stat (name, st) -+# endif -+# elif defined _MSC_VER && defined stat -+# ifdef _USE_32BIT_TIME_T -+ /* The system headers define stat to _stat32. */ -+# undef _stat32 -+# define _stat32(name, st) rpl_stat (name, st) -+# else -+ /* The system headers define stat to _stat64i32. */ -+# undef _stat64i32 -+# define _stat64i32(name, st) rpl_stat (name, st) -+# endif -+# else /* !(_AIX ||__MINGW32__ || _MSC_VER) */ -+# undef stat -+# define stat(name, st) rpl_stat (name, st) -+# endif /* !_LARGE_FILES */ -+_GL_EXTERN_C int stat (const char *name, struct stat *buf) -+ _GL_ARG_NONNULL ((1, 2)); -+# endif -+#elif defined GNULIB_POSIXCHECK -+# undef stat -+# if HAVE_RAW_DECL_STAT -+_GL_WARN_ON_USE (stat, "stat is unportable - " -+ "use gnulib module stat for portability"); -+# endif -+#endif -+ -+ -+#if @GNULIB_UTIMENSAT@ -+/* Use the rpl_ prefix also on Solaris <= 9, because on Solaris 9 our utimensat -+ implementation relies on futimesat, which on Solaris 10 makes an invocation -+ to utimensat that is meant to invoke the libc's utimensat(), not gnulib's -+ utimensat(). */ -+# if @REPLACE_UTIMENSAT@ || (!@HAVE_UTIMENSAT@ && defined __sun) -+# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+# undef utimensat -+# define utimensat rpl_utimensat -+# endif -+_GL_FUNCDECL_RPL (utimensat, int, (int fd, char const *name, -+ struct timespec const times[2], int flag) -+ _GL_ARG_NONNULL ((2))); -+_GL_CXXALIAS_RPL (utimensat, int, (int fd, char const *name, -+ struct timespec const times[2], int flag)); -+# else -+# if !@HAVE_UTIMENSAT@ -+_GL_FUNCDECL_SYS (utimensat, int, (int fd, char const *name, -+ struct timespec const times[2], int flag) -+ _GL_ARG_NONNULL ((2))); -+# endif -+_GL_CXXALIAS_SYS (utimensat, int, (int fd, char const *name, -+ struct timespec const times[2], int flag)); -+# endif -+# if @HAVE_UTIMENSAT@ -+_GL_CXXALIASWARN (utimensat); -+# endif -+#elif defined GNULIB_POSIXCHECK -+# undef utimensat -+# if HAVE_RAW_DECL_UTIMENSAT -+_GL_WARN_ON_USE (utimensat, "utimensat is not portable - " -+ "use gnulib module utimensat for portability"); -+# endif -+#endif -+ -+ -+#endif /* _@GUARD_PREFIX@_SYS_STAT_H */ -+#endif /* _@GUARD_PREFIX@_SYS_STAT_H */ -+#endif -diff --git a/grub-core/gnulib/sys_time.in.h b/grub-core/gnulib/sys_time.in.h -new file mode 100644 -index 00000000000..30057ad49fd ---- /dev/null -+++ b/grub-core/gnulib/sys_time.in.h -@@ -0,0 +1,213 @@ -+/* Provide a more complete sys/time.h. -+ -+ Copyright (C) 2007-2014 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3, or (at your option) -+ any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, see . */ -+ -+/* Written by Paul Eggert. */ -+ -+#ifndef _@GUARD_PREFIX@_SYS_TIME_H -+ -+#if __GNUC__ >= 3 -+@PRAGMA_SYSTEM_HEADER@ -+#endif -+@PRAGMA_COLUMNS@ -+ -+/* On Cygwin and on many BSDish systems, includes itself -+ recursively via . -+ Simply delegate to the system's header in this case; it is a no-op. -+ Without this extra ifdef, the C++ gettimeofday declaration below -+ would be a forward declaration in gnulib's nested . */ -+#if defined _CYGWIN_SYS_TIME_H || defined _SYS_TIME_H || defined _SYS_TIME_H_ -+# @INCLUDE_NEXT@ @NEXT_SYS_TIME_H@ -+#else -+ -+/* The include_next requires a split double-inclusion guard. */ -+#if @HAVE_SYS_TIME_H@ -+# @INCLUDE_NEXT@ @NEXT_SYS_TIME_H@ -+#endif -+ -+#ifndef _@GUARD_PREFIX@_SYS_TIME_H -+#define _@GUARD_PREFIX@_SYS_TIME_H -+ -+#if ! @HAVE_SYS_TIME_H@ -+# include -+#endif -+ -+/* On native Windows with MSVC, get the 'struct timeval' type. -+ Also, on native Windows with a 64-bit time_t, where we are overriding the -+ 'struct timeval' type, get all declarations of system functions whose -+ signature contains 'struct timeval'. */ -+#if (defined _MSC_VER || @REPLACE_STRUCT_TIMEVAL@) && @HAVE_WINSOCK2_H@ && !defined _GL_INCLUDING_WINSOCK2_H -+# define _GL_INCLUDING_WINSOCK2_H -+# include -+# undef _GL_INCLUDING_WINSOCK2_H -+#endif -+ -+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ -+ -+/* The definition of _GL_ARG_NONNULL is copied here. */ -+ -+/* The definition of _GL_WARN_ON_USE is copied here. */ -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#if !@HAVE_STRUCT_TIMEVAL@ || @REPLACE_STRUCT_TIMEVAL@ -+ -+# if @REPLACE_STRUCT_TIMEVAL@ -+# define timeval rpl_timeval -+# endif -+ -+# if !GNULIB_defined_struct_timeval -+struct timeval -+{ -+ time_t tv_sec; -+ long int tv_usec; -+}; -+# define GNULIB_defined_struct_timeval 1 -+# endif -+ -+#endif -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#if @GNULIB_GETTIMEOFDAY@ -+# if @REPLACE_GETTIMEOFDAY@ -+# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+# undef gettimeofday -+# define gettimeofday rpl_gettimeofday -+# endif -+_GL_FUNCDECL_RPL (gettimeofday, int, -+ (struct timeval *restrict, void *restrict) -+ _GL_ARG_NONNULL ((1))); -+_GL_CXXALIAS_RPL (gettimeofday, int, -+ (struct timeval *restrict, void *restrict)); -+# else -+# if !@HAVE_GETTIMEOFDAY@ -+_GL_FUNCDECL_SYS (gettimeofday, int, -+ (struct timeval *restrict, void *restrict) -+ _GL_ARG_NONNULL ((1))); -+# endif -+/* Need to cast, because on glibc systems, by default, the second argument is -+ struct timezone *. */ -+_GL_CXXALIAS_SYS_CAST (gettimeofday, int, -+ (struct timeval *restrict, void *restrict)); -+# endif -+_GL_CXXALIASWARN (gettimeofday); -+#elif defined GNULIB_POSIXCHECK -+# undef gettimeofday -+# if HAVE_RAW_DECL_GETTIMEOFDAY -+_GL_WARN_ON_USE (gettimeofday, "gettimeofday is unportable - " -+ "use gnulib module gettimeofday for portability"); -+# endif -+#endif -+ -+/* Hide some function declarations from . */ -+ -+#if defined _MSC_VER && @HAVE_WINSOCK2_H@ -+# if !defined _@GUARD_PREFIX@_UNISTD_H -+# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+# undef close -+# define close close_used_without_including_unistd_h -+# else -+ _GL_WARN_ON_USE (close, -+ "close() used without including "); -+# endif -+# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+# undef gethostname -+# define gethostname gethostname_used_without_including_unistd_h -+# else -+ _GL_WARN_ON_USE (gethostname, -+ "gethostname() used without including "); -+# endif -+# endif -+# if !defined _@GUARD_PREFIX@_SYS_SOCKET_H -+# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+# undef socket -+# define socket socket_used_without_including_sys_socket_h -+# undef connect -+# define connect connect_used_without_including_sys_socket_h -+# undef accept -+# define accept accept_used_without_including_sys_socket_h -+# undef bind -+# define bind bind_used_without_including_sys_socket_h -+# undef getpeername -+# define getpeername getpeername_used_without_including_sys_socket_h -+# undef getsockname -+# define getsockname getsockname_used_without_including_sys_socket_h -+# undef getsockopt -+# define getsockopt getsockopt_used_without_including_sys_socket_h -+# undef listen -+# define listen listen_used_without_including_sys_socket_h -+# undef recv -+# define recv recv_used_without_including_sys_socket_h -+# undef send -+# define send send_used_without_including_sys_socket_h -+# undef recvfrom -+# define recvfrom recvfrom_used_without_including_sys_socket_h -+# undef sendto -+# define sendto sendto_used_without_including_sys_socket_h -+# undef setsockopt -+# define setsockopt setsockopt_used_without_including_sys_socket_h -+# undef shutdown -+# define shutdown shutdown_used_without_including_sys_socket_h -+# else -+ _GL_WARN_ON_USE (socket, -+ "socket() used without including "); -+ _GL_WARN_ON_USE (connect, -+ "connect() used without including "); -+ _GL_WARN_ON_USE (accept, -+ "accept() used without including "); -+ _GL_WARN_ON_USE (bind, -+ "bind() used without including "); -+ _GL_WARN_ON_USE (getpeername, -+ "getpeername() used without including "); -+ _GL_WARN_ON_USE (getsockname, -+ "getsockname() used without including "); -+ _GL_WARN_ON_USE (getsockopt, -+ "getsockopt() used without including "); -+ _GL_WARN_ON_USE (listen, -+ "listen() used without including "); -+ _GL_WARN_ON_USE (recv, -+ "recv() used without including "); -+ _GL_WARN_ON_USE (send, -+ "send() used without including "); -+ _GL_WARN_ON_USE (recvfrom, -+ "recvfrom() used without including "); -+ _GL_WARN_ON_USE (sendto, -+ "sendto() used without including "); -+ _GL_WARN_ON_USE (setsockopt, -+ "setsockopt() used without including "); -+ _GL_WARN_ON_USE (shutdown, -+ "shutdown() used without including "); -+# endif -+# endif -+# if !defined _@GUARD_PREFIX@_SYS_SELECT_H -+# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+# undef select -+# define select select_used_without_including_sys_select_h -+# else -+ _GL_WARN_ON_USE (select, -+ "select() used without including "); -+# endif -+# endif -+#endif -+ -+#endif /* _@GUARD_PREFIX@_SYS_TIME_H */ -+#endif /* _CYGWIN_SYS_TIME_H */ -+#endif /* _@GUARD_PREFIX@_SYS_TIME_H */ -diff --git a/grub-core/gnulib/sys_types.in.h b/grub-core/gnulib/sys_types.in.h -index d7da35623b1..9520c09030c 100644 ---- a/grub-core/gnulib/sys_types.in.h -+++ b/grub-core/gnulib/sys_types.in.h -@@ -23,7 +23,9 @@ - #ifndef _@GUARD_PREFIX@_SYS_TYPES_H - - /* The include_next requires a split double-inclusion guard. */ -+# define _GL_INCLUDING_SYS_TYPES_H - #@INCLUDE_NEXT@ @NEXT_SYS_TYPES_H@ -+# undef _GL_INCLUDING_SYS_TYPES_H - - #ifndef _@GUARD_PREFIX@_SYS_TYPES_H - #define _@GUARD_PREFIX@_SYS_TYPES_H -diff --git a/grub-core/gnulib/time.h b/grub-core/gnulib/time.h -new file mode 100644 -index 00000000000..b9203d5569a ---- /dev/null -+++ b/grub-core/gnulib/time.h -@@ -0,0 +1,586 @@ -+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ -+/* A more-standard . -+ -+ Copyright (C) 2007-2014 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3, or (at your option) -+ any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, see . */ -+ -+#if __GNUC__ >= 3 -+#pragma GCC system_header -+#endif -+ -+ -+/* Don't get in the way of glibc when it includes time.h merely to -+ declare a few standard symbols, rather than to declare all the -+ symbols. Also, Solaris 8 eventually includes itself -+ recursively; if that is happening, just include the system -+ without adding our own declarations. */ -+#if (defined __need_time_t || defined __need_clock_t \ -+ || defined __need_timespec \ -+ || defined _GL_TIME_H) -+ -+# include_next -+ -+#else -+ -+# define _GL_TIME_H -+ -+# include_next -+ -+/* NetBSD 5.0 mis-defines NULL. */ -+# include -+ -+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ -+#ifndef _GL_CXXDEFS_H -+#define _GL_CXXDEFS_H -+ -+/* The three most frequent use cases of these macros are: -+ -+ * For providing a substitute for a function that is missing on some -+ platforms, but is declared and works fine on the platforms on which -+ it exists: -+ -+ #if @GNULIB_FOO@ -+ # if !@HAVE_FOO@ -+ _GL_FUNCDECL_SYS (foo, ...); -+ # endif -+ _GL_CXXALIAS_SYS (foo, ...); -+ _GL_CXXALIASWARN (foo); -+ #elif defined GNULIB_POSIXCHECK -+ ... -+ #endif -+ -+ * For providing a replacement for a function that exists on all platforms, -+ but is broken/insufficient and needs to be replaced on some platforms: -+ -+ #if @GNULIB_FOO@ -+ # if @REPLACE_FOO@ -+ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+ # undef foo -+ # define foo rpl_foo -+ # endif -+ _GL_FUNCDECL_RPL (foo, ...); -+ _GL_CXXALIAS_RPL (foo, ...); -+ # else -+ _GL_CXXALIAS_SYS (foo, ...); -+ # endif -+ _GL_CXXALIASWARN (foo); -+ #elif defined GNULIB_POSIXCHECK -+ ... -+ #endif -+ -+ * For providing a replacement for a function that exists on some platforms -+ but is broken/insufficient and needs to be replaced on some of them and -+ is additionally either missing or undeclared on some other platforms: -+ -+ #if @GNULIB_FOO@ -+ # if @REPLACE_FOO@ -+ # if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+ # undef foo -+ # define foo rpl_foo -+ # endif -+ _GL_FUNCDECL_RPL (foo, ...); -+ _GL_CXXALIAS_RPL (foo, ...); -+ # else -+ # if !@HAVE_FOO@ or if !@HAVE_DECL_FOO@ -+ _GL_FUNCDECL_SYS (foo, ...); -+ # endif -+ _GL_CXXALIAS_SYS (foo, ...); -+ # endif -+ _GL_CXXALIASWARN (foo); -+ #elif defined GNULIB_POSIXCHECK -+ ... -+ #endif -+*/ -+ -+/* _GL_EXTERN_C declaration; -+ performs the declaration with C linkage. */ -+#if defined __cplusplus -+# define _GL_EXTERN_C extern "C" -+#else -+# define _GL_EXTERN_C extern -+#endif -+ -+/* _GL_FUNCDECL_RPL (func, rettype, parameters_and_attributes); -+ declares a replacement function, named rpl_func, with the given prototype, -+ consisting of return type, parameters, and attributes. -+ Example: -+ _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...) -+ _GL_ARG_NONNULL ((1))); -+ */ -+#define _GL_FUNCDECL_RPL(func,rettype,parameters_and_attributes) \ -+ _GL_FUNCDECL_RPL_1 (rpl_##func, rettype, parameters_and_attributes) -+#define _GL_FUNCDECL_RPL_1(rpl_func,rettype,parameters_and_attributes) \ -+ _GL_EXTERN_C rettype rpl_func parameters_and_attributes -+ -+/* _GL_FUNCDECL_SYS (func, rettype, parameters_and_attributes); -+ declares the system function, named func, with the given prototype, -+ consisting of return type, parameters, and attributes. -+ Example: -+ _GL_FUNCDECL_SYS (open, int, (const char *filename, int flags, ...) -+ _GL_ARG_NONNULL ((1))); -+ */ -+#define _GL_FUNCDECL_SYS(func,rettype,parameters_and_attributes) \ -+ _GL_EXTERN_C rettype func parameters_and_attributes -+ -+/* _GL_CXXALIAS_RPL (func, rettype, parameters); -+ declares a C++ alias called GNULIB_NAMESPACE::func -+ that redirects to rpl_func, if GNULIB_NAMESPACE is defined. -+ Example: -+ _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...)); -+ */ -+#define _GL_CXXALIAS_RPL(func,rettype,parameters) \ -+ _GL_CXXALIAS_RPL_1 (func, rpl_##func, rettype, parameters) -+#if defined __cplusplus && defined GNULIB_NAMESPACE -+# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \ -+ namespace GNULIB_NAMESPACE \ -+ { \ -+ rettype (*const func) parameters = ::rpl_func; \ -+ } \ -+ _GL_EXTERN_C int _gl_cxxalias_dummy -+#else -+# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \ -+ _GL_EXTERN_C int _gl_cxxalias_dummy -+#endif -+ -+/* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters); -+ is like _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters); -+ except that the C function rpl_func may have a slightly different -+ declaration. A cast is used to silence the "invalid conversion" error -+ that would otherwise occur. */ -+#if defined __cplusplus && defined GNULIB_NAMESPACE -+# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \ -+ namespace GNULIB_NAMESPACE \ -+ { \ -+ rettype (*const func) parameters = \ -+ reinterpret_cast(::rpl_func); \ -+ } \ -+ _GL_EXTERN_C int _gl_cxxalias_dummy -+#else -+# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \ -+ _GL_EXTERN_C int _gl_cxxalias_dummy -+#endif -+ -+/* _GL_CXXALIAS_SYS (func, rettype, parameters); -+ declares a C++ alias called GNULIB_NAMESPACE::func -+ that redirects to the system provided function func, if GNULIB_NAMESPACE -+ is defined. -+ Example: -+ _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...)); -+ */ -+#if defined __cplusplus && defined GNULIB_NAMESPACE -+ /* If we were to write -+ rettype (*const func) parameters = ::func; -+ like above in _GL_CXXALIAS_RPL_1, the compiler could optimize calls -+ better (remove an indirection through a 'static' pointer variable), -+ but then the _GL_CXXALIASWARN macro below would cause a warning not only -+ for uses of ::func but also for uses of GNULIB_NAMESPACE::func. */ -+# define _GL_CXXALIAS_SYS(func,rettype,parameters) \ -+ namespace GNULIB_NAMESPACE \ -+ { \ -+ static rettype (*func) parameters = ::func; \ -+ } \ -+ _GL_EXTERN_C int _gl_cxxalias_dummy -+#else -+# define _GL_CXXALIAS_SYS(func,rettype,parameters) \ -+ _GL_EXTERN_C int _gl_cxxalias_dummy -+#endif -+ -+/* _GL_CXXALIAS_SYS_CAST (func, rettype, parameters); -+ is like _GL_CXXALIAS_SYS (func, rettype, parameters); -+ except that the C function func may have a slightly different declaration. -+ A cast is used to silence the "invalid conversion" error that would -+ otherwise occur. */ -+#if defined __cplusplus && defined GNULIB_NAMESPACE -+# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \ -+ namespace GNULIB_NAMESPACE \ -+ { \ -+ static rettype (*func) parameters = \ -+ reinterpret_cast(::func); \ -+ } \ -+ _GL_EXTERN_C int _gl_cxxalias_dummy -+#else -+# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \ -+ _GL_EXTERN_C int _gl_cxxalias_dummy -+#endif -+ -+/* _GL_CXXALIAS_SYS_CAST2 (func, rettype, parameters, rettype2, parameters2); -+ is like _GL_CXXALIAS_SYS (func, rettype, parameters); -+ except that the C function is picked among a set of overloaded functions, -+ namely the one with rettype2 and parameters2. Two consecutive casts -+ are used to silence the "cannot find a match" and "invalid conversion" -+ errors that would otherwise occur. */ -+#if defined __cplusplus && defined GNULIB_NAMESPACE -+ /* The outer cast must be a reinterpret_cast. -+ The inner cast: When the function is defined as a set of overloaded -+ functions, it works as a static_cast<>, choosing the designated variant. -+ When the function is defined as a single variant, it works as a -+ reinterpret_cast<>. The parenthesized cast syntax works both ways. */ -+# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \ -+ namespace GNULIB_NAMESPACE \ -+ { \ -+ static rettype (*func) parameters = \ -+ reinterpret_cast( \ -+ (rettype2(*)parameters2)(::func)); \ -+ } \ -+ _GL_EXTERN_C int _gl_cxxalias_dummy -+#else -+# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \ -+ _GL_EXTERN_C int _gl_cxxalias_dummy -+#endif -+ -+/* _GL_CXXALIASWARN (func); -+ causes a warning to be emitted when ::func is used but not when -+ GNULIB_NAMESPACE::func is used. func must be defined without overloaded -+ variants. */ -+#if defined __cplusplus && defined GNULIB_NAMESPACE -+# define _GL_CXXALIASWARN(func) \ -+ _GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE) -+# define _GL_CXXALIASWARN_1(func,namespace) \ -+ _GL_CXXALIASWARN_2 (func, namespace) -+/* To work around GCC bug , -+ we enable the warning only when not optimizing. */ -+# if !__OPTIMIZE__ -+# define _GL_CXXALIASWARN_2(func,namespace) \ -+ _GL_WARN_ON_USE (func, \ -+ "The symbol ::" #func " refers to the system function. " \ -+ "Use " #namespace "::" #func " instead.") -+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING -+# define _GL_CXXALIASWARN_2(func,namespace) \ -+ extern __typeof__ (func) func -+# else -+# define _GL_CXXALIASWARN_2(func,namespace) \ -+ _GL_EXTERN_C int _gl_cxxalias_dummy -+# endif -+#else -+# define _GL_CXXALIASWARN(func) \ -+ _GL_EXTERN_C int _gl_cxxalias_dummy -+#endif -+ -+/* _GL_CXXALIASWARN1 (func, rettype, parameters_and_attributes); -+ causes a warning to be emitted when the given overloaded variant of ::func -+ is used but not when GNULIB_NAMESPACE::func is used. */ -+#if defined __cplusplus && defined GNULIB_NAMESPACE -+# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \ -+ _GL_CXXALIASWARN1_1 (func, rettype, parameters_and_attributes, \ -+ GNULIB_NAMESPACE) -+# define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace) \ -+ _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace) -+/* To work around GCC bug , -+ we enable the warning only when not optimizing. */ -+# if !__OPTIMIZE__ -+# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \ -+ _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \ -+ "The symbol ::" #func " refers to the system function. " \ -+ "Use " #namespace "::" #func " instead.") -+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING -+# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \ -+ extern __typeof__ (func) func -+# else -+# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \ -+ _GL_EXTERN_C int _gl_cxxalias_dummy -+# endif -+#else -+# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \ -+ _GL_EXTERN_C int _gl_cxxalias_dummy -+#endif -+ -+#endif /* _GL_CXXDEFS_H */ -+ -+/* The definition of _GL_ARG_NONNULL is copied here. */ -+/* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools -+ that the values passed as arguments n, ..., m must be non-NULL pointers. -+ n = 1 stands for the first argument, n = 2 for the second argument etc. */ -+#ifndef _GL_ARG_NONNULL -+# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3 -+# define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params)) -+# else -+# define _GL_ARG_NONNULL(params) -+# endif -+#endif -+ -+/* The definition of _GL_WARN_ON_USE is copied here. */ -+#ifndef _GL_WARN_ON_USE -+ -+# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__) -+/* A compiler attribute is available in gcc versions 4.3.0 and later. */ -+# define _GL_WARN_ON_USE(function, message) \ -+extern __typeof__ (function) function __attribute__ ((__warning__ (message))) -+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING -+/* Verify the existence of the function. */ -+# define _GL_WARN_ON_USE(function, message) \ -+extern __typeof__ (function) function -+# else /* Unsupported. */ -+# define _GL_WARN_ON_USE(function, message) \ -+_GL_WARN_EXTERN_C int _gl_warn_on_use -+# endif -+#endif -+ -+/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string") -+ is like _GL_WARN_ON_USE (function, "string"), except that the function is -+ declared with the given prototype, consisting of return type, parameters, -+ and attributes. -+ This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does -+ not work in this case. */ -+#ifndef _GL_WARN_ON_USE_CXX -+# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__) -+# define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \ -+extern rettype function parameters_and_attributes \ -+ __attribute__ ((__warning__ (msg))) -+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING -+/* Verify the existence of the function. */ -+# define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \ -+extern rettype function parameters_and_attributes -+# else /* Unsupported. */ -+# define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \ -+_GL_WARN_EXTERN_C int _gl_warn_on_use -+# endif -+#endif -+ -+/* _GL_WARN_EXTERN_C declaration; -+ performs the declaration with C linkage. */ -+#ifndef _GL_WARN_EXTERN_C -+# if defined __cplusplus -+# define _GL_WARN_EXTERN_C extern "C" -+# else -+# define _GL_WARN_EXTERN_C extern -+# endif -+#endif -+ -+/* Some systems don't define struct timespec (e.g., AIX 4.1, Ultrix 4.3). -+ Or they define it with the wrong member names or define it in -+ (e.g., FreeBSD circa 1997). Stock Mingw prior to 3.0 does not define it, -+ but the pthreads-win32 library defines it in . */ -+# if ! 1 -+# if 0 -+# include -+# elif 0 -+# include -+# else -+ -+# ifdef __cplusplus -+extern "C" { -+# endif -+ -+# if !GNULIB_defined_struct_timespec -+# undef timespec -+# define timespec rpl_timespec -+struct timespec -+{ -+ time_t tv_sec; -+ long int tv_nsec; -+}; -+# define GNULIB_defined_struct_timespec 1 -+# endif -+ -+# ifdef __cplusplus -+} -+# endif -+ -+# endif -+# endif -+ -+# if !GNULIB_defined_struct_time_t_must_be_integral -+/* Per http://austingroupbugs.net/view.php?id=327, POSIX requires -+ time_t to be an integer type, even though C99 permits floating -+ point. We don't know of any implementation that uses floating -+ point, and it is much easier to write code that doesn't have to -+ worry about that corner case, so we force the issue. */ -+struct __time_t_must_be_integral { -+ unsigned int __floating_time_t_unsupported : (time_t) 1; -+}; -+# define GNULIB_defined_struct_time_t_must_be_integral 1 -+# endif -+ -+/* Sleep for at least RQTP seconds unless interrupted, If interrupted, -+ return -1 and store the remaining time into RMTP. See -+ . */ -+# if 0 -+# if GNULIB_PORTCHECK -+# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+# define nanosleep rpl_nanosleep -+# endif -+_GL_FUNCDECL_RPL (nanosleep, int, -+ (struct timespec const *__rqtp, struct timespec *__rmtp) -+ _GL_ARG_NONNULL ((1))); -+_GL_CXXALIAS_RPL (nanosleep, int, -+ (struct timespec const *__rqtp, struct timespec *__rmtp)); -+# else -+# if ! 1 -+_GL_FUNCDECL_SYS (nanosleep, int, -+ (struct timespec const *__rqtp, struct timespec *__rmtp) -+ _GL_ARG_NONNULL ((1))); -+# endif -+_GL_CXXALIAS_SYS (nanosleep, int, -+ (struct timespec const *__rqtp, struct timespec *__rmtp)); -+# endif -+_GL_CXXALIASWARN (nanosleep); -+# endif -+ -+/* Return the 'time_t' representation of TP and normalize TP. */ -+# if 0 -+# if GNULIB_PORTCHECK -+# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+# define mktime rpl_mktime -+# endif -+_GL_FUNCDECL_RPL (mktime, time_t, (struct tm *__tp) _GL_ARG_NONNULL ((1))); -+_GL_CXXALIAS_RPL (mktime, time_t, (struct tm *__tp)); -+# else -+_GL_CXXALIAS_SYS (mktime, time_t, (struct tm *__tp)); -+# endif -+_GL_CXXALIASWARN (mktime); -+# endif -+ -+/* Convert TIMER to RESULT, assuming local time and UTC respectively. See -+ and -+ . */ -+# if 0 -+# if GNULIB_PORTCHECK -+# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+# undef localtime_r -+# define localtime_r rpl_localtime_r -+# endif -+_GL_FUNCDECL_RPL (localtime_r, struct tm *, (time_t const *restrict __timer, -+ struct tm *restrict __result) -+ _GL_ARG_NONNULL ((1, 2))); -+_GL_CXXALIAS_RPL (localtime_r, struct tm *, (time_t const *restrict __timer, -+ struct tm *restrict __result)); -+# else -+# if ! 1 -+_GL_FUNCDECL_SYS (localtime_r, struct tm *, (time_t const *restrict __timer, -+ struct tm *restrict __result) -+ _GL_ARG_NONNULL ((1, 2))); -+# endif -+_GL_CXXALIAS_SYS (localtime_r, struct tm *, (time_t const *restrict __timer, -+ struct tm *restrict __result)); -+# endif -+# if 1 -+_GL_CXXALIASWARN (localtime_r); -+# endif -+# if GNULIB_PORTCHECK -+# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+# undef gmtime_r -+# define gmtime_r rpl_gmtime_r -+# endif -+_GL_FUNCDECL_RPL (gmtime_r, struct tm *, (time_t const *restrict __timer, -+ struct tm *restrict __result) -+ _GL_ARG_NONNULL ((1, 2))); -+_GL_CXXALIAS_RPL (gmtime_r, struct tm *, (time_t const *restrict __timer, -+ struct tm *restrict __result)); -+# else -+# if ! 1 -+_GL_FUNCDECL_SYS (gmtime_r, struct tm *, (time_t const *restrict __timer, -+ struct tm *restrict __result) -+ _GL_ARG_NONNULL ((1, 2))); -+# endif -+_GL_CXXALIAS_SYS (gmtime_r, struct tm *, (time_t const *restrict __timer, -+ struct tm *restrict __result)); -+# endif -+# if 1 -+_GL_CXXALIASWARN (gmtime_r); -+# endif -+# endif -+ -+/* Convert TIMER to RESULT, assuming local time and UTC respectively. See -+ and -+ . */ -+# if 1 -+# if 0 -+# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+# undef localtime -+# define localtime rpl_localtime -+# endif -+_GL_FUNCDECL_RPL (localtime, struct tm *, (time_t const *__timer) -+ _GL_ARG_NONNULL ((1))); -+_GL_CXXALIAS_RPL (localtime, struct tm *, (time_t const *__timer)); -+# else -+_GL_CXXALIAS_SYS (localtime, struct tm *, (time_t const *__timer)); -+# endif -+_GL_CXXALIASWARN (localtime); -+# endif -+ -+# if 1 -+# if 0 -+# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+# undef gmtime -+# define gmtime rpl_gmtime -+# endif -+_GL_FUNCDECL_RPL (gmtime, struct tm *, (time_t const *__timer) -+ _GL_ARG_NONNULL ((1))); -+_GL_CXXALIAS_RPL (gmtime, struct tm *, (time_t const *__timer)); -+# else -+_GL_CXXALIAS_SYS (gmtime, struct tm *, (time_t const *__timer)); -+# endif -+_GL_CXXALIASWARN (gmtime); -+# endif -+ -+/* Parse BUF as a time stamp, assuming FORMAT specifies its layout, and store -+ the resulting broken-down time into TM. See -+ . */ -+# if 0 -+# if ! 1 -+_GL_FUNCDECL_SYS (strptime, char *, (char const *restrict __buf, -+ char const *restrict __format, -+ struct tm *restrict __tm) -+ _GL_ARG_NONNULL ((1, 2, 3))); -+# endif -+_GL_CXXALIAS_SYS (strptime, char *, (char const *restrict __buf, -+ char const *restrict __format, -+ struct tm *restrict __tm)); -+_GL_CXXALIASWARN (strptime); -+# endif -+ -+/* Convert TM to a time_t value, assuming UTC. */ -+# if 0 -+# if GNULIB_PORTCHECK -+# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+# undef timegm -+# define timegm rpl_timegm -+# endif -+_GL_FUNCDECL_RPL (timegm, time_t, (struct tm *__tm) _GL_ARG_NONNULL ((1))); -+_GL_CXXALIAS_RPL (timegm, time_t, (struct tm *__tm)); -+# else -+# if ! 1 -+_GL_FUNCDECL_SYS (timegm, time_t, (struct tm *__tm) _GL_ARG_NONNULL ((1))); -+# endif -+_GL_CXXALIAS_SYS (timegm, time_t, (struct tm *__tm)); -+# endif -+_GL_CXXALIASWARN (timegm); -+# endif -+ -+/* Encourage applications to avoid unsafe functions that can overrun -+ buffers when given outlandish struct tm values. Portable -+ applications should use strftime (or even sprintf) instead. */ -+# if defined GNULIB_POSIXCHECK -+# undef asctime -+_GL_WARN_ON_USE (asctime, "asctime can overrun buffers in some cases - " -+ "better use strftime (or even sprintf) instead"); -+# endif -+# if defined GNULIB_POSIXCHECK -+# undef asctime_r -+_GL_WARN_ON_USE (asctime, "asctime_r can overrun buffers in some cases - " -+ "better use strftime (or even sprintf) instead"); -+# endif -+# if defined GNULIB_POSIXCHECK -+# undef ctime -+_GL_WARN_ON_USE (asctime, "ctime can overrun buffers in some cases - " -+ "better use strftime (or even sprintf) instead"); -+# endif -+# if defined GNULIB_POSIXCHECK -+# undef ctime_r -+_GL_WARN_ON_USE (asctime, "ctime_r can overrun buffers in some cases - " -+ "better use strftime (or even sprintf) instead"); -+# endif -+ -+#endif -diff --git a/grub-core/gnulib/time.in.h b/grub-core/gnulib/time.in.h -new file mode 100644 -index 00000000000..81abdf46e0b ---- /dev/null -+++ b/grub-core/gnulib/time.in.h -@@ -0,0 +1,274 @@ -+/* A more-standard . -+ -+ Copyright (C) 2007-2014 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3, or (at your option) -+ any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, see . */ -+ -+#if __GNUC__ >= 3 -+@PRAGMA_SYSTEM_HEADER@ -+#endif -+@PRAGMA_COLUMNS@ -+ -+/* Don't get in the way of glibc when it includes time.h merely to -+ declare a few standard symbols, rather than to declare all the -+ symbols. Also, Solaris 8 eventually includes itself -+ recursively; if that is happening, just include the system -+ without adding our own declarations. */ -+#if (defined __need_time_t || defined __need_clock_t \ -+ || defined __need_timespec \ -+ || defined _@GUARD_PREFIX@_TIME_H) -+ -+# @INCLUDE_NEXT@ @NEXT_TIME_H@ -+ -+#else -+ -+# define _@GUARD_PREFIX@_TIME_H -+ -+# @INCLUDE_NEXT@ @NEXT_TIME_H@ -+ -+/* NetBSD 5.0 mis-defines NULL. */ -+# include -+ -+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ -+ -+/* The definition of _GL_ARG_NONNULL is copied here. */ -+ -+/* The definition of _GL_WARN_ON_USE is copied here. */ -+ -+/* Some systems don't define struct timespec (e.g., AIX 4.1, Ultrix 4.3). -+ Or they define it with the wrong member names or define it in -+ (e.g., FreeBSD circa 1997). Stock Mingw prior to 3.0 does not define it, -+ but the pthreads-win32 library defines it in . */ -+# if ! @TIME_H_DEFINES_STRUCT_TIMESPEC@ -+# if @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@ -+# include -+# elif @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@ -+# include -+# else -+ -+# ifdef __cplusplus -+extern "C" { -+# endif -+ -+# if !GNULIB_defined_struct_timespec -+# undef timespec -+# define timespec rpl_timespec -+struct timespec -+{ -+ time_t tv_sec; -+ long int tv_nsec; -+}; -+# define GNULIB_defined_struct_timespec 1 -+# endif -+ -+# ifdef __cplusplus -+} -+# endif -+ -+# endif -+# endif -+ -+# if !GNULIB_defined_struct_time_t_must_be_integral -+/* Per http://austingroupbugs.net/view.php?id=327, POSIX requires -+ time_t to be an integer type, even though C99 permits floating -+ point. We don't know of any implementation that uses floating -+ point, and it is much easier to write code that doesn't have to -+ worry about that corner case, so we force the issue. */ -+struct __time_t_must_be_integral { -+ unsigned int __floating_time_t_unsupported : (time_t) 1; -+}; -+# define GNULIB_defined_struct_time_t_must_be_integral 1 -+# endif -+ -+/* Sleep for at least RQTP seconds unless interrupted, If interrupted, -+ return -1 and store the remaining time into RMTP. See -+ . */ -+# if @GNULIB_NANOSLEEP@ -+# if @REPLACE_NANOSLEEP@ -+# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+# define nanosleep rpl_nanosleep -+# endif -+_GL_FUNCDECL_RPL (nanosleep, int, -+ (struct timespec const *__rqtp, struct timespec *__rmtp) -+ _GL_ARG_NONNULL ((1))); -+_GL_CXXALIAS_RPL (nanosleep, int, -+ (struct timespec const *__rqtp, struct timespec *__rmtp)); -+# else -+# if ! @HAVE_NANOSLEEP@ -+_GL_FUNCDECL_SYS (nanosleep, int, -+ (struct timespec const *__rqtp, struct timespec *__rmtp) -+ _GL_ARG_NONNULL ((1))); -+# endif -+_GL_CXXALIAS_SYS (nanosleep, int, -+ (struct timespec const *__rqtp, struct timespec *__rmtp)); -+# endif -+_GL_CXXALIASWARN (nanosleep); -+# endif -+ -+/* Return the 'time_t' representation of TP and normalize TP. */ -+# if @GNULIB_MKTIME@ -+# if @REPLACE_MKTIME@ -+# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+# define mktime rpl_mktime -+# endif -+_GL_FUNCDECL_RPL (mktime, time_t, (struct tm *__tp) _GL_ARG_NONNULL ((1))); -+_GL_CXXALIAS_RPL (mktime, time_t, (struct tm *__tp)); -+# else -+_GL_CXXALIAS_SYS (mktime, time_t, (struct tm *__tp)); -+# endif -+_GL_CXXALIASWARN (mktime); -+# endif -+ -+/* Convert TIMER to RESULT, assuming local time and UTC respectively. See -+ and -+ . */ -+# if @GNULIB_TIME_R@ -+# if @REPLACE_LOCALTIME_R@ -+# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+# undef localtime_r -+# define localtime_r rpl_localtime_r -+# endif -+_GL_FUNCDECL_RPL (localtime_r, struct tm *, (time_t const *restrict __timer, -+ struct tm *restrict __result) -+ _GL_ARG_NONNULL ((1, 2))); -+_GL_CXXALIAS_RPL (localtime_r, struct tm *, (time_t const *restrict __timer, -+ struct tm *restrict __result)); -+# else -+# if ! @HAVE_DECL_LOCALTIME_R@ -+_GL_FUNCDECL_SYS (localtime_r, struct tm *, (time_t const *restrict __timer, -+ struct tm *restrict __result) -+ _GL_ARG_NONNULL ((1, 2))); -+# endif -+_GL_CXXALIAS_SYS (localtime_r, struct tm *, (time_t const *restrict __timer, -+ struct tm *restrict __result)); -+# endif -+# if @HAVE_DECL_LOCALTIME_R@ -+_GL_CXXALIASWARN (localtime_r); -+# endif -+# if @REPLACE_LOCALTIME_R@ -+# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+# undef gmtime_r -+# define gmtime_r rpl_gmtime_r -+# endif -+_GL_FUNCDECL_RPL (gmtime_r, struct tm *, (time_t const *restrict __timer, -+ struct tm *restrict __result) -+ _GL_ARG_NONNULL ((1, 2))); -+_GL_CXXALIAS_RPL (gmtime_r, struct tm *, (time_t const *restrict __timer, -+ struct tm *restrict __result)); -+# else -+# if ! @HAVE_DECL_LOCALTIME_R@ -+_GL_FUNCDECL_SYS (gmtime_r, struct tm *, (time_t const *restrict __timer, -+ struct tm *restrict __result) -+ _GL_ARG_NONNULL ((1, 2))); -+# endif -+_GL_CXXALIAS_SYS (gmtime_r, struct tm *, (time_t const *restrict __timer, -+ struct tm *restrict __result)); -+# endif -+# if @HAVE_DECL_LOCALTIME_R@ -+_GL_CXXALIASWARN (gmtime_r); -+# endif -+# endif -+ -+/* Convert TIMER to RESULT, assuming local time and UTC respectively. See -+ and -+ . */ -+# if @GNULIB_GETTIMEOFDAY@ -+# if @REPLACE_LOCALTIME@ -+# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+# undef localtime -+# define localtime rpl_localtime -+# endif -+_GL_FUNCDECL_RPL (localtime, struct tm *, (time_t const *__timer) -+ _GL_ARG_NONNULL ((1))); -+_GL_CXXALIAS_RPL (localtime, struct tm *, (time_t const *__timer)); -+# else -+_GL_CXXALIAS_SYS (localtime, struct tm *, (time_t const *__timer)); -+# endif -+_GL_CXXALIASWARN (localtime); -+# endif -+ -+# if @GNULIB_GETTIMEOFDAY@ -+# if @REPLACE_GMTIME@ -+# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+# undef gmtime -+# define gmtime rpl_gmtime -+# endif -+_GL_FUNCDECL_RPL (gmtime, struct tm *, (time_t const *__timer) -+ _GL_ARG_NONNULL ((1))); -+_GL_CXXALIAS_RPL (gmtime, struct tm *, (time_t const *__timer)); -+# else -+_GL_CXXALIAS_SYS (gmtime, struct tm *, (time_t const *__timer)); -+# endif -+_GL_CXXALIASWARN (gmtime); -+# endif -+ -+/* Parse BUF as a time stamp, assuming FORMAT specifies its layout, and store -+ the resulting broken-down time into TM. See -+ . */ -+# if @GNULIB_STRPTIME@ -+# if ! @HAVE_STRPTIME@ -+_GL_FUNCDECL_SYS (strptime, char *, (char const *restrict __buf, -+ char const *restrict __format, -+ struct tm *restrict __tm) -+ _GL_ARG_NONNULL ((1, 2, 3))); -+# endif -+_GL_CXXALIAS_SYS (strptime, char *, (char const *restrict __buf, -+ char const *restrict __format, -+ struct tm *restrict __tm)); -+_GL_CXXALIASWARN (strptime); -+# endif -+ -+/* Convert TM to a time_t value, assuming UTC. */ -+# if @GNULIB_TIMEGM@ -+# if @REPLACE_TIMEGM@ -+# if !(defined __cplusplus && defined GNULIB_NAMESPACE) -+# undef timegm -+# define timegm rpl_timegm -+# endif -+_GL_FUNCDECL_RPL (timegm, time_t, (struct tm *__tm) _GL_ARG_NONNULL ((1))); -+_GL_CXXALIAS_RPL (timegm, time_t, (struct tm *__tm)); -+# else -+# if ! @HAVE_TIMEGM@ -+_GL_FUNCDECL_SYS (timegm, time_t, (struct tm *__tm) _GL_ARG_NONNULL ((1))); -+# endif -+_GL_CXXALIAS_SYS (timegm, time_t, (struct tm *__tm)); -+# endif -+_GL_CXXALIASWARN (timegm); -+# endif -+ -+/* Encourage applications to avoid unsafe functions that can overrun -+ buffers when given outlandish struct tm values. Portable -+ applications should use strftime (or even sprintf) instead. */ -+# if defined GNULIB_POSIXCHECK -+# undef asctime -+_GL_WARN_ON_USE (asctime, "asctime can overrun buffers in some cases - " -+ "better use strftime (or even sprintf) instead"); -+# endif -+# if defined GNULIB_POSIXCHECK -+# undef asctime_r -+_GL_WARN_ON_USE (asctime, "asctime_r can overrun buffers in some cases - " -+ "better use strftime (or even sprintf) instead"); -+# endif -+# if defined GNULIB_POSIXCHECK -+# undef ctime -+_GL_WARN_ON_USE (asctime, "ctime can overrun buffers in some cases - " -+ "better use strftime (or even sprintf) instead"); -+# endif -+# if defined GNULIB_POSIXCHECK -+# undef ctime_r -+_GL_WARN_ON_USE (asctime, "ctime_r can overrun buffers in some cases - " -+ "better use strftime (or even sprintf) instead"); -+# endif -+ -+#endif diff --git a/include/grub/osdep/hostfile_aros.h b/include/grub/osdep/hostfile_aros.h index a059c0fa40a..161fbb7bdfd 100644 --- a/include/grub/osdep/hostfile_aros.h @@ -2432,1300 +80,3 @@ index bf6451b6db4..8c92d0591bb 100644 int grub_util_unlink (const char *name); void -diff --git a/grub-core/gnulib/Makefile.am b/grub-core/gnulib/Makefile.am -index 3444397fe37..b7c5e60e1c3 100644 ---- a/grub-core/gnulib/Makefile.am -+++ b/grub-core/gnulib/Makefile.am -@@ -21,7 +21,7 @@ - # the same distribution terms as the rest of that program. - # - # Generated by gnulib-tool. --# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=grub-core/gnulib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files argp error fnmatch getdelim getline gettext progname regex -+# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=grub-core/gnulib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files argp error fnmatch getdelim getline gettext progname readlink regex - - AUTOMAKE_OPTIONS = 1.5 gnits subdir-objects - -@@ -326,6 +326,15 @@ libgnu_a_SOURCES += gettext.h - - ## end gnulib module gettext-h - -+## begin gnulib module gettimeofday -+ -+ -+EXTRA_DIST += gettimeofday.c -+ -+EXTRA_libgnu_a_SOURCES += gettimeofday.c -+ -+## end gnulib module gettimeofday -+ - ## begin gnulib module havelib - - -@@ -596,6 +605,13 @@ EXTRA_libgnu_a_SOURCES += nl_langinfo.c - - ## end gnulib module nl_langinfo - -+## begin gnulib module pathmax -+ -+ -+EXTRA_DIST += pathmax.h -+ -+## end gnulib module pathmax -+ - ## begin gnulib module progname - - libgnu_a_SOURCES += progname.h progname.c -@@ -611,6 +627,15 @@ EXTRA_libgnu_a_SOURCES += rawmemchr.c - - ## end gnulib module rawmemchr - -+## begin gnulib module readlink -+ -+ -+EXTRA_DIST += readlink.c -+ -+EXTRA_libgnu_a_SOURCES += readlink.c -+ -+## end gnulib module readlink -+ - ## begin gnulib module realloc-posix - - -@@ -725,6 +750,15 @@ EXTRA_DIST += $(top_srcdir)/build-aux/snippet/warn-on-use.h - - ## end gnulib module snippet/warn-on-use - -+## begin gnulib module stat -+ -+ -+EXTRA_DIST += stat.c -+ -+EXTRA_libgnu_a_SOURCES += stat.c -+ -+## end gnulib module stat -+ - ## begin gnulib module stdalign - - BUILT_SOURCES += $(STDALIGN_H) -@@ -1280,6 +1314,102 @@ libgnu_a_SOURCES += strnlen1.h strnlen1.c - - ## end gnulib module strnlen1 - -+## begin gnulib module sys_stat -+ -+BUILT_SOURCES += sys/stat.h -+ -+# We need the following in order to create when the system -+# has one that is incomplete. -+sys/stat.h: sys_stat.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) -+ $(AM_V_at)$(MKDIR_P) sys -+ $(AM_V_GEN)rm -f $@-t $@ && \ -+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ -+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -+ -e 's|@''NEXT_SYS_STAT_H''@|$(NEXT_SYS_STAT_H)|g' \ -+ -e 's|@''WINDOWS_64_BIT_ST_SIZE''@|$(WINDOWS_64_BIT_ST_SIZE)|g' \ -+ -e 's/@''GNULIB_FCHMODAT''@/$(GNULIB_FCHMODAT)/g' \ -+ -e 's/@''GNULIB_FSTAT''@/$(GNULIB_FSTAT)/g' \ -+ -e 's/@''GNULIB_FSTATAT''@/$(GNULIB_FSTATAT)/g' \ -+ -e 's/@''GNULIB_FUTIMENS''@/$(GNULIB_FUTIMENS)/g' \ -+ -e 's/@''GNULIB_LCHMOD''@/$(GNULIB_LCHMOD)/g' \ -+ -e 's/@''GNULIB_LSTAT''@/$(GNULIB_LSTAT)/g' \ -+ -e 's/@''GNULIB_MKDIRAT''@/$(GNULIB_MKDIRAT)/g' \ -+ -e 's/@''GNULIB_MKFIFO''@/$(GNULIB_MKFIFO)/g' \ -+ -e 's/@''GNULIB_MKFIFOAT''@/$(GNULIB_MKFIFOAT)/g' \ -+ -e 's/@''GNULIB_MKNOD''@/$(GNULIB_MKNOD)/g' \ -+ -e 's/@''GNULIB_MKNODAT''@/$(GNULIB_MKNODAT)/g' \ -+ -e 's/@''GNULIB_STAT''@/$(GNULIB_STAT)/g' \ -+ -e 's/@''GNULIB_UTIMENSAT''@/$(GNULIB_UTIMENSAT)/g' \ -+ -e 's|@''HAVE_FCHMODAT''@|$(HAVE_FCHMODAT)|g' \ -+ -e 's|@''HAVE_FSTATAT''@|$(HAVE_FSTATAT)|g' \ -+ -e 's|@''HAVE_FUTIMENS''@|$(HAVE_FUTIMENS)|g' \ -+ -e 's|@''HAVE_LCHMOD''@|$(HAVE_LCHMOD)|g' \ -+ -e 's|@''HAVE_LSTAT''@|$(HAVE_LSTAT)|g' \ -+ -e 's|@''HAVE_MKDIRAT''@|$(HAVE_MKDIRAT)|g' \ -+ -e 's|@''HAVE_MKFIFO''@|$(HAVE_MKFIFO)|g' \ -+ -e 's|@''HAVE_MKFIFOAT''@|$(HAVE_MKFIFOAT)|g' \ -+ -e 's|@''HAVE_MKNOD''@|$(HAVE_MKNOD)|g' \ -+ -e 's|@''HAVE_MKNODAT''@|$(HAVE_MKNODAT)|g' \ -+ -e 's|@''HAVE_UTIMENSAT''@|$(HAVE_UTIMENSAT)|g' \ -+ -e 's|@''REPLACE_FSTAT''@|$(REPLACE_FSTAT)|g' \ -+ -e 's|@''REPLACE_FSTATAT''@|$(REPLACE_FSTATAT)|g' \ -+ -e 's|@''REPLACE_FUTIMENS''@|$(REPLACE_FUTIMENS)|g' \ -+ -e 's|@''REPLACE_LSTAT''@|$(REPLACE_LSTAT)|g' \ -+ -e 's|@''REPLACE_MKDIR''@|$(REPLACE_MKDIR)|g' \ -+ -e 's|@''REPLACE_MKFIFO''@|$(REPLACE_MKFIFO)|g' \ -+ -e 's|@''REPLACE_MKNOD''@|$(REPLACE_MKNOD)|g' \ -+ -e 's|@''REPLACE_STAT''@|$(REPLACE_STAT)|g' \ -+ -e 's|@''REPLACE_UTIMENSAT''@|$(REPLACE_UTIMENSAT)|g' \ -+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ -+ < $(srcdir)/sys_stat.in.h; \ -+ } > $@-t && \ -+ mv $@-t $@ -+MOSTLYCLEANFILES += sys/stat.h sys/stat.h-t -+MOSTLYCLEANDIRS += sys -+ -+EXTRA_DIST += sys_stat.in.h -+ -+## end gnulib module sys_stat -+ -+## begin gnulib module sys_time -+ -+BUILT_SOURCES += sys/time.h -+ -+# We need the following in order to create when the system -+# doesn't have one that works with the given compiler. -+sys/time.h: sys_time.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) -+ $(AM_V_at)$(MKDIR_P) sys -+ $(AM_V_GEN)rm -f $@-t $@ && \ -+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \ -+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -+ -e 's/@''HAVE_SYS_TIME_H''@/$(HAVE_SYS_TIME_H)/g' \ -+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -+ -e 's|@''NEXT_SYS_TIME_H''@|$(NEXT_SYS_TIME_H)|g' \ -+ -e 's/@''GNULIB_GETTIMEOFDAY''@/$(GNULIB_GETTIMEOFDAY)/g' \ -+ -e 's|@''HAVE_WINSOCK2_H''@|$(HAVE_WINSOCK2_H)|g' \ -+ -e 's/@''HAVE_GETTIMEOFDAY''@/$(HAVE_GETTIMEOFDAY)/g' \ -+ -e 's/@''HAVE_STRUCT_TIMEVAL''@/$(HAVE_STRUCT_TIMEVAL)/g' \ -+ -e 's/@''REPLACE_GETTIMEOFDAY''@/$(REPLACE_GETTIMEOFDAY)/g' \ -+ -e 's/@''REPLACE_STRUCT_TIMEVAL''@/$(REPLACE_STRUCT_TIMEVAL)/g' \ -+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ -+ < $(srcdir)/sys_time.in.h; \ -+ } > $@-t && \ -+ mv $@-t $@ -+MOSTLYCLEANFILES += sys/time.h sys/time.h-t -+ -+EXTRA_DIST += sys_time.in.h -+ -+## end gnulib module sys_time -+ - ## begin gnulib module sys_types - - BUILT_SOURCES += sys/types.h -@@ -1334,6 +1464,51 @@ EXTRA_DIST += sysexits.in.h - - ## end gnulib module sysexits - -+## begin gnulib module time -+ -+BUILT_SOURCES += time.h -+ -+# We need the following in order to create when the system -+# doesn't have one that works with the given compiler. -+time.h: time.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H) -+ $(AM_V_GEN)rm -f $@-t $@ && \ -+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ -+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \ -+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \ -+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \ -+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \ -+ -e 's|@''NEXT_TIME_H''@|$(NEXT_TIME_H)|g' \ -+ -e 's/@''GNULIB_GETTIMEOFDAY''@/$(GNULIB_GETTIMEOFDAY)/g' \ -+ -e 's/@''GNULIB_MKTIME''@/$(GNULIB_MKTIME)/g' \ -+ -e 's/@''GNULIB_NANOSLEEP''@/$(GNULIB_NANOSLEEP)/g' \ -+ -e 's/@''GNULIB_STRPTIME''@/$(GNULIB_STRPTIME)/g' \ -+ -e 's/@''GNULIB_TIMEGM''@/$(GNULIB_TIMEGM)/g' \ -+ -e 's/@''GNULIB_TIME_R''@/$(GNULIB_TIME_R)/g' \ -+ -e 's|@''HAVE_DECL_LOCALTIME_R''@|$(HAVE_DECL_LOCALTIME_R)|g' \ -+ -e 's|@''HAVE_NANOSLEEP''@|$(HAVE_NANOSLEEP)|g' \ -+ -e 's|@''HAVE_STRPTIME''@|$(HAVE_STRPTIME)|g' \ -+ -e 's|@''HAVE_TIMEGM''@|$(HAVE_TIMEGM)|g' \ -+ -e 's|@''REPLACE_GMTIME''@|$(REPLACE_GMTIME)|g' \ -+ -e 's|@''REPLACE_LOCALTIME''@|$(REPLACE_LOCALTIME)|g' \ -+ -e 's|@''REPLACE_LOCALTIME_R''@|$(REPLACE_LOCALTIME_R)|g' \ -+ -e 's|@''REPLACE_MKTIME''@|$(REPLACE_MKTIME)|g' \ -+ -e 's|@''REPLACE_NANOSLEEP''@|$(REPLACE_NANOSLEEP)|g' \ -+ -e 's|@''REPLACE_TIMEGM''@|$(REPLACE_TIMEGM)|g' \ -+ -e 's|@''PTHREAD_H_DEFINES_STRUCT_TIMESPEC''@|$(PTHREAD_H_DEFINES_STRUCT_TIMESPEC)|g' \ -+ -e 's|@''SYS_TIME_H_DEFINES_STRUCT_TIMESPEC''@|$(SYS_TIME_H_DEFINES_STRUCT_TIMESPEC)|g' \ -+ -e 's|@''TIME_H_DEFINES_STRUCT_TIMESPEC''@|$(TIME_H_DEFINES_STRUCT_TIMESPEC)|g' \ -+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \ -+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \ -+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \ -+ < $(srcdir)/time.in.h; \ -+ } > $@-t && \ -+ mv $@-t $@ -+MOSTLYCLEANFILES += time.h time.h-t -+ -+EXTRA_DIST += time.in.h -+ -+## end gnulib module time -+ - ## begin gnulib module unistd - - BUILT_SOURCES += unistd.h -diff --git a/m4/gettimeofday.m4 b/m4/gettimeofday.m4 -new file mode 100644 -index 00000000000..1c2d66ee261 ---- /dev/null -+++ b/m4/gettimeofday.m4 -@@ -0,0 +1,138 @@ -+# serial 21 -+ -+# Copyright (C) 2001-2003, 2005, 2007, 2009-2014 Free Software Foundation, Inc. -+# This file is free software; the Free Software Foundation -+# gives unlimited permission to copy and/or distribute it, -+# with or without modifications, as long as this notice is preserved. -+ -+dnl From Jim Meyering. -+ -+AC_DEFUN([gl_FUNC_GETTIMEOFDAY], -+[ -+ AC_REQUIRE([AC_C_RESTRICT]) -+ AC_REQUIRE([gl_HEADER_SYS_TIME_H]) -+ AC_REQUIRE([gl_HEADER_SYS_TIME_H_DEFAULTS]) -+ AC_CHECK_FUNCS_ONCE([gettimeofday]) -+ -+ gl_gettimeofday_timezone=void -+ if test $ac_cv_func_gettimeofday != yes; then -+ HAVE_GETTIMEOFDAY=0 -+ else -+ gl_FUNC_GETTIMEOFDAY_CLOBBER -+ AC_CACHE_CHECK([for gettimeofday with POSIX signature], -+ [gl_cv_func_gettimeofday_posix_signature], -+ [AC_COMPILE_IFELSE( -+ [AC_LANG_PROGRAM( -+ [[#include -+ struct timeval c; -+ int gettimeofday (struct timeval *restrict, void *restrict); -+ ]], -+ [[/* glibc uses struct timezone * rather than the POSIX void * -+ if _GNU_SOURCE is defined. However, since the only portable -+ use of gettimeofday uses NULL as the second parameter, and -+ since the glibc definition is actually more typesafe, it is -+ not worth wrapping this to get a compliant signature. */ -+ int (*f) (struct timeval *restrict, void *restrict) -+ = gettimeofday; -+ int x = f (&c, 0); -+ return !(x | c.tv_sec | c.tv_usec); -+ ]])], -+ [gl_cv_func_gettimeofday_posix_signature=yes], -+ [AC_COMPILE_IFELSE( -+ [AC_LANG_PROGRAM( -+ [[#include -+int gettimeofday (struct timeval *restrict, struct timezone *restrict); -+ ]])], -+ [gl_cv_func_gettimeofday_posix_signature=almost], -+ [gl_cv_func_gettimeofday_posix_signature=no])])]) -+ if test $gl_cv_func_gettimeofday_posix_signature = almost; then -+ gl_gettimeofday_timezone='struct timezone' -+ elif test $gl_cv_func_gettimeofday_posix_signature != yes; then -+ REPLACE_GETTIMEOFDAY=1 -+ fi -+ dnl If we override 'struct timeval', we also have to override gettimeofday. -+ if test $REPLACE_STRUCT_TIMEVAL = 1; then -+ REPLACE_GETTIMEOFDAY=1 -+ fi -+ m4_ifdef([gl_FUNC_TZSET_CLOBBER], [ -+ gl_FUNC_TZSET_CLOBBER -+ case "$gl_cv_func_tzset_clobber" in -+ *yes) -+ REPLACE_GETTIMEOFDAY=1 -+ gl_GETTIMEOFDAY_REPLACE_LOCALTIME -+ AC_DEFINE([tzset], [rpl_tzset], -+ [Define to rpl_tzset if the wrapper function should be used.]) -+ AC_DEFINE([TZSET_CLOBBERS_LOCALTIME], [1], -+ [Define if tzset clobbers localtime's static buffer.]) -+ ;; -+ esac -+ ]) -+ fi -+ AC_DEFINE_UNQUOTED([GETTIMEOFDAY_TIMEZONE], [$gl_gettimeofday_timezone], -+ [Define this to 'void' or 'struct timezone' to match the system's -+ declaration of the second argument to gettimeofday.]) -+]) -+ -+ -+dnl See if gettimeofday clobbers the static buffer that localtime uses -+dnl for its return value. The gettimeofday function from Mac OS X 10.0.4 -+dnl (i.e., Darwin 1.3.7) has this problem. -+dnl -+dnl If it does, then arrange to use gettimeofday and localtime only via -+dnl the wrapper functions that work around the problem. -+ -+AC_DEFUN([gl_FUNC_GETTIMEOFDAY_CLOBBER], -+[ -+ AC_REQUIRE([gl_HEADER_SYS_TIME_H]) -+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles -+ -+ AC_CACHE_CHECK([whether gettimeofday clobbers localtime buffer], -+ [gl_cv_func_gettimeofday_clobber], -+ [AC_RUN_IFELSE( -+ [AC_LANG_PROGRAM( -+ [[#include -+ #include -+ #include -+ #include -+ ]], -+ [[ -+ time_t t = 0; -+ struct tm *lt; -+ struct tm saved_lt; -+ struct timeval tv; -+ lt = localtime (&t); -+ saved_lt = *lt; -+ gettimeofday (&tv, NULL); -+ return memcmp (lt, &saved_lt, sizeof (struct tm)) != 0; -+ ]])], -+ [gl_cv_func_gettimeofday_clobber=no], -+ [gl_cv_func_gettimeofday_clobber=yes], -+ [# When cross-compiling: -+ case "$host_os" in -+ # Guess all is fine on glibc systems. -+ *-gnu*) gl_cv_func_gettimeofday_clobber="guessing no" ;; -+ # If we don't know, assume the worst. -+ *) gl_cv_func_gettimeofday_clobber="guessing yes" ;; -+ esac -+ ])]) -+ -+ case "$gl_cv_func_gettimeofday_clobber" in -+ *yes) -+ REPLACE_GETTIMEOFDAY=1 -+ gl_GETTIMEOFDAY_REPLACE_LOCALTIME -+ AC_DEFINE([GETTIMEOFDAY_CLOBBERS_LOCALTIME], [1], -+ [Define if gettimeofday clobbers the localtime buffer.]) -+ ;; -+ esac -+]) -+ -+AC_DEFUN([gl_GETTIMEOFDAY_REPLACE_LOCALTIME], [ -+ REPLACE_GMTIME=1 -+ REPLACE_LOCALTIME=1 -+]) -+ -+# Prerequisites of lib/gettimeofday.c. -+AC_DEFUN([gl_PREREQ_GETTIMEOFDAY], [ -+ AC_CHECK_HEADERS([sys/timeb.h]) -+ AC_CHECK_FUNCS([_ftime]) -+]) -diff --git a/m4/gnulib-cache.m4 b/m4/gnulib-cache.m4 -index 408918440b6..ef2ec5bcce0 100644 ---- a/m4/gnulib-cache.m4 -+++ b/m4/gnulib-cache.m4 -@@ -27,7 +27,7 @@ - - - # Specification in the form of a command-line invocation: --# gnulib-tool --import --dir=. --lib=libgnu --source-base=grub-core/gnulib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files argp error fnmatch getdelim getline gettext progname regex -+# gnulib-tool --import --dir=. --lib=libgnu --source-base=grub-core/gnulib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files argp error fnmatch getdelim getline gettext progname readlink regex - - # Specification in the form of a few gnulib-tool.m4 macro invocations: - gl_LOCAL_DIR([]) -@@ -39,6 +39,7 @@ gl_MODULES([ - getline - gettext - progname -+ readlink - regex - ]) - gl_AVOID([]) -diff --git a/m4/gnulib-comp.m4 b/m4/gnulib-comp.m4 -index 7a19f60d85e..66fd0eda901 100644 ---- a/m4/gnulib-comp.m4 -+++ b/m4/gnulib-comp.m4 -@@ -60,10 +60,13 @@ AC_DEFUN([gl_EARLY], - # Code from module getopt-posix: - # Code from module gettext: - # Code from module gettext-h: -+ # Code from module gettimeofday: - # Code from module havelib: - # Code from module include_next: - # Code from module intprops: - # Code from module langinfo: -+ # Code from module largefile: -+ AC_REQUIRE([AC_SYS_LARGEFILE]) - # Code from module localcharset: - # Code from module locale: - # Code from module localeconv: -@@ -81,8 +84,10 @@ AC_DEFUN([gl_EARLY], - # Code from module multiarch: - # Code from module nl_langinfo: - # Code from module nocrash: -+ # Code from module pathmax: - # Code from module progname: - # Code from module rawmemchr: -+ # Code from module readlink: - # Code from module realloc-posix: - # Code from module regex: - # Code from module size_max: -@@ -92,6 +97,7 @@ AC_DEFUN([gl_EARLY], - # Code from module snippet/c++defs: - # Code from module snippet/warn-on-use: - # Code from module ssize_t: -+ # Code from module stat: - # Code from module stdalign: - # Code from module stdbool: - # Code from module stddef: -@@ -108,8 +114,11 @@ AC_DEFUN([gl_EARLY], - # Code from module strndup: - # Code from module strnlen: - # Code from module strnlen1: -+ # Code from module sys_stat: -+ # Code from module sys_time: - # Code from module sys_types: - # Code from module sysexits: -+ # Code from module time: - # Code from module unistd: - # Code from module unitypes: - # Code from module uniwidth/base: -@@ -211,7 +220,14 @@ AC_DEFUN([gl_INIT], - AM_GNU_GETTEXT_VERSION([0.18.1]) - AC_SUBST([LIBINTL]) - AC_SUBST([LTLIBINTL]) -+ gl_FUNC_GETTIMEOFDAY -+ if test $HAVE_GETTIMEOFDAY = 0 || test $REPLACE_GETTIMEOFDAY = 1; then -+ AC_LIBOBJ([gettimeofday]) -+ gl_PREREQ_GETTIMEOFDAY -+ fi -+ gl_SYS_TIME_MODULE_INDICATOR([gettimeofday]) - gl_LANGINFO_H -+ AC_REQUIRE([gl_LARGEFILE]) - gl_LOCALCHARSET - LOCALCHARSET_TESTS_ENVIRONMENT="CHARSETALIASDIR=\"\$(abs_top_builddir)/$gl_source_base\"" - AC_SUBST([LOCALCHARSET_TESTS_ENVIRONMENT]) -@@ -284,6 +300,7 @@ AC_DEFUN([gl_INIT], - AC_LIBOBJ([nl_langinfo]) - fi - gl_LANGINFO_MODULE_INDICATOR([nl_langinfo]) -+ gl_PATHMAX - AC_CHECK_DECLS([program_invocation_name], [], [], [#include ]) - AC_CHECK_DECLS([program_invocation_short_name], [], [], [#include ]) - gl_FUNC_RAWMEMCHR -@@ -292,6 +309,12 @@ AC_DEFUN([gl_INIT], - gl_PREREQ_RAWMEMCHR - fi - gl_STRING_MODULE_INDICATOR([rawmemchr]) -+ gl_FUNC_READLINK -+ if test $HAVE_READLINK = 0 || test $REPLACE_READLINK = 1; then -+ AC_LIBOBJ([readlink]) -+ gl_PREREQ_READLINK -+ fi -+ gl_UNISTD_MODULE_INDICATOR([readlink]) - gl_FUNC_REALLOC_POSIX - if test $REPLACE_REALLOC = 1; then - AC_LIBOBJ([realloc]) -@@ -309,6 +332,12 @@ AC_DEFUN([gl_INIT], - fi - gl_UNISTD_MODULE_INDICATOR([sleep]) - gt_TYPE_SSIZE_T -+ gl_FUNC_STAT -+ if test $REPLACE_STAT = 1; then -+ AC_LIBOBJ([stat]) -+ gl_PREREQ_STAT -+ fi -+ gl_SYS_STAT_MODULE_INDICATOR([stat]) - gl_STDALIGN_H - AM_STDBOOL_H - gl_STDDEF_H -@@ -355,9 +384,14 @@ AC_DEFUN([gl_INIT], - gl_PREREQ_STRNLEN - fi - gl_STRING_MODULE_INDICATOR([strnlen]) -+ gl_HEADER_SYS_STAT_H -+ AC_PROG_MKDIR_P -+ gl_HEADER_SYS_TIME_H -+ AC_PROG_MKDIR_P - gl_SYS_TYPES_H - AC_PROG_MKDIR_P - gl_SYSEXITS -+ gl_HEADER_TIME_H - gl_UNISTD_H - gl_LIBUNISTRING_LIBHEADER([0.9], [unitypes.h]) - gl_LIBUNISTRING_LIBHEADER([0.9], [uniwidth.h]) -@@ -562,6 +596,7 @@ AC_DEFUN([gl_FILE_LIST], [ - lib/getopt1.c - lib/getopt_int.h - lib/gettext.h -+ lib/gettimeofday.c - lib/intprops.h - lib/itold.c - lib/langinfo.in.h -@@ -587,6 +622,7 @@ AC_DEFUN([gl_FILE_LIST], [ - lib/msvc-nothrow.c - lib/msvc-nothrow.h - lib/nl_langinfo.c -+ lib/pathmax.h - lib/printf-args.c - lib/printf-args.h - lib/printf-parse.c -@@ -595,6 +631,7 @@ AC_DEFUN([gl_FILE_LIST], [ - lib/progname.h - lib/rawmemchr.c - lib/rawmemchr.valgrind -+ lib/readlink.c - lib/realloc.c - lib/ref-add.sin - lib/ref-del.sin -@@ -606,6 +643,7 @@ AC_DEFUN([gl_FILE_LIST], [ - lib/regexec.c - lib/size_max.h - lib/sleep.c -+ lib/stat.c - lib/stdalign.in.h - lib/stdbool.in.h - lib/stddef.in.h -@@ -627,8 +665,11 @@ AC_DEFUN([gl_FILE_LIST], [ - lib/strnlen.c - lib/strnlen1.c - lib/strnlen1.h -+ lib/sys_stat.in.h -+ lib/sys_time.in.h - lib/sys_types.in.h - lib/sysexits.in.h -+ lib/time.in.h - lib/unistd.c - lib/unistd.in.h - lib/unitypes.in.h -@@ -667,6 +708,7 @@ AC_DEFUN([gl_FILE_LIST], [ - m4/getline.m4 - m4/getopt.m4 - m4/gettext.m4 -+ m4/gettimeofday.m4 - m4/glibc2.m4 - m4/glibc21.m4 - m4/gnulib-common.m4 -@@ -681,6 +723,7 @@ AC_DEFUN([gl_FILE_LIST], [ - m4/inttypes-pri.m4 - m4/inttypes_h.m4 - m4/langinfo_h.m4 -+ m4/largefile.m4 - m4/lcmessage.m4 - m4/lib-ld.m4 - m4/lib-link.m4 -@@ -712,16 +755,19 @@ AC_DEFUN([gl_FILE_LIST], [ - m4/nls.m4 - m4/nocrash.m4 - m4/off_t.m4 -+ m4/pathmax.m4 - m4/po.m4 - m4/printf-posix.m4 - m4/printf.m4 - m4/progtest.m4 - m4/rawmemchr.m4 -+ m4/readlink.m4 - m4/realloc.m4 - m4/regex.m4 - m4/size_max.m4 - m4/sleep.m4 - m4/ssize_t.m4 -+ m4/stat.m4 - m4/stdalign.m4 - m4/stdbool.m4 - m4/stddef_h.m4 -@@ -737,9 +783,12 @@ AC_DEFUN([gl_FILE_LIST], [ - m4/strndup.m4 - m4/strnlen.m4 - m4/sys_socket_h.m4 -+ m4/sys_stat_h.m4 -+ m4/sys_time_h.m4 - m4/sys_types_h.m4 - m4/sysexits.m4 - m4/threadlib.m4 -+ m4/time_h.m4 - m4/uintmax_t.m4 - m4/unistd_h.m4 - m4/vasnprintf.m4 -diff --git a/m4/largefile.m4 b/m4/largefile.m4 -new file mode 100644 -index 00000000000..a1b564ad9af ---- /dev/null -+++ b/m4/largefile.m4 -@@ -0,0 +1,146 @@ -+# Enable large files on systems where this is not the default. -+ -+# Copyright 1992-1996, 1998-2014 Free Software Foundation, Inc. -+# This file is free software; the Free Software Foundation -+# gives unlimited permission to copy and/or distribute it, -+# with or without modifications, as long as this notice is preserved. -+ -+# The following implementation works around a problem in autoconf <= 2.69; -+# AC_SYS_LARGEFILE does not configure for large inodes on Mac OS X 10.5, -+# or configures them incorrectly in some cases. -+m4_version_prereq([2.70], [] ,[ -+ -+# _AC_SYS_LARGEFILE_TEST_INCLUDES -+# ------------------------------- -+m4_define([_AC_SYS_LARGEFILE_TEST_INCLUDES], -+[@%:@include -+ /* Check that off_t can represent 2**63 - 1 correctly. -+ We can't simply define LARGE_OFF_T to be 9223372036854775807, -+ since some C++ compilers masquerading as C compilers -+ incorrectly reject 9223372036854775807. */ -+@%:@define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) -+ int off_t_is_large[[(LARGE_OFF_T % 2147483629 == 721 -+ && LARGE_OFF_T % 2147483647 == 1) -+ ? 1 : -1]];[]dnl -+]) -+ -+ -+# _AC_SYS_LARGEFILE_MACRO_VALUE(C-MACRO, VALUE, -+# CACHE-VAR, -+# DESCRIPTION, -+# PROLOGUE, [FUNCTION-BODY]) -+# -------------------------------------------------------- -+m4_define([_AC_SYS_LARGEFILE_MACRO_VALUE], -+[AC_CACHE_CHECK([for $1 value needed for large files], [$3], -+[while :; do -+ m4_ifval([$6], [AC_LINK_IFELSE], [AC_COMPILE_IFELSE])( -+ [AC_LANG_PROGRAM([$5], [$6])], -+ [$3=no; break]) -+ m4_ifval([$6], [AC_LINK_IFELSE], [AC_COMPILE_IFELSE])( -+ [AC_LANG_PROGRAM([@%:@define $1 $2 -+$5], [$6])], -+ [$3=$2; break]) -+ $3=unknown -+ break -+done]) -+case $$3 in #( -+ no | unknown) ;; -+ *) AC_DEFINE_UNQUOTED([$1], [$$3], [$4]);; -+esac -+rm -rf conftest*[]dnl -+])# _AC_SYS_LARGEFILE_MACRO_VALUE -+ -+ -+# AC_SYS_LARGEFILE -+# ---------------- -+# By default, many hosts won't let programs access large files; -+# one must use special compiler options to get large-file access to work. -+# For more details about this brain damage please see: -+# http://www.unix-systems.org/version2/whatsnew/lfs20mar.html -+AC_DEFUN([AC_SYS_LARGEFILE], -+[AC_ARG_ENABLE(largefile, -+ [ --disable-largefile omit support for large files]) -+if test "$enable_largefile" != no; then -+ -+ AC_CACHE_CHECK([for special C compiler options needed for large files], -+ ac_cv_sys_largefile_CC, -+ [ac_cv_sys_largefile_CC=no -+ if test "$GCC" != yes; then -+ ac_save_CC=$CC -+ while :; do -+ # IRIX 6.2 and later do not support large files by default, -+ # so use the C compiler's -n32 option if that helps. -+ AC_LANG_CONFTEST([AC_LANG_PROGRAM([_AC_SYS_LARGEFILE_TEST_INCLUDES])]) -+ AC_COMPILE_IFELSE([], [break]) -+ CC="$CC -n32" -+ AC_COMPILE_IFELSE([], [ac_cv_sys_largefile_CC=' -n32'; break]) -+ break -+ done -+ CC=$ac_save_CC -+ rm -f conftest.$ac_ext -+ fi]) -+ if test "$ac_cv_sys_largefile_CC" != no; then -+ CC=$CC$ac_cv_sys_largefile_CC -+ fi -+ -+ _AC_SYS_LARGEFILE_MACRO_VALUE(_FILE_OFFSET_BITS, 64, -+ ac_cv_sys_file_offset_bits, -+ [Number of bits in a file offset, on hosts where this is settable.], -+ [_AC_SYS_LARGEFILE_TEST_INCLUDES]) -+ if test $ac_cv_sys_file_offset_bits = unknown; then -+ _AC_SYS_LARGEFILE_MACRO_VALUE(_LARGE_FILES, 1, -+ ac_cv_sys_large_files, -+ [Define for large files, on AIX-style hosts.], -+ [_AC_SYS_LARGEFILE_TEST_INCLUDES]) -+ fi -+ -+ AC_DEFINE([_DARWIN_USE_64_BIT_INODE], [1], -+ [Enable large inode numbers on Mac OS X 10.5.]) -+fi -+])# AC_SYS_LARGEFILE -+])# m4_version_prereq 2.70 -+ -+# Enable large files on systems where this is implemented by Gnulib, not by the -+# system headers. -+# Set the variables WINDOWS_64_BIT_OFF_T, WINDOWS_64_BIT_ST_SIZE if Gnulib -+# overrides ensure that off_t or 'struct size.st_size' are 64-bit, respectively. -+AC_DEFUN([gl_LARGEFILE], -+[ -+ AC_REQUIRE([AC_CANONICAL_HOST]) -+ case "$host_os" in -+ mingw*) -+ dnl Native Windows. -+ dnl mingw64 defines off_t to a 64-bit type already, if -+ dnl _FILE_OFFSET_BITS=64, which is ensured by AC_SYS_LARGEFILE. -+ AC_CACHE_CHECK([for 64-bit off_t], [gl_cv_type_off_t_64], -+ [AC_COMPILE_IFELSE( -+ [AC_LANG_PROGRAM( -+ [[#include -+ int verify_off_t_size[sizeof (off_t) >= 8 ? 1 : -1]; -+ ]], -+ [[]])], -+ [gl_cv_type_off_t_64=yes], [gl_cv_type_off_t_64=no]) -+ ]) -+ if test $gl_cv_type_off_t_64 = no; then -+ WINDOWS_64_BIT_OFF_T=1 -+ else -+ WINDOWS_64_BIT_OFF_T=0 -+ fi -+ dnl But all native Windows platforms (including mingw64) have a 32-bit -+ dnl st_size member in 'struct stat'. -+ WINDOWS_64_BIT_ST_SIZE=1 -+ ;; -+ *) -+ dnl Nothing to do on gnulib's side. -+ dnl A 64-bit off_t is -+ dnl - already the default on Mac OS X, FreeBSD, NetBSD, OpenBSD, IRIX, -+ dnl OSF/1, Cygwin, -+ dnl - enabled by _FILE_OFFSET_BITS=64 (ensured by AC_SYS_LARGEFILE) on -+ dnl glibc, HP-UX, Solaris, -+ dnl - enabled by _LARGE_FILES=1 (ensured by AC_SYS_LARGEFILE) on AIX, -+ dnl - impossible to achieve on Minix 3.1.8. -+ WINDOWS_64_BIT_OFF_T=0 -+ WINDOWS_64_BIT_ST_SIZE=0 -+ ;; -+ esac -+]) -diff --git a/m4/pathmax.m4 b/m4/pathmax.m4 -new file mode 100644 -index 00000000000..114f91f04b5 ---- /dev/null -+++ b/m4/pathmax.m4 -@@ -0,0 +1,42 @@ -+# pathmax.m4 serial 10 -+dnl Copyright (C) 2002-2003, 2005-2006, 2009-2014 Free Software Foundation, -+dnl Inc. -+dnl This file is free software; the Free Software Foundation -+dnl gives unlimited permission to copy and/or distribute it, -+dnl with or without modifications, as long as this notice is preserved. -+ -+AC_DEFUN([gl_PATHMAX], -+[ -+ dnl Prerequisites of lib/pathmax.h. -+ AC_CHECK_HEADERS_ONCE([sys/param.h]) -+]) -+ -+# Expands to a piece of C program that defines PATH_MAX in the same way as -+# "pathmax.h" will do. -+AC_DEFUN([gl_PATHMAX_SNIPPET], [[ -+/* Arrange to define PATH_MAX, like "pathmax.h" does. */ -+#if HAVE_UNISTD_H -+# include -+#endif -+#include -+#if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN -+# include -+#endif -+#if !defined PATH_MAX && defined MAXPATHLEN -+# define PATH_MAX MAXPATHLEN -+#endif -+#ifdef __hpux -+# undef PATH_MAX -+# define PATH_MAX 1024 -+#endif -+#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ -+# undef PATH_MAX -+# define PATH_MAX 260 -+#endif -+]]) -+ -+# Prerequisites of gl_PATHMAX_SNIPPET. -+AC_DEFUN([gl_PATHMAX_SNIPPET_PREREQ], -+[ -+ AC_CHECK_HEADERS_ONCE([unistd.h sys/param.h]) -+]) -diff --git a/m4/readlink.m4 b/m4/readlink.m4 -new file mode 100644 -index 00000000000..f9ce868c2e4 ---- /dev/null -+++ b/m4/readlink.m4 -@@ -0,0 +1,71 @@ -+# readlink.m4 serial 12 -+dnl Copyright (C) 2003, 2007, 2009-2014 Free Software Foundation, Inc. -+dnl This file is free software; the Free Software Foundation -+dnl gives unlimited permission to copy and/or distribute it, -+dnl with or without modifications, as long as this notice is preserved. -+ -+AC_DEFUN([gl_FUNC_READLINK], -+[ -+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) -+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles -+ AC_CHECK_FUNCS_ONCE([readlink]) -+ if test $ac_cv_func_readlink = no; then -+ HAVE_READLINK=0 -+ else -+ AC_CACHE_CHECK([whether readlink signature is correct], -+ [gl_cv_decl_readlink_works], -+ [AC_COMPILE_IFELSE( -+ [AC_LANG_PROGRAM( -+ [[#include -+ /* Cause compilation failure if original declaration has wrong type. */ -+ ssize_t readlink (const char *, char *, size_t);]])], -+ [gl_cv_decl_readlink_works=yes], [gl_cv_decl_readlink_works=no])]) -+ dnl Solaris 9 ignores trailing slash. -+ dnl FreeBSD 7.2 dereferences only one level of links with trailing slash. -+ AC_CACHE_CHECK([whether readlink handles trailing slash correctly], -+ [gl_cv_func_readlink_works], -+ [# We have readlink, so assume ln -s works. -+ ln -s conftest.no-such conftest.link -+ ln -s conftest.link conftest.lnk2 -+ AC_RUN_IFELSE( -+ [AC_LANG_PROGRAM( -+ [[#include -+]], [[char buf[20]; -+ return readlink ("conftest.lnk2/", buf, sizeof buf) != -1;]])], -+ [gl_cv_func_readlink_works=yes], [gl_cv_func_readlink_works=no], -+ [case "$host_os" in -+ # Guess yes on glibc systems. -+ *-gnu*) gl_cv_func_readlink_works="guessing yes" ;; -+ # If we don't know, assume the worst. -+ *) gl_cv_func_readlink_works="guessing no" ;; -+ esac -+ ]) -+ rm -f conftest.link conftest.lnk2]) -+ case "$gl_cv_func_readlink_works" in -+ *yes) -+ if test "$gl_cv_decl_readlink_works" != yes; then -+ REPLACE_READLINK=1 -+ fi -+ ;; -+ *) -+ AC_DEFINE([READLINK_TRAILING_SLASH_BUG], [1], [Define to 1 if readlink -+ fails to recognize a trailing slash.]) -+ REPLACE_READLINK=1 -+ ;; -+ esac -+ fi -+]) -+ -+# Like gl_FUNC_READLINK, except prepare for separate compilation -+# (no REPLACE_READLINK, no AC_LIBOBJ). -+AC_DEFUN([gl_FUNC_READLINK_SEPARATE], -+[ -+ AC_CHECK_FUNCS_ONCE([readlink]) -+ gl_PREREQ_READLINK -+]) -+ -+# Prerequisites of lib/readlink.c. -+AC_DEFUN([gl_PREREQ_READLINK], -+[ -+ : -+]) -diff --git a/m4/stat.m4 b/m4/stat.m4 -new file mode 100644 -index 00000000000..1ae327b3684 ---- /dev/null -+++ b/m4/stat.m4 -@@ -0,0 +1,71 @@ -+# serial 11 -+ -+# Copyright (C) 2009-2014 Free Software Foundation, Inc. -+# -+# This file is free software; the Free Software Foundation -+# gives unlimited permission to copy and/or distribute it, -+# with or without modifications, as long as this notice is preserved. -+ -+AC_DEFUN([gl_FUNC_STAT], -+[ -+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles -+ AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS]) -+ AC_CHECK_FUNCS_ONCE([lstat]) -+ dnl mingw is the only known platform where stat(".") and stat("./") differ -+ AC_CACHE_CHECK([whether stat handles trailing slashes on directories], -+ [gl_cv_func_stat_dir_slash], -+ [AC_RUN_IFELSE( -+ [AC_LANG_PROGRAM( -+ [[#include -+]], [[struct stat st; return stat (".", &st) != stat ("./", &st);]])], -+ [gl_cv_func_stat_dir_slash=yes], [gl_cv_func_stat_dir_slash=no], -+ [case $host_os in -+ mingw*) gl_cv_func_stat_dir_slash="guessing no";; -+ *) gl_cv_func_stat_dir_slash="guessing yes";; -+ esac])]) -+ dnl AIX 7.1, Solaris 9, mingw64 mistakenly succeed on stat("file/"). -+ dnl (For mingw, this is due to a broken stat() override in libmingwex.a.) -+ dnl FreeBSD 7.2 mistakenly succeeds on stat("link-to-file/"). -+ AC_CACHE_CHECK([whether stat handles trailing slashes on files], -+ [gl_cv_func_stat_file_slash], -+ [touch conftest.tmp -+ # Assume that if we have lstat, we can also check symlinks. -+ if test $ac_cv_func_lstat = yes; then -+ ln -s conftest.tmp conftest.lnk -+ fi -+ AC_RUN_IFELSE( -+ [AC_LANG_PROGRAM( -+ [[#include -+]], [[int result = 0; -+ struct stat st; -+ if (!stat ("conftest.tmp/", &st)) -+ result |= 1; -+#if HAVE_LSTAT -+ if (!stat ("conftest.lnk/", &st)) -+ result |= 2; -+#endif -+ return result; -+ ]])], -+ [gl_cv_func_stat_file_slash=yes], [gl_cv_func_stat_file_slash=no], -+ [case "$host_os" in -+ # Guess yes on glibc systems. -+ *-gnu*) gl_cv_func_stat_file_slash="guessing yes" ;; -+ # If we don't know, assume the worst. -+ *) gl_cv_func_stat_file_slash="guessing no" ;; -+ esac -+ ]) -+ rm -f conftest.tmp conftest.lnk]) -+ case $gl_cv_func_stat_dir_slash in -+ *no) REPLACE_STAT=1 -+ AC_DEFINE([REPLACE_FUNC_STAT_DIR], [1], [Define to 1 if stat needs -+ help when passed a directory name with a trailing slash]);; -+ esac -+ case $gl_cv_func_stat_file_slash in -+ *no) REPLACE_STAT=1 -+ AC_DEFINE([REPLACE_FUNC_STAT_FILE], [1], [Define to 1 if stat needs -+ help when passed a file name with a trailing slash]);; -+ esac -+]) -+ -+# Prerequisites of lib/stat.c. -+AC_DEFUN([gl_PREREQ_STAT], [:]) -diff --git a/m4/sys_stat_h.m4 b/m4/sys_stat_h.m4 -new file mode 100644 -index 00000000000..eaa7642ba31 ---- /dev/null -+++ b/m4/sys_stat_h.m4 -@@ -0,0 +1,96 @@ -+# sys_stat_h.m4 serial 28 -*- Autoconf -*- -+dnl Copyright (C) 2006-2014 Free Software Foundation, Inc. -+dnl This file is free software; the Free Software Foundation -+dnl gives unlimited permission to copy and/or distribute it, -+dnl with or without modifications, as long as this notice is preserved. -+ -+dnl From Eric Blake. -+dnl Provide a GNU-like . -+ -+AC_DEFUN([gl_HEADER_SYS_STAT_H], -+[ -+ AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS]) -+ -+ dnl Check for broken stat macros. -+ AC_REQUIRE([AC_HEADER_STAT]) -+ -+ gl_CHECK_NEXT_HEADERS([sys/stat.h]) -+ -+ dnl Ensure the type mode_t gets defined. -+ AC_REQUIRE([AC_TYPE_MODE_T]) -+ -+ dnl Whether to override 'struct stat'. -+ m4_ifdef([gl_LARGEFILE], [ -+ AC_REQUIRE([gl_LARGEFILE]) -+ ], [ -+ WINDOWS_64_BIT_ST_SIZE=0 -+ ]) -+ AC_SUBST([WINDOWS_64_BIT_ST_SIZE]) -+ if test $WINDOWS_64_BIT_ST_SIZE = 1; then -+ AC_DEFINE([_GL_WINDOWS_64_BIT_ST_SIZE], [1], -+ [Define to 1 if Gnulib overrides 'struct stat' on Windows so that -+ struct stat.st_size becomes 64-bit.]) -+ fi -+ -+ dnl Define types that are supposed to be defined in or -+ dnl . -+ AC_CHECK_TYPE([nlink_t], [], -+ [AC_DEFINE([nlink_t], [int], -+ [Define to the type of st_nlink in struct stat, or a supertype.])], -+ [#include -+ #include ]) -+ -+ dnl Check for declarations of anything we want to poison if the -+ dnl corresponding gnulib module is not in use. -+ gl_WARN_ON_USE_PREPARE([[#include -+ ]], [fchmodat fstat fstatat futimens lchmod lstat mkdirat mkfifo mkfifoat -+ mknod mknodat stat utimensat]) -+]) # gl_HEADER_SYS_STAT_H -+ -+AC_DEFUN([gl_SYS_STAT_MODULE_INDICATOR], -+[ -+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. -+ AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS]) -+ gl_MODULE_INDICATOR_SET_VARIABLE([$1]) -+ dnl Define it also as a C macro, for the benefit of the unit tests. -+ gl_MODULE_INDICATOR_FOR_TESTS([$1]) -+]) -+ -+AC_DEFUN([gl_SYS_STAT_H_DEFAULTS], -+[ -+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) dnl for REPLACE_FCHDIR -+ GNULIB_FCHMODAT=0; AC_SUBST([GNULIB_FCHMODAT]) -+ GNULIB_FSTAT=0; AC_SUBST([GNULIB_FSTAT]) -+ GNULIB_FSTATAT=0; AC_SUBST([GNULIB_FSTATAT]) -+ GNULIB_FUTIMENS=0; AC_SUBST([GNULIB_FUTIMENS]) -+ GNULIB_LCHMOD=0; AC_SUBST([GNULIB_LCHMOD]) -+ GNULIB_LSTAT=0; AC_SUBST([GNULIB_LSTAT]) -+ GNULIB_MKDIRAT=0; AC_SUBST([GNULIB_MKDIRAT]) -+ GNULIB_MKFIFO=0; AC_SUBST([GNULIB_MKFIFO]) -+ GNULIB_MKFIFOAT=0; AC_SUBST([GNULIB_MKFIFOAT]) -+ GNULIB_MKNOD=0; AC_SUBST([GNULIB_MKNOD]) -+ GNULIB_MKNODAT=0; AC_SUBST([GNULIB_MKNODAT]) -+ GNULIB_STAT=0; AC_SUBST([GNULIB_STAT]) -+ GNULIB_UTIMENSAT=0; AC_SUBST([GNULIB_UTIMENSAT]) -+ dnl Assume proper GNU behavior unless another module says otherwise. -+ HAVE_FCHMODAT=1; AC_SUBST([HAVE_FCHMODAT]) -+ HAVE_FSTATAT=1; AC_SUBST([HAVE_FSTATAT]) -+ HAVE_FUTIMENS=1; AC_SUBST([HAVE_FUTIMENS]) -+ HAVE_LCHMOD=1; AC_SUBST([HAVE_LCHMOD]) -+ HAVE_LSTAT=1; AC_SUBST([HAVE_LSTAT]) -+ HAVE_MKDIRAT=1; AC_SUBST([HAVE_MKDIRAT]) -+ HAVE_MKFIFO=1; AC_SUBST([HAVE_MKFIFO]) -+ HAVE_MKFIFOAT=1; AC_SUBST([HAVE_MKFIFOAT]) -+ HAVE_MKNOD=1; AC_SUBST([HAVE_MKNOD]) -+ HAVE_MKNODAT=1; AC_SUBST([HAVE_MKNODAT]) -+ HAVE_UTIMENSAT=1; AC_SUBST([HAVE_UTIMENSAT]) -+ REPLACE_FSTAT=0; AC_SUBST([REPLACE_FSTAT]) -+ REPLACE_FSTATAT=0; AC_SUBST([REPLACE_FSTATAT]) -+ REPLACE_FUTIMENS=0; AC_SUBST([REPLACE_FUTIMENS]) -+ REPLACE_LSTAT=0; AC_SUBST([REPLACE_LSTAT]) -+ REPLACE_MKDIR=0; AC_SUBST([REPLACE_MKDIR]) -+ REPLACE_MKFIFO=0; AC_SUBST([REPLACE_MKFIFO]) -+ REPLACE_MKNOD=0; AC_SUBST([REPLACE_MKNOD]) -+ REPLACE_STAT=0; AC_SUBST([REPLACE_STAT]) -+ REPLACE_UTIMENSAT=0; AC_SUBST([REPLACE_UTIMENSAT]) -+]) -diff --git a/m4/sys_time_h.m4 b/m4/sys_time_h.m4 -new file mode 100644 -index 00000000000..5c79300f8ec ---- /dev/null -+++ b/m4/sys_time_h.m4 -@@ -0,0 +1,110 @@ -+# Configure a replacement for . -+# serial 8 -+ -+# Copyright (C) 2007, 2009-2014 Free Software Foundation, Inc. -+# This file is free software; the Free Software Foundation -+# gives unlimited permission to copy and/or distribute it, -+# with or without modifications, as long as this notice is preserved. -+ -+# Written by Paul Eggert and Martin Lambers. -+ -+AC_DEFUN([gl_HEADER_SYS_TIME_H], -+[ -+ dnl Use AC_REQUIRE here, so that the REPLACE_GETTIMEOFDAY=0 statement -+ dnl below is expanded once only, before all REPLACE_GETTIMEOFDAY=1 -+ dnl statements that occur in other macros. -+ AC_REQUIRE([gl_HEADER_SYS_TIME_H_BODY]) -+]) -+ -+AC_DEFUN([gl_HEADER_SYS_TIME_H_BODY], -+[ -+ AC_REQUIRE([AC_C_RESTRICT]) -+ AC_REQUIRE([gl_HEADER_SYS_TIME_H_DEFAULTS]) -+ AC_CHECK_HEADERS_ONCE([sys/time.h]) -+ gl_CHECK_NEXT_HEADERS([sys/time.h]) -+ -+ if test $ac_cv_header_sys_time_h != yes; then -+ HAVE_SYS_TIME_H=0 -+ fi -+ -+ dnl On native Windows with MSVC, 'struct timeval' is defined in -+ dnl only. So include that header in the list. -+ gl_PREREQ_SYS_H_WINSOCK2 -+ AC_CACHE_CHECK([for struct timeval], [gl_cv_sys_struct_timeval], -+ [AC_COMPILE_IFELSE( -+ [AC_LANG_PROGRAM( -+ [[#if HAVE_SYS_TIME_H -+ #include -+ #endif -+ #include -+ #if HAVE_WINSOCK2_H -+ # include -+ #endif -+ ]], -+ [[static struct timeval x; x.tv_sec = x.tv_usec;]])], -+ [gl_cv_sys_struct_timeval=yes], -+ [gl_cv_sys_struct_timeval=no]) -+ ]) -+ if test $gl_cv_sys_struct_timeval != yes; then -+ HAVE_STRUCT_TIMEVAL=0 -+ else -+ dnl On native Windows with a 64-bit 'time_t', 'struct timeval' is defined -+ dnl (in and for mingw64, in only -+ dnl for MSVC) with a tv_sec field of type 'long' (32-bit!), which is -+ dnl smaller than the 'time_t' type mandated by POSIX. -+ dnl On OpenBSD 5.1 amd64, tv_sec is 64 bits and time_t 32 bits, but -+ dnl that is good enough. -+ AC_CACHE_CHECK([for wide-enough struct timeval.tv_sec member], -+ [gl_cv_sys_struct_timeval_tv_sec], -+ [AC_COMPILE_IFELSE( -+ [AC_LANG_PROGRAM( -+ [[#if HAVE_SYS_TIME_H -+ #include -+ #endif -+ #include -+ #if HAVE_WINSOCK2_H -+ # include -+ #endif -+ ]], -+ [[static struct timeval x; -+ typedef int verify_tv_sec_type[ -+ sizeof (time_t) <= sizeof x.tv_sec ? 1 : -1 -+ ]; -+ ]])], -+ [gl_cv_sys_struct_timeval_tv_sec=yes], -+ [gl_cv_sys_struct_timeval_tv_sec=no]) -+ ]) -+ if test $gl_cv_sys_struct_timeval_tv_sec != yes; then -+ REPLACE_STRUCT_TIMEVAL=1 -+ fi -+ fi -+ -+ dnl Check for declarations of anything we want to poison if the -+ dnl corresponding gnulib module is not in use. -+ gl_WARN_ON_USE_PREPARE([[ -+#if HAVE_SYS_TIME_H -+# include -+#endif -+#include -+ ]], [gettimeofday]) -+]) -+ -+AC_DEFUN([gl_SYS_TIME_MODULE_INDICATOR], -+[ -+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. -+ AC_REQUIRE([gl_HEADER_SYS_TIME_H_DEFAULTS]) -+ gl_MODULE_INDICATOR_SET_VARIABLE([$1]) -+ dnl Define it also as a C macro, for the benefit of the unit tests. -+ gl_MODULE_INDICATOR_FOR_TESTS([$1]) -+]) -+ -+AC_DEFUN([gl_HEADER_SYS_TIME_H_DEFAULTS], -+[ -+ GNULIB_GETTIMEOFDAY=0; AC_SUBST([GNULIB_GETTIMEOFDAY]) -+ dnl Assume POSIX behavior unless another module says otherwise. -+ HAVE_GETTIMEOFDAY=1; AC_SUBST([HAVE_GETTIMEOFDAY]) -+ HAVE_STRUCT_TIMEVAL=1; AC_SUBST([HAVE_STRUCT_TIMEVAL]) -+ HAVE_SYS_TIME_H=1; AC_SUBST([HAVE_SYS_TIME_H]) -+ REPLACE_GETTIMEOFDAY=0; AC_SUBST([REPLACE_GETTIMEOFDAY]) -+ REPLACE_STRUCT_TIMEVAL=0; AC_SUBST([REPLACE_STRUCT_TIMEVAL]) -+]) -diff --git a/m4/time_h.m4 b/m4/time_h.m4 -new file mode 100644 -index 00000000000..9852778f9a5 ---- /dev/null -+++ b/m4/time_h.m4 -@@ -0,0 +1,118 @@ -+# Configure a more-standard replacement for . -+ -+# Copyright (C) 2000-2001, 2003-2007, 2009-2014 Free Software Foundation, Inc. -+ -+# serial 8 -+ -+# This file is free software; the Free Software Foundation -+# gives unlimited permission to copy and/or distribute it, -+# with or without modifications, as long as this notice is preserved. -+ -+# Written by Paul Eggert and Jim Meyering. -+ -+AC_DEFUN([gl_HEADER_TIME_H], -+[ -+ dnl Use AC_REQUIRE here, so that the default behavior below is expanded -+ dnl once only, before all statements that occur in other macros. -+ AC_REQUIRE([gl_HEADER_TIME_H_BODY]) -+]) -+ -+AC_DEFUN([gl_HEADER_TIME_H_BODY], -+[ -+ AC_REQUIRE([AC_C_RESTRICT]) -+ AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS]) -+ gl_NEXT_HEADERS([time.h]) -+ AC_REQUIRE([gl_CHECK_TYPE_STRUCT_TIMESPEC]) -+]) -+ -+dnl Check whether 'struct timespec' is declared -+dnl in time.h, sys/time.h, or pthread.h. -+ -+AC_DEFUN([gl_CHECK_TYPE_STRUCT_TIMESPEC], -+[ -+ AC_CHECK_HEADERS_ONCE([sys/time.h]) -+ AC_CACHE_CHECK([for struct timespec in ], -+ [gl_cv_sys_struct_timespec_in_time_h], -+ [AC_COMPILE_IFELSE( -+ [AC_LANG_PROGRAM( -+ [[#include -+ ]], -+ [[static struct timespec x; x.tv_sec = x.tv_nsec;]])], -+ [gl_cv_sys_struct_timespec_in_time_h=yes], -+ [gl_cv_sys_struct_timespec_in_time_h=no])]) -+ -+ TIME_H_DEFINES_STRUCT_TIMESPEC=0 -+ SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=0 -+ PTHREAD_H_DEFINES_STRUCT_TIMESPEC=0 -+ if test $gl_cv_sys_struct_timespec_in_time_h = yes; then -+ TIME_H_DEFINES_STRUCT_TIMESPEC=1 -+ else -+ AC_CACHE_CHECK([for struct timespec in ], -+ [gl_cv_sys_struct_timespec_in_sys_time_h], -+ [AC_COMPILE_IFELSE( -+ [AC_LANG_PROGRAM( -+ [[#include -+ ]], -+ [[static struct timespec x; x.tv_sec = x.tv_nsec;]])], -+ [gl_cv_sys_struct_timespec_in_sys_time_h=yes], -+ [gl_cv_sys_struct_timespec_in_sys_time_h=no])]) -+ if test $gl_cv_sys_struct_timespec_in_sys_time_h = yes; then -+ SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=1 -+ else -+ AC_CACHE_CHECK([for struct timespec in ], -+ [gl_cv_sys_struct_timespec_in_pthread_h], -+ [AC_COMPILE_IFELSE( -+ [AC_LANG_PROGRAM( -+ [[#include -+ ]], -+ [[static struct timespec x; x.tv_sec = x.tv_nsec;]])], -+ [gl_cv_sys_struct_timespec_in_pthread_h=yes], -+ [gl_cv_sys_struct_timespec_in_pthread_h=no])]) -+ if test $gl_cv_sys_struct_timespec_in_pthread_h = yes; then -+ PTHREAD_H_DEFINES_STRUCT_TIMESPEC=1 -+ fi -+ fi -+ fi -+ AC_SUBST([TIME_H_DEFINES_STRUCT_TIMESPEC]) -+ AC_SUBST([SYS_TIME_H_DEFINES_STRUCT_TIMESPEC]) -+ AC_SUBST([PTHREAD_H_DEFINES_STRUCT_TIMESPEC]) -+]) -+ -+AC_DEFUN([gl_TIME_MODULE_INDICATOR], -+[ -+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only. -+ AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS]) -+ gl_MODULE_INDICATOR_SET_VARIABLE([$1]) -+ dnl Define it also as a C macro, for the benefit of the unit tests. -+ gl_MODULE_INDICATOR_FOR_TESTS([$1]) -+]) -+ -+AC_DEFUN([gl_HEADER_TIME_H_DEFAULTS], -+[ -+ GNULIB_MKTIME=0; AC_SUBST([GNULIB_MKTIME]) -+ GNULIB_NANOSLEEP=0; AC_SUBST([GNULIB_NANOSLEEP]) -+ GNULIB_STRPTIME=0; AC_SUBST([GNULIB_STRPTIME]) -+ GNULIB_TIMEGM=0; AC_SUBST([GNULIB_TIMEGM]) -+ GNULIB_TIME_R=0; AC_SUBST([GNULIB_TIME_R]) -+ dnl Assume proper GNU behavior unless another module says otherwise. -+ HAVE_DECL_LOCALTIME_R=1; AC_SUBST([HAVE_DECL_LOCALTIME_R]) -+ HAVE_NANOSLEEP=1; AC_SUBST([HAVE_NANOSLEEP]) -+ HAVE_STRPTIME=1; AC_SUBST([HAVE_STRPTIME]) -+ HAVE_TIMEGM=1; AC_SUBST([HAVE_TIMEGM]) -+ dnl If another module says to replace or to not replace, do that. -+ dnl Otherwise, replace only if someone compiles with -DGNULIB_PORTCHECK; -+ dnl this lets maintainers check for portability. -+ REPLACE_LOCALTIME_R=GNULIB_PORTCHECK; AC_SUBST([REPLACE_LOCALTIME_R]) -+ REPLACE_MKTIME=GNULIB_PORTCHECK; AC_SUBST([REPLACE_MKTIME]) -+ REPLACE_NANOSLEEP=GNULIB_PORTCHECK; AC_SUBST([REPLACE_NANOSLEEP]) -+ REPLACE_TIMEGM=GNULIB_PORTCHECK; AC_SUBST([REPLACE_TIMEGM]) -+ -+ dnl Hack so that the time module doesn't depend on the sys_time module. -+ dnl First, default GNULIB_GETTIMEOFDAY to 0 if sys_time is absent. -+ : ${GNULIB_GETTIMEOFDAY=0}; AC_SUBST([GNULIB_GETTIMEOFDAY]) -+ dnl Second, it's OK to not use GNULIB_PORTCHECK for REPLACE_GMTIME -+ dnl and REPLACE_LOCALTIME, as portability to Solaris 2.6 and earlier -+ dnl is no longer a big deal. -+ REPLACE_GMTIME=0; AC_SUBST([REPLACE_GMTIME]) -+ REPLACE_LOCALTIME=0; AC_SUBST([REPLACE_LOCALTIME]) -+]) diff --git a/0052-Make-editenv-chase-symlinks-including-those-across-d.patch b/0052-Make-editenv-chase-symlinks-including-those-across-d.patch index 2f23fda..288feba 100644 --- a/0052-Make-editenv-chase-symlinks-including-those-across-d.patch +++ b/0052-Make-editenv-chase-symlinks-including-those-across-d.patch @@ -16,10 +16,10 @@ Reviewed-by: Adam Jackson 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/Makefile.util.def b/Makefile.util.def -index c7b775bce73..3efc5718ae8 100644 +index 8717774d510..1f298d05f3d 100644 --- a/Makefile.util.def +++ b/Makefile.util.def -@@ -231,8 +231,19 @@ program = { +@@ -240,8 +240,19 @@ program = { common = util/grub-editenv.c; common = util/editenv.c; @@ -40,7 +40,7 @@ index c7b775bce73..3efc5718ae8 100644 ldadd = libgrubgcry.a; ldadd = libgrubkern.a; diff --git a/util/editenv.c b/util/editenv.c -index c6f8d2298c3..d8d1dad6ab9 100644 +index eb2d0c03a98..e61dc1283a4 100644 --- a/util/editenv.c +++ b/util/editenv.c @@ -37,6 +37,7 @@ grub_util_create_envblk_file (const char *name) @@ -51,7 +51,7 @@ index c6f8d2298c3..d8d1dad6ab9 100644 buf = xmalloc (DEFAULT_ENVBLK_SIZE); -@@ -59,7 +60,48 @@ grub_util_create_envblk_file (const char *name) +@@ -60,7 +61,48 @@ grub_util_create_envblk_file (const char *name) free (buf); fclose (fp); diff --git a/0053-Generate-OS-and-CLASS-in-10_linux-from-etc-os-releas.patch b/0053-Generate-OS-and-CLASS-in-10_linux-from-etc-os-releas.patch index 81e0e52..6acd50e 100644 --- a/0053-Generate-OS-and-CLASS-in-10_linux-from-etc-os-releas.patch +++ b/0053-Generate-OS-and-CLASS-in-10_linux-from-etc-os-releas.patch @@ -14,7 +14,7 @@ Signed-off-by: Peter Jones 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in -index b744438e04a..43d98476b88 100644 +index d35b0f406bc..d12d2d784dc 100644 --- a/util/grub.d/10_linux.in +++ b/util/grub.d/10_linux.in @@ -29,7 +29,8 @@ export TEXTDOMAINDIR="@localedir@" diff --git a/0055-Try-prefix-if-fw_path-doesn-t-work.patch b/0055-Try-prefix-if-fw_path-doesn-t-work.patch index 6878d1a..6c167e9 100644 --- a/0055-Try-prefix-if-fw_path-doesn-t-work.patch +++ b/0055-Try-prefix-if-fw_path-doesn-t-work.patch @@ -1,6 +1,6 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Peter Jones -Date: Fri, 3 Oct 2014 11:08:03 -0400 +Date: Tue, 9 Jul 2019 10:35:16 +0200 Subject: [PATCH] Try $prefix if $fw_path doesn't work. Related: rhbz#1148652 @@ -13,10 +13,10 @@ Signed-off-by: Peter Jones 3 files changed, 75 insertions(+), 75 deletions(-) diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c -index f5423ce27d9..e01bc6eab19 100644 +index e71d1584164..0cd2a627231 100644 --- a/grub-core/kern/ieee1275/init.c +++ b/grub-core/kern/ieee1275/init.c -@@ -124,23 +124,25 @@ grub_machine_get_bootlocation (char **device, char **path) +@@ -127,23 +127,25 @@ grub_machine_get_bootlocation (char **device, char **path) grub_free (canon); } else @@ -56,7 +56,7 @@ index f5423ce27d9..e01bc6eab19 100644 } diff --git a/grub-core/net/net.c b/grub-core/net/net.c -index 0769bf850d3..16d2ce06d5a 100644 +index 06454564b8f..4b7972b8e7e 100644 --- a/grub-core/net/net.c +++ b/grub-core/net/net.c @@ -1850,7 +1850,7 @@ grub_net_search_configfile (char *config) @@ -69,7 +69,7 @@ index 0769bf850d3..16d2ce06d5a 100644 static struct grub_preboot *fini_hnd; diff --git a/grub-core/normal/main.c b/grub-core/normal/main.c -index cf5c0b273ce..ea749f26fd5 100644 +index d93bee613ac..2fe6743399d 100644 --- a/grub-core/normal/main.c +++ b/grub-core/normal/main.c @@ -337,74 +337,72 @@ grub_enter_normal_mode (const char *config) @@ -89,31 +89,31 @@ index cf5c0b273ce..ea749f26fd5 100644 + + if (grub_strncmp (prefix + 1, "tftp", sizeof ("tftp") - 1) == 0) + { -+ grub_size_t config_len; -+ config_len = grub_strlen (prefix) + -+ sizeof ("/grub.cfg-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"); -+ config = grub_malloc (config_len); ++ grub_size_t config_len; ++ config_len = grub_strlen (prefix) + ++ sizeof ("/grub.cfg-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"); ++ config = grub_malloc (config_len); + -+ if (! config) -+ return GRUB_ERR_FILE_NOT_FOUND; ++ if (! config) ++ return GRUB_ERR_FILE_NOT_FOUND; + -+ grub_snprintf (config, config_len, "%s/grub.cfg", prefix); -+ err = grub_net_search_configfile (config); ++ grub_snprintf (config, config_len, "%s/grub.cfg", prefix); ++ err = grub_net_search_configfile (config); + } + + if (err != GRUB_ERR_NONE) + { -+ config = grub_xasprintf ("%s/grub.cfg", prefix); -+ if (config) -+ { -+ grub_file_t file; -+ file = grub_file_open (config); -+ if (file) -+ { -+ grub_file_close (file); -+ err = GRUB_ERR_NONE; -+ } -+ } ++ config = grub_xasprintf ("%s/grub.cfg", prefix); ++ if (config) ++ { ++ grub_file_t file; ++ file = grub_file_open (config, GRUB_FILE_TYPE_CONFIG); ++ if (file) ++ { ++ grub_file_close (file); ++ err = GRUB_ERR_NONE; ++ } ++ } + } + + if (err == GRUB_ERR_NONE) @@ -141,52 +141,52 @@ index cf5c0b273ce..ea749f26fd5 100644 - prefix = grub_env_get ("prefix"); - - if (prefix) -- { -- if (grub_strncmp (prefix + 1, "tftp", sizeof ("tftp") - 1) == 0) -- { -- grub_size_t config_len; -- config_len = grub_strlen (prefix) + -- sizeof ("/grub.cfg-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"); -- config = grub_malloc (config_len); +- { +- if (grub_strncmp (prefix + 1, "tftp", sizeof ("tftp") - 1) == 0) +- { +- grub_size_t config_len; +- config_len = grub_strlen (prefix) + +- sizeof ("/grub.cfg-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"); +- config = grub_malloc (config_len); - -- if (! config) -- goto quit; +- if (! config) +- goto quit; - -- grub_snprintf (config, config_len, "%s/grub.cfg", prefix); +- grub_snprintf (config, config_len, "%s/grub.cfg", prefix); - -- grub_net_search_configfile (config); +- grub_net_search_configfile (config); - -- grub_enter_normal_mode (config); -- grub_free (config); -- config = NULL; -- } +- grub_enter_normal_mode (config); +- grub_free (config); +- config = NULL; +- } - -- if (!config) -- { -- config = grub_xasprintf ("%s/grub.cfg", prefix); -- if (config) -- { -- grub_file_t file; +- if (!config) +- { +- config = grub_xasprintf ("%s/grub.cfg", prefix); +- if (config) +- { +- grub_file_t file; - -- file = grub_file_open (config); -- if (file) -- { -- grub_file_close (file); -- grub_enter_normal_mode (config); -- } -- else -- { -- /* Ignore all errors. */ -- grub_errno = 0; -- } -- grub_free (config); -- } -- } -- } +- file = grub_file_open (config, GRUB_FILE_TYPE_CONFIG); +- if (file) +- { +- grub_file_close (file); +- grub_enter_normal_mode (config); +- } +- else +- { +- /* Ignore all errors. */ +- grub_errno = 0; +- } +- grub_free (config); +- } +- } +- } - else -- { -- grub_enter_normal_mode (0); -- } +- { +- grub_enter_normal_mode (0); +- } - } - else + if (argc) diff --git a/0056-Update-info-with-grub.cfg-netboot-selection-order-11.patch b/0056-Update-info-with-grub.cfg-netboot-selection-order-11.patch index 26de3f4..afa3203 100644 --- a/0056-Update-info-with-grub.cfg-netboot-selection-order-11.patch +++ b/0056-Update-info-with-grub.cfg-netboot-selection-order-11.patch @@ -12,7 +12,7 @@ Resolves rhbz#1148650 1 file changed, 42 insertions(+) diff --git a/docs/grub.texi b/docs/grub.texi -index 2fd32608c01..a7155c22ffe 100644 +index 6f524305085..221064b5679 100644 --- a/docs/grub.texi +++ b/docs/grub.texi @@ -2493,6 +2493,48 @@ grub-mknetdir --net-directory=/srv/tftp --subdir=/boot/grub -d /usr/lib/grub/i38 diff --git a/0057-Use-Distribution-Package-Sort-for-grub2-mkconfig-112.patch b/0057-Use-Distribution-Package-Sort-for-grub2-mkconfig-112.patch index 305480a..bfebe38 100644 --- a/0057-Use-Distribution-Package-Sort-for-grub2-mkconfig-112.patch +++ b/0057-Use-Distribution-Package-Sort-for-grub2-mkconfig-112.patch @@ -17,18 +17,17 @@ Signed-off-by: Peter Jones configure.ac | 29 +++++ Makefile.util.def | 16 +++ util/grub-rpm-sort.c | 281 ++++++++++++++++++++++++++++++++++++++++++++++ - .gitignore | 2 + util/grub-mkconfig_lib.in | 11 +- util/grub-rpm-sort.8 | 12 ++ - 6 files changed, 350 insertions(+), 1 deletion(-) + 5 files changed, 348 insertions(+), 1 deletion(-) create mode 100644 util/grub-rpm-sort.c create mode 100644 util/grub-rpm-sort.8 diff --git a/configure.ac b/configure.ac -index d5db2803ec4..00f1db29b1a 100644 +index 8df400e0a8b..6927615819b 100644 --- a/configure.ac +++ b/configure.ac -@@ -65,6 +65,7 @@ grub_TRANSFORM([grub-mkrelpath]) +@@ -69,6 +69,7 @@ grub_TRANSFORM([grub-mkrelpath]) grub_TRANSFORM([grub-mkrescue]) grub_TRANSFORM([grub-probe]) grub_TRANSFORM([grub-reboot]) @@ -36,7 +35,7 @@ index d5db2803ec4..00f1db29b1a 100644 grub_TRANSFORM([grub-script-check]) grub_TRANSFORM([grub-set-default]) grub_TRANSFORM([grub-sparc64-setup]) -@@ -88,6 +89,7 @@ grub_TRANSFORM([grub-mkrescue.1]) +@@ -92,6 +93,7 @@ grub_TRANSFORM([grub-mkrescue.1]) grub_TRANSFORM([grub-mkstandalone.3]) grub_TRANSFORM([grub-ofpathname.3]) grub_TRANSFORM([grub-probe.3]) @@ -44,7 +43,7 @@ index d5db2803ec4..00f1db29b1a 100644 grub_TRANSFORM([grub-reboot.3]) grub_TRANSFORM([grub-render-label.3]) grub_TRANSFORM([grub-script-check.3]) -@@ -1790,6 +1792,33 @@ fi +@@ -1802,6 +1804,33 @@ fi AC_SUBST([LIBDEVMAPPER]) @@ -79,10 +78,10 @@ index d5db2803ec4..00f1db29b1a 100644 if test x$host_kernel = xkfreebsd; then AC_CHECK_LIB([geom], [geom_gettree], [], diff --git a/Makefile.util.def b/Makefile.util.def -index 3efc5718ae8..bb21c87c8ed 100644 +index 1f298d05f3d..843ce092b94 100644 --- a/Makefile.util.def +++ b/Makefile.util.def -@@ -687,6 +687,22 @@ program = { +@@ -696,6 +696,22 @@ program = { ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; }; @@ -97,8 +96,8 @@ index 3efc5718ae8..bb21c87c8ed 100644 + common = util/misc.c; + common = util/grub-rpm-sort.c; + -+ ldadd = grub-core/gnulib/libgnu.a; + ldadd = libgrubkern.a; ++ ldadd = grub-core/lib/gnulib/libgnu.a; + ldadd = '$(LIBDEVMAPPER) $(LIBRPM)'; +}; + @@ -392,19 +391,6 @@ index 00000000000..f33bd1ed568 + + return 0; +} -diff --git a/.gitignore b/.gitignore -index 43f04d47277..fa2e5b609b1 100644 ---- a/.gitignore -+++ b/.gitignore -@@ -105,6 +105,8 @@ grub-*.tar.* - /grub*-reboot.8 - /grub*-render-label - /grub*-render-label.1 -+/grub*-rpm-sort -+/grub*-rpm-sort.8 - /grub*-script-check - /grub*-script-check.1 - /grub*-set-default diff --git a/util/grub-mkconfig_lib.in b/util/grub-mkconfig_lib.in index 1a4a57898f9..113a41f9409 100644 --- a/util/grub-mkconfig_lib.in diff --git a/0059-Make-grub2-mkconfig-construct-titles-that-look-like-.patch b/0059-Make-grub2-mkconfig-construct-titles-that-look-like-.patch index 3bbaa1d..635a234 100644 --- a/0059-Make-grub2-mkconfig-construct-titles-that-look-like-.patch +++ b/0059-Make-grub2-mkconfig-construct-titles-that-look-like-.patch @@ -12,7 +12,7 @@ Signed-off-by: Peter Jones 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in -index 43d98476b88..a8a8e2cf325 100644 +index d12d2d784dc..12a20c9ad73 100644 --- a/util/grub.d/10_linux.in +++ b/util/grub.d/10_linux.in @@ -78,6 +78,32 @@ case x"$GRUB_FS" in diff --git a/0060-Add-friendly-grub2-password-config-tool-985962.patch b/0060-Add-friendly-grub2-password-config-tool-985962.patch index 838d2f4..5374425 100644 --- a/0060-Add-friendly-grub2-password-config-tool-985962.patch +++ b/0060-Add-friendly-grub2-password-config-tool-985962.patch @@ -17,21 +17,20 @@ Andy Lutomirski --- configure.ac | 1 + Makefile.util.def | 13 +++++ - .gitignore | 2 + util/grub-mkconfig.in | 2 + util/grub-set-password.8 | 28 ++++++++++ util/grub-set-password.in | 128 ++++++++++++++++++++++++++++++++++++++++++++++ util/grub.d/01_users.in | 11 ++++ - 7 files changed, 185 insertions(+) + 6 files changed, 183 insertions(+) create mode 100644 util/grub-set-password.8 create mode 100644 util/grub-set-password.in create mode 100644 util/grub.d/01_users.in diff --git a/configure.ac b/configure.ac -index 00f1db29b1a..1cb6a9615db 100644 +index 6927615819b..68501662e8d 100644 --- a/configure.ac +++ b/configure.ac -@@ -65,6 +65,7 @@ grub_TRANSFORM([grub-mkrelpath]) +@@ -69,6 +69,7 @@ grub_TRANSFORM([grub-mkrelpath]) grub_TRANSFORM([grub-mkrescue]) grub_TRANSFORM([grub-probe]) grub_TRANSFORM([grub-reboot]) @@ -40,10 +39,10 @@ index 00f1db29b1a..1cb6a9615db 100644 grub_TRANSFORM([grub-script-check]) grub_TRANSFORM([grub-set-default]) diff --git a/Makefile.util.def b/Makefile.util.def -index bb21c87c8ed..7729e65c607 100644 +index 843ce092b94..e50436a4987 100644 --- a/Makefile.util.def +++ b/Makefile.util.def -@@ -442,6 +442,12 @@ script = { +@@ -451,6 +451,12 @@ script = { installdir = grubconf; }; @@ -56,7 +55,7 @@ index bb21c87c8ed..7729e65c607 100644 script = { name = '10_windows'; common = util/grub.d/10_windows.in; -@@ -724,6 +730,13 @@ script = { +@@ -733,6 +739,13 @@ script = { installdir = sbin; }; @@ -70,21 +69,8 @@ index bb21c87c8ed..7729e65c607 100644 script = { name = grub-mkconfig_lib; common = util/grub-mkconfig_lib.in; -diff --git a/.gitignore b/.gitignore -index fa2e5b609b1..141684867d1 100644 ---- a/.gitignore -+++ b/.gitignore -@@ -111,6 +111,8 @@ grub-*.tar.* - /grub*-script-check.1 - /grub*-set-default - /grub*-set-default.8 -+/grub*-set-password -+/grub*-set-password.8 - /grub*-shell - /grub*-shell-tester - /grub*-sparc64-setup diff --git a/util/grub-mkconfig.in b/util/grub-mkconfig.in -index f68d4925ee6..bdb9982aefb 100644 +index c645351dd2a..4e7a875309e 100644 --- a/util/grub-mkconfig.in +++ b/util/grub-mkconfig.in @@ -282,6 +282,8 @@ for i in "${grub_mkconfig_dir}"/* ; do diff --git a/0063-Add-a-url-parser.patch b/0063-Add-a-url-parser.patch index 34edd4e..d6047fb 100644 --- a/0063-Add-a-url-parser.patch +++ b/0063-Add-a-url-parser.patch @@ -20,10 +20,10 @@ Signed-off-by: Peter Jones create mode 100644 include/grub/net/url.h diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def -index 8bd220a41ba..d0c8a8b1908 100644 +index 57e253ab1a1..99466b1e47e 100644 --- a/grub-core/Makefile.core.def +++ b/grub-core/Makefile.core.def -@@ -2188,6 +2188,7 @@ module = { +@@ -2284,6 +2284,7 @@ module = { common = net/ethernet.c; common = net/arp.c; common = net/netbuff.c; @@ -923,7 +923,7 @@ index 00000000000..146858284cd +} +#endif diff --git a/include/grub/misc.h b/include/grub/misc.h -index 83fd69f4ada..fcaf1201e39 100644 +index f9135b62e35..b4339222ecb 100644 --- a/include/grub/misc.h +++ b/include/grub/misc.h @@ -85,6 +85,7 @@ int EXPORT_FUNC(grub_strncmp) (const char *s1, const char *s2, grub_size_t n); diff --git a/0064-efinet-and-bootp-add-support-for-dhcpv6.patch b/0064-efinet-and-bootp-add-support-for-dhcpv6.patch index 8c97d2c..3f190ff 100644 --- a/0064-efinet-and-bootp-add-support-for-dhcpv6.patch +++ b/0064-efinet-and-bootp-add-support-for-dhcpv6.patch @@ -1,6 +1,6 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Peter Jones -Date: Wed, 8 Jun 2016 21:03:37 -0400 +Date: Tue, 9 Jul 2019 11:47:37 +0200 Subject: [PATCH] efinet and bootp: add support for dhcpv6 Signed-off-by: Peter Jones @@ -14,7 +14,7 @@ Signed-off-by: Peter Jones 6 files changed, 479 insertions(+), 14 deletions(-) diff --git a/grub-core/net/bootp.c b/grub-core/net/bootp.c -index f03eeab2fb4..da3e454466b 100644 +index 0e6e41a1699..8c969595a7b 100644 --- a/grub-core/net/bootp.c +++ b/grub-core/net/bootp.c @@ -23,6 +23,7 @@ @@ -24,10 +24,10 @@ index f03eeab2fb4..da3e454466b 100644 +#include #include - static char * -@@ -349,6 +350,179 @@ grub_net_configure_by_dhcp_ack (const char *name, - return inter; - } + struct grub_dhcp_discover_options +@@ -935,6 +936,179 @@ grub_cmd_bootp (struct grub_command *cmd __attribute__ ((unused)), + + static grub_command_t cmd_getdhcp, cmd_bootp, cmd_dhcp; +struct grub_net_network_level_interface * +grub_net_configure_by_dhcpv6_ack (const char *name, @@ -203,8 +203,8 @@ index f03eeab2fb4..da3e454466b 100644 + + void - grub_net_process_dhcp (struct grub_net_buff *nb, - struct grub_net_card *card) + grub_bootp_init (void) + { diff --git a/grub-core/net/drivers/efi/efinet.c b/grub-core/net/drivers/efi/efinet.c index 5388f952ba9..a57189e8bb3 100644 --- a/grub-core/net/drivers/efi/efinet.c @@ -316,7 +316,7 @@ index 5388f952ba9..a57189e8bb3 100644 } } diff --git a/grub-core/net/net.c b/grub-core/net/net.c -index 16d2ce06d5a..4be228d9576 100644 +index 4b7972b8e7e..f24f1fd63f6 100644 --- a/grub-core/net/net.c +++ b/grub-core/net/net.c @@ -955,6 +955,78 @@ grub_net_network_level_interface_register (struct grub_net_network_level_interfa @@ -427,7 +427,7 @@ index 7d90bf66e76..1157524fc50 100644 grub_free (data); return grub_errno; diff --git a/include/grub/efi/api.h b/include/grub/efi/api.h -index c7c9f0e1db1..28b6adf7648 100644 +index addcbfa8fb7..d97cdf98c80 100644 --- a/include/grub/efi/api.h +++ b/include/grub/efi/api.h @@ -572,10 +572,16 @@ typedef void *grub_efi_handle_t; @@ -582,10 +582,10 @@ index c7c9f0e1db1..28b6adf7648 100644 typedef struct grub_efi_pxe diff --git a/include/grub/net.h b/include/grub/net.h -index 50d62ab0c8c..f8f3ec13acc 100644 +index ff6d347f7da..3647012374b 100644 --- a/include/grub/net.h +++ b/include/grub/net.h -@@ -442,6 +442,51 @@ struct grub_net_bootp_packet +@@ -447,6 +447,51 @@ struct grub_net_bootp_packet grub_uint8_t vendor[0]; } GRUB_PACKED; @@ -637,7 +637,7 @@ index 50d62ab0c8c..f8f3ec13acc 100644 #define GRUB_NET_BOOTP_RFC1048_MAGIC_0 0x63 #define GRUB_NET_BOOTP_RFC1048_MAGIC_1 0x82 #define GRUB_NET_BOOTP_RFC1048_MAGIC_2 0x53 -@@ -470,6 +515,21 @@ grub_net_configure_by_dhcp_ack (const char *name, +@@ -482,6 +527,21 @@ grub_net_configure_by_dhcp_ack (const char *name, grub_size_t size, int is_def, char **device, char **path); diff --git a/0065-Add-grub-get-kernel-settings-and-use-it-in-10_linux.patch b/0065-Add-grub-get-kernel-settings-and-use-it-in-10_linux.patch index ab50e84..00611dc 100644 --- a/0065-Add-grub-get-kernel-settings-and-use-it-in-10_linux.patch +++ b/0065-Add-grub-get-kernel-settings-and-use-it-in-10_linux.patch @@ -13,21 +13,20 @@ Resolves: rhbz#1226325 --- configure.ac | 2 + Makefile.util.def | 7 ++ - .gitignore | 2 + util/bash-completion.d/grub-completion.bash.in | 22 +++++++ util/grub-get-kernel-settings.3 | 20 ++++++ util/grub-get-kernel-settings.in | 88 ++++++++++++++++++++++++++ util/grub-mkconfig.in | 3 + util/grub.d/10_linux.in | 23 +++++-- - 8 files changed, 162 insertions(+), 5 deletions(-) + 7 files changed, 160 insertions(+), 5 deletions(-) create mode 100644 util/grub-get-kernel-settings.3 create mode 100644 util/grub-get-kernel-settings.in diff --git a/configure.ac b/configure.ac -index 1cb6a9615db..2a6fde5be81 100644 +index 68501662e8d..fc3c2b44d60 100644 --- a/configure.ac +++ b/configure.ac -@@ -58,6 +58,7 @@ grub_TRANSFORM([grub-install]) +@@ -62,6 +62,7 @@ grub_TRANSFORM([grub-install]) grub_TRANSFORM([grub-mkconfig]) grub_TRANSFORM([grub-mkfont]) grub_TRANSFORM([grub-mkimage]) @@ -35,7 +34,7 @@ index 1cb6a9615db..2a6fde5be81 100644 grub_TRANSFORM([grub-glue-efi]) grub_TRANSFORM([grub-mklayout]) grub_TRANSFORM([grub-mkpasswd-pbkdf2]) -@@ -75,6 +76,7 @@ grub_TRANSFORM([grub-file]) +@@ -79,6 +80,7 @@ grub_TRANSFORM([grub-file]) grub_TRANSFORM([grub-bios-setup.3]) grub_TRANSFORM([grub-editenv.1]) grub_TRANSFORM([grub-fstest.3]) @@ -44,10 +43,10 @@ index 1cb6a9615db..2a6fde5be81 100644 grub_TRANSFORM([grub-install.1]) grub_TRANSFORM([grub-kbdcomp.3]) diff --git a/Makefile.util.def b/Makefile.util.def -index 7729e65c607..c39b3ce6aa9 100644 +index e50436a4987..2215cc759c0 100644 --- a/Makefile.util.def +++ b/Makefile.util.def -@@ -716,6 +716,13 @@ script = { +@@ -725,6 +725,13 @@ script = { installdir = sbin; }; @@ -61,19 +60,6 @@ index 7729e65c607..c39b3ce6aa9 100644 script = { name = grub-set-default; common = util/grub-set-default.in; -diff --git a/.gitignore b/.gitignore -index 141684867d1..096eeff7de8 100644 ---- a/.gitignore -+++ b/.gitignore -@@ -68,6 +68,8 @@ grub-*.tar.* - /grub*-fs-tester - /grub*-fstest - /grub*-fstest.1 -+/grub*-get-kernel-settings -+/grub*-get-kernel-settings.3 - /grub*-glue-efi - /grub*-glue-efi.1 - /grub*-install diff --git a/util/bash-completion.d/grub-completion.bash.in b/util/bash-completion.d/grub-completion.bash.in index 44bf135b9f8..5c4acd496d4 100644 --- a/util/bash-completion.d/grub-completion.bash.in @@ -228,7 +214,7 @@ index 00000000000..7e87dfccc0e + echo export GRUB_UPDATE_DEFAULT_KERNEL +fi diff --git a/util/grub-mkconfig.in b/util/grub-mkconfig.in -index bdb9982aefb..8218f3d477f 100644 +index 4e7a875309e..6247a0ba850 100644 --- a/util/grub-mkconfig.in +++ b/util/grub-mkconfig.in @@ -45,6 +45,7 @@ grub_probe="${sbindir}/@grub_probe@" @@ -249,7 +235,7 @@ index bdb9982aefb..8218f3d477f 100644 if [ -z "$GRUB_DEVICE_UUID" ]; then GRUB_DEVICE_UUID="$GRUB_DEVICE_UUID_GENERATED" diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in -index a8a8e2cf325..4e49ccdf742 100644 +index 12a20c9ad73..55f4aa783cf 100644 --- a/util/grub.d/10_linux.in +++ b/util/grub.d/10_linux.in @@ -111,7 +111,8 @@ linux_entry () diff --git a/0067-bz1374141-fix-incorrect-mask-for-ppc64.patch b/0067-bz1374141-fix-incorrect-mask-for-ppc64.patch index 628ff7e..1bb2658 100644 --- a/0067-bz1374141-fix-incorrect-mask-for-ppc64.patch +++ b/0067-bz1374141-fix-incorrect-mask-for-ppc64.patch @@ -30,7 +30,7 @@ The count of zero with __builtin_clz can be 22. (clz counts the number of one bi 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/grub-core/net/drivers/ieee1275/ofnet.c b/grub-core/net/drivers/ieee1275/ofnet.c -index 002446be1c3..3df75357a70 100644 +index ac4e62a95c9..3860b6f78d8 100644 --- a/grub-core/net/drivers/ieee1275/ofnet.c +++ b/grub-core/net/drivers/ieee1275/ofnet.c @@ -220,8 +220,7 @@ grub_ieee1275_parse_bootpath (const char *devpath, char *bootpath, diff --git a/0068-Make-grub_fatal-also-backtrace.patch b/0068-Make-grub_fatal-also-backtrace.patch index ee0b5c1..de1de20 100644 --- a/0068-Make-grub_fatal-also-backtrace.patch +++ b/0068-Make-grub_fatal-also-backtrace.patch @@ -13,10 +13,10 @@ Subject: [PATCH] Make grub_fatal() also backtrace. create mode 100644 grub-core/lib/arm64/backtrace.c diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def -index d0c8a8b1908..8bb5eb0f47f 100644 +index 99466b1e47e..ebc558019cd 100644 --- a/grub-core/Makefile.core.def +++ b/grub-core/Makefile.core.def -@@ -175,6 +175,9 @@ kernel = { +@@ -186,6 +186,9 @@ kernel = { softdiv = lib/division.c; @@ -25,7 +25,7 @@ index d0c8a8b1908..8bb5eb0f47f 100644 + i386 = kern/i386/dl.c; i386_xen = kern/i386/dl.c; - + i386_xen_pvh = kern/i386/dl.c; diff --git a/grub-core/kern/misc.c b/grub-core/kern/misc.c index 1c560ea570a..04371ac49f2 100644 --- a/grub-core/kern/misc.c diff --git a/0069-Fix-up-some-man-pages-rpmdiff-noticed.patch b/0069-Fix-up-some-man-pages-rpmdiff-noticed.patch index 1b2caa6..80257e3 100644 --- a/0069-Fix-up-some-man-pages-rpmdiff-noticed.patch +++ b/0069-Fix-up-some-man-pages-rpmdiff-noticed.patch @@ -13,10 +13,10 @@ Subject: [PATCH] Fix up some man pages rpmdiff noticed. create mode 100644 util/grub-syslinux2cfg.1 diff --git a/configure.ac b/configure.ac -index 2a6fde5be81..9318c281108 100644 +index fc3c2b44d60..eb851b8d722 100644 --- a/configure.ac +++ b/configure.ac -@@ -80,6 +80,7 @@ grub_TRANSFORM([grub-get-kernel-settings.3]) +@@ -84,6 +84,7 @@ grub_TRANSFORM([grub-get-kernel-settings.3]) grub_TRANSFORM([grub-glue-efi.3]) grub_TRANSFORM([grub-install.1]) grub_TRANSFORM([grub-kbdcomp.3]) @@ -24,7 +24,7 @@ index 2a6fde5be81..9318c281108 100644 grub_TRANSFORM([grub-menulst2cfg.1]) grub_TRANSFORM([grub-mkconfig.1]) grub_TRANSFORM([grub-mkfont.3]) -@@ -98,6 +99,7 @@ grub_TRANSFORM([grub-render-label.3]) +@@ -102,6 +103,7 @@ grub_TRANSFORM([grub-render-label.3]) grub_TRANSFORM([grub-script-check.3]) grub_TRANSFORM([grub-set-default.1]) grub_TRANSFORM([grub-sparc64-setup.3]) diff --git a/0070-arm64-make-sure-fdt-has-address-cells-and-size-cells.patch b/0070-arm64-make-sure-fdt-has-address-cells-and-size-cells.patch index e832337..f0e491e 100644 --- a/0070-arm64-make-sure-fdt-has-address-cells-and-size-cells.patch +++ b/0070-arm64-make-sure-fdt-has-address-cells-and-size-cells.patch @@ -14,10 +14,10 @@ make sure they exist. 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/grub-core/loader/arm64/linux.c b/grub-core/loader/arm64/linux.c -index a1ac7a38867..93b5cd306eb 100644 +index 04994d5c67d..4c0a09c06de 100644 --- a/grub-core/loader/arm64/linux.c +++ b/grub-core/loader/arm64/linux.c -@@ -80,7 +80,21 @@ finalize_params_linux (void) +@@ -81,7 +81,21 @@ finalize_params_linux (void) node = grub_fdt_find_subnode (fdt, 0, "chosen"); if (node < 0) diff --git a/0071-Make-our-info-pages-say-grub2-where-appropriate.patch b/0071-Make-our-info-pages-say-grub2-where-appropriate.patch index 800f7f1..eea4e6f 100644 --- a/0071-Make-our-info-pages-say-grub2-where-appropriate.patch +++ b/0071-Make-our-info-pages-say-grub2-where-appropriate.patch @@ -1,6 +1,6 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Peter Jones -Date: Fri, 6 May 2016 18:43:08 -0400 +Date: Tue, 9 Jul 2019 12:59:58 +0200 Subject: [PATCH] Make our info pages say "grub2" where appropriate. This needs to be hooked up to --program-transform=, but I haven't had @@ -13,7 +13,7 @@ Signed-off-by: Peter Jones 2 files changed, 161 insertions(+), 161 deletions(-) diff --git a/docs/grub-dev.texi b/docs/grub-dev.texi -index a9f4de6318c..3ce827ab726 100644 +index ee389fd83c3..e3fed7312a3 100644 --- a/docs/grub-dev.texi +++ b/docs/grub-dev.texi @@ -1,7 +1,7 @@ @@ -35,7 +35,7 @@ index a9f4de6318c..3ce827ab726 100644 @setchapternewpage odd diff --git a/docs/grub.texi b/docs/grub.texi -index a7155c22ffe..2b7b7faf847 100644 +index 221064b5679..960e5f3ba41 100644 --- a/docs/grub.texi +++ b/docs/grub.texi @@ -1,7 +1,7 @@ @@ -609,7 +609,7 @@ index a7155c22ffe..2b7b7faf847 100644 @samp{GRUB_SAVEDEFAULT} (@pxref{Simple configuration}). -@@ -4396,7 +4396,7 @@ Translate @var{string} into the current language. +@@ -4398,7 +4398,7 @@ Translate @var{string} into the current language. The current language code is stored in the @samp{lang} variable in GRUB's environment (@pxref{lang}). Translation files in MO format are read from @@ -618,7 +618,7 @@ index a7155c22ffe..2b7b7faf847 100644 @end deffn -@@ -4791,7 +4791,7 @@ Define a user named @var{user} with password @var{clear-password}. +@@ -4793,7 +4793,7 @@ Define a user named @var{user} with password @var{clear-password}. @deffn Command password_pbkdf2 user hashed-password Define a user named @var{user} with password hash @var{hashed-password}. @@ -627,7 +627,7 @@ index a7155c22ffe..2b7b7faf847 100644 to generate password hashes. @xref{Security}. @end deffn -@@ -5614,8 +5614,8 @@ The @samp{password} (@pxref{password}) and @samp{password_pbkdf2} +@@ -5651,8 +5651,8 @@ The @samp{password} (@pxref{password}) and @samp{password_pbkdf2} which has an associated password. @samp{password} sets the password in plain text, requiring @file{grub.cfg} to be secure; @samp{password_pbkdf2} sets the password hashed using the Password-Based Key Derivation Function @@ -638,7 +638,7 @@ index a7155c22ffe..2b7b7faf847 100644 In order to enable authentication support, the @samp{superusers} environment variable must be set to a list of usernames, separated by any of spaces, -@@ -5659,7 +5659,7 @@ menuentry "May be run by user1 or a superuser" --users user1 @{ +@@ -5696,7 +5696,7 @@ menuentry "May be run by user1 or a superuser" --users user1 @{ @end group @end example @@ -647,7 +647,7 @@ index a7155c22ffe..2b7b7faf847 100644 generating configuration files with authentication. You can use @file{/etc/grub.d/40_custom} to add simple superuser authentication, by adding @kbd{set superusers=} and @kbd{password} or @kbd{password_pbkdf2} -@@ -5684,15 +5684,15 @@ verified with a public key currently trusted by GRUB +@@ -5721,15 +5721,15 @@ verified with a public key currently trusted by GRUB validation fails, then file @file{foo} cannot be opened. This failure may halt or otherwise impact the boot process. @@ -668,7 +668,7 @@ index a7155c22ffe..2b7b7faf847 100644 GRUB uses GPG-style detached signatures (meaning that a file @file{foo.sig} will be produced when file @file{foo} is signed), and -@@ -5712,8 +5712,8 @@ gpg --detach-sign /path/to/file +@@ -5749,8 +5749,8 @@ gpg --detach-sign /path/to/file For successful validation of all of GRUB's subcomponents and the loaded OS kernel, they must all be signed. One way to accomplish this is the following (after having already produced the desired @@ -679,7 +679,7 @@ index a7155c22ffe..2b7b7faf847 100644 @example @group -@@ -5735,7 +5735,7 @@ See also: @ref{check_signatures}, @ref{verify_detached}, @ref{trust}, +@@ -5772,7 +5772,7 @@ See also: @ref{check_signatures}, @ref{verify_detached}, @ref{trust}, Note that internally signature enforcement is controlled by setting the environment variable @code{check_signatures} equal to @code{enforce}. Passing one or more @code{--pubkey} options to @@ -688,7 +688,7 @@ index a7155c22ffe..2b7b7faf847 100644 equal to @code{enforce} in @file{core.img} prior to processing any configuration files. -@@ -6092,10 +6092,10 @@ Required files are: +@@ -6189,10 +6189,10 @@ Required files are: GRUB's normal start-up procedure involves setting the @samp{prefix} environment variable to a value set in the core image by @@ -701,7 +701,7 @@ index a7155c22ffe..2b7b7faf847 100644 things GRUB is supposed to do. If, instead, you only get a rescue shell, this usually means that GRUB -@@ -6121,8 +6121,8 @@ normal +@@ -6218,8 +6218,8 @@ normal However, any problem that leaves you in the rescue shell probably means that GRUB was not correctly installed. It may be more useful to try to reinstall @@ -712,7 +712,7 @@ index a7155c22ffe..2b7b7faf847 100644 @itemize @bullet{} @item -@@ -6134,7 +6134,7 @@ is usually better to use UUIDs or file system labels and avoid depending on +@@ -6231,7 +6231,7 @@ is usually better to use UUIDs or file system labels and avoid depending on drive ordering entirely. @item @@ -721,8 +721,8 @@ index a7155c22ffe..2b7b7faf847 100644 to a partition but GRUB has already been installed in the master boot record, then the GRUB installation in the partition will be ignored. -@@ -6154,21 +6154,21 @@ support has not yet been added to GRUB. - @end itemize +@@ -6262,21 +6262,21 @@ entry which claims partition start at block 0. This change will not hamper + bootability on other machines. -@node Invoking grub-install @@ -749,7 +749,7 @@ index a7155c22ffe..2b7b7faf847 100644 @table @option @item --help -@@ -6184,13 +6184,13 @@ separate partition or a removable disk. +@@ -6292,13 +6292,13 @@ separate partition or a removable disk. If this option is not specified then it defaults to @file{/boot}, so @example @@ -765,7 +765,7 @@ index a7155c22ffe..2b7b7faf847 100644 @end example Here is an example in which you have a separate @dfn{boot} partition which is -@@ -6198,16 +6198,16 @@ mounted on +@@ -6306,16 +6306,16 @@ mounted on @file{/mnt/boot}: @example @@ -785,7 +785,7 @@ index a7155c22ffe..2b7b7faf847 100644 extra space in the bootloader embedding area for Reed-Solomon error-correcting codes. This enables GRUB to still boot successfully if some blocks are corrupted. The exact amount of protection offered -@@ -6220,17 +6220,17 @@ installation}) where GRUB does not reside in any unpartitioned space +@@ -6328,17 +6328,17 @@ installation}) where GRUB does not reside in any unpartitioned space outside of the MBR. Disable the Reed-Solomon codes with this option. @end table @@ -808,7 +808,7 @@ index a7155c22ffe..2b7b7faf847 100644 @table @option @item --help -@@ -6246,17 +6246,17 @@ it to standard output. +@@ -6354,17 +6354,17 @@ it to standard output. @end table @@ -830,7 +830,7 @@ index a7155c22ffe..2b7b7faf847 100644 @table @option @item -c @var{number} -@@ -6274,23 +6274,23 @@ Length of the salt. Defaults to 64. +@@ -6382,23 +6382,23 @@ Length of the salt. Defaults to 64. @end table @@ -860,7 +860,7 @@ index a7155c22ffe..2b7b7faf847 100644 @table @option @item --help -@@ -6301,17 +6301,17 @@ Print the version number of GRUB and exit. +@@ -6409,17 +6409,17 @@ Print the version number of GRUB and exit. @end table @@ -882,7 +882,7 @@ index a7155c22ffe..2b7b7faf847 100644 passed on directly to @command{xorriso} in @command{mkisofs} emulation mode. Options passed to @command{xorriso} will normally be interpreted as @command{mkisofs} options; if the option @samp{--} is used, then anything -@@ -6326,7 +6326,7 @@ mkdir -p disk/boot/grub +@@ -6434,7 +6434,7 @@ mkdir -p disk/boot/grub grub-mkrescue -o grub.iso disk @end example @@ -891,7 +891,7 @@ index a7155c22ffe..2b7b7faf847 100644 @table @option @item --help -@@ -6354,15 +6354,15 @@ Use @var{file} as the @command{xorriso} program, rather than the built-in +@@ -6462,15 +6462,15 @@ Use @var{file} as the @command{xorriso} program, rather than the built-in default. @item --grub-mkimage=@var{file} @@ -911,7 +911,7 @@ index a7155c22ffe..2b7b7faf847 100644 system or file system image that GRUB understands, using GRUB's file system drivers via FUSE. (It is only available if FUSE development files were present when GRUB was built.) This has a number of uses: -@@ -6394,13 +6394,13 @@ even if nobody has yet written a FUSE module specifically for that file +@@ -6502,13 +6502,13 @@ even if nobody has yet written a FUSE module specifically for that file system type. @end itemize @@ -927,7 +927,7 @@ index a7155c22ffe..2b7b7faf847 100644 non-option arguments (if it is given more than one image, it will treat them as a RAID set), and also accepts the following options: -@@ -6422,13 +6422,13 @@ Show debugging output for conditions matching @var{string}. +@@ -6530,13 +6530,13 @@ Show debugging output for conditions matching @var{string}. @item -K prompt|@var{file} @itemx --zfs-key=prompt|@var{file} Load a ZFS encryption key. If you use @samp{prompt} as the argument, @@ -943,7 +943,7 @@ index a7155c22ffe..2b7b7faf847 100644 root of the supplied file system. If @var{device} is just a number, then it will be treated as a partition -@@ -6446,10 +6446,10 @@ Print verbose messages. +@@ -6554,10 +6554,10 @@ Print verbose messages. @end table @@ -957,7 +957,7 @@ index a7155c22ffe..2b7b7faf847 100644 or device. @example -@@ -6457,7 +6457,7 @@ grub-probe --target=fs /boot/grub +@@ -6565,7 +6565,7 @@ grub-probe --target=fs /boot/grub grub-probe --target=drive --device /dev/sda1 @end example @@ -966,7 +966,7 @@ index a7155c22ffe..2b7b7faf847 100644 argument, and also accepts the following options: @table @option -@@ -6470,16 +6470,16 @@ Print the version number of GRUB and exit. +@@ -6578,16 +6578,16 @@ Print the version number of GRUB and exit. @item -d @itemx --device If this option is given, then the non-option argument is a system device @@ -986,7 +986,7 @@ index a7155c22ffe..2b7b7faf847 100644 @item -t @var{target} @itemx --target=@var{target} -@@ -6532,19 +6532,19 @@ Print verbose messages. +@@ -6640,19 +6640,19 @@ Print verbose messages. @end table diff --git a/0072-print-more-debug-info-in-our-module-loader.patch b/0072-print-more-debug-info-in-our-module-loader.patch index bf2c42f..48f48e3 100644 --- a/0072-print-more-debug-info-in-our-module-loader.patch +++ b/0072-print-more-debug-info-in-our-module-loader.patch @@ -9,7 +9,7 @@ Signed-off-by: Peter Jones 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/grub-core/kern/efi/efi.c b/grub-core/kern/efi/efi.c -index e339f264b3a..562d6887e0e 100644 +index 370ce03c5d7..a1af9b46559 100644 --- a/grub-core/kern/efi/efi.c +++ b/grub-core/kern/efi/efi.c @@ -313,13 +313,23 @@ grub_efi_modules_addr (void) diff --git a/0074-grub2-btrfs-Add-ability-to-boot-from-subvolumes.patch b/0074-grub2-btrfs-Add-ability-to-boot-from-subvolumes.patch index eafb894..41616b0 100644 --- a/0074-grub2-btrfs-Add-ability-to-boot-from-subvolumes.patch +++ b/0074-grub2-btrfs-Add-ability-to-boot-from-subvolumes.patch @@ -1,6 +1,6 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jeff Mahoney -Date: Wed, 18 Dec 2013 09:57:04 +0000 +Date: Tue, 9 Jul 2019 13:39:45 +0200 Subject: [PATCH] grub2/btrfs: Add ability to boot from subvolumes This patch adds the ability to specify a different root on a btrfs @@ -24,20 +24,20 @@ Signed-off-by: Jeff Mahoney 2 files changed, 533 insertions(+), 20 deletions(-) diff --git a/grub-core/fs/btrfs.c b/grub-core/fs/btrfs.c -index be195448dbe..51ed63d429b 100644 +index 48bd3d04a5e..6823d9765c4 100644 --- a/grub-core/fs/btrfs.c +++ b/grub-core/fs/btrfs.c -@@ -29,6 +29,9 @@ - #include +@@ -38,6 +38,9 @@ + #include #include #include +#include +#include +#include + #include + #include - GRUB_MOD_LICENSE ("GPLv3+"); - -@@ -64,9 +67,11 @@ struct grub_btrfs_superblock +@@ -78,9 +81,11 @@ struct grub_btrfs_superblock grub_uint64_t generation; grub_uint64_t root_tree; grub_uint64_t chunk_tree; @@ -51,7 +51,7 @@ index be195448dbe..51ed63d429b 100644 struct grub_btrfs_device this_device; char label[0x100]; grub_uint8_t dummy4[0x100]; -@@ -105,6 +110,7 @@ struct grub_btrfs_data +@@ -120,6 +125,7 @@ struct grub_btrfs_data grub_uint64_t exttree; grub_size_t extsize; struct grub_btrfs_extent_data *extent; @@ -59,7 +59,7 @@ index be195448dbe..51ed63d429b 100644 }; struct grub_btrfs_chunk_item -@@ -171,6 +177,14 @@ struct grub_btrfs_leaf_descriptor +@@ -188,6 +194,14 @@ struct grub_btrfs_leaf_descriptor } *data; }; @@ -74,7 +74,7 @@ index be195448dbe..51ed63d429b 100644 struct grub_btrfs_time { grub_int64_t sec; -@@ -215,6 +229,14 @@ struct grub_btrfs_extent_data +@@ -233,6 +247,14 @@ struct grub_btrfs_extent_data #define GRUB_BTRFS_OBJECT_ID_CHUNK 0x100 @@ -89,7 +89,7 @@ index be195448dbe..51ed63d429b 100644 static grub_disk_addr_t superblock_sectors[] = { 64 * 2, 64 * 1024 * 2, 256 * 1048576 * 2, 1048576ULL * 1048576ULL * 2 }; -@@ -837,6 +859,62 @@ grub_btrfs_read_logical (struct grub_btrfs_data *data, grub_disk_addr_t addr, +@@ -1153,6 +1175,62 @@ grub_btrfs_read_logical (struct grub_btrfs_data *data, grub_disk_addr_t addr, return GRUB_ERR_NONE; } @@ -152,7 +152,7 @@ index be195448dbe..51ed63d429b 100644 static struct grub_btrfs_data * grub_btrfs_mount (grub_device_t dev) { -@@ -872,6 +950,13 @@ grub_btrfs_mount (grub_device_t dev) +@@ -1188,6 +1266,13 @@ grub_btrfs_mount (grub_device_t dev) data->devices_attached[0].dev = dev; data->devices_attached[0].id = data->sblock.this_device.device_id; @@ -166,7 +166,7 @@ index be195448dbe..51ed63d429b 100644 return data; } -@@ -1232,6 +1317,91 @@ get_root (struct grub_btrfs_data *data, struct grub_btrfs_key *key, +@@ -1653,6 +1738,91 @@ get_root (struct grub_btrfs_data *data, struct grub_btrfs_key *key, return GRUB_ERR_NONE; } @@ -258,7 +258,7 @@ index be195448dbe..51ed63d429b 100644 static grub_err_t find_path (struct grub_btrfs_data *data, const char *path, struct grub_btrfs_key *key, -@@ -1250,14 +1420,26 @@ find_path (struct grub_btrfs_data *data, +@@ -1671,14 +1841,26 @@ find_path (struct grub_btrfs_data *data, char *origpath = NULL; unsigned symlinks_max = 32; @@ -289,7 +289,7 @@ index be195448dbe..51ed63d429b 100644 while (1) { while (path[0] == '/') -@@ -1430,9 +1612,21 @@ find_path (struct grub_btrfs_data *data, +@@ -1851,9 +2033,21 @@ find_path (struct grub_btrfs_data *data, path = path_alloc = tmp; if (path[0] == '/') { @@ -314,7 +314,7 @@ index be195448dbe..51ed63d429b 100644 } continue; } -@@ -1673,18 +1867,10 @@ grub_btrfs_read (grub_file_t file, char *buf, grub_size_t len) +@@ -2094,18 +2288,10 @@ grub_btrfs_read (grub_file_t file, char *buf, grub_size_t len) data->tree, file->offset, buf, len); } @@ -336,7 +336,7 @@ index be195448dbe..51ed63d429b 100644 grub_be_to_cpu16 (data->sblock.uuid[0]), grub_be_to_cpu16 (data->sblock.uuid[1]), grub_be_to_cpu16 (data->sblock.uuid[2]), -@@ -1693,6 +1879,20 @@ grub_btrfs_uuid (grub_device_t device, char **uuid) +@@ -2114,6 +2300,20 @@ grub_btrfs_uuid (grub_device_t device, char **uuid) grub_be_to_cpu16 (data->sblock.uuid[5]), grub_be_to_cpu16 (data->sblock.uuid[6]), grub_be_to_cpu16 (data->sblock.uuid[7])); @@ -357,7 +357,7 @@ index be195448dbe..51ed63d429b 100644 grub_btrfs_unmount (data); -@@ -1749,6 +1949,242 @@ grub_btrfs_embed (grub_device_t device __attribute__ ((unused)), +@@ -2170,6 +2370,242 @@ grub_btrfs_embed (grub_device_t device __attribute__ ((unused)), } #endif @@ -599,8 +599,8 @@ index be195448dbe..51ed63d429b 100644 + static struct grub_fs grub_btrfs_fs = { .name = "btrfs", - .dir = grub_btrfs_dir, -@@ -1764,12 +2200,88 @@ static struct grub_fs grub_btrfs_fs = { + .fs_dir = grub_btrfs_dir, +@@ -2185,12 +2621,88 @@ static struct grub_fs grub_btrfs_fs = { #endif }; diff --git a/0075-export-btrfs_subvol-and-btrfs_subvolid.patch b/0075-export-btrfs_subvol-and-btrfs_subvolid.patch index a0989e8..5af81e7 100644 --- a/0075-export-btrfs_subvol-and-btrfs_subvolid.patch +++ b/0075-export-btrfs_subvol-and-btrfs_subvolid.patch @@ -12,10 +12,10 @@ Signed-off-by: Michael Chang 1 file changed, 2 insertions(+) diff --git a/grub-core/fs/btrfs.c b/grub-core/fs/btrfs.c -index 51ed63d429b..88d727d161f 100644 +index 6823d9765c4..2d099b18ea1 100644 --- a/grub-core/fs/btrfs.c +++ b/grub-core/fs/btrfs.c -@@ -2273,6 +2273,8 @@ GRUB_MOD_INIT (btrfs) +@@ -2694,6 +2694,8 @@ GRUB_MOD_INIT (btrfs) subvol_set_env); grub_register_variable_hook ("btrfs_subvolid", subvolid_get_env, subvolid_set_env); diff --git a/0076-grub2-btrfs-03-follow_default.patch b/0076-grub2-btrfs-03-follow_default.patch index 26e91f1..b28aa78 100644 --- a/0076-grub2-btrfs-03-follow_default.patch +++ b/0076-grub2-btrfs-03-follow_default.patch @@ -8,10 +8,10 @@ Subject: [PATCH] grub2-btrfs-03-follow_default 1 file changed, 76 insertions(+), 31 deletions(-) diff --git a/grub-core/fs/btrfs.c b/grub-core/fs/btrfs.c -index 88d727d161f..a47d297567f 100644 +index 2d099b18ea1..2db89f71ea5 100644 --- a/grub-core/fs/btrfs.c +++ b/grub-core/fs/btrfs.c -@@ -920,6 +920,7 @@ grub_btrfs_mount (grub_device_t dev) +@@ -1236,6 +1236,7 @@ grub_btrfs_mount (grub_device_t dev) { struct grub_btrfs_data *data; grub_err_t err; @@ -19,7 +19,7 @@ index 88d727d161f..a47d297567f 100644 if (!dev->disk) { -@@ -950,11 +951,14 @@ grub_btrfs_mount (grub_device_t dev) +@@ -1266,11 +1267,14 @@ grub_btrfs_mount (grub_device_t dev) data->devices_attached[0].dev = dev; data->devices_attached[0].id = data->sblock.this_device.device_id; @@ -38,7 +38,7 @@ index 88d727d161f..a47d297567f 100644 } return data; -@@ -1414,24 +1418,39 @@ find_path (struct grub_btrfs_data *data, +@@ -1835,24 +1839,39 @@ find_path (struct grub_btrfs_data *data, grub_size_t allocated = 0; struct grub_btrfs_dir_item *direl = NULL; struct grub_btrfs_key key_out; @@ -85,7 +85,7 @@ index 88d727d161f..a47d297567f 100644 } else { -@@ -1442,15 +1461,23 @@ find_path (struct grub_btrfs_data *data, +@@ -1863,15 +1882,23 @@ find_path (struct grub_btrfs_data *data, while (1) { @@ -118,7 +118,7 @@ index 88d727d161f..a47d297567f 100644 if (*type != GRUB_BTRFS_DIR_ITEM_TYPE_DIRECTORY) { -@@ -1461,7 +1488,9 @@ find_path (struct grub_btrfs_data *data, +@@ -1882,7 +1909,9 @@ find_path (struct grub_btrfs_data *data, if (ctokenlen == 1 && ctoken[0] == '.') { @@ -129,7 +129,7 @@ index 88d727d161f..a47d297567f 100644 continue; } if (ctokenlen == 2 && ctoken[0] == '.' && ctoken[1] == '.') -@@ -1492,8 +1521,9 @@ find_path (struct grub_btrfs_data *data, +@@ -1913,8 +1942,9 @@ find_path (struct grub_btrfs_data *data, *type = GRUB_BTRFS_DIR_ITEM_TYPE_DIRECTORY; key->object_id = key_out.offset; @@ -141,7 +141,7 @@ index 88d727d161f..a47d297567f 100644 continue; } -@@ -1562,7 +1592,9 @@ find_path (struct grub_btrfs_data *data, +@@ -1983,7 +2013,9 @@ find_path (struct grub_btrfs_data *data, return err; } @@ -152,7 +152,7 @@ index 88d727d161f..a47d297567f 100644 if (cdirel->type == GRUB_BTRFS_DIR_ITEM_TYPE_SYMLINK) { struct grub_btrfs_inode inode; -@@ -1612,14 +1644,26 @@ find_path (struct grub_btrfs_data *data, +@@ -2033,14 +2065,26 @@ find_path (struct grub_btrfs_data *data, path = path_alloc = tmp; if (path[0] == '/') { @@ -186,7 +186,7 @@ index 88d727d161f..a47d297567f 100644 } else { -@@ -2275,6 +2319,7 @@ GRUB_MOD_INIT (btrfs) +@@ -2696,6 +2740,7 @@ GRUB_MOD_INIT (btrfs) subvolid_set_env); grub_env_export ("btrfs_subvol"); grub_env_export ("btrfs_subvolid"); diff --git a/0077-grub2-btrfs-04-grub2-install.patch b/0077-grub2-btrfs-04-grub2-install.patch index af81616..b490f8d 100644 --- a/0077-grub2-btrfs-04-grub2-install.patch +++ b/0077-grub2-btrfs-04-grub2-install.patch @@ -94,10 +94,10 @@ index ebcdd8f5e22..f044a880a76 100644 sizeof ("GRUB_DISTRIBUTOR=") - 1) == 0) { diff --git a/util/grub-install.c b/util/grub-install.c -index 78d0138cb0a..4375c161955 100644 +index 8a55ad4b8dc..0e807b09c36 100644 --- a/util/grub-install.c +++ b/util/grub-install.c -@@ -816,6 +816,8 @@ fill_core_services (const char *core_services) +@@ -819,6 +819,8 @@ fill_core_services (const char *core_services) free (sysv_plist); } @@ -106,7 +106,7 @@ index 78d0138cb0a..4375c161955 100644 int main (int argc, char *argv[]) { -@@ -849,6 +851,9 @@ main (int argc, char *argv[]) +@@ -852,6 +854,9 @@ main (int argc, char *argv[]) grub_util_load_config (&config); @@ -116,7 +116,7 @@ index 78d0138cb0a..4375c161955 100644 if (!bootloader_id && config.grub_distributor) { char *ptr; -@@ -1321,6 +1326,16 @@ main (int argc, char *argv[]) +@@ -1344,6 +1349,16 @@ main (int argc, char *argv[]) fprintf (load_cfg_f, "set debug='%s'\n", debug_image); } diff --git a/0078-grub2-btrfs-05-grub2-mkconfig.patch b/0078-grub2-btrfs-05-grub2-mkconfig.patch index d99bee4..2320e89 100644 --- a/0078-grub2-btrfs-05-grub2-mkconfig.patch +++ b/0078-grub2-btrfs-05-grub2-mkconfig.patch @@ -13,7 +13,7 @@ Signed-off-by: Michael Chang 5 files changed, 38 insertions(+), 2 deletions(-) diff --git a/util/grub-mkconfig.in b/util/grub-mkconfig.in -index 8218f3d477f..4248b9341ab 100644 +index 6247a0ba850..4649e92eb0f 100644 --- a/util/grub-mkconfig.in +++ b/util/grub-mkconfig.in @@ -258,7 +258,8 @@ export GRUB_DEFAULT \ @@ -90,7 +90,7 @@ index 858b526c925..de727e6ee6b 100644 +EOF +fi diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in -index 4e49ccdf742..d9a05937e46 100644 +index 55f4aa783cf..5cab299dc08 100644 --- a/util/grub.d/10_linux.in +++ b/util/grub.d/10_linux.in @@ -66,10 +66,14 @@ fi @@ -109,7 +109,7 @@ index 4e49ccdf742..d9a05937e46 100644 xzfs) rpool=`${grub_probe} --device ${GRUB_DEVICE} --target=fs_label 2>/dev/null || true` diff --git a/util/grub.d/20_linux_xen.in b/util/grub.d/20_linux_xen.in -index 972a4b5a03d..bcdc3ceac02 100644 +index 47e0d3f5cd6..1519ec692fe 100644 --- a/util/grub.d/20_linux_xen.in +++ b/util/grub.d/20_linux_xen.in @@ -73,10 +73,14 @@ fi diff --git a/0079-grub2-btrfs-06-subvol-mount.patch b/0079-grub2-btrfs-06-subvol-mount.patch index 493f133..36824c8 100644 --- a/0079-grub2-btrfs-06-subvol-mount.patch +++ b/0079-grub2-btrfs-06-subvol-mount.patch @@ -1,6 +1,6 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Michael Chang -Date: Fri, 22 May 2015 11:45:25 +0000 +Date: Tue, 9 Jul 2019 13:56:16 +0200 Subject: [PATCH] grub2-btrfs-06-subvol-mount --- @@ -11,18 +11,18 @@ Subject: [PATCH] grub2-btrfs-06-subvol-mount 4 files changed, 392 insertions(+), 5 deletions(-) diff --git a/grub-core/fs/btrfs.c b/grub-core/fs/btrfs.c -index a47d297567f..2e36ac47e8a 100644 +index 2db89f71ea5..162723423ca 100644 --- a/grub-core/fs/btrfs.c +++ b/grub-core/fs/btrfs.c -@@ -32,6 +32,7 @@ +@@ -41,6 +41,7 @@ #include #include #include +#include + #include + #include - GRUB_MOD_LICENSE ("GPLv3+"); - -@@ -245,6 +246,12 @@ static grub_err_t +@@ -263,6 +264,12 @@ static grub_err_t grub_btrfs_read_logical (struct grub_btrfs_data *data, grub_disk_addr_t addr, void *buf, grub_size_t size, int recursion_depth); @@ -35,7 +35,7 @@ index a47d297567f..2e36ac47e8a 100644 static grub_err_t read_sblock (grub_disk_t disk, struct grub_btrfs_superblock *sb) -@@ -887,9 +894,26 @@ lookup_root_by_name(struct grub_btrfs_data *data, const char *path) +@@ -1203,9 +1210,26 @@ lookup_root_by_name(struct grub_btrfs_data *data, const char *path) grub_err_t err; grub_uint64_t tree = 0; grub_uint8_t type; @@ -62,7 +62,7 @@ index a47d297567f..2e36ac47e8a 100644 if (err) return grub_error(GRUB_ERR_FILE_NOT_FOUND, "couldn't locate %s\n", path); -@@ -1758,11 +1782,20 @@ grub_btrfs_dir (grub_device_t device, const char *path, +@@ -2179,11 +2203,20 @@ grub_btrfs_dir (grub_device_t device, const char *path, int r = 0; grub_uint64_t tree; grub_uint8_t type; @@ -84,7 +84,7 @@ index a47d297567f..2e36ac47e8a 100644 if (err) { grub_btrfs_unmount (data); -@@ -1864,11 +1897,21 @@ grub_btrfs_open (struct grub_file *file, const char *name) +@@ -2285,11 +2318,21 @@ grub_btrfs_open (struct grub_file *file, const char *name) struct grub_btrfs_inode inode; grub_uint8_t type; struct grub_btrfs_key key_in; @@ -107,7 +107,7 @@ index a47d297567f..2e36ac47e8a 100644 if (err) { grub_btrfs_unmount (data); -@@ -2039,6 +2082,150 @@ grub_cmd_btrfs_info (grub_command_t cmd __attribute__ ((unused)), int argc, +@@ -2460,6 +2503,150 @@ grub_cmd_btrfs_info (grub_command_t cmd __attribute__ ((unused)), int argc, return 0; } @@ -258,7 +258,7 @@ index a47d297567f..2e36ac47e8a 100644 static grub_err_t get_fs_root(struct grub_btrfs_data *data, grub_uint64_t tree, grub_uint64_t objectid, grub_uint64_t offset, -@@ -2245,6 +2432,7 @@ static struct grub_fs grub_btrfs_fs = { +@@ -2666,6 +2853,7 @@ static struct grub_fs grub_btrfs_fs = { }; static grub_command_t cmd_info; @@ -266,7 +266,7 @@ index a47d297567f..2e36ac47e8a 100644 static grub_extcmd_t cmd_list_subvols; static char * -@@ -2308,6 +2496,9 @@ GRUB_MOD_INIT (btrfs) +@@ -2729,6 +2917,9 @@ GRUB_MOD_INIT (btrfs) cmd_info = grub_register_command("btrfs-info", grub_cmd_btrfs_info, "DEVICE", "Print BtrFS info about DEVICE."); @@ -460,10 +460,10 @@ index 5d50dd6f8dc..4c5a13022dc 100644 grub_make_system_path_relative_to_its_root_os (const char *path) { diff --git a/util/grub-install.c b/util/grub-install.c -index 4375c161955..a0ad99729fd 100644 +index 0e807b09c36..3e718b9e3fb 100644 --- a/util/grub-install.c +++ b/util/grub-install.c -@@ -1535,6 +1535,55 @@ main (int argc, char *argv[]) +@@ -1561,6 +1561,55 @@ main (int argc, char *argv[]) prefix_drive = xasprintf ("(%s)", grub_drives[0]); } diff --git a/0080-Fallback-to-old-subvol-name-scheme-to-support-old-sn.patch b/0080-Fallback-to-old-subvol-name-scheme-to-support-old-sn.patch index a413446..f023ca2 100644 --- a/0080-Fallback-to-old-subvol-name-scheme-to-support-old-sn.patch +++ b/0080-Fallback-to-old-subvol-name-scheme-to-support-old-sn.patch @@ -10,10 +10,10 @@ Ref: bsc#953538 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/grub-core/fs/btrfs.c b/grub-core/fs/btrfs.c -index 2e36ac47e8a..4a31d39ee74 100644 +index 162723423ca..69c30e62354 100644 --- a/grub-core/fs/btrfs.c +++ b/grub-core/fs/btrfs.c -@@ -924,11 +924,41 @@ lookup_root_by_name(struct grub_btrfs_data *data, const char *path) +@@ -1240,11 +1240,41 @@ lookup_root_by_name(struct grub_btrfs_data *data, const char *path) return GRUB_ERR_NONE; } diff --git a/0081-Grub-not-working-correctly-with-btrfs-snapshots-bsc-.patch b/0081-Grub-not-working-correctly-with-btrfs-snapshots-bsc-.patch index 0f4ce50..f88b891 100644 --- a/0081-Grub-not-working-correctly-with-btrfs-snapshots-bsc-.patch +++ b/0081-Grub-not-working-correctly-with-btrfs-snapshots-bsc-.patch @@ -8,10 +8,10 @@ Subject: [PATCH] Grub not working correctly with btrfs snapshots (bsc#1026511) 1 file changed, 238 insertions(+) diff --git a/grub-core/fs/btrfs.c b/grub-core/fs/btrfs.c -index 4a31d39ee74..7002ad81b7e 100644 +index 69c30e62354..ba99d04f8ed 100644 --- a/grub-core/fs/btrfs.c +++ b/grub-core/fs/btrfs.c -@@ -2446,6 +2446,238 @@ out: +@@ -2867,6 +2867,238 @@ out: return 0; } @@ -249,8 +249,8 @@ index 4a31d39ee74..7002ad81b7e 100644 + static struct grub_fs grub_btrfs_fs = { .name = "btrfs", - .dir = grub_btrfs_dir, -@@ -2464,6 +2696,7 @@ static struct grub_fs grub_btrfs_fs = { + .fs_dir = grub_btrfs_dir, +@@ -2885,6 +3117,7 @@ static struct grub_fs grub_btrfs_fs = { static grub_command_t cmd_info; static grub_command_t cmd_mount_subvol; static grub_extcmd_t cmd_list_subvols; @@ -258,7 +258,7 @@ index 4a31d39ee74..7002ad81b7e 100644 static char * subvolid_set_env (struct grub_env_var *var __attribute__ ((unused)), -@@ -2534,6 +2767,11 @@ GRUB_MOD_INIT (btrfs) +@@ -2955,6 +3188,11 @@ GRUB_MOD_INIT (btrfs) "[-p|-n] [-o var] DEVICE", "Print list of BtrFS subvolumes on " "DEVICE.", options); diff --git a/0082-Add-grub_efi_allocate_pool-and-grub_efi_free_pool-wr.patch b/0082-Add-grub_efi_allocate_pool-and-grub_efi_free_pool-wr.patch index 9a4a5c2..ccb1947 100644 --- a/0082-Add-grub_efi_allocate_pool-and-grub_efi_free_pool-wr.patch +++ b/0082-Add-grub_efi_allocate_pool-and-grub_efi_free_pool-wr.patch @@ -10,7 +10,7 @@ Signed-off-by: Peter Jones 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/include/grub/efi/efi.h b/include/grub/efi/efi.h -index 39480b38674..09a18e56302 100644 +index 090c8621066..5e2b479daec 100644 --- a/include/grub/efi/efi.h +++ b/include/grub/efi/efi.h @@ -24,6 +24,10 @@ diff --git a/0083-Use-grub_efi_.-memory-helpers-where-reasonable.patch b/0083-Use-grub_efi_.-memory-helpers-where-reasonable.patch index 0dc026f..a9e1a2b 100644 --- a/0083-Use-grub_efi_.-memory-helpers-where-reasonable.patch +++ b/0083-Use-grub_efi_.-memory-helpers-where-reasonable.patch @@ -13,7 +13,7 @@ Signed-off-by: Peter Jones 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/grub-core/loader/efi/chainloader.c b/grub-core/loader/efi/chainloader.c -index 5cd9b6e08a8..106eb10a362 100644 +index 5aa3a5dc7dd..3a724a9fcbf 100644 --- a/grub-core/loader/efi/chainloader.c +++ b/grub-core/loader/efi/chainloader.c @@ -65,7 +65,7 @@ grub_chainloader_unload (void) @@ -34,7 +34,7 @@ index 5cd9b6e08a8..106eb10a362 100644 grub_loader_unset (); -@@ -500,10 +500,9 @@ grub_efi_get_media_file_path (grub_efi_device_path_t *dp) +@@ -506,10 +506,9 @@ grub_efi_get_media_file_path (grub_efi_device_path_t *dp) static grub_efi_boolean_t handle_image (void *data, grub_efi_uint32_t datasize) { @@ -46,7 +46,7 @@ index 5cd9b6e08a8..106eb10a362 100644 char *buffer_aligned = NULL; grub_efi_uint32_t i; struct grub_pe32_section_table *section; -@@ -514,8 +513,6 @@ handle_image (void *data, grub_efi_uint32_t datasize) +@@ -520,8 +519,6 @@ handle_image (void *data, grub_efi_uint32_t datasize) int found_entry_point = 0; int rc; @@ -55,7 +55,7 @@ index 5cd9b6e08a8..106eb10a362 100644 rc = read_header (data, datasize, &context); if (rc < 0) { -@@ -555,8 +552,8 @@ handle_image (void *data, grub_efi_uint32_t datasize) +@@ -561,8 +558,8 @@ handle_image (void *data, grub_efi_uint32_t datasize) grub_dprintf ("chain", "image size is %08"PRIxGRUB_UINT64_T", datasize is %08x\n", context.image_size, datasize); @@ -66,7 +66,7 @@ index 5cd9b6e08a8..106eb10a362 100644 if (efi_status != GRUB_EFI_SUCCESS) { -@@ -788,14 +785,14 @@ handle_image (void *data, grub_efi_uint32_t datasize) +@@ -794,14 +791,14 @@ handle_image (void *data, grub_efi_uint32_t datasize) grub_dprintf ("chain", "entry_point returned %ld\n", efi_status); grub_memcpy (li, &li_bak, sizeof (grub_efi_loaded_image_t)); @@ -83,7 +83,7 @@ index 5cd9b6e08a8..106eb10a362 100644 return 0; } -@@ -803,10 +800,7 @@ error_exit: +@@ -809,10 +806,7 @@ error_exit: static grub_err_t grub_secureboot_chainloader_unload (void) { @@ -95,7 +95,7 @@ index 5cd9b6e08a8..106eb10a362 100644 grub_free (file_path); grub_free (cmdline); cmdline = 0; -@@ -1073,7 +1067,7 @@ fail: +@@ -1079,7 +1073,7 @@ fail: grub_free (file_path); if (address) diff --git a/0084-Add-PRIxGRUB_EFI_STATUS-and-use-it.patch b/0084-Add-PRIxGRUB_EFI_STATUS-and-use-it.patch index 004fced..d438465 100644 --- a/0084-Add-PRIxGRUB_EFI_STATUS-and-use-it.patch +++ b/0084-Add-PRIxGRUB_EFI_STATUS-and-use-it.patch @@ -12,10 +12,10 @@ Signed-off-by: Peter Jones 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/grub-core/loader/efi/chainloader.c b/grub-core/loader/efi/chainloader.c -index 106eb10a362..3630b0cbf2d 100644 +index 3a724a9fcbf..f4ddbeda687 100644 --- a/grub-core/loader/efi/chainloader.c +++ b/grub-core/loader/efi/chainloader.c -@@ -783,7 +783,8 @@ handle_image (void *data, grub_efi_uint32_t datasize) +@@ -789,7 +789,8 @@ handle_image (void *data, grub_efi_uint32_t datasize) efi_status = efi_call_2 (entry_point, grub_efi_image_handle, grub_efi_system_table); @@ -26,7 +26,7 @@ index 106eb10a362..3630b0cbf2d 100644 efi_status = grub_efi_free_pool (buffer); diff --git a/include/grub/efi/api.h b/include/grub/efi/api.h -index 28b6adf7648..e5b521bd9be 100644 +index d97cdf98c80..955973ed484 100644 --- a/include/grub/efi/api.h +++ b/include/grub/efi/api.h @@ -527,6 +527,14 @@ typedef grub_uint8_t grub_efi_char8_t; diff --git a/0085-Don-t-use-dynamic-sized-arrays-since-we-don-t-build-.patch b/0085-Don-t-use-dynamic-sized-arrays-since-we-don-t-build-.patch index 882cf5d..a53ecb4 100644 --- a/0085-Don-t-use-dynamic-sized-arrays-since-we-don-t-build-.patch +++ b/0085-Don-t-use-dynamic-sized-arrays-since-we-don-t-build-.patch @@ -9,7 +9,7 @@ Subject: [PATCH] Don't use dynamic sized arrays since we don't build with 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/grub-core/net/net.c b/grub-core/net/net.c -index 4be228d9576..fa3e2912643 100644 +index f24f1fd63f6..5366e443d2a 100644 --- a/grub-core/net/net.c +++ b/grub-core/net/net.c @@ -1853,14 +1853,25 @@ grub_net_search_configfile (char *config) diff --git a/0087-don-t-use-int-for-efi-status.patch b/0087-don-t-use-int-for-efi-status.patch index 6328df9..9cdf63e 100644 --- a/0087-don-t-use-int-for-efi-status.patch +++ b/0087-don-t-use-int-for-efi-status.patch @@ -8,7 +8,7 @@ Subject: [PATCH] don't use int for efi status 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grub-core/kern/efi/efi.c b/grub-core/kern/efi/efi.c -index 562d6887e0e..bcae7f4699d 100644 +index a1af9b46559..2cf6a5ad526 100644 --- a/grub-core/kern/efi/efi.c +++ b/grub-core/kern/efi/efi.c @@ -166,7 +166,7 @@ grub_reboot (void) diff --git a/0088-make-GRUB_MOD_INIT-declare-its-function-prototypes.patch b/0088-make-GRUB_MOD_INIT-declare-its-function-prototypes.patch index 1d6f4c4..993034f 100644 --- a/0088-make-GRUB_MOD_INIT-declare-its-function-prototypes.patch +++ b/0088-make-GRUB_MOD_INIT-declare-its-function-prototypes.patch @@ -8,7 +8,7 @@ Subject: [PATCH] make GRUB_MOD_INIT() declare its function prototypes. 1 file changed, 2 insertions(+) diff --git a/include/grub/dl.h b/include/grub/dl.h -index 2bca56ce0e8..b1ed3c33317 100644 +index f03c03561a1..90dc9bb1017 100644 --- a/include/grub/dl.h +++ b/include/grub/dl.h @@ -54,6 +54,7 @@ grub_mod_fini (void) diff --git a/0089-editenv-handle-relative-symlinks.patch b/0089-editenv-handle-relative-symlinks.patch index 20e1686..06adca7 100644 --- a/0089-editenv-handle-relative-symlinks.patch +++ b/0089-editenv-handle-relative-symlinks.patch @@ -14,7 +14,7 @@ Signed-off-by: Jonathan Lebon 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/util/editenv.c b/util/editenv.c -index d8d1dad6ab9..41bc7cb1c9a 100644 +index e61dc1283a4..1f7f6f3ae18 100644 --- a/util/editenv.c +++ b/util/editenv.c @@ -28,6 +28,7 @@ @@ -25,7 +25,7 @@ index d8d1dad6ab9..41bc7cb1c9a 100644 #define DEFAULT_ENVBLK_SIZE 1024 -@@ -87,9 +88,20 @@ grub_util_create_envblk_file (const char *name) +@@ -88,9 +89,20 @@ grub_util_create_envblk_file (const char *name) continue; } diff --git a/0090-Make-libgrub.pp-depend-on-config-util.h.patch b/0090-Make-libgrub.pp-depend-on-config-util.h.patch index dc24fb1..9a7d85f 100644 --- a/0090-Make-libgrub.pp-depend-on-config-util.h.patch +++ b/0090-Make-libgrub.pp-depend-on-config-util.h.patch @@ -31,7 +31,7 @@ Signed-off-by: Peter Jones 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am -index 7795baeb654..c7b0e6a9c46 100644 +index 1f4bb9b8c5a..bf9c1ba64c9 100644 --- a/Makefile.am +++ b/Makefile.am @@ -37,7 +37,7 @@ grub_script.yy.c: grub_script.yy.h diff --git a/0091-Don-t-guess-boot-efi-as-HFS-on-ppc-machines-in-grub-.patch b/0091-Don-t-guess-boot-efi-as-HFS-on-ppc-machines-in-grub-.patch index 51f5458..1e8743a 100644 --- a/0091-Don-t-guess-boot-efi-as-HFS-on-ppc-machines-in-grub-.patch +++ b/0091-Don-t-guess-boot-efi-as-HFS-on-ppc-machines-in-grub-.patch @@ -16,10 +16,10 @@ Signed-off-by: Peter Jones 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/util/grub-install.c b/util/grub-install.c -index a0ad99729fd..16f137ca854 100644 +index 3e718b9e3fb..37fcdac12cc 100644 --- a/util/grub-install.c +++ b/util/grub-install.c -@@ -1159,18 +1159,8 @@ main (int argc, char *argv[]) +@@ -1182,18 +1182,8 @@ main (int argc, char *argv[]) char *d; is_guess = 1; diff --git a/0092-20_linux_xen-load-xen-or-multiboot-2-modules-as-need.patch b/0092-20_linux_xen-load-xen-or-multiboot-2-modules-as-need.patch index c26a3d5..c8e8c4a 100644 --- a/0092-20_linux_xen-load-xen-or-multiboot-2-modules-as-need.patch +++ b/0092-20_linux_xen-load-xen-or-multiboot-2-modules-as-need.patch @@ -1,6 +1,6 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Peter Jones -Date: Thu, 19 Oct 2017 11:29:11 -0400 +Date: Tue, 9 Jul 2019 14:31:19 +0200 Subject: [PATCH] 20_linux_xen: load xen or multiboot{,2} modules as needed. Signed-off-by: Peter Jones @@ -9,7 +9,7 @@ Signed-off-by: Peter Jones 1 file changed, 3 insertions(+) diff --git a/util/grub.d/20_linux_xen.in b/util/grub.d/20_linux_xen.in -index bcdc3ceac02..2bc03fd36b9 100644 +index 1519ec692fe..9aa23bc7d51 100644 --- a/util/grub.d/20_linux_xen.in +++ b/util/grub.d/20_linux_xen.in @@ -136,6 +136,8 @@ linux_entry () @@ -21,11 +21,11 @@ index bcdc3ceac02..2bc03fd36b9 100644 ${xen_loader} ${rel_xen_dirname}/${xen_basename} placeholder ${xen_args} \${xen_rm_opts} echo '$(echo "$lmessage" | grub_quote)' ${module_loader} ${rel_dirname}/${basename} placeholder root=${linux_root_device_thisversion} ro ${args} -@@ -145,6 +147,7 @@ EOF - message="$(gettext_printf "Loading initial ramdisk ...")" +@@ -149,6 +151,7 @@ EOF + done sed "s/^/$submenu_indentation/" << EOF echo '$(echo "$message" | grub_quote)' + insmod ${module_loader} - ${module_loader} --nounzip ${rel_dirname}/${initrd} + ${module_loader} --nounzip $(echo $initrd_path) EOF fi diff --git a/0094-align-struct-efi_variable-better.patch b/0094-align-struct-efi_variable-better.patch index 65bc91b..0afd935 100644 --- a/0094-align-struct-efi_variable-better.patch +++ b/0094-align-struct-efi_variable-better.patch @@ -20,7 +20,7 @@ index 36d2dedf47e..9d93ba88bac 100644 +} GRUB_PACKED GRUB_ALIGNED(8); #endif /* ! GRUB_EFI_EMU_RUNTIME_HEADER */ diff --git a/include/grub/types.h b/include/grub/types.h -index b93e4820194..f6a9723971d 100644 +index 035a4b528fc..2fc4be4039a 100644 --- a/include/grub/types.h +++ b/include/grub/types.h @@ -29,6 +29,7 @@ diff --git a/0095-Add-BLS-support-to-grub-mkconfig.patch b/0095-Add-BLS-support-to-grub-mkconfig.patch index b99daf9..70277ef 100644 --- a/0095-Add-BLS-support-to-grub-mkconfig.patch +++ b/0095-Add-BLS-support-to-grub-mkconfig.patch @@ -32,10 +32,10 @@ Signed-off-by: Javier Martinez Canillas create mode 100644 util/grub.d/10_linux_bls.in diff --git a/Makefile.util.def b/Makefile.util.def -index c39b3ce6aa9..c16c2ca545a 100644 +index 2215cc759c0..a61613656d1 100644 --- a/Makefile.util.def +++ b/Makefile.util.def -@@ -490,6 +490,13 @@ script = { +@@ -499,6 +499,13 @@ script = { condition = COND_HOST_LINUX; }; @@ -64,7 +64,7 @@ index a2d1f577b9b..434fa4deda4 100644 .SH SEE ALSO .BR "info grub" diff --git a/util/grub-mkconfig.in b/util/grub-mkconfig.in -index 4248b9341ab..5e643e16973 100644 +index 4649e92eb0f..2601bdc0711 100644 --- a/util/grub-mkconfig.in +++ b/util/grub-mkconfig.in @@ -50,6 +50,8 @@ grub_get_kernel_settings="${sbindir}/@grub_get_kernel_settings@" @@ -157,7 +157,7 @@ index b3aae534ddc..bc11df2bd84 100644 fi IFS="$old_ifs" diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in -index d9a05937e46..3919b8aff4e 100644 +index 5cab299dc08..301594a0c9e 100644 --- a/util/grub.d/10_linux.in +++ b/util/grub.d/10_linux.in @@ -82,6 +82,67 @@ case x"$GRUB_FS" in diff --git a/0097-Add-linux-and-initrd-commands-for-grub-emu.patch b/0097-Add-linux-and-initrd-commands-for-grub-emu.patch index 6b758f6..f956667 100644 --- a/0097-Add-linux-and-initrd-commands-for-grub-emu.patch +++ b/0097-Add-linux-and-initrd-commands-for-grub-emu.patch @@ -18,10 +18,10 @@ to the kexec command line tool, to allow booting the selected menu entry. create mode 100644 grub-core/loader/emu/linux.c diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def -index 8bb5eb0f47f..e70558a800a 100644 +index ebc558019cd..528f76a8c8e 100644 --- a/grub-core/Makefile.core.def +++ b/grub-core/Makefile.core.def -@@ -1712,7 +1712,6 @@ module = { +@@ -1802,7 +1802,6 @@ module = { common = loader/linux.c; common = lib/cmdline.c; @@ -52,10 +52,10 @@ index 55ea5a11ccd..846fe9715ec 100644 case ARGP_KEY_ARG: { diff --git a/grub-core/kern/emu/misc.c b/grub-core/kern/emu/misc.c -index 82012a72fcb..3d3a4a4a975 100644 +index 19cd007d448..245b69cab51 100644 --- a/grub-core/kern/emu/misc.c +++ b/grub-core/kern/emu/misc.c -@@ -37,6 +37,7 @@ +@@ -39,6 +39,7 @@ #include int verbosity; @@ -63,7 +63,7 @@ index 82012a72fcb..3d3a4a4a975 100644 void grub_util_warn (const char *fmt, ...) -@@ -80,7 +81,7 @@ grub_util_error (const char *fmt, ...) +@@ -82,7 +83,7 @@ grub_util_error (const char *fmt, ...) vfprintf (stderr, fmt, ap); va_end (ap); fprintf (stderr, ".\n"); @@ -72,7 +72,7 @@ index 82012a72fcb..3d3a4a4a975 100644 } void * -@@ -140,6 +141,9 @@ void +@@ -142,6 +143,9 @@ void __attribute__ ((noreturn)) grub_exit (int rc) { @@ -82,7 +82,7 @@ index 82012a72fcb..3d3a4a4a975 100644 exit (rc < 0 ? 1 : rc); } #endif -@@ -201,3 +205,15 @@ grub_util_load_image (const char *path, char *buf) +@@ -203,3 +207,15 @@ grub_util_load_image (const char *path, char *buf) fclose (fp); } @@ -299,7 +299,7 @@ index d1073ef86af..1b61b4a2e5d 100644 grub_util_exec_redirect (const char *const *argv, const char *stdin_file, const char *stdout_file); diff --git a/include/grub/emu/hostfile.h b/include/grub/emu/hostfile.h -index 8e37d5acb42..12c937a1af9 100644 +index cfb1e2b5661..a61568e36e9 100644 --- a/include/grub/emu/hostfile.h +++ b/include/grub/emu/hostfile.h @@ -22,6 +22,7 @@ @@ -320,12 +320,12 @@ index 8e37d5acb42..12c937a1af9 100644 char * grub_util_path_concat (size_t n, ...); diff --git a/include/grub/emu/misc.h b/include/grub/emu/misc.h -index df6085bcb7c..a653132e36a 100644 +index ce464cfd007..5ef4f79e689 100644 --- a/include/grub/emu/misc.h +++ b/include/grub/emu/misc.h -@@ -60,6 +60,9 @@ void EXPORT_FUNC(grub_util_warn) (const char *fmt, ...) __attribute__ ((format ( - void EXPORT_FUNC(grub_util_info) (const char *fmt, ...) __attribute__ ((format (__printf__, 1, 2))); - void EXPORT_FUNC(grub_util_error) (const char *fmt, ...) __attribute__ ((format (__printf__, 1, 2), noreturn)); +@@ -56,6 +56,9 @@ void EXPORT_FUNC(grub_util_warn) (const char *fmt, ...) __attribute__ ((format ( + void EXPORT_FUNC(grub_util_info) (const char *fmt, ...) __attribute__ ((format (GNU_PRINTF, 1, 2))); + void EXPORT_FUNC(grub_util_error) (const char *fmt, ...) __attribute__ ((format (GNU_PRINTF, 1, 2), noreturn)); +void EXPORT_FUNC(grub_util_set_kexecute) (void); +int EXPORT_FUNC(grub_util_get_kexecute) (void) WARN_UNUSED_RESULT; @@ -334,10 +334,10 @@ index df6085bcb7c..a653132e36a 100644 #ifdef HAVE_DEVICE_MAPPER diff --git a/grub-core/Makefile.am b/grub-core/Makefile.am -index 9c69aa88626..0108c0d4233 100644 +index c6ba5b2d763..5ff3afd62fa 100644 --- a/grub-core/Makefile.am +++ b/grub-core/Makefile.am -@@ -274,6 +274,7 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/emu/net.h +@@ -304,6 +304,7 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/emu/net.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/emu/hostdisk.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/emu/hostfile.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h diff --git a/0098-Add-grub2-switch-to-blscfg.patch b/0098-Add-grub2-switch-to-blscfg.patch index ec9e766..80c4042 100644 --- a/0098-Add-grub2-switch-to-blscfg.patch +++ b/0098-Add-grub2-switch-to-blscfg.patch @@ -9,19 +9,18 @@ Signed-off-by: Javier Martinez Canillas Signed-off-by: Jan Hlavac --- Makefile.util.def | 7 + - .gitignore | 2 + util/grub-set-password.in | 2 +- util/grub-switch-to-blscfg.8 | 33 +++++ util/grub-switch-to-blscfg.in | 314 ++++++++++++++++++++++++++++++++++++++++++ - 5 files changed, 357 insertions(+), 1 deletion(-) + 4 files changed, 355 insertions(+), 1 deletion(-) create mode 100644 util/grub-switch-to-blscfg.8 create mode 100644 util/grub-switch-to-blscfg.in diff --git a/Makefile.util.def b/Makefile.util.def -index c16c2ca545a..aa59418ff2c 100644 +index a61613656d1..f55473c76aa 100644 --- a/Makefile.util.def +++ b/Makefile.util.def -@@ -1355,6 +1355,13 @@ program = { +@@ -1364,6 +1364,13 @@ program = { ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; }; @@ -35,19 +34,6 @@ index c16c2ca545a..aa59418ff2c 100644 program = { name = grub-glue-efi; mansection = 1; -diff --git a/.gitignore b/.gitignore -index 096eeff7de8..7aaae594d51 100644 ---- a/.gitignore -+++ b/.gitignore -@@ -121,6 +121,8 @@ grub-*.tar.* - /grub*-sparc64-setup.8 - /grub*-syslinux2cfg - /grub*-syslinux2cfg.1 -+/grub*-switch-to-blscfg -+/grub*-switch-to-blscfg.8 - /grub_fstest.pp - /grub_fstest_init.c - /grub_fstest_init.lst diff --git a/util/grub-set-password.in b/util/grub-set-password.in index 5ebf50576d6..c0b5ebbfdc5 100644 --- a/util/grub-set-password.in diff --git a/0099-Add-grub_debug_enabled.patch b/0099-Add-grub_debug_enabled.patch index 480628a..838913c 100644 --- a/0099-Add-grub_debug_enabled.patch +++ b/0099-Add-grub_debug_enabled.patch @@ -47,7 +47,7 @@ index 636f97e1ba1..e758ab3416d 100644 grub_printf ("%s:%d: ", file, line); va_start (args, fmt); diff --git a/include/grub/misc.h b/include/grub/misc.h -index fcaf1201e39..0f5abc4638e 100644 +index b4339222ecb..4a4f485a5f6 100644 --- a/include/grub/misc.h +++ b/include/grub/misc.h @@ -367,6 +367,7 @@ grub_puts (const char *s) diff --git a/0100-make-better-backtraces.patch b/0100-make-better-backtraces.patch index 8751441..56f4c4b 100644 --- a/0100-make-better-backtraces.patch +++ b/0100-make-better-backtraces.patch @@ -1,12 +1,12 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Peter Jones -Date: Mon, 6 Nov 2017 18:31:56 -0500 +Date: Tue, 9 Jul 2019 17:05:03 +0200 Subject: [PATCH] make better backtraces Signed-off-by: Peter Jones --- Makefile.util.def | 6 ++ - grub-core/Makefile.core.def | 15 ++-- + grub-core/Makefile.core.def | 16 ++-- grub-core/{lib => commands}/backtrace.c | 2 +- grub-core/gdb/cstub.c | 1 - grub-core/kern/arm64/backtrace.c | 94 ++++++++++++++++++++++++ @@ -29,7 +29,7 @@ Signed-off-by: Peter Jones grub-core/kern/ia64/efi/startup.S | 3 +- grub-core/kern/sparc64/ieee1275/crt0.S | 3 +- grub-core/Makefile.am | 1 + - 24 files changed, 414 insertions(+), 166 deletions(-) + 24 files changed, 414 insertions(+), 167 deletions(-) rename grub-core/{lib => commands}/backtrace.c (98%) create mode 100644 grub-core/kern/arm64/backtrace.c create mode 100644 grub-core/kern/backtrace.c @@ -38,7 +38,7 @@ Signed-off-by: Peter Jones delete mode 100644 grub-core/lib/i386/backtrace.c diff --git a/Makefile.util.def b/Makefile.util.def -index aa59418ff2c..4e722ab766b 100644 +index f55473c76aa..c13ca685ce1 100644 --- a/Makefile.util.def +++ b/Makefile.util.def @@ -49,6 +49,12 @@ library = { @@ -55,10 +55,10 @@ index aa59418ff2c..4e722ab766b 100644 library = { diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def -index e70558a800a..63b33490b11 100644 +index 528f76a8c8e..49c5dc4c3b7 100644 --- a/grub-core/Makefile.core.def +++ b/grub-core/Makefile.core.def -@@ -129,6 +129,12 @@ kernel = { +@@ -140,6 +140,12 @@ kernel = { common = kern/rescue_parser.c; common = kern/rescue_reader.c; common = kern/term.c; @@ -71,7 +71,7 @@ index e70558a800a..63b33490b11 100644 noemu = kern/compiler-rt.c; noemu = kern/mm.c; -@@ -175,9 +181,6 @@ kernel = { +@@ -186,9 +192,6 @@ kernel = { softdiv = lib/division.c; @@ -80,17 +80,19 @@ index e70558a800a..63b33490b11 100644 - i386 = kern/i386/dl.c; i386_xen = kern/i386/dl.c; - -@@ -2279,13 +2282,11 @@ module = { + i386_xen_pvh = kern/i386/dl.c; +@@ -2376,15 +2379,12 @@ module = { module = { name = backtrace; - x86 = lib/i386/backtrace.c; +- i386_xen_pvh = lib/i386/backtrace.c; - i386_xen = lib/i386/backtrace.c; - x86_64_xen = lib/i386/backtrace.c; - common = lib/backtrace.c; + common = commands/backtrace.c; enable = x86; + enable = i386_xen_pvh; enable = i386_xen; enable = x86_64_xen; + enable = arm64; @@ -329,7 +331,7 @@ index 00000000000..4a82e865cc6 + grub_backtrace (skip + 1); +} diff --git a/grub-core/kern/dl.c b/grub-core/kern/dl.c -index 621070918d4..5028d157c46 100644 +index d7718d26abc..2e57e5e6829 100644 --- a/grub-core/kern/dl.c +++ b/grub-core/kern/dl.c @@ -124,6 +124,50 @@ grub_dl_resolve_symbol (const char *name) @@ -545,10 +547,10 @@ index 27bc68b8a53..b51d0abfa6e 100644 /* Initialize the console as early as possible. */ grub_console_init (); diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c -index e01bc6eab19..e731a57a47b 100644 +index 0cd2a627231..937c1bc44cb 100644 --- a/grub-core/kern/ieee1275/init.c +++ b/grub-core/kern/ieee1275/init.c -@@ -60,7 +60,6 @@ +@@ -63,7 +63,6 @@ #define HEAP_MAX_ADDR (unsigned long) (32 * 1024 * 1024) #endif @@ -785,10 +787,10 @@ index 395519762f0..275cf85e2d3 100644 #endif diff --git a/include/grub/dl.h b/include/grub/dl.h -index b1ed3c33317..7b5bfb07ce6 100644 +index 90dc9bb1017..4fe2b524f73 100644 --- a/include/grub/dl.h +++ b/include/grub/dl.h -@@ -244,6 +244,8 @@ grub_dl_get (const char *name) +@@ -257,6 +257,8 @@ grub_dl_is_persistent (grub_dl_t mod) #endif @@ -798,10 +800,10 @@ index b1ed3c33317..7b5bfb07ce6 100644 int isfunc, grub_dl_t mod); diff --git a/include/grub/kernel.h b/include/grub/kernel.h -index ecd88ca72c6..ae69218af20 100644 +index 133a37c8d03..e5a5f436709 100644 --- a/include/grub/kernel.h +++ b/include/grub/kernel.h -@@ -108,6 +108,9 @@ grub_addr_t grub_modules_get_end (void); +@@ -110,6 +110,9 @@ grub_addr_t grub_modules_get_end (void); #endif @@ -895,7 +897,7 @@ index 03b916f0534..701bf63abcf 100644 ba codestart mov %o4, %o0 diff --git a/grub-core/Makefile.am b/grub-core/Makefile.am -index 0108c0d4233..f36200bd688 100644 +index 5ff3afd62fa..d9ad30052f1 100644 --- a/grub-core/Makefile.am +++ b/grub-core/Makefile.am @@ -66,6 +66,7 @@ CLEANFILES += grub_script.yy.c grub_script.yy.h diff --git a/0101-normal-don-t-draw-our-startup-message-if-debug-is-se.patch b/0101-normal-don-t-draw-our-startup-message-if-debug-is-se.patch index 22da7de..6777636 100644 --- a/0101-normal-don-t-draw-our-startup-message-if-debug-is-se.patch +++ b/0101-normal-don-t-draw-our-startup-message-if-debug-is-se.patch @@ -8,7 +8,7 @@ Subject: [PATCH] normal: don't draw our startup message if debug is set 1 file changed, 3 insertions(+) diff --git a/grub-core/normal/main.c b/grub-core/normal/main.c -index ea749f26fd5..4117317c4c4 100644 +index 2fe6743399d..f7ee912e715 100644 --- a/grub-core/normal/main.c +++ b/grub-core/normal/main.c @@ -425,6 +425,9 @@ grub_normal_reader_init (int nested) diff --git a/0103-Make-it-possible-to-enabled-build-id-sha1.patch b/0103-Make-it-possible-to-enabled-build-id-sha1.patch index a241885..d77b6f6 100644 --- a/0103-Make-it-possible-to-enabled-build-id-sha1.patch +++ b/0103-Make-it-possible-to-enabled-build-id-sha1.patch @@ -10,10 +10,10 @@ Signed-off-by: Peter Jones 2 files changed, 27 insertions(+) diff --git a/configure.ac b/configure.ac -index 9318c281108..5f47a9265f3 100644 +index eb851b8d722..8ee18ba159a 100644 --- a/configure.ac +++ b/configure.ac -@@ -1386,7 +1386,15 @@ grub_PROG_TARGET_CC +@@ -1414,7 +1414,15 @@ grub_PROG_TARGET_CC if test "x$TARGET_APPLE_LINKER" != x1 ; then grub_PROG_OBJCOPY_ABSOLUTE fi diff --git a/0104-Add-grub_qdprintf-grub_dprintf-without-the-file-line.patch b/0104-Add-grub_qdprintf-grub_dprintf-without-the-file-line.patch index e5048f9..b434d4c 100644 --- a/0104-Add-grub_qdprintf-grub_dprintf-without-the-file-line.patch +++ b/0104-Add-grub_qdprintf-grub_dprintf-without-the-file-line.patch @@ -42,7 +42,7 @@ index 5c2d2039d0b..0e89c483d5e 100644 int diff --git a/include/grub/misc.h b/include/grub/misc.h -index 0f5abc4638e..de9016ab709 100644 +index 4a4f485a5f6..960097fbd06 100644 --- a/include/grub/misc.h +++ b/include/grub/misc.h @@ -372,6 +372,8 @@ void EXPORT_FUNC(grub_real_dprintf) (const char *file, diff --git a/0105-Make-a-gdb-dprintf-that-tells-us-load-addresses.patch b/0105-Make-a-gdb-dprintf-that-tells-us-load-addresses.patch index f3e24d5..09cc7c6 100644 --- a/0105-Make-a-gdb-dprintf-that-tells-us-load-addresses.patch +++ b/0105-Make-a-gdb-dprintf-that-tells-us-load-addresses.patch @@ -20,7 +20,7 @@ Signed-off-by: Peter Jones 4 files changed, 78 insertions(+), 4 deletions(-) diff --git a/grub-core/kern/dl.c b/grub-core/kern/dl.c -index 5028d157c46..eb8b969cded 100644 +index 2e57e5e6829..6a5e7706143 100644 --- a/grub-core/kern/dl.c +++ b/grub-core/kern/dl.c @@ -501,6 +501,23 @@ grub_dl_find_section (Elf_Ehdr *e, const char *name) @@ -95,7 +95,7 @@ index 5028d157c46..eb8b969cded 100644 { grub_dl_unload (mod); diff --git a/grub-core/kern/efi/efi.c b/grub-core/kern/efi/efi.c -index bcae7f4699d..a2a732ffc0d 100644 +index 2cf6a5ad526..19054b1465f 100644 --- a/grub-core/kern/efi/efi.c +++ b/grub-core/kern/efi/efi.c @@ -283,7 +283,7 @@ grub_efi_get_variable (const char *var, const grub_efi_guid_t *guid, @@ -164,11 +164,11 @@ index 71d2279a0c1..e6183a4c44d 100644 } diff --git a/include/grub/efi/efi.h b/include/grub/efi/efi.h -index 09a18e56302..570a69361a5 100644 +index 5e2b479daec..8ca3981d7a1 100644 --- a/include/grub/efi/efi.h +++ b/include/grub/efi/efi.h -@@ -132,7 +132,7 @@ grub_err_t grub_armxx_efi_linux_check_image(struct linux_armxx_kernel_header *lh - grub_err_t grub_armxx_efi_linux_boot_image(grub_addr_t addr, char *args); +@@ -132,7 +132,7 @@ grub_err_t grub_arch_efi_linux_check_image(struct linux_arch_kernel_header *lh); + grub_err_t grub_arch_efi_linux_boot_image(grub_addr_t addr, char *args); #endif -grub_addr_t grub_efi_modules_addr (void); diff --git a/0107-Fixup-for-newer-compiler.patch b/0106-Fixup-for-newer-compiler.patch similarity index 92% rename from 0107-Fixup-for-newer-compiler.patch rename to 0106-Fixup-for-newer-compiler.patch index a63ca6b..ae5ac89 100644 --- a/0107-Fixup-for-newer-compiler.patch +++ b/0106-Fixup-for-newer-compiler.patch @@ -9,10 +9,10 @@ Subject: [PATCH] Fixup for newer compiler 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/grub-core/fs/btrfs.c b/grub-core/fs/btrfs.c -index 7002ad81b7e..dac73b2fa8b 100644 +index ba99d04f8ed..9cd7f4bdf65 100644 --- a/grub-core/fs/btrfs.c +++ b/grub-core/fs/btrfs.c -@@ -198,7 +198,7 @@ struct grub_btrfs_inode +@@ -215,7 +215,7 @@ struct grub_btrfs_inode grub_uint64_t size; grub_uint8_t dummy2[0x70]; struct grub_btrfs_time mtime; diff --git a/0106-TPM-support.patch b/0106-TPM-support.patch deleted file mode 100644 index 5656da4..0000000 --- a/0106-TPM-support.patch +++ /dev/null @@ -1,891 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Matthew Garrett -Date: Tue, 14 Jul 2015 17:06:35 -0700 -Subject: [PATCH] TPM support - -Add support for performing basic TPM measurements. Right now this only -supports extending PCRs statically and only on UEFI, but will measure -all modules as they're loaded, kernel and initrd images, command line, -grub commands and multiboot images. - -Signed-off-by: Matthew Garrett -[hdegoede: fix hash_log_extend_event prototype and compile warnings] -Signed-off-by: Hans de Goede -[michael.marineau: fix warnings when compiling for other platforms] -Michael Marineau -[javierm: squash in a single patch and drop legacy BIOS support] -Javier Martinez Canillas ---- - grub-core/Makefile.core.def | 2 + - grub-core/kern/dl.c | 4 + - grub-core/kern/efi/tpm.c | 274 ++++++++++++++++++++++++++++++++++ - grub-core/kern/tpm.c | 19 +++ - grub-core/lib/cmdline.c | 7 +- - grub-core/loader/i386/efi/linux.c | 6 + - grub-core/loader/i386/linux.c | 6 + - grub-core/loader/i386/multiboot_mbi.c | 4 + - grub-core/loader/linux.c | 4 + - grub-core/loader/multiboot.c | 3 + - grub-core/loader/multiboot_mbi2.c | 5 +- - grub-core/script/execute.c | 26 +++- - include/grub/efi/tpm.h | 153 +++++++++++++++++++ - include/grub/tpm.h | 94 ++++++++++++ - grub-core/Makefile.am | 1 + - 15 files changed, 604 insertions(+), 4 deletions(-) - create mode 100644 grub-core/kern/efi/tpm.c - create mode 100644 grub-core/kern/tpm.c - create mode 100644 include/grub/efi/tpm.h - create mode 100644 include/grub/tpm.h - -diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def -index 63b33490b11..3be42a95195 100644 ---- a/grub-core/Makefile.core.def -+++ b/grub-core/Makefile.core.def -@@ -130,6 +130,7 @@ kernel = { - common = kern/rescue_reader.c; - common = kern/term.c; - common = kern/backtrace.c; -+ common = kern/tpm.c; - - x86 = kern/i386/backtrace.c; - i386_xen = kern/i386/backtrace.c; -@@ -198,6 +199,7 @@ kernel = { - efi = kern/acpi.c; - efi = kern/efi/acpi.c; - efi = lib/envblk.c; -+ efi = kern/efi/tpm.c; - i386_coreboot = kern/i386/pc/acpi.c; - i386_multiboot = kern/i386/pc/acpi.c; - i386_coreboot = kern/acpi.c; -diff --git a/grub-core/kern/dl.c b/grub-core/kern/dl.c -index eb8b969cded..91105bc4677 100644 ---- a/grub-core/kern/dl.c -+++ b/grub-core/kern/dl.c -@@ -33,6 +33,7 @@ - #include - #include - #include -+#include - - /* Platforms where modules are in a readonly area of memory. */ - #if defined(GRUB_MACHINE_QEMU) -@@ -829,6 +830,9 @@ grub_dl_load_file (const char *filename) - opens of the same device. */ - grub_file_close (file); - -+ grub_tpm_measure(core, size, GRUB_BINARY_PCR, "grub_module", filename); -+ grub_print_error(); -+ - mod = grub_dl_load_core (core, size); - grub_free (core); - if (! mod) -diff --git a/grub-core/kern/efi/tpm.c b/grub-core/kern/efi/tpm.c -new file mode 100644 -index 00000000000..0d3ebe22e57 ---- /dev/null -+++ b/grub-core/kern/efi/tpm.c -@@ -0,0 +1,274 @@ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+static grub_efi_guid_t tpm_guid = EFI_TPM_GUID; -+static grub_efi_guid_t tpm2_guid = EFI_TPM2_GUID; -+ -+static grub_efi_boolean_t grub_tpm_present(grub_efi_tpm_protocol_t *tpm) -+{ -+ grub_efi_status_t status; -+ TCG_EFI_BOOT_SERVICE_CAPABILITY caps; -+ grub_uint32_t flags; -+ grub_efi_physical_address_t eventlog, lastevent; -+ -+ caps.Size = (grub_uint8_t)sizeof(caps); -+ -+ status = efi_call_5(tpm->status_check, tpm, &caps, &flags, &eventlog, -+ &lastevent); -+ -+ if (status != GRUB_EFI_SUCCESS || caps.TPMDeactivatedFlag -+ || !caps.TPMPresentFlag) -+ return 0; -+ -+ return 1; -+} -+ -+static grub_efi_boolean_t grub_tpm2_present(grub_efi_tpm2_protocol_t *tpm) -+{ -+ grub_efi_status_t status; -+ EFI_TCG2_BOOT_SERVICE_CAPABILITY caps; -+ -+ caps.Size = (grub_uint8_t)sizeof(caps); -+ -+ status = efi_call_2(tpm->get_capability, tpm, &caps); -+ -+ if (status != GRUB_EFI_SUCCESS || !caps.TPMPresentFlag) -+ return 0; -+ -+ return 1; -+} -+ -+static grub_efi_boolean_t grub_tpm_handle_find(grub_efi_handle_t *tpm_handle, -+ grub_efi_uint8_t *protocol_version) -+{ -+ grub_efi_handle_t *handles; -+ grub_efi_uintn_t num_handles; -+ -+ handles = grub_efi_locate_handle (GRUB_EFI_BY_PROTOCOL, &tpm_guid, NULL, -+ &num_handles); -+ if (handles && num_handles > 0) { -+ *tpm_handle = handles[0]; -+ *protocol_version = 1; -+ return 1; -+ } -+ -+ handles = grub_efi_locate_handle (GRUB_EFI_BY_PROTOCOL, &tpm2_guid, NULL, -+ &num_handles); -+ if (handles && num_handles > 0) { -+ *tpm_handle = handles[0]; -+ *protocol_version = 2; -+ return 1; -+ } -+ -+ return 0; -+} -+ -+static grub_err_t -+grub_tpm1_execute(grub_efi_handle_t tpm_handle, -+ PassThroughToTPM_InputParamBlock *inbuf, -+ PassThroughToTPM_OutputParamBlock *outbuf) -+{ -+ grub_efi_status_t status; -+ grub_efi_tpm_protocol_t *tpm; -+ grub_uint32_t inhdrsize = sizeof(*inbuf) - sizeof(inbuf->TPMOperandIn); -+ grub_uint32_t outhdrsize = sizeof(*outbuf) - sizeof(outbuf->TPMOperandOut); -+ -+ tpm = grub_efi_open_protocol (tpm_handle, &tpm_guid, -+ GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL); -+ -+ if (!grub_tpm_present(tpm)) -+ return 0; -+ -+ /* UEFI TPM protocol takes the raw operand block, no param block header */ -+ status = efi_call_5 (tpm->pass_through_to_tpm, tpm, -+ inbuf->IPBLength - inhdrsize, inbuf->TPMOperandIn, -+ outbuf->OPBLength - outhdrsize, outbuf->TPMOperandOut); -+ -+ switch (status) { -+ case GRUB_EFI_SUCCESS: -+ return 0; -+ case GRUB_EFI_DEVICE_ERROR: -+ return grub_error (GRUB_ERR_IO, N_("Command failed")); -+ case GRUB_EFI_INVALID_PARAMETER: -+ return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("Invalid parameter")); -+ case GRUB_EFI_BUFFER_TOO_SMALL: -+ return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("Output buffer too small")); -+ case GRUB_EFI_NOT_FOUND: -+ return grub_error (GRUB_ERR_UNKNOWN_DEVICE, N_("TPM unavailable")); -+ default: -+ return grub_error (GRUB_ERR_UNKNOWN_DEVICE, N_("Unknown TPM error")); -+ } -+} -+ -+static grub_err_t -+grub_tpm2_execute(grub_efi_handle_t tpm_handle, -+ PassThroughToTPM_InputParamBlock *inbuf, -+ PassThroughToTPM_OutputParamBlock *outbuf) -+{ -+ grub_efi_status_t status; -+ grub_efi_tpm2_protocol_t *tpm; -+ grub_uint32_t inhdrsize = sizeof(*inbuf) - sizeof(inbuf->TPMOperandIn); -+ grub_uint32_t outhdrsize = sizeof(*outbuf) - sizeof(outbuf->TPMOperandOut); -+ -+ tpm = grub_efi_open_protocol (tpm_handle, &tpm2_guid, -+ GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL); -+ -+ if (!grub_tpm2_present(tpm)) -+ return 0; -+ -+ /* UEFI TPM protocol takes the raw operand block, no param block header */ -+ status = efi_call_5 (tpm->submit_command, tpm, -+ inbuf->IPBLength - inhdrsize, inbuf->TPMOperandIn, -+ outbuf->OPBLength - outhdrsize, outbuf->TPMOperandOut); -+ -+ switch (status) { -+ case GRUB_EFI_SUCCESS: -+ return 0; -+ case GRUB_EFI_DEVICE_ERROR: -+ return grub_error (GRUB_ERR_IO, N_("Command failed")); -+ case GRUB_EFI_INVALID_PARAMETER: -+ return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("Invalid parameter")); -+ case GRUB_EFI_BUFFER_TOO_SMALL: -+ return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("Output buffer too small")); -+ case GRUB_EFI_NOT_FOUND: -+ return grub_error (GRUB_ERR_UNKNOWN_DEVICE, N_("TPM unavailable")); -+ default: -+ return grub_error (GRUB_ERR_UNKNOWN_DEVICE, N_("Unknown TPM error")); -+ } -+} -+ -+grub_err_t -+grub_tpm_execute(PassThroughToTPM_InputParamBlock *inbuf, -+ PassThroughToTPM_OutputParamBlock *outbuf) -+{ -+ grub_efi_handle_t tpm_handle; -+ grub_uint8_t protocol_version; -+ -+ /* It's not a hard failure for there to be no TPM */ -+ if (!grub_tpm_handle_find(&tpm_handle, &protocol_version)) -+ return 0; -+ -+ if (protocol_version == 1) { -+ return grub_tpm1_execute(tpm_handle, inbuf, outbuf); -+ } else { -+ return grub_tpm2_execute(tpm_handle, inbuf, outbuf); -+ } -+} -+ -+static grub_err_t -+grub_tpm1_log_event(grub_efi_handle_t tpm_handle, unsigned char *buf, -+ grub_size_t size, grub_uint8_t pcr, -+ const char *description) -+{ -+ TCG_PCR_EVENT *event; -+ grub_efi_status_t status; -+ grub_efi_tpm_protocol_t *tpm; -+ grub_efi_physical_address_t lastevent; -+ grub_uint32_t algorithm; -+ grub_uint32_t eventnum = 0; -+ -+ tpm = grub_efi_open_protocol (tpm_handle, &tpm_guid, -+ GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL); -+ -+ if (!grub_tpm_present(tpm)) -+ return 0; -+ -+ event = grub_zalloc(sizeof (TCG_PCR_EVENT) + grub_strlen(description) + 1); -+ if (!event) -+ return grub_error (GRUB_ERR_OUT_OF_MEMORY, -+ N_("cannot allocate TPM event buffer")); -+ -+ event->PCRIndex = pcr; -+ event->EventType = EV_IPL; -+ event->EventSize = grub_strlen(description) + 1; -+ grub_memcpy(event->Event, description, event->EventSize); -+ -+ algorithm = TCG_ALG_SHA; -+ status = efi_call_7 (tpm->log_extend_event, tpm, -+ (unsigned long) buf, (grub_uint64_t) size, -+ algorithm, event, &eventnum, &lastevent); -+ -+ switch (status) { -+ case GRUB_EFI_SUCCESS: -+ return 0; -+ case GRUB_EFI_DEVICE_ERROR: -+ return grub_error (GRUB_ERR_IO, N_("Command failed")); -+ case GRUB_EFI_INVALID_PARAMETER: -+ return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("Invalid parameter")); -+ case GRUB_EFI_BUFFER_TOO_SMALL: -+ return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("Output buffer too small")); -+ case GRUB_EFI_NOT_FOUND: -+ return grub_error (GRUB_ERR_UNKNOWN_DEVICE, N_("TPM unavailable")); -+ default: -+ return grub_error (GRUB_ERR_UNKNOWN_DEVICE, N_("Unknown TPM error")); -+ } -+} -+ -+static grub_err_t -+grub_tpm2_log_event(grub_efi_handle_t tpm_handle, unsigned char *buf, -+ grub_size_t size, grub_uint8_t pcr, -+ const char *description) -+{ -+ EFI_TCG2_EVENT *event; -+ grub_efi_status_t status; -+ grub_efi_tpm2_protocol_t *tpm; -+ -+ tpm = grub_efi_open_protocol (tpm_handle, &tpm2_guid, -+ GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL); -+ -+ if (!grub_tpm2_present(tpm)) -+ return 0; -+ -+ event = grub_zalloc(sizeof (EFI_TCG2_EVENT) + grub_strlen(description) + 1); -+ if (!event) -+ return grub_error (GRUB_ERR_OUT_OF_MEMORY, -+ N_("cannot allocate TPM event buffer")); -+ -+ event->Header.HeaderSize = sizeof(EFI_TCG2_EVENT_HEADER); -+ event->Header.HeaderVersion = 1; -+ event->Header.PCRIndex = pcr; -+ event->Header.EventType = EV_IPL; -+ event->Size = sizeof(*event) - sizeof(event->Event) + grub_strlen(description) + 1; -+ grub_memcpy(event->Event, description, grub_strlen(description) + 1); -+ -+ status = efi_call_5 (tpm->hash_log_extend_event, tpm, 0, (unsigned long) buf, -+ (grub_uint64_t) size, event); -+ -+ switch (status) { -+ case GRUB_EFI_SUCCESS: -+ return 0; -+ case GRUB_EFI_DEVICE_ERROR: -+ return grub_error (GRUB_ERR_IO, N_("Command failed")); -+ case GRUB_EFI_INVALID_PARAMETER: -+ return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("Invalid parameter")); -+ case GRUB_EFI_BUFFER_TOO_SMALL: -+ return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("Output buffer too small")); -+ case GRUB_EFI_NOT_FOUND: -+ return grub_error (GRUB_ERR_UNKNOWN_DEVICE, N_("TPM unavailable")); -+ default: -+ return grub_error (GRUB_ERR_UNKNOWN_DEVICE, N_("Unknown TPM error")); -+ } -+} -+ -+grub_err_t -+grub_tpm_log_event(unsigned char *buf, grub_size_t size, grub_uint8_t pcr, -+ const char *description) -+{ -+ grub_efi_handle_t tpm_handle; -+ grub_efi_uint8_t protocol_version; -+ -+ if (!grub_tpm_handle_find(&tpm_handle, &protocol_version)) -+ return 0; -+ -+ if (protocol_version == 1) { -+ return grub_tpm1_log_event(tpm_handle, buf, size, pcr, description); -+ } else { -+ return grub_tpm2_log_event(tpm_handle, buf, size, pcr, description); -+ } -+} -diff --git a/grub-core/kern/tpm.c b/grub-core/kern/tpm.c -new file mode 100644 -index 00000000000..e5e8fced624 ---- /dev/null -+++ b/grub-core/kern/tpm.c -@@ -0,0 +1,19 @@ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+grub_err_t -+grub_tpm_measure (unsigned char *buf, grub_size_t size, grub_uint8_t pcr, -+ const char *kind, const char *description) -+{ -+ grub_err_t ret; -+ char *desc = grub_xasprintf("%s %s", kind, description); -+ if (!desc) -+ return GRUB_ERR_OUT_OF_MEMORY; -+ ret = grub_tpm_log_event(buf, size, pcr, desc); -+ grub_free(desc); -+ return ret; -+} -diff --git a/grub-core/lib/cmdline.c b/grub-core/lib/cmdline.c -index 970ea868c14..d5c12957cad 100644 ---- a/grub-core/lib/cmdline.c -+++ b/grub-core/lib/cmdline.c -@@ -19,6 +19,7 @@ - - #include - #include -+#include - - static int - is_hex(char c) -@@ -79,7 +80,7 @@ int grub_create_loader_cmdline (int argc, char *argv[], char *buf, - { - int i, space; - unsigned int arg_size; -- char *c; -+ char *c, *orig = buf; - - for (i = 0; i < argc; i++) - { -@@ -125,5 +126,9 @@ int grub_create_loader_cmdline (int argc, char *argv[], char *buf, - - *buf = 0; - -+ grub_tpm_measure ((void *)orig, grub_strlen (orig), GRUB_ASCII_PCR, -+ "grub_kernel_cmdline", orig); -+ grub_print_error(); -+ - return i; - } -diff --git a/grub-core/loader/i386/efi/linux.c b/grub-core/loader/i386/efi/linux.c -index 800c3e54022..ea9f5134e67 100644 ---- a/grub-core/loader/i386/efi/linux.c -+++ b/grub-core/loader/i386/efi/linux.c -@@ -27,6 +27,7 @@ - #include - #include - #include -+#include - - GRUB_MOD_LICENSE ("GPLv3+"); - -@@ -131,6 +132,8 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), - argv[i]); - goto fail; - } -+ grub_tpm_measure (ptr, cursize, GRUB_BINARY_PCR, "grub_linuxefi", "Initrd"); -+ grub_print_error(); - ptr += cursize; - grub_memset (ptr, 0, ALIGN_UP_OVERHEAD (cursize, 4)); - ptr += ALIGN_UP_OVERHEAD (cursize, 4); -@@ -195,6 +198,9 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), - goto fail; - } - -+ grub_tpm_measure (kernel, filelen, GRUB_BINARY_PCR, "grub_linuxefi", "Kernel"); -+ grub_print_error(); -+ - rc = grub_linuxefi_secure_validate (kernel, filelen); - if (rc < 0) - { -diff --git a/grub-core/loader/i386/linux.c b/grub-core/loader/i386/linux.c -index c84747ea857..76304f05700 100644 ---- a/grub-core/loader/i386/linux.c -+++ b/grub-core/loader/i386/linux.c -@@ -36,6 +36,7 @@ - #include - #include - #include -+#include - - GRUB_MOD_LICENSE ("GPLv3+"); - -@@ -724,7 +725,11 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), - goto fail; - } - -+ grub_tpm_measure (kernel, len, GRUB_BINARY_PCR, "grub_linux", "Kernel"); -+ grub_print_error(); -+ - grub_memcpy (&lh, kernel, sizeof (lh)); -+ - kernel_offset = sizeof (lh); - - if (lh.boot_flag != grub_cpu_to_le16_compile_time (0xaa55)) -@@ -1038,6 +1043,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), - - len = prot_file_size; - grub_memcpy (prot_mode_mem, kernel + kernel_offset, len); -+ kernel_offset += len; - - if (grub_errno == GRUB_ERR_NONE) - { -diff --git a/grub-core/loader/i386/multiboot_mbi.c b/grub-core/loader/i386/multiboot_mbi.c -index dc98dbcae25..ca85358f771 100644 ---- a/grub-core/loader/i386/multiboot_mbi.c -+++ b/grub-core/loader/i386/multiboot_mbi.c -@@ -36,6 +36,7 @@ - #include - #include - #include -+#include - - #ifdef GRUB_MACHINE_EFI - #include -@@ -173,6 +174,9 @@ grub_multiboot_load (grub_file_t file, const char *filename) - return grub_errno; - } - -+ grub_tpm_measure((unsigned char*)buffer, len, GRUB_BINARY_PCR, "grub_multiboot", filename); -+ grub_print_error(); -+ - header = find_header (buffer, len); - - if (header == 0) -diff --git a/grub-core/loader/linux.c b/grub-core/loader/linux.c -index be6fa0f4d45..c2c7cfcd0fd 100644 ---- a/grub-core/loader/linux.c -+++ b/grub-core/loader/linux.c -@@ -4,6 +4,7 @@ - #include - #include - #include -+#include - - struct newc_head - { -@@ -288,6 +289,9 @@ grub_initrd_load (struct grub_linux_initrd_context *initrd_ctx, - grub_initrd_close (initrd_ctx); - return grub_errno; - } -+ grub_tpm_measure (ptr, cursize, GRUB_BINARY_PCR, "grub_initrd", "Initrd"); -+ grub_print_error(); -+ - ptr += cursize; - } - if (newc) -diff --git a/grub-core/loader/multiboot.c b/grub-core/loader/multiboot.c -index 26df46a4161..9a8dae5565b 100644 ---- a/grub-core/loader/multiboot.c -+++ b/grub-core/loader/multiboot.c -@@ -51,6 +51,7 @@ - #include - #include - #include -+#include - - GRUB_MOD_LICENSE ("GPLv3+"); - -@@ -440,6 +441,8 @@ grub_cmd_module (grub_command_t cmd __attribute__ ((unused)), - } - - grub_file_close (file); -+ grub_tpm_measure (module, size, GRUB_BINARY_PCR, "grub_multiboot", argv[0]); -+ grub_print_error(); - return GRUB_ERR_NONE; - } - -diff --git a/grub-core/loader/multiboot_mbi2.c b/grub-core/loader/multiboot_mbi2.c -index 4df6595954d..54078455e2f 100644 ---- a/grub-core/loader/multiboot_mbi2.c -+++ b/grub-core/loader/multiboot_mbi2.c -@@ -36,6 +36,7 @@ - #include - #include - #include -+#include - - #if defined (GRUB_MACHINE_EFI) - #include -@@ -131,8 +132,10 @@ grub_multiboot2_load (grub_file_t file, const char *filename) - - COMPILE_TIME_ASSERT (MULTIBOOT_HEADER_ALIGN % 4 == 0); - -+ grub_tpm_measure ((unsigned char *)mld.buffer, len, GRUB_BINARY_PCR, "grub_multiboot", filename); -+ grub_print_error(); -+ - header = find_header (mld.buffer, len); -- - if (header == 0) - { - grub_free (mld.buffer); -diff --git a/grub-core/script/execute.c b/grub-core/script/execute.c -index cf6cd6601d6..93965777138 100644 ---- a/grub-core/script/execute.c -+++ b/grub-core/script/execute.c -@@ -30,6 +30,7 @@ - #ifdef GRUB_MACHINE_IEEE1275 - #include - #endif -+#include - - /* Max digits for a char is 3 (0xFF is 255), similarly for an int it - is sizeof (int) * 3, and one extra for a possible -ve sign. */ -@@ -967,8 +968,9 @@ grub_script_execute_cmdline (struct grub_script_cmd *cmd) - grub_err_t ret = 0; - grub_script_function_t func = 0; - char errnobuf[18]; -- char *cmdname; -- int argc; -+ char *cmdname, *cmdstring; -+ int argc, offset = 0, cmdlen = 0; -+ unsigned int i; - char **args; - int invert; - struct grub_script_argv argv = { 0, 0, 0 }; -@@ -977,6 +979,26 @@ grub_script_execute_cmdline (struct grub_script_cmd *cmd) - if (grub_script_arglist_to_argv (cmdline->arglist, &argv) || ! argv.args[0]) - return grub_errno; - -+ for (i = 0; i < argv.argc; i++) { -+ cmdlen += grub_strlen (argv.args[i]) + 1; -+ } -+ -+ cmdstring = grub_malloc (cmdlen); -+ if (!cmdstring) -+ { -+ return grub_error (GRUB_ERR_OUT_OF_MEMORY, -+ N_("cannot allocate command buffer")); -+ } -+ -+ for (i = 0; i < argv.argc; i++) { -+ offset += grub_snprintf (cmdstring + offset, cmdlen - offset, "%s ", -+ argv.args[i]); -+ } -+ cmdstring[cmdlen-1]= '\0'; -+ grub_tpm_measure ((unsigned char *)cmdstring, cmdlen, GRUB_ASCII_PCR, -+ "grub_cmd", cmdstring); -+ grub_print_error(); -+ grub_free(cmdstring); - invert = 0; - argc = argv.argc - 1; - args = argv.args + 1; -diff --git a/include/grub/efi/tpm.h b/include/grub/efi/tpm.h -new file mode 100644 -index 00000000000..63d8a0fe714 ---- /dev/null -+++ b/include/grub/efi/tpm.h -@@ -0,0 +1,153 @@ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * Copyright (C) 2015 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_EFI_TPM_HEADER -+#define GRUB_EFI_TPM_HEADER 1 -+ -+#define EFI_TPM_GUID {0xf541796d, 0xa62e, 0x4954, {0xa7, 0x75, 0x95, 0x84, 0xf6, 0x1b, 0x9c, 0xdd }}; -+#define EFI_TPM2_GUID {0x607f766c, 0x7455, 0x42be, {0x93, 0x0b, 0xe4, 0xd7, 0x6d, 0xb2, 0x72, 0x0f }}; -+ -+typedef struct { -+ grub_efi_uint8_t Major; -+ grub_efi_uint8_t Minor; -+ grub_efi_uint8_t RevMajor; -+ grub_efi_uint8_t RevMinor; -+} TCG_VERSION; -+ -+typedef struct _TCG_EFI_BOOT_SERVICE_CAPABILITY { -+ grub_efi_uint8_t Size; /// Size of this structure. -+ TCG_VERSION StructureVersion; -+ TCG_VERSION ProtocolSpecVersion; -+ grub_efi_uint8_t HashAlgorithmBitmap; /// Hash algorithms . -+ char TPMPresentFlag; /// 00h = TPM not present. -+ char TPMDeactivatedFlag; /// 01h = TPM currently deactivated. -+} TCG_EFI_BOOT_SERVICE_CAPABILITY; -+ -+typedef struct { -+ grub_efi_uint32_t PCRIndex; -+ grub_efi_uint32_t EventType; -+ grub_efi_uint8_t digest[20]; -+ grub_efi_uint32_t EventSize; -+ grub_efi_uint8_t Event[1]; -+} TCG_PCR_EVENT; -+ -+struct grub_efi_tpm_protocol -+{ -+ grub_efi_status_t (*status_check) (struct grub_efi_tpm_protocol *this, -+ TCG_EFI_BOOT_SERVICE_CAPABILITY *ProtocolCapability, -+ grub_efi_uint32_t *TCGFeatureFlags, -+ grub_efi_physical_address_t *EventLogLocation, -+ grub_efi_physical_address_t *EventLogLastEntry); -+ grub_efi_status_t (*hash_all) (struct grub_efi_tpm_protocol *this, -+ grub_efi_uint8_t *HashData, -+ grub_efi_uint64_t HashLen, -+ grub_efi_uint32_t AlgorithmId, -+ grub_efi_uint64_t *HashedDataLen, -+ grub_efi_uint8_t **HashedDataResult); -+ grub_efi_status_t (*log_event) (struct grub_efi_tpm_protocol *this, -+ TCG_PCR_EVENT *TCGLogData, -+ grub_efi_uint32_t *EventNumber, -+ grub_efi_uint32_t Flags); -+ grub_efi_status_t (*pass_through_to_tpm) (struct grub_efi_tpm_protocol *this, -+ grub_efi_uint32_t TpmInputParameterBlockSize, -+ grub_efi_uint8_t *TpmInputParameterBlock, -+ grub_efi_uint32_t TpmOutputParameterBlockSize, -+ grub_efi_uint8_t *TpmOutputParameterBlock); -+ grub_efi_status_t (*log_extend_event) (struct grub_efi_tpm_protocol *this, -+ grub_efi_physical_address_t HashData, -+ grub_efi_uint64_t HashDataLen, -+ grub_efi_uint32_t AlgorithmId, -+ TCG_PCR_EVENT *TCGLogData, -+ grub_efi_uint32_t *EventNumber, -+ grub_efi_physical_address_t *EventLogLastEntry); -+}; -+ -+typedef struct grub_efi_tpm_protocol grub_efi_tpm_protocol_t; -+ -+typedef grub_efi_uint32_t EFI_TCG2_EVENT_LOG_BITMAP; -+typedef grub_efi_uint32_t EFI_TCG2_EVENT_LOG_FORMAT; -+typedef grub_efi_uint32_t EFI_TCG2_EVENT_ALGORITHM_BITMAP; -+ -+typedef struct tdEFI_TCG2_VERSION { -+ grub_efi_uint8_t Major; -+ grub_efi_uint8_t Minor; -+} GRUB_PACKED EFI_TCG2_VERSION; -+ -+typedef struct tdEFI_TCG2_BOOT_SERVICE_CAPABILITY { -+ grub_efi_uint8_t Size; -+ EFI_TCG2_VERSION StructureVersion; -+ EFI_TCG2_VERSION ProtocolVersion; -+ EFI_TCG2_EVENT_ALGORITHM_BITMAP HashAlgorithmBitmap; -+ EFI_TCG2_EVENT_LOG_BITMAP SupportedEventLogs; -+ grub_efi_boolean_t TPMPresentFlag; -+ grub_efi_uint16_t MaxCommandSize; -+ grub_efi_uint16_t MaxResponseSize; -+ grub_efi_uint32_t ManufacturerID; -+ grub_efi_uint32_t NumberOfPcrBanks; -+ EFI_TCG2_EVENT_ALGORITHM_BITMAP ActivePcrBanks; -+} EFI_TCG2_BOOT_SERVICE_CAPABILITY; -+ -+typedef grub_efi_uint32_t TCG_PCRINDEX; -+typedef grub_efi_uint32_t TCG_EVENTTYPE; -+ -+typedef struct tdEFI_TCG2_EVENT_HEADER { -+ grub_efi_uint32_t HeaderSize; -+ grub_efi_uint16_t HeaderVersion; -+ TCG_PCRINDEX PCRIndex; -+ TCG_EVENTTYPE EventType; -+} GRUB_PACKED EFI_TCG2_EVENT_HEADER; -+ -+typedef struct tdEFI_TCG2_EVENT { -+ grub_efi_uint32_t Size; -+ EFI_TCG2_EVENT_HEADER Header; -+ grub_efi_uint8_t Event[1]; -+} GRUB_PACKED EFI_TCG2_EVENT; -+ -+struct grub_efi_tpm2_protocol -+{ -+ grub_efi_status_t (*get_capability) (struct grub_efi_tpm2_protocol *this, -+ EFI_TCG2_BOOT_SERVICE_CAPABILITY *ProtocolCapability); -+ grub_efi_status_t (*get_event_log) (struct grub_efi_tpm2_protocol *this, -+ EFI_TCG2_EVENT_LOG_FORMAT EventLogFormat, -+ grub_efi_physical_address_t *EventLogLocation, -+ grub_efi_physical_address_t *EventLogLastEntry, -+ grub_efi_boolean_t *EventLogTruncated); -+ grub_efi_status_t (*hash_log_extend_event) (struct grub_efi_tpm2_protocol *this, -+ grub_efi_uint64_t Flags, -+ grub_efi_physical_address_t DataToHash, -+ grub_efi_uint64_t DataToHashLen, -+ EFI_TCG2_EVENT *EfiTcgEvent); -+ grub_efi_status_t (*submit_command) (struct grub_efi_tpm2_protocol *this, -+ grub_efi_uint32_t InputParameterBlockSize, -+ grub_efi_uint8_t *InputParameterBlock, -+ grub_efi_uint32_t OutputParameterBlockSize, -+ grub_efi_uint8_t *OutputParameterBlock); -+ grub_efi_status_t (*get_active_pcr_blanks) (struct grub_efi_tpm2_protocol *this, -+ grub_efi_uint32_t *ActivePcrBanks); -+ grub_efi_status_t (*set_active_pcr_banks) (struct grub_efi_tpm2_protocol *this, -+ grub_efi_uint32_t ActivePcrBanks); -+ grub_efi_status_t (*get_result_of_set_active_pcr_banks) (struct grub_efi_tpm2_protocol *this, -+ grub_efi_uint32_t *OperationPresent, -+ grub_efi_uint32_t *Response); -+}; -+ -+typedef struct grub_efi_tpm2_protocol grub_efi_tpm2_protocol_t; -+ -+#define TCG_ALG_SHA 0x00000004 -+ -+#endif -diff --git a/include/grub/tpm.h b/include/grub/tpm.h -new file mode 100644 -index 00000000000..ce52be4ff7f ---- /dev/null -+++ b/include/grub/tpm.h -@@ -0,0 +1,94 @@ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * Copyright (C) 2015 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_TPM_HEADER -+#define GRUB_TPM_HEADER 1 -+ -+#define SHA1_DIGEST_SIZE 20 -+ -+#define TPM_BASE 0x0 -+#define TPM_SUCCESS TPM_BASE -+#define TPM_AUTHFAIL (TPM_BASE + 0x1) -+#define TPM_BADINDEX (TPM_BASE + 0x2) -+ -+#define GRUB_ASCII_PCR 8 -+#define GRUB_BINARY_PCR 9 -+ -+#define TPM_TAG_RQU_COMMAND 0x00C1 -+#define TPM_ORD_Extend 0x14 -+ -+#define EV_IPL 0x0d -+ -+/* TCG_PassThroughToTPM Input Parameter Block */ -+typedef struct { -+ grub_uint16_t IPBLength; -+ grub_uint16_t Reserved1; -+ grub_uint16_t OPBLength; -+ grub_uint16_t Reserved2; -+ grub_uint8_t TPMOperandIn[1]; -+} GRUB_PACKED PassThroughToTPM_InputParamBlock; -+ -+/* TCG_PassThroughToTPM Output Parameter Block */ -+typedef struct { -+ grub_uint16_t OPBLength; -+ grub_uint16_t Reserved; -+ grub_uint8_t TPMOperandOut[1]; -+} GRUB_PACKED PassThroughToTPM_OutputParamBlock; -+ -+typedef struct { -+ grub_uint16_t tag; -+ grub_uint32_t paramSize; -+ grub_uint32_t ordinal; -+ grub_uint32_t pcrNum; -+ grub_uint8_t inDigest[SHA1_DIGEST_SIZE]; /* The 160 bit value representing the event to be recorded. */ -+} GRUB_PACKED ExtendIncoming; -+ -+/* TPM_Extend Outgoing Operand */ -+typedef struct { -+ grub_uint16_t tag; -+ grub_uint32_t paramSize; -+ grub_uint32_t returnCode; -+ grub_uint8_t outDigest[SHA1_DIGEST_SIZE]; /* The PCR value after execution of the command. */ -+} GRUB_PACKED ExtendOutgoing; -+ -+grub_err_t EXPORT_FUNC(grub_tpm_measure) (unsigned char *buf, grub_size_t size, -+ grub_uint8_t pcr, const char *kind, -+ const char *description); -+#if defined (GRUB_MACHINE_EFI) -+grub_err_t grub_tpm_execute(PassThroughToTPM_InputParamBlock *inbuf, -+ PassThroughToTPM_OutputParamBlock *outbuf); -+grub_err_t grub_tpm_log_event(unsigned char *buf, grub_size_t size, -+ grub_uint8_t pcr, const char *description); -+#else -+static inline grub_err_t grub_tpm_execute( -+ PassThroughToTPM_InputParamBlock *inbuf __attribute__ ((unused)), -+ PassThroughToTPM_OutputParamBlock *outbuf __attribute__ ((unused))) -+{ -+ return 0; -+}; -+static inline grub_err_t grub_tpm_log_event( -+ unsigned char *buf __attribute__ ((unused)), -+ grub_size_t size __attribute__ ((unused)), -+ grub_uint8_t pcr __attribute__ ((unused)), -+ const char *description __attribute__ ((unused))) -+{ -+ return 0; -+}; -+#endif -+ -+#endif -diff --git a/grub-core/Makefile.am b/grub-core/Makefile.am -index f36200bd688..3781bb9cbb9 100644 ---- a/grub-core/Makefile.am -+++ b/grub-core/Makefile.am -@@ -94,6 +94,7 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/term.h - KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/time.h - KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/mm_private.h - KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/net.h -+KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/tpm.h - KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/memory.h - - if COND_i386_pc diff --git a/0108-Don-t-attempt-to-export-the-start-and-_start-symbols.patch b/0107-Don-t-attempt-to-export-the-start-and-_start-symbols.patch similarity index 94% rename from 0108-Don-t-attempt-to-export-the-start-and-_start-symbols.patch rename to 0107-Don-t-attempt-to-export-the-start-and-_start-symbols.patch index 33ceb3d..f6c1185 100644 --- a/0108-Don-t-attempt-to-export-the-start-and-_start-symbols.patch +++ b/0107-Don-t-attempt-to-export-the-start-and-_start-symbols.patch @@ -26,10 +26,10 @@ Signed-off-by: Javier Martinez Canillas 1 file changed, 2 insertions(+) diff --git a/include/grub/kernel.h b/include/grub/kernel.h -index ae69218af20..9548d552aad 100644 +index e5a5f436709..de48cd44ccb 100644 --- a/include/grub/kernel.h +++ b/include/grub/kernel.h -@@ -108,8 +108,10 @@ grub_addr_t grub_modules_get_end (void); +@@ -110,8 +110,10 @@ grub_addr_t grub_modules_get_end (void); #endif diff --git a/0109-Fixup-for-newer-compiler.patch b/0108-Fixup-for-newer-compiler.patch similarity index 96% rename from 0109-Fixup-for-newer-compiler.patch rename to 0108-Fixup-for-newer-compiler.patch index e518af8..e35dbdb 100644 --- a/0109-Fixup-for-newer-compiler.patch +++ b/0108-Fixup-for-newer-compiler.patch @@ -8,7 +8,7 @@ Subject: [PATCH] Fixup for newer compiler 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/Makefile.common b/conf/Makefile.common -index 044ab3abe88..c75848f5c06 100644 +index 4ba729e14d8..5e8ba2ae3b0 100644 --- a/conf/Makefile.common +++ b/conf/Makefile.common @@ -38,7 +38,7 @@ CFLAGS_KERNEL = $(CFLAGS_PLATFORM) -ffreestanding diff --git a/0111-Add-support-for-non-Ethernet-network-cards.patch b/0109-Add-support-for-non-Ethernet-network-cards.patch similarity index 94% rename from 0111-Add-support-for-non-Ethernet-network-cards.patch rename to 0109-Add-support-for-non-Ethernet-network-cards.patch index f1b7656..dc89c99 100644 --- a/0111-Add-support-for-non-Ethernet-network-cards.patch +++ b/0109-Add-support-for-non-Ethernet-network-cards.patch @@ -1,6 +1,6 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Andrzej Kacprowski -Date: Fri, 21 Apr 2017 10:06:20 +0200 +Date: Wed, 10 Jul 2019 15:22:29 +0200 Subject: [PATCH] Add support for non-Ethernet network cards This patch replaces fixed 6-byte link layer address with @@ -24,7 +24,7 @@ Signed-off-by: Andrzej Kacprowski Signed-off-by: Mark Salter --- grub-core/net/arp.c | 155 ++++++++++++++++++++++----------- - grub-core/net/bootp.c | 14 ++- + grub-core/net/bootp.c | 15 ++-- grub-core/net/drivers/efi/efinet.c | 8 +- grub-core/net/drivers/emu/emunet.c | 1 + grub-core/net/drivers/i386/pc/pxe.c | 13 +-- @@ -35,7 +35,7 @@ Signed-off-by: Mark Salter grub-core/net/ip.c | 4 +- grub-core/net/net.c | 50 ++++++----- include/grub/net.h | 19 ++-- - 12 files changed, 218 insertions(+), 152 deletions(-) + 12 files changed, 219 insertions(+), 152 deletions(-) diff --git a/grub-core/net/arp.c b/grub-core/net/arp.c index 54306e3b16d..67b409a8acc 100644 @@ -271,10 +271,10 @@ index 54306e3b16d..67b409a8acc 100644 /* Change operation to REPLY and send packet */ send_ethernet_packet (inf, &nb_reply, target, GRUB_NET_ETHERTYPE_ARP); diff --git a/grub-core/net/bootp.c b/grub-core/net/bootp.c -index 2869482fe06..4e55adc557b 100644 +index 8c969595a7b..3cf6dbf0e72 100644 --- a/grub-core/net/bootp.c +++ b/grub-core/net/bootp.c -@@ -219,7 +219,6 @@ grub_net_configure_by_dhcp_ack (const char *name, +@@ -269,7 +269,6 @@ grub_net_configure_by_dhcp_ack (const char *name, int is_def, char **device, char **path) { grub_net_network_level_address_t addr; @@ -282,7 +282,7 @@ index 2869482fe06..4e55adc557b 100644 struct grub_net_network_level_interface *inter; int mask = -1; char server_ip[sizeof ("xxx.xxx.xxx.xxx")]; -@@ -232,12 +231,8 @@ grub_net_configure_by_dhcp_ack (const char *name, +@@ -286,12 +285,8 @@ grub_net_configure_by_dhcp_ack (const char *name, if (path) *path = 0; @@ -297,24 +297,25 @@ index 2869482fe06..4e55adc557b 100644 if (!inter) return 0; -@@ -770,7 +765,8 @@ grub_cmd_bootp (struct grub_command *cmd __attribute__ ((unused)), - grub_memset (pack, 0, sizeof (*pack) + 64); - pack->opcode = 1; - pack->hw_type = 1; -- pack->hw_len = 6; -+ pack->hw_len = ifaces[j].hwaddress.len > 16 ? 0 -+ : ifaces[j].hwaddress.len; - err = grub_get_datetime (&date); - if (err || !grub_datetime2unixtime (&date, &t)) - { -@@ -781,7 +777,7 @@ grub_cmd_bootp (struct grub_command *cmd __attribute__ ((unused)), - ifaces[j].dhcp_xid = pack->xid; - pack->seconds = grub_cpu_to_be16 (t); +@@ -601,7 +596,9 @@ send_dhcp_packet (struct grub_net_network_level_interface *iface) + grub_memset (pack, 0, sizeof (*pack)); + pack->opcode = 1; + pack->hw_type = 1; +- pack->hw_len = 6; ++ pack->hw_len = iface->hwaddress.len > 16 ? 0 ++ : iface->hwaddress.len; ++ + err = grub_get_datetime (&date); + if (err || !grub_datetime2unixtime (&date, &t)) + { +@@ -614,7 +611,7 @@ send_dhcp_packet (struct grub_net_network_level_interface *iface) + else + pack->ident = iface->xid; -- grub_memcpy (&pack->mac_addr, &ifaces[j].hwaddress.mac, 6); -+ grub_memcpy (&pack->mac_addr, &ifaces[j].hwaddress.mac, pack->hw_len); +- grub_memcpy (&pack->mac_addr, &iface->hwaddress.mac, 6); ++ grub_memcpy (&pack->mac_addr, &iface->hwaddress.mac, pack->hw_len); - grub_netbuff_push (nb, sizeof (*udph)); + grub_netbuff_push (nb, sizeof (*udph)); diff --git a/grub-core/net/drivers/efi/efinet.c b/grub-core/net/drivers/efi/efinet.c index a57189e8bb3..4444e8e60ee 100644 @@ -389,7 +390,7 @@ index 3f4152d036c..9f8fb4b6d2b 100644 grub_pxe_card.default_address.type = GRUB_NET_LINK_LEVEL_PROTOCOL_ETHERNET; diff --git a/grub-core/net/drivers/ieee1275/ofnet.c b/grub-core/net/drivers/ieee1275/ofnet.c -index 3df75357a70..ba50415f5f6 100644 +index 3860b6f78d8..bcb3f9ea02d 100644 --- a/grub-core/net/drivers/ieee1275/ofnet.c +++ b/grub-core/net/drivers/ieee1275/ofnet.c @@ -160,6 +160,7 @@ grub_ieee1275_parse_bootpath (const char *devpath, char *bootpath, @@ -611,22 +612,22 @@ index 2cbd95dce25..56a3ec5c8e8 100644 } if (ohdr->type == OPTION_PREFIX && ohdr->len == 4) diff --git a/grub-core/net/ip.c b/grub-core/net/ip.c -index 8411e0ecca3..b2ca74b6eb1 100644 +index ea5edf8f1f6..a5896f6dc26 100644 --- a/grub-core/net/ip.c +++ b/grub-core/net/ip.c -@@ -277,8 +277,8 @@ handle_dgram (struct grub_net_buff *nb, +@@ -276,8 +276,8 @@ handle_dgram (struct grub_net_buff *nb, + if (inf->card == card && inf->address.type == GRUB_NET_NETWORK_LEVEL_PROTOCOL_DHCP_RECV - && inf->dhcp_xid == bootp->xid && inf->hwaddress.type == GRUB_NET_LINK_LEVEL_PROTOCOL_ETHERNET - && grub_memcmp (inf->hwaddress.mac, &bootp->mac_addr, - sizeof (inf->hwaddress.mac)) == 0) + && (grub_memcmp (inf->hwaddress.mac, &bootp->mac_addr, + bootp->hw_len) == 0 || bootp->hw_len == 0)) { - grub_net_process_dhcp (nb, inf->card); + grub_net_process_dhcp (nb, inf); grub_netbuff_free (nb); diff --git a/grub-core/net/net.c b/grub-core/net/net.c -index fa3e2912643..9700e2d09a2 100644 +index 5366e443d2a..6468eb24596 100644 --- a/grub-core/net/net.c +++ b/grub-core/net/net.c @@ -128,8 +128,9 @@ grub_net_link_layer_resolve (struct grub_net_network_level_interface *inf, @@ -712,7 +713,7 @@ index fa3e2912643..9700e2d09a2 100644 int diff --git a/include/grub/net.h b/include/grub/net.h -index de51894cbbf..e9ebc6a1b4f 100644 +index 3647012374b..fc1fc44baef 100644 --- a/include/grub/net.h +++ b/include/grub/net.h @@ -29,7 +29,8 @@ @@ -745,7 +746,7 @@ index de51894cbbf..e9ebc6a1b4f 100644 }; } grub_net_link_level_address_t; -@@ -555,11 +558,13 @@ grub_net_addr_cmp (const grub_net_network_level_address_t *a, +@@ -566,11 +569,13 @@ grub_net_addr_cmp (const grub_net_network_level_address_t *a, #define GRUB_NET_MAX_STR_ADDR_LEN sizeof ("XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX") /* diff --git a/0110-Use-xid-to-match-DHCP-replies.patch b/0110-Use-xid-to-match-DHCP-replies.patch deleted file mode 100644 index 657ebb7..0000000 --- a/0110-Use-xid-to-match-DHCP-replies.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Andrzej Kacprowski -Date: Fri, 21 Apr 2017 09:20:38 +0200 -Subject: [PATCH] Use xid to match DHCP replies - -Transaction identifier (xid) from DHCP request -packet is stored in network level interface and used -to match request with the responses it generates. - -Resolves: rhbz#1370642 - -Signed-off-by: Andrzej Kacprowski ---- - grub-core/net/bootp.c | 3 ++- - grub-core/net/ip.c | 1 + - include/grub/net.h | 3 ++- - 3 files changed, 5 insertions(+), 2 deletions(-) - -diff --git a/grub-core/net/bootp.c b/grub-core/net/bootp.c -index da3e454466b..2869482fe06 100644 ---- a/grub-core/net/bootp.c -+++ b/grub-core/net/bootp.c -@@ -777,7 +777,8 @@ grub_cmd_bootp (struct grub_command *cmd __attribute__ ((unused)), - grub_errno = GRUB_ERR_NONE; - t = 0; - } -- pack->ident = grub_cpu_to_be32 (t); -+ pack->xid = grub_cpu_to_be32 (t); -+ ifaces[j].dhcp_xid = pack->xid; - pack->seconds = grub_cpu_to_be16 (t); - - grub_memcpy (&pack->mac_addr, &ifaces[j].hwaddress.mac, 6); -diff --git a/grub-core/net/ip.c b/grub-core/net/ip.c -index 7c95cc7464a..8411e0ecca3 100644 ---- a/grub-core/net/ip.c -+++ b/grub-core/net/ip.c -@@ -275,6 +275,7 @@ handle_dgram (struct grub_net_buff *nb, - FOR_NET_NETWORK_LEVEL_INTERFACES (inf) - if (inf->card == card - && inf->address.type == GRUB_NET_NETWORK_LEVEL_PROTOCOL_DHCP_RECV -+ && inf->dhcp_xid == bootp->xid - && inf->hwaddress.type == GRUB_NET_LINK_LEVEL_PROTOCOL_ETHERNET - && grub_memcmp (inf->hwaddress.mac, &bootp->mac_addr, - sizeof (inf->hwaddress.mac)) == 0) -diff --git a/include/grub/net.h b/include/grub/net.h -index f8f3ec13acc..de51894cbbf 100644 ---- a/include/grub/net.h -+++ b/include/grub/net.h -@@ -292,6 +292,7 @@ struct grub_net_network_level_interface - struct grub_net_bootp_packet *dhcp_ack; - grub_size_t dhcp_acklen; - grub_uint16_t vlantag; -+ grub_uint32_t dhcp_xid; - void *data; - }; - -@@ -429,7 +430,7 @@ struct grub_net_bootp_packet - grub_uint8_t hw_type; /* hardware type. */ - grub_uint8_t hw_len; /* hardware addr len. */ - grub_uint8_t gate_hops; /* zero it. */ -- grub_uint32_t ident; /* random number chosen by client. */ -+ grub_uint32_t xid; /* transaction id chosen by client. */ - grub_uint16_t seconds; /* seconds since did initial bootstrap. */ - grub_uint16_t flags; - grub_uint32_t client_ip; diff --git a/0112-misc-fix-invalid-character-recongition-in-strto-l.patch b/0110-misc-fix-invalid-character-recongition-in-strto-l.patch similarity index 100% rename from 0112-misc-fix-invalid-character-recongition-in-strto-l.patch rename to 0110-misc-fix-invalid-character-recongition-in-strto-l.patch diff --git a/0113-net-read-bracketed-ipv6-addrs-and-port-numbers.patch b/0111-net-read-bracketed-ipv6-addrs-and-port-numbers.patch similarity index 99% rename from 0113-net-read-bracketed-ipv6-addrs-and-port-numbers.patch rename to 0111-net-read-bracketed-ipv6-addrs-and-port-numbers.patch index 9199fe8..e014e61 100644 --- a/0113-net-read-bracketed-ipv6-addrs-and-port-numbers.patch +++ b/0111-net-read-bracketed-ipv6-addrs-and-port-numbers.patch @@ -89,7 +89,7 @@ index 5aa4ad3befc..00737c52750 100644 if (!data->sock) { diff --git a/grub-core/net/net.c b/grub-core/net/net.c -index 9700e2d09a2..191e8e41bd6 100644 +index 6468eb24596..2734f70d22f 100644 --- a/grub-core/net/net.c +++ b/grub-core/net/net.c @@ -439,6 +439,13 @@ parse_ip6 (const char *val, grub_uint64_t *ip, const char **rest) @@ -260,7 +260,7 @@ index f90071353ad..e267af354f4 100644 if (!data->sock) { diff --git a/include/grub/net.h b/include/grub/net.h -index e9ebc6a1b4f..f4cd86e582f 100644 +index fc1fc44baef..fa7a8c39704 100644 --- a/include/grub/net.h +++ b/include/grub/net.h @@ -273,6 +273,7 @@ typedef struct grub_net diff --git a/0114-bootp-New-net_bootp6-command.patch b/0112-bootp-New-net_bootp6-command.patch similarity index 84% rename from 0114-bootp-New-net_bootp6-command.patch rename to 0112-bootp-New-net_bootp6-command.patch index ae02563..8cb4ed8 100644 --- a/0114-bootp-New-net_bootp6-command.patch +++ b/0112-bootp-New-net_bootp6-command.patch @@ -1,6 +1,6 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Michael Chang -Date: Sun, 10 Jul 2016 23:46:06 +0800 +Date: Wed, 10 Jul 2019 15:42:36 +0200 Subject: [PATCH] bootp: New net_bootp6 command Implement new net_bootp6 command for IPv6 network auto configuration via the @@ -11,15 +11,15 @@ Signed-off-by: Ken Lin [pjones: Put back our code to add a local route] Signed-off-by: Peter Jones --- - grub-core/net/bootp.c | 1053 ++++++++++++++++++++++++++++++------ + grub-core/net/bootp.c | 1059 ++++++++++++++++++++++++++++++------ grub-core/net/drivers/efi/efinet.c | 20 +- grub-core/net/ip.c | 39 ++ include/grub/efi/api.h | 2 +- include/grub/net.h | 91 ++-- - 5 files changed, 999 insertions(+), 206 deletions(-) + 5 files changed, 1002 insertions(+), 209 deletions(-) diff --git a/grub-core/net/bootp.c b/grub-core/net/bootp.c -index 4e55adc557b..242cd1f4cbd 100644 +index 3cf6dbf0e72..85adc9cb447 100644 --- a/grub-core/net/bootp.c +++ b/grub-core/net/bootp.c @@ -25,6 +25,98 @@ @@ -119,26 +119,12 @@ index 4e55adc557b..242cd1f4cbd 100644 + return 1; +} - static char * - grub_env_write_readonly (struct grub_env_var *var __attribute__ ((unused)), -@@ -345,178 +437,583 @@ grub_net_configure_by_dhcp_ack (const char *name, - return inter; + struct grub_dhcp_discover_options + { +@@ -638,6 +730,584 @@ out: + return err; } --struct grub_net_network_level_interface * --grub_net_configure_by_dhcpv6_ack (const char *name, -- struct grub_net_card *card, -- grub_net_interface_flags_t flags -- __attribute__((__unused__)), -- const grub_net_link_level_address_t *hwaddr, -- const struct grub_net_dhcpv6_packet *packet, -- int is_def, char **device, char **path) --{ -- struct grub_net_network_level_interface *inter = NULL; -- struct grub_net_network_level_address addr; -- int mask = -1; -- -- if (!device || !path) +/* The default netbuff size for sending DHCPv6 packets which should be + large enough to hold the information */ +#define GRUB_DHCP6_DEFAULT_NETBUFF_ALLOC_SIZE 512 @@ -356,19 +342,8 @@ index 4e55adc557b..242cd1f4cbd 100644 + + options = grub_zalloc (sizeof(*options)); + if (!options) - return NULL; - -- *device = 0; -- *path = 0; -- -- grub_dprintf ("net", "mac address is %02x:%02x:%02x:%02x:%02x:%02x\n", -- hwaddr->mac[0], hwaddr->mac[1], hwaddr->mac[2], -- hwaddr->mac[3], hwaddr->mac[4], hwaddr->mac[5]); -- -- if (is_def) -- grub_net_default_server = 0; -- -- if (is_def && !grub_net_default_server && packet) ++ return NULL; ++ + foreach_dhcp6_option ((const struct grub_net_dhcp6_option *)v6h->dhcp_options, + size - sizeof (*v6h), parse_dhcp6_option, options); + @@ -412,165 +387,37 @@ index 4e55adc557b..242cd1f4cbd 100644 + struct grub_net_network_level_interface *inf; + + if (dhcp6->ia_addr) - { -- const grub_uint8_t *options = packet->dhcp_options; -- unsigned int option_max = 1024 - OFFSET_OF (dhcp_options, packet); -- unsigned int i; -- -- for (i = 0; i < option_max - sizeof (grub_net_dhcpv6_option_t); ) -- { -- grub_uint16_t num, len; -- grub_net_dhcpv6_option_t *opt = -- (grub_net_dhcpv6_option_t *)(options + i); -- -- num = grub_be_to_cpu16(opt->option_num); -- len = grub_be_to_cpu16(opt->option_len); -- -- grub_dprintf ("net", "got dhcpv6 option %d len %d\n", num, len); -- -- if (len == 0) -- break; -- -- if (len + i > 1024) -- break; -- -- if (num == GRUB_NET_DHCP6_BOOTFILE_URL) -- { -- char *scheme, *userinfo, *host, *file; -- char *tmp; -- int hostlen; -- int port; -- int rc = extract_url_info ((const char *)opt->option_data, -- (grub_size_t)len, -- &scheme, &userinfo, &host, &port, -- &file); -- if (rc < 0) -- continue; -- -- /* right now this only handles tftp. */ -- if (grub_strcmp("tftp", scheme)) -- { -- grub_free (scheme); -- grub_free (userinfo); -- grub_free (host); -- grub_free (file); -- continue; -- } -- grub_free (userinfo); -- -- hostlen = grub_strlen (host); -- if (hostlen > 2 && host[0] == '[' && host[hostlen-1] == ']') -- { -- tmp = host+1; -- host[hostlen-1] = '\0'; -- } -- else -- tmp = host; ++ { + inf = grub_net_add_addr (name, card, dhcp6->ia_addr, &card->default_address, flags); - -- *device = grub_xasprintf ("%s,%s", scheme, tmp); -- grub_free (scheme); -- grub_free (host); ++ + netaddr.type = GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV6; + netaddr.ipv6.base[0] = dhcp6->ia_addr->ipv6[0]; + netaddr.ipv6.base[1] = 0; + netaddr.ipv6.masksize = 64; + grub_net_add_route (name, netaddr, inf); - -- if (file && *file) -- { -- tmp = grub_strrchr (file, '/'); -- if (tmp) -- *(tmp+1) = '\0'; -- else -- file[0] = '\0'; -- } -- else if (!file) -- file = grub_strdup (""); -- -- if (file[0] == '/') -- { -- *path = grub_strdup (file+1); -- grub_free (file); -- } -- else -- *path = file; -- } -- else if (num == GRUB_NET_DHCP6_IA_NA) -- { -- const grub_net_dhcpv6_option_t *ia_na_opt; -- const grub_net_dhcpv6_opt_ia_na_t *ia_na = -- (const grub_net_dhcpv6_opt_ia_na_t *)opt; -- unsigned int left = len - OFFSET_OF (options, ia_na); -- unsigned int j; -- -- if ((grub_uint8_t *)ia_na + left > -- (grub_uint8_t *)options + option_max) -- left -= ((grub_uint8_t *)ia_na + left) -- - ((grub_uint8_t *)options + option_max); -- -- if (len < OFFSET_OF (option_data, opt) -- + sizeof (grub_net_dhcpv6_option_t)) -- { -- grub_dprintf ("net", -- "found dhcpv6 ia_na option with no address\n"); -- continue; -- } -- -- for (j = 0; left > sizeof (grub_net_dhcpv6_option_t); ) -- { -- ia_na_opt = (const grub_net_dhcpv6_option_t *) -- (ia_na->options + j); -- grub_uint16_t ia_na_opt_num, ia_na_opt_len; -- -- ia_na_opt_num = grub_be_to_cpu16 (ia_na_opt->option_num); -- ia_na_opt_len = grub_be_to_cpu16 (ia_na_opt->option_len); -- if (ia_na_opt_len == 0) -- break; -- if (j + ia_na_opt_len > left) -- break; -- if (ia_na_opt_num == GRUB_NET_DHCP6_IA_ADDRESS) -- { -- const grub_net_dhcpv6_opt_ia_address_t *ia_addr; -- -- ia_addr = (const grub_net_dhcpv6_opt_ia_address_t *) -- ia_na_opt; -- addr.type = GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV6; -- grub_memcpy(addr.ipv6, ia_addr->ipv6_address, -- sizeof (ia_addr->ipv6_address)); -- inter = grub_net_add_addr (name, card, &addr, hwaddr, 0); -- } -- -- j += ia_na_opt_len; -- left -= ia_na_opt_len; -- } -- } ++ + if (ret_inf) + *ret_inf = inf; + } - -- i += len + 4; -- } ++ + if (dhcp6->dns_server_addrs) + { + grub_uint16_t i; - -- grub_print_error (); ++ + for (i = 0; i < dhcp6->num_dns_server; ++i) + grub_net_add_dns_server (dhcp6->dns_server_addrs + i); - } - -- if (is_def) ++ } ++ + if (dhcp6->boot_file_path) + grub_env_set_net_property (name, "boot_file", dhcp6->boot_file_path, + grub_strlen (dhcp6->boot_file_path)); + + if (is_def && dhcp6->boot_file_server_ip) - { ++ { + grub_net_default_server = grub_strdup (dhcp6->boot_file_server_ip); - grub_env_set ("net_default_interface", name); - grub_env_export ("net_default_interface"); - } ++ grub_env_set ("net_default_interface", name); ++ grub_env_export ("net_default_interface"); ++ } +} + +static void @@ -590,10 +437,7 @@ index 4e55adc557b..242cd1f4cbd 100644 + grub_errno = GRUB_ERR_NONE; + t = 0; + } - -- if (inter) -- grub_net_add_ipv6_local (inter, mask); -- return inter; ++ + se->iface = iface; + se->iaid = iaid; + se->transaction_id = t; @@ -604,8 +448,8 @@ index 4e55adc557b..242cd1f4cbd 100644 + se->adv = NULL; + se->reply = NULL; + grub_list_push (GRUB_AS_LIST_P (&grub_dhcp6_sessions), GRUB_AS_LIST (se)); - } - ++} ++ +static void +grub_dhcp6_session_remove (grub_dhcp6_session_t se) +{ @@ -858,16 +702,17 @@ index 4e55adc557b..242cd1f4cbd 100644 + + return inf; +} - - void - grub_net_process_dhcp (struct grub_net_buff *nb, -@@ -550,6 +1047,77 @@ grub_net_process_dhcp (struct grub_net_buff *nb, ++ + /* + * This is called directly from net/ip.c:handle_dgram(), because those + * BOOTP/DHCP packets are a bit special due to their improper +@@ -706,6 +1376,77 @@ grub_net_process_dhcp (struct grub_net_buff *nb, } } +grub_err_t +grub_net_process_dhcp6 (struct grub_net_buff *nb, -+ struct grub_net_card *card __attribute__ ((unused))) ++ struct grub_net_card *card __attribute__ ((unused))) +{ + const struct grub_net_dhcp6_packet *v6h; + grub_dhcp6_session_t se; @@ -890,9 +735,9 @@ index 4e55adc557b..242cd1f4cbd 100644 + FOR_DHCP6_SESSIONS (se) + { + if (se->transaction_id == v6h->transaction_id && -+ grub_memcmp (options->client_duid, &se->duid, sizeof (se->duid)) == 0 && -+ se->iaid == options->iaid) -+ break; ++ grub_memcmp (options->client_duid, &se->duid, sizeof (se->duid)) == 0 && ++ se->iaid == options->iaid) ++ break; + } + + if (!se) @@ -905,11 +750,11 @@ index 4e55adc557b..242cd1f4cbd 100644 + if (v6h->message_type == GRUB_NET_DHCP6_ADVERTISE) + { + if (se->adv) -+ { -+ grub_dprintf ("bootp", "Skipped DHCPv6 Advertised .. \n"); -+ grub_dhcp6_options_free (options); -+ return GRUB_ERR_NONE; -+ } ++ { ++ grub_dprintf ("bootp", "Skipped DHCPv6 Advertised .. \n"); ++ grub_dhcp6_options_free (options); ++ return GRUB_ERR_NONE; ++ } + + se->adv = options; + return grub_dhcp6_session_send_request (se); @@ -917,11 +762,11 @@ index 4e55adc557b..242cd1f4cbd 100644 + else if (v6h->message_type == GRUB_NET_DHCP6_REPLY) + { + if (!se->adv) -+ { -+ grub_dprintf ("bootp", "Skipped DHCPv6 Reply .. \n"); -+ grub_dhcp6_options_free (options); -+ return GRUB_ERR_NONE; -+ } ++ { ++ grub_dprintf ("bootp", "Skipped DHCPv6 Reply .. \n"); ++ grub_dhcp6_options_free (options); ++ return GRUB_ERR_NONE; ++ } + + se->reply = options; + grub_dhcp6_session_configure_network (se); @@ -939,183 +784,342 @@ index 4e55adc557b..242cd1f4cbd 100644 static grub_err_t grub_cmd_dhcpopt (struct grub_command *cmd __attribute__ ((unused)), int argc, char **args) -@@ -824,7 +1392,174 @@ grub_cmd_bootp (struct grub_command *cmd __attribute__ ((unused)), +@@ -931,180 +1672,174 @@ grub_cmd_bootp (struct grub_command *cmd __attribute__ ((unused)), return err; } --static grub_command_t cmd_getdhcp, cmd_bootp; +-static grub_command_t cmd_getdhcp, cmd_bootp, cmd_dhcp; +- +-struct grub_net_network_level_interface * +-grub_net_configure_by_dhcpv6_ack (const char *name, +- struct grub_net_card *card, +- grub_net_interface_flags_t flags +- __attribute__((__unused__)), +- const grub_net_link_level_address_t *hwaddr, +- const struct grub_net_dhcpv6_packet *packet, +- int is_def, char **device, char **path) +static grub_err_t +grub_cmd_bootp6 (struct grub_command *cmd __attribute__ ((unused)), -+ int argc, char **args) -+{ ++ int argc, char **args) + { +- struct grub_net_network_level_interface *inter = NULL; +- struct grub_net_network_level_address addr; +- int mask = -1; + struct grub_net_card *card; + grub_uint32_t iaid = 0; + int interval; + grub_err_t err; + grub_dhcp6_session_t se; -+ + +- if (!device || !path) +- return NULL; + err = GRUB_ERR_NONE; -+ + +- *device = 0; +- *path = 0; + FOR_NET_CARDS (card) + { + struct grub_net_network_level_interface *iface; -+ + +- grub_dprintf ("net", "mac address is %02x:%02x:%02x:%02x:%02x:%02x\n", +- hwaddr->mac[0], hwaddr->mac[1], hwaddr->mac[2], +- hwaddr->mac[3], hwaddr->mac[4], hwaddr->mac[5]); + if (argc > 0 && grub_strcmp (card->name, args[0]) != 0) + continue; -+ + +- if (is_def) +- grub_net_default_server = 0; + iface = grub_net_ipv6_get_link_local (card, &card->default_address); + if (!iface) + { -+ grub_dhcp6_session_remove_all (); -+ return grub_errno; ++ grub_dhcp6_session_remove_all (); ++ return grub_errno; + } -+ + +- if (is_def && !grub_net_default_server && packet) + grub_dhcp6_session_add (iface, iaid++); + } + + for (interval = 200; interval < 10000; interval *= 2) -+ { + { +- const grub_uint8_t *options = packet->dhcp_options; +- unsigned int option_max = 1024 - OFFSET_OF (dhcp_options, packet); +- unsigned int i; +- +- for (i = 0; i < option_max - sizeof (grub_net_dhcpv6_option_t); ) +- { +- grub_uint16_t num, len; +- grub_net_dhcpv6_option_t *opt = +- (grub_net_dhcpv6_option_t *)(options + i); +- +- num = grub_be_to_cpu16(opt->option_num); +- len = grub_be_to_cpu16(opt->option_len); +- +- grub_dprintf ("net", "got dhcpv6 option %d len %d\n", num, len); +- +- if (len == 0) +- break; +- +- if (len + i > 1024) +- break; +- +- if (num == GRUB_NET_DHCP6_BOOTFILE_URL) +- { +- char *scheme, *userinfo, *host, *file; +- char *tmp; +- int hostlen; +- int port; +- int rc = extract_url_info ((const char *)opt->option_data, +- (grub_size_t)len, +- &scheme, &userinfo, &host, &port, +- &file); +- if (rc < 0) +- continue; +- +- /* right now this only handles tftp. */ +- if (grub_strcmp("tftp", scheme)) +- { +- grub_free (scheme); +- grub_free (userinfo); +- grub_free (host); +- grub_free (file); +- continue; +- } +- grub_free (userinfo); +- +- hostlen = grub_strlen (host); +- if (hostlen > 2 && host[0] == '[' && host[hostlen-1] == ']') +- { +- tmp = host+1; +- host[hostlen-1] = '\0'; +- } +- else +- tmp = host; +- +- *device = grub_xasprintf ("%s,%s", scheme, tmp); +- grub_free (scheme); +- grub_free (host); +- +- if (file && *file) +- { +- tmp = grub_strrchr (file, '/'); +- if (tmp) +- *(tmp+1) = '\0'; +- else +- file[0] = '\0'; +- } +- else if (!file) +- file = grub_strdup (""); +- +- if (file[0] == '/') +- { +- *path = grub_strdup (file+1); +- grub_free (file); +- } +- else +- *path = file; +- } +- else if (num == GRUB_NET_DHCP6_IA_NA) +- { +- const grub_net_dhcpv6_option_t *ia_na_opt; +- const grub_net_dhcpv6_opt_ia_na_t *ia_na = +- (const grub_net_dhcpv6_opt_ia_na_t *)opt; +- unsigned int left = len - OFFSET_OF (options, ia_na); +- unsigned int j; +- +- if ((grub_uint8_t *)ia_na + left > +- (grub_uint8_t *)options + option_max) +- left -= ((grub_uint8_t *)ia_na + left) +- - ((grub_uint8_t *)options + option_max); +- +- if (len < OFFSET_OF (option_data, opt) +- + sizeof (grub_net_dhcpv6_option_t)) +- { +- grub_dprintf ("net", +- "found dhcpv6 ia_na option with no address\n"); +- continue; +- } +- +- for (j = 0; left > sizeof (grub_net_dhcpv6_option_t); ) +- { +- ia_na_opt = (const grub_net_dhcpv6_option_t *) +- (ia_na->options + j); +- grub_uint16_t ia_na_opt_num, ia_na_opt_len; +- +- ia_na_opt_num = grub_be_to_cpu16 (ia_na_opt->option_num); +- ia_na_opt_len = grub_be_to_cpu16 (ia_na_opt->option_len); +- if (ia_na_opt_len == 0) +- break; +- if (j + ia_na_opt_len > left) +- break; +- if (ia_na_opt_num == GRUB_NET_DHCP6_IA_ADDRESS) +- { +- const grub_net_dhcpv6_opt_ia_address_t *ia_addr; +- +- ia_addr = (const grub_net_dhcpv6_opt_ia_address_t *) +- ia_na_opt; +- addr.type = GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV6; +- grub_memcpy(addr.ipv6, ia_addr->ipv6_address, +- sizeof (ia_addr->ipv6_address)); +- inter = grub_net_add_addr (name, card, &addr, hwaddr, 0); +- } +- +- j += ia_na_opt_len; +- left -= ia_na_opt_len; +- } +- } +- +- i += len + 4; +- } +- +- grub_print_error (); + int done = 1; + + FOR_DHCP6_SESSIONS (se) -+ { -+ struct grub_net_buff *nb; -+ struct grub_net_dhcp6_option *opt; -+ struct grub_net_dhcp6_packet *v6h; -+ struct grub_net_dhcp6_option_duid_ll *duid; -+ struct grub_net_dhcp6_option_iana *ia_na; -+ grub_net_network_level_address_t multicast; -+ grub_net_link_level_address_t ll_multicast; -+ struct udphdr *udph; ++ { ++ struct grub_net_buff *nb; ++ struct grub_net_dhcp6_option *opt; ++ struct grub_net_dhcp6_packet *v6h; ++ struct grub_net_dhcp6_option_duid_ll *duid; ++ struct grub_net_dhcp6_option_iana *ia_na; ++ grub_net_network_level_address_t multicast; ++ grub_net_link_level_address_t ll_multicast; ++ struct udphdr *udph; + -+ multicast.type = GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV6; -+ multicast.ipv6[0] = grub_cpu_to_be64_compile_time (0xff02ULL << 48); -+ multicast.ipv6[1] = grub_cpu_to_be64_compile_time (0x10002ULL); ++ multicast.type = GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV6; ++ multicast.ipv6[0] = grub_cpu_to_be64_compile_time (0xff02ULL << 48); ++ multicast.ipv6[1] = grub_cpu_to_be64_compile_time (0x10002ULL); + -+ err = grub_net_link_layer_resolve (se->iface, -+ &multicast, &ll_multicast); -+ if (err) -+ { -+ grub_dhcp6_session_remove_all (); -+ return err; -+ } ++ err = grub_net_link_layer_resolve (se->iface, ++ &multicast, &ll_multicast); ++ if (err) ++ { ++ grub_dhcp6_session_remove_all (); ++ return err; ++ } + -+ nb = grub_netbuff_alloc (GRUB_DHCP6_DEFAULT_NETBUFF_ALLOC_SIZE); ++ nb = grub_netbuff_alloc (GRUB_DHCP6_DEFAULT_NETBUFF_ALLOC_SIZE); + -+ if (!nb) -+ { -+ grub_dhcp6_session_remove_all (); -+ return grub_errno; -+ } ++ if (!nb) ++ { ++ grub_dhcp6_session_remove_all (); ++ return grub_errno; ++ } + -+ err = grub_netbuff_reserve (nb, GRUB_DHCP6_DEFAULT_NETBUFF_ALLOC_SIZE); -+ if (err) -+ { -+ grub_dhcp6_session_remove_all (); -+ grub_netbuff_free (nb); -+ return err; -+ } ++ err = grub_netbuff_reserve (nb, GRUB_DHCP6_DEFAULT_NETBUFF_ALLOC_SIZE); ++ if (err) ++ { ++ grub_dhcp6_session_remove_all (); ++ grub_netbuff_free (nb); ++ return err; ++ } + -+ err = grub_netbuff_push (nb, sizeof (*opt) + sizeof (grub_uint16_t)); -+ if (err) -+ { -+ grub_dhcp6_session_remove_all (); -+ grub_netbuff_free (nb); -+ return err; -+ } ++ err = grub_netbuff_push (nb, sizeof (*opt) + sizeof (grub_uint16_t)); ++ if (err) ++ { ++ grub_dhcp6_session_remove_all (); ++ grub_netbuff_free (nb); ++ return err; ++ } + -+ opt = (struct grub_net_dhcp6_option *)nb->data; -+ opt->code = grub_cpu_to_be16_compile_time (GRUB_NET_DHCP6_OPTION_ELAPSED_TIME); -+ opt->len = grub_cpu_to_be16_compile_time (sizeof (grub_uint16_t)); -+ grub_set_unaligned16 (opt->data, 0); ++ opt = (struct grub_net_dhcp6_option *)nb->data; ++ opt->code = grub_cpu_to_be16_compile_time (GRUB_NET_DHCP6_OPTION_ELAPSED_TIME); ++ opt->len = grub_cpu_to_be16_compile_time (sizeof (grub_uint16_t)); ++ grub_set_unaligned16 (opt->data, 0); + -+ err = grub_netbuff_push (nb, sizeof (*opt) + sizeof (*duid)); -+ if (err) -+ { -+ grub_dhcp6_session_remove_all (); -+ grub_netbuff_free (nb); -+ return err; -+ } ++ err = grub_netbuff_push (nb, sizeof (*opt) + sizeof (*duid)); ++ if (err) ++ { ++ grub_dhcp6_session_remove_all (); ++ grub_netbuff_free (nb); ++ return err; ++ } + -+ opt = (struct grub_net_dhcp6_option *)nb->data; -+ opt->code = grub_cpu_to_be16_compile_time (GRUB_NET_DHCP6_OPTION_CLIENTID); -+ opt->len = grub_cpu_to_be16 (sizeof (*duid)); ++ opt = (struct grub_net_dhcp6_option *)nb->data; ++ opt->code = grub_cpu_to_be16_compile_time (GRUB_NET_DHCP6_OPTION_CLIENTID); ++ opt->len = grub_cpu_to_be16 (sizeof (*duid)); + -+ duid = (struct grub_net_dhcp6_option_duid_ll *) opt->data; -+ grub_memcpy (duid, &se->duid, sizeof (*duid)); ++ duid = (struct grub_net_dhcp6_option_duid_ll *) opt->data; ++ grub_memcpy (duid, &se->duid, sizeof (*duid)); + -+ err = grub_netbuff_push (nb, sizeof (*opt) + sizeof (*ia_na)); -+ if (err) -+ { -+ grub_dhcp6_session_remove_all (); -+ grub_netbuff_free (nb); -+ return err; -+ } ++ err = grub_netbuff_push (nb, sizeof (*opt) + sizeof (*ia_na)); ++ if (err) ++ { ++ grub_dhcp6_session_remove_all (); ++ grub_netbuff_free (nb); ++ return err; ++ } + -+ opt = (struct grub_net_dhcp6_option *)nb->data; -+ opt->code = grub_cpu_to_be16_compile_time (GRUB_NET_DHCP6_OPTION_IA_NA); -+ opt->len = grub_cpu_to_be16 (sizeof (*ia_na)); -+ ia_na = (struct grub_net_dhcp6_option_iana *)opt->data; -+ ia_na->iaid = grub_cpu_to_be32 (se->iaid); -+ ia_na->t1 = 0; -+ ia_na->t2 = 0; ++ opt = (struct grub_net_dhcp6_option *)nb->data; ++ opt->code = grub_cpu_to_be16_compile_time (GRUB_NET_DHCP6_OPTION_IA_NA); ++ opt->len = grub_cpu_to_be16 (sizeof (*ia_na)); ++ ia_na = (struct grub_net_dhcp6_option_iana *)opt->data; ++ ia_na->iaid = grub_cpu_to_be32 (se->iaid); ++ ia_na->t1 = 0; ++ ia_na->t2 = 0; + -+ err = grub_netbuff_push (nb, sizeof (*v6h)); -+ if (err) -+ { -+ grub_dhcp6_session_remove_all (); -+ grub_netbuff_free (nb); -+ return err; -+ } ++ err = grub_netbuff_push (nb, sizeof (*v6h)); ++ if (err) ++ { ++ grub_dhcp6_session_remove_all (); ++ grub_netbuff_free (nb); ++ return err; ++ } + -+ v6h = (struct grub_net_dhcp6_packet *)nb->data; -+ v6h->message_type = GRUB_NET_DHCP6_SOLICIT; -+ v6h->transaction_id = se->transaction_id; ++ v6h = (struct grub_net_dhcp6_packet *)nb->data; ++ v6h->message_type = GRUB_NET_DHCP6_SOLICIT; ++ v6h->transaction_id = se->transaction_id; + -+ grub_netbuff_push (nb, sizeof (*udph)); ++ grub_netbuff_push (nb, sizeof (*udph)); + -+ udph = (struct udphdr *) nb->data; -+ udph->src = grub_cpu_to_be16_compile_time (DHCP6_CLIENT_PORT); -+ udph->dst = grub_cpu_to_be16_compile_time (DHCP6_SERVER_PORT); -+ udph->chksum = 0; -+ udph->len = grub_cpu_to_be16 (nb->tail - nb->data); ++ udph = (struct udphdr *) nb->data; ++ udph->src = grub_cpu_to_be16_compile_time (DHCP6_CLIENT_PORT); ++ udph->dst = grub_cpu_to_be16_compile_time (DHCP6_SERVER_PORT); ++ udph->chksum = 0; ++ udph->len = grub_cpu_to_be16 (nb->tail - nb->data); + -+ udph->chksum = grub_net_ip_transport_checksum (nb, GRUB_NET_IP_UDP, -+ &se->iface->address, &multicast); ++ udph->chksum = grub_net_ip_transport_checksum (nb, GRUB_NET_IP_UDP, ++ &se->iface->address, &multicast); + -+ err = grub_net_send_ip_packet (se->iface, &multicast, -+ &ll_multicast, nb, GRUB_NET_IP_UDP); -+ done = 0; -+ grub_netbuff_free (nb); ++ err = grub_net_send_ip_packet (se->iface, &multicast, ++ &ll_multicast, nb, GRUB_NET_IP_UDP); ++ done = 0; ++ grub_netbuff_free (nb); + -+ if (err) -+ { -+ grub_dhcp6_session_remove_all (); -+ return err; -+ } -+ } ++ if (err) ++ { ++ grub_dhcp6_session_remove_all (); ++ return err; ++ } ++ } + if (!done) -+ grub_net_poll_cards (interval, 0); -+ } -+ ++ grub_net_poll_cards (interval, 0); + } + +- if (is_def) + FOR_DHCP6_SESSIONS (se) -+ { + { +- grub_env_set ("net_default_interface", name); +- grub_env_export ("net_default_interface"); + grub_error_push (); + err = grub_error (GRUB_ERR_FILE_NOT_FOUND, -+ N_("couldn't autoconfigure %s"), -+ se->iface->card->name); -+ } -+ ++ N_("couldn't autoconfigure %s"), ++ se->iface->card->name); + } + +- if (inter) +- grub_net_add_ipv6_local (inter, mask); +- return inter; + grub_dhcp6_session_remove_all (); + + return err; -+} -+ -+static grub_command_t cmd_getdhcp, cmd_bootp, cmd_bootp6; + } + ++static grub_command_t cmd_getdhcp, cmd_bootp, cmd_dhcp, cmd_bootp6; void grub_bootp_init (void) -@@ -835,6 +1570,9 @@ grub_bootp_init (void) +@@ -1118,11 +1853,15 @@ grub_bootp_init (void) cmd_getdhcp = grub_register_command ("net_get_dhcp_option", grub_cmd_dhcpopt, N_("VAR INTERFACE NUMBER DESCRIPTION"), N_("retrieve DHCP option and save it into VAR. If VAR is - then print the value.")); @@ -1125,12 +1129,12 @@ index 4e55adc557b..242cd1f4cbd 100644 } void -@@ -842,4 +1580,5 @@ grub_bootp_fini (void) + grub_bootp_fini (void) { ++ grub_unregister_command (cmd_bootp6); grub_unregister_command (cmd_getdhcp); grub_unregister_command (cmd_bootp); -+ grub_unregister_command (cmd_bootp6); - } + grub_unregister_command (cmd_dhcp); diff --git a/grub-core/net/drivers/efi/efinet.c b/grub-core/net/drivers/efi/efinet.c index 4444e8e60ee..00d7d37b8de 100644 --- a/grub-core/net/drivers/efi/efinet.c @@ -1170,7 +1174,7 @@ index 4444e8e60ee..00d7d37b8de 100644 } else diff --git a/grub-core/net/ip.c b/grub-core/net/ip.c -index b2ca74b6eb1..9a4e589aa39 100644 +index a5896f6dc26..ce6bdc75c6d 100644 --- a/grub-core/net/ip.c +++ b/grub-core/net/ip.c @@ -239,6 +239,45 @@ handle_dgram (struct grub_net_buff *nb, @@ -1220,7 +1224,7 @@ index b2ca74b6eb1..9a4e589aa39 100644 { const struct grub_net_bootp_packet *bootp; diff --git a/include/grub/efi/api.h b/include/grub/efi/api.h -index e5b521bd9be..1250d493e25 100644 +index 955973ed484..71d972a3d89 100644 --- a/include/grub/efi/api.h +++ b/include/grub/efi/api.h @@ -1507,7 +1507,7 @@ typedef struct grub_efi_pxe_ip_filter @@ -1233,10 +1237,10 @@ index e5b521bd9be..1250d493e25 100644 } grub_efi_pxe_ip_filter_t; diff --git a/include/grub/net.h b/include/grub/net.h -index f4cd86e582f..5f78b22e109 100644 +index fa7a8c39704..aedf4b59cfe 100644 --- a/include/grub/net.h +++ b/include/grub/net.h -@@ -447,50 +447,65 @@ struct grub_net_bootp_packet +@@ -451,50 +451,65 @@ struct grub_net_bootp_packet grub_uint8_t vendor[0]; } GRUB_PACKED; @@ -1332,7 +1336,7 @@ index f4cd86e582f..5f78b22e109 100644 #define GRUB_NET_BOOTP_RFC1048_MAGIC_0 0x63 #define GRUB_NET_BOOTP_RFC1048_MAGIC_1 0x82 -@@ -521,12 +536,12 @@ grub_net_configure_by_dhcp_ack (const char *name, +@@ -532,12 +547,12 @@ grub_net_configure_by_dhcp_ack (const char *name, int is_def, char **device, char **path); struct grub_net_network_level_interface * @@ -1351,9 +1355,9 @@ index f4cd86e582f..5f78b22e109 100644 int grub_ipv6_get_masksize(grub_uint16_t *mask); -@@ -543,6 +558,10 @@ void +@@ -554,6 +569,10 @@ void grub_net_process_dhcp (struct grub_net_buff *nb, - struct grub_net_card *card); + struct grub_net_network_level_interface *iface); +grub_err_t +grub_net_process_dhcp6 (struct grub_net_buff *nb, diff --git a/0115-efinet-UEFI-IPv6-PXE-support.patch b/0113-efinet-UEFI-IPv6-PXE-support.patch similarity index 99% rename from 0115-efinet-UEFI-IPv6-PXE-support.patch rename to 0113-efinet-UEFI-IPv6-PXE-support.patch index 0c38782..50d680a 100644 --- a/0115-efinet-UEFI-IPv6-PXE-support.patch +++ b/0113-efinet-UEFI-IPv6-PXE-support.patch @@ -28,7 +28,7 @@ index 00d7d37b8de..c3db3285b97 100644 else { diff --git a/include/grub/efi/api.h b/include/grub/efi/api.h -index 1250d493e25..2f164d4209c 100644 +index 71d972a3d89..186cf398840 100644 --- a/include/grub/efi/api.h +++ b/include/grub/efi/api.h @@ -1499,31 +1499,6 @@ typedef union diff --git a/0116-grub.texi-Add-net_bootp6-doument.patch b/0114-grub.texi-Add-net_bootp6-doument.patch similarity index 90% rename from 0116-grub.texi-Add-net_bootp6-doument.patch rename to 0114-grub.texi-Add-net_bootp6-doument.patch index b66a80c..fdca976 100644 --- a/0116-grub.texi-Add-net_bootp6-doument.patch +++ b/0114-grub.texi-Add-net_bootp6-doument.patch @@ -12,10 +12,10 @@ Signed-off-by: Ken Lin 1 file changed, 17 insertions(+) diff --git a/docs/grub.texi b/docs/grub.texi -index 2b7b7faf847..c54bee31679 100644 +index 960e5f3ba41..495462b8e48 100644 --- a/docs/grub.texi +++ b/docs/grub.texi -@@ -5303,6 +5303,7 @@ This command is only available on AArch64 systems. +@@ -5338,6 +5338,7 @@ This command is only available on AArch64 systems. * net_add_dns:: Add a DNS server * net_add_route:: Add routing entry * net_bootp:: Perform a bootp autoconfiguration @@ -23,7 +23,7 @@ index 2b7b7faf847..c54bee31679 100644 * net_del_addr:: Remove IP address from interface * net_del_dns:: Remove a DNS server * net_del_route:: Remove a route entry -@@ -5384,6 +5385,22 @@ Sets environment variable @samp{net_}@var{}@samp{_dhcp_extensionspath} +@@ -5419,6 +5420,22 @@ Sets environment variable @samp{net_}@var{}@samp{_dhcp_extensionspath} @end deffn diff --git a/0115-bootp-Add-processing-DHCPACK-packet-from-HTTP-Boot.patch b/0115-bootp-Add-processing-DHCPACK-packet-from-HTTP-Boot.patch new file mode 100644 index 0000000..301e781 --- /dev/null +++ b/0115-bootp-Add-processing-DHCPACK-packet-from-HTTP-Boot.patch @@ -0,0 +1,108 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Michael Chang +Date: Wed, 10 Jul 2019 23:58:28 +0200 +Subject: [PATCH] bootp: Add processing DHCPACK packet from HTTP Boot + +The vendor class identifier with the string "HTTPClient" is used to denote the +packet as responding to HTTP boot request. In DHCP4 config, the filename for +HTTP boot is the URL of the boot file while for PXE boot it is the path to the +boot file. As a consequence, the next-server becomes obseleted because the HTTP +URL already contains the server address for the boot file. For DHCP6 config, +there's no difference definition in existing config as dhcp6.bootfile-url can +be used to specify URL for both HTTP and PXE boot file. + +This patch adds processing for "HTTPClient" vendor class identifier in DHCPACK +packet by treating it as HTTP format, not as the PXE format. + +Signed-off-by: Michael Chang +Signed-off-by: Ken Lin +--- + grub-core/net/bootp.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++ + include/grub/net.h | 1 + + 2 files changed, 56 insertions(+) + +diff --git a/grub-core/net/bootp.c b/grub-core/net/bootp.c +index 85adc9cb447..2e46842e829 100644 +--- a/grub-core/net/bootp.c ++++ b/grub-core/net/bootp.c +@@ -20,6 +20,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -567,6 +568,60 @@ grub_net_configure_by_dhcp_ack (const char *name, + if (opt && opt_len) + grub_env_set_net_property (name, "rootpath", (const char *) opt, opt_len); + ++ opt = find_dhcp_option (bp, size, GRUB_NET_BOOTP_VENDOR_CLASS_IDENTIFIER, &opt_len); ++ if (opt && opt_len) ++ { ++ grub_env_set_net_property (name, "vendor_class_identifier", (const char *) opt, opt_len); ++ if (opt && grub_strcmp (opt, "HTTPClient") == 0) ++ { ++ char *proto, *ip, *pa; ++ ++ if (!dissect_url (bp->boot_file, &proto, &ip, &pa)) ++ return inter; ++ ++ grub_env_set_net_property (name, "boot_file", pa, grub_strlen (pa)); ++ if (is_def) ++ { ++ grub_net_default_server = grub_strdup (ip); ++ grub_env_set ("net_default_interface", name); ++ grub_env_export ("net_default_interface"); ++ } ++ if (device && !*device) ++ { ++ *device = grub_xasprintf ("%s,%s", proto, ip); ++ grub_print_error (); ++ } ++ if (path) ++ { ++ *path = grub_strdup (pa); ++ grub_print_error (); ++ if (*path) ++ { ++ char *slash; ++ slash = grub_strrchr (*path, '/'); ++ if (slash) ++ *slash = 0; ++ else ++ **path = 0; ++ } ++ } ++ grub_net_add_ipv4_local (inter, mask); ++ inter->dhcp_ack = grub_malloc (size); ++ if (inter->dhcp_ack) ++ { ++ grub_memcpy (inter->dhcp_ack, bp, size); ++ inter->dhcp_acklen = size; ++ } ++ else ++ grub_errno = GRUB_ERR_NONE; ++ ++ grub_free (proto); ++ grub_free (ip); ++ grub_free (pa); ++ return inter; ++ } ++ } ++ + opt = find_dhcp_option (bp, size, GRUB_NET_BOOTP_EXTENSIONS_PATH, &opt_len); + if (opt && opt_len) + grub_env_set_net_property (name, "extensionspath", (const char *) opt, opt_len); +diff --git a/include/grub/net.h b/include/grub/net.h +index aedf4b59cfe..ebb569bd86e 100644 +--- a/include/grub/net.h ++++ b/include/grub/net.h +@@ -526,6 +526,7 @@ enum + GRUB_NET_BOOTP_DOMAIN = 0x0f, + GRUB_NET_BOOTP_ROOT_PATH = 0x11, + GRUB_NET_BOOTP_EXTENSIONS_PATH = 0x12, ++ GRUB_NET_BOOTP_VENDOR_CLASS_IDENTIFIER = 0x3C, + GRUB_NET_BOOTP_CLIENT_ID = 0x3d, + GRUB_NET_BOOTP_CLIENT_UUID = 0x61, + GRUB_NET_DHCP_REQUESTED_IP_ADDRESS = 50, diff --git a/0118-efinet-Setting-network-from-UEFI-device-path.patch b/0116-efinet-Setting-network-from-UEFI-device-path.patch similarity index 99% rename from 0118-efinet-Setting-network-from-UEFI-device-path.patch rename to 0116-efinet-Setting-network-from-UEFI-device-path.patch index 120f2e9..f017295 100644 --- a/0118-efinet-Setting-network-from-UEFI-device-path.patch +++ b/0116-efinet-Setting-network-from-UEFI-device-path.patch @@ -375,7 +375,7 @@ index c3db3285b97..2817b6f8fb9 100644 } } diff --git a/include/grub/efi/api.h b/include/grub/efi/api.h -index 2f164d4209c..eb6bb50857c 100644 +index 186cf398840..0d4839a41f1 100644 --- a/include/grub/efi/api.h +++ b/include/grub/efi/api.h @@ -839,6 +839,8 @@ struct grub_efi_ipv4_device_path diff --git a/0117-bootp-Add-processing-DHCPACK-packet-from-HTTP-Boot.patch b/0117-bootp-Add-processing-DHCPACK-packet-from-HTTP-Boot.patch deleted file mode 100644 index 1874107..0000000 --- a/0117-bootp-Add-processing-DHCPACK-packet-from-HTTP-Boot.patch +++ /dev/null @@ -1,135 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Michael Chang -Date: Thu, 14 Jul 2016 18:45:14 +0800 -Subject: [PATCH] bootp: Add processing DHCPACK packet from HTTP Boot - -The vendor class identifier with the string "HTTPClient" is used to denote the -packet as responding to HTTP boot request. In DHCP4 config, the filename for -HTTP boot is the URL of the boot file while for PXE boot it is the path to the -boot file. As a consequence, the next-server becomes obseleted because the HTTP -URL already contains the server address for the boot file. For DHCP6 config, -there's no difference definition in existing config as dhcp6.bootfile-url can -be used to specify URL for both HTTP and PXE boot file. - -This patch adds processing for "HTTPClient" vendor class identifier in DHCPACK -packet by treating it as HTTP format, not as the PXE format. - -Signed-off-by: Michael Chang -Signed-off-by: Ken Lin ---- - grub-core/net/bootp.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++-- - include/grub/net.h | 1 + - 2 files changed, 67 insertions(+), 2 deletions(-) - -diff --git a/grub-core/net/bootp.c b/grub-core/net/bootp.c -index 242cd1f4cbd..8b6fc9f2411 100644 ---- a/grub-core/net/bootp.c -+++ b/grub-core/net/bootp.c -@@ -20,6 +20,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -254,6 +255,11 @@ parse_dhcp_vendor (const char *name, const void *vend, int limit, int *mask) - taglength); - break; - -+ case GRUB_NET_BOOTP_VENDOR_CLASS_IDENTIFIER: -+ grub_env_set_net_property (name, "vendor_class_identifier", (const char *) ptr, -+ taglength); -+ break; -+ - case GRUB_NET_BOOTP_EXTENSIONS_PATH: - grub_env_set_net_property (name, "extensionspath", (const char *) ptr, - taglength); -@@ -357,6 +363,66 @@ grub_net_configure_by_dhcp_ack (const char *name, - } - #endif - -+ if (size > OFFSET_OF (vendor, bp)) -+ { -+ char *cidvar; -+ const char *cid; -+ -+ parse_dhcp_vendor (name, &bp->vendor, size - OFFSET_OF (vendor, bp), &mask); -+ cidvar = grub_xasprintf ("net_%s_%s", name, "vendor_class_identifier"); -+ cid = grub_env_get (cidvar); -+ grub_free (cidvar); -+ -+ if (cid && grub_strcmp (cid, "HTTPClient") == 0) -+ { -+ char *proto, *ip, *pa; -+ -+ if (!dissect_url (bp->boot_file, &proto, &ip, &pa)) -+ return inter; -+ -+ grub_env_set_net_property (name, "boot_file", pa, grub_strlen (pa)); -+ if (is_def) -+ { -+ grub_net_default_server = grub_strdup (ip); -+ grub_env_set ("net_default_interface", name); -+ grub_env_export ("net_default_interface"); -+ } -+ if (device && !*device) -+ { -+ *device = grub_xasprintf ("%s,%s", proto, ip); -+ grub_print_error (); -+ } -+ if (path) -+ { -+ *path = grub_strdup (pa); -+ grub_print_error (); -+ if (*path) -+ { -+ char *slash; -+ slash = grub_strrchr (*path, '/'); -+ if (slash) -+ *slash = 0; -+ else -+ **path = 0; -+ } -+ } -+ grub_net_add_ipv4_local (inter, mask); -+ inter->dhcp_ack = grub_malloc (size); -+ if (inter->dhcp_ack) -+ { -+ grub_memcpy (inter->dhcp_ack, bp, size); -+ inter->dhcp_acklen = size; -+ } -+ else -+ grub_errno = GRUB_ERR_NONE; -+ -+ grub_free (proto); -+ grub_free (ip); -+ grub_free (pa); -+ return inter; -+ } -+ } -+ - if (size > OFFSET_OF (boot_file, bp)) - grub_env_set_net_property (name, "boot_file", bp->boot_file, - sizeof (bp->boot_file)); -@@ -421,8 +487,6 @@ grub_net_configure_by_dhcp_ack (const char *name, - **path = 0; - } - } -- if (size > OFFSET_OF (vendor, bp)) -- parse_dhcp_vendor (name, &bp->vendor, size - OFFSET_OF (vendor, bp), &mask); - grub_net_add_ipv4_local (inter, mask); - - inter->dhcp_ack = grub_malloc (size); -diff --git a/include/grub/net.h b/include/grub/net.h -index 5f78b22e109..9cf6da68973 100644 ---- a/include/grub/net.h -+++ b/include/grub/net.h -@@ -522,6 +522,7 @@ enum - GRUB_NET_BOOTP_DOMAIN = 0x0f, - GRUB_NET_BOOTP_ROOT_PATH = 0x11, - GRUB_NET_BOOTP_EXTENSIONS_PATH = 0x12, -+ GRUB_NET_BOOTP_VENDOR_CLASS_IDENTIFIER = 0x3C, - GRUB_NET_BOOTP_CLIENT_ID = 0x3d, - GRUB_NET_BOOTP_CLIENT_UUID = 0x61, - GRUB_NET_BOOTP_END = 0xff diff --git a/0119-efinet-Setting-DNS-server-from-UEFI-protocol.patch b/0117-efinet-Setting-DNS-server-from-UEFI-protocol.patch similarity index 99% rename from 0119-efinet-Setting-DNS-server-from-UEFI-protocol.patch rename to 0117-efinet-Setting-DNS-server-from-UEFI-protocol.patch index b185937..d79b34a 100644 --- a/0119-efinet-Setting-DNS-server-from-UEFI-protocol.patch +++ b/0117-efinet-Setting-DNS-server-from-UEFI-protocol.patch @@ -242,7 +242,7 @@ index 2817b6f8fb9..c843654b830 100644 } diff --git a/include/grub/efi/api.h b/include/grub/efi/api.h -index eb6bb50857c..dd3b07eac97 100644 +index 0d4839a41f1..716f121728b 100644 --- a/include/grub/efi/api.h +++ b/include/grub/efi/api.h @@ -334,6 +334,16 @@ @@ -333,5 +333,5 @@ index eb6bb50857c..dd3b07eac97 100644 +typedef struct grub_efi_ip6_config_protocol grub_efi_ip6_config_protocol_t; + #if (GRUB_TARGET_SIZEOF_VOID_P == 4) || defined (__ia64__) \ - || defined (__aarch64__) || defined (__MINGW64__) || defined (__CYGWIN__) - + || defined (__aarch64__) || defined (__MINGW64__) || defined (__CYGWIN__) \ + || defined(__riscv) diff --git a/0120-Fix-one-more-coverity-complaint.patch b/0118-Fix-one-more-coverity-complaint.patch similarity index 90% rename from 0120-Fix-one-more-coverity-complaint.patch rename to 0118-Fix-one-more-coverity-complaint.patch index ba00fbd..41f4d0a 100644 --- a/0120-Fix-one-more-coverity-complaint.patch +++ b/0118-Fix-one-more-coverity-complaint.patch @@ -12,7 +12,7 @@ Signed-off-by: Peter Jones 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/grub-core/normal/completion.c b/grub-core/normal/completion.c -index 2c9b9e9312a..93aa0d8eda8 100644 +index 596102848c1..c07100a8de3 100644 --- a/grub-core/normal/completion.c +++ b/grub-core/normal/completion.c @@ -284,7 +284,8 @@ complete_file (void) @@ -24,4 +24,4 @@ index 2c9b9e9312a..93aa0d8eda8 100644 + dirfile[1] = '\0'; /* Iterate the directory. */ - (fs->dir) (dev, dir, iterate_dir, NULL); + (fs->fs_dir) (dev, dir, iterate_dir, NULL); diff --git a/0121-Support-UEFI-networking-protocols.patch b/0119-Support-UEFI-networking-protocols.patch similarity index 99% rename from 0121-Support-UEFI-networking-protocols.patch rename to 0119-Support-UEFI-networking-protocols.patch index 6675e2c..3b0ff4a 100644 --- a/0121-Support-UEFI-networking-protocols.patch +++ b/0119-Support-UEFI-networking-protocols.patch @@ -57,10 +57,10 @@ Signed-off-by: Peter Jones create mode 100644 include/grub/net/efi.h diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def -index 3be42a95195..4168ec5d3ff 100644 +index 49c5dc4c3b7..48491b50683 100644 --- a/grub-core/Makefile.core.def +++ b/grub-core/Makefile.core.def -@@ -2182,6 +2182,12 @@ module = { +@@ -2276,6 +2276,12 @@ module = { common = hook/datehook.c; }; @@ -73,7 +73,7 @@ index 3be42a95195..4168ec5d3ff 100644 module = { name = net; common = net/net.c; -@@ -2196,6 +2202,12 @@ module = { +@@ -2290,6 +2296,12 @@ module = { common = net/arp.c; common = net/netbuff.c; common = net/url.c; @@ -87,7 +87,7 @@ index 3be42a95195..4168ec5d3ff 100644 module = { diff --git a/grub-core/io/bufio.c b/grub-core/io/bufio.c -index dbed6474431..6118bade50d 100644 +index a458c3aca78..1637731535e 100644 --- a/grub-core/io/bufio.c +++ b/grub-core/io/bufio.c @@ -139,7 +139,7 @@ grub_bufio_read (grub_file_t file, char *buf, grub_size_t len) @@ -100,10 +100,10 @@ index dbed6474431..6118bade50d 100644 if (file->offset + res < next_buf) { diff --git a/grub-core/kern/efi/efi.c b/grub-core/kern/efi/efi.c -index a2a732ffc0d..4d36fe31177 100644 +index 19054b1465f..ada3004cfba 100644 --- a/grub-core/kern/efi/efi.c +++ b/grub-core/kern/efi/efi.c -@@ -696,7 +696,7 @@ grub_efi_print_device_path (grub_efi_device_path_t *dp) +@@ -709,7 +709,7 @@ grub_efi_print_device_path (grub_efi_device_path_t *dp) { grub_efi_ipv4_device_path_t *ipv4 = (grub_efi_ipv4_device_path_t *) dp; @@ -112,7 +112,7 @@ index a2a732ffc0d..4d36fe31177 100644 (unsigned) ipv4->local_ip_address[0], (unsigned) ipv4->local_ip_address[1], (unsigned) ipv4->local_ip_address[2], -@@ -709,33 +709,60 @@ grub_efi_print_device_path (grub_efi_device_path_t *dp) +@@ -722,33 +722,60 @@ grub_efi_print_device_path (grub_efi_device_path_t *dp) (unsigned) ipv4->remote_port, (unsigned) ipv4->protocol, (unsigned) ipv4->static_ip_address); @@ -190,7 +190,7 @@ index a2a732ffc0d..4d36fe31177 100644 } break; case GRUB_EFI_INFINIBAND_DEVICE_PATH_SUBTYPE: -@@ -775,6 +802,39 @@ grub_efi_print_device_path (grub_efi_device_path_t *dp) +@@ -788,6 +815,39 @@ grub_efi_print_device_path (grub_efi_device_path_t *dp) dump_vendor_path ("Messaging", (grub_efi_vendor_device_path_t *) dp); break; @@ -2027,7 +2027,7 @@ index 00000000000..017c4d05bc7 + }; diff --git a/grub-core/net/efi/net.c b/grub-core/net/efi/net.c new file mode 100644 -index 00000000000..9e0078ac1c6 +index 00000000000..86bce6535d3 --- /dev/null +++ b/grub-core/net/efi/net.c @@ -0,0 +1,1428 @@ @@ -3324,13 +3324,13 @@ index 00000000000..9e0078ac1c6 +static struct grub_fs grub_efi_netfs = + { + .name = "efi netfs", -+ .dir = grub_efi_netfs_dir, -+ .open = grub_efi_netfs_open, -+ .read = grub_efi_netfs_read, -+ .close = grub_efi_netfs_close, -+ .label = NULL, -+ .uuid = NULL, -+ .mtime = NULL, ++ .fs_dir = grub_efi_netfs_dir, ++ .fs_open = grub_efi_netfs_open, ++ .fs_read = grub_efi_netfs_read, ++ .fs_close = grub_efi_netfs_close, ++ .fs_label = NULL, ++ .fs_uuid = NULL, ++ .fs_mtime = NULL, + }; + +int @@ -3890,7 +3890,7 @@ index 00000000000..531949cba5c + }; + diff --git a/grub-core/net/net.c b/grub-core/net/net.c -index 191e8e41bd6..a571ee92efa 100644 +index 2734f70d22f..27a0a1d6961 100644 --- a/grub-core/net/net.c +++ b/grub-core/net/net.c @@ -32,6 +32,9 @@ @@ -4000,7 +4000,7 @@ index 191e8e41bd6..a571ee92efa 100644 +#endif } diff --git a/util/grub-mknetdir.c b/util/grub-mknetdir.c -index 82073d5cc94..ae31271bbc0 100644 +index 602574d52e8..1a61e05c6ec 100644 --- a/util/grub-mknetdir.c +++ b/util/grub-mknetdir.c @@ -32,13 +32,15 @@ @@ -4055,7 +4055,7 @@ index 82073d5cc94..ae31271bbc0 100644 { const char *mkimage_target; const char *netmodule; -@@ -154,6 +159,7 @@ process_input_dir (const char *input_dir, enum grub_install_plat platform) +@@ -156,6 +161,7 @@ process_input_dir (const char *input_dir, enum grub_install_plat platform) grub_install_push_module (targets[platform].netmodule); output = grub_util_path_concat_ext (2, grubdir, "core", targets[platform].ext); @@ -4063,7 +4063,7 @@ index 82073d5cc94..ae31271bbc0 100644 grub_install_make_image_wrap (input_dir, prefix, output, 0, load_cfg, targets[platform].mkimage_target, 0); -@@ -190,7 +196,16 @@ main (int argc, char *argv[]) +@@ -192,7 +198,16 @@ main (int argc, char *argv[]) grub_install_mkdir_p (base); @@ -4082,7 +4082,7 @@ index 82073d5cc94..ae31271bbc0 100644 if (!grub_install_source_directory) { diff --git a/include/grub/efi/api.h b/include/grub/efi/api.h -index dd3b07eac97..b337e1a193d 100644 +index 716f121728b..2ed9c26a450 100644 --- a/include/grub/efi/api.h +++ b/include/grub/efi/api.h @@ -602,6 +602,23 @@ typedef union @@ -4329,8 +4329,8 @@ index dd3b07eac97..b337e1a193d 100644 +typedef struct grub_efi_ip6_config_manual_address grub_efi_ip6_config_manual_address_t; + #if (GRUB_TARGET_SIZEOF_VOID_P == 4) || defined (__ia64__) \ - || defined (__aarch64__) || defined (__MINGW64__) || defined (__CYGWIN__) - + || defined (__aarch64__) || defined (__MINGW64__) || defined (__CYGWIN__) \ + || defined(__riscv) diff --git a/include/grub/efi/dhcp.h b/include/grub/efi/dhcp.h new file mode 100644 index 00000000000..fdb88eb810e diff --git a/0122-AUDIT-0-http-boot-tracker-bug.patch b/0120-AUDIT-0-http-boot-tracker-bug.patch similarity index 98% rename from 0122-AUDIT-0-http-boot-tracker-bug.patch rename to 0120-AUDIT-0-http-boot-tracker-bug.patch index 3d8d96b..78a78e4 100644 --- a/0122-AUDIT-0-http-boot-tracker-bug.patch +++ b/0120-AUDIT-0-http-boot-tracker-bug.patch @@ -22,7 +22,7 @@ Signed-off-by: Michael Chang 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/grub-core/net/efi/net.c b/grub-core/net/efi/net.c -index 9e0078ac1c6..2bf15447fd5 100644 +index 86bce6535d3..4bb308026ce 100644 --- a/grub-core/net/efi/net.c +++ b/grub-core/net/efi/net.c @@ -645,8 +645,10 @@ grub_efihttp_chunk_read (grub_file_t file, char *buf, diff --git a/0123-grub-core-video-efi_gop.c-Add-support-for-BLT_ONLY-a.patch b/0121-grub-core-video-efi_gop.c-Add-support-for-BLT_ONLY-a.patch similarity index 100% rename from 0123-grub-core-video-efi_gop.c-Add-support-for-BLT_ONLY-a.patch rename to 0121-grub-core-video-efi_gop.c-Add-support-for-BLT_ONLY-a.patch diff --git a/0124-efi-uga-use-64-bit-for-fb_base.patch b/0122-efi-uga-use-64-bit-for-fb_base.patch similarity index 100% rename from 0124-efi-uga-use-64-bit-for-fb_base.patch rename to 0122-efi-uga-use-64-bit-for-fb_base.patch diff --git a/0125-EFI-console-Do-not-set-text-mode-until-we-actually-n.patch b/0123-EFI-console-Do-not-set-text-mode-until-we-actually-n.patch similarity index 100% rename from 0125-EFI-console-Do-not-set-text-mode-until-we-actually-n.patch rename to 0123-EFI-console-Do-not-set-text-mode-until-we-actually-n.patch diff --git a/0126-EFI-console-Add-grub_console_read_key_stroke-helper-.patch b/0124-EFI-console-Add-grub_console_read_key_stroke-helper-.patch similarity index 100% rename from 0126-EFI-console-Add-grub_console_read_key_stroke-helper-.patch rename to 0124-EFI-console-Add-grub_console_read_key_stroke-helper-.patch diff --git a/0127-EFI-console-Implement-getkeystatus-support.patch b/0125-EFI-console-Implement-getkeystatus-support.patch similarity index 100% rename from 0127-EFI-console-Implement-getkeystatus-support.patch rename to 0125-EFI-console-Implement-getkeystatus-support.patch diff --git a/0128-Make-grub_getkeystatus-helper-funtion-available-ever.patch b/0126-Make-grub_getkeystatus-helper-funtion-available-ever.patch similarity index 100% rename from 0128-Make-grub_getkeystatus-helper-funtion-available-ever.patch rename to 0126-Make-grub_getkeystatus-helper-funtion-available-ever.patch diff --git a/0129-Accept-ESC-F8-and-holding-SHIFT-as-user-interrupt-ke.patch b/0127-Accept-ESC-F8-and-holding-SHIFT-as-user-interrupt-ke.patch similarity index 98% rename from 0129-Accept-ESC-F8-and-holding-SHIFT-as-user-interrupt-ke.patch rename to 0127-Accept-ESC-F8-and-holding-SHIFT-as-user-interrupt-ke.patch index 2945fd6..e62a619 100644 --- a/0129-Accept-ESC-F8-and-holding-SHIFT-as-user-interrupt-ke.patch +++ b/0127-Accept-ESC-F8-and-holding-SHIFT-as-user-interrupt-ke.patch @@ -68,7 +68,7 @@ index 93bd3378d18..6cae4c23e7a 100644 grub_refresh (void) { diff --git a/grub-core/normal/menu.c b/grub-core/normal/menu.c -index 5e2f5283d3d..6cb2a071490 100644 +index 783bde55b9e..046a1fb2c84 100644 --- a/grub-core/normal/menu.c +++ b/grub-core/normal/menu.c @@ -655,7 +655,7 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot) diff --git a/0130-grub-editenv-Add-incr-command-to-increment-integer-v.patch b/0128-grub-editenv-Add-incr-command-to-increment-integer-v.patch similarity index 94% rename from 0130-grub-editenv-Add-incr-command-to-increment-integer-v.patch rename to 0128-grub-editenv-Add-incr-command-to-increment-integer-v.patch index d836274..5da986f 100644 --- a/0130-grub-editenv-Add-incr-command-to-increment-integer-v.patch +++ b/0128-grub-editenv-Add-incr-command-to-increment-integer-v.patch @@ -17,7 +17,7 @@ Signed-off-by: Hans de Goede 1 file changed, 50 insertions(+) diff --git a/util/grub-editenv.c b/util/grub-editenv.c -index 118e89fe57f..2918bb71cfe 100644 +index f3662c95ba6..d848038abea 100644 --- a/util/grub-editenv.c +++ b/util/grub-editenv.c @@ -53,6 +53,9 @@ static struct argp_option options[] = { @@ -30,7 +30,7 @@ index 118e89fe57f..2918bb71cfe 100644 {0, 0, 0, OPTION_DOC, N_("Options:"), -1}, {"verbose", 'v', 0, 0, N_("print verbose messages."), 0}, -@@ -246,6 +249,51 @@ unset_variables (const char *name, int argc, char *argv[]) +@@ -247,6 +250,51 @@ unset_variables (const char *name, int argc, char *argv[]) grub_envblk_close (envblk); } @@ -82,7 +82,7 @@ index 118e89fe57f..2918bb71cfe 100644 int main (int argc, char *argv[]) { -@@ -285,6 +333,8 @@ main (int argc, char *argv[]) +@@ -286,6 +334,8 @@ main (int argc, char *argv[]) set_variables (filename, argc - curindex, argv + curindex); else if (strcmp (command, "unset") == 0) unset_variables (filename, argc - curindex, argv + curindex); diff --git a/0131-Add-auto-hide-menu-support.patch b/0129-Add-auto-hide-menu-support.patch similarity index 98% rename from 0131-Add-auto-hide-menu-support.patch rename to 0129-Add-auto-hide-menu-support.patch index 06ca8da..0afa74a 100644 --- a/0131-Add-auto-hide-menu-support.patch +++ b/0129-Add-auto-hide-menu-support.patch @@ -49,10 +49,10 @@ Changes in v2: create mode 100644 util/grub.d/01_menu_auto_hide.in diff --git a/Makefile.util.def b/Makefile.util.def -index 4e722ab766b..8b376d6e740 100644 +index c13ca685ce1..026b458bb85 100644 --- a/Makefile.util.def +++ b/Makefile.util.def -@@ -448,6 +448,12 @@ script = { +@@ -457,6 +457,12 @@ script = { installdir = grubconf; }; diff --git a/0132-Output-a-menu-entry-for-firmware-setup-on-UEFI-FastB.patch b/0130-Output-a-menu-entry-for-firmware-setup-on-UEFI-FastB.patch similarity index 97% rename from 0132-Output-a-menu-entry-for-firmware-setup-on-UEFI-FastB.patch rename to 0130-Output-a-menu-entry-for-firmware-setup-on-UEFI-FastB.patch index b0215a4..e461de9 100644 --- a/0132-Output-a-menu-entry-for-firmware-setup-on-UEFI-FastB.patch +++ b/0130-Output-a-menu-entry-for-firmware-setup-on-UEFI-FastB.patch @@ -24,10 +24,10 @@ Signed-off-by: Hans de Goede create mode 100644 util/grub.d/30_uefi-firmware.in diff --git a/Makefile.util.def b/Makefile.util.def -index 8b376d6e740..56bf1159a42 100644 +index 026b458bb85..89a9da1b9f7 100644 --- a/Makefile.util.def +++ b/Makefile.util.def -@@ -536,6 +536,12 @@ script = { +@@ -545,6 +545,12 @@ script = { installdir = grubconf; }; diff --git a/0133-Add-grub-set-bootflag-utility.patch b/0131-Add-grub-set-bootflag-utility.patch similarity index 93% rename from 0133-Add-grub-set-bootflag-utility.patch rename to 0131-Add-grub-set-bootflag-utility.patch index 2b4174e..d5fd262 100644 --- a/0133-Add-grub-set-bootflag-utility.patch +++ b/0131-Add-grub-set-bootflag-utility.patch @@ -34,23 +34,22 @@ Signed-off-by: Hans de Goede --- Makefile.util.def | 7 ++ util/grub-set-bootflag.c | 160 +++++++++++++++++++++++++++++++++++++++++ - .gitignore | 2 + conf/Makefile.extra-dist | 3 + docs/grub-boot-success.service | 6 ++ docs/grub-boot-success.timer | 6 ++ util/grub-set-bootflag.1 | 20 ++++++ - 7 files changed, 204 insertions(+) + 6 files changed, 202 insertions(+) create mode 100644 util/grub-set-bootflag.c create mode 100644 docs/grub-boot-success.service create mode 100644 docs/grub-boot-success.timer create mode 100644 util/grub-set-bootflag.1 diff --git a/Makefile.util.def b/Makefile.util.def -index 56bf1159a42..08cc98ddb8b 100644 +index 89a9da1b9f7..125ad6209b2 100644 --- a/Makefile.util.def +++ b/Makefile.util.def -@@ -1442,3 +1442,10 @@ program = { - ldadd = grub-core/gnulib/libgnu.a; +@@ -1451,3 +1451,10 @@ program = { + ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; }; + @@ -226,21 +225,8 @@ index 00000000000..bb198f02351 + + return 0; +} -diff --git a/.gitignore b/.gitignore -index 7aaae594d51..a999024652e 100644 ---- a/.gitignore -+++ b/.gitignore -@@ -111,6 +111,8 @@ grub-*.tar.* - /grub*-rpm-sort.8 - /grub*-script-check - /grub*-script-check.1 -+/grub*-set-bootflag -+/grub*-set-bootflag.1 - /grub*-set-default - /grub*-set-default.8 - /grub*-set-password diff --git a/conf/Makefile.extra-dist b/conf/Makefile.extra-dist -index 39eb94bded6..5946ec24a65 100644 +index 58d7d9540be..375b1bf9b02 100644 --- a/conf/Makefile.extra-dist +++ b/conf/Makefile.extra-dist @@ -14,6 +14,9 @@ EXTRA_DIST += util/import_unicode.py diff --git a/0134-docs-Add-grub-boot-indeterminate.service-example.patch b/0132-docs-Add-grub-boot-indeterminate.service-example.patch similarity index 100% rename from 0134-docs-Add-grub-boot-indeterminate.service-example.patch rename to 0132-docs-Add-grub-boot-indeterminate.service-example.patch diff --git a/0135-gentpl-add-disable-support.patch b/0133-gentpl-add-disable-support.patch similarity index 89% rename from 0135-gentpl-add-disable-support.patch rename to 0133-gentpl-add-disable-support.patch index d82d633..90308d8 100644 --- a/0135-gentpl-add-disable-support.patch +++ b/0133-gentpl-add-disable-support.patch @@ -9,10 +9,10 @@ Signed-off-by: Peter Jones 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/gentpl.py b/gentpl.py -index bf8439fa743..a8cd540550f 100644 +index f05812eace3..3a0c04963aa 100644 --- a/gentpl.py +++ b/gentpl.py -@@ -589,11 +589,21 @@ def platform_conditional(platform, closure): +@@ -592,11 +592,21 @@ def platform_conditional(platform, closure): # }; # def foreach_enabled_platform(defn, closure): @@ -35,7 +35,7 @@ index bf8439fa743..a8cd540550f 100644 for platform in GRUB_PLATFORMS: platform_conditional(platform, closure) -@@ -652,6 +662,8 @@ def first_time(defn, snippet): +@@ -655,6 +665,8 @@ def first_time(defn, snippet): def is_platform_independent(defn): if 'enable' in defn: return False diff --git a/0136-gentpl-add-pc-firmware-type.patch b/0134-gentpl-add-pc-firmware-type.patch similarity index 68% rename from 0136-gentpl-add-pc-firmware-type.patch rename to 0134-gentpl-add-pc-firmware-type.patch index 94737b3..9f0fd47 100644 --- a/0136-gentpl-add-pc-firmware-type.patch +++ b/0134-gentpl-add-pc-firmware-type.patch @@ -1,6 +1,6 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Peter Jones -Date: Wed, 11 Jul 2018 13:43:34 -0400 +Date: Thu, 11 Jul 2019 11:04:24 +0200 Subject: [PATCH] gentpl: add 'pc' firmware type Signed-off-by: Peter Jones @@ -9,14 +9,14 @@ Signed-off-by: Peter Jones 1 file changed, 1 insertion(+) diff --git a/gentpl.py b/gentpl.py -index a8cd540550f..baac6a2af69 100644 +index 3a0c04963aa..1d9dda430e7 100644 --- a/gentpl.py +++ b/gentpl.py -@@ -49,6 +49,7 @@ GROUPS["arm"] = [ "arm_uboot", "arm_efi", "arm_coreboot" ] - GROUPS["arm64"] = [ "arm64_efi" ] +@@ -51,6 +51,7 @@ GROUPS["riscv32"] = [ "riscv32_efi" ] + GROUPS["riscv64"] = [ "riscv64_efi" ] # Groups based on firmware +GROUPS["pc"] = [ "i386_pc" ] - GROUPS["efi"] = [ "i386_efi", "x86_64_efi", "ia64_efi", "arm_efi", "arm64_efi" ] + GROUPS["efi"] = [ "i386_efi", "x86_64_efi", "ia64_efi", "arm_efi", "arm64_efi", + "riscv32_efi", "riscv64_efi" ] GROUPS["ieee1275"] = [ "i386_ieee1275", "sparc64_ieee1275", "powerpc_ieee1275" ] - GROUPS["uboot"] = [ "arm_uboot" ] diff --git a/0137-efinet-also-use-the-firmware-acceleration-for-http.patch b/0135-efinet-also-use-the-firmware-acceleration-for-http.patch similarity index 96% rename from 0137-efinet-also-use-the-firmware-acceleration-for-http.patch rename to 0135-efinet-also-use-the-firmware-acceleration-for-http.patch index 5771c8a..915b5aa 100644 --- a/0137-efinet-also-use-the-firmware-acceleration-for-http.patch +++ b/0135-efinet-also-use-the-firmware-acceleration-for-http.patch @@ -9,7 +9,7 @@ Signed-off-by: Peter Jones 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/grub-core/net/efi/net.c b/grub-core/net/efi/net.c -index 2bf15447fd5..f208d1b180c 100644 +index 4bb308026ce..6603cd83edc 100644 --- a/grub-core/net/efi/net.c +++ b/grub-core/net/efi/net.c @@ -1324,7 +1324,9 @@ grub_efi_net_boot_from_https (void) diff --git a/0138-efi-http-Make-root_url-reflect-the-protocol-hostname.patch b/0136-efi-http-Make-root_url-reflect-the-protocol-hostname.patch similarity index 100% rename from 0138-efi-http-Make-root_url-reflect-the-protocol-hostname.patch rename to 0136-efi-http-Make-root_url-reflect-the-protocol-hostname.patch diff --git a/0142-Make-it-so-we-can-tell-configure-which-cflags-utils-.patch b/0137-Make-it-so-we-can-tell-configure-which-cflags-utils-.patch similarity index 95% rename from 0142-Make-it-so-we-can-tell-configure-which-cflags-utils-.patch rename to 0137-Make-it-so-we-can-tell-configure-which-cflags-utils-.patch index 292e565..403412b 100644 --- a/0142-Make-it-so-we-can-tell-configure-which-cflags-utils-.patch +++ b/0137-Make-it-so-we-can-tell-configure-which-cflags-utils-.patch @@ -17,10 +17,10 @@ Signed-off-by: Peter Jones 3 files changed, 64 insertions(+), 16 deletions(-) diff --git a/configure.ac b/configure.ac -index 9ab683fefac..819212095ff 100644 +index 8ee18ba159a..cf327482e8a 100644 --- a/configure.ac +++ b/configure.ac -@@ -850,11 +850,23 @@ if ( test "x$target_cpu" = xi386 || test "x$target_cpu" = xx86_64 ) && test "x$p +@@ -868,11 +868,23 @@ if ( test "x$target_cpu" = xi386 || test "x$target_cpu" = xx86_64 ) && test "x$p TARGET_CFLAGS="$TARGET_CFLAGS -mno-mmx -mno-sse -mno-sse2 -mno-sse3 -mno-3dnow" fi @@ -45,7 +45,7 @@ index 9ab683fefac..819212095ff 100644 AC_CACHE_CHECK([for options to get soft-float], grub_cv_target_cc_soft_float, [ grub_cv_target_cc_soft_float=no if test "x$target_cpu" = xarm64; then -@@ -1939,6 +1951,41 @@ HOST_CPPFLAGS="$HOST_CPPFLAGS -I\$(top_builddir)/include" +@@ -1951,6 +1963,41 @@ HOST_CPPFLAGS="$HOST_CPPFLAGS -I\$(top_builddir)/include" TARGET_CPPFLAGS="$TARGET_CPPFLAGS -I\$(top_srcdir)/include" TARGET_CPPFLAGS="$TARGET_CPPFLAGS -I\$(top_builddir)/include" @@ -88,7 +88,7 @@ index 9ab683fefac..819212095ff 100644 GRUB_PLATFORM="${platform}" diff --git a/conf/Makefile.common b/conf/Makefile.common -index 1ecb921db65..b93879804c0 100644 +index 5e8ba2ae3b0..bbf33b0bc4a 100644 --- a/conf/Makefile.common +++ b/conf/Makefile.common @@ -40,24 +40,25 @@ CPPFLAGS_KERNEL = $(CPPFLAGS_CPU) $(CPPFLAGS_PLATFORM) -DGRUB_KERNEL=1 @@ -129,10 +129,10 @@ index 1ecb921db65..b93879804c0 100644 # Other variables diff --git a/gentpl.py b/gentpl.py -index 6409736e81c..1e4635f4426 100644 +index 1d9dda430e7..95fe1a24d8a 100644 --- a/gentpl.py +++ b/gentpl.py -@@ -694,10 +694,10 @@ def module(defn, platform): +@@ -697,10 +697,10 @@ def module(defn, platform): var_set(cname(defn) + "_SOURCES", platform_sources(defn, platform) + " ## platform sources") var_set("nodist_" + cname(defn) + "_SOURCES", platform_nodist_sources(defn, platform) + " ## platform nodist sources") var_set(cname(defn) + "_LDADD", platform_ldadd(defn, platform)) diff --git a/0143-module-verifier-make-it-possible-to-run-checkers-on-.patch b/0138-module-verifier-make-it-possible-to-run-checkers-on-.patch similarity index 98% rename from 0143-module-verifier-make-it-possible-to-run-checkers-on-.patch rename to 0138-module-verifier-make-it-possible-to-run-checkers-on-.patch index 0bdfca1..e31b38f 100644 --- a/0143-module-verifier-make-it-possible-to-run-checkers-on-.patch +++ b/0138-module-verifier-make-it-possible-to-run-checkers-on-.patch @@ -40,7 +40,7 @@ index 4db6b4bedd1..fc23ef800b3 100644 #include "grub-module-verifierXX.c" +#endif diff --git a/util/grub-module-verifierXX.c b/util/grub-module-verifierXX.c -index 1feaafc9b9e..597ded14362 100644 +index ceb24309aec..a98e2f9b1ac 100644 --- a/util/grub-module-verifierXX.c +++ b/util/grub-module-verifierXX.c @@ -1,3 +1,12 @@ diff --git a/0139-Force-everything-to-use-python3.patch b/0139-Force-everything-to-use-python3.patch deleted file mode 100644 index b4b0d74..0000000 --- a/0139-Force-everything-to-use-python3.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Peter Jones -Date: Tue, 10 Jul 2018 16:54:02 -0400 -Subject: [PATCH] Force everything to use python3 - -But this still means you need to do PYTHON=python=3 ./autogen.sh if you -run the world's worst tooling before you patch. - -Signed-off-by: Peter Jones ---- - conf/Makefile.common | 4 ++-- - gentpl.py | 2 +- - 2 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/conf/Makefile.common b/conf/Makefile.common -index c75848f5c06..1ecb921db65 100644 ---- a/conf/Makefile.common -+++ b/conf/Makefile.common -@@ -128,11 +128,11 @@ BUILT_SOURCES = - - .PRECIOUS: $(top_srcdir)/Makefile.util.am - $(top_srcdir)/Makefile.util.am: $(top_srcdir)/gentpl.py $(top_srcdir)/Makefile.util.def $(top_srcdir)/Makefile.utilgcry.def -- python $^ > $@.new || (rm -f $@.new; exit 1) -+ python3 $^ > $@.new || (rm -f $@.new; exit 1) - mv $@.new $@ - - .PRECIOUS: $(top_srcdir)/grub-core/Makefile.core.am - $(top_srcdir)/grub-core/Makefile.core.am: $(top_srcdir)/gentpl.py $(top_srcdir)/grub-core/Makefile.core.def $(top_srcdir)/grub-core/Makefile.gcry.def - if [ "x$$GRUB_CONTRIB" != x ]; then echo "You need to run ./autogen.sh manually." >&2; exit 1; fi -- python $^ > $@.new || (rm -f $@.new; exit 1) -+ python3 $^ > $@.new || (rm -f $@.new; exit 1) - mv $@.new $@ -diff --git a/gentpl.py b/gentpl.py -index baac6a2af69..6409736e81c 100644 ---- a/gentpl.py -+++ b/gentpl.py -@@ -1,4 +1,4 @@ --#! /usr/bin/python -+#! /usr/bin/env python3 - # GRUB -- GRand Unified Bootloader - # Copyright (C) 2010,2011,2012,2013 Free Software Foundation, Inc. - # diff --git a/0145-Rework-how-the-fdt-command-builds.patch b/0139-Rework-how-the-fdt-command-builds.patch similarity index 86% rename from 0145-Rework-how-the-fdt-command-builds.patch rename to 0139-Rework-how-the-fdt-command-builds.patch index 34b2d3c..9936858 100644 --- a/0145-Rework-how-the-fdt-command-builds.patch +++ b/0139-Rework-how-the-fdt-command-builds.patch @@ -1,6 +1,6 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Peter Jones -Date: Thu, 12 Jul 2018 11:00:45 -0400 +Date: Thu, 11 Jul 2019 13:01:41 +0200 Subject: [PATCH] Rework how the fdt command builds. Trying to avoid all variants of: @@ -22,10 +22,10 @@ Signed-off-by: Peter Jones 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def -index 4168ec5d3ff..144734e39e1 100644 +index 48491b50683..556adca7074 100644 --- a/grub-core/Makefile.core.def +++ b/grub-core/Makefile.core.def -@@ -165,7 +165,6 @@ kernel = { +@@ -175,7 +175,6 @@ kernel = { arm_coreboot = kern/arm/coreboot/init.c; arm_coreboot = kern/arm/coreboot/timer.c; arm_coreboot = kern/arm/coreboot/coreboot.S; @@ -33,24 +33,24 @@ index 4168ec5d3ff..144734e39e1 100644 arm_coreboot = bus/fdt.c; arm_coreboot = term/ps2.c; arm_coreboot = term/arm/pl050.c; -@@ -315,6 +314,8 @@ kernel = { - arm64 = kern/arm64/dl.c; - arm64 = kern/arm64/dl_helper.c; +@@ -348,6 +347,8 @@ kernel = { + riscv64 = kern/riscv/cache_flush.S; + riscv64 = kern/riscv/dl.c; + fdt = lib/fdt.c; + emu = disk/host.c; emu = kern/emu/cache_s.S; emu = kern/emu/hostdisk.c; -@@ -1713,7 +1714,6 @@ module = { - arm_uboot = loader/arm/linux.c; - arm64 = loader/arm64/linux.c; +@@ -1801,7 +1802,6 @@ module = { + riscv32 = loader/riscv/linux.c; + riscv64 = loader/riscv/linux.c; emu = loader/emu/linux.c; - fdt = lib/fdt.c; common = loader/linux.c; common = lib/cmdline.c; -@@ -1724,7 +1724,6 @@ module = { +@@ -1812,7 +1812,6 @@ module = { module = { name = fdt; efi = loader/efi/fdt.c; @@ -72,7 +72,7 @@ index 0d371c5633e..37e04bd69e7 100644 #define FDT_BEGIN_NODE 0x00000001 diff --git a/grub-core/loader/efi/fdt.c b/grub-core/loader/efi/fdt.c -index a4c6e803645..a9dbcfdfeaf 100644 +index ee9c5592c70..37ca407bb36 100644 --- a/grub-core/loader/efi/fdt.c +++ b/grub-core/loader/efi/fdt.c @@ -26,6 +26,8 @@ @@ -85,7 +85,7 @@ index a4c6e803645..a9dbcfdfeaf 100644 static void *fdt; diff --git a/include/grub/fdt.h b/include/grub/fdt.h -index 158b1bc4b3a..6ee57e11ab3 100644 +index e609c7e4111..22b7c5463fc 100644 --- a/include/grub/fdt.h +++ b/include/grub/fdt.h @@ -19,6 +19,8 @@ @@ -97,7 +97,7 @@ index 158b1bc4b3a..6ee57e11ab3 100644 #include #include -@@ -141,4 +143,6 @@ int EXPORT_FUNC(grub_fdt_set_prop) (void *fdt, unsigned int nodeoffset, const ch +@@ -144,4 +146,6 @@ int EXPORT_FUNC(grub_fdt_set_prop) (void *fdt, unsigned int nodeoffset, const ch grub_fdt_set_prop ((fdt), (nodeoffset), "reg", reg_64, 16); \ }) @@ -105,7 +105,7 @@ index 158b1bc4b3a..6ee57e11ab3 100644 + #endif /* ! GRUB_FDT_HEADER */ diff --git a/grub-core/Makefile.am b/grub-core/Makefile.am -index 3781bb9cbb9..4062652506d 100644 +index d9ad30052f1..ee9c4e4eb88 100644 --- a/grub-core/Makefile.am +++ b/grub-core/Makefile.am @@ -76,6 +76,7 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/sb.h diff --git a/0146-Disable-non-wordsize-allocations-on-arm.patch b/0140-Disable-non-wordsize-allocations-on-arm.patch similarity index 93% rename from 0146-Disable-non-wordsize-allocations-on-arm.patch rename to 0140-Disable-non-wordsize-allocations-on-arm.patch index 5c627a3..64da8e6 100644 --- a/0146-Disable-non-wordsize-allocations-on-arm.patch +++ b/0140-Disable-non-wordsize-allocations-on-arm.patch @@ -9,10 +9,10 @@ Signed-off-by: Peter Jones 1 file changed, 20 insertions(+) diff --git a/configure.ac b/configure.ac -index 819212095ff..9323c125469 100644 +index cf327482e8a..9b0946c27bf 100644 --- a/configure.ac +++ b/configure.ac -@@ -1234,6 +1234,26 @@ if test "x$target_cpu" = xarm; then +@@ -1262,6 +1262,26 @@ if test "x$target_cpu" = xarm; then done ]) diff --git a/0140-Fix-an-8-year-old-typo.patch b/0140-Fix-an-8-year-old-typo.patch deleted file mode 100644 index 642e46a..0000000 --- a/0140-Fix-an-8-year-old-typo.patch +++ /dev/null @@ -1,23 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Peter Jones -Date: Thu, 26 Jul 2018 14:54:44 -0400 -Subject: [PATCH] Fix an 8 year old typo. - -Signed-off-by: Peter Jones ---- - configure.ac | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/configure.ac b/configure.ac -index 5f47a9265f3..9ab683fefac 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -307,7 +307,7 @@ fi - - AC_SUBST(bootdirname) - AC_DEFINE_UNQUOTED(GRUB_BOOT_DIR_NAME, "$bootdirname", -- [Default boot directory name]") -+ [Default boot directory name]) - - AC_ARG_WITH([grubdir], - AS_HELP_STRING([--with-grubdir=DIR], diff --git a/0141-autogen-don-t-run-autoreconf-in-the-topdir.patch b/0141-autogen-don-t-run-autoreconf-in-the-topdir.patch deleted file mode 100644 index e5b7c33..0000000 --- a/0141-autogen-don-t-run-autoreconf-in-the-topdir.patch +++ /dev/null @@ -1,21 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Peter Jones -Date: Thu, 26 Jul 2018 15:47:48 -0400 -Subject: [PATCH] autogen: don't run autoreconf in the topdir - -Signed-off-by: Peter Jones ---- - autogen.sh | 2 -- - 1 file changed, 2 deletions(-) - -diff --git a/autogen.sh b/autogen.sh -index 7537561ad0d..f608b9467a0 100755 ---- a/autogen.sh -+++ b/autogen.sh -@@ -82,6 +82,4 @@ done - echo "Saving timestamps..." - echo timestamp > stamp-h.in - --echo "Running autoreconf..." --autoreconf -vi - exit 0 diff --git a/0147-strip-R-.note.gnu.property-at-more-places.patch b/0141-strip-R-.note.gnu.property-at-more-places.patch similarity index 96% rename from 0147-strip-R-.note.gnu.property-at-more-places.patch rename to 0141-strip-R-.note.gnu.property-at-more-places.patch index 0bd0be0..d568422 100644 --- a/0147-strip-R-.note.gnu.property-at-more-places.patch +++ b/0141-strip-R-.note.gnu.property-at-more-places.patch @@ -55,7 +55,7 @@ Signed-off-by: Peter Jones 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile.am b/Makefile.am -index c7b0e6a9c46..287fff66b20 100644 +index bf9c1ba64c9..0d4dd7c2e90 100644 --- a/Makefile.am +++ b/Makefile.am @@ -209,7 +209,7 @@ pc-chainloader.elf: $(srcdir)/grub-core/tests/boot/kernel-8086.S $(srcdir)/grub- @@ -68,10 +68,10 @@ index c7b0e6a9c46..287fff66b20 100644 ntldr.elf: $(srcdir)/grub-core/tests/boot/kernel-8086.S $(srcdir)/grub-core/tests/boot/qemu-shutdown-x86.S $(TARGET_CC) -o $@ $< -DTARGET_NTLDR=1 -DSUCCESSFUL_BOOT_STRING=\"$(SUCCESSFUL_BOOT_STRING)\" -static -ffreestanding -nostdlib -nostdinc -Wl,--build-id=none -Wl,-N -Wl,-Ttext,0 -m32 diff --git a/gentpl.py b/gentpl.py -index 1e4635f4426..d662c305f66 100644 +index 95fe1a24d8a..32cf7456b72 100644 --- a/gentpl.py +++ b/gentpl.py -@@ -776,7 +776,7 @@ def image(defn, platform): +@@ -779,7 +779,7 @@ def image(defn, platform): if test x$(TARGET_APPLE_LINKER) = x1; then \ $(MACHO2IMG) $< $@; \ else \ diff --git a/0148-Prepend-prefix-when-HTTP-path-is-relative.patch b/0142-Prepend-prefix-when-HTTP-path-is-relative.patch similarity index 100% rename from 0148-Prepend-prefix-when-HTTP-path-is-relative.patch rename to 0142-Prepend-prefix-when-HTTP-path-is-relative.patch diff --git a/0149-Make-linux_arm_kernel_header.hdr_offset-be-at-the-ri.patch b/0143-Make-linux_arm_kernel_header.hdr_offset-be-at-the-ri.patch similarity index 98% rename from 0149-Make-linux_arm_kernel_header.hdr_offset-be-at-the-ri.patch rename to 0143-Make-linux_arm_kernel_header.hdr_offset-be-at-the-ri.patch index e0becd6..a3c3213 100644 --- a/0149-Make-linux_arm_kernel_header.hdr_offset-be-at-the-ri.patch +++ b/0143-Make-linux_arm_kernel_header.hdr_offset-be-at-the-ri.patch @@ -57,7 +57,7 @@ index 0622dfa48d4..b56ea0bc041 100644 return GRUB_ERR_BUG; diff --git a/include/grub/arm/linux.h b/include/grub/arm/linux.h -index 5900fc8a40c..bed308f22cb 100644 +index 775297db869..b582f67f661 100644 --- a/include/grub/arm/linux.h +++ b/include/grub/arm/linux.h @@ -31,7 +31,7 @@ struct linux_arm_kernel_header { diff --git a/0150-Make-grub_error-more-verbose.patch b/0144-Make-grub_error-more-verbose.patch similarity index 96% rename from 0150-Make-grub_error-more-verbose.patch rename to 0144-Make-grub_error-more-verbose.patch index 6fffdeb..ec4a3eb 100644 --- a/0150-Make-grub_error-more-verbose.patch +++ b/0144-Make-grub_error-more-verbose.patch @@ -11,7 +11,7 @@ Signed-off-by: Peter Jones 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c -index 5cdf6c943f2..7692e63ba24 100644 +index a9e37108c6d..15595a46e23 100644 --- a/grub-core/kern/efi/mm.c +++ b/grub-core/kern/efi/mm.c @@ -157,12 +157,20 @@ grub_efi_allocate_pages_real (grub_efi_physical_address_t address, @@ -81,10 +81,10 @@ index 53c734de70e..aebfe0cf839 100644 return n; diff --git a/include/grub/err.h b/include/grub/err.h -index 1590c688e1d..9b830757d35 100644 +index 24ba9f5f592..b68bbec3c72 100644 --- a/include/grub/err.h +++ b/include/grub/err.h -@@ -84,7 +84,10 @@ struct grub_error_saved +@@ -85,7 +85,10 @@ struct grub_error_saved extern grub_err_t EXPORT_VAR(grub_errno); extern char EXPORT_VAR(grub_errmsg)[GRUB_MAX_ERRMSG]; diff --git a/0144-grub-module-verifier-report-the-filename-or-modname-.patch b/0144-grub-module-verifier-report-the-filename-or-modname-.patch deleted file mode 100644 index c27d065..0000000 --- a/0144-grub-module-verifier-report-the-filename-or-modname-.patch +++ /dev/null @@ -1,250 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Peter Jones -Date: Wed, 1 Aug 2018 10:12:47 -0400 -Subject: [PATCH] grub-module-verifier: report the filename or modname in - errors. - -Make it so that when grub-module-verifier complains of an issue, it tells you -which module the issue was with. - -Signed-off-by: Peter Jones ---- - util/grub-module-verifier.c | 6 ++--- - util/grub-module-verifierXX.c | 58 ++++++++++++++++++++++-------------------- - include/grub/module_verifier.h | 4 +-- - 3 files changed, 36 insertions(+), 32 deletions(-) - -diff --git a/util/grub-module-verifier.c b/util/grub-module-verifier.c -index a79271f6631..03ba1ab437a 100644 ---- a/util/grub-module-verifier.c -+++ b/util/grub-module-verifier.c -@@ -157,7 +157,7 @@ main (int argc, char **argv) - if (strcmp(archs[arch].name, argv[2]) == 0) - break; - if (arch == ARRAY_SIZE(archs)) -- grub_util_error("unknown arch: %s", argv[2]); -+ grub_util_error("%s: unknown arch: %s", argv[1], argv[2]); - - for (whitelist = 0; whitelist < ARRAY_SIZE(whitelists); whitelist++) - if (strcmp(whitelists[whitelist].arch, argv[2]) == 0 -@@ -169,8 +169,8 @@ main (int argc, char **argv) - module_size = grub_util_get_image_size (argv[1]); - module_img = grub_util_read_image (argv[1]); - if (archs[arch].voidp_sizeof == 8) -- grub_module_verify64(module_img, module_size, &archs[arch], whitelist_empty); -+ grub_module_verify64(argv[1], module_img, module_size, &archs[arch], whitelist_empty); - else -- grub_module_verify32(module_img, module_size, &archs[arch], whitelist_empty); -+ grub_module_verify32(argv[1], module_img, module_size, &archs[arch], whitelist_empty); - return 0; - } -diff --git a/util/grub-module-verifierXX.c b/util/grub-module-verifierXX.c -index 597ded14362..a98e2f9b1ac 100644 ---- a/util/grub-module-verifierXX.c -+++ b/util/grub-module-verifierXX.c -@@ -160,14 +160,15 @@ find_section (const struct grub_module_verifier_arch *arch, Elf_Ehdr *e, const c - } - - static void --check_license (const struct grub_module_verifier_arch *arch, Elf_Ehdr *e) -+check_license (const char * const filename, -+ const struct grub_module_verifier_arch *arch, Elf_Ehdr *e) - { - Elf_Shdr *s = find_section (arch, e, ".module_license"); - if (s && (strcmp ((char *) e + grub_target_to_host(s->sh_offset), "LICENSE=GPLv3") == 0 - || strcmp ((char *) e + grub_target_to_host(s->sh_offset), "LICENSE=GPLv3+") == 0 - || strcmp ((char *) e + grub_target_to_host(s->sh_offset), "LICENSE=GPLv2+") == 0)) - return; -- grub_util_error ("incompatible license"); -+ grub_util_error ("%s: incompatible license", filename); - } - - static Elf_Sym * -@@ -233,10 +234,10 @@ check_symbols (const struct grub_module_verifier_arch *arch, - s = find_section (arch, e, ".moddeps"); - - if (!s) -- grub_util_error ("no symbol table and no .moddeps section"); -+ grub_util_error ("%s: no symbol table and no .moddeps section", modname); - - if (!s->sh_size) -- grub_util_error ("no symbol table and empty .moddeps section"); -+ grub_util_error ("%s: no symbol table and empty .moddeps section", modname); - - return; - } -@@ -257,7 +258,7 @@ check_symbols (const struct grub_module_verifier_arch *arch, - break; - - default: -- return grub_util_error ("unknown symbol type `%d'", (int) type); -+ return grub_util_error ("%s: unknown symbol type `%d'", modname, (int) type); - } - } - } -@@ -283,7 +284,8 @@ is_symbol_local(Elf_Sym *sym) - } - - static void --section_check_relocations (const struct grub_module_verifier_arch *arch, void *ehdr, -+section_check_relocations (const char * const modname, -+ const struct grub_module_verifier_arch *arch, void *ehdr, - Elf_Shdr *s, size_t target_seg_size) - { - Elf_Rel *rel, *max; -@@ -292,7 +294,7 @@ section_check_relocations (const struct grub_module_verifier_arch *arch, void *e - - symtab = get_symtab (arch, ehdr, &symtabsize, &symtabentsize); - if (!symtab) -- grub_util_error ("relocation without symbol table"); -+ grub_util_error ("%s: relocation without symbol table", modname); - - for (rel = (Elf_Rel *) ((char *) ehdr + grub_target_to_host (s->sh_offset)), - max = (Elf_Rel *) ((char *) rel + grub_target_to_host (s->sh_size)); -@@ -303,7 +305,7 @@ section_check_relocations (const struct grub_module_verifier_arch *arch, void *e - unsigned i; - - if (target_seg_size < grub_target_to_host (rel->r_offset)) -- grub_util_error ("reloc offset is out of the segment"); -+ grub_util_error ("%s: reloc offset is out of the segment", modname); - - grub_uint32_t type = ELF_R_TYPE (grub_target_to_host (rel->r_info)); - -@@ -316,17 +318,17 @@ section_check_relocations (const struct grub_module_verifier_arch *arch, void *e - if (arch->supported_relocations[i] != -1) - continue; - if (!arch->short_relocations) -- grub_util_error ("unsupported relocation 0x%x", type); -+ grub_util_error ("%s: unsupported relocation 0x%x", modname, type); - for (i = 0; arch->short_relocations[i] != -1; i++) - if (type == arch->short_relocations[i]) - break; - if (arch->short_relocations[i] == -1) -- grub_util_error ("unsupported relocation 0x%x", type); -+ grub_util_error ("%s: unsupported relocation 0x%x", modname, type); - sym = (Elf_Sym *) ((char *) symtab + symtabentsize * ELF_R_SYM (grub_target_to_host (rel->r_info))); - - if (is_symbol_local (sym)) - continue; -- grub_util_error ("relocation 0x%x is not module-local", type); -+ grub_util_error ("%s: relocation 0x%x is not module-local", modname, type); - } - #if defined(MODULEVERIFIER_ELF64) - if (arch->machine == EM_AARCH64) -@@ -351,11 +353,11 @@ section_check_relocations (const struct grub_module_verifier_arch *arch, void *e - && ELF_R_TYPE (rel2->r_info) == R_AARCH64_LD64_GOT_LO12_NC) - break; - if (rel2 >= (Elf_Rela *) max) -- grub_util_error ("ADR_GOT_PAGE without matching LD64_GOT_LO12_NC"); -+ grub_util_error ("%s: ADR_GOT_PAGE without matching LD64_GOT_LO12_NC", modname); - break; - case R_AARCH64_LD64_GOT_LO12_NC: - if (unmatched_adr_got_page == 0) -- grub_util_error ("LD64_GOT_LO12_NC without matching ADR_GOT_PAGE"); -+ grub_util_error ("%s: LD64_GOT_LO12_NC without matching ADR_GOT_PAGE", modname); - unmatched_adr_got_page--; - break; - } -@@ -365,7 +367,8 @@ section_check_relocations (const struct grub_module_verifier_arch *arch, void *e - } - - static void --check_relocations (const struct grub_module_verifier_arch *arch, Elf_Ehdr *e) -+check_relocations (const char * const modname, -+ const struct grub_module_verifier_arch *arch, Elf_Ehdr *e) - { - Elf_Shdr *s; - unsigned i; -@@ -378,21 +381,22 @@ check_relocations (const struct grub_module_verifier_arch *arch, Elf_Ehdr *e) - Elf_Shdr *ts; - - if (grub_target_to_host32 (s->sh_type) == SHT_REL && !(arch->flags & GRUB_MODULE_VERIFY_SUPPORTS_REL)) -- grub_util_error ("unsupported SHT_REL"); -+ grub_util_error ("%s: unsupported SHT_REL", modname); - if (grub_target_to_host32 (s->sh_type) == SHT_RELA && !(arch->flags & GRUB_MODULE_VERIFY_SUPPORTS_RELA)) -- grub_util_error ("unsupported SHT_RELA"); -+ grub_util_error ("%s: unsupported SHT_RELA", modname); - - /* Find the target segment. */ - if (grub_target_to_host32 (s->sh_info) >= grub_target_to_host16 (e->e_shnum)) -- grub_util_error ("orphaned reloc section"); -+ grub_util_error ("%s: orphaned reloc section", modname); - ts = (Elf_Shdr *) ((char *) e + grub_target_to_host (e->e_shoff) + grub_target_to_host32 (s->sh_info) * grub_target_to_host16 (e->e_shentsize)); - -- section_check_relocations (arch, e, s, grub_target_to_host (ts->sh_size)); -+ section_check_relocations (modname, arch, e, s, grub_target_to_host (ts->sh_size)); - } - } - - void --SUFFIX(grub_module_verify) (void *module_img, size_t size, -+SUFFIX(grub_module_verify) (const char * const filename, -+ void *module_img, size_t size, - const struct grub_module_verifier_arch *arch, - const char **whitelist_empty) - { -@@ -400,7 +404,7 @@ SUFFIX(grub_module_verify) (void *module_img, size_t size, - - /* Check the header size. */ - if (size < sizeof (Elf_Ehdr)) -- grub_util_error ("ELF header smaller than expected"); -+ grub_util_error ("%s: ELF header smaller than expected", filename); - - /* Check the magic numbers. */ - if (e->e_ident[EI_MAG0] != ELFMAG0 -@@ -409,36 +413,36 @@ SUFFIX(grub_module_verify) (void *module_img, size_t size, - || e->e_ident[EI_MAG3] != ELFMAG3 - || e->e_ident[EI_VERSION] != EV_CURRENT - || grub_target_to_host32 (e->e_version) != EV_CURRENT) -- grub_util_error ("invalid arch-independent ELF magic"); -+ grub_util_error ("%s: invalid arch-independent ELF magic", filename); - - if (e->e_ident[EI_CLASS] != ELFCLASSXX - || e->e_ident[EI_DATA] != (arch->bigendian ? ELFDATA2MSB : ELFDATA2LSB) - || grub_target_to_host16 (e->e_machine) != arch->machine) -- grub_util_error ("invalid arch-dependent ELF magic"); -+ grub_util_error ("%s: invalid arch-dependent ELF magic", filename); - - if (grub_target_to_host16 (e->e_type) != ET_REL) - { -- grub_util_error ("this ELF file is not of the right type"); -+ grub_util_error ("%s: this ELF file is not of the right type", filename); - } - - /* Make sure that every section is within the core. */ - if (size < grub_target_to_host (e->e_shoff) - + (grub_uint32_t) grub_target_to_host16 (e->e_shentsize) * grub_target_to_host16(e->e_shnum)) - { -- grub_util_error ("ELF sections outside core"); -+ grub_util_error ("%s: ELF sections outside core", filename); - } - -- check_license (arch, e); -+ check_license (filename, arch, e); - - Elf_Shdr *s; - const char *modname; - - s = find_section (arch, e, ".modname"); - if (!s) -- grub_util_error ("no module name found"); -+ grub_util_error ("%s: no module name found", filename); - - modname = (const char *) e + grub_target_to_host (s->sh_offset); - - check_symbols(arch, e, modname, whitelist_empty); -- check_relocations(arch, e); -+ check_relocations(modname, arch, e); - } -diff --git a/include/grub/module_verifier.h b/include/grub/module_verifier.h -index f4870cb9c2d..ba21c75e2eb 100644 ---- a/include/grub/module_verifier.h -+++ b/include/grub/module_verifier.h -@@ -16,5 +16,5 @@ struct grub_module_verifier_arch { - const int *short_relocations; - }; - --void grub_module_verify64(void *module_img, size_t module_size, const struct grub_module_verifier_arch *arch, const char **whitelist_empty); --void grub_module_verify32(void *module_img, size_t module_size, const struct grub_module_verifier_arch *arch, const char **whitelist_empty); -+void grub_module_verify64(const char * const filename, void *module_img, size_t module_size, const struct grub_module_verifier_arch *arch, const char **whitelist_empty); -+void grub_module_verify32(const char * const filename, void *module_img, size_t module_size, const struct grub_module_verifier_arch *arch, const char **whitelist_empty); diff --git a/0151-Make-reset-an-alias-for-the-reboot-command.patch b/0145-Make-reset-an-alias-for-the-reboot-command.patch similarity index 100% rename from 0151-Make-reset-an-alias-for-the-reboot-command.patch rename to 0145-Make-reset-an-alias-for-the-reboot-command.patch diff --git a/0152-EFI-more-debug-output-on-GOP-and-UGA-probing.patch b/0146-EFI-more-debug-output-on-GOP-and-UGA-probing.patch similarity index 100% rename from 0152-EFI-more-debug-output-on-GOP-and-UGA-probing.patch rename to 0146-EFI-more-debug-output-on-GOP-and-UGA-probing.patch diff --git a/0153-Add-a-version-command.patch b/0147-Add-a-version-command.patch similarity index 96% rename from 0153-Add-a-version-command.patch rename to 0147-Add-a-version-command.patch index 47da68f..f08559b 100644 --- a/0153-Add-a-version-command.patch +++ b/0147-Add-a-version-command.patch @@ -17,10 +17,10 @@ Signed-off-by: Peter Jones create mode 100644 grub-core/commands/version.c diff --git a/configure.ac b/configure.ac -index 9323c125469..61c4683cb76 100644 +index 9b0946c27bf..bca7c2818af 100644 --- a/configure.ac +++ b/configure.ac -@@ -287,6 +287,19 @@ AC_SUBST(target_cpu) +@@ -303,6 +303,19 @@ AC_SUBST(target_cpu) AC_SUBST(platform) # Define default variables @@ -41,10 +41,10 @@ index 9323c125469..61c4683cb76 100644 have_with_bootdir=n AC_ARG_WITH([bootdir], diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def -index 144734e39e1..59ead422028 100644 +index 556adca7074..8bb1dafd0ac 100644 --- a/grub-core/Makefile.core.def +++ b/grub-core/Makefile.core.def -@@ -535,6 +535,11 @@ image = { +@@ -576,6 +576,11 @@ image = { enable = mips_loongson; }; diff --git a/0154-Add-more-dprintf-and-nerf-dprintf-in-script.c.patch b/0148-Add-more-dprintf-and-nerf-dprintf-in-script.c.patch similarity index 94% rename from 0154-Add-more-dprintf-and-nerf-dprintf-in-script.c.patch rename to 0148-Add-more-dprintf-and-nerf-dprintf-in-script.c.patch index a86e6da..ac8ed7f 100644 --- a/0154-Add-more-dprintf-and-nerf-dprintf-in-script.c.patch +++ b/0148-Add-more-dprintf-and-nerf-dprintf-in-script.c.patch @@ -12,7 +12,7 @@ Signed-off-by: Peter Jones 4 files changed, 10 insertions(+) diff --git a/grub-core/disk/diskfilter.c b/grub-core/disk/diskfilter.c -index 6f901c0adf7..66f6b992604 100644 +index c3b578acf25..1a3eb6b8d77 100644 --- a/grub-core/disk/diskfilter.c +++ b/grub-core/disk/diskfilter.c @@ -188,6 +188,8 @@ scan_disk (const char *name, int accept_diskfilter) @@ -33,10 +33,10 @@ index 6f901c0adf7..66f6b992604 100644 if (!pv->disk) return grub_errno; diff --git a/grub-core/disk/efi/efidisk.c b/grub-core/disk/efi/efidisk.c -index 5d2400f66f2..4bc51877f04 100644 +index 9e20af70ee0..54c227b1c84 100644 --- a/grub-core/disk/efi/efidisk.c +++ b/grub-core/disk/efi/efidisk.c -@@ -846,6 +846,7 @@ grub_efidisk_get_device_name (grub_efi_handle_t *handle) +@@ -855,6 +855,7 @@ grub_efidisk_get_device_name (grub_efi_handle_t *handle) return 0; } diff --git a/0155-arm-arm64-loader-Better-memory-allocation-and-error-.patch b/0149-arm-arm64-loader-Better-memory-allocation-and-error-.patch similarity index 85% rename from 0155-arm-arm64-loader-Better-memory-allocation-and-error-.patch rename to 0149-arm-arm64-loader-Better-memory-allocation-and-error-.patch index 3cf7d15..c912d24 100644 --- a/0155-arm-arm64-loader-Better-memory-allocation-and-error-.patch +++ b/0149-arm-arm64-loader-Better-memory-allocation-and-error-.patch @@ -1,6 +1,6 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Peter Jones -Date: Tue, 14 Aug 2018 14:07:44 -0400 +Date: Thu, 11 Jul 2019 14:38:57 +0200 Subject: [PATCH] arm/arm64 loader: Better memory allocation and error messages. @@ -54,16 +54,8 @@ MMIO 0000000010548000-0000000010549fff 00000002 8KiB RT MMIO 0000000017000000-0000000017001fff 00000002 8KiB RT MMIO 000000001c025000-000000001c025fff 00000001 4KiB RT -When we're trying to find the base of ram, if we start with GRUB_UINT_MAX -(0xffffffff on all platforms) and always use min(), that means we eventually -decide that the base of ram is GRUB_UINT_MAX, which is lower than our first -memory address, and thus our allocation of the initramfs, which specifies this -value as the maximum possible address it can be at, fails. - -This patch changes it to start at GRUB_EFI_MAX_USABLE_ADDRESS, which is always -at least 0xffffffff on 32-bit platforms and at least 0x7ffffffffffffff on -64-bit platforms. Additionally, this adds a requirement that the memory we -choose is actually /allocatable/ conventional memory, not merely +This patch adds a requirement when we're trying to find the base of ram, that +the memory we choose is actually /allocatable/ conventional memory, not merely write-combining. On this machine that means we wind up with an allocation around 0x4392XXXXXX, which is a reasonable address. @@ -74,12 +66,12 @@ per-platform constraints on its given address are maintained. Signed-off-by: Peter Jones --- - grub-core/kern/efi/mm.c | 35 ++++++++++++++----- + grub-core/kern/efi/mm.c | 33 +++++++++++++----- grub-core/loader/arm64/linux.c | 78 ++++++++++++++++++++++++++++++++---------- - 2 files changed, 85 insertions(+), 28 deletions(-) + 2 files changed, 84 insertions(+), 27 deletions(-) diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c -index 7692e63ba24..2c41a528f27 100644 +index 15595a46e23..1b14fa0694c 100644 --- a/grub-core/kern/efi/mm.c +++ b/grub-core/kern/efi/mm.c @@ -154,6 +154,7 @@ grub_efi_allocate_pages_real (grub_efi_physical_address_t address, @@ -129,27 +121,23 @@ index 7692e63ba24..2c41a528f27 100644 } void * -@@ -696,11 +700,24 @@ grub_efi_get_ram_base(grub_addr_t *base_addr) - if (ret < 1) - return GRUB_ERR_BUG; - -- for (desc = memory_map, *base_addr = GRUB_UINT_MAX; -+ for (desc = memory_map, *base_addr = GRUB_EFI_MAX_USABLE_ADDRESS; +@@ -699,8 +703,21 @@ grub_efi_get_ram_base(grub_addr_t *base_addr) + for (desc = memory_map, *base_addr = GRUB_EFI_MAX_USABLE_ADDRESS; (grub_addr_t) desc < ((grub_addr_t) memory_map + memory_map_size); desc = NEXT_MEMORY_DESCRIPTOR (desc, desc_size)) - if (desc->attribute & GRUB_EFI_MEMORY_WB) - *base_addr = grub_min (*base_addr, desc->physical_start); + { + if (desc->type == GRUB_EFI_CONVENTIONAL_MEMORY && -+ (desc->attribute & GRUB_EFI_MEMORY_WB)) -+ { -+ *base_addr = grub_min (*base_addr, desc->physical_start); -+ grub_dprintf ("efi", "setting base_addr=0x%016lx\n", *base_addr); -+ } ++ (desc->attribute & GRUB_EFI_MEMORY_WB)) ++ { ++ *base_addr = grub_min (*base_addr, desc->physical_start); ++ grub_dprintf ("efi", "setting base_addr=0x%016lx\n", *base_addr); ++ } + else -+ { -+ grub_dprintf ("efi", "ignoring address 0x%016lx\n", desc->physical_start); -+ } ++ { ++ grub_dprintf ("efi", "ignoring address 0x%016lx\n", desc->physical_start); ++ } + } + + if (*base_addr == GRUB_EFI_MAX_USABLE_ADDRESS) @@ -158,10 +146,10 @@ index 7692e63ba24..2c41a528f27 100644 grub_free(memory_map); diff --git a/grub-core/loader/arm64/linux.c b/grub-core/loader/arm64/linux.c -index 93b5cd306eb..e1110749eb9 100644 +index 4c0a09c06de..8791b35b6fe 100644 --- a/grub-core/loader/arm64/linux.c +++ b/grub-core/loader/arm64/linux.c -@@ -70,13 +70,15 @@ finalize_params_linux (void) +@@ -71,13 +71,15 @@ finalize_params_linux (void) { grub_efi_loaded_image_t *loaded_image = NULL; int node, retval, len; @@ -169,7 +157,7 @@ index 93b5cd306eb..e1110749eb9 100644 + grub_err_t err = GRUB_ERR_NONE; void *fdt; - fdt = grub_fdt_load (0x400); + fdt = grub_fdt_load (GRUB_EFI_LINUX_FDT_EXTRA_SPACE); - if (!fdt) - goto failure; @@ -180,7 +168,7 @@ index 93b5cd306eb..e1110749eb9 100644 node = grub_fdt_find_subnode (fdt, 0, "chosen"); if (node < 0) -@@ -87,17 +89,26 @@ finalize_params_linux (void) +@@ -88,17 +90,26 @@ finalize_params_linux (void) */ retval = grub_fdt_set_prop32(fdt, 0, "#address-cells", 2); if (retval) @@ -210,7 +198,7 @@ index 93b5cd306eb..e1110749eb9 100644 /* Set initrd info */ if (initrd_start && initrd_end > initrd_start) -@@ -108,15 +119,26 @@ finalize_params_linux (void) +@@ -109,15 +120,26 @@ finalize_params_linux (void) retval = grub_fdt_set_prop64 (fdt, node, "linux,initrd-start", initrd_start); if (retval) @@ -240,8 +228,8 @@ index 93b5cd306eb..e1110749eb9 100644 + } grub_dprintf ("linux", "Installed/updated FDT configuration table @ %p\n", - fdt); -@@ -124,14 +146,20 @@ finalize_params_linux (void) + fdt); +@@ -125,14 +147,20 @@ finalize_params_linux (void) /* Convert command line to UCS-2 */ loaded_image = grub_efi_get_loaded_image (grub_efi_image_handle); if (!loaded_image) @@ -264,7 +252,7 @@ index 93b5cd306eb..e1110749eb9 100644 loaded_image->load_options_size = 2 * grub_utf8_to_utf16 (loaded_image->load_options, len, -@@ -141,7 +169,7 @@ finalize_params_linux (void) +@@ -142,7 +170,7 @@ finalize_params_linux (void) failure: grub_fdt_unload(); @@ -273,7 +261,7 @@ index 93b5cd306eb..e1110749eb9 100644 } static void -@@ -225,16 +253,28 @@ grub_linux_unload (void) +@@ -226,16 +254,28 @@ grub_linux_unload (void) static void * allocate_initrd_mem (int initrd_pages) { diff --git a/0156-Try-to-pick-better-locations-for-kernel-and-initrd.patch b/0150-Try-to-pick-better-locations-for-kernel-and-initrd.patch similarity index 94% rename from 0156-Try-to-pick-better-locations-for-kernel-and-initrd.patch rename to 0150-Try-to-pick-better-locations-for-kernel-and-initrd.patch index 6ae1981..25ad649 100644 --- a/0156-Try-to-pick-better-locations-for-kernel-and-initrd.patch +++ b/0150-Try-to-pick-better-locations-for-kernel-and-initrd.patch @@ -1,6 +1,6 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Peter Jones -Date: Mon, 27 Aug 2018 14:31:37 -0400 +Date: Thu, 11 Jul 2019 17:17:02 +0200 Subject: [PATCH] Try to pick better locations for kernel and initrd - Don't limit allocations on 64-bit platforms to < 0x[37f]fffffff if @@ -34,7 +34,7 @@ Signed-off-by: Peter Jones 7 files changed, 28 insertions(+), 12 deletions(-) diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c -index 2c41a528f27..cac775fc935 100644 +index 1b14fa0694c..d70e5b45b7c 100644 --- a/grub-core/kern/efi/mm.c +++ b/grub-core/kern/efi/mm.c @@ -122,7 +122,7 @@ grub_efi_allocate_pages_max (grub_efi_physical_address_t max, @@ -68,18 +68,18 @@ index 2c41a528f27..cac775fc935 100644 #endif diff --git a/grub-core/loader/i386/efi/linux.c b/grub-core/loader/i386/efi/linux.c -index ea9f5134e67..851bce77f12 100644 +index 3017d0f3e52..33e981e76e7 100644 --- a/grub-core/loader/i386/efi/linux.c +++ b/grub-core/loader/i386/efi/linux.c -@@ -28,6 +28,7 @@ +@@ -27,6 +27,7 @@ + #include #include #include - #include +#include GRUB_MOD_LICENSE ("GPLv3+"); -@@ -108,7 +109,9 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), +@@ -106,7 +107,9 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), size += ALIGN_UP (grub_file_size (files[i]), 4); } @@ -90,7 +90,7 @@ index ea9f5134e67..851bce77f12 100644 if (!initrd_mem) { grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("can't allocate initrd")); -@@ -209,8 +212,11 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), +@@ -202,8 +205,11 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), goto fail; } @@ -103,7 +103,7 @@ index ea9f5134e67..851bce77f12 100644 if (! params) { grub_error (GRUB_ERR_OUT_OF_MEMORY, "cannot allocate kernel parameters"); -@@ -280,8 +286,11 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), +@@ -273,8 +279,11 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), #endif grub_dprintf ("linux", "setting up cmdline\n"); @@ -117,7 +117,7 @@ index ea9f5134e67..851bce77f12 100644 if (!linux_cmdline) { grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("can't allocate cmdline")); -@@ -307,11 +316,12 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), +@@ -301,11 +310,12 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), kernel_mem = grub_efi_allocate_pages_max(lh->pref_address, BYTES_TO_PAGES(lh->init_size)); diff --git a/0151-Attempt-to-fix-up-all-the-places-Wsign-compare-error.patch b/0151-Attempt-to-fix-up-all-the-places-Wsign-compare-error.patch new file mode 100644 index 0000000..db05a0f --- /dev/null +++ b/0151-Attempt-to-fix-up-all-the-places-Wsign-compare-error.patch @@ -0,0 +1,396 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Thu, 11 Jul 2019 18:03:25 +0200 +Subject: [PATCH] Attempt to fix up all the places -Wsign-compare=error finds. + +Signed-off-by: Peter Jones +--- + grub-core/kern/emu/misc.c | 2 +- + grub-core/lib/reed_solomon.c | 4 +- + grub-core/osdep/linux/blocklist.c | 2 +- + grub-core/osdep/linux/getroot.c | 2 +- + grub-core/osdep/linux/hostdisk.c | 2 +- + util/grub-fstest.c | 2 +- + util/grub-menulst2cfg.c | 2 +- + util/grub-mkfont.c | 13 +- + util/grub-probe.c | 2 +- + util/grub-rpm-sort.c | 2 +- + util/setup.c | 2 +- + bootstrap.conf | 2 +- + .../gnulib-patches/fix-sign-compare-errors.patch | 161 +++++++++++++++++++++ + 13 files changed, 180 insertions(+), 18 deletions(-) + create mode 100644 grub-core/lib/gnulib-patches/fix-sign-compare-errors.patch + +diff --git a/grub-core/kern/emu/misc.c b/grub-core/kern/emu/misc.c +index 245b69cab51..7a8d9e62300 100644 +--- a/grub-core/kern/emu/misc.c ++++ b/grub-core/kern/emu/misc.c +@@ -177,7 +177,7 @@ grub_util_get_image_size (const char *path) + sz = ftello (f); + if (sz < 0) + grub_util_error (_("cannot open `%s': %s"), path, strerror (errno)); +- if (sz != (size_t) sz) ++ if (sz > (off_t)(GRUB_SIZE_MAX >> 1)) + grub_util_error (_("file `%s' is too big"), path); + ret = (size_t) sz; + +diff --git a/grub-core/lib/reed_solomon.c b/grub-core/lib/reed_solomon.c +index ee9fa7b4feb..19c20085279 100644 +--- a/grub-core/lib/reed_solomon.c ++++ b/grub-core/lib/reed_solomon.c +@@ -156,7 +156,7 @@ static void + rs_encode (gf_single_t *data, grub_size_t s, grub_size_t rs) + { + gf_single_t *rs_polynomial; +- int i, j; ++ unsigned int i, j; + gf_single_t *m; + m = xmalloc ((s + rs) * sizeof (gf_single_t)); + grub_memcpy (m, data, s * sizeof (gf_single_t)); +@@ -325,7 +325,7 @@ static void + encode_block (gf_single_t *ptr, grub_size_t s, + gf_single_t *rptr, grub_size_t rs) + { +- int i, j; ++ unsigned int i, j; + for (i = 0; i < SECTOR_SIZE; i++) + { + grub_size_t ds = (s + SECTOR_SIZE - 1 - i) / SECTOR_SIZE; +diff --git a/grub-core/osdep/linux/blocklist.c b/grub-core/osdep/linux/blocklist.c +index c77d6085ccb..42a315031ff 100644 +--- a/grub-core/osdep/linux/blocklist.c ++++ b/grub-core/osdep/linux/blocklist.c +@@ -109,7 +109,7 @@ grub_install_get_blocklist (grub_device_t root_dev, + else + { + struct fiemap *fie2; +- int i; ++ unsigned int i; + fie2 = xmalloc (sizeof (*fie2) + + fie1.fm_mapped_extents + * sizeof (fie1.fm_extents[1])); +diff --git a/grub-core/osdep/linux/getroot.c b/grub-core/osdep/linux/getroot.c +index 4c5a13022dc..2b7a626d5ea 100644 +--- a/grub-core/osdep/linux/getroot.c ++++ b/grub-core/osdep/linux/getroot.c +@@ -236,7 +236,7 @@ grub_find_root_devices_from_btrfs (const char *dir) + { + int fd; + struct btrfs_ioctl_fs_info_args fsi; +- int i, j = 0; ++ unsigned int i, j = 0; + char **ret; + + fd = open (dir, 0); +diff --git a/grub-core/osdep/linux/hostdisk.c b/grub-core/osdep/linux/hostdisk.c +index 8b92f8528f9..370d02787cd 100644 +--- a/grub-core/osdep/linux/hostdisk.c ++++ b/grub-core/osdep/linux/hostdisk.c +@@ -83,7 +83,7 @@ grub_util_get_fd_size_os (grub_util_fd_t fd, const char *name, unsigned *log_sec + if (sector_size & (sector_size - 1) || !sector_size) + return -1; + for (log_sector_size = 0; +- (1 << log_sector_size) < sector_size; ++ (1U << log_sector_size) < sector_size; + log_sector_size++); + + if (log_secsize) +diff --git a/util/grub-fstest.c b/util/grub-fstest.c +index f14e02d9727..88f9c5d4ad8 100644 +--- a/util/grub-fstest.c ++++ b/util/grub-fstest.c +@@ -323,7 +323,7 @@ cmd_cmp (char *src, char *dest) + read_file (src, cmp_hook, ff); + + { +- grub_uint64_t pre; ++ long long pre; + pre = ftell (ff); + fseek (ff, 0, SEEK_END); + if (pre != ftell (ff)) +diff --git a/util/grub-menulst2cfg.c b/util/grub-menulst2cfg.c +index a39f8693947..358d604210b 100644 +--- a/util/grub-menulst2cfg.c ++++ b/util/grub-menulst2cfg.c +@@ -34,7 +34,7 @@ main (int argc, char **argv) + char *buf = NULL; + size_t bufsize = 0; + char *suffix = xstrdup (""); +- int suffixlen = 0; ++ size_t suffixlen = 0; + const char *out_fname = 0; + + grub_util_host_init (&argc, &argv); +diff --git a/util/grub-mkfont.c b/util/grub-mkfont.c +index 0fe45a6103d..3e09240b99f 100644 +--- a/util/grub-mkfont.c ++++ b/util/grub-mkfont.c +@@ -138,7 +138,8 @@ add_glyph (struct grub_font_info *font_info, FT_UInt glyph_idx, FT_Face face, + int width, height; + int cuttop, cutbottom, cutleft, cutright; + grub_uint8_t *data; +- int mask, i, j, bitmap_size; ++ int mask, i, bitmap_size; ++ unsigned int j; + FT_GlyphSlot glyph; + int flag = FT_LOAD_RENDER | FT_LOAD_MONOCHROME; + FT_Error err; +@@ -183,7 +184,7 @@ add_glyph (struct grub_font_info *font_info, FT_UInt glyph_idx, FT_Face face, + cuttop = cutbottom = cutleft = cutright = 0; + else + { +- for (cuttop = 0; cuttop < glyph->bitmap.rows; cuttop++) ++ for (cuttop = 0; cuttop < (long)glyph->bitmap.rows; cuttop++) + { + for (j = 0; j < glyph->bitmap.width; j++) + if (glyph->bitmap.buffer[j / 8 + cuttop * glyph->bitmap.pitch] +@@ -203,10 +204,10 @@ add_glyph (struct grub_font_info *font_info, FT_UInt glyph_idx, FT_Face face, + break; + } + cutbottom = glyph->bitmap.rows - 1 - cutbottom; +- if (cutbottom + cuttop >= glyph->bitmap.rows) ++ if (cutbottom + cuttop >= (long)glyph->bitmap.rows) + cutbottom = 0; + +- for (cutleft = 0; cutleft < glyph->bitmap.width; cutleft++) ++ for (cutleft = 0; cutleft < (long)glyph->bitmap.width; cutleft++) + { + for (j = 0; j < glyph->bitmap.rows; j++) + if (glyph->bitmap.buffer[cutleft / 8 + j * glyph->bitmap.pitch] +@@ -225,7 +226,7 @@ add_glyph (struct grub_font_info *font_info, FT_UInt glyph_idx, FT_Face face, + break; + } + cutright = glyph->bitmap.width - 1 - cutright; +- if (cutright + cutleft >= glyph->bitmap.width) ++ if (cutright + cutleft >= (long)glyph->bitmap.width) + cutright = 0; + } + +@@ -262,7 +263,7 @@ add_glyph (struct grub_font_info *font_info, FT_UInt glyph_idx, FT_Face face, + + mask = 0; + data = &glyph_info->bitmap[0] - 1; +- for (j = cuttop; j < height + cuttop; j++) ++ for (j = cuttop; j < (long)height + cuttop; j++) + for (i = cutleft; i < width + cutleft; i++) + add_pixel (&data, &mask, + glyph->bitmap.buffer[i / 8 + j * glyph->bitmap.pitch] & +diff --git a/util/grub-probe.c b/util/grub-probe.c +index 81d27eead59..7481e487211 100644 +--- a/util/grub-probe.c ++++ b/util/grub-probe.c +@@ -798,7 +798,7 @@ argp_parser (int key, char *arg, struct argp_state *state) + + case 't': + { +- int i; ++ unsigned int i; + + for (i = PRINT_FS; i < ARRAY_SIZE (targets); i++) + if (strcmp (arg, targets[i]) == 0) +diff --git a/util/grub-rpm-sort.c b/util/grub-rpm-sort.c +index f33bd1ed568..8345944105f 100644 +--- a/util/grub-rpm-sort.c ++++ b/util/grub-rpm-sort.c +@@ -232,7 +232,7 @@ main (int argc, char *argv[]) + struct arguments arguments; + char **package_names = NULL; + size_t n_package_names = 0; +- int i; ++ unsigned int i; + + grub_util_host_init (&argc, &argv); + +diff --git a/util/setup.c b/util/setup.c +index 6f88f3cc43f..864094de682 100644 +--- a/util/setup.c ++++ b/util/setup.c +@@ -402,7 +402,7 @@ SETUP (const char *dir, + int is_ldm; + grub_err_t err; + grub_disk_addr_t *sectors; +- int i; ++ unsigned int i; + grub_fs_t fs; + unsigned int nsec, maxsec; + +diff --git a/bootstrap.conf b/bootstrap.conf +index 988dda099ac..8804d5beb89 100644 +--- a/bootstrap.conf ++++ b/bootstrap.conf +@@ -78,7 +78,7 @@ cp -a INSTALL INSTALL.grub + + bootstrap_post_import_hook () { + set -e +- for patchname in fix-null-deref fix-width no-abort; do ++ for patchname in fix-null-deref fix-width no-abort fix-sign-compare-errors; do + patch -d grub-core/lib/gnulib -p2 \ + < "grub-core/lib/gnulib-patches/$patchname.patch" + done +diff --git a/grub-core/lib/gnulib-patches/fix-sign-compare-errors.patch b/grub-core/lib/gnulib-patches/fix-sign-compare-errors.patch +new file mode 100644 +index 00000000000..479029c0565 +--- /dev/null ++++ b/grub-core/lib/gnulib-patches/fix-sign-compare-errors.patch +@@ -0,0 +1,161 @@ ++diff --git a/lib/regcomp.c b/lib/regcomp.c ++index cc85f35ac58..361079d82d6 100644 ++--- a/lib/regcomp.c +++++ b/lib/regcomp.c ++@@ -322,7 +322,7 @@ re_compile_fastmap_iter (regex_t *bufp, const re_dfastate_t *init_state, ++ *p++ = dfa->nodes[node].opr.c; ++ memset (&state, '\0', sizeof (state)); ++ if (__mbrtowc (&wc, (const char *) buf, p - buf, ++- &state) == p - buf +++ &state) == (size_t)(p - buf) ++ && (__wcrtomb ((char *) buf, __towlower (wc), &state) ++ != (size_t) -1)) ++ re_set_fastmap (fastmap, false, buf[0]); ++@@ -3778,7 +3778,7 @@ fetch_number (re_string_t *input, re_token_t *token, reg_syntax_t syntax) ++ num = ((token->type != CHARACTER || c < '0' || '9' < c || num == -2) ++ ? -2 ++ : num == -1 ++- ? c - '0' +++ ? (Idx)(c - '0') ++ : MIN (RE_DUP_MAX + 1, num * 10 + c - '0')); ++ } ++ return num; ++diff --git a/lib/regex_internal.c b/lib/regex_internal.c ++index 9004ce809eb..193a1e3d332 100644 ++--- a/lib/regex_internal.c +++++ b/lib/regex_internal.c ++@@ -233,7 +233,7 @@ build_wcs_buffer (re_string_t *pstr) ++ /* Apply the translation if we need. */ ++ if (__glibc_unlikely (pstr->trans != NULL)) ++ { ++- int i, ch; +++ unsigned int i, ch; ++ ++ for (i = 0; i < pstr->mb_cur_max && i < remain_len; ++i) ++ { ++@@ -376,7 +376,7 @@ build_wcs_upper_buffer (re_string_t *pstr) ++ prev_st = pstr->cur_state; ++ if (__glibc_unlikely (pstr->trans != NULL)) ++ { ++- int i, ch; +++ unsigned int i, ch; ++ ++ for (i = 0; i < pstr->mb_cur_max && i < remain_len; ++i) ++ { ++@@ -754,7 +754,7 @@ re_string_reconstruct (re_string_t *pstr, Idx idx, int eflags) ++ memset (&cur_state, 0, sizeof (cur_state)); ++ mbclen = __mbrtowc (&wc2, (const char *) pp, mlen, ++ &cur_state); ++- if (raw + offset - p <= mbclen +++ if ((size_t)(raw + offset - p) <= mbclen ++ && mbclen < (size_t) -2) ++ { ++ memset (&pstr->cur_state, '\0', ++diff --git a/lib/regex_internal.h b/lib/regex_internal.h ++index 5462419b787..e0f8292395d 100644 ++--- a/lib/regex_internal.h +++++ b/lib/regex_internal.h ++@@ -425,7 +425,7 @@ struct re_string_t ++ unsigned char offsets_needed; ++ unsigned char newline_anchor; ++ unsigned char word_ops_used; ++- int mb_cur_max; +++ unsigned int mb_cur_max; ++ }; ++ typedef struct re_string_t re_string_t; ++ ++@@ -702,7 +702,7 @@ struct re_dfa_t ++ unsigned int is_utf8 : 1; ++ unsigned int map_notascii : 1; ++ unsigned int word_ops_used : 1; ++- int mb_cur_max; +++ unsigned int mb_cur_max; ++ bitset_t word_char; ++ reg_syntax_t syntax; ++ Idx *subexp_map; ++diff --git a/lib/regexec.c b/lib/regexec.c ++index 0a7a27b772e..b57d4f9141d 100644 ++--- a/lib/regexec.c +++++ b/lib/regexec.c ++@@ -443,7 +443,7 @@ re_search_stub (struct re_pattern_buffer *bufp, const char *string, Idx length, ++ { ++ if (ret_len) ++ { ++- assert (pmatch[0].rm_so == start); +++ assert (pmatch[0].rm_so == (long)start); ++ rval = pmatch[0].rm_eo - start; ++ } ++ else ++@@ -877,11 +877,11 @@ re_search_internal (const regex_t *preg, const char *string, Idx length, ++ if (__glibc_unlikely (mctx.input.offsets_needed != 0)) ++ { ++ pmatch[reg_idx].rm_so = ++- (pmatch[reg_idx].rm_so == mctx.input.valid_len +++ (pmatch[reg_idx].rm_so == (long)mctx.input.valid_len ++ ? mctx.input.valid_raw_len ++ : mctx.input.offsets[pmatch[reg_idx].rm_so]); ++ pmatch[reg_idx].rm_eo = ++- (pmatch[reg_idx].rm_eo == mctx.input.valid_len +++ (pmatch[reg_idx].rm_eo == (long)mctx.input.valid_len ++ ? mctx.input.valid_raw_len ++ : mctx.input.offsets[pmatch[reg_idx].rm_eo]); ++ } ++@@ -1418,11 +1418,11 @@ set_regs (const regex_t *preg, const re_match_context_t *mctx, size_t nmatch, ++ } ++ memcpy (prev_idx_match, pmatch, sizeof (regmatch_t) * nmatch); ++ ++- for (idx = pmatch[0].rm_so; idx <= pmatch[0].rm_eo ;) +++ for (idx = pmatch[0].rm_so; idx <= (long)pmatch[0].rm_eo ;) ++ { ++ update_regs (dfa, pmatch, prev_idx_match, cur_node, idx, nmatch); ++ ++- if (idx == pmatch[0].rm_eo && cur_node == mctx->last_node) +++ if (idx == (long)pmatch[0].rm_eo && cur_node == mctx->last_node) ++ { ++ Idx reg_idx; ++ if (fs) ++@@ -1519,7 +1519,7 @@ update_regs (const re_dfa_t *dfa, regmatch_t *pmatch, ++ if (reg_num < nmatch) ++ { ++ /* We are at the last node of this sub expression. */ ++- if (pmatch[reg_num].rm_so < cur_idx) +++ if (pmatch[reg_num].rm_so < (long)cur_idx) ++ { ++ pmatch[reg_num].rm_eo = cur_idx; ++ /* This is a non-empty match or we are not inside an optional ++@@ -2938,7 +2938,7 @@ check_arrival (re_match_context_t *mctx, state_array_t *path, Idx top_node, ++ mctx->state_log[str_idx] = cur_state; ++ } ++ ++- for (null_cnt = 0; str_idx < last_str && null_cnt <= mctx->max_mb_elem_len;) +++ for (null_cnt = 0; str_idx < last_str && null_cnt <= (long)mctx->max_mb_elem_len;) ++ { ++ re_node_set_empty (&next_nodes); ++ if (mctx->state_log[str_idx + 1]) ++@@ -3718,7 +3718,7 @@ check_node_accept_bytes (const re_dfa_t *dfa, Idx node_idx, ++ const re_string_t *input, Idx str_idx) ++ { ++ const re_token_t *node = dfa->nodes + node_idx; ++- int char_len, elem_len; +++ unsigned int char_len, elem_len; ++ Idx i; ++ ++ if (__glibc_unlikely (node->type == OP_UTF8_PERIOD)) ++@@ -4066,7 +4066,7 @@ extend_buffers (re_match_context_t *mctx, int min_len) ++ /* Double the lengths of the buffers, but allocate at least MIN_LEN. */ ++ ret = re_string_realloc_buffers (pstr, ++ MAX (min_len, ++- MIN (pstr->len, pstr->bufs_len * 2))); +++ MIN ((long)pstr->len, pstr->bufs_len * 2))); ++ if (__glibc_unlikely (ret != REG_NOERROR)) ++ return ret; ++ ++@@ -4236,7 +4236,7 @@ match_ctx_add_entry (re_match_context_t *mctx, Idx node, Idx str_idx, Idx from, ++ = (from == to ? -1 : 0); ++ ++ mctx->bkref_ents[mctx->nbkref_ents++].more = 0; ++- if (mctx->max_mb_elem_len < to - from) +++ if (mctx->max_mb_elem_len < (long)(to - from)) ++ mctx->max_mb_elem_len = to - from; ++ return REG_NOERROR; ++ } diff --git a/0158-Don-t-use-Wno-sign-compare-Wno-conversion-Wno-error-.patch b/0152-Don-t-use-Wno-sign-compare-Wno-conversion-Wno-error-.patch similarity index 85% rename from 0158-Don-t-use-Wno-sign-compare-Wno-conversion-Wno-error-.patch rename to 0152-Don-t-use-Wno-sign-compare-Wno-conversion-Wno-error-.patch index dae1ea5..b2e5de0 100644 --- a/0158-Don-t-use-Wno-sign-compare-Wno-conversion-Wno-error-.patch +++ b/0152-Don-t-use-Wno-sign-compare-Wno-conversion-Wno-error-.patch @@ -1,6 +1,6 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Peter Jones -Date: Tue, 11 Sep 2018 15:59:39 -0400 +Date: Thu, 11 Jul 2019 18:20:37 +0200 Subject: [PATCH] Don't use -Wno-sign-compare -Wno-conversion -Wno-error, do use -Wextra. @@ -11,10 +11,10 @@ Signed-off-by: Peter Jones 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/configure.ac b/configure.ac -index 61c4683cb76..40fcf567ae7 100644 +index bca7c2818af..38d978bd650 100644 --- a/configure.ac +++ b/configure.ac -@@ -1396,11 +1396,11 @@ fi +@@ -1424,11 +1424,11 @@ fi # Set them to their new values for the tests below. CC="$TARGET_CC" if test x"$platform" = xemu ; then @@ -29,7 +29,7 @@ index 61c4683cb76..40fcf567ae7 100644 fi CPPFLAGS="$TARGET_CPPFLAGS" -@@ -1975,6 +1975,14 @@ if test x"$enable_werror" != xno ; then +@@ -1987,6 +1987,14 @@ if test x"$enable_werror" != xno ; then HOST_CFLAGS="$HOST_CFLAGS -Werror" fi @@ -45,7 +45,7 @@ index 61c4683cb76..40fcf567ae7 100644 TARGET_CCAS=$TARGET_CC diff --git a/conf/Makefile.common b/conf/Makefile.common -index b93879804c0..0d9910d7875 100644 +index bbf33b0bc4a..b867691f125 100644 --- a/conf/Makefile.common +++ b/conf/Makefile.common @@ -66,7 +66,7 @@ grubconfdir = $(sysconfdir)/grub.d @@ -54,6 +54,6 @@ index b93879804c0..0d9910d7875 100644 -CFLAGS_GNULIB = -Wno-undef -Wno-sign-compare -Wno-unused -Wno-unused-parameter -Wno-redundant-decls -Wno-unreachable-code -Wno-conversion +CFLAGS_GNULIB = -Wno-undef -Wno-unused -Wno-unused-parameter -Wno-redundant-decls -Wno-unreachable-code - CPPFLAGS_GNULIB = -I$(top_builddir)/grub-core/gnulib -I$(top_srcdir)/grub-core/gnulib + CPPFLAGS_GNULIB = -I$(top_builddir)/grub-core/lib/gnulib -I$(top_srcdir)/grub-core/lib/gnulib CFLAGS_POSIX = -fno-builtin diff --git a/0159-x86-efi-Use-bounce-buffers-for-reading-to-addresses-.patch b/0153-x86-efi-Use-bounce-buffers-for-reading-to-addresses-.patch similarity index 88% rename from 0159-x86-efi-Use-bounce-buffers-for-reading-to-addresses-.patch rename to 0153-x86-efi-Use-bounce-buffers-for-reading-to-addresses-.patch index 7e2d2a6..fdd3096 100644 --- a/0159-x86-efi-Use-bounce-buffers-for-reading-to-addresses-.patch +++ b/0153-x86-efi-Use-bounce-buffers-for-reading-to-addresses-.patch @@ -1,6 +1,6 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Peter Jones -Date: Fri, 14 Sep 2018 13:34:55 -0400 +Date: Fri, 12 Jul 2019 09:53:32 +0200 Subject: [PATCH] x86-efi: Use bounce buffers for reading to addresses > 4GB Lots of machines apparently can't DMA correctly above 4GB during UEFI, @@ -12,10 +12,10 @@ Signed-off-by: Peter Jones 1 file changed, 45 insertions(+), 7 deletions(-) diff --git a/grub-core/loader/i386/efi/linux.c b/grub-core/loader/i386/efi/linux.c -index 851bce77f12..06d19b9fc0e 100644 +index 33e981e76e7..2f0336809e7 100644 --- a/grub-core/loader/i386/efi/linux.c +++ b/grub-core/loader/i386/efi/linux.c -@@ -36,11 +36,16 @@ static grub_dl_t my_mod; +@@ -35,11 +35,16 @@ static grub_dl_t my_mod; static int loaded; static void *kernel_mem; static grub_uint64_t kernel_size; @@ -33,7 +33,7 @@ index 851bce77f12..06d19b9fc0e 100644 #define BYTES_TO_PAGES(bytes) (((bytes) + 0xfff) >> 12) static grub_err_t -@@ -74,6 +79,44 @@ grub_linuxefi_unload (void) +@@ -73,6 +78,44 @@ grub_linuxefi_unload (void) return GRUB_ERR_NONE; } @@ -78,7 +78,7 @@ index 851bce77f12..06d19b9fc0e 100644 static grub_err_t grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), int argc, char *argv[]) -@@ -128,7 +171,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), +@@ -126,7 +169,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), for (i = 0; i < nfiles; i++) { grub_ssize_t cursize = grub_file_size (files[i]); @@ -87,12 +87,12 @@ index 851bce77f12..06d19b9fc0e 100644 { if (!grub_errno) grub_error (GRUB_ERR_FILE_READ_ERROR, N_("premature end of file %s"), -@@ -156,11 +199,6 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), +@@ -152,11 +195,6 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), return grub_errno; } -#define MIN(a, b) \ -- ({ typeof (a) _a = (a); \ +- ({ typeof (a) _a = (a); \ - typeof (b) _b = (b); \ - _a < _b ? _a : _b; }) - diff --git a/0160-x86-efi-Re-arrange-grub_cmd_linux-a-little-bit.patch b/0154-x86-efi-Re-arrange-grub_cmd_linux-a-little-bit.patch similarity index 94% rename from 0160-x86-efi-Re-arrange-grub_cmd_linux-a-little-bit.patch rename to 0154-x86-efi-Re-arrange-grub_cmd_linux-a-little-bit.patch index 6fb194f..f8284ec 100644 --- a/0160-x86-efi-Re-arrange-grub_cmd_linux-a-little-bit.patch +++ b/0154-x86-efi-Re-arrange-grub_cmd_linux-a-little-bit.patch @@ -11,10 +11,10 @@ Signed-off-by: Peter Jones 1 file changed, 41 insertions(+), 34 deletions(-) diff --git a/grub-core/loader/i386/efi/linux.c b/grub-core/loader/i386/efi/linux.c -index 06d19b9fc0e..de5f839ff0f 100644 +index 2f0336809e7..5f48fa55619 100644 --- a/grub-core/loader/i386/efi/linux.c +++ b/grub-core/loader/i386/efi/linux.c -@@ -250,32 +250,9 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), +@@ -243,32 +243,9 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), goto fail; } @@ -49,7 +49,7 @@ index 06d19b9fc0e..de5f839ff0f 100644 grub_dprintf ("linux", "checking lh->boot_flag\n"); if (lh->boot_flag != grub_cpu_to_le16 (0xaa55)) { -@@ -323,6 +300,34 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), +@@ -316,6 +293,34 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), } #endif @@ -84,7 +84,7 @@ index 06d19b9fc0e..de5f839ff0f 100644 grub_dprintf ("linux", "setting up cmdline\n"); linux_cmdline = grub_efi_allocate_pages_max(GRUB_EFI_MAX_ALLOCATION_ADDRESS, BYTES_TO_PAGES(lh->cmdline_size + 1)); -@@ -347,8 +352,8 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), +@@ -341,8 +346,8 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), grub_dprintf ("linux", "setting lh->cmd_line_ptr\n"); lh->cmd_line_ptr = (grub_uint32_t)(grub_addr_t)linux_cmdline; @@ -94,7 +94,7 @@ index 06d19b9fc0e..de5f839ff0f 100644 start = (lh->setup_sects + 1) * 512; -@@ -365,26 +370,28 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), +@@ -359,26 +364,28 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("can't allocate kernel")); goto fail; } diff --git a/0161-x86-efi-Make-our-own-allocator-for-kernel-stuff.patch b/0155-x86-efi-Make-our-own-allocator-for-kernel-stuff.patch similarity index 93% rename from 0161-x86-efi-Make-our-own-allocator-for-kernel-stuff.patch rename to 0155-x86-efi-Make-our-own-allocator-for-kernel-stuff.patch index eadc4a5..3bfb482 100644 --- a/0161-x86-efi-Make-our-own-allocator-for-kernel-stuff.patch +++ b/0155-x86-efi-Make-our-own-allocator-for-kernel-stuff.patch @@ -11,10 +11,10 @@ Signed-off-by: Peter Jones 1 file changed, 94 insertions(+), 73 deletions(-) diff --git a/grub-core/loader/i386/efi/linux.c b/grub-core/loader/i386/efi/linux.c -index de5f839ff0f..1811f4b3d56 100644 +index 5f48fa55619..075b77eb3e4 100644 --- a/grub-core/loader/i386/efi/linux.c +++ b/grub-core/loader/i386/efi/linux.c -@@ -48,6 +48,65 @@ static char *linux_cmdline; +@@ -47,6 +47,65 @@ static char *linux_cmdline; #define BYTES_TO_PAGES(bytes) (((bytes) + 0xfff) >> 12) @@ -80,7 +80,7 @@ index de5f839ff0f..1811f4b3d56 100644 static grub_err_t grub_linuxefi_boot (void) { -@@ -63,19 +122,12 @@ grub_linuxefi_unload (void) +@@ -62,19 +121,12 @@ grub_linuxefi_unload (void) { grub_dl_unref (my_mod); loaded = 0; @@ -106,7 +106,7 @@ index de5f839ff0f..1811f4b3d56 100644 return GRUB_ERR_NONE; } -@@ -152,19 +204,13 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), +@@ -150,19 +202,13 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), size += ALIGN_UP (grub_file_size (files[i]), 4); } @@ -131,7 +131,7 @@ index de5f839ff0f..1811f4b3d56 100644 ptr = initrd_mem; -@@ -225,7 +271,6 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), +@@ -221,7 +267,6 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), filelen = grub_file_size (file); kernel = grub_malloc(filelen); @@ -139,7 +139,7 @@ index de5f839ff0f..1811f4b3d56 100644 if (!kernel) { grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("cannot allocate kernel buffer")); -@@ -281,7 +326,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), +@@ -274,7 +319,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), goto fail; } @@ -148,7 +148,7 @@ index de5f839ff0f..1811f4b3d56 100644 grub_dprintf ("linux", "checking lh->xloadflags\n"); if (!(lh->xloadflags & LINUX_XLF_KERNEL_64)) { -@@ -300,17 +345,9 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), +@@ -293,17 +338,9 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), } #endif @@ -168,7 +168,7 @@ index de5f839ff0f..1811f4b3d56 100644 grub_dprintf ("linux", "params = %p\n", params); grub_memset (params, 0, sizeof(*params)); -@@ -329,19 +366,10 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), +@@ -322,19 +359,10 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), grub_dprintf ("linux", "new lh is at %p\n", lh); grub_dprintf ("linux", "setting up cmdline\n"); @@ -191,8 +191,8 @@ index de5f839ff0f..1811f4b3d56 100644 grub_memcpy (linux_cmdline, LINUX_IMAGE, sizeof (LINUX_IMAGE)); grub_create_loader_cmdline (argc, argv, -@@ -349,27 +377,24 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), - lh->cmdline_size - (sizeof (LINUX_IMAGE) - 1)); +@@ -343,27 +371,24 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), + GRUB_VERIFY_KERNEL_CMDLINE); grub_dprintf ("linux", "cmdline:%s\n", linux_cmdline); - grub_dprintf ("linux", "setting lh->cmd_line_ptr\n"); @@ -230,7 +230,7 @@ index de5f839ff0f..1811f4b3d56 100644 grub_dprintf("linux", "kernel_mem = %p\n", kernel_mem); grub_loader_set (grub_linuxefi_boot, grub_linuxefi_unload, 0); -@@ -404,18 +429,14 @@ fail: +@@ -398,18 +423,14 @@ fail: loaded = 0; } diff --git a/0162-x86-efi-Allow-initrd-params-cmdline-allocations-abov.patch b/0156-x86-efi-Allow-initrd-params-cmdline-allocations-abov.patch similarity index 91% rename from 0162-x86-efi-Allow-initrd-params-cmdline-allocations-abov.patch rename to 0156-x86-efi-Allow-initrd-params-cmdline-allocations-abov.patch index 95f8f47..f545a06 100644 --- a/0162-x86-efi-Allow-initrd-params-cmdline-allocations-abov.patch +++ b/0156-x86-efi-Allow-initrd-params-cmdline-allocations-abov.patch @@ -14,10 +14,10 @@ Signed-off-by: Peter Jones 2 files changed, 65 insertions(+), 8 deletions(-) diff --git a/grub-core/loader/i386/efi/linux.c b/grub-core/loader/i386/efi/linux.c -index 1811f4b3d56..65d1b5cc034 100644 +index 075b77eb3e4..50b7798d6e5 100644 --- a/grub-core/loader/i386/efi/linux.c +++ b/grub-core/loader/i386/efi/linux.c -@@ -53,13 +53,22 @@ struct allocation_choice { +@@ -52,13 +52,22 @@ struct allocation_choice { grub_efi_allocate_type_t alloc_type; }; @@ -41,7 +41,7 @@ index 1811f4b3d56..65d1b5cc034 100644 static inline void kernel_free(void *addr, grub_efi_uintn_t size) -@@ -81,6 +90,11 @@ kernel_alloc(grub_efi_uintn_t size, const char * const errmsg) +@@ -80,6 +89,11 @@ kernel_alloc(grub_efi_uintn_t size, const char * const errmsg) grub_uint64_t max = max_addresses[i].addr; grub_efi_uintn_t pages; @@ -53,7 +53,7 @@ index 1811f4b3d56..65d1b5cc034 100644 if (max == prev_max) continue; -@@ -169,6 +183,9 @@ read(grub_file_t file, grub_uint8_t *bufp, grub_size_t len) +@@ -168,6 +182,9 @@ read(grub_file_t file, grub_uint8_t *bufp, grub_size_t len) return bufpos; } @@ -63,7 +63,7 @@ index 1811f4b3d56..65d1b5cc034 100644 static grub_err_t grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), int argc, char *argv[]) -@@ -209,8 +226,12 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), +@@ -207,8 +224,12 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), goto fail; grub_dprintf ("linux", "initrd_mem = %p\n", initrd_mem); @@ -78,7 +78,7 @@ index 1811f4b3d56..65d1b5cc034 100644 ptr = initrd_mem; -@@ -345,6 +366,18 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), +@@ -338,6 +359,18 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), } #endif @@ -97,7 +97,7 @@ index 1811f4b3d56..65d1b5cc034 100644 params = kernel_alloc (sizeof(*params), "cannot allocate kernel parameters"); if (!params) goto fail; -@@ -378,21 +411,40 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), +@@ -372,21 +405,40 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), grub_dprintf ("linux", "cmdline:%s\n", linux_cmdline); grub_dprintf ("linux", "setting lh->cmd_line_ptr to 0x%08x\n", @@ -140,7 +140,7 @@ index 1811f4b3d56..65d1b5cc034 100644 if (!kernel_mem) goto fail; grub_dprintf("linux", "kernel_mem = %p\n", kernel_mem); -@@ -401,8 +453,9 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), +@@ -395,8 +447,9 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), loaded = 1; @@ -153,10 +153,10 @@ index 1811f4b3d56..65d1b5cc034 100644 grub_memcpy (kernel_mem, (char *)kernel + start, filelen - start); diff --git a/include/grub/i386/linux.h b/include/grub/i386/linux.h -index 8474a857ed2..a4b37dcced5 100644 +index a093679cb80..91123b1eb5c 100644 --- a/include/grub/i386/linux.h +++ b/include/grub/i386/linux.h -@@ -230,7 +230,11 @@ struct linux_kernel_params +@@ -234,7 +234,11 @@ struct linux_kernel_params grub_uint32_t ofw_cif_handler; /* b8 */ grub_uint32_t ofw_idt; /* bc */ diff --git a/0157-Attempt-to-fix-up-all-the-places-Wsign-compare-error.patch b/0157-Attempt-to-fix-up-all-the-places-Wsign-compare-error.patch deleted file mode 100644 index fc0af79..0000000 --- a/0157-Attempt-to-fix-up-all-the-places-Wsign-compare-error.patch +++ /dev/null @@ -1,392 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Peter Jones -Date: Tue, 11 Sep 2018 16:41:30 -0400 -Subject: [PATCH] Attempt to fix up all the places -Wsign-compare=error finds. - -Signed-off-by: Peter Jones ---- - grub-core/gnulib/regcomp.c | 4 ++-- - grub-core/gnulib/regex_internal.c | 6 +++--- - grub-core/gnulib/regexec.c | 20 ++++++++++---------- - grub-core/kern/emu/misc.c | 2 +- - grub-core/lib/reed_solomon.c | 4 ++-- - grub-core/osdep/linux/blocklist.c | 2 +- - grub-core/osdep/linux/getroot.c | 2 +- - grub-core/osdep/linux/hostdisk.c | 2 +- - util/grub-fstest.c | 2 +- - util/grub-menulst2cfg.c | 2 +- - util/grub-mkfont.c | 13 +++++++------ - util/grub-probe.c | 2 +- - util/grub-rpm-sort.c | 2 +- - util/setup.c | 2 +- - grub-core/gnulib/regex.h | 2 +- - grub-core/gnulib/regex_internal.h | 4 ++-- - 16 files changed, 36 insertions(+), 35 deletions(-) - -diff --git a/grub-core/gnulib/regcomp.c b/grub-core/gnulib/regcomp.c -index 596e0cf3ef7..e0ebd8d497a 100644 ---- a/grub-core/gnulib/regcomp.c -+++ b/grub-core/gnulib/regcomp.c -@@ -334,7 +334,7 @@ re_compile_fastmap_iter (regex_t *bufp, const re_dfastate_t *init_state, - *p++ = dfa->nodes[node].opr.c; - memset (&state, '\0', sizeof (state)); - if (__mbrtowc (&wc, (const char *) buf, p - buf, -- &state) == p - buf -+ &state) == (size_t)(p - buf) - && (__wcrtomb ((char *) buf, towlower (wc), &state) - != (size_t) -1)) - re_set_fastmap (fastmap, false, buf[0]); -@@ -3760,7 +3760,7 @@ fetch_number (re_string_t *input, re_token_t *token, reg_syntax_t syntax) - || num == REG_ERROR) - ? REG_ERROR - : num == REG_MISSING -- ? c - '0' -+ ? (Idx)(c - '0') - : MIN (RE_DUP_MAX + 1, num * 10 + c - '0')); - } - return num; -diff --git a/grub-core/gnulib/regex_internal.c b/grub-core/gnulib/regex_internal.c -index 899b0ae67e1..836ea5d0ca7 100644 ---- a/grub-core/gnulib/regex_internal.c -+++ b/grub-core/gnulib/regex_internal.c -@@ -224,7 +224,7 @@ build_wcs_buffer (re_string_t *pstr) - /* Apply the translation if we need. */ - if (BE (pstr->trans != NULL, 0)) - { -- int i, ch; -+ unsigned int i, ch; - - for (i = 0; i < pstr->mb_cur_max && i < remain_len; ++i) - { -@@ -367,7 +367,7 @@ build_wcs_upper_buffer (re_string_t *pstr) - prev_st = pstr->cur_state; - if (BE (pstr->trans != NULL, 0)) - { -- int i, ch; -+ unsigned int i, ch; - - for (i = 0; i < pstr->mb_cur_max && i < remain_len; ++i) - { -@@ -751,7 +751,7 @@ re_string_reconstruct (re_string_t *pstr, Idx idx, int eflags) - memset (&cur_state, 0, sizeof (cur_state)); - mbclen = __mbrtowc (&wc2, (const char *) pp, mlen, - &cur_state); -- if (raw + offset - p <= mbclen -+ if ((size_t)(raw + offset - p) <= mbclen - && mbclen < (size_t) -2) - { - memset (&pstr->cur_state, '\0', -diff --git a/grub-core/gnulib/regexec.c b/grub-core/gnulib/regexec.c -index a7776f088f2..402a85c9c6a 100644 ---- a/grub-core/gnulib/regexec.c -+++ b/grub-core/gnulib/regexec.c -@@ -490,7 +490,7 @@ re_search_stub (struct re_pattern_buffer *bufp, - { - if (ret_len) - { -- assert (pmatch[0].rm_so == start); -+ assert (pmatch[0].rm_so == (long)start); - rval = pmatch[0].rm_eo - start; - } - else -@@ -928,11 +928,11 @@ re_search_internal (const regex_t *preg, - if (BE (mctx.input.offsets_needed != 0, 0)) - { - pmatch[reg_idx].rm_so = -- (pmatch[reg_idx].rm_so == mctx.input.valid_len -+ (pmatch[reg_idx].rm_so == (long)mctx.input.valid_len - ? mctx.input.valid_raw_len - : mctx.input.offsets[pmatch[reg_idx].rm_so]); - pmatch[reg_idx].rm_eo = -- (pmatch[reg_idx].rm_eo == mctx.input.valid_len -+ (pmatch[reg_idx].rm_eo == (long)mctx.input.valid_len - ? mctx.input.valid_raw_len - : mctx.input.offsets[pmatch[reg_idx].rm_eo]); - } -@@ -1472,11 +1472,11 @@ set_regs (const regex_t *preg, const re_match_context_t *mctx, size_t nmatch, - } - memcpy (prev_idx_match, pmatch, sizeof (regmatch_t) * nmatch); - -- for (idx = pmatch[0].rm_so; idx <= pmatch[0].rm_eo ;) -+ for (idx = pmatch[0].rm_so; idx <= (long)pmatch[0].rm_eo ;) - { - update_regs (dfa, pmatch, prev_idx_match, cur_node, idx, nmatch); - -- if (idx == pmatch[0].rm_eo && cur_node == mctx->last_node) -+ if (idx == (long)pmatch[0].rm_eo && cur_node == mctx->last_node) - { - Idx reg_idx; - if (fs) -@@ -1575,7 +1575,7 @@ update_regs (const re_dfa_t *dfa, regmatch_t *pmatch, - if (reg_num < nmatch) - { - /* We are at the last node of this sub expression. */ -- if (pmatch[reg_num].rm_so < cur_idx) -+ if (pmatch[reg_num].rm_so < (long)cur_idx) - { - pmatch[reg_num].rm_eo = cur_idx; - /* This is a non-empty match or we are not inside an optional -@@ -3006,7 +3006,7 @@ check_arrival (re_match_context_t *mctx, state_array_t *path, Idx top_node, - mctx->state_log[str_idx] = cur_state; - } - -- for (null_cnt = 0; str_idx < last_str && null_cnt <= mctx->max_mb_elem_len;) -+ for (null_cnt = 0; str_idx < last_str && null_cnt <= (long)mctx->max_mb_elem_len;) - { - re_node_set_empty (&next_nodes); - if (mctx->state_log[str_idx + 1]) -@@ -3786,7 +3786,7 @@ check_node_accept_bytes (const re_dfa_t *dfa, Idx node_idx, - const re_string_t *input, Idx str_idx) - { - const re_token_t *node = dfa->nodes + node_idx; -- int char_len, elem_len; -+ unsigned int char_len, elem_len; - Idx i; - - if (BE (node->type == OP_UTF8_PERIOD, 0)) -@@ -4144,7 +4144,7 @@ extend_buffers (re_match_context_t *mctx, int min_len) - /* Double the lengths of the buffers, but allocate at least MIN_LEN. */ - ret = re_string_realloc_buffers (pstr, - MAX (min_len, -- MIN (pstr->len, pstr->bufs_len * 2))); -+ MIN ((long)pstr->len, (long)(pstr->bufs_len * 2)))); - if (BE (ret != REG_NOERROR, 0)) - return ret; - -@@ -4316,7 +4316,7 @@ match_ctx_add_entry (re_match_context_t *mctx, Idx node, Idx str_idx, Idx from, - = (from == to ? -1 : 0); - - mctx->bkref_ents[mctx->nbkref_ents++].more = 0; -- if (mctx->max_mb_elem_len < to - from) -+ if (mctx->max_mb_elem_len < (long)(to - from)) - mctx->max_mb_elem_len = to - from; - return REG_NOERROR; - } -diff --git a/grub-core/kern/emu/misc.c b/grub-core/kern/emu/misc.c -index 3d3a4a4a975..9367caf763c 100644 ---- a/grub-core/kern/emu/misc.c -+++ b/grub-core/kern/emu/misc.c -@@ -175,7 +175,7 @@ grub_util_get_image_size (const char *path) - sz = ftello (f); - if (sz < 0) - grub_util_error (_("cannot open `%s': %s"), path, strerror (errno)); -- if (sz != (size_t) sz) -+ if (sz > (off_t)(GRUB_SIZE_MAX >> 1)) - grub_util_error (_("file `%s' is too big"), path); - ret = (size_t) sz; - -diff --git a/grub-core/lib/reed_solomon.c b/grub-core/lib/reed_solomon.c -index ee9fa7b4feb..19c20085279 100644 ---- a/grub-core/lib/reed_solomon.c -+++ b/grub-core/lib/reed_solomon.c -@@ -156,7 +156,7 @@ static void - rs_encode (gf_single_t *data, grub_size_t s, grub_size_t rs) - { - gf_single_t *rs_polynomial; -- int i, j; -+ unsigned int i, j; - gf_single_t *m; - m = xmalloc ((s + rs) * sizeof (gf_single_t)); - grub_memcpy (m, data, s * sizeof (gf_single_t)); -@@ -325,7 +325,7 @@ static void - encode_block (gf_single_t *ptr, grub_size_t s, - gf_single_t *rptr, grub_size_t rs) - { -- int i, j; -+ unsigned int i, j; - for (i = 0; i < SECTOR_SIZE; i++) - { - grub_size_t ds = (s + SECTOR_SIZE - 1 - i) / SECTOR_SIZE; -diff --git a/grub-core/osdep/linux/blocklist.c b/grub-core/osdep/linux/blocklist.c -index c77d6085ccb..42a315031ff 100644 ---- a/grub-core/osdep/linux/blocklist.c -+++ b/grub-core/osdep/linux/blocklist.c -@@ -109,7 +109,7 @@ grub_install_get_blocklist (grub_device_t root_dev, - else - { - struct fiemap *fie2; -- int i; -+ unsigned int i; - fie2 = xmalloc (sizeof (*fie2) - + fie1.fm_mapped_extents - * sizeof (fie1.fm_extents[1])); -diff --git a/grub-core/osdep/linux/getroot.c b/grub-core/osdep/linux/getroot.c -index 4c5a13022dc..2b7a626d5ea 100644 ---- a/grub-core/osdep/linux/getroot.c -+++ b/grub-core/osdep/linux/getroot.c -@@ -236,7 +236,7 @@ grub_find_root_devices_from_btrfs (const char *dir) - { - int fd; - struct btrfs_ioctl_fs_info_args fsi; -- int i, j = 0; -+ unsigned int i, j = 0; - char **ret; - - fd = open (dir, 0); -diff --git a/grub-core/osdep/linux/hostdisk.c b/grub-core/osdep/linux/hostdisk.c -index 06179fca725..bee732c2133 100644 ---- a/grub-core/osdep/linux/hostdisk.c -+++ b/grub-core/osdep/linux/hostdisk.c -@@ -83,7 +83,7 @@ grub_util_get_fd_size_os (grub_util_fd_t fd, const char *name, unsigned *log_sec - if (sector_size & (sector_size - 1) || !sector_size) - return -1; - for (log_sector_size = 0; -- (1 << log_sector_size) < sector_size; -+ (1U << log_sector_size) < sector_size; - log_sector_size++); - - if (log_secsize) -diff --git a/util/grub-fstest.c b/util/grub-fstest.c -index a358ae47152..f82f9504054 100644 ---- a/util/grub-fstest.c -+++ b/util/grub-fstest.c -@@ -323,7 +323,7 @@ cmd_cmp (char *src, char *dest) - read_file (src, cmp_hook, ff); - - { -- grub_uint64_t pre; -+ long long pre; - pre = ftell (ff); - fseek (ff, 0, SEEK_END); - if (pre != ftell (ff)) -diff --git a/util/grub-menulst2cfg.c b/util/grub-menulst2cfg.c -index a39f8693947..358d604210b 100644 ---- a/util/grub-menulst2cfg.c -+++ b/util/grub-menulst2cfg.c -@@ -34,7 +34,7 @@ main (int argc, char **argv) - char *buf = NULL; - size_t bufsize = 0; - char *suffix = xstrdup (""); -- int suffixlen = 0; -+ size_t suffixlen = 0; - const char *out_fname = 0; - - grub_util_host_init (&argc, &argv); -diff --git a/util/grub-mkfont.c b/util/grub-mkfont.c -index 0fe45a6103d..3e09240b99f 100644 ---- a/util/grub-mkfont.c -+++ b/util/grub-mkfont.c -@@ -138,7 +138,8 @@ add_glyph (struct grub_font_info *font_info, FT_UInt glyph_idx, FT_Face face, - int width, height; - int cuttop, cutbottom, cutleft, cutright; - grub_uint8_t *data; -- int mask, i, j, bitmap_size; -+ int mask, i, bitmap_size; -+ unsigned int j; - FT_GlyphSlot glyph; - int flag = FT_LOAD_RENDER | FT_LOAD_MONOCHROME; - FT_Error err; -@@ -183,7 +184,7 @@ add_glyph (struct grub_font_info *font_info, FT_UInt glyph_idx, FT_Face face, - cuttop = cutbottom = cutleft = cutright = 0; - else - { -- for (cuttop = 0; cuttop < glyph->bitmap.rows; cuttop++) -+ for (cuttop = 0; cuttop < (long)glyph->bitmap.rows; cuttop++) - { - for (j = 0; j < glyph->bitmap.width; j++) - if (glyph->bitmap.buffer[j / 8 + cuttop * glyph->bitmap.pitch] -@@ -203,10 +204,10 @@ add_glyph (struct grub_font_info *font_info, FT_UInt glyph_idx, FT_Face face, - break; - } - cutbottom = glyph->bitmap.rows - 1 - cutbottom; -- if (cutbottom + cuttop >= glyph->bitmap.rows) -+ if (cutbottom + cuttop >= (long)glyph->bitmap.rows) - cutbottom = 0; - -- for (cutleft = 0; cutleft < glyph->bitmap.width; cutleft++) -+ for (cutleft = 0; cutleft < (long)glyph->bitmap.width; cutleft++) - { - for (j = 0; j < glyph->bitmap.rows; j++) - if (glyph->bitmap.buffer[cutleft / 8 + j * glyph->bitmap.pitch] -@@ -225,7 +226,7 @@ add_glyph (struct grub_font_info *font_info, FT_UInt glyph_idx, FT_Face face, - break; - } - cutright = glyph->bitmap.width - 1 - cutright; -- if (cutright + cutleft >= glyph->bitmap.width) -+ if (cutright + cutleft >= (long)glyph->bitmap.width) - cutright = 0; - } - -@@ -262,7 +263,7 @@ add_glyph (struct grub_font_info *font_info, FT_UInt glyph_idx, FT_Face face, - - mask = 0; - data = &glyph_info->bitmap[0] - 1; -- for (j = cuttop; j < height + cuttop; j++) -+ for (j = cuttop; j < (long)height + cuttop; j++) - for (i = cutleft; i < width + cutleft; i++) - add_pixel (&data, &mask, - glyph->bitmap.buffer[i / 8 + j * glyph->bitmap.pitch] & -diff --git a/util/grub-probe.c b/util/grub-probe.c -index e45dbf9e049..e50bd43699d 100644 ---- a/util/grub-probe.c -+++ b/util/grub-probe.c -@@ -798,7 +798,7 @@ argp_parser (int key, char *arg, struct argp_state *state) - - case 't': - { -- int i; -+ unsigned int i; - - for (i = PRINT_FS; i < ARRAY_SIZE (targets); i++) - if (strcmp (arg, targets[i]) == 0) -diff --git a/util/grub-rpm-sort.c b/util/grub-rpm-sort.c -index f33bd1ed568..8345944105f 100644 ---- a/util/grub-rpm-sort.c -+++ b/util/grub-rpm-sort.c -@@ -232,7 +232,7 @@ main (int argc, char *argv[]) - struct arguments arguments; - char **package_names = NULL; - size_t n_package_names = 0; -- int i; -+ unsigned int i; - - grub_util_host_init (&argc, &argv); - -diff --git a/util/setup.c b/util/setup.c -index 9c1e1b7da6a..b0bb71eaaed 100644 ---- a/util/setup.c -+++ b/util/setup.c -@@ -407,7 +407,7 @@ SETUP (const char *dir, - int is_ldm; - grub_err_t err; - grub_disk_addr_t *sectors; -- int i; -+ unsigned int i; - grub_fs_t fs; - unsigned int nsec, maxsec; - -diff --git a/grub-core/gnulib/regex.h b/grub-core/gnulib/regex.h -index 854c6edaf75..9e754c637e6 100644 ---- a/grub-core/gnulib/regex.h -+++ b/grub-core/gnulib/regex.h -@@ -58,7 +58,7 @@ typedef size_t __re_long_size_t; - - /* The traditional GNU regex implementation mishandles strings longer - than INT_MAX. */ --typedef int __re_idx_t; -+typedef unsigned int __re_idx_t; - typedef unsigned int __re_size_t; - typedef unsigned long int __re_long_size_t; - -diff --git a/grub-core/gnulib/regex_internal.h b/grub-core/gnulib/regex_internal.h -index c467b290708..c3103844eda 100644 ---- a/grub-core/gnulib/regex_internal.h -+++ b/grub-core/gnulib/regex_internal.h -@@ -399,7 +399,7 @@ struct re_string_t - unsigned char offsets_needed; - unsigned char newline_anchor; - unsigned char word_ops_used; -- int mb_cur_max; -+ unsigned int mb_cur_max; - }; - typedef struct re_string_t re_string_t; - -@@ -691,7 +691,7 @@ struct re_dfa_t - unsigned int is_utf8 : 1; - unsigned int map_notascii : 1; - unsigned int word_ops_used : 1; -- int mb_cur_max; -+ unsigned int mb_cur_max; - bitset_t word_char; - reg_syntax_t syntax; - Idx *subexp_map; diff --git a/0163-Fix-getroot.c-s-trampolines.patch b/0157-Fix-getroot.c-s-trampolines.patch similarity index 100% rename from 0163-Fix-getroot.c-s-trampolines.patch rename to 0157-Fix-getroot.c-s-trampolines.patch diff --git a/0164-Do-not-allow-stack-trampolines-anywhere.patch b/0158-Do-not-allow-stack-trampolines-anywhere.patch similarity index 81% rename from 0164-Do-not-allow-stack-trampolines-anywhere.patch rename to 0158-Do-not-allow-stack-trampolines-anywhere.patch index 6fcaab5..62b9463 100644 --- a/0164-Do-not-allow-stack-trampolines-anywhere.patch +++ b/0158-Do-not-allow-stack-trampolines-anywhere.patch @@ -1,6 +1,6 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Peter Jones -Date: Fri, 28 Sep 2018 15:48:09 -0400 +Date: Fri, 12 Jul 2019 10:06:50 +0200 Subject: [PATCH] Do not allow stack trampolines, anywhere. Signed-off-by: Peter Jones @@ -10,10 +10,10 @@ Signed-off-by: Peter Jones 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac -index 40fcf567ae7..077df917593 100644 +index 38d978bd650..5076d635c57 100644 --- a/configure.ac +++ b/configure.ac -@@ -1983,6 +1983,9 @@ if test x"$enable_wextra" != xno ; then +@@ -1995,6 +1995,9 @@ if test x"$enable_wextra" != xno ; then HOST_CFLAGS="$HOST_CFLAGS -Wextra" fi @@ -24,7 +24,7 @@ index 40fcf567ae7..077df917593 100644 TARGET_CCAS=$TARGET_CC diff --git a/conf/Makefile.common b/conf/Makefile.common -index 0d9910d7875..38375a7891c 100644 +index b867691f125..87c1f0e809b 100644 --- a/conf/Makefile.common +++ b/conf/Makefile.common @@ -66,7 +66,7 @@ grubconfdir = $(sysconfdir)/grub.d @@ -33,6 +33,6 @@ index 0d9910d7875..38375a7891c 100644 -CFLAGS_GNULIB = -Wno-undef -Wno-unused -Wno-unused-parameter -Wno-redundant-decls -Wno-unreachable-code +CFLAGS_GNULIB = -Wno-undef -Wno-unused -Wno-unused-parameter -Wno-redundant-decls -Wno-unreachable-code -Werror=trampolines -fno-trampolines - CPPFLAGS_GNULIB = -I$(top_builddir)/grub-core/gnulib -I$(top_srcdir)/grub-core/gnulib + CPPFLAGS_GNULIB = -I$(top_builddir)/grub-core/lib/gnulib -I$(top_srcdir)/grub-core/lib/gnulib CFLAGS_POSIX = -fno-builtin diff --git a/0165-Reimplement-boot_counter.patch b/0159-Reimplement-boot_counter.patch similarity index 97% rename from 0165-Reimplement-boot_counter.patch rename to 0159-Reimplement-boot_counter.patch index 032dded..08c8c58 100644 --- a/0165-Reimplement-boot_counter.patch +++ b/0159-Reimplement-boot_counter.patch @@ -23,10 +23,10 @@ Signed-off-by: Christian Glombek create mode 100644 util/grub.d/01_fallback_counting.in diff --git a/Makefile.util.def b/Makefile.util.def -index 08cc98ddb8b..eca3dfa753f 100644 +index 125ad6209b2..2019ebd0207 100644 --- a/Makefile.util.def +++ b/Makefile.util.def -@@ -448,6 +448,12 @@ script = { +@@ -457,6 +457,12 @@ script = { installdir = grubconf; }; @@ -40,10 +40,10 @@ index 08cc98ddb8b..eca3dfa753f 100644 name = '01_menu_auto_hide'; common = util/grub.d/01_menu_auto_hide.in; diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def -index 59ead422028..ceb6fc677a0 100644 +index 8bb1dafd0ac..65ca74f9ad9 100644 --- a/grub-core/Makefile.core.def +++ b/grub-core/Makefile.core.def -@@ -362,6 +362,11 @@ kernel = { +@@ -395,6 +395,11 @@ kernel = { extra_dist = kern/mips/cache_flush.S; }; diff --git a/0166-Make-grub_strtoul-end-pointer-have-the-right-constif.patch b/0160-Make-grub_strtoul-end-pointer-have-the-right-constif.patch similarity index 97% rename from 0166-Make-grub_strtoul-end-pointer-have-the-right-constif.patch rename to 0160-Make-grub_strtoul-end-pointer-have-the-right-constif.patch index 3358f64..234f32a 100644 --- a/0166-Make-grub_strtoul-end-pointer-have-the-right-constif.patch +++ b/0160-Make-grub_strtoul-end-pointer-have-the-right-constif.patch @@ -101,7 +101,7 @@ index 4be8107d553..016a4d81835 100644 ctx.width = grub_strtoul (ptr, &ptr, 0); if (grub_errno) diff --git a/grub-core/disk/diskfilter.c b/grub-core/disk/diskfilter.c -index 66f6b992604..5447e04e702 100644 +index 1a3eb6b8d77..3f264be77d1 100644 --- a/grub-core/disk/diskfilter.c +++ b/grub-core/disk/diskfilter.c @@ -971,7 +971,8 @@ grub_diskfilter_vg_register (struct grub_diskfilter_vg *vg) @@ -153,7 +153,7 @@ index 7b265c780c3..0cbd0dd1629 100644 struct grub_lvm_pv_header *pvh; struct grub_lvm_disk_locn *dlocn; diff --git a/grub-core/kern/fs.c b/grub-core/kern/fs.c -index 9085895b6fe..1bd748be83b 100644 +index 2b85f4950bd..88d39360da0 100644 --- a/grub-core/kern/fs.c +++ b/grub-core/kern/fs.c @@ -134,7 +134,7 @@ struct grub_fs_block @@ -244,10 +244,10 @@ index ef56150ac77..05719ab2ccb 100644 { subpart = rest[1] - 'a'; diff --git a/grub-core/lib/syslinux_parse.c b/grub-core/lib/syslinux_parse.c -index 28ba3aef0bb..21ca040ada7 100644 +index 4afa99279a2..de9fda06f52 100644 --- a/grub-core/lib/syslinux_parse.c +++ b/grub-core/lib/syslinux_parse.c -@@ -1058,7 +1058,7 @@ write_entry (struct output_buffer *outbuf, +@@ -1062,7 +1062,7 @@ write_entry (struct output_buffer *outbuf, if (ptr[0] == 'h' && ptr[1] == 'd') { is_fd = 0; @@ -256,7 +256,7 @@ index 28ba3aef0bb..21ca040ada7 100644 continue; } if (grub_strncasecmp (ptr, "file=", 5) == 0) -@@ -1082,12 +1082,12 @@ write_entry (struct output_buffer *outbuf, +@@ -1086,12 +1086,12 @@ write_entry (struct output_buffer *outbuf, if (ptr[0] == 'f' && ptr[1] == 'd') { is_fd = 1; @@ -272,7 +272,7 @@ index 28ba3aef0bb..21ca040ada7 100644 } /* FIXME: isolinux, ntldr, cmldr, *dos, seg, hide diff --git a/grub-core/loader/i386/xen_fileXX.c b/grub-core/loader/i386/xen_fileXX.c -index fb66e66fe96..293f1ad5c3e 100644 +index 6329ec01038..27afcaacbce 100644 --- a/grub-core/loader/i386/xen_fileXX.c +++ b/grub-core/loader/i386/xen_fileXX.c @@ -25,7 +25,7 @@ parse_xen_guest (grub_elf_t elf, struct grub_xen_file_info *xi, @@ -311,7 +311,7 @@ index 017c4d05bc7..e0e00c23d21 100644 { grub_errno = GRUB_ERR_NONE; diff --git a/grub-core/net/efi/net.c b/grub-core/net/efi/net.c -index f208d1b180c..4c70fc4da2a 100644 +index 6603cd83edc..cdb8fd111a7 100644 --- a/grub-core/net/efi/net.c +++ b/grub-core/net/efi/net.c @@ -729,7 +729,7 @@ grub_efi_net_parse_address (const char *address, @@ -386,7 +386,7 @@ index c9c59690a98..b52b558d631 100644 return GRUB_ERR_NONE; } diff --git a/grub-core/net/net.c b/grub-core/net/net.c -index a571ee92efa..a011b940100 100644 +index 27a0a1d6961..aa56393e1c4 100644 --- a/grub-core/net/net.c +++ b/grub-core/net/net.c @@ -411,7 +411,7 @@ parse_ip (const char *val, grub_uint32_t *ip, const char **rest) @@ -452,7 +452,7 @@ index a697bcb4d8d..a8afc0c9408 100644 int first = 1; grub_disk_addr_t partstart = 0; diff --git a/grub-core/script/execute.c b/grub-core/script/execute.c -index 93965777138..7d327f59d92 100644 +index ba38b5e8aef..c6d2c365c9a 100644 --- a/grub-core/script/execute.c +++ b/grub-core/script/execute.c @@ -146,7 +146,7 @@ replace_scope (struct grub_script_scope *new_scope) @@ -522,7 +522,7 @@ index 7da615ff33e..5488ab26b43 100644 grub_errno = 0; value = grub_strtoull(input, &output, base); diff --git a/util/grub-fstest.c b/util/grub-fstest.c -index f82f9504054..5095fa8356c 100644 +index 88f9c5d4ad8..39bad1f432f 100644 --- a/util/grub-fstest.c +++ b/util/grub-fstest.c @@ -538,7 +538,7 @@ void (*argp_program_version_hook) (FILE *, struct argp_state *) = print_version; @@ -558,10 +558,10 @@ index 9c642ae3fe3..80b96b972d0 100644 grub_make_system_path_relative_to_its_root_os (const char *path); char *grub_util_get_grub_dev (const char *os_dev); diff --git a/include/grub/emu/misc.h b/include/grub/emu/misc.h -index a653132e36a..1ca4c78de97 100644 +index 5ef4f79e689..8e241c9298a 100644 --- a/include/grub/emu/misc.h +++ b/include/grub/emu/misc.h -@@ -40,6 +40,9 @@ void grub_find_zpool_from_dir (const char *dir, +@@ -41,6 +41,9 @@ void grub_find_zpool_from_dir (const char *dir, char *grub_make_system_path_relative_to_its_root (const char *path) WARN_UNUSED_RESULT; @@ -572,7 +572,7 @@ index a653132e36a..1ca4c78de97 100644 grub_util_device_is_mapped (const char *dev); diff --git a/include/grub/misc.h b/include/grub/misc.h -index de9016ab709..1258ec6bbf3 100644 +index 960097fbd06..b7fc9c6a792 100644 --- a/include/grub/misc.h +++ b/include/grub/misc.h @@ -288,11 +288,11 @@ grub_strncasecmp (const char *s1, const char *s2, grub_size_t n) diff --git a/0167-Fix-menu-entry-selection-based-on-ID-and-title.patch b/0161-Fix-menu-entry-selection-based-on-ID-and-title.patch similarity index 99% rename from 0167-Fix-menu-entry-selection-based-on-ID-and-title.patch rename to 0161-Fix-menu-entry-selection-based-on-ID-and-title.patch index 9de7cc5..2105e75 100644 --- a/0167-Fix-menu-entry-selection-based-on-ID-and-title.patch +++ b/0161-Fix-menu-entry-selection-based-on-ID-and-title.patch @@ -24,7 +24,7 @@ Signed-off-by: Javier Martinez Canillas 1 file changed, 72 insertions(+), 71 deletions(-) diff --git a/grub-core/normal/menu.c b/grub-core/normal/menu.c -index 6cb2a071490..7e32c498aa8 100644 +index 046a1fb2c84..920b44a8aed 100644 --- a/grub-core/normal/menu.c +++ b/grub-core/normal/menu.c @@ -164,12 +164,12 @@ grub_menu_set_timeout (int timeout) diff --git a/0168-Make-the-menu-entry-users-option-argument-to-be-opti.patch b/0162-Make-the-menu-entry-users-option-argument-to-be-opti.patch similarity index 100% rename from 0168-Make-the-menu-entry-users-option-argument-to-be-opti.patch rename to 0162-Make-the-menu-entry-users-option-argument-to-be-opti.patch diff --git a/0169-Add-efi-export-env-and-efi-load-env-commands.patch b/0163-Add-efi-export-env-and-efi-load-env-commands.patch similarity index 98% rename from 0169-Add-efi-export-env-and-efi-load-env-commands.patch rename to 0163-Add-efi-export-env-and-efi-load-env-commands.patch index 0e35e0b..9b2ab56 100644 --- a/0169-Add-efi-export-env-and-efi-load-env-commands.patch +++ b/0163-Add-efi-export-env-and-efi-load-env-commands.patch @@ -22,10 +22,10 @@ Signed-off-by: Peter Jones create mode 100644 grub-core/commands/efi/env.c diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def -index ceb6fc677a0..b662312ca6f 100644 +index 65ca74f9ad9..661994686e6 100644 --- a/grub-core/Makefile.core.def +++ b/grub-core/Makefile.core.def -@@ -776,6 +776,12 @@ module = { +@@ -817,6 +817,12 @@ module = { enable = efi; }; @@ -213,7 +213,7 @@ index 00000000000..a69079786aa + grub_unregister_command (loadenv_cmd); +} diff --git a/grub-core/kern/efi/efi.c b/grub-core/kern/efi/efi.c -index 4d36fe31177..1079ac74a47 100644 +index ada3004cfba..279394d85eb 100644 --- a/grub-core/kern/efi/efi.c +++ b/grub-core/kern/efi/efi.c @@ -224,6 +224,9 @@ grub_efi_set_variable(const char *var, const grub_efi_guid_t *guid, @@ -297,7 +297,7 @@ index 230e0e9d9ab..f89d86d4e8d 100644 grub_envblk_iterate (grub_envblk_t envblk, void *hook_data, diff --git a/util/editenv.c b/util/editenv.c -index 41bc7cb1c9a..844a14d90da 100644 +index 1f7f6f3ae18..66f99f988ff 100644 --- a/util/editenv.c +++ b/util/editenv.c @@ -30,8 +30,6 @@ @@ -322,7 +322,7 @@ index bb198f02351..6a79ee67444 100644 #include #include diff --git a/include/grub/efi/efi.h b/include/grub/efi/efi.h -index 570a69361a5..2778b95df17 100644 +index 8ca3981d7a1..d24afbadbf6 100644 --- a/include/grub/efi/efi.h +++ b/include/grub/efi/efi.h @@ -24,6 +24,11 @@ diff --git a/0170-Make-it-possible-to-subtract-conditions-from-debug.patch b/0164-Make-it-possible-to-subtract-conditions-from-debug.patch similarity index 100% rename from 0170-Make-it-possible-to-subtract-conditions-from-debug.patch rename to 0164-Make-it-possible-to-subtract-conditions-from-debug.patch diff --git a/0171-Export-all-variables-from-the-initial-context-when-c.patch b/0165-Export-all-variables-from-the-initial-context-when-c.patch similarity index 97% rename from 0171-Export-all-variables-from-the-initial-context-when-c.patch rename to 0165-Export-all-variables-from-the-initial-context-when-c.patch index 24e3580..bd61eff 100644 --- a/0171-Export-all-variables-from-the-initial-context-when-c.patch +++ b/0165-Export-all-variables-from-the-initial-context-when-c.patch @@ -30,7 +30,7 @@ index ee53d4a68e5..87edd254c44 100644 int grub_extractor_level = 0; diff --git a/grub-core/normal/menu.c b/grub-core/normal/menu.c -index 7e32c498aa8..d087153f276 100644 +index 920b44a8aed..341228f87c9 100644 --- a/grub-core/normal/menu.c +++ b/grub-core/normal/menu.c @@ -376,8 +376,6 @@ grub_menu_execute_entry(grub_menu_entry_t entry, int auto_boot) diff --git a/0172-Fix-the-looking-up-grub.cfg-XXX-while-tftp-booting.patch b/0166-Fix-the-looking-up-grub.cfg-XXX-while-tftp-booting.patch similarity index 97% rename from 0172-Fix-the-looking-up-grub.cfg-XXX-while-tftp-booting.patch rename to 0166-Fix-the-looking-up-grub.cfg-XXX-while-tftp-booting.patch index 3469f7a..2cef9b9 100644 --- a/0172-Fix-the-looking-up-grub.cfg-XXX-while-tftp-booting.patch +++ b/0166-Fix-the-looking-up-grub.cfg-XXX-while-tftp-booting.patch @@ -22,7 +22,7 @@ Resolves: rhbz#1658500 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/grub-core/net/net.c b/grub-core/net/net.c -index a011b940100..19ff2d486a1 100644 +index aa56393e1c4..15073dde1c4 100644 --- a/grub-core/net/net.c +++ b/grub-core/net/net.c @@ -1942,11 +1942,9 @@ grub_net_search_configfile (char *config) diff --git a/0173-Try-to-set-fPIE-and-friends-on-libgnu.a.patch b/0167-Try-to-set-fPIE-and-friends-on-libgnu.a.patch similarity index 51% rename from 0173-Try-to-set-fPIE-and-friends-on-libgnu.a.patch rename to 0167-Try-to-set-fPIE-and-friends-on-libgnu.a.patch index 17f5179..837da31 100644 --- a/0173-Try-to-set-fPIE-and-friends-on-libgnu.a.patch +++ b/0167-Try-to-set-fPIE-and-friends-on-libgnu.a.patch @@ -1,6 +1,6 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Peter Jones -Date: Tue, 15 Jan 2019 14:57:25 -0500 +Date: Fri, 12 Jul 2019 17:45:51 +0200 Subject: [PATCH] Try to set -fPIE and friends on libgnu.a In order to make sure UTIL_CFLAGS and UTIL_LDFLAGS can correctly get @@ -18,22 +18,23 @@ Fixes an rpmdiff check. Related: rhbz#1658500 Signed-off-by: Peter Jones +[javierm: replace from bootstrap instead patching generated Makefile.am] +Signed-off-by: Javier Martinez Canillas --- - grub-core/gnulib/Makefile.am | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) + bootstrap.conf | 3 +++ + 1 file changed, 3 insertions(+) -diff --git a/grub-core/gnulib/Makefile.am b/grub-core/gnulib/Makefile.am -index b7c5e60e1c3..bd3621930ff 100644 ---- a/grub-core/gnulib/Makefile.am -+++ b/grub-core/gnulib/Makefile.am -@@ -38,8 +38,8 @@ CLEANFILES = - DISTCLEANFILES = - MAINTAINERCLEANFILES = - --AM_CPPFLAGS = --AM_CFLAGS = -+AM_CPPFLAGS = $(HOST_CPPFLAGS) -+AM_CFLAGS = $(HOST_CFLAGS) - - noinst_LIBRARIES += libgnu.a - +diff --git a/bootstrap.conf b/bootstrap.conf +index 8804d5beb89..29a6a3e90e2 100644 +--- a/bootstrap.conf ++++ b/bootstrap.conf +@@ -82,6 +82,9 @@ bootstrap_post_import_hook () { + patch -d grub-core/lib/gnulib -p2 \ + < "grub-core/lib/gnulib-patches/$patchname.patch" + done ++ for flagvar in CPPFLAGS CFLAGS; do ++ sed -i -e "s/^AM_$flagvar =/AM_$flagvar = \$(HOST_$flagvar)/" grub-core/lib/gnulib/Makefile.am ++ done + FROM_BOOTSTRAP=1 ./autogen.sh + set +e # bootstrap expects this + } diff --git a/0174-Don-t-make-grub_strtoull-print-an-error-if-no-conver.patch b/0168-Don-t-make-grub_strtoull-print-an-error-if-no-conver.patch similarity index 100% rename from 0174-Don-t-make-grub_strtoull-print-an-error-if-no-conver.patch rename to 0168-Don-t-make-grub_strtoull-print-an-error-if-no-conver.patch diff --git a/0175-Fix-the-type-of-grub_efi_status_t.patch b/0169-Fix-the-type-of-grub_efi_status_t.patch similarity index 98% rename from 0175-Fix-the-type-of-grub_efi_status_t.patch rename to 0169-Fix-the-type-of-grub_efi_status_t.patch index e937c27..fba3f3d 100644 --- a/0175-Fix-the-type-of-grub_efi_status_t.patch +++ b/0169-Fix-the-type-of-grub_efi_status_t.patch @@ -65,7 +65,7 @@ Signed-off-by: Peter Jones 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/grub/efi/api.h b/include/grub/efi/api.h -index b337e1a193d..0c15cffa23c 100644 +index 2ed9c26a450..dec7b06083e 100644 --- a/include/grub/efi/api.h +++ b/include/grub/efi/api.h @@ -536,7 +536,7 @@ typedef grub_uint64_t grub_efi_uint64_t; diff --git a/0179-grub.d-Split-out-boot-success-reset-from-menu-auto-h.patch b/0170-grub.d-Split-out-boot-success-reset-from-menu-auto-h.patch similarity index 98% rename from 0179-grub.d-Split-out-boot-success-reset-from-menu-auto-h.patch rename to 0170-grub.d-Split-out-boot-success-reset-from-menu-auto-h.patch index 82df575..5c6c28e 100644 --- a/0179-grub.d-Split-out-boot-success-reset-from-menu-auto-h.patch +++ b/0170-grub.d-Split-out-boot-success-reset-from-menu-auto-h.patch @@ -18,10 +18,10 @@ In menu auto hide script, rename last_boot_ok var to menu_hide_ok rename util/grub.d/{01_menu_auto_hide.in => 12_menu_auto_hide.in} (58%) diff --git a/Makefile.util.def b/Makefile.util.def -index eca3dfa753f..5062a0e50fa 100644 +index 2019ebd0207..1fa92caad4d 100644 --- a/Makefile.util.def +++ b/Makefile.util.def -@@ -449,14 +449,14 @@ script = { +@@ -458,14 +458,14 @@ script = { }; script = { @@ -40,7 +40,7 @@ index eca3dfa753f..5062a0e50fa 100644 installdir = grubconf; }; -@@ -515,6 +515,12 @@ script = { +@@ -524,6 +524,12 @@ script = { condition = COND_HOST_LINUX; }; diff --git a/0180-Fix-systemctl-kexec-exit-status-check.patch b/0171-Fix-systemctl-kexec-exit-status-check.patch similarity index 100% rename from 0180-Fix-systemctl-kexec-exit-status-check.patch rename to 0171-Fix-systemctl-kexec-exit-status-check.patch diff --git a/0181-Print-grub-emu-linux-loader-messages-as-debug.patch b/0172-Print-grub-emu-linux-loader-messages-as-debug.patch similarity index 100% rename from 0181-Print-grub-emu-linux-loader-messages-as-debug.patch rename to 0172-Print-grub-emu-linux-loader-messages-as-debug.patch diff --git a/0182-Don-t-assume-that-boot-commands-will-only-return-on-.patch b/0173-Don-t-assume-that-boot-commands-will-only-return-on-.patch similarity index 98% rename from 0182-Don-t-assume-that-boot-commands-will-only-return-on-.patch rename to 0173-Don-t-assume-that-boot-commands-will-only-return-on-.patch index 1d071bd..707c1e9 100644 --- a/0182-Don-t-assume-that-boot-commands-will-only-return-on-.patch +++ b/0173-Don-t-assume-that-boot-commands-will-only-return-on-.patch @@ -17,7 +17,7 @@ Signed-off-by: Javier Martinez Canillas 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/grub-core/normal/menu.c b/grub-core/normal/menu.c -index d087153f276..050d0adf6ce 100644 +index 341228f87c9..6ef7e2f8e6f 100644 --- a/grub-core/normal/menu.c +++ b/grub-core/normal/menu.c @@ -286,7 +286,7 @@ get_and_remove_first_entry_number (grub_menu_t menu, const char *name) diff --git a/0183-Fix-undefined-references-for-fdt-when-building-with-.patch b/0174-Fix-undefined-references-for-fdt-when-building-with-.patch similarity index 98% rename from 0183-Fix-undefined-references-for-fdt-when-building-with-.patch rename to 0174-Fix-undefined-references-for-fdt-when-building-with-.patch index 36989b4..9065da8 100644 --- a/0183-Fix-undefined-references-for-fdt-when-building-with-.patch +++ b/0174-Fix-undefined-references-for-fdt-when-building-with-.patch @@ -27,7 +27,7 @@ Signed-off-by: Javier Martinez Canillas 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/grub/fdt.h b/include/grub/fdt.h -index 6ee57e11ab3..e34644631e1 100644 +index 22b7c5463fc..2041341fd68 100644 --- a/include/grub/fdt.h +++ b/include/grub/fdt.h @@ -19,7 +19,7 @@ diff --git a/0175-Do-better-in-bootstrap.conf.patch b/0175-Do-better-in-bootstrap.conf.patch new file mode 100644 index 0000000..3547c78 --- /dev/null +++ b/0175-Do-better-in-bootstrap.conf.patch @@ -0,0 +1,28 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Mon, 29 Jul 2019 10:58:52 -0400 +Subject: [PATCH] Do better in bootstrap.conf + +--- + bootstrap.conf | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/bootstrap.conf b/bootstrap.conf +index 29a6a3e90e2..417cfe405f4 100644 +--- a/bootstrap.conf ++++ b/bootstrap.conf +@@ -16,7 +16,13 @@ + # along with this program. If not, see . + + +-GNULIB_REVISION=d271f868a8df9bbec29049d01e056481b7a1a263 ++# GNULIB_REVISION=d271f868a8df9bbec29049d01e056481b7a1a263 ++if [[ -z "${GNULIB_REVISION}" ]] ;then ++ GNULIB_REVISION=fixes ++fi ++if [[ -z "${GNULIB_URL}" ]] ;then ++ GNULIB_URL=https://github.com/rhboot/gnulib.git ++fi + + # gnulib modules used by this package. + # mbswidth is used by gnulib-fix-width.diff's changes to argp rather than diff --git a/0176-Use-git-to-apply-gnulib-patches.patch b/0176-Use-git-to-apply-gnulib-patches.patch new file mode 100644 index 0000000..0813bad --- /dev/null +++ b/0176-Use-git-to-apply-gnulib-patches.patch @@ -0,0 +1,474 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Mon, 29 Jul 2019 11:21:27 -0400 +Subject: [PATCH] Use git to apply gnulib patches. + +Signed-off-by: Peter Jones +--- + bootstrap.conf | 4 - + grub-core/lib/gnulib-patches/fix-null-deref.patch | 13 -- + .../gnulib-patches/fix-sign-compare-errors.patch | 161 --------------- + grub-core/lib/gnulib-patches/fix-width.patch | 217 --------------------- + grub-core/lib/gnulib-patches/no-abort.patch | 26 --- + 5 files changed, 421 deletions(-) + delete mode 100644 grub-core/lib/gnulib-patches/fix-null-deref.patch + delete mode 100644 grub-core/lib/gnulib-patches/fix-sign-compare-errors.patch + delete mode 100644 grub-core/lib/gnulib-patches/fix-width.patch + delete mode 100644 grub-core/lib/gnulib-patches/no-abort.patch + +diff --git a/bootstrap.conf b/bootstrap.conf +index 417cfe405f4..24ea40b2fc5 100644 +--- a/bootstrap.conf ++++ b/bootstrap.conf +@@ -84,10 +84,6 @@ cp -a INSTALL INSTALL.grub + + bootstrap_post_import_hook () { + set -e +- for patchname in fix-null-deref fix-width no-abort fix-sign-compare-errors; do +- patch -d grub-core/lib/gnulib -p2 \ +- < "grub-core/lib/gnulib-patches/$patchname.patch" +- done + for flagvar in CPPFLAGS CFLAGS; do + sed -i -e "s/^AM_$flagvar =/AM_$flagvar = \$(HOST_$flagvar)/" grub-core/lib/gnulib/Makefile.am + done +diff --git a/grub-core/lib/gnulib-patches/fix-null-deref.patch b/grub-core/lib/gnulib-patches/fix-null-deref.patch +deleted file mode 100644 +index 8fafa153a47..00000000000 +--- a/grub-core/lib/gnulib-patches/fix-null-deref.patch ++++ /dev/null +@@ -1,13 +0,0 @@ +-diff --git a/lib/argp-parse.c b/lib/argp-parse.c +-index 6dec57310..900adad54 100644 +---- a/lib/argp-parse.c +-+++ b/lib/argp-parse.c +-@@ -940,7 +940,7 @@ weak_alias (__argp_parse, argp_parse) +- void * +- __argp_input (const struct argp *argp, const struct argp_state *state) +- { +-- if (state) +-+ if (state && state->pstate) +- { +- struct group *group; +- struct parser *parser = state->pstate; +diff --git a/grub-core/lib/gnulib-patches/fix-sign-compare-errors.patch b/grub-core/lib/gnulib-patches/fix-sign-compare-errors.patch +deleted file mode 100644 +index 479029c0565..00000000000 +--- a/grub-core/lib/gnulib-patches/fix-sign-compare-errors.patch ++++ /dev/null +@@ -1,161 +0,0 @@ +-diff --git a/lib/regcomp.c b/lib/regcomp.c +-index cc85f35ac58..361079d82d6 100644 +---- a/lib/regcomp.c +-+++ b/lib/regcomp.c +-@@ -322,7 +322,7 @@ re_compile_fastmap_iter (regex_t *bufp, const re_dfastate_t *init_state, +- *p++ = dfa->nodes[node].opr.c; +- memset (&state, '\0', sizeof (state)); +- if (__mbrtowc (&wc, (const char *) buf, p - buf, +-- &state) == p - buf +-+ &state) == (size_t)(p - buf) +- && (__wcrtomb ((char *) buf, __towlower (wc), &state) +- != (size_t) -1)) +- re_set_fastmap (fastmap, false, buf[0]); +-@@ -3778,7 +3778,7 @@ fetch_number (re_string_t *input, re_token_t *token, reg_syntax_t syntax) +- num = ((token->type != CHARACTER || c < '0' || '9' < c || num == -2) +- ? -2 +- : num == -1 +-- ? c - '0' +-+ ? (Idx)(c - '0') +- : MIN (RE_DUP_MAX + 1, num * 10 + c - '0')); +- } +- return num; +-diff --git a/lib/regex_internal.c b/lib/regex_internal.c +-index 9004ce809eb..193a1e3d332 100644 +---- a/lib/regex_internal.c +-+++ b/lib/regex_internal.c +-@@ -233,7 +233,7 @@ build_wcs_buffer (re_string_t *pstr) +- /* Apply the translation if we need. */ +- if (__glibc_unlikely (pstr->trans != NULL)) +- { +-- int i, ch; +-+ unsigned int i, ch; +- +- for (i = 0; i < pstr->mb_cur_max && i < remain_len; ++i) +- { +-@@ -376,7 +376,7 @@ build_wcs_upper_buffer (re_string_t *pstr) +- prev_st = pstr->cur_state; +- if (__glibc_unlikely (pstr->trans != NULL)) +- { +-- int i, ch; +-+ unsigned int i, ch; +- +- for (i = 0; i < pstr->mb_cur_max && i < remain_len; ++i) +- { +-@@ -754,7 +754,7 @@ re_string_reconstruct (re_string_t *pstr, Idx idx, int eflags) +- memset (&cur_state, 0, sizeof (cur_state)); +- mbclen = __mbrtowc (&wc2, (const char *) pp, mlen, +- &cur_state); +-- if (raw + offset - p <= mbclen +-+ if ((size_t)(raw + offset - p) <= mbclen +- && mbclen < (size_t) -2) +- { +- memset (&pstr->cur_state, '\0', +-diff --git a/lib/regex_internal.h b/lib/regex_internal.h +-index 5462419b787..e0f8292395d 100644 +---- a/lib/regex_internal.h +-+++ b/lib/regex_internal.h +-@@ -425,7 +425,7 @@ struct re_string_t +- unsigned char offsets_needed; +- unsigned char newline_anchor; +- unsigned char word_ops_used; +-- int mb_cur_max; +-+ unsigned int mb_cur_max; +- }; +- typedef struct re_string_t re_string_t; +- +-@@ -702,7 +702,7 @@ struct re_dfa_t +- unsigned int is_utf8 : 1; +- unsigned int map_notascii : 1; +- unsigned int word_ops_used : 1; +-- int mb_cur_max; +-+ unsigned int mb_cur_max; +- bitset_t word_char; +- reg_syntax_t syntax; +- Idx *subexp_map; +-diff --git a/lib/regexec.c b/lib/regexec.c +-index 0a7a27b772e..b57d4f9141d 100644 +---- a/lib/regexec.c +-+++ b/lib/regexec.c +-@@ -443,7 +443,7 @@ re_search_stub (struct re_pattern_buffer *bufp, const char *string, Idx length, +- { +- if (ret_len) +- { +-- assert (pmatch[0].rm_so == start); +-+ assert (pmatch[0].rm_so == (long)start); +- rval = pmatch[0].rm_eo - start; +- } +- else +-@@ -877,11 +877,11 @@ re_search_internal (const regex_t *preg, const char *string, Idx length, +- if (__glibc_unlikely (mctx.input.offsets_needed != 0)) +- { +- pmatch[reg_idx].rm_so = +-- (pmatch[reg_idx].rm_so == mctx.input.valid_len +-+ (pmatch[reg_idx].rm_so == (long)mctx.input.valid_len +- ? mctx.input.valid_raw_len +- : mctx.input.offsets[pmatch[reg_idx].rm_so]); +- pmatch[reg_idx].rm_eo = +-- (pmatch[reg_idx].rm_eo == mctx.input.valid_len +-+ (pmatch[reg_idx].rm_eo == (long)mctx.input.valid_len +- ? mctx.input.valid_raw_len +- : mctx.input.offsets[pmatch[reg_idx].rm_eo]); +- } +-@@ -1418,11 +1418,11 @@ set_regs (const regex_t *preg, const re_match_context_t *mctx, size_t nmatch, +- } +- memcpy (prev_idx_match, pmatch, sizeof (regmatch_t) * nmatch); +- +-- for (idx = pmatch[0].rm_so; idx <= pmatch[0].rm_eo ;) +-+ for (idx = pmatch[0].rm_so; idx <= (long)pmatch[0].rm_eo ;) +- { +- update_regs (dfa, pmatch, prev_idx_match, cur_node, idx, nmatch); +- +-- if (idx == pmatch[0].rm_eo && cur_node == mctx->last_node) +-+ if (idx == (long)pmatch[0].rm_eo && cur_node == mctx->last_node) +- { +- Idx reg_idx; +- if (fs) +-@@ -1519,7 +1519,7 @@ update_regs (const re_dfa_t *dfa, regmatch_t *pmatch, +- if (reg_num < nmatch) +- { +- /* We are at the last node of this sub expression. */ +-- if (pmatch[reg_num].rm_so < cur_idx) +-+ if (pmatch[reg_num].rm_so < (long)cur_idx) +- { +- pmatch[reg_num].rm_eo = cur_idx; +- /* This is a non-empty match or we are not inside an optional +-@@ -2938,7 +2938,7 @@ check_arrival (re_match_context_t *mctx, state_array_t *path, Idx top_node, +- mctx->state_log[str_idx] = cur_state; +- } +- +-- for (null_cnt = 0; str_idx < last_str && null_cnt <= mctx->max_mb_elem_len;) +-+ for (null_cnt = 0; str_idx < last_str && null_cnt <= (long)mctx->max_mb_elem_len;) +- { +- re_node_set_empty (&next_nodes); +- if (mctx->state_log[str_idx + 1]) +-@@ -3718,7 +3718,7 @@ check_node_accept_bytes (const re_dfa_t *dfa, Idx node_idx, +- const re_string_t *input, Idx str_idx) +- { +- const re_token_t *node = dfa->nodes + node_idx; +-- int char_len, elem_len; +-+ unsigned int char_len, elem_len; +- Idx i; +- +- if (__glibc_unlikely (node->type == OP_UTF8_PERIOD)) +-@@ -4066,7 +4066,7 @@ extend_buffers (re_match_context_t *mctx, int min_len) +- /* Double the lengths of the buffers, but allocate at least MIN_LEN. */ +- ret = re_string_realloc_buffers (pstr, +- MAX (min_len, +-- MIN (pstr->len, pstr->bufs_len * 2))); +-+ MIN ((long)pstr->len, pstr->bufs_len * 2))); +- if (__glibc_unlikely (ret != REG_NOERROR)) +- return ret; +- +-@@ -4236,7 +4236,7 @@ match_ctx_add_entry (re_match_context_t *mctx, Idx node, Idx str_idx, Idx from, +- = (from == to ? -1 : 0); +- +- mctx->bkref_ents[mctx->nbkref_ents++].more = 0; +-- if (mctx->max_mb_elem_len < to - from) +-+ if (mctx->max_mb_elem_len < (long)(to - from)) +- mctx->max_mb_elem_len = to - from; +- return REG_NOERROR; +- } +diff --git a/grub-core/lib/gnulib-patches/fix-width.patch b/grub-core/lib/gnulib-patches/fix-width.patch +deleted file mode 100644 +index 0a208ad08b5..00000000000 +--- a/grub-core/lib/gnulib-patches/fix-width.patch ++++ /dev/null +@@ -1,217 +0,0 @@ +-diff --git a/lib/argp-fmtstream.c b/lib/argp-fmtstream.c +-index ba6a407f7..d0685b3d4 100644 +---- a/lib/argp-fmtstream.c +-+++ b/lib/argp-fmtstream.c +-@@ -28,9 +28,11 @@ +- #include +- #include +- #include +-+#include +- +- #include "argp-fmtstream.h" +- #include "argp-namefrob.h" +-+#include "mbswidth.h" +- +- #ifndef ARGP_FMTSTREAM_USE_LINEWRAP +- +-@@ -115,6 +117,51 @@ weak_alias (__argp_fmtstream_free, argp_fmtstream_free) +- #endif +- #endif +- +-+ +-+/* Return the pointer to the first character that doesn't fit in l columns. */ +-+static inline const ptrdiff_t +-+add_width (const char *ptr, const char *end, size_t l) +-+{ +-+ mbstate_t ps; +-+ const char *ptr0 = ptr; +-+ +-+ memset (&ps, 0, sizeof (ps)); +-+ +-+ while (ptr < end) +-+ { +-+ wchar_t wc; +-+ size_t s, k; +-+ +-+ s = mbrtowc (&wc, ptr, end - ptr, &ps); +-+ if (s == (size_t) -1) +-+ break; +-+ if (s == (size_t) -2) +-+ { +-+ if (1 >= l) +-+ break; +-+ l--; +-+ ptr++; +-+ continue; +-+ } +-+ +-+ if (wc == '\e' && ptr + 3 < end +-+ && ptr[1] == '[' && (ptr[2] == '0' || ptr[2] == '1') +-+ && ptr[3] == 'm') +-+ { +-+ ptr += 4; +-+ continue; +-+ } +-+ +-+ k = wcwidth (wc); +-+ +-+ if (k >= l) +-+ break; +-+ l -= k; +-+ ptr += s; +-+ } +-+ return ptr - ptr0; +-+} +-+ +- /* Process FS's buffer so that line wrapping is done from POINT_OFFS to the +- end of its buffer. This code is mostly from glibc stdio/linewrap.c. */ +- void +-@@ -168,13 +215,15 @@ __argp_fmtstream_update (argp_fmtstream_t fs) +- if (!nl) +- { +- /* The buffer ends in a partial line. */ +-+ size_t display_width = mbsnwidth (buf, fs->p - buf, +-+ MBSW_STOP_AT_NUL); +- +-- if (fs->point_col + len < fs->rmargin) +-+ if (fs->point_col + display_width < fs->rmargin) +- { +- /* The remaining buffer text is a partial line and fits +- within the maximum line width. Advance point for the +- characters to be written and stop scanning. */ +-- fs->point_col += len; +-+ fs->point_col += display_width; +- break; +- } +- else +-@@ -182,14 +231,18 @@ __argp_fmtstream_update (argp_fmtstream_t fs) +- the end of the buffer. */ +- nl = fs->p; +- } +-- else if (fs->point_col + (nl - buf) < (ssize_t) fs->rmargin) +-- { +-- /* The buffer contains a full line that fits within the maximum +-- line width. Reset point and scan the next line. */ +-- fs->point_col = 0; +-- buf = nl + 1; +-- continue; +-- } +-+ else +-+ { +-+ size_t display_width = mbsnwidth (buf, nl - buf, MBSW_STOP_AT_NUL); +-+ if (display_width < (ssize_t) fs->rmargin) +-+ { +-+ /* The buffer contains a full line that fits within the maximum +-+ line width. Reset point and scan the next line. */ +-+ fs->point_col = 0; +-+ buf = nl + 1; +-+ continue; +-+ } +-+ } +- +- /* This line is too long. */ +- r = fs->rmargin - 1; +-@@ -225,7 +278,7 @@ __argp_fmtstream_update (argp_fmtstream_t fs) +- char *p, *nextline; +- int i; +- +-- p = buf + (r + 1 - fs->point_col); +-+ p = buf + add_width (buf, fs->p, (r + 1 - fs->point_col)); +- while (p >= buf && !isblank ((unsigned char) *p)) +- --p; +- nextline = p + 1; /* This will begin the next line. */ +-@@ -243,7 +296,7 @@ __argp_fmtstream_update (argp_fmtstream_t fs) +- { +- /* A single word that is greater than the maximum line width. +- Oh well. Put it on an overlong line by itself. */ +-- p = buf + (r + 1 - fs->point_col); +-+ p = buf + add_width (buf, fs->p, (r + 1 - fs->point_col)); +- /* Find the end of the long word. */ +- if (p < nl) +- do +-@@ -277,7 +330,8 @@ __argp_fmtstream_update (argp_fmtstream_t fs) +- && fs->p > nextline) +- { +- /* The margin needs more blanks than we removed. */ +-- if (fs->end - fs->p > fs->wmargin + 1) +-+ if (mbsnwidth (fs->p, fs->end - fs->p, MBSW_STOP_AT_NUL) +-+ > fs->wmargin + 1) +- /* Make some space for them. */ +- { +- size_t mv = fs->p - nextline; +-diff --git a/lib/argp-help.c b/lib/argp-help.c +-index e5375a0f0..5d8f451ec 100644 +---- a/lib/argp-help.c +-+++ b/lib/argp-help.c +-@@ -51,6 +51,7 @@ +- #include "argp.h" +- #include "argp-fmtstream.h" +- #include "argp-namefrob.h" +-+#include "mbswidth.h" +- +- #ifndef SIZE_MAX +- # define SIZE_MAX ((size_t) -1) +-@@ -1432,7 +1433,7 @@ argp_args_usage (const struct argp *argp, const struct argp_state *state, +- +- /* Manually do line wrapping so that it (probably) won't get wrapped at +- any embedded spaces. */ +-- space (stream, 1 + nl - cp); +-+ space (stream, 1 + mbsnwidth (cp, nl - cp, MBSW_STOP_AT_NUL)); +- +- __argp_fmtstream_write (stream, cp, nl - cp); +- } +-diff --git a/lib/mbswidth.c b/lib/mbswidth.c +-index 408a15e34..b3fb7f83a 100644 +---- a/lib/mbswidth.c +-+++ b/lib/mbswidth.c +-@@ -38,6 +38,14 @@ +- /* Get INT_MAX. */ +- #include +- +-+#ifndef FALLTHROUGH +-+# if __GNUC__ < 7 +-+# define FALLTHROUGH ((void) 0) +-+# else +-+# define FALLTHROUGH __attribute__ ((__fallthrough__)) +-+# endif +-+#endif +-+ +- /* Returns the number of columns needed to represent the multibyte +- character string pointed to by STRING. If a non-printable character +- occurs, and MBSW_REJECT_UNPRINTABLE is specified, -1 is returned. +-@@ -90,6 +98,10 @@ mbsnwidth (const char *string, size_t nbytes, int flags) +- p++; +- width++; +- break; +-+ case '\0': +-+ if (flags & MBSW_STOP_AT_NUL) +-+ return width; +-+ FALLTHROUGH; +- default: +- /* If we have a multibyte sequence, scan it up to its end. */ +- { +-@@ -168,6 +180,9 @@ mbsnwidth (const char *string, size_t nbytes, int flags) +- { +- unsigned char c = (unsigned char) *p++; +- +-+ if (c == 0 && (flags & MBSW_STOP_AT_NUL)) +-+ return width; +-+ +- if (isprint (c)) +- { +- if (width == INT_MAX) +-diff --git a/lib/mbswidth.h b/lib/mbswidth.h +-index 2b5c53c37..45a123e63 100644 +---- a/lib/mbswidth.h +-+++ b/lib/mbswidth.h +-@@ -45,6 +45,10 @@ extern "C" { +- control characters and 1 otherwise. */ +- #define MBSW_REJECT_UNPRINTABLE 2 +- +-+/* If this bit is set \0 is treated as the end of string. +-+ Otherwise it's treated as a normal one column width character. */ +-+#define MBSW_STOP_AT_NUL 4 +-+ +- +- /* Returns the number of screen columns needed for STRING. */ +- #define mbswidth gnu_mbswidth /* avoid clash with UnixWare 7.1.1 function */ +diff --git a/grub-core/lib/gnulib-patches/no-abort.patch b/grub-core/lib/gnulib-patches/no-abort.patch +deleted file mode 100644 +index e469c4762eb..00000000000 +--- a/grub-core/lib/gnulib-patches/no-abort.patch ++++ /dev/null +@@ -1,26 +0,0 @@ +-diff --git a/lib/regcomp.c b/lib/regcomp.c +-index cc85f35ac..de45ebb5c 100644 +---- a/lib/regcomp.c +-+++ b/lib/regcomp.c +-@@ -528,9 +528,9 @@ regerror (int errcode, const regex_t *__restrict preg, char *__restrict errbuf, +- to this routine. If we are given anything else, or if other regex +- code generates an invalid error code, then the program has a bug. +- Dump core so we can fix it. */ +-- abort (); +-- +-- msg = gettext (__re_error_msgid + __re_error_msgid_idx[errcode]); +-+ msg = gettext ("unknown regexp error"); +-+ else +-+ msg = gettext (__re_error_msgid + __re_error_msgid_idx[errcode]); +- +- msg_size = strlen (msg) + 1; /* Includes the null. */ +- +-@@ -1136,7 +1136,7 @@ optimize_utf8 (re_dfa_t *dfa) +- } +- break; +- default: +-- abort (); +-+ break; +- } +- +- if (mb_chars || has_period) diff --git a/0176-mkimage-Use-EFI32_HEADER_SIZE-define-in-arm-efi-case.patch b/0176-mkimage-Use-EFI32_HEADER_SIZE-define-in-arm-efi-case.patch deleted file mode 100644 index 34575e9..0000000 --- a/0176-mkimage-Use-EFI32_HEADER_SIZE-define-in-arm-efi-case.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Alexander Graf -Date: Mon, 28 Jan 2019 14:35:27 +0100 -Subject: [PATCH] mkimage: Use EFI32_HEADER_SIZE define in arm-efi case - -The efi-arm case was defining its own header size calculation, even though it's -100% identical to the common EFI32_HEADER_SIZE definition. - -So let's clean it up to use the common define. - -Signed-off-by: Alexander Graf -Reviewed-by: Daniel Kiper -Tested-by: Julien ROBIN ---- - util/mkimage.c | 7 +------ - 1 file changed, 1 insertion(+), 6 deletions(-) - -diff --git a/util/mkimage.c b/util/mkimage.c -index e22d82afa61..d18ce87a55d 100644 ---- a/util/mkimage.c -+++ b/util/mkimage.c -@@ -584,12 +584,7 @@ static const struct grub_install_image_target_desc image_targets[] = - .decompressor_uncompressed_size = TARGET_NO_FIELD, - .decompressor_uncompressed_addr = TARGET_NO_FIELD, - .section_align = GRUB_PE32_SECTION_ALIGNMENT, -- .vaddr_offset = ALIGN_UP (GRUB_PE32_MSDOS_STUB_SIZE -- + GRUB_PE32_SIGNATURE_SIZE -- + sizeof (struct grub_pe32_coff_header) -- + sizeof (struct grub_pe32_optional_header) -- + 4 * sizeof (struct grub_pe32_section_table), -- GRUB_PE32_SECTION_ALIGNMENT), -+ .vaddr_offset = EFI32_HEADER_SIZE, - .pe_target = GRUB_PE32_MACHINE_ARMTHUMB_MIXED, - .elf_target = EM_ARM, - }, diff --git a/0177-autogen.sh-use-find-wholename-for-long-path-matches.patch b/0177-autogen.sh-use-find-wholename-for-long-path-matches.patch new file mode 100644 index 0000000..1ac3f16 --- /dev/null +++ b/0177-autogen.sh-use-find-wholename-for-long-path-matches.patch @@ -0,0 +1,23 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Mon, 29 Jul 2019 14:01:50 -0400 +Subject: [PATCH] autogen.sh: use find -wholename for long path matches + +Signed-off-by: Peter Jones +--- + autogen.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/autogen.sh b/autogen.sh +index ef43270fca0..a1783d62c26 100755 +--- a/autogen.sh ++++ b/autogen.sh +@@ -13,7 +13,7 @@ fi + export LC_COLLATE=C + unset LC_ALL + +-find . -iname '*.[ch]' ! -ipath './grub-core/lib/libgcrypt-grub/*' ! -ipath './build-aux/*' ! -ipath './grub-core/lib/libgcrypt/src/misc.c' ! -ipath './grub-core/lib/libgcrypt/src/global.c' ! -ipath './grub-core/lib/libgcrypt/src/secmem.c' ! -ipath './util/grub-gen-widthspec.c' ! -ipath './util/grub-gen-asciih.c' ! -ipath './gnulib/*' ! -iname './grub-core/lib/gnulib/*' |sort > po/POTFILES.in ++find . -iname '*.[ch]' ! -ipath './grub-core/lib/libgcrypt-grub/*' ! -ipath './build-aux/*' ! -ipath './grub-core/lib/libgcrypt/src/misc.c' ! -ipath './grub-core/lib/libgcrypt/src/global.c' ! -ipath './grub-core/lib/libgcrypt/src/secmem.c' ! -ipath './util/grub-gen-widthspec.c' ! -ipath './util/grub-gen-asciih.c' ! -ipath './gnulib/*' ! -wholename './grub-core/lib/gnulib/*' |sort > po/POTFILES.in + find util -iname '*.in' ! -name Makefile.in |sort > po/POTFILES-shell.in + + echo "Importing unicode..." diff --git a/0177-mkimage-Align-efi-sections-on-4k-boundary.patch b/0177-mkimage-Align-efi-sections-on-4k-boundary.patch deleted file mode 100644 index 1f2d082..0000000 --- a/0177-mkimage-Align-efi-sections-on-4k-boundary.patch +++ /dev/null @@ -1,55 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Alexander Graf -Date: Mon, 28 Jan 2019 14:35:28 +0100 -Subject: [PATCH] mkimage: Align efi sections on 4k boundary - -There is UEFI firmware popping up in the wild now that implements stricter -permission checks using NX and write protect page table entry bits. - -This means that firmware now may fail to load binaries if its individual -sections are not page aligned, as otherwise it can not ensure permission -boundaries. - -So let's bump all efi section alignments up to 4k (EFI page size). That way -we will stay compatible going forward. - -Unfortunately our internals can't deal very well with a mismatch of alignment -between the virtual and file offsets, so we have to also pad our target -binary a bit. - -Signed-off-by: Alexander Graf -Reviewed-by: Daniel Kiper -Tested-by: Julien ROBIN ---- - include/grub/efi/pe32.h | 11 +++++++++-- - 1 file changed, 9 insertions(+), 2 deletions(-) - -diff --git a/include/grub/efi/pe32.h b/include/grub/efi/pe32.h -index c03cc599f63..f71da19f2f5 100644 ---- a/include/grub/efi/pe32.h -+++ b/include/grub/efi/pe32.h -@@ -20,6 +20,7 @@ - #define GRUB_EFI_PE32_HEADER 1 - - #include -+#include - - /* The MSDOS compatibility stub. This was copied from the output of - objcopy, and it is not necessary to care about what this means. */ -@@ -50,8 +51,14 @@ - /* According to the spec, the minimal alignment is 512 bytes... - But some examples (such as EFI drivers in the Intel - Sample Implementation) use 32 bytes (0x20) instead, and it seems -- to be working. For now, GRUB uses 512 bytes for safety. */ --#define GRUB_PE32_SECTION_ALIGNMENT 0x200 -+ to be working. -+ -+ However, there is firmware showing up in the field now with -+ page alignment constraints to guarantee that page protection -+ bits take effect. Because currently existing GRUB code can not -+ properly distinguish between in-memory and in-file layout, let's -+ bump all alignment to GRUB_EFI_PAGE_SIZE. */ -+#define GRUB_PE32_SECTION_ALIGNMENT GRUB_EFI_PAGE_SIZE - #define GRUB_PE32_FILE_ALIGNMENT GRUB_PE32_SECTION_ALIGNMENT - - struct grub_pe32_coff_header diff --git a/0178-bootstrap.conf-don-t-clobber-AM_CFLAGS-here.patch b/0178-bootstrap.conf-don-t-clobber-AM_CFLAGS-here.patch new file mode 100644 index 0000000..3a0e5bc --- /dev/null +++ b/0178-bootstrap.conf-don-t-clobber-AM_CFLAGS-here.patch @@ -0,0 +1,23 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Mon, 29 Jul 2019 14:02:11 -0400 +Subject: [PATCH] bootstrap.conf: don't clobber AM_CFLAGS here + +--- + bootstrap.conf | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/bootstrap.conf b/bootstrap.conf +index 24ea40b2fc5..274c55a5568 100644 +--- a/bootstrap.conf ++++ b/bootstrap.conf +@@ -84,9 +84,6 @@ cp -a INSTALL INSTALL.grub + + bootstrap_post_import_hook () { + set -e +- for flagvar in CPPFLAGS CFLAGS; do +- sed -i -e "s/^AM_$flagvar =/AM_$flagvar = \$(HOST_$flagvar)/" grub-core/lib/gnulib/Makefile.am +- done + FROM_BOOTSTRAP=1 ./autogen.sh + set +e # bootstrap expects this + } diff --git a/0178-mkimage-Clarify-file-alignment-in-efi-case.patch b/0178-mkimage-Clarify-file-alignment-in-efi-case.patch deleted file mode 100644 index 373b5ce..0000000 --- a/0178-mkimage-Clarify-file-alignment-in-efi-case.patch +++ /dev/null @@ -1,71 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Alexander Graf -Date: Mon, 28 Jan 2019 14:35:29 +0100 -Subject: [PATCH] mkimage: Clarify file alignment in efi case - -There are a few spots in the PE generation code for EFI binaries that uses -the section alignment rather than file alignment, even though the alignment -is really only file bound. - -Replace those cases with the file alignment constant instead. - -Reported-by: Daniel Kiper -Signed-off-by: Alexander Graf -Reviewed-by: Daniel Kiper -Tested-by: Julien ROBIN ---- - util/mkimage.c | 12 ++++++------ - 1 file changed, 6 insertions(+), 6 deletions(-) - -diff --git a/util/mkimage.c b/util/mkimage.c -index d18ce87a55d..b5272bc1b01 100644 ---- a/util/mkimage.c -+++ b/util/mkimage.c -@@ -66,14 +66,14 @@ - + sizeof (struct grub_pe32_coff_header) \ - + sizeof (struct grub_pe32_optional_header) \ - + 4 * sizeof (struct grub_pe32_section_table), \ -- GRUB_PE32_SECTION_ALIGNMENT) -+ GRUB_PE32_FILE_ALIGNMENT) - - #define EFI64_HEADER_SIZE ALIGN_UP (GRUB_PE32_MSDOS_STUB_SIZE \ - + GRUB_PE32_SIGNATURE_SIZE \ - + sizeof (struct grub_pe32_coff_header) \ - + sizeof (struct grub_pe64_optional_header) \ - + 4 * sizeof (struct grub_pe32_section_table), \ -- GRUB_PE32_SECTION_ALIGNMENT) -+ GRUB_PE32_FILE_ALIGNMENT) - - static const struct grub_install_image_target_desc image_targets[] = - { -@@ -1207,10 +1207,10 @@ grub_install_generate_image (const char *dir, const char *prefix, - header_size = EFI64_HEADER_SIZE; - - reloc_addr = ALIGN_UP (header_size + core_size, -- image_target->section_align); -+ GRUB_PE32_FILE_ALIGNMENT); - - pe_size = ALIGN_UP (reloc_addr + layout.reloc_size, -- image_target->section_align); -+ GRUB_PE32_FILE_ALIGNMENT); - pe_img = xmalloc (reloc_addr + layout.reloc_size); - memset (pe_img, 0, header_size); - memcpy ((char *) pe_img + header_size, core_img, core_size); -@@ -1260,7 +1260,7 @@ grub_install_generate_image (const char *dir, const char *prefix, - - o->image_base = 0; - o->section_alignment = grub_host_to_target32 (image_target->section_align); -- o->file_alignment = grub_host_to_target32 (image_target->section_align); -+ o->file_alignment = grub_host_to_target32 (GRUB_PE32_FILE_ALIGNMENT); - o->image_size = grub_host_to_target32 (pe_size); - o->header_size = grub_host_to_target32 (header_size); - o->subsystem = grub_host_to_target16 (GRUB_PE32_SUBSYSTEM_EFI_APPLICATION); -@@ -1295,7 +1295,7 @@ grub_install_generate_image (const char *dir, const char *prefix, - o->code_base = grub_cpu_to_le32 (header_size); - o->image_base = 0; - o->section_alignment = grub_host_to_target32 (image_target->section_align); -- o->file_alignment = grub_host_to_target32 (image_target->section_align); -+ o->file_alignment = grub_host_to_target32 (GRUB_PE32_FILE_ALIGNMENT); - o->image_size = grub_host_to_target32 (pe_size); - o->header_size = grub_host_to_target32 (header_size); - o->subsystem = grub_host_to_target16 (GRUB_PE32_SUBSYSTEM_EFI_APPLICATION); diff --git a/0184-arm-Move-trampolines-into-code-section.patch b/0184-arm-Move-trampolines-into-code-section.patch deleted file mode 100644 index 7d15e51..0000000 --- a/0184-arm-Move-trampolines-into-code-section.patch +++ /dev/null @@ -1,78 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Alexander Graf -Date: Tue, 30 Apr 2019 22:43:56 +0200 -Subject: [PATCH] arm: Move trampolines into code section - -When creating T32->A32 transition jumps, the relocation code in grub -will generate trampolines. These trampolines live in the .data section -of our PE binary which means they are not marked as executable. - -This misbehavior was unmasked by commit a51f953f4ee87 ("mkimage: Align -efi sections on 4k boundary") which made the X/NX boundary more obvious -because everything became page aligned. - -To put things into proper order, let's move the arm trampolines into the -.text section instead. That way everyone knows they are executable. - -Fixes: a51f953f4ee87 ("mkimage: Align efi sections on 4k boundary") -Reported-by: Julien ROBIN -Reported-by: Leif Lindholm -Signed-off-by: Alexander Graf -Tested-by: Julien ROBIN -Reviewed-by: Leif Lindholm -Tested-by: Leif Lindholm -Reviewed-by: Daniel Kiper ---- - util/grub-mkimagexx.c | 32 +++++++++++++++----------------- - 1 file changed, 15 insertions(+), 17 deletions(-) - -diff --git a/util/grub-mkimagexx.c b/util/grub-mkimagexx.c -index a483c674c49..86e6254a27e 100644 ---- a/util/grub-mkimagexx.c -+++ b/util/grub-mkimagexx.c -@@ -1900,6 +1900,21 @@ SUFFIX (locate_sections) (Elf_Ehdr *e, const char *kernel_path, - } - } - -+#ifdef MKIMAGE_ELF32 -+ if (image_target->elf_target == EM_ARM) -+ { -+ grub_size_t tramp; -+ -+ layout->kernel_size = ALIGN_UP (layout->kernel_size, 16); -+ -+ tramp = arm_get_trampoline_size (e, smd->sections, smd->section_entsize, -+ smd->num_sections, image_target); -+ -+ layout->tramp_off = layout->kernel_size; -+ layout->kernel_size += ALIGN_UP (tramp, 16); -+ } -+#endif -+ - layout->kernel_size = ALIGN_UP (layout->kernel_size + image_target->vaddr_offset, - image_target->section_align) - - image_target->vaddr_offset; -@@ -1913,23 +1928,6 @@ SUFFIX (locate_sections) (Elf_Ehdr *e, const char *kernel_path, - layout->kernel_size = SUFFIX (put_section) (s, i, layout->kernel_size, smd, - image_target); - --#ifdef MKIMAGE_ELF32 -- if (image_target->elf_target == EM_ARM) -- { -- grub_size_t tramp; -- layout->kernel_size = ALIGN_UP (layout->kernel_size + image_target->vaddr_offset, -- image_target->section_align) - image_target->vaddr_offset; -- -- layout->kernel_size = ALIGN_UP (layout->kernel_size, 16); -- -- tramp = arm_get_trampoline_size (e, smd->sections, smd->section_entsize, -- smd->num_sections, image_target); -- -- layout->tramp_off = layout->kernel_size; -- layout->kernel_size += ALIGN_UP (tramp, 16); -- } --#endif -- - layout->bss_start = layout->kernel_size; - layout->end = layout->kernel_size; - diff --git a/0185-arm-Align-section-alignment-with-manual-relocation-o.patch b/0185-arm-Align-section-alignment-with-manual-relocation-o.patch deleted file mode 100644 index 52285fb..0000000 --- a/0185-arm-Align-section-alignment-with-manual-relocation-o.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Alexander Graf -Date: Tue, 30 Apr 2019 22:43:57 +0200 -Subject: [PATCH] arm: Align section alignment with manual relocation offset - code - -The arm relocation code has a manual special case for EFI binaries to -add the natural alignment to its own relocation awareness. - -Since commit a51f953f4ee87 ("mkimage: Align efi sections on 4k -boundary") we changed that alignment from 0x400 to 0x1000 bytes. Reflect -the change in that branch that we forgot as well. - -This fixes running 32bit arm grub efi binaries for me again. - -Fixes: a51f953f4ee87 ("mkimage: Align efi sections on 4k boundary") -Reported-by: Heinrich Schuchardt -Reported-by: Steve McIntyre -Signed-off-by: Alexander Graf -Reviewed-by: Daniel Kiper -Tested-by: Julien ROBIN -Reviewed-by: Leif Lindholm -Tested-by: Leif Lindholm -Reviewed-by: Daniel Kiper ---- - util/grub-mkimagexx.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/util/grub-mkimagexx.c b/util/grub-mkimagexx.c -index 86e6254a27e..75773446d0f 100644 ---- a/util/grub-mkimagexx.c -+++ b/util/grub-mkimagexx.c -@@ -1099,7 +1099,7 @@ SUFFIX (relocate_addrs) (Elf_Ehdr *e, struct section_metadata *smd, - (int) sym_addr, (int) sym_addr); - /* Data will be naturally aligned */ - if (image_target->id == IMAGE_EFI) -- sym_addr += 0x400; -+ sym_addr += GRUB_PE32_SECTION_ALIGNMENT; - *target = grub_host_to_target32 (grub_target_to_host32 (*target) + sym_addr); - } - break; diff --git a/0186-grub-core-loader-efi-fdt.c-Do-not-copy-random-memory.patch b/0186-grub-core-loader-efi-fdt.c-Do-not-copy-random-memory.patch deleted file mode 100644 index a4851be..0000000 --- a/0186-grub-core-loader-efi-fdt.c-Do-not-copy-random-memory.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Heinrich Schuchardt -Date: Mon, 17 Dec 2018 22:00:24 +0100 -Subject: [PATCH] grub-core/loader/efi/fdt.c: Do not copy random memory - -We should not try to copy any memory area which is outside of the original -fdt. If this extra memory is controlled by a hypervisor this might end -with a crash. - -Signed-off-by: Heinrich Schuchardt -Reviewed-by: Leif Lindholm -Reviewed-by: Daniel Kiper ---- - grub-core/loader/efi/fdt.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/grub-core/loader/efi/fdt.c b/grub-core/loader/efi/fdt.c -index a9dbcfdfeaf..cecd617dccc 100644 ---- a/grub-core/loader/efi/fdt.c -+++ b/grub-core/loader/efi/fdt.c -@@ -68,7 +68,7 @@ grub_fdt_load (grub_size_t additional_size) - - if (raw_fdt) - { -- grub_memmove (fdt, raw_fdt, size); -+ grub_memmove (fdt, raw_fdt, size - additional_size); - grub_fdt_set_totalsize (fdt, size); - } - else diff --git a/0187-linux-efi-arm-fdt-break-FDT-extra-allocation-space-o.patch b/0187-linux-efi-arm-fdt-break-FDT-extra-allocation-space-o.patch deleted file mode 100644 index 164de66..0000000 --- a/0187-linux-efi-arm-fdt-break-FDT-extra-allocation-space-o.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Peter Robinson -Date: Thu, 20 Jun 2019 16:21:48 +0100 -Subject: [PATCH] linux, efi, arm*, fdt: break FDT extra allocation space out - into a #define - -A certain amount of dynamic space is required for the handover from -GRUB/Linux-EFI-stub. This entails things like initrd addresses, -address-cells entries and associated strings. - -But move this into a proper centralised #define rather than live-code -it in the loader. - -Signed-off-by: Leif Lindholm -Reviewed-by: Daniel Kiper -Signed-off-by: Peter Robinson ---- - grub-core/loader/arm64/linux.c | 2 +- - include/grub/fdt.h | 3 +++ - 2 files changed, 4 insertions(+), 1 deletion(-) - -diff --git a/grub-core/loader/arm64/linux.c b/grub-core/loader/arm64/linux.c -index e1110749eb9..628b320618c 100644 ---- a/grub-core/loader/arm64/linux.c -+++ b/grub-core/loader/arm64/linux.c -@@ -73,7 +73,7 @@ finalize_params_linux (void) - grub_err_t err = GRUB_ERR_NONE; - void *fdt; - -- fdt = grub_fdt_load (0x400); -+ fdt = grub_fdt_load (GRUB_EFI_LINUX_FDT_EXTRA_SPACE); - if (!fdt) - { - err = grub_error(GRUB_ERR_BAD_OS, "failed to load FDT"); -diff --git a/include/grub/fdt.h b/include/grub/fdt.h -index e34644631e1..2041341fd68 100644 ---- a/include/grub/fdt.h -+++ b/include/grub/fdt.h -@@ -24,6 +24,9 @@ - #include - #include - -+/* Space required when preparing the /chosen node after boot has been called. */ -+#define GRUB_EFI_LINUX_FDT_EXTRA_SPACE 0x400 -+ - #define FDT_MAGIC 0xD00DFEED - - typedef struct { diff --git a/bootstrap b/bootstrap new file mode 100755 index 0000000..5b08e7e --- /dev/null +++ b/bootstrap @@ -0,0 +1,1073 @@ +#! /bin/sh +# Print a version string. +scriptversion=2019-01-04.17; # UTC + +# Bootstrap this package from checked-out sources. + +# Copyright (C) 2003-2019 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Originally written by Paul Eggert. The canonical version of this +# script is maintained as build-aux/bootstrap in gnulib, however, to +# be useful to your project, you should place a copy of it under +# version control in the top-level directory of your project. The +# intent is that all customization can be done with a bootstrap.conf +# file also maintained in your version control; gnulib comes with a +# template build-aux/bootstrap.conf to get you started. + +# Please report bugs or propose patches to bug-gnulib@gnu.org. + +nl=' +' + +# Ensure file names are sorted consistently across platforms. +LC_ALL=C +export LC_ALL + +# Ensure that CDPATH is not set. Otherwise, the output from cd +# would cause trouble in at least one use below. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +local_gl_dir=gl + +# Honor $PERL, but work even if there is none. +PERL="${PERL-perl}" + +me=$0 + +default_gnulib_url=git://git.sv.gnu.org/gnulib + +usage() { + cat <&2 +} + +# warn_ WORD1... +warn_ () +{ + # If IFS does not start with ' ', set it and emit the warning in a subshell. + case $IFS in + ' '*) warnf_ '%s\n' "$*";; + *) (IFS=' '; warn_ "$@");; + esac +} + +# die WORD1... +die() { warn_ "$@"; exit 1; } + +# Configuration. + +# Name of the Makefile.am +gnulib_mk=gnulib.mk + +# List of gnulib modules needed. +gnulib_modules= + +# Any gnulib files needed that are not in modules. +gnulib_files= + +: ${AUTOPOINT=autopoint} +: ${AUTORECONF=autoreconf} + +# A function to be called right after gnulib-tool is run. +# Override it via your own definition in bootstrap.conf. +bootstrap_post_import_hook() { :; } + +# A function to be called after everything else in this script. +# Override it via your own definition in bootstrap.conf. +bootstrap_epilogue() { :; } + +# The command to download all .po files for a specified domain into a +# specified directory. Fill in the first %s with the destination +# directory and the second with the domain name. +po_download_command_format=\ +"wget --mirror --level=1 -nd -q -A.po -P '%s' \ + https://translationproject.org/latest/%s/" + +# Prefer a non-empty tarname (4th argument of AC_INIT if given), else +# fall back to the package name (1st argument with munging) +extract_package_name=' + /^AC_INIT(\[*/{ + s/// + /^[^,]*,[^,]*,[^,]*,[ []*\([^][ ,)]\)/{ + s//\1/ + s/[],)].*// + p + q + } + s/[],)].*// + s/^GNU // + y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ + s/[^abcdefghijklmnopqrstuvwxyz0123456789_]/-/g + p + } +' +package=$(sed -n "$extract_package_name" configure.ac) \ + || die 'cannot find package name in configure.ac' +gnulib_name=lib$package + +build_aux=build-aux +source_base=lib +m4_base=m4 +doc_base=doc +tests_base=tests +gnulib_extra_files=" + build-aux/install-sh + build-aux/mdate-sh + build-aux/texinfo.tex + build-aux/depcomp + build-aux/config.guess + build-aux/config.sub + doc/INSTALL +" + +# Additional gnulib-tool options to use. Use "\newline" to break lines. +gnulib_tool_option_extras= + +# Other locale categories that need message catalogs. +EXTRA_LOCALE_CATEGORIES= + +# Additional xgettext options to use. Use "\\\newline" to break lines. +XGETTEXT_OPTIONS='\\\ + --flag=_:1:pass-c-format\\\ + --flag=N_:1:pass-c-format\\\ + --flag=error:3:c-format --flag=error_at_line:5:c-format\\\ +' + +# Package bug report address and copyright holder for gettext files +COPYRIGHT_HOLDER='Free Software Foundation, Inc.' +MSGID_BUGS_ADDRESS=bug-$package@gnu.org + +# Files we don't want to import. +excluded_files= + +# File that should exist in the top directory of a checked out hierarchy, +# but not in a distribution tarball. +checkout_only_file=README-hacking + +# Whether to use copies instead of symlinks. +copy=false + +# Set this to '.cvsignore .gitignore' in bootstrap.conf if you want +# those files to be generated in directories like lib/, m4/, and po/. +# Or set it to 'auto' to make this script select which to use based +# on which version control system (if any) is used in the source directory. +vc_ignore=auto + +# Set this to true in bootstrap.conf to enable --bootstrap-sync by +# default. +bootstrap_sync=false + +# Use git to update gnulib sources +use_git=true + +check_exists() { + if test "$1" = "--verbose"; then + ($2 --version /dev/null 2>&1 + if test $? -ge 126; then + # If not found, run with diagnostics as one may be + # presented with env variables to set to find the right version + ($2 --version /dev/null 2>&1 + fi + + test $? -lt 126 +} + +# find_tool ENVVAR NAMES... +# ------------------------- +# Search for a required program. Use the value of ENVVAR, if set, +# otherwise find the first of the NAMES that can be run. +# If found, set ENVVAR to the program name, die otherwise. +# +# FIXME: code duplication, see also gnu-web-doc-update. +find_tool () +{ + find_tool_envvar=$1 + shift + find_tool_names=$@ + eval "find_tool_res=\$$find_tool_envvar" + if test x"$find_tool_res" = x; then + for i; do + if check_exists $i; then + find_tool_res=$i + break + fi + done + fi + if test x"$find_tool_res" = x; then + warn_ "one of these is required: $find_tool_names;" + die "alternatively set $find_tool_envvar to a compatible tool" + fi + eval "$find_tool_envvar=\$find_tool_res" + eval "export $find_tool_envvar" +} + +# Override the default configuration, if necessary. +# Make sure that bootstrap.conf is sourced from the current directory +# if we were invoked as "sh bootstrap". +case "$0" in + */*) test -r "$0.conf" && . "$0.conf" ;; + *) test -r "$0.conf" && . ./"$0.conf" ;; +esac + +if test "$vc_ignore" = auto; then + vc_ignore= + test -d .git && vc_ignore=.gitignore + test -d CVS && vc_ignore="$vc_ignore .cvsignore" +fi + +if test x"$gnulib_modules$gnulib_files$gnulib_extra_files" = x; then + use_gnulib=false +else + use_gnulib=true +fi + +# Translate configuration into internal form. + +# Parse options. + +for option +do + case $option in + --help) + usage + exit;; + --gnulib-srcdir=*) + GNULIB_SRCDIR=${option#--gnulib-srcdir=};; + --skip-po) + SKIP_PO=t;; + --force) + checkout_only_file=;; + --copy) + copy=true;; + --bootstrap-sync) + bootstrap_sync=true;; + --no-bootstrap-sync) + bootstrap_sync=false;; + --no-git) + use_git=false;; + *) + die "$option: unknown option";; + esac +done + +$use_git || test -d "$GNULIB_SRCDIR" \ + || die "Error: --no-git requires --gnulib-srcdir" + +if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then + die "Bootstrapping from a non-checked-out distribution is risky." +fi + +# Strip blank and comment lines to leave significant entries. +gitignore_entries() { + sed '/^#/d; /^$/d' "$@" +} + +# If $STR is not already on a line by itself in $FILE, insert it at the start. +# Entries are inserted at the start of the ignore list to ensure existing +# entries starting with ! are not overridden. Such entries support +# whitelisting exceptions after a more generic blacklist pattern. +insert_if_absent() { + file=$1 + str=$2 + test -f $file || touch $file + test -r $file || die "Error: failed to read ignore file: $file" + duplicate_entries=$(gitignore_entries $file | sort | uniq -d) + if [ "$duplicate_entries" ] ; then + die "Error: Duplicate entries in $file: " $duplicate_entries + fi + linesold=$(gitignore_entries $file | wc -l) + linesnew=$( { echo "$str"; cat $file; } | gitignore_entries | sort -u | wc -l) + if [ $linesold != $linesnew ] ; then + { echo "$str" | cat - $file > $file.bak && mv $file.bak $file; } \ + || die "insert_if_absent $file $str: failed" + fi +} + +# Adjust $PATTERN for $VC_IGNORE_FILE and insert it with +# insert_if_absent. +insert_vc_ignore() { + vc_ignore_file="$1" + pattern="$2" + case $vc_ignore_file in + *.gitignore) + # A .gitignore entry that does not start with '/' applies + # recursively to subdirectories, so prepend '/' to every + # .gitignore entry. + pattern=$(echo "$pattern" | sed s,^,/,);; + esac + insert_if_absent "$vc_ignore_file" "$pattern" +} + +# Die if there is no AC_CONFIG_AUX_DIR($build_aux) line in configure.ac. +found_aux_dir=no +grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \ + >/dev/null && found_aux_dir=yes +grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \ + >/dev/null && found_aux_dir=yes +test $found_aux_dir = yes \ + || die "configure.ac lacks 'AC_CONFIG_AUX_DIR([$build_aux])'; add it" + +# If $build_aux doesn't exist, create it now, otherwise some bits +# below will malfunction. If creating it, also mark it as ignored. +if test ! -d $build_aux; then + mkdir $build_aux + for dot_ig in x $vc_ignore; do + test $dot_ig = x && continue + insert_vc_ignore $dot_ig $build_aux + done +fi + +# Note this deviates from the version comparison in automake +# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a +# but this should suffice as we won't be specifying old +# version formats or redundant trailing .0 in bootstrap.conf. +# If we did want full compatibility then we should probably +# use m4_version_compare from autoconf. +sort_ver() { # sort -V is not generally available + ver1="$1" + ver2="$2" + + # split on '.' and compare each component + i=1 + while : ; do + p1=$(echo "$ver1" | cut -d. -f$i) + p2=$(echo "$ver2" | cut -d. -f$i) + if [ ! "$p1" ]; then + echo "$1 $2" + break + elif [ ! "$p2" ]; then + echo "$2 $1" + break + elif [ ! "$p1" = "$p2" ]; then + if [ "$p1" -gt "$p2" ] 2>/dev/null; then # numeric comparison + echo "$2 $1" + elif [ "$p2" -gt "$p1" ] 2>/dev/null; then # numeric comparison + echo "$1 $2" + else # numeric, then lexicographic comparison + lp=$(printf "$p1\n$p2\n" | LANG=C sort -n | tail -n1) + if [ "$lp" = "$p2" ]; then + echo "$1 $2" + else + echo "$2 $1" + fi + fi + break + fi + i=$(($i+1)) + done +} + +get_version_sed=' +# Move version to start of line. +s/.*[v ]\([0-9]\)/\1/ + +# Skip lines that do not start with version. +/^[0-9]/!d + +# Remove characters after the version. +s/[^.a-z0-9-].*// + +# The first component must be digits only. +s/^\([0-9]*\)[a-z-].*/\1/ + +#the following essentially does s/5.005/5.5/ +s/\.0*\([1-9]\)/.\1/g +p +q' + +get_version() { + app=$1 + + $app --version >/dev/null 2>&1 || { $app --version; return 1; } + + $app --version 2>&1 | sed -n "$get_version_sed" +} + +check_versions() { + ret=0 + + while read app req_ver; do + # We only need libtoolize from the libtool package. + if test "$app" = libtool; then + app=libtoolize + fi + # Exempt git if --no-git is in effect. + if test "$app" = git; then + $use_git || continue + fi + # Honor $APP variables ($TAR, $AUTOCONF, etc.) + appvar=$(echo $app | LC_ALL=C tr '[a-z]-' '[A-Z]_') + test "$appvar" = TAR && appvar=AMTAR + case $appvar in + GZIP) ;; # Do not use $GZIP: it contains gzip options. + PERL::*) ;; # Keep perl modules as-is + *) eval "app=\${$appvar-$app}" ;; + esac + + # Handle the still-experimental Automake-NG programs specially. + # They remain named as the mainstream Automake programs ("automake", + # and "aclocal") to avoid gratuitous incompatibilities with + # pre-existing usages (by, say, autoreconf, or custom autogen.sh + # scripts), but correctly identify themselves (as being part of + # "GNU automake-ng") when asked their version. + case $app in + automake-ng|aclocal-ng) + app=${app%-ng} + ($app --version | grep '(GNU automake-ng)') >/dev/null 2>&1 || { + warn_ "Error: '$app' not found or not from Automake-NG" + ret=1 + continue + } ;; + # Another check is for perl modules. These can be written as + # e.g. perl::XML::XPath in case of XML::XPath module, etc. + perl::*) + # Extract module name + app="${app#perl::}" + if ! $PERL -m"$app" -e 'exit 0' >/dev/null 2>&1; then + warn_ "Error: perl module '$app' not found" + ret=1 + fi + continue + ;; + esac + if [ "$req_ver" = "-" ]; then + # Merely require app to exist; not all prereq apps are well-behaved + # so we have to rely on $? rather than get_version. + if ! check_exists --verbose $app; then + warn_ "Error: '$app' not found" + ret=1 + fi + else + # Require app to produce a new enough version string. + inst_ver=$(get_version $app) + if [ ! "$inst_ver" ]; then + warn_ "Error: '$app' not found" + ret=1 + else + latest_ver=$(sort_ver $req_ver $inst_ver | cut -d' ' -f2) + if [ ! "$latest_ver" = "$inst_ver" ]; then + warnf_ '%s\n' \ + "Error: '$app' version == $inst_ver is too old" \ + " '$app' version >= $req_ver is required" + ret=1 + fi + fi + fi + done + + return $ret +} + +print_versions() { + echo "Program Min_version" + echo "----------------------" + printf %s "$buildreq" + echo "----------------------" + # can't depend on column -t +} + +# Find sha1sum, named gsha1sum on MacPorts, shasum on Mac OS X 10.6. +# Also find the compatible sha1 utility on the BSDs +if test x"$SKIP_PO" = x; then + find_tool SHA1SUM sha1sum gsha1sum shasum sha1 +fi + +use_libtool=0 +# We'd like to use grep -E, to see if any of LT_INIT, +# AC_PROG_LIBTOOL, AM_PROG_LIBTOOL is used in configure.ac, +# but that's not portable enough (e.g., for Solaris). +grep '^[ ]*A[CM]_PROG_LIBTOOL' configure.ac >/dev/null \ + && use_libtool=1 +grep '^[ ]*LT_INIT' configure.ac >/dev/null \ + && use_libtool=1 +if test $use_libtool = 1; then + find_tool LIBTOOLIZE glibtoolize libtoolize +fi + +# gnulib-tool requires at least automake and autoconf. +# If either is not listed, add it (with minimum version) as a prerequisite. +case $buildreq in + *automake*) ;; + *) buildreq="automake 1.9 +$buildreq" ;; +esac +case $buildreq in + *autoconf*) ;; + *) buildreq="autoconf 2.59 +$buildreq" ;; +esac + +# When we can deduce that gnulib-tool will require patch, +# and when patch is not already listed as a prerequisite, add it, too. +if test -d "$local_gl_dir" \ + && ! find "$local_gl_dir" -name '*.diff' -exec false {} +; then + case $buildreq in + *patch*) ;; + *) buildreq="patch - +$buildreq" ;; + esac +fi + +if ! printf "$buildreq" | check_versions; then + echo >&2 + if test -f README-prereq; then + die "See README-prereq for how to get the prerequisite programs" + else + die "Please install the prerequisite programs" + fi +fi + +# Warn the user if autom4te appears to be broken; this causes known +# issues with at least gettext 0.18.3. +probe=$(echo 'm4_quote([hi])' | autom4te -l M4sugar -t 'm4_quote:$%' -) +if test "x$probe" != xhi; then + warn_ "WARNING: your autom4te wrapper eats stdin;" + warn_ "if bootstrap fails, consider upgrading your autotools" +fi + +echo "$0: Bootstrapping from checked-out $package sources..." + +# See if we can use gnulib's git-merge-changelog merge driver. +if $use_git && test -d .git && check_exists git; then + if git config merge.merge-changelog.driver >/dev/null ; then + : + elif check_exists git-merge-changelog; then + echo "$0: initializing git-merge-changelog driver" + git config merge.merge-changelog.name 'GNU-style ChangeLog merge driver' + git config merge.merge-changelog.driver 'git-merge-changelog %O %A %B' + else + echo "$0: consider installing git-merge-changelog from gnulib" + fi +fi + + +cleanup_gnulib() { + status=$? + rm -fr "$gnulib_path" + exit $status +} + +git_modules_config () { + test -f .gitmodules && git config --file .gitmodules "$@" +} + +if $use_gnulib; then + if $use_git; then + gnulib_path=$(git_modules_config submodule.gnulib.path) + test -z "$gnulib_path" && gnulib_path=gnulib + fi + + # Get gnulib files. Populate $GNULIB_SRCDIR, possibly updating a + # submodule, for use in the rest of the script. + + case ${GNULIB_SRCDIR--} in + -) + # Note that $use_git is necessarily true in this case. + if git_modules_config submodule.gnulib.url >/dev/null; then + echo "$0: getting gnulib files..." + git submodule init -- "$gnulib_path" || exit $? + git submodule update -- "$gnulib_path" || exit $? + + elif [ ! -d "$gnulib_path" ]; then + echo "$0: getting gnulib files..." + + trap cleanup_gnulib 1 2 13 15 + + shallow= + if test -z "$GNULIB_REVISION"; then + git clone -h 2>&1 | grep -- --depth > /dev/null && shallow='--depth 2' + fi + git clone $shallow ${GNULIB_URL:-$default_gnulib_url} "$gnulib_path" \ + || cleanup_gnulib + + trap - 1 2 13 15 + fi + GNULIB_SRCDIR=$gnulib_path + ;; + *) + # Use GNULIB_SRCDIR directly or as a reference. + if $use_git && test -d "$GNULIB_SRCDIR"/.git && \ + git_modules_config submodule.gnulib.url >/dev/null; then + echo "$0: getting gnulib files..." + if git submodule -h|grep -- --reference > /dev/null; then + # Prefer the one-liner available in git 1.6.4 or newer. + git submodule update --init --reference "$GNULIB_SRCDIR" \ + "$gnulib_path" || exit $? + else + # This fallback allows at least git 1.5.5. + if test -f "$gnulib_path"/gnulib-tool; then + # Since file already exists, assume submodule init already complete. + git submodule update -- "$gnulib_path" || exit $? + else + # Older git can't clone into an empty directory. + rmdir "$gnulib_path" 2>/dev/null + git clone --reference "$GNULIB_SRCDIR" \ + "$(git_modules_config submodule.gnulib.url)" "$gnulib_path" \ + && git submodule init -- "$gnulib_path" \ + && git submodule update -- "$gnulib_path" \ + || exit $? + fi + fi + GNULIB_SRCDIR=$gnulib_path + fi + ;; + esac + + if test -d "$GNULIB_SRCDIR"/.git && test -n "$GNULIB_REVISION" \ + && ! git_modules_config submodule.gnulib.url >/dev/null; then + (cd "$GNULIB_SRCDIR" && git checkout "$GNULIB_REVISION") || cleanup_gnulib + fi + + # $GNULIB_SRCDIR now points to the version of gnulib to use, and + # we no longer need to use git or $gnulib_path below here. + + if $bootstrap_sync; then + cmp -s "$0" "$GNULIB_SRCDIR/build-aux/bootstrap" || { + echo "$0: updating bootstrap and restarting..." + case $(sh -c 'echo "$1"' -- a) in + a) ignored=--;; + *) ignored=ignored;; + esac + exec sh -c \ + 'cp "$1" "$2" && shift && exec "${CONFIG_SHELL-/bin/sh}" "$@"' \ + $ignored "$GNULIB_SRCDIR/build-aux/bootstrap" \ + "$0" "$@" --no-bootstrap-sync + } + fi + + gnulib_tool=$GNULIB_SRCDIR/gnulib-tool + <$gnulib_tool || exit $? +fi + +# Get translations. + +download_po_files() { + subdir=$1 + domain=$2 + echo "$me: getting translations into $subdir for $domain..." + cmd=$(printf "$po_download_command_format" "$subdir" "$domain") + eval "$cmd" +} + +# Mirror .po files to $po_dir/.reference and copy only the new +# or modified ones into $po_dir. Also update $po_dir/LINGUAS. +# Note po files that exist locally only are left in $po_dir but will +# not be included in LINGUAS and hence will not be distributed. +update_po_files() { + # Directory containing primary .po files. + # Overwrite them only when we're sure a .po file is new. + po_dir=$1 + domain=$2 + + # Mirror *.po files into this dir. + # Usually contains *.s1 checksum files. + ref_po_dir="$po_dir/.reference" + + test -d $ref_po_dir || mkdir $ref_po_dir || return + download_po_files $ref_po_dir $domain \ + && ls "$ref_po_dir"/*.po 2>/dev/null | + sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS" || return + + langs=$(cd $ref_po_dir && echo *.po | sed 's/\.po//g') + test "$langs" = '*' && langs=x + for po in $langs; do + case $po in x) continue;; esac + new_po="$ref_po_dir/$po.po" + cksum_file="$ref_po_dir/$po.s1" + if ! test -f "$cksum_file" || + ! test -f "$po_dir/$po.po" || + ! $SHA1SUM -c "$cksum_file" < "$new_po" > /dev/null 2>&1; then + echo "$me: updated $po_dir/$po.po..." + cp "$new_po" "$po_dir/$po.po" \ + && $SHA1SUM < "$new_po" > "$cksum_file" || return + fi + done +} + +case $SKIP_PO in +'') + if test -d po; then + update_po_files po $package || exit + fi + + if test -d runtime-po; then + update_po_files runtime-po $package-runtime || exit + fi;; +esac + +symlink_to_dir() +{ + src=$1/$2 + dst=${3-$2} + + test -f "$src" && { + + # If the destination directory doesn't exist, create it. + # This is required at least for "lib/uniwidth/cjk.h". + dst_dir=$(dirname "$dst") + if ! test -d "$dst_dir"; then + mkdir -p "$dst_dir" + + # If we've just created a directory like lib/uniwidth, + # tell version control system(s) it's ignorable. + # FIXME: for now, this does only one level + parent=$(dirname "$dst_dir") + for dot_ig in x $vc_ignore; do + test $dot_ig = x && continue + ig=$parent/$dot_ig + insert_vc_ignore $ig "${dst_dir##*/}" + done + fi + + if $copy; then + { + test ! -h "$dst" || { + echo "$me: rm -f $dst" && + rm -f "$dst" + } + } && + test -f "$dst" && + cmp -s "$src" "$dst" || { + echo "$me: cp -fp $src $dst" && + cp -fp "$src" "$dst" + } + else + # Leave any existing symlink alone, if it already points to the source, + # so that broken build tools that care about symlink times + # aren't confused into doing unnecessary builds. Conversely, if the + # existing symlink's timestamp is older than the source, make it afresh, + # so that broken tools aren't confused into skipping needed builds. See + # . + test -h "$dst" && + src_ls=$(ls -diL "$src" 2>/dev/null) && set $src_ls && src_i=$1 && + dst_ls=$(ls -diL "$dst" 2>/dev/null) && set $dst_ls && dst_i=$1 && + test "$src_i" = "$dst_i" && + both_ls=$(ls -dt "$src" "$dst") && + test "X$both_ls" = "X$dst$nl$src" || { + dot_dots= + case $src in + /*) ;; + *) + case /$dst/ in + *//* | */../* | */./* | /*/*/*/*/*/) + die "invalid symlink calculation: $src -> $dst";; + /*/*/*/*/) dot_dots=../../../;; + /*/*/*/) dot_dots=../../;; + /*/*/) dot_dots=../;; + esac;; + esac + + echo "$me: ln -fs $dot_dots$src $dst" && + ln -fs "$dot_dots$src" "$dst" + } + fi + } +} + +version_controlled_file() { + parent=$1 + file=$2 + if test -d .git; then + git rm -n "$file" > /dev/null 2>&1 + elif test -d .svn; then + svn log -r HEAD "$file" > /dev/null 2>&1 + elif test -d CVS; then + grep -F "/${file##*/}/" "$parent/CVS/Entries" 2>/dev/null | + grep '^/[^/]*/[0-9]' > /dev/null + else + warn_ "no version control for $file?" + false + fi +} + +# NOTE: we have to be careful to run both autopoint and libtoolize +# before gnulib-tool, since gnulib-tool is likely to provide newer +# versions of files "installed" by these two programs. +# Then, *after* gnulib-tool (see below), we have to be careful to +# run autoreconf in such a way that it does not run either of these +# two just-pre-run programs. + +# Import from gettext. +with_gettext=yes +grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \ + with_gettext=no + +if test $with_gettext = yes || test $use_libtool = 1; then + + tempbase=.bootstrap$$ + trap "rm -f $tempbase.0 $tempbase.1" 1 2 13 15 + + > $tempbase.0 > $tempbase.1 && + find . ! -type d -print | sort > $tempbase.0 || exit + + if test $with_gettext = yes; then + # Released autopoint has the tendency to install macros that have been + # obsoleted in current gnulib, so run this before gnulib-tool. + echo "$0: $AUTOPOINT --force" + $AUTOPOINT --force || exit + fi + + # Autoreconf runs aclocal before libtoolize, which causes spurious + # warnings if the initial aclocal is confused by the libtoolized + # (or worse out-of-date) macro directory. + # libtoolize 1.9b added the --install option; but we support back + # to libtoolize 1.5.22, where the install action was default. + if test $use_libtool = 1; then + install= + case $($LIBTOOLIZE --help) in + *--install*) install=--install ;; + esac + echo "running: $LIBTOOLIZE $install --copy" + $LIBTOOLIZE $install --copy + fi + + find . ! -type d -print | sort >$tempbase.1 + old_IFS=$IFS + IFS=$nl + for file in $(comm -13 $tempbase.0 $tempbase.1); do + IFS=$old_IFS + parent=${file%/*} + version_controlled_file "$parent" "$file" || { + for dot_ig in x $vc_ignore; do + test $dot_ig = x && continue + ig=$parent/$dot_ig + insert_vc_ignore "$ig" "${file##*/}" + done + } + done + IFS=$old_IFS + + rm -f $tempbase.0 $tempbase.1 + trap - 1 2 13 15 +fi + +# Import from gnulib. + +if $use_gnulib; then + gnulib_tool_options="\ + --no-changelog\ + --aux-dir=$build_aux\ + --doc-base=$doc_base\ + --lib=$gnulib_name\ + --m4-base=$m4_base/\ + --source-base=$source_base/\ + --tests-base=$tests_base\ + --local-dir=$local_gl_dir\ + $gnulib_tool_option_extras\ + " + if test $use_libtool = 1; then + case "$gnulib_tool_options " in + *' --libtool '*) ;; + *) gnulib_tool_options="$gnulib_tool_options --libtool" ;; + esac + fi + echo "$0: $gnulib_tool $gnulib_tool_options --import ..." + $gnulib_tool $gnulib_tool_options --import $gnulib_modules \ + || die "gnulib-tool failed" + + for file in $gnulib_files; do + symlink_to_dir "$GNULIB_SRCDIR" $file \ + || die "failed to symlink $file" + done +fi + +bootstrap_post_import_hook \ + || die "bootstrap_post_import_hook failed" + +# Don't proceed if there are uninitialized submodules. In particular, +# the next step will remove dangling links, which might be links into +# uninitialized submodules. +# +# Uninitialized submodules are listed with an initial dash. +if $use_git && git submodule | grep '^-' >/dev/null; then + die "some git submodules are not initialized. " \ + "Run 'git submodule init' and bootstrap again." +fi + +# Remove any dangling symlink matching "*.m4" or "*.[ch]" in some +# gnulib-populated directories. Such .m4 files would cause aclocal to fail. +# The following requires GNU find 4.2.3 or newer. Considering the usual +# portability constraints of this script, that may seem a very demanding +# requirement, but it should be ok. Ignore any failure, which is fine, +# since this is only a convenience to help developers avoid the relatively +# unusual case in which a symlinked-to .m4 file is git-removed from gnulib +# between successive runs of this script. +find "$m4_base" "$source_base" \ + -depth \( -name '*.m4' -o -name '*.[ch]' \) \ + -type l -xtype l -delete > /dev/null 2>&1 + +# Invoke autoreconf with --force --install to ensure upgrades of tools +# such as ylwrap. +AUTORECONFFLAGS="--verbose --install --force -I $m4_base $ACLOCAL_FLAGS" + +# Some systems (RHEL 5) are using ancient autotools, for which the +# --no-recursive option had not been invented. Detect that lack and +# omit the option when it's not supported. FIXME in 2017: remove this +# hack when RHEL 5 autotools are updated, or when they become irrelevant. +case $($AUTORECONF --help) in + *--no-recursive*) AUTORECONFFLAGS="$AUTORECONFFLAGS --no-recursive";; +esac + +# Tell autoreconf not to invoke autopoint or libtoolize; they were run above. +echo "running: AUTOPOINT=true LIBTOOLIZE=true $AUTORECONF $AUTORECONFFLAGS" +AUTOPOINT=true LIBTOOLIZE=true $AUTORECONF $AUTORECONFFLAGS \ + || die "autoreconf failed" + +# Get some extra files from gnulib, overriding existing files. +for file in $gnulib_extra_files; do + case $file in + */INSTALL) dst=INSTALL;; + build-aux/*) dst=$build_aux/${file#build-aux/};; + *) dst=$file;; + esac + symlink_to_dir "$GNULIB_SRCDIR" $file $dst \ + || die "failed to symlink $file" +done + +if test $with_gettext = yes; then + # Create gettext configuration. + echo "$0: Creating po/Makevars from po/Makevars.template ..." + rm -f po/Makevars + sed ' + /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/ + /^COPYRIGHT_HOLDER *=/s/=.*/= '"$COPYRIGHT_HOLDER"'/ + /^MSGID_BUGS_ADDRESS *=/s|=.*|= '"$MSGID_BUGS_ADDRESS"'| + /^XGETTEXT_OPTIONS *=/{ + s/$/ \\/ + a\ + '"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+} + } + ' po/Makevars.template >po/Makevars \ + || die 'cannot generate po/Makevars' + + # If the 'gettext' module is in use, grab the latest Makefile.in.in. + # If only the 'gettext-h' module is in use, assume autopoint already + # put the correct version of this file into place. + case $gnulib_modules in + *gettext-h*) ;; + *gettext*) + cp $GNULIB_SRCDIR/build-aux/po/Makefile.in.in po/Makefile.in.in \ + || die "cannot create po/Makefile.in.in" + ;; + esac + + if test -d runtime-po; then + # Similarly for runtime-po/Makevars, but not quite the same. + rm -f runtime-po/Makevars + sed ' + /^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/ + /^subdir *=.*/s/=.*/= runtime-po/ + /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/ + /^XGETTEXT_OPTIONS *=/{ + s/$/ \\/ + a\ + '"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+} + } + ' po/Makevars.template >runtime-po/Makevars \ + || die 'cannot generate runtime-po/Makevars' + + # Copy identical files from po to runtime-po. + (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po) + fi +fi + +bootstrap_epilogue + +echo "$0: done. Now you can run './configure'." + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/bootstrap.conf b/bootstrap.conf new file mode 100644 index 0000000..988dda0 --- /dev/null +++ b/bootstrap.conf @@ -0,0 +1,91 @@ +# Bootstrap configuration. + +# Copyright (C) 2006-2019 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +GNULIB_REVISION=d271f868a8df9bbec29049d01e056481b7a1a263 + +# gnulib modules used by this package. +# mbswidth is used by gnulib-fix-width.diff's changes to argp rather than +# directly. +gnulib_modules=" + argp + error + fnmatch + getdelim + getline + gettext-h + gitlog-to-changelog + mbswidth + progname + realloc-gnu + regex + save-cwd +" + +gnulib_tool_option_extras="\ + --no-conditional-dependencies \ + --no-vc-files \ +" + +gnulib_name=libgnu +source_base=grub-core/lib/gnulib +gnulib_extra_files=" + build-aux/install-sh + build-aux/mdate-sh + build-aux/texinfo.tex + build-aux/depcomp + build-aux/config.guess + build-aux/config.sub +" + +# Additional xgettext options to use. Use "\\\newline" to break lines. +XGETTEXT_OPTIONS=$XGETTEXT_OPTIONS'\\\ + --from-code=UTF-8\\\ +' + +checkout_only_file= +copy=true +vc_ignore= + +SKIP_PO=t + +# Build prerequisites +buildreq="\ +autoconf 2.63 +automake 1.11 +gettext 0.18.3 +git 1.5.5 +tar - +" + +# bootstrap doesn't give us a reasonable way to stop Automake from +# overwriting this, so we just copy our version aside and put it back later. +cp -a INSTALL INSTALL.grub + +bootstrap_post_import_hook () { + set -e + for patchname in fix-null-deref fix-width no-abort; do + patch -d grub-core/lib/gnulib -p2 \ + < "grub-core/lib/gnulib-patches/$patchname.patch" + done + FROM_BOOTSTRAP=1 ./autogen.sh + set +e # bootstrap expects this +} + +bootstrap_epilogue () { + mv INSTALL.grub INSTALL +} diff --git a/do-rebase b/do-rebase index ca10bf9..1f9b21c 100755 --- a/do-rebase +++ b/do-rebase @@ -155,9 +155,21 @@ fi unset LC_ALL git rm -q 0*.patch -> release-to-master.patch -othergit diff --full-index --binary $diff_ops grub-2.02..refs/remotes/rhboot/master > release-to-master.patch -git add release-to-master.patch +# No need for this patch anymore, the package is rebased on latest release now. +#> release-to-master.patch +#othergit diff --full-index --binary $diff_ops grub-2.04..refs/remotes/rhboot/master > release-to-master.patch +#git add release-to-master.patch + +fedpkg sources +curl -L https://github.com/rhboot/gnulib/archive/fixes.tar.gz > gnulib-fixes.tar.gz.new +if cmp -s gnulib-fixes.tar.gz gnulib-fixes.tar.gz.new; then + rm gnulib-fixes.tar.gz.new +else + mv gnulib-fixes.tar.gz.new gnulib-fixes.tar.gz + sed -i -e '/gnulib-/d' sources + fedpkg upload gnulib-fixes.tar.gz + git add sources +fi > grub.patches patches=$(formatpatch refs/remotes/rhboot/master..refs/remotes/rhboot/${releasever}) diff --git a/gitignore b/gitignore index eca17be..819cd18 100644 --- a/gitignore +++ b/gitignore @@ -1,3 +1,4 @@ +*~ 00_header 10_* 20_linux_xen @@ -6,11 +7,13 @@ 41_custom *.1 *.8 +ABOUT-NLS aclocal.m4 ahci_test ascii.bitmaps ascii.h autom4te.cache +build-aux build-grub-gen-asciih build-grub-gen-widthspec build-grub-mkfont @@ -42,6 +45,7 @@ gensymlist.sh gentrigtables gentrigtables.exe gettext_strings_test +/gnulib grub-bin2h /grub-bios-setup /grub-bios-setup.exe @@ -134,6 +138,7 @@ help_test *.image.exe include/grub/cpu include/grub/machine +INSTALL.grub install-sh lib/libgcrypt-grub libgrub_a_init.c @@ -142,6 +147,7 @@ libgrub_a_init.c lzocompress_test *.marker Makefile +/m4 *.mod mod-*.c missing @@ -155,7 +161,11 @@ pata_test *.pp po/*.mo po/grub.pot +po/Makefile.in.in +po/Makevars +po/Makevars.template po/POTFILES +po/Rules-quot po/stamp-po printf_test priority_queue_unit_test @@ -202,25 +212,7 @@ grub-core/*.module.exe grub-core/*.pp grub-core/kernel.img.bin util/bash-completion.d/grub -grub-core/gnulib/alloca.h -grub-core/gnulib/arg-nonnull.h -grub-core/gnulib/c++defs.h -grub-core/gnulib/charset.alias -grub-core/gnulib/configmake.h -grub-core/gnulib/float.h -grub-core/gnulib/getopt.h -grub-core/gnulib/langinfo.h -grub-core/gnulib/ref-add.sed -grub-core/gnulib/ref-del.sed -grub-core/gnulib/stdio.h -grub-core/gnulib/stdlib.h -grub-core/gnulib/string.h -grub-core/gnulib/strings.h -grub-core/gnulib/sys -grub-core/gnulib/unistd.h -grub-core/gnulib/warn-on-use.h -grub-core/gnulib/wchar.h -grub-core/gnulib/wctype.h +grub-core/lib/gnulib grub-core/rs_decoder.h widthspec.bin widthspec.h @@ -239,10 +231,6 @@ po/POTFILES-shell.in /grub-render-label /grub-glue-efi.exe /grub-render-label.exe -grub-core/gnulib/locale.h -grub-core/gnulib/unitypes.h -grub-core/gnulib/uniwidth.h -build-aux/test-driver /garbage-gen /garbage-gen.exe /grub-fs-tester diff --git a/grub.macros b/grub.macros index 6b9c005..5da3592 100644 --- a/grub.macros +++ b/grub.macros @@ -312,7 +312,12 @@ This subpackage provides optional components of grub used with removeable media %setup -q -n grub-%{tarversion} \ rm -fv docs/*.info \ cp %{SOURCE6} .gitignore \ -cp %{SOURCE8} ./grub-core/tests/strtoull_test.c \ +cp %{SOURCE7} bootstrap \ +cp %{SOURCE8} bootstrap.conf \ +cp %{SOURCE9} ./grub-core/tests/strtoull_test.c \ +cp %{SOURCE12} gnulib-%{gnulibversion}.tar.gz \ +tar -zxf gnulib-%{gnulibversion}.tar.gz \ +mv gnulib-%{gnulibversion} gnulib \ git init \ echo '![[:digit:]][[:digit:]]_*.in' > util/grub.d/.gitignore \ echo '!*.[[:digit:]]' > util/.gitignore \ @@ -323,14 +328,12 @@ git config gc.auto 0 \ rm -f configure \ git add . \ git commit -a -q -m "%{tarversion} baseline." \ -git apply --index --whitespace=nowarn %{SOURCE3} \ -git commit -a -q -m "%{tarversion} master." \ +#git apply --index --whitespace=nowarn %{SOURCE3} \ +#git commit -a -q -m "%{tarversion} master." \ git am --whitespace=nowarn %%{patches} - 2.04-1 +- Update to 2.04 + Resolves: rhbz#1727279 + * Wed Aug 07 2019 Javier Martinez Canillas - 2.02-97 - Include regexp module in EFI builds diff --git a/release-to-master.patch b/release-to-master.patch deleted file mode 100644 index a1b6e6a..0000000 --- a/release-to-master.patch +++ /dev/null @@ -1,16760 +0,0 @@ -diff --git a/configure.ac b/configure.ac -index edd184154f7e9aad556b6437b8ec22bc79d5a057..c7888e40f6695ee23a43fb98420d6cbcd3d86622 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -31,7 +31,7 @@ dnl (such as BUILD_CC, BUILD_CFLAGS, etc.) for the build type and variables - dnl with the prefix "TARGET_" (such as TARGET_CC, TARGET_CFLAGS, etc.) are - dnl used for the target type. See INSTALL for full list of variables. - --AC_INIT([GRUB],[2.02],[bug-grub@gnu.org]) -+AC_INIT([GRUB],[2.03],[bug-grub@gnu.org]) - - AC_CONFIG_AUX_DIR([build-aux]) - -@@ -167,6 +167,7 @@ case "$target_cpu"-"$platform" in - mipsel-fuloong) platform=loongson ;; - mipsel-loongson) ;; - arm-uboot) ;; -+ arm-coreboot) ;; - arm-efi) ;; - arm64-efi) ;; - *-emu) ;; -@@ -203,7 +204,8 @@ case "$host_os" in - esac - - case "$host_os" in -- cygwin | windows* | mingw32*) have_exec=n ;; -+ cygwin) have_exec=y ;; -+ windows* | mingw32*) have_exec=n ;; - aros*) have_exec=n ;; - *) have_exec=y;; - esac -@@ -373,7 +375,10 @@ case "$host_os" in - ;; - *) - AC_CHECK_SIZEOF(off_t) -- test x"$ac_cv_sizeof_off_t" = x8 || AC_MSG_ERROR([Large file support is required]);; -+ if test x"$ac_cv_sizeof_off_t" != x8 ; then -+ AC_CHECK_SIZEOF(off64_t) -+ test x"$ac_cv_sizeof_off64_t" = x8 || AC_MSG_ERROR([Large file support is required]) -+ fi;; - esac - - if test x$USE_NLS = xno; then -@@ -456,6 +461,16 @@ case "$build_os" in - esac - AC_SUBST(BUILD_EXEEXT) - -+# In some build environments like termux /bin/sh is not a valid -+# shebang. Use $SHELL instead if it's executable and /bin/sh isn't -+BUILD_SHEBANG=/bin/sh -+for she in /bin/sh "$SHELL"; do -+ if test -x "$she" ; then -+ BUILD_SHEBANG="$she" -+ fi -+done -+AC_SUBST(BUILD_SHEBANG) -+ - # For gnulib. - gl_INIT - -@@ -1905,6 +1920,7 @@ AM_CONDITIONAL([COND_mipsel], [test x$target_cpu = xmipsel]) - AM_CONDITIONAL([COND_mipseb], [test x$target_cpu = xmips]) - AM_CONDITIONAL([COND_arm], [test x$target_cpu = xarm ]) - AM_CONDITIONAL([COND_arm_uboot], [test x$target_cpu = xarm -a x$platform = xuboot]) -+AM_CONDITIONAL([COND_arm_coreboot], [test x$target_cpu = xarm -a x$platform = xcoreboot]) - AM_CONDITIONAL([COND_arm_efi], [test x$target_cpu = xarm -a x$platform = xefi]) - AM_CONDITIONAL([COND_arm64], [test x$target_cpu = xarm64 ]) - AM_CONDITIONAL([COND_arm64_efi], [test x$target_cpu = xarm64 -a x$platform = xefi]) -diff --git a/Makefile.util.def b/Makefile.util.def -index f9caccb9780ffe8d4b31c8a19399ba7bbd308e56..3180ac880a9aa86e94fb47a7386bfa324425bff0 100644 ---- a/Makefile.util.def -+++ b/Makefile.util.def -@@ -99,6 +99,7 @@ library = { - common = grub-core/fs/ext2.c; - common = grub-core/fs/fat.c; - common = grub-core/fs/exfat.c; -+ common = grub-core/fs/f2fs.c; - common = grub-core/fs/fshelp.c; - common = grub-core/fs/hfs.c; - common = grub-core/fs/hfsplus.c; -@@ -774,6 +775,12 @@ script = { - common = tests/xfs_test.in; - }; - -+script = { -+ testcase; -+ name = f2fs_test; -+ common = tests/f2fs_test.in; -+}; -+ - script = { - testcase; - name = nilfs2_test; -diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def -index 2dfa22a9271bd6624fad9b91ce051ac12202dfbd..9590e87d9c080d6675a9521d91ef6a47d39f2751 100644 ---- a/grub-core/Makefile.core.def -+++ b/grub-core/Makefile.core.def -@@ -68,11 +68,11 @@ kernel = { - i386_pc_ldflags = '$(TARGET_IMG_LDFLAGS)'; - i386_pc_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x9000'; - i386_qemu_ldflags = '$(TARGET_IMG_LDFLAGS)'; -- i386_qemu_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x8200'; -+ i386_qemu_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x9000'; - i386_coreboot_ldflags = '$(TARGET_IMG_LDFLAGS)'; -- i386_coreboot_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x8200'; -+ i386_coreboot_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x9000'; - i386_multiboot_ldflags = '$(TARGET_IMG_LDFLAGS)'; -- i386_multiboot_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x8200'; -+ i386_multiboot_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x9000'; - i386_ieee1275_ldflags = '$(TARGET_IMG_LDFLAGS)'; - i386_ieee1275_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x10000'; - i386_xen_ldflags = '$(TARGET_IMG_LDFLAGS)'; -@@ -92,6 +92,8 @@ kernel = { - emu_cppflags = '$(CPPFLAGS_GNULIB)'; - arm_uboot_ldflags = '-Wl,-r,-d'; - arm_uboot_stripflags = '--strip-unneeded -K start -R .note -R .comment -R .note.gnu.gold-version'; -+ arm_coreboot_ldflags = '-Wl,-r,-d'; -+ arm_coreboot_stripflags = '--strip-unneeded -K start -R .note -R .comment -R .note.gnu.gold-version'; - - i386_pc_startup = kern/i386/pc/startup.S; - i386_efi_startup = kern/i386/efi/startup.S; -@@ -105,7 +107,8 @@ kernel = { - mips_startup = kern/mips/startup.S; - sparc64_ieee1275_startup = kern/sparc64/ieee1275/crt0.S; - powerpc_ieee1275_startup = kern/powerpc/ieee1275/startup.S; -- arm_uboot_startup = kern/arm/uboot/startup.S; -+ arm_uboot_startup = kern/arm/startup.S; -+ arm_coreboot_startup = kern/arm/startup.S; - arm_efi_startup = kern/arm/efi/startup.S; - arm64_efi_startup = kern/arm64/efi/startup.S; - -@@ -149,6 +152,21 @@ kernel = { - uboot = kern/uboot/init.c; - uboot = kern/uboot/hw.c; - uboot = term/uboot/console.c; -+ arm_uboot = kern/arm/uboot/init.c; -+ arm_uboot = kern/arm/uboot/uboot.S; -+ -+ arm_coreboot = kern/arm/coreboot/init.c; -+ arm_coreboot = kern/arm/coreboot/timer.c; -+ arm_coreboot = kern/arm/coreboot/coreboot.S; -+ arm_coreboot = lib/fdt.c; -+ arm_coreboot = bus/fdt.c; -+ arm_coreboot = term/ps2.c; -+ arm_coreboot = term/arm/pl050.c; -+ arm_coreboot = term/arm/cros.c; -+ arm_coreboot = term/arm/cros_ec.c; -+ arm_coreboot = bus/spi/rk3288_spi.c; -+ arm_coreboot = commands/keylayouts.c; -+ arm_coreboot = kern/arm/coreboot/dma.c; - - terminfoinkernel = term/terminfo.c; - terminfoinkernel = term/tparm.c; -@@ -164,7 +182,7 @@ kernel = { - i386_multiboot = kern/i386/coreboot/init.c; - i386_qemu = kern/i386/qemu/init.c; - i386_coreboot_multiboot_qemu = term/i386/pc/vga_text.c; -- i386_coreboot = video/i386/coreboot/cbfb.c; -+ coreboot = video/coreboot/cbfb.c; - - efi = disk/efi/efidisk.c; - efi = kern/efi/efi.c; -@@ -211,7 +229,6 @@ kernel = { - ia64_efi = kern/ia64/cache.c; - - arm_efi = kern/arm/efi/init.c; -- arm_efi = kern/arm/efi/misc.c; - arm_efi = kern/efi/fdt.c; - - arm64_efi = kern/arm64/efi/init.c; -@@ -225,8 +242,10 @@ kernel = { - i386_qemu = kern/vga_init.c; - i386_qemu = kern/i386/qemu/mmap.c; - -- i386_coreboot = kern/i386/coreboot/mmap.c; -+ coreboot = kern/coreboot/mmap.c; - i386_coreboot = kern/i386/coreboot/cbtable.c; -+ coreboot = kern/coreboot/cbtable.c; -+ arm_coreboot = kern/arm/coreboot/cbtable.c; - - i386_multiboot = kern/i386/multiboot_mmap.c; - -@@ -238,6 +257,7 @@ kernel = { - mips_qemu_mips = term/ns8250.c; - mips_qemu_mips = term/serial.c; - mips_qemu_mips = term/at_keyboard.c; -+ mips_qemu_mips = term/ps2.c; - mips_qemu_mips = commands/boot.c; - mips_qemu_mips = commands/keylayouts.c; - mips_qemu_mips = term/i386/pc/vga_text.c; -@@ -253,6 +273,7 @@ kernel = { - mips_loongson = bus/pci.c; - mips_loongson = kern/mips/loongson/init.c; - mips_loongson = term/at_keyboard.c; -+ mips_loongson = term/ps2.c; - mips_loongson = commands/boot.c; - mips_loongson = term/serial.c; - mips_loongson = video/sm712.c; -@@ -574,7 +595,10 @@ module = { - module = { - name = ehci; - common = bus/usb/ehci.c; -+ arm_coreboot = bus/usb/ehci-fdt.c; -+ pci = bus/usb/ehci-pci.c; - enable = pci; -+ enable = arm_coreboot; - }; - - module = { -@@ -641,6 +665,7 @@ module = { - module = { - name = cbtable; - common = kern/i386/coreboot/cbtable.c; -+ common = kern/coreboot/cbtable.c; - enable = i386_pc; - enable = i386_efi; - enable = i386_qemu; -@@ -754,6 +779,7 @@ module = { - enable = arm_efi; - enable = arm64_efi; - enable = arm_uboot; -+ enable = arm_coreboot; - }; - - module = { -@@ -837,17 +863,14 @@ module = { - efi = lib/efi/halt.c; - ieee1275 = lib/ieee1275/halt.c; - emu = lib/emu/halt.c; -- uboot = lib/uboot/halt.c; -+ uboot = lib/dummy/halt.c; -+ arm_coreboot = lib/dummy/halt.c; - }; - - module = { - name = reboot; - i386 = lib/i386/reboot.c; - i386 = lib/i386/reboot_trampoline.S; -- ia64_efi = lib/efi/reboot.c; -- x86_64_efi = lib/efi/reboot.c; -- arm_efi = lib/efi/reboot.c; -- arm64_efi = lib/efi/reboot.c; - powerpc_ieee1275 = lib/ieee1275/reboot.c; - sparc64_ieee1275 = lib/ieee1275/reboot.c; - mips_arc = lib/mips/arc/reboot.c; -@@ -855,6 +878,7 @@ module = { - mips_qemu_mips = lib/mips/qemu_mips/reboot.c; - xen = lib/xen/reboot.c; - uboot = lib/uboot/reboot.c; -+ arm_coreboot = lib/dummy/reboot.c; - common = commands/reboot.c; - }; - -@@ -873,7 +897,6 @@ module = { - module = { - name = hdparm; - common = commands/hdparm.c; -- common = lib/hexdump.c; - enable = pci; - enable = mips_qemu_mips; - }; -@@ -1290,6 +1313,11 @@ module = { - common = fs/exfat.c; - }; - -+module = { -+ name = f2fs; -+ common = fs/f2fs.c; -+}; -+ - module = { - name = fshelp; - common = fs/fshelp.c; -@@ -1548,7 +1576,8 @@ module = { - name = datetime; - cmos = lib/cmos_datetime.c; - efi = lib/efi/datetime.c; -- uboot = lib/uboot/datetime.c; -+ uboot = lib/dummy/datetime.c; -+ arm_coreboot = lib/dummy/datetime.c; - sparc64_ieee1275 = lib/ieee1275/datetime.c; - powerpc_ieee1275 = lib/ieee1275/datetime.c; - sparc64_ieee1275 = lib/ieee1275/cmos.c; -@@ -1601,8 +1630,6 @@ module = { - module = { - name = linux16; - common = loader/i386/pc/linux.c; -- common = loader/linux.c; -- common = lib/cmdline.c; - enable = x86; - }; - -@@ -1637,7 +1664,6 @@ module = { - cppflags = "-DGRUB_USE_MULTIBOOT2"; - - common = loader/multiboot.c; -- common = lib/cmdline.c; - common = loader/multiboot_mbi2.c; - enable = x86; - enable = mips; -@@ -1646,7 +1672,6 @@ module = { - module = { - name = multiboot; - common = loader/multiboot.c; -- common = lib/cmdline.c; - x86 = loader/i386/multiboot_mbi.c; - extra_dist = loader/multiboot_elfxx.c; - enable = x86; -@@ -1654,7 +1679,6 @@ module = { - - module = { - name = xen_boot; -- common = lib/cmdline.c; - arm64 = loader/arm64/xen_boot.c; - enable = arm64; - }; -@@ -1668,7 +1692,9 @@ module = { - powerpc_ieee1275 = loader/powerpc/ieee1275/linux.c; - sparc64_ieee1275 = loader/sparc64/ieee1275/linux.c; - ia64_efi = loader/ia64/efi/linux.c; -- arm = loader/arm/linux.c; -+ arm_coreboot = loader/arm/linux.c; -+ arm_efi = loader/arm64/linux.c; -+ arm_uboot = loader/arm/linux.c; - arm64 = loader/arm64/linux.c; - common = loader/linux.c; - common = lib/cmdline.c; -@@ -1677,7 +1703,7 @@ module = { - - module = { - name = fdt; -- arm64 = loader/arm64/fdt.c; -+ efi = loader/efi/fdt.c; - common = lib/fdt.c; - enable = fdt; - }; -@@ -1869,6 +1895,7 @@ module = { - module = { - name = at_keyboard; - common = term/at_keyboard.c; -+ common = term/ps2.c; - enable = x86; - }; - -@@ -1961,6 +1988,11 @@ module = { - common = tests/example_functional_test.c; - }; - -+module = { -+ name = strtoull_test; -+ common = tests/strtoull_test.c; -+}; -+ - module = { - name = setjmp_test; - common = tests/setjmp_test.c; -diff --git a/grub-core/bus/fdt.c b/grub-core/bus/fdt.c -new file mode 100644 -index 0000000000000000000000000000000000000000..135da497ba67e7545490e0e73ee3a1fa676a6069 ---- /dev/null -+++ b/grub-core/bus/fdt.c -@@ -0,0 +1,256 @@ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * Copyright (C) 2016 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 -+ -+static const void *dtb; -+static grub_size_t root_address_cells, root_size_cells; -+/* Pointer to this symbol signals invalid mapping. */ -+char grub_fdtbus_invalid_mapping[1]; -+ -+struct grub_fdtbus_dev *devs; -+struct grub_fdtbus_driver *drivers; -+ -+int -+grub_fdtbus_is_compatible (const char *compat_string, -+ const struct grub_fdtbus_dev *dev) -+{ -+ grub_size_t compatible_size; -+ const char *compatible = grub_fdt_get_prop (dtb, dev->node, "compatible", -+ &compatible_size); -+ if (!compatible) -+ return 0; -+ const char *compatible_end = compatible + compatible_size; -+ while (compatible < compatible_end) -+ { -+ if (grub_strcmp (compat_string, compatible) == 0) -+ return 1; -+ compatible += grub_strlen (compatible) + 1; -+ } -+ return 0; -+} -+ -+static void -+fdtbus_scan (struct grub_fdtbus_dev *parent) -+{ -+ int node; -+ for (node = grub_fdt_first_node (dtb, parent ? parent->node : 0); node >= 0; -+ node = grub_fdt_next_node (dtb, node)) -+ { -+ struct grub_fdtbus_dev *dev; -+ struct grub_fdtbus_driver *driver; -+ dev = grub_zalloc (sizeof (*dev)); -+ if (!dev) -+ { -+ grub_print_error (); -+ return; -+ } -+ dev->node = node; -+ dev->next = devs; -+ dev->parent = parent; -+ devs = dev; -+ FOR_LIST_ELEMENTS(driver, drivers) -+ if (!dev->driver && grub_fdtbus_is_compatible (driver->compatible, dev)) -+ { -+ grub_dprintf ("fdtbus", "Attaching %s\n", driver->compatible); -+ if (driver->attach (dev) == GRUB_ERR_NONE) -+ { -+ grub_dprintf ("fdtbus", "Attached %s\n", driver->compatible); -+ dev->driver = driver; -+ break; -+ } -+ grub_print_error (); -+ } -+ fdtbus_scan (dev); -+ } -+} -+ -+void -+grub_fdtbus_register (struct grub_fdtbus_driver *driver) -+{ -+ struct grub_fdtbus_dev *dev; -+ grub_dprintf ("fdtbus", "Registering %s\n", driver->compatible); -+ grub_list_push (GRUB_AS_LIST_P (&drivers), -+ GRUB_AS_LIST (driver)); -+ for (dev = devs; dev; dev = dev->next) -+ if (!dev->driver && grub_fdtbus_is_compatible (driver->compatible, dev)) -+ { -+ grub_dprintf ("fdtbus", "Attaching %s (%p)\n", driver->compatible, dev); -+ if (driver->attach (dev) == GRUB_ERR_NONE) -+ { -+ grub_dprintf ("fdtbus", "Attached %s\n", driver->compatible); -+ dev->driver = driver; -+ } -+ grub_print_error (); -+ } -+} -+ -+void -+grub_fdtbus_unregister (struct grub_fdtbus_driver *driver) -+{ -+ grub_list_remove (GRUB_AS_LIST (driver)); -+ struct grub_fdtbus_dev *dev; -+ for (dev = devs; dev; dev = dev->next) -+ if (dev->driver == driver) -+ { -+ if (driver->detach) -+ driver->detach(dev); -+ dev->driver = 0; -+ } -+} -+ -+void -+grub_fdtbus_init (const void *dtb_in, grub_size_t size) -+{ -+ if (!dtb_in || grub_fdt_check_header (dtb_in, size) < 0) -+ grub_fatal ("invalid FDT"); -+ dtb = dtb_in; -+ const grub_uint32_t *prop = grub_fdt_get_prop (dtb, 0, "#address-cells", 0); -+ if (prop) -+ root_address_cells = grub_be_to_cpu32 (*prop); -+ else -+ root_address_cells = 1; -+ -+ prop = grub_fdt_get_prop (dtb, 0, "#size-cells", 0); -+ if (prop) -+ root_size_cells = grub_be_to_cpu32 (*prop); -+ else -+ root_size_cells = 1; -+ -+ fdtbus_scan (0); -+} -+ -+static int -+get_address_cells (const struct grub_fdtbus_dev *dev) -+{ -+ const grub_uint32_t *prop; -+ if (!dev) -+ return root_address_cells; -+ prop = grub_fdt_get_prop (dtb, dev->node, "#address-cells", 0); -+ if (prop) -+ return grub_be_to_cpu32 (*prop); -+ return 1; -+} -+ -+static int -+get_size_cells (const struct grub_fdtbus_dev *dev) -+{ -+ const grub_uint32_t *prop; -+ if (!dev) -+ return root_size_cells; -+ prop = grub_fdt_get_prop (dtb, dev->node, "#size-cells", 0); -+ if (prop) -+ return grub_be_to_cpu32 (*prop); -+ return 1; -+} -+ -+static grub_uint64_t -+get64 (const grub_uint32_t *reg, grub_size_t cells) -+{ -+ grub_uint64_t val = 0; -+ if (cells >= 1) -+ val = grub_be_to_cpu32 (reg[cells - 1]); -+ if (cells >= 2) -+ val |= ((grub_uint64_t) grub_be_to_cpu32 (reg[cells - 2])) << 32; -+ return val; -+} -+ -+static volatile void * -+translate (const struct grub_fdtbus_dev *dev, const grub_uint32_t *reg) -+{ -+ volatile void *ret; -+ const grub_uint32_t *ranges; -+ grub_size_t ranges_size, cells_per_mapping; -+ grub_size_t parent_address_cells, child_address_cells, child_size_cells; -+ grub_size_t nmappings, i; -+ if (dev == 0) -+ { -+ grub_uint64_t val; -+ val = get64 (reg, root_address_cells); -+ if (sizeof (void *) == 4 && (val >> 32)) -+ return grub_fdtbus_invalid_mapping; -+ return (void *) (grub_addr_t) val; -+ } -+ ranges = grub_fdt_get_prop (dtb, dev->node, "ranges", &ranges_size); -+ if (!ranges) -+ return grub_fdtbus_invalid_mapping; -+ if (ranges_size == 0) -+ return translate (dev->parent, reg); -+ parent_address_cells = get_address_cells (dev->parent); -+ child_address_cells = get_address_cells (dev); -+ child_size_cells = get_size_cells (dev); -+ cells_per_mapping = parent_address_cells + child_address_cells + child_size_cells; -+ nmappings = ranges_size / 4 / cells_per_mapping; -+ for (i = 0; i < nmappings; i++) -+ { -+ const grub_uint32_t *child_addr = &ranges[i * cells_per_mapping]; -+ const grub_uint32_t *parent_addr = child_addr + child_address_cells; -+ grub_uint64_t child_size = get64 (parent_addr + parent_address_cells, child_size_cells); -+ -+ if (child_address_cells > 2 && grub_memcmp (reg, child_addr, (child_address_cells - 2) * 4) != 0) -+ continue; -+ if (get64 (reg, child_address_cells) < get64 (child_addr, child_address_cells)) -+ continue; -+ -+ grub_uint64_t offset = get64 (reg, child_address_cells) - get64 (child_addr, child_address_cells); -+ if (offset >= child_size) -+ continue; -+ -+ ret = translate (dev->parent, parent_addr); -+ if (grub_fdtbus_is_mapping_valid (ret)) -+ ret = (volatile char *) ret + offset; -+ return ret; -+ } -+ return grub_fdtbus_invalid_mapping; -+} -+ -+volatile void * -+grub_fdtbus_map_reg (const struct grub_fdtbus_dev *dev, int regno, grub_size_t *size) -+{ -+ grub_size_t address_cells, size_cells; -+ address_cells = get_address_cells (dev->parent); -+ size_cells = get_size_cells (dev->parent); -+ const grub_uint32_t *reg = grub_fdt_get_prop (dtb, dev->node, "reg", 0); -+ if (size && size_cells) -+ *size = reg[(address_cells + size_cells) * regno + address_cells]; -+ if (size && !size_cells) -+ *size = 0; -+ return translate (dev->parent, reg + (address_cells + size_cells) * regno); -+} -+ -+const char * -+grub_fdtbus_get_name (const struct grub_fdtbus_dev *dev) -+{ -+ return grub_fdt_get_nodename (dtb, dev->node); -+} -+ -+const void * -+grub_fdtbus_get_prop (const struct grub_fdtbus_dev *dev, -+ const char *name, -+ grub_uint32_t *len) -+{ -+ return grub_fdt_get_prop (dtb, dev->node, name, len); -+} -+ -+const void * -+grub_fdtbus_get_fdt (void) -+{ -+ return dtb; -+} -diff --git a/grub-core/bus/spi/rk3288_spi.c b/grub-core/bus/spi/rk3288_spi.c -new file mode 100644 -index 0000000000000000000000000000000000000000..aacb79ffef103bdbff1bb66dd70229b85b1e8030 ---- /dev/null -+++ b/grub-core/bus/spi/rk3288_spi.c -@@ -0,0 +1,103 @@ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * -+ * Copyright (C) 2012 Google Inc. -+ * Copyright (C) 2016 Free Software Foundation, Inc. -+ * -+ * This is based on depthcharge code. -+ * -+ * 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 -+ -+static grub_err_t -+spi_send (const struct grub_fdtbus_dev *dev, const void *data, grub_size_t sz) -+{ -+ const grub_uint8_t *ptr = data, *end = ptr + sz; -+ volatile grub_uint32_t *spi = grub_fdtbus_map_reg (dev, 0, 0); -+ spi[2] = 0; -+ spi[1] = sz - 1; -+ spi[0] = ((1 << 18) | spi[0]) & ~(1 << 19); -+ spi[2] = 1; -+ while (ptr < end) -+ { -+ while (spi[9] & 2); -+ spi[256] = *ptr++; -+ } -+ while (spi[9] & 1); -+ return GRUB_ERR_NONE; -+} -+ -+static grub_err_t -+spi_receive (const struct grub_fdtbus_dev *dev, void *data, grub_size_t sz) -+{ -+ grub_uint8_t *ptr = data, *end = ptr + sz; -+ volatile grub_uint32_t *spi = grub_fdtbus_map_reg (dev, 0, 0); -+ spi[2] = 0; -+ spi[1] = sz - 1; -+ spi[0] = ((1 << 19) | spi[0]) & ~(1 << 18); -+ spi[2] = 1; -+ while (ptr < end) -+ { -+ while (spi[9] & 8); -+ *ptr++ = spi[512]; -+ } -+ while (spi[9] & 1); -+ return GRUB_ERR_NONE; -+} -+ -+static grub_err_t -+spi_start (const struct grub_fdtbus_dev *dev) -+{ -+ volatile grub_uint32_t *spi = grub_fdtbus_map_reg (dev, 0, 0); -+ spi[3] = 1; -+ return GRUB_ERR_NONE; -+} -+ -+static void -+spi_stop (const struct grub_fdtbus_dev *dev) -+{ -+ volatile grub_uint32_t *spi = grub_fdtbus_map_reg (dev, 0, 0); -+ spi[3] = 0; -+} -+ -+static grub_err_t -+spi_attach(const struct grub_fdtbus_dev *dev) -+{ -+ if (!grub_fdtbus_is_mapping_valid (grub_fdtbus_map_reg (dev, 0, 0))) -+ return GRUB_ERR_IO; -+ -+ return GRUB_ERR_NONE; -+} -+ -+static struct grub_fdtbus_driver spi = -+{ -+ .compatible = "rockchip,rk3288-spi", -+ .attach = spi_attach, -+ .send = spi_send, -+ .receive = spi_receive, -+ .start = spi_start, -+ .stop = spi_stop, -+}; -+ -+void -+grub_rk3288_spi_init (void) -+{ -+ grub_fdtbus_register (&spi); -+} -diff --git a/grub-core/bus/usb/ehci-fdt.c b/grub-core/bus/usb/ehci-fdt.c -new file mode 100644 -index 0000000000000000000000000000000000000000..29b50bdd5c30d192cc3cba1d7f466a9bcf321d92 ---- /dev/null -+++ b/grub-core/bus/usb/ehci-fdt.c -@@ -0,0 +1,45 @@ -+/* ehci.c - EHCI Support. */ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * Copyright (C) 2011 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 -+ -+static grub_err_t -+ehci_attach(const struct grub_fdtbus_dev *dev) -+{ -+ grub_dprintf ("ehci", "Found generic-ehci\n"); -+ -+ grub_ehci_init_device (grub_fdtbus_map_reg (dev, 0, 0)); -+ return 0; -+} -+ -+struct grub_fdtbus_driver ehci = -+{ -+ .compatible = "generic-ehci", -+ .attach = ehci_attach -+}; -+ -+void -+grub_ehci_pci_scan (void) -+{ -+ grub_fdtbus_register (&ehci); -+} -diff --git a/grub-core/bus/usb/ehci-pci.c b/grub-core/bus/usb/ehci-pci.c -new file mode 100644 -index 0000000000000000000000000000000000000000..65e6cb57438b7dfa35b80bbbe36a1e50629f025f ---- /dev/null -+++ b/grub-core/bus/usb/ehci-pci.c -@@ -0,0 +1,208 @@ -+/* ehci.c - EHCI Support. */ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * Copyright (C) 2011 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 -+ -+#define GRUB_EHCI_PCI_SBRN_REG 0x60 -+#define GRUB_EHCI_ADDR_MEM_MASK (~0xff) -+ -+/* USBLEGSUP bits and related OS OWNED byte offset */ -+enum -+{ -+ GRUB_EHCI_BIOS_OWNED = (1 << 16), -+ GRUB_EHCI_OS_OWNED = (1 << 24) -+}; -+ -+/* PCI iteration function... */ -+static int -+grub_ehci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid, -+ void *data __attribute__ ((unused))) -+{ -+ volatile grub_uint32_t *regs; -+ grub_uint32_t base, base_h; -+ grub_uint32_t eecp_offset; -+ grub_uint32_t usblegsup = 0; -+ grub_uint64_t maxtime; -+ grub_uint32_t interf; -+ grub_uint32_t subclass; -+ grub_uint32_t class; -+ grub_uint8_t release; -+ grub_uint32_t class_code; -+ -+ grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: begin\n"); -+ -+ if (pciid == GRUB_CS5536_PCIID) -+ { -+ grub_uint64_t basereg; -+ -+ basereg = grub_cs5536_read_msr (dev, GRUB_CS5536_MSR_USB_EHCI_BASE); -+ if (!(basereg & GRUB_CS5536_MSR_USB_BASE_MEMORY_ENABLE)) -+ { -+ /* Shouldn't happen. */ -+ grub_dprintf ("ehci", "No EHCI address is assigned\n"); -+ return 0; -+ } -+ base = (basereg & GRUB_CS5536_MSR_USB_BASE_ADDR_MASK); -+ basereg |= GRUB_CS5536_MSR_USB_BASE_BUS_MASTER; -+ basereg &= ~GRUB_CS5536_MSR_USB_BASE_PME_ENABLED; -+ basereg &= ~GRUB_CS5536_MSR_USB_BASE_PME_STATUS; -+ basereg &= ~GRUB_CS5536_MSR_USB_BASE_SMI_ENABLE; -+ grub_cs5536_write_msr (dev, GRUB_CS5536_MSR_USB_EHCI_BASE, basereg); -+ } -+ else -+ { -+ grub_pci_address_t addr; -+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS); -+ class_code = grub_pci_read (addr) >> 8; -+ interf = class_code & 0xFF; -+ subclass = (class_code >> 8) & 0xFF; -+ class = class_code >> 16; -+ -+ /* If this is not an EHCI controller, just return. */ -+ if (class != 0x0c || subclass != 0x03 || interf != 0x20) -+ return 0; -+ -+ grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: class OK\n"); -+ -+ /* Check Serial Bus Release Number */ -+ addr = grub_pci_make_address (dev, GRUB_EHCI_PCI_SBRN_REG); -+ release = grub_pci_read_byte (addr); -+ if (release != 0x20) -+ { -+ grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: Wrong SBRN: %0x\n", -+ release); -+ return 0; -+ } -+ grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: bus rev. num. OK\n"); -+ -+ /* Determine EHCI EHCC registers base address. */ -+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0); -+ base = grub_pci_read (addr); -+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG1); -+ base_h = grub_pci_read (addr); -+ /* Stop if registers are mapped above 4G - GRUB does not currently -+ * work with registers mapped above 4G */ -+ if (((base & GRUB_PCI_ADDR_MEM_TYPE_MASK) != GRUB_PCI_ADDR_MEM_TYPE_32) -+ && (base_h != 0)) -+ { -+ grub_dprintf ("ehci", -+ "EHCI grub_ehci_pci_iter: registers above 4G are not supported\n"); -+ return 0; -+ } -+ base &= GRUB_PCI_ADDR_MEM_MASK; -+ if (!base) -+ { -+ grub_dprintf ("ehci", -+ "EHCI: EHCI is not mapped\n"); -+ return 0; -+ } -+ -+ /* Set bus master - needed for coreboot, VMware, broken BIOSes etc. */ -+ addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND); -+ grub_pci_write_word(addr, -+ GRUB_PCI_COMMAND_MEM_ENABLED -+ | GRUB_PCI_COMMAND_BUS_MASTER -+ | grub_pci_read_word(addr)); -+ -+ grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: 32-bit EHCI OK\n"); -+ } -+ -+ grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: iobase of EHCC: %08x\n", -+ (base & GRUB_EHCI_ADDR_MEM_MASK)); -+ -+ regs = grub_pci_device_map_range (dev, -+ (base & GRUB_EHCI_ADDR_MEM_MASK), -+ 0x100); -+ -+ /* Is there EECP ? */ -+ eecp_offset = (grub_le_to_cpu32 (regs[2]) >> 8) & 0xff; -+ -+ /* Determine and change ownership. */ -+ /* EECP offset valid in HCCPARAMS */ -+ /* Ownership can be changed via EECP only */ -+ if (pciid != GRUB_CS5536_PCIID && eecp_offset >= 0x40) -+ { -+ grub_pci_address_t pciaddr_eecp; -+ pciaddr_eecp = grub_pci_make_address (dev, eecp_offset); -+ -+ usblegsup = grub_pci_read (pciaddr_eecp); -+ if (usblegsup & GRUB_EHCI_BIOS_OWNED) -+ { -+ grub_boot_time ("Taking ownership of EHCI controller"); -+ grub_dprintf ("ehci", -+ "EHCI grub_ehci_pci_iter: EHCI owned by: BIOS\n"); -+ /* Ownership change - set OS_OWNED bit */ -+ grub_pci_write (pciaddr_eecp, usblegsup | GRUB_EHCI_OS_OWNED); -+ /* Ensure PCI register is written */ -+ grub_pci_read (pciaddr_eecp); -+ -+ /* Wait for finish of ownership change, EHCI specification -+ * doesn't say how long it can take... */ -+ maxtime = grub_get_time_ms () + 1000; -+ while ((grub_pci_read (pciaddr_eecp) & GRUB_EHCI_BIOS_OWNED) -+ && (grub_get_time_ms () < maxtime)); -+ if (grub_pci_read (pciaddr_eecp) & GRUB_EHCI_BIOS_OWNED) -+ { -+ grub_dprintf ("ehci", -+ "EHCI grub_ehci_pci_iter: EHCI change ownership timeout"); -+ /* Change ownership in "hard way" - reset BIOS ownership */ -+ grub_pci_write (pciaddr_eecp, GRUB_EHCI_OS_OWNED); -+ /* Ensure PCI register is written */ -+ grub_pci_read (pciaddr_eecp); -+ } -+ } -+ else if (usblegsup & GRUB_EHCI_OS_OWNED) -+ /* XXX: What to do in this case - nothing ? Can it happen ? */ -+ grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: EHCI owned by: OS\n"); -+ else -+ { -+ grub_dprintf ("ehci", -+ "EHCI grub_ehci_pci_iter: EHCI owned by: NONE\n"); -+ /* XXX: What to do in this case ? Can it happen ? -+ * Is code below correct ? */ -+ /* Ownership change - set OS_OWNED bit */ -+ grub_pci_write (pciaddr_eecp, GRUB_EHCI_OS_OWNED); -+ /* Ensure PCI register is written */ -+ grub_pci_read (pciaddr_eecp); -+ } -+ -+ /* Disable SMI, just to be sure. */ -+ pciaddr_eecp = grub_pci_make_address (dev, eecp_offset + 4); -+ grub_pci_write (pciaddr_eecp, 0); -+ /* Ensure PCI register is written */ -+ grub_pci_read (pciaddr_eecp); -+ } -+ -+ grub_dprintf ("ehci", "inithw: EHCI grub_ehci_pci_iter: ownership OK\n"); -+ -+ grub_ehci_init_device (regs); -+ return 0; -+} -+ -+void -+grub_ehci_pci_scan (void) -+{ -+ grub_pci_iterate (grub_ehci_pci_iter, NULL); -+} -diff --git a/grub-core/bus/usb/ehci.c b/grub-core/bus/usb/ehci.c -index 5f4297bb21ec4c28824abb0c442a87a3dd4a872e..d966fc21002602fab3f1b68668ddcb5bfa639442 100644 ---- a/grub-core/bus/usb/ehci.c -+++ b/grub-core/bus/usb/ehci.c -@@ -22,13 +22,10 @@ - #include - #include - #include --#include --#include --#include - #include - #include --#include - #include -+#include - #include - - GRUB_MOD_LICENSE ("GPLv3+"); -@@ -39,8 +36,6 @@ GRUB_MOD_LICENSE ("GPLv3+"); - * - is not supporting interrupt transfers - */ - --#define GRUB_EHCI_PCI_SBRN_REG 0x60 -- - /* Capability registers offsets */ - enum - { -@@ -54,7 +49,6 @@ enum - #define GRUB_EHCI_EECP_MASK (0xff << 8) - #define GRUB_EHCI_EECP_SHIFT 8 - --#define GRUB_EHCI_ADDR_MEM_MASK (~0xff) - #define GRUB_EHCI_POINTER_MASK (~0x1f) - - /* Capability register SPARAMS bits */ -@@ -85,13 +79,6 @@ enum - - #define GRUB_EHCI_QH_EMPTY 1 - --/* USBLEGSUP bits and related OS OWNED byte offset */ --enum --{ -- GRUB_EHCI_BIOS_OWNED = (1 << 16), -- GRUB_EHCI_OS_OWNED = (1 << 24) --}; -- - /* Operational registers offsets */ - enum - { -@@ -455,9 +442,10 @@ grub_ehci_reset (struct grub_ehci *e) - - sync_all_caches (e); - -+ grub_dprintf ("ehci", "reset\n"); -+ - grub_ehci_oper_write32 (e, GRUB_EHCI_COMMAND, -- GRUB_EHCI_CMD_HC_RESET -- | grub_ehci_oper_read32 (e, GRUB_EHCI_COMMAND)); -+ GRUB_EHCI_CMD_HC_RESET); - /* Ensure command is written */ - grub_ehci_oper_read32 (e, GRUB_EHCI_COMMAND); - /* XXX: How long time could take reset of HC ? */ -@@ -473,116 +461,24 @@ grub_ehci_reset (struct grub_ehci *e) - } - - /* PCI iteration function... */ --static int --grub_ehci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid, -- void *data __attribute__ ((unused))) -+void -+grub_ehci_init_device (volatile void *regs) - { -- grub_uint8_t release; -- grub_uint32_t class_code; -- grub_uint32_t interf; -- grub_uint32_t subclass; -- grub_uint32_t class; -- grub_uint32_t base, base_h; - struct grub_ehci *e; -- grub_uint32_t eecp_offset; - grub_uint32_t fp; - int i; -- grub_uint32_t usblegsup = 0; -- grub_uint64_t maxtime; - grub_uint32_t n_ports; - grub_uint8_t caplen; - -- grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: begin\n"); -- -- if (pciid == GRUB_CS5536_PCIID) -- { -- grub_uint64_t basereg; -- -- basereg = grub_cs5536_read_msr (dev, GRUB_CS5536_MSR_USB_EHCI_BASE); -- if (!(basereg & GRUB_CS5536_MSR_USB_BASE_MEMORY_ENABLE)) -- { -- /* Shouldn't happen. */ -- grub_dprintf ("ehci", "No EHCI address is assigned\n"); -- return 0; -- } -- base = (basereg & GRUB_CS5536_MSR_USB_BASE_ADDR_MASK); -- basereg |= GRUB_CS5536_MSR_USB_BASE_BUS_MASTER; -- basereg &= ~GRUB_CS5536_MSR_USB_BASE_PME_ENABLED; -- basereg &= ~GRUB_CS5536_MSR_USB_BASE_PME_STATUS; -- basereg &= ~GRUB_CS5536_MSR_USB_BASE_SMI_ENABLE; -- grub_cs5536_write_msr (dev, GRUB_CS5536_MSR_USB_EHCI_BASE, basereg); -- } -- else -- { -- grub_pci_address_t addr; -- addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS); -- class_code = grub_pci_read (addr) >> 8; -- interf = class_code & 0xFF; -- subclass = (class_code >> 8) & 0xFF; -- class = class_code >> 16; -- -- /* If this is not an EHCI controller, just return. */ -- if (class != 0x0c || subclass != 0x03 || interf != 0x20) -- return 0; -- -- grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: class OK\n"); -- -- /* Check Serial Bus Release Number */ -- addr = grub_pci_make_address (dev, GRUB_EHCI_PCI_SBRN_REG); -- release = grub_pci_read_byte (addr); -- if (release != 0x20) -- { -- grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: Wrong SBRN: %0x\n", -- release); -- return 0; -- } -- grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: bus rev. num. OK\n"); -- -- /* Determine EHCI EHCC registers base address. */ -- addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0); -- base = grub_pci_read (addr); -- addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG1); -- base_h = grub_pci_read (addr); -- /* Stop if registers are mapped above 4G - GRUB does not currently -- * work with registers mapped above 4G */ -- if (((base & GRUB_PCI_ADDR_MEM_TYPE_MASK) != GRUB_PCI_ADDR_MEM_TYPE_32) -- && (base_h != 0)) -- { -- grub_dprintf ("ehci", -- "EHCI grub_ehci_pci_iter: registers above 4G are not supported\n"); -- return 0; -- } -- base &= GRUB_PCI_ADDR_MEM_MASK; -- if (!base) -- { -- grub_dprintf ("ehci", -- "EHCI: EHCI is not mapped\n"); -- return 0; -- } -- -- /* Set bus master - needed for coreboot, VMware, broken BIOSes etc. */ -- addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND); -- grub_pci_write_word(addr, -- GRUB_PCI_COMMAND_MEM_ENABLED -- | GRUB_PCI_COMMAND_BUS_MASTER -- | grub_pci_read_word(addr)); -- -- grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: 32-bit EHCI OK\n"); -- } -- - /* Allocate memory for the controller and fill basic values. */ - e = grub_zalloc (sizeof (*e)); - if (!e) -- return 1; -+ return; - e->framelist_chunk = NULL; - e->td_chunk = NULL; - e->qh_chunk = NULL; -- e->iobase_ehcc = grub_pci_device_map_range (dev, -- (base & GRUB_EHCI_ADDR_MEM_MASK), -- 0x100); -+ e->iobase_ehcc = regs; - -- grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: iobase of EHCC: %08x\n", -- (base & GRUB_EHCI_ADDR_MEM_MASK)); - grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: CAPLEN: %02x\n", - grub_ehci_ehcc_read8 (e, GRUB_EHCI_EHCC_CAPLEN)); - grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: VERSION: %04x\n", -@@ -598,7 +494,7 @@ grub_ehci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid, - if (caplen & (sizeof (grub_uint32_t) - 1)) - { - grub_dprintf ("ehci", "Unaligned caplen\n"); -- return 0; -+ return; - } - e->iobase = ((volatile grub_uint32_t *) e->iobase_ehcc - + (caplen / sizeof (grub_uint32_t))); -@@ -608,8 +504,8 @@ grub_ehci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid, - #endif - - grub_dprintf ("ehci", -- "EHCI grub_ehci_pci_iter: iobase of oper. regs: %08x\n", -- (base & GRUB_EHCI_ADDR_MEM_MASK) + caplen); -+ "EHCI grub_ehci_pci_iter: iobase of oper. regs: %08llxx\n", -+ (unsigned long long) (grub_addr_t) e->iobase_ehcc + caplen); - grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: COMMAND: %08x\n", - grub_ehci_oper_read32 (e, GRUB_EHCI_COMMAND)); - grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: STATUS: %08x\n", -@@ -625,10 +521,6 @@ grub_ehci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid, - grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: CONFIG_FLAG: %08x\n", - grub_ehci_oper_read32 (e, GRUB_EHCI_CONFIG_FLAG)); - -- /* Is there EECP ? */ -- eecp_offset = (grub_ehci_ehcc_read32 (e, GRUB_EHCI_EHCC_CPARAMS) -- & GRUB_EHCI_EECP_MASK) >> GRUB_EHCI_EECP_SHIFT; -- - /* Check format of data structures requested by EHCI */ - /* XXX: In fact it is not used at any place, it is prepared for future - * This implementation uses 32-bits pointers only */ -@@ -732,65 +624,6 @@ grub_ehci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid, - - grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: QH/TD init. OK\n"); - -- /* Determine and change ownership. */ -- /* EECP offset valid in HCCPARAMS */ -- /* Ownership can be changed via EECP only */ -- if (pciid != GRUB_CS5536_PCIID && eecp_offset >= 0x40) -- { -- grub_pci_address_t pciaddr_eecp; -- pciaddr_eecp = grub_pci_make_address (dev, eecp_offset); -- -- usblegsup = grub_pci_read (pciaddr_eecp); -- if (usblegsup & GRUB_EHCI_BIOS_OWNED) -- { -- grub_boot_time ("Taking ownership of EHCI controller"); -- grub_dprintf ("ehci", -- "EHCI grub_ehci_pci_iter: EHCI owned by: BIOS\n"); -- /* Ownership change - set OS_OWNED bit */ -- grub_pci_write (pciaddr_eecp, usblegsup | GRUB_EHCI_OS_OWNED); -- /* Ensure PCI register is written */ -- grub_pci_read (pciaddr_eecp); -- -- /* Wait for finish of ownership change, EHCI specification -- * doesn't say how long it can take... */ -- maxtime = grub_get_time_ms () + 1000; -- while ((grub_pci_read (pciaddr_eecp) & GRUB_EHCI_BIOS_OWNED) -- && (grub_get_time_ms () < maxtime)); -- if (grub_pci_read (pciaddr_eecp) & GRUB_EHCI_BIOS_OWNED) -- { -- grub_dprintf ("ehci", -- "EHCI grub_ehci_pci_iter: EHCI change ownership timeout"); -- /* Change ownership in "hard way" - reset BIOS ownership */ -- grub_pci_write (pciaddr_eecp, GRUB_EHCI_OS_OWNED); -- /* Ensure PCI register is written */ -- grub_pci_read (pciaddr_eecp); -- } -- } -- else if (usblegsup & GRUB_EHCI_OS_OWNED) -- /* XXX: What to do in this case - nothing ? Can it happen ? */ -- grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: EHCI owned by: OS\n"); -- else -- { -- grub_dprintf ("ehci", -- "EHCI grub_ehci_pci_iter: EHCI owned by: NONE\n"); -- /* XXX: What to do in this case ? Can it happen ? -- * Is code below correct ? */ -- /* Ownership change - set OS_OWNED bit */ -- grub_pci_write (pciaddr_eecp, GRUB_EHCI_OS_OWNED); -- /* Ensure PCI register is written */ -- grub_pci_read (pciaddr_eecp); -- } -- -- /* Disable SMI, just to be sure. */ -- pciaddr_eecp = grub_pci_make_address (dev, eecp_offset + 4); -- grub_pci_write (pciaddr_eecp, 0); -- /* Ensure PCI register is written */ -- grub_pci_read (pciaddr_eecp); -- -- } -- -- grub_dprintf ("ehci", "inithw: EHCI grub_ehci_pci_iter: ownership OK\n"); -- - /* Now we can setup EHCI (maybe...) */ - - /* Check if EHCI is halted and halt it if not */ -@@ -863,8 +696,8 @@ grub_ehci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid, - grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: OK at all\n"); - - grub_dprintf ("ehci", -- "EHCI grub_ehci_pci_iter: iobase of oper. regs: %08x\n", -- (base & GRUB_EHCI_ADDR_MEM_MASK)); -+ "EHCI grub_ehci_pci_iter: iobase of oper. regs: %08llx\n", -+ (unsigned long long) (grub_addr_t) regs); - grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: COMMAND: %08x\n", - grub_ehci_oper_read32 (e, GRUB_EHCI_COMMAND)); - grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: STATUS: %08x\n", -@@ -880,7 +713,7 @@ grub_ehci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid, - grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: CONFIG_FLAG: %08x\n", - grub_ehci_oper_read32 (e, GRUB_EHCI_CONFIG_FLAG)); - -- return 0; -+ return; - - fail: - if (e) -@@ -894,7 +727,7 @@ fail: - } - grub_free (e); - -- return 0; -+ return; - } - - static int -@@ -1891,12 +1724,6 @@ grub_ehci_detect_dev (grub_usb_controller_t dev, int port, int *changed) - } - } - --static void --grub_ehci_inithw (void) --{ -- grub_pci_iterate (grub_ehci_pci_iter, NULL); --} -- - static grub_err_t - grub_ehci_restore_hw (void) - { -@@ -1997,7 +1824,7 @@ GRUB_MOD_INIT (ehci) - grub_stop_disk_firmware (); - - grub_boot_time ("Initing EHCI hardware"); -- grub_ehci_inithw (); -+ grub_ehci_pci_scan (); - grub_boot_time ("Registering EHCI driver"); - grub_usb_controller_dev_register (&usb_controller); - grub_boot_time ("EHCI driver registered"); -diff --git a/grub-core/bus/usb/usbtrans.c b/grub-core/bus/usb/usbtrans.c -index 9266e49311c4471d0915aebf9fae05509d0fa5c7..85f081fffb3a2aa7354816c79977ae45a79b1c80 100644 ---- a/grub-core/bus/usb/usbtrans.c -+++ b/grub-core/bus/usb/usbtrans.c -@@ -18,7 +18,7 @@ - */ - - #include --#include -+#include - #include - #include - #include -diff --git a/grub-core/commands/efi/lsefi.c b/grub-core/commands/efi/lsefi.c -index d901c3892630f2500eda9822c712aae278017907..d1ce99af438914692d1b71b0017050689dd73db9 100644 ---- a/grub-core/commands/efi/lsefi.c -+++ b/grub-core/commands/efi/lsefi.c -@@ -109,8 +109,10 @@ grub_cmd_lsefi (grub_command_t cmd __attribute__ ((unused)), - - status = efi_call_3 (grub_efi_system_table->boot_services->protocols_per_handle, - handle, &protocols, &num_protocols); -- if (status != GRUB_EFI_SUCCESS) -+ if (status != GRUB_EFI_SUCCESS) { - grub_printf ("Unable to retrieve protocols\n"); -+ continue; -+ } - for (j = 0; j < num_protocols; j++) - { - for (k = 0; k < ARRAY_SIZE (known_protocols); k++) -diff --git a/grub-core/commands/file.c b/grub-core/commands/file.c -index 12fba99e06a23cb72af67fc4bfb758d97bfa0e67..3ff6d5522d2d572c2af16fec371faeb8e4b28f9d 100644 ---- a/grub-core/commands/file.c -+++ b/grub-core/commands/file.c -@@ -27,6 +27,8 @@ - #include - #include - #include -+#include -+#include - #include - #include - #include -@@ -383,21 +385,19 @@ grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char **args) - } - case IS_ARM_LINUX: - { -- grub_uint32_t sig, sig_pi; -- if (grub_file_read (file, &sig_pi, 4) != 4) -+ struct linux_arm_kernel_header lh; -+ -+ if (grub_file_read (file, &lh, sizeof (lh)) != sizeof (lh)) - break; -- /* Raspberry pi. */ -- if (sig_pi == grub_cpu_to_le32_compile_time (0xea000006)) -+ /* Short forward branch in A32 state (for Raspberry pi kernels). */ -+ if (lh.code0 == grub_cpu_to_le32_compile_time (0xea000006)) - { - ret = 1; - break; - } - -- if (grub_file_seek (file, 0x24) == (grub_size_t) -1) -- break; -- if (grub_file_read (file, &sig, 4) != 4) -- break; -- if (sig == grub_cpu_to_le32_compile_time (0x016f2818)) -+ if (lh.magic == -+ grub_cpu_to_le32_compile_time (GRUB_LINUX_ARM_MAGIC_SIGNATURE)) - { - ret = 1; - break; -@@ -406,13 +406,13 @@ grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char **args) - } - case IS_ARM64_LINUX: - { -- grub_uint32_t sig; -+ struct linux_arm64_kernel_header lh; - -- if (grub_file_seek (file, 0x38) == (grub_size_t) -1) -+ if (grub_file_read (file, &lh, sizeof (lh)) != sizeof (lh)) - break; -- if (grub_file_read (file, &sig, 4) != 4) -- break; -- if (sig == grub_cpu_to_le32_compile_time (0x644d5241)) -+ -+ if (lh.magic == -+ grub_cpu_to_le32_compile_time (GRUB_LINUX_ARM64_MAGIC_SIGNATURE)) - { - ret = 1; - break; -@@ -497,7 +497,7 @@ grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char **args) - case IS_X86_LINUX32: - case IS_X86_LINUX: - { -- struct linux_kernel_header lh; -+ struct linux_i386_kernel_header lh; - if (grub_file_read (file, &lh, sizeof (lh)) != sizeof (lh)) - break; - if (lh.boot_flag != grub_cpu_to_le16_compile_time (0xaa55)) -@@ -508,7 +508,7 @@ grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char **args) - - /* FIXME: some really old kernels (< 1.3.73) will fail this. */ - if (lh.header != -- grub_cpu_to_le32_compile_time (GRUB_LINUX_MAGIC_SIGNATURE) -+ grub_cpu_to_le32_compile_time (GRUB_LINUX_I386_MAGIC_SIGNATURE) - || grub_le_to_cpu16 (lh.version) < 0x0200) - break; - -@@ -521,7 +521,7 @@ grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char **args) - /* FIXME: 2.03 is not always good enough (Linux 2.4 can be 2.03 and - still not support 32-bit boot. */ - if (lh.header != -- grub_cpu_to_le32_compile_time (GRUB_LINUX_MAGIC_SIGNATURE) -+ grub_cpu_to_le32_compile_time (GRUB_LINUX_I386_MAGIC_SIGNATURE) - || grub_le_to_cpu16 (lh.version) < 0x0203) - break; - -diff --git a/grub-core/commands/i386/coreboot/cb_timestamps.c b/grub-core/commands/i386/coreboot/cb_timestamps.c -index e72f38d6e057dccfb981d6bbc483d2bdd8a06c98..e97ea6bed98b42d4f03f06ab5bc076fadbfee67f 100644 ---- a/grub-core/commands/i386/coreboot/cb_timestamps.c -+++ b/grub-core/commands/i386/coreboot/cb_timestamps.c -@@ -20,7 +20,7 @@ - #include - #include - #include --#include -+#include - #include - - GRUB_MOD_LICENSE ("GPLv3+"); -diff --git a/grub-core/commands/i386/coreboot/cbls.c b/grub-core/commands/i386/coreboot/cbls.c -index e0a10596fe279331cca94172e1f452fdfe18394f..102291f424ab782c6cd3bcd4ae1effd836cd832e 100644 ---- a/grub-core/commands/i386/coreboot/cbls.c -+++ b/grub-core/commands/i386/coreboot/cbls.c -@@ -20,7 +20,7 @@ - #include - #include - #include --#include -+#include - #include - - GRUB_MOD_LICENSE ("GPLv3+"); -diff --git a/grub-core/commands/keylayouts.c b/grub-core/commands/keylayouts.c -index f4b7730208ab8ffafb1b0283294a140248839d7a..f35d3a369bad7125cb04e25f0e32c01c00c673b0 100644 ---- a/grub-core/commands/keylayouts.c -+++ b/grub-core/commands/keylayouts.c -@@ -40,7 +40,7 @@ static struct grub_keyboard_layout layout_us = { - /* 0x10 */ 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', - /* 0x18 */ 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', - /* 0x20 */ '3', '4', '5', '6', '7', '8', '9', '0', -- /* 0x28 */ '\n', '\e', '\b', '\t', ' ', '-', '=', '[', -+ /* 0x28 */ '\n', GRUB_TERM_ESC, GRUB_TERM_BACKSPACE, GRUB_TERM_TAB, ' ', '-', '=', '[', - /* According to usage table 0x31 should be mapped to '/' - but testing with real keyboard shows that 0x32 is remapped to '/'. - Map 0x31 to 0. -@@ -82,8 +82,8 @@ static struct grub_keyboard_layout layout_us = { - /* 0x10 */ 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', - /* 0x18 */ 'U', 'V', 'W', 'X', 'Y', 'Z', '!', '@', - /* 0x20 */ '#', '$', '%', '^', '&', '*', '(', ')', -- /* 0x28 */ '\n' | GRUB_TERM_SHIFT, '\e' | GRUB_TERM_SHIFT, -- /* 0x2a */ '\b' | GRUB_TERM_SHIFT, '\t' | GRUB_TERM_SHIFT, -+ /* 0x28 */ '\n' | GRUB_TERM_SHIFT, GRUB_TERM_ESC | GRUB_TERM_SHIFT, -+ /* 0x2a */ GRUB_TERM_BACKSPACE | GRUB_TERM_SHIFT, GRUB_TERM_TAB | GRUB_TERM_SHIFT, - /* 0x2c */ ' ' | GRUB_TERM_SHIFT, '_', '+', '{', - /* According to usage table 0x31 should be mapped to '/' - but testing with real keyboard shows that 0x32 is remapped to '/'. -diff --git a/grub-core/commands/ls.c b/grub-core/commands/ls.c -index 0eaf836527944ba69d499050ad080f919d3e57ef..c25161cc4f2c6d4fce6781bfac9bf7796fceb0c7 100644 ---- a/grub-core/commands/ls.c -+++ b/grub-core/commands/ls.c -@@ -201,6 +201,15 @@ grub_ls_list_files (char *dirname, int longlist, int all, int human) - if (grub_errno == GRUB_ERR_UNKNOWN_FS) - grub_errno = GRUB_ERR_NONE; - -+#ifdef GRUB_MACHINE_IEEE1275 -+ /* -+ * Close device to prevent a double open in grub_normal_print_device_info(). -+ * Otherwise it may lead to hangs on some IEEE 1275 platforms. -+ */ -+ grub_device_close (dev); -+ dev = NULL; -+#endif -+ - grub_normal_print_device_info (device_name); - } - else if (fs) -diff --git a/grub-core/commands/menuentry.c b/grub-core/commands/menuentry.c -index 58d4dadf6ee4ec392a09d433802803520704cd7b..2c5363da7f549b85ae04d1d88a78db0b85504c51 100644 ---- a/grub-core/commands/menuentry.c -+++ b/grub-core/commands/menuentry.c -@@ -52,8 +52,8 @@ static struct - int key; - } hotkey_aliases[] = - { -- {"backspace", '\b'}, -- {"tab", '\t'}, -+ {"backspace", GRUB_TERM_BACKSPACE}, -+ {"tab", GRUB_TERM_TAB}, - {"delete", GRUB_TERM_KEY_DC}, - {"insert", GRUB_TERM_KEY_INSERT}, - {"f1", GRUB_TERM_KEY_F1}, -diff --git a/grub-core/disk/ahci.c b/grub-core/disk/ahci.c -index 494a1b7734ef44fef6e887f62b6eb30d0a494284..f2f606423aca4f842f5b16b797a1084cc5791cbb 100644 ---- a/grub-core/disk/ahci.c -+++ b/grub-core/disk/ahci.c -@@ -82,6 +82,20 @@ enum grub_ahci_hba_port_command - GRUB_AHCI_HBA_PORT_CMD_FR = 0x4000, - }; - -+enum grub_ahci_hba_port_int_status -+ { -+ GRUB_AHCI_HBA_PORT_IS_IFS = (1UL << 27), -+ GRUB_AHCI_HBA_PORT_IS_HBDS = (1UL << 28), -+ GRUB_AHCI_HBA_PORT_IS_HBFS = (1UL << 29), -+ GRUB_AHCI_HBA_PORT_IS_TFES = (1UL << 30), -+ }; -+ -+#define GRUB_AHCI_HBA_PORT_IS_FATAL_MASK ( \ -+ GRUB_AHCI_HBA_PORT_IS_IFS | \ -+ GRUB_AHCI_HBA_PORT_IS_HBDS | \ -+ GRUB_AHCI_HBA_PORT_IS_HBFS | \ -+ GRUB_AHCI_HBA_PORT_IS_TFES) -+ - struct grub_ahci_hba - { - grub_uint32_t cap; -@@ -1026,7 +1040,8 @@ grub_ahci_readwrite_real (struct grub_ahci_device *dev, - - endtime = grub_get_time_ms () + (spinup ? 20000 : 20000); - while ((dev->hba->ports[dev->port].command_issue & 1)) -- if (grub_get_time_ms () > endtime) -+ if (grub_get_time_ms () > endtime || -+ (dev->hba->ports[dev->port].intstatus & GRUB_AHCI_HBA_PORT_IS_FATAL_MASK)) - { - grub_dprintf ("ahci", "AHCI status <%x %x %x %x>\n", - dev->hba->ports[dev->port].command_issue, -@@ -1034,7 +1049,10 @@ grub_ahci_readwrite_real (struct grub_ahci_device *dev, - dev->hba->ports[dev->port].intstatus, - dev->hba->ports[dev->port].task_file_data); - dev->hba->ports[dev->port].command_issue = 0; -- err = grub_error (GRUB_ERR_IO, "AHCI transfer timed out"); -+ if (dev->hba->ports[dev->port].intstatus & GRUB_AHCI_HBA_PORT_IS_FATAL_MASK) -+ err = grub_error (GRUB_ERR_IO, "AHCI transfer error"); -+ else -+ err = grub_error (GRUB_ERR_IO, "AHCI transfer timed out"); - if (!reset) - grub_ahci_reset_port (dev, 1); - break; -diff --git a/grub-core/disk/ldm.c b/grub-core/disk/ldm.c -index 0f978ad05079c9535d7ef9bb16462c7d7adeb80e..2a22d2d6c1c3121ec889f33f2aaaf3077723a6c1 100644 ---- a/grub-core/disk/ldm.c -+++ b/grub-core/disk/ldm.c -@@ -135,7 +135,7 @@ msdos_has_ldm_partition (grub_disk_t dsk) - return has_ldm; - } - --static const grub_gpt_part_type_t ldm_type = GRUB_GPT_PARTITION_TYPE_LDM; -+static const grub_gpt_part_guid_t ldm_type = GRUB_GPT_PARTITION_TYPE_LDM; - - /* Helper for gpt_ldm_sector. */ - static int -diff --git a/grub-core/efiemu/i386/loadcore64.c b/grub-core/efiemu/i386/loadcore64.c -index e49d0b6ff17e02e22e09b306d0a6a32a3b083b78..18facf47fd7678007deb730fb71256edff6292ad 100644 ---- a/grub-core/efiemu/i386/loadcore64.c -+++ b/grub-core/efiemu/i386/loadcore64.c -@@ -98,6 +98,7 @@ grub_arch_efiemu_relocate_symbols64 (grub_efiemu_segment_t segs, - break; - - case R_X86_64_PC32: -+ case R_X86_64_PLT32: - err = grub_efiemu_write_value (addr, - *addr32 + rel->r_addend - + sym.off -diff --git a/grub-core/fs/btrfs.c b/grub-core/fs/btrfs.c -index 4849c1ceb6533c1b19eb64d754d45d44282b5acb..be195448dbeb55abcfb117723cd2fc6d75e6e344 100644 ---- a/grub-core/fs/btrfs.c -+++ b/grub-core/fs/btrfs.c -@@ -175,7 +175,7 @@ struct grub_btrfs_time - { - grub_int64_t sec; - grub_uint32_t nanosec; --} __attribute__ ((aligned (4))); -+} GRUB_PACKED; - - struct grub_btrfs_inode - { -diff --git a/grub-core/fs/ext2.c b/grub-core/fs/ext2.c -index cdce63bcc9d57e82b7a4f6a644803a1d8320935d..b8ad75a0ff7c4f72b67bef123510d99231531daf 100644 ---- a/grub-core/fs/ext2.c -+++ b/grub-core/fs/ext2.c -@@ -102,6 +102,7 @@ GRUB_MOD_LICENSE ("GPLv3+"); - #define EXT4_FEATURE_INCOMPAT_64BIT 0x0080 - #define EXT4_FEATURE_INCOMPAT_MMP 0x0100 - #define EXT4_FEATURE_INCOMPAT_FLEX_BG 0x0200 -+#define EXT4_FEATURE_INCOMPAT_ENCRYPT 0x10000 - - /* The set of back-incompatible features this driver DOES support. Add (OR) - * flags here as the related features are implemented into the driver. */ -@@ -109,7 +110,8 @@ GRUB_MOD_LICENSE ("GPLv3+"); - | EXT4_FEATURE_INCOMPAT_EXTENTS \ - | EXT4_FEATURE_INCOMPAT_FLEX_BG \ - | EXT2_FEATURE_INCOMPAT_META_BG \ -- | EXT4_FEATURE_INCOMPAT_64BIT) -+ | EXT4_FEATURE_INCOMPAT_64BIT \ -+ | EXT4_FEATURE_INCOMPAT_ENCRYPT) - /* List of rationales for the ignored "incompatible" features: - * needs_recovery: Not really back-incompatible - was added as such to forbid - * ext2 drivers from mounting an ext3 volume with a dirty -@@ -138,6 +140,7 @@ GRUB_MOD_LICENSE ("GPLv3+"); - #define EXT3_JOURNAL_FLAG_DELETED 4 - #define EXT3_JOURNAL_FLAG_LAST_TAG 8 - -+#define EXT4_ENCRYPT_FLAG 0x800 - #define EXT4_EXTENTS_FLAG 0x80000 - - /* The ext2 superblock. */ -@@ -706,6 +709,12 @@ grub_ext2_read_symlink (grub_fshelp_node_t node) - grub_ext2_read_inode (diro->data, diro->ino, &diro->inode); - if (grub_errno) - return 0; -+ -+ if (diro->inode.flags & grub_cpu_to_le32_compile_time (EXT4_ENCRYPT_FLAG)) -+ { -+ grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, "symlink is encrypted"); -+ return 0; -+ } - } - - symlink = grub_malloc (grub_le_to_cpu32 (diro->inode.size) + 1); -@@ -749,6 +758,12 @@ grub_ext2_iterate_dir (grub_fshelp_node_t dir, - return 0; - } - -+ if (diro->inode.flags & grub_cpu_to_le32_compile_time (EXT4_ENCRYPT_FLAG)) -+ { -+ grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, "directory is encrypted"); -+ return 0; -+ } -+ - /* Search the file. */ - while (fpos < grub_le_to_cpu32 (diro->inode.size)) - { -@@ -859,6 +874,12 @@ grub_ext2_open (struct grub_file *file, const char *name) - goto fail; - } - -+ if (fdiro->inode.flags & grub_cpu_to_le32_compile_time (EXT4_ENCRYPT_FLAG)) -+ { -+ err = grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, "file is encrypted"); -+ goto fail; -+ } -+ - grub_memcpy (data->inode, &fdiro->inode, sizeof (struct grub_ext2_inode)); - grub_free (fdiro); - -diff --git a/grub-core/fs/f2fs.c b/grub-core/fs/f2fs.c -new file mode 100644 -index 0000000000000000000000000000000000000000..1cad2615f3c9e65e57a12d18b76f4ecc1caa31d8 ---- /dev/null -+++ b/grub-core/fs/f2fs.c -@@ -0,0 +1,1314 @@ -+/* -+ * f2fs.c - Flash-Friendly File System -+ * -+ * Written by Jaegeuk Kim -+ * -+ * Copyright (C) 2015 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 -+#include -+#include -+ -+GRUB_MOD_LICENSE ("GPLv3+"); -+ -+/* F2FS Magic Number. */ -+#define F2FS_SUPER_MAGIC 0xf2f52010 -+ -+#define CHECKSUM_OFFSET 4092 /* Must be aligned 4 bytes. */ -+#define U32_CHECKSUM_OFFSET (CHECKSUM_OFFSET >> 2) -+#define CRCPOLY_LE 0xedb88320 -+ -+/* Byte-size offset. */ -+#define F2FS_SUPER_OFFSET ((grub_disk_addr_t)1024) -+#define F2FS_SUPER_OFFSET0 (F2FS_SUPER_OFFSET >> GRUB_DISK_SECTOR_BITS) -+#define F2FS_SUPER_OFFSET1 ((F2FS_SUPER_OFFSET + F2FS_BLKSIZE) >> \ -+ GRUB_DISK_SECTOR_BITS) -+ -+/* 9 bits for 512 bytes. */ -+#define F2FS_MIN_LOG_SECTOR_SIZE 9 -+ -+/* Support only 4KB block. */ -+#define F2FS_BLK_BITS 12 -+#define F2FS_BLKSIZE (1 << F2FS_BLK_BITS) -+#define F2FS_BLK_SEC_BITS (F2FS_BLK_BITS - GRUB_DISK_SECTOR_BITS) -+ -+#define VERSION_LEN 256 -+#define F2FS_MAX_EXTENSION 64 -+ -+#define CP_COMPACT_SUM_FLAG 0x00000004 -+#define CP_UMOUNT_FLAG 0x00000001 -+ -+#define MAX_ACTIVE_LOGS 16 -+#define MAX_ACTIVE_NODE_LOGS 8 -+#define MAX_ACTIVE_DATA_LOGS 8 -+#define NR_CURSEG_DATA_TYPE 3 -+#define NR_CURSEG_NODE_TYPE 3 -+#define NR_CURSEG_TYPE (NR_CURSEG_DATA_TYPE + NR_CURSEG_NODE_TYPE) -+ -+#define ENTRIES_IN_SUM 512 -+#define SUMMARY_SIZE 7 -+#define SUM_FOOTER_SIZE 5 -+#define JENTRY_SIZE (sizeof(struct grub_f2fs_nat_jent)) -+#define SUM_ENTRIES_SIZE (SUMMARY_SIZE * ENTRIES_IN_SUM) -+#define SUM_JOURNAL_SIZE (F2FS_BLKSIZE - SUM_FOOTER_SIZE - SUM_ENTRIES_SIZE) -+#define NAT_JOURNAL_ENTRIES ((SUM_JOURNAL_SIZE - 2) / JENTRY_SIZE) -+#define NAT_JOURNAL_RESERVED ((SUM_JOURNAL_SIZE - 2) % JENTRY_SIZE) -+ -+#define NAT_ENTRY_SIZE (sizeof(struct grub_f2fs_nat_entry)) -+#define NAT_ENTRY_PER_BLOCK (F2FS_BLKSIZE / NAT_ENTRY_SIZE) -+ -+#define F2FS_NAME_LEN 255 -+#define F2FS_SLOT_LEN 8 -+#define NR_DENTRY_IN_BLOCK 214 -+#define SIZE_OF_DIR_ENTRY 11 /* By byte. */ -+#define BITS_PER_BYTE 8 -+#define SIZE_OF_DENTRY_BITMAP ((NR_DENTRY_IN_BLOCK + BITS_PER_BYTE - 1) / \ -+ BITS_PER_BYTE) -+#define SIZE_OF_RESERVED (F2FS_BLKSIZE - \ -+ ((SIZE_OF_DIR_ENTRY + F2FS_SLOT_LEN) * \ -+ NR_DENTRY_IN_BLOCK + SIZE_OF_DENTRY_BITMAP)) -+ -+#define F2FS_INLINE_XATTR_ADDRS 50 /* 200 bytes for inline xattrs. */ -+#define DEF_ADDRS_PER_INODE 923 /* Address Pointers in an Inode. */ -+ -+#define ADDRS_PER_BLOCK 1018 /* Address Pointers in a Direct Block. */ -+#define NIDS_PER_BLOCK 1018 /* Node IDs in an Indirect Block. */ -+#define NODE_DIR1_BLOCK (DEF_ADDRS_PER_INODE + 1) -+#define NODE_DIR2_BLOCK (DEF_ADDRS_PER_INODE + 2) -+#define NODE_IND1_BLOCK (DEF_ADDRS_PER_INODE + 3) -+#define NODE_IND2_BLOCK (DEF_ADDRS_PER_INODE + 4) -+#define NODE_DIND_BLOCK (DEF_ADDRS_PER_INODE + 5) -+ -+#define MAX_INLINE_DATA (4 * (DEF_ADDRS_PER_INODE - \ -+ F2FS_INLINE_XATTR_ADDRS - 1)) -+#define NR_INLINE_DENTRY (MAX_INLINE_DATA * BITS_PER_BYTE / \ -+ ((SIZE_OF_DIR_ENTRY + F2FS_SLOT_LEN) * \ -+ BITS_PER_BYTE + 1)) -+#define INLINE_DENTRY_BITMAP_SIZE ((NR_INLINE_DENTRY + BITS_PER_BYTE - 1) / \ -+ BITS_PER_BYTE) -+#define INLINE_RESERVED_SIZE (MAX_INLINE_DATA - \ -+ ((SIZE_OF_DIR_ENTRY + F2FS_SLOT_LEN) * \ -+ NR_INLINE_DENTRY + \ -+ INLINE_DENTRY_BITMAP_SIZE)) -+#define CURSEG_HOT_DATA 0 -+ -+#define CKPT_FLAG_SET(ckpt, f) (ckpt)->ckpt_flags & \ -+ grub_cpu_to_le32_compile_time (f) -+ -+#define F2FS_INLINE_XATTR 0x01 /* File inline xattr flag. */ -+#define F2FS_INLINE_DATA 0x02 /* File inline data flag. */ -+#define F2FS_INLINE_DENTRY 0x04 /* File inline dentry flag. */ -+#define F2FS_DATA_EXIST 0x08 /* File inline data exist flag. */ -+#define F2FS_INLINE_DOTS 0x10 /* File having implicit dot dentries. */ -+ -+#define MAX_VOLUME_NAME 512 -+ -+enum FILE_TYPE -+{ -+ F2FS_FT_UNKNOWN, -+ F2FS_FT_REG_FILE = 1, -+ F2FS_FT_DIR = 2, -+ F2FS_FT_SYMLINK = 7 -+}; -+ -+struct grub_f2fs_superblock -+{ -+ grub_uint32_t magic; -+ grub_uint16_t dummy1[2]; -+ grub_uint32_t log_sectorsize; -+ grub_uint32_t log_sectors_per_block; -+ grub_uint32_t log_blocksize; -+ grub_uint32_t log_blocks_per_seg; -+ grub_uint32_t segs_per_sec; -+ grub_uint32_t secs_per_zone; -+ grub_uint32_t checksum_offset; -+ grub_uint8_t dummy2[40]; -+ grub_uint32_t cp_blkaddr; -+ grub_uint32_t sit_blkaddr; -+ grub_uint32_t nat_blkaddr; -+ grub_uint32_t ssa_blkaddr; -+ grub_uint32_t main_blkaddr; -+ grub_uint32_t root_ino; -+ grub_uint32_t node_ino; -+ grub_uint32_t meta_ino; -+ grub_uint8_t uuid[16]; -+ grub_uint16_t volume_name[MAX_VOLUME_NAME]; -+ grub_uint32_t extension_count; -+ grub_uint8_t extension_list[F2FS_MAX_EXTENSION][8]; -+ grub_uint32_t cp_payload; -+ grub_uint8_t version[VERSION_LEN]; -+ grub_uint8_t init_version[VERSION_LEN]; -+} GRUB_PACKED; -+ -+struct grub_f2fs_checkpoint -+{ -+ grub_uint64_t checkpoint_ver; -+ grub_uint64_t user_block_count; -+ grub_uint64_t valid_block_count; -+ grub_uint32_t rsvd_segment_count; -+ grub_uint32_t overprov_segment_count; -+ grub_uint32_t free_segment_count; -+ grub_uint32_t cur_node_segno[MAX_ACTIVE_NODE_LOGS]; -+ grub_uint16_t cur_node_blkoff[MAX_ACTIVE_NODE_LOGS]; -+ grub_uint32_t cur_data_segno[MAX_ACTIVE_DATA_LOGS]; -+ grub_uint16_t cur_data_blkoff[MAX_ACTIVE_DATA_LOGS]; -+ grub_uint32_t ckpt_flags; -+ grub_uint32_t cp_pack_total_block_count; -+ grub_uint32_t cp_pack_start_sum; -+ grub_uint32_t valid_node_count; -+ grub_uint32_t valid_inode_count; -+ grub_uint32_t next_free_nid; -+ grub_uint32_t sit_ver_bitmap_bytesize; -+ grub_uint32_t nat_ver_bitmap_bytesize; -+ grub_uint32_t checksum_offset; -+ grub_uint64_t elapsed_time; -+ grub_uint8_t alloc_type[MAX_ACTIVE_LOGS]; -+ grub_uint8_t sit_nat_version_bitmap[3900]; -+ grub_uint32_t checksum; -+} GRUB_PACKED; -+ -+struct grub_f2fs_nat_entry { -+ grub_uint8_t version; -+ grub_uint32_t ino; -+ grub_uint32_t block_addr; -+} GRUB_PACKED; -+ -+struct grub_f2fs_nat_jent -+{ -+ grub_uint32_t nid; -+ struct grub_f2fs_nat_entry ne; -+} GRUB_PACKED; -+ -+struct grub_f2fs_nat_journal { -+ grub_uint16_t n_nats; -+ struct grub_f2fs_nat_jent entries[NAT_JOURNAL_ENTRIES]; -+ grub_uint8_t reserved[NAT_JOURNAL_RESERVED]; -+} GRUB_PACKED; -+ -+struct grub_f2fs_nat_block { -+ struct grub_f2fs_nat_entry ne[NAT_ENTRY_PER_BLOCK]; -+} GRUB_PACKED; -+ -+struct grub_f2fs_dir_entry -+{ -+ grub_uint32_t hash_code; -+ grub_uint32_t ino; -+ grub_uint16_t name_len; -+ grub_uint8_t file_type; -+} GRUB_PACKED; -+ -+struct grub_f2fs_inline_dentry -+{ -+ grub_uint8_t dentry_bitmap[INLINE_DENTRY_BITMAP_SIZE]; -+ grub_uint8_t reserved[INLINE_RESERVED_SIZE]; -+ struct grub_f2fs_dir_entry dentry[NR_INLINE_DENTRY]; -+ grub_uint8_t filename[NR_INLINE_DENTRY][F2FS_SLOT_LEN]; -+} GRUB_PACKED; -+ -+struct grub_f2fs_dentry_block { -+ grub_uint8_t dentry_bitmap[SIZE_OF_DENTRY_BITMAP]; -+ grub_uint8_t reserved[SIZE_OF_RESERVED]; -+ struct grub_f2fs_dir_entry dentry[NR_DENTRY_IN_BLOCK]; -+ grub_uint8_t filename[NR_DENTRY_IN_BLOCK][F2FS_SLOT_LEN]; -+} GRUB_PACKED; -+ -+struct grub_f2fs_inode -+{ -+ grub_uint16_t i_mode; -+ grub_uint8_t i_advise; -+ grub_uint8_t i_inline; -+ grub_uint32_t i_uid; -+ grub_uint32_t i_gid; -+ grub_uint32_t i_links; -+ grub_uint64_t i_size; -+ grub_uint64_t i_blocks; -+ grub_uint64_t i_atime; -+ grub_uint64_t i_ctime; -+ grub_uint64_t i_mtime; -+ grub_uint32_t i_atime_nsec; -+ grub_uint32_t i_ctime_nsec; -+ grub_uint32_t i_mtime_nsec; -+ grub_uint32_t i_generation; -+ grub_uint32_t i_current_depth; -+ grub_uint32_t i_xattr_nid; -+ grub_uint32_t i_flags; -+ grub_uint32_t i_pino; -+ grub_uint32_t i_namelen; -+ grub_uint8_t i_name[F2FS_NAME_LEN]; -+ grub_uint8_t i_dir_level; -+ grub_uint8_t i_ext[12]; -+ grub_uint32_t i_addr[DEF_ADDRS_PER_INODE]; -+ grub_uint32_t i_nid[5]; -+} GRUB_PACKED; -+ -+struct grub_direct_node { -+ grub_uint32_t addr[ADDRS_PER_BLOCK]; -+} GRUB_PACKED; -+ -+struct grub_indirect_node { -+ grub_uint32_t nid[NIDS_PER_BLOCK]; -+} GRUB_PACKED; -+ -+struct grub_f2fs_node -+{ -+ union -+ { -+ struct grub_f2fs_inode i; -+ struct grub_direct_node dn; -+ struct grub_indirect_node in; -+ /* Should occupy F2FS_BLKSIZE totally. */ -+ char buf[F2FS_BLKSIZE - 40]; -+ }; -+ grub_uint8_t dummy[40]; -+} GRUB_PACKED; -+ -+struct grub_fshelp_node -+{ -+ struct grub_f2fs_data *data; -+ struct grub_f2fs_node inode; -+ grub_uint32_t ino; -+ int inode_read; -+}; -+ -+struct grub_f2fs_data -+{ -+ struct grub_f2fs_superblock sblock; -+ struct grub_f2fs_checkpoint ckpt; -+ -+ grub_uint32_t root_ino; -+ grub_uint32_t blocks_per_seg; -+ grub_uint32_t cp_blkaddr; -+ grub_uint32_t nat_blkaddr; -+ -+ struct grub_f2fs_nat_journal nat_j; -+ char *nat_bitmap; -+ -+ grub_disk_t disk; -+ struct grub_f2fs_node *inode; -+ struct grub_fshelp_node diropen; -+}; -+ -+struct grub_f2fs_dir_iter_ctx -+{ -+ struct grub_f2fs_data *data; -+ grub_fshelp_iterate_dir_hook_t hook; -+ void *hook_data; -+ grub_uint8_t *bitmap; -+ grub_uint8_t (*filename)[F2FS_SLOT_LEN]; -+ struct grub_f2fs_dir_entry *dentry; -+ int max; -+}; -+ -+struct grub_f2fs_dir_ctx -+{ -+ grub_fs_dir_hook_t hook; -+ void *hook_data; -+ struct grub_f2fs_data *data; -+}; -+ -+static grub_dl_t my_mod; -+ -+static int -+grub_f2fs_test_bit_le (int nr, const grub_uint8_t *addr) -+{ -+ return addr[nr >> 3] & (1 << (nr & 7)); -+} -+ -+static char * -+get_inline_addr (struct grub_f2fs_inode *inode) -+{ -+ return (char *) &inode->i_addr[1]; -+} -+ -+static grub_uint64_t -+grub_f2fs_file_size (struct grub_f2fs_inode *inode) -+{ -+ return grub_le_to_cpu64 (inode->i_size); -+} -+ -+static grub_uint32_t -+start_cp_addr (struct grub_f2fs_data *data) -+{ -+ struct grub_f2fs_checkpoint *ckpt = &data->ckpt; -+ grub_uint32_t start_addr = data->cp_blkaddr; -+ -+ if (!(ckpt->checkpoint_ver & grub_cpu_to_le64_compile_time(1))) -+ return start_addr + data->blocks_per_seg; -+ -+ return start_addr; -+} -+ -+static grub_uint32_t -+start_sum_block (struct grub_f2fs_data *data) -+{ -+ struct grub_f2fs_checkpoint *ckpt = &data->ckpt; -+ -+ return start_cp_addr (data) + grub_le_to_cpu32 (ckpt->cp_pack_start_sum); -+} -+ -+static grub_uint32_t -+sum_blk_addr (struct grub_f2fs_data *data, int base, int type) -+{ -+ struct grub_f2fs_checkpoint *ckpt = &data->ckpt; -+ -+ return start_cp_addr (data) + -+ grub_le_to_cpu32 (ckpt->cp_pack_total_block_count) - -+ (base + 1) + type; -+} -+ -+static void * -+nat_bitmap_ptr (struct grub_f2fs_data *data) -+{ -+ struct grub_f2fs_checkpoint *ckpt = &data->ckpt; -+ grub_uint32_t offset; -+ -+ if (grub_le_to_cpu32 (data->sblock.cp_payload) > 0) -+ return ckpt->sit_nat_version_bitmap; -+ -+ offset = grub_le_to_cpu32 (ckpt->sit_ver_bitmap_bytesize); -+ -+ return ckpt->sit_nat_version_bitmap + offset; -+} -+ -+static grub_uint32_t -+get_node_id (struct grub_f2fs_node *rn, int off, int inode_block) -+{ -+ if (inode_block) -+ return grub_le_to_cpu32 (rn->i.i_nid[off - NODE_DIR1_BLOCK]); -+ -+ return grub_le_to_cpu32 (rn->in.nid[off]); -+} -+ -+static grub_err_t -+grub_f2fs_block_read (struct grub_f2fs_data *data, grub_uint32_t blkaddr, -+ void *buf) -+{ -+ return grub_disk_read (data->disk, -+ ((grub_disk_addr_t)blkaddr) << F2FS_BLK_SEC_BITS, -+ 0, F2FS_BLKSIZE, buf); -+} -+ -+/* CRC32 */ -+static grub_uint32_t -+grub_f2fs_cal_crc32 (const void *buf, const grub_uint32_t len) -+{ -+ grub_uint32_t crc = F2FS_SUPER_MAGIC; -+ unsigned char *p = (unsigned char *)buf; -+ grub_uint32_t tmp = len; -+ int i; -+ -+ while (tmp--) -+ { -+ crc ^= *p++; -+ for (i = 0; i < 8; i++) -+ crc = (crc >> 1) ^ ((crc & 1) ? CRCPOLY_LE : 0); -+ } -+ -+ return crc; -+} -+ -+static int -+grub_f2fs_crc_valid (grub_uint32_t blk_crc, void *buf, const grub_uint32_t len) -+{ -+ grub_uint32_t cal_crc = 0; -+ -+ cal_crc = grub_f2fs_cal_crc32 (buf, len); -+ -+ return (cal_crc == blk_crc) ? 1 : 0; -+} -+ -+static int -+grub_f2fs_test_bit (grub_uint32_t nr, const char *p) -+{ -+ int mask; -+ -+ p += (nr >> 3); -+ mask = 1 << (7 - (nr & 0x07)); -+ -+ return mask & *p; -+} -+ -+static int -+grub_f2fs_sanity_check_sb (struct grub_f2fs_superblock *sb) -+{ -+ grub_uint32_t log_sectorsize, log_sectors_per_block; -+ -+ if (sb->magic != grub_cpu_to_le32_compile_time (F2FS_SUPER_MAGIC)) -+ return -1; -+ -+ if (sb->log_blocksize != grub_cpu_to_le32_compile_time (F2FS_BLK_BITS)) -+ return -1; -+ -+ log_sectorsize = grub_le_to_cpu32 (sb->log_sectorsize); -+ log_sectors_per_block = grub_le_to_cpu32 (sb->log_sectors_per_block); -+ -+ if (log_sectorsize > F2FS_BLK_BITS) -+ return -1; -+ -+ if (log_sectorsize < F2FS_MIN_LOG_SECTOR_SIZE) -+ return -1; -+ -+ if (log_sectors_per_block + log_sectorsize != F2FS_BLK_BITS) -+ return -1; -+ -+ return 0; -+} -+ -+static int -+grub_f2fs_read_sb (struct grub_f2fs_data *data, grub_disk_addr_t offset) -+{ -+ grub_disk_t disk = data->disk; -+ grub_err_t err; -+ -+ /* Read first super block. */ -+ err = grub_disk_read (disk, offset, 0, sizeof (data->sblock), &data->sblock); -+ if (err) -+ return -1; -+ -+ return grub_f2fs_sanity_check_sb (&data->sblock); -+} -+ -+static void * -+validate_checkpoint (struct grub_f2fs_data *data, grub_uint32_t cp_addr, -+ grub_uint64_t *version) -+{ -+ grub_uint32_t *cp_page_1, *cp_page_2; -+ struct grub_f2fs_checkpoint *cp_block; -+ grub_uint64_t cur_version = 0, pre_version = 0; -+ grub_uint32_t crc = 0; -+ grub_uint32_t crc_offset; -+ grub_err_t err; -+ -+ /* Read the 1st cp block in this CP pack. */ -+ cp_page_1 = grub_malloc (F2FS_BLKSIZE); -+ if (!cp_page_1) -+ return NULL; -+ -+ err = grub_f2fs_block_read (data, cp_addr, cp_page_1); -+ if (err) -+ goto invalid_cp1; -+ -+ cp_block = (struct grub_f2fs_checkpoint *)cp_page_1; -+ crc_offset = grub_le_to_cpu32 (cp_block->checksum_offset); -+ if (crc_offset != CHECKSUM_OFFSET) -+ goto invalid_cp1; -+ -+ crc = grub_le_to_cpu32 (*(cp_page_1 + U32_CHECKSUM_OFFSET)); -+ if (!grub_f2fs_crc_valid (crc, cp_block, crc_offset)) -+ goto invalid_cp1; -+ -+ pre_version = grub_le_to_cpu64 (cp_block->checkpoint_ver); -+ -+ /* Read the 2nd cp block in this CP pack. */ -+ cp_page_2 = grub_malloc (F2FS_BLKSIZE); -+ if (!cp_page_2) -+ goto invalid_cp1; -+ -+ cp_addr += grub_le_to_cpu32 (cp_block->cp_pack_total_block_count) - 1; -+ -+ err = grub_f2fs_block_read (data, cp_addr, cp_page_2); -+ if (err) -+ goto invalid_cp2; -+ -+ cp_block = (struct grub_f2fs_checkpoint *)cp_page_2; -+ crc_offset = grub_le_to_cpu32 (cp_block->checksum_offset); -+ if (crc_offset != CHECKSUM_OFFSET) -+ goto invalid_cp2; -+ -+ crc = grub_le_to_cpu32 (*(cp_page_2 + U32_CHECKSUM_OFFSET)); -+ if (!grub_f2fs_crc_valid (crc, cp_block, crc_offset)) -+ goto invalid_cp2; -+ -+ cur_version = grub_le_to_cpu64 (cp_block->checkpoint_ver); -+ if (cur_version == pre_version) -+ { -+ *version = cur_version; -+ grub_free (cp_page_2); -+ -+ return cp_page_1; -+ } -+ -+ invalid_cp2: -+ grub_free (cp_page_2); -+ -+ invalid_cp1: -+ grub_free (cp_page_1); -+ -+ return NULL; -+} -+ -+static grub_err_t -+grub_f2fs_read_cp (struct grub_f2fs_data *data) -+{ -+ void *cp1, *cp2, *cur_page; -+ grub_uint64_t cp1_version = 0, cp2_version = 0; -+ grub_uint64_t cp_start_blk_no; -+ -+ /* -+ * Finding out valid cp block involves read both -+ * sets (cp pack1 and cp pack 2). -+ */ -+ cp_start_blk_no = data->cp_blkaddr; -+ cp1 = validate_checkpoint (data, cp_start_blk_no, &cp1_version); -+ if (!cp1 && grub_errno) -+ return grub_errno; -+ -+ /* The second checkpoint pack should start at the next segment. */ -+ cp_start_blk_no += data->blocks_per_seg; -+ cp2 = validate_checkpoint (data, cp_start_blk_no, &cp2_version); -+ if (!cp2 && grub_errno) -+ { -+ grub_free (cp1); -+ return grub_errno; -+ } -+ -+ if (cp1 && cp2) -+ cur_page = (cp2_version > cp1_version) ? cp2 : cp1; -+ else if (cp1) -+ cur_page = cp1; -+ else if (cp2) -+ cur_page = cp2; -+ else -+ return grub_error (GRUB_ERR_BAD_FS, "no checkpoints"); -+ -+ grub_memcpy (&data->ckpt, cur_page, F2FS_BLKSIZE); -+ -+ grub_free (cp1); -+ grub_free (cp2); -+ -+ return 0; -+} -+ -+static grub_err_t -+get_nat_journal (struct grub_f2fs_data *data) -+{ -+ grub_uint32_t block; -+ char *buf; -+ grub_err_t err; -+ -+ buf = grub_malloc (F2FS_BLKSIZE); -+ if (!buf) -+ return grub_errno; -+ -+ if (CKPT_FLAG_SET(&data->ckpt, CP_COMPACT_SUM_FLAG)) -+ block = start_sum_block (data); -+ else if (CKPT_FLAG_SET (&data->ckpt, CP_UMOUNT_FLAG)) -+ block = sum_blk_addr (data, NR_CURSEG_TYPE, CURSEG_HOT_DATA); -+ else -+ block = sum_blk_addr (data, NR_CURSEG_DATA_TYPE, CURSEG_HOT_DATA); -+ -+ err = grub_f2fs_block_read (data, block, buf); -+ if (err) -+ goto fail; -+ -+ if (CKPT_FLAG_SET (&data->ckpt, CP_COMPACT_SUM_FLAG)) -+ grub_memcpy (&data->nat_j, buf, SUM_JOURNAL_SIZE); -+ else -+ grub_memcpy (&data->nat_j, buf + SUM_ENTRIES_SIZE, SUM_JOURNAL_SIZE); -+ -+ fail: -+ grub_free (buf); -+ -+ return err; -+} -+ -+static grub_uint32_t -+get_blkaddr_from_nat_journal (struct grub_f2fs_data *data, grub_uint32_t nid) -+{ -+ grub_uint16_t n = grub_le_to_cpu16 (data->nat_j.n_nats); -+ grub_uint32_t blkaddr = 0; -+ grub_uint16_t i; -+ -+ for (i = 0; i < n; i++) -+ { -+ if (grub_le_to_cpu32 (data->nat_j.entries[i].nid) == nid) -+ { -+ blkaddr = grub_le_to_cpu32 (data->nat_j.entries[i].ne.block_addr); -+ break; -+ } -+ } -+ -+ return blkaddr; -+} -+ -+static grub_uint32_t -+get_node_blkaddr (struct grub_f2fs_data *data, grub_uint32_t nid) -+{ -+ struct grub_f2fs_nat_block *nat_block; -+ grub_uint32_t seg_off, block_off, entry_off, block_addr; -+ grub_uint32_t blkaddr; -+ grub_err_t err; -+ -+ blkaddr = get_blkaddr_from_nat_journal (data, nid); -+ if (blkaddr) -+ return blkaddr; -+ -+ nat_block = grub_malloc (F2FS_BLKSIZE); -+ if (!nat_block) -+ return 0; -+ -+ block_off = nid / NAT_ENTRY_PER_BLOCK; -+ entry_off = nid % NAT_ENTRY_PER_BLOCK; -+ -+ seg_off = block_off / data->blocks_per_seg; -+ block_addr = data->nat_blkaddr + -+ ((seg_off * data->blocks_per_seg) << 1) + -+ (block_off & (data->blocks_per_seg - 1)); -+ -+ if (grub_f2fs_test_bit (block_off, data->nat_bitmap)) -+ block_addr += data->blocks_per_seg; -+ -+ err = grub_f2fs_block_read (data, block_addr, nat_block); -+ if (err) -+ { -+ grub_free (nat_block); -+ return 0; -+ } -+ -+ blkaddr = grub_le_to_cpu32 (nat_block->ne[entry_off].block_addr); -+ -+ grub_free (nat_block); -+ -+ return blkaddr; -+} -+ -+static int -+grub_get_node_path (struct grub_f2fs_inode *inode, grub_uint32_t block, -+ grub_uint32_t offset[4], grub_uint32_t noffset[4]) -+{ -+ grub_uint32_t direct_blks = ADDRS_PER_BLOCK; -+ grub_uint32_t dptrs_per_blk = NIDS_PER_BLOCK; -+ grub_uint32_t indirect_blks = ADDRS_PER_BLOCK * NIDS_PER_BLOCK; -+ grub_uint32_t dindirect_blks = indirect_blks * NIDS_PER_BLOCK; -+ grub_uint32_t direct_index = DEF_ADDRS_PER_INODE; -+ int n = 0; -+ int level = 0; -+ -+ if (inode->i_inline & F2FS_INLINE_XATTR) -+ direct_index -= F2FS_INLINE_XATTR_ADDRS; -+ -+ noffset[0] = 0; -+ -+ if (block < direct_index) -+ { -+ offset[n] = block; -+ goto got; -+ } -+ -+ block -= direct_index; -+ if (block < direct_blks) -+ { -+ offset[n++] = NODE_DIR1_BLOCK; -+ noffset[n] = 1; -+ offset[n] = block; -+ level = 1; -+ goto got; -+ } -+ -+ block -= direct_blks; -+ if (block < direct_blks) -+ { -+ offset[n++] = NODE_DIR2_BLOCK; -+ noffset[n] = 2; -+ offset[n] = block; -+ level = 1; -+ goto got; -+ } -+ -+ block -= direct_blks; -+ if (block < indirect_blks) -+ { -+ offset[n++] = NODE_IND1_BLOCK; -+ noffset[n] = 3; -+ offset[n++] = block / direct_blks; -+ noffset[n] = 4 + offset[n - 1]; -+ offset[n] = block % direct_blks; -+ level = 2; -+ goto got; -+ } -+ -+ block -= indirect_blks; -+ if (block < indirect_blks) -+ { -+ offset[n++] = NODE_IND2_BLOCK; -+ noffset[n] = 4 + dptrs_per_blk; -+ offset[n++] = block / direct_blks; -+ noffset[n] = 5 + dptrs_per_blk + offset[n - 1]; -+ offset[n] = block % direct_blks; -+ level = 2; -+ goto got; -+ } -+ -+ block -= indirect_blks; -+ if (block < dindirect_blks) -+ { -+ offset[n++] = NODE_DIND_BLOCK; -+ noffset[n] = 5 + (dptrs_per_blk * 2); -+ offset[n++] = block / indirect_blks; -+ noffset[n] = 6 + (dptrs_per_blk * 2) + -+ offset[n - 1] * (dptrs_per_blk + 1); -+ offset[n++] = (block / direct_blks) % dptrs_per_blk; -+ noffset[n] = 7 + (dptrs_per_blk * 2) + -+ offset[n - 2] * (dptrs_per_blk + 1) + offset[n - 1]; -+ offset[n] = block % direct_blks; -+ level = 3; -+ goto got; -+ } -+ -+ got: -+ return level; -+} -+ -+static grub_err_t -+grub_f2fs_read_node (struct grub_f2fs_data *data, -+ grub_uint32_t nid, struct grub_f2fs_node *np) -+{ -+ grub_uint32_t blkaddr; -+ -+ blkaddr = get_node_blkaddr (data, nid); -+ if (!blkaddr) -+ return grub_errno; -+ -+ return grub_f2fs_block_read (data, blkaddr, np); -+} -+ -+static struct grub_f2fs_data * -+grub_f2fs_mount (grub_disk_t disk) -+{ -+ struct grub_f2fs_data *data; -+ grub_err_t err; -+ -+ data = grub_malloc (sizeof (*data)); -+ if (!data) -+ return NULL; -+ -+ data->disk = disk; -+ -+ if (grub_f2fs_read_sb (data, F2FS_SUPER_OFFSET0)) -+ { -+ if (grub_f2fs_read_sb (data, F2FS_SUPER_OFFSET1)) -+ { -+ if (grub_errno == GRUB_ERR_NONE) -+ grub_error (GRUB_ERR_BAD_FS, -+ "not a F2FS filesystem (no superblock)"); -+ goto fail; -+ } -+ } -+ -+ data->root_ino = grub_le_to_cpu32 (data->sblock.root_ino); -+ data->cp_blkaddr = grub_le_to_cpu32 (data->sblock.cp_blkaddr); -+ data->nat_blkaddr = grub_le_to_cpu32 (data->sblock.nat_blkaddr); -+ data->blocks_per_seg = 1 << -+ grub_le_to_cpu32 (data->sblock.log_blocks_per_seg); -+ -+ err = grub_f2fs_read_cp (data); -+ if (err) -+ goto fail; -+ -+ data->nat_bitmap = nat_bitmap_ptr (data); -+ -+ err = get_nat_journal (data); -+ if (err) -+ goto fail; -+ -+ data->diropen.data = data; -+ data->diropen.ino = data->root_ino; -+ data->diropen.inode_read = 1; -+ data->inode = &data->diropen.inode; -+ -+ err = grub_f2fs_read_node (data, data->root_ino, data->inode); -+ if (err) -+ goto fail; -+ -+ return data; -+ -+ fail: -+ grub_free (data); -+ -+ return NULL; -+} -+ -+/* Guarantee inline_data was handled by caller. */ -+static grub_disk_addr_t -+grub_f2fs_get_block (grub_fshelp_node_t node, grub_disk_addr_t block_ofs) -+{ -+ struct grub_f2fs_data *data = node->data; -+ struct grub_f2fs_inode *inode = &node->inode.i; -+ grub_uint32_t offset[4], noffset[4], nids[4]; -+ struct grub_f2fs_node *node_block; -+ grub_uint32_t block_addr = -1; -+ int level, i; -+ -+ level = grub_get_node_path (inode, block_ofs, offset, noffset); -+ if (level == 0) -+ return grub_le_to_cpu32 (inode->i_addr[offset[0]]); -+ -+ node_block = grub_malloc (F2FS_BLKSIZE); -+ if (!node_block) -+ return -1; -+ -+ nids[1] = get_node_id (&node->inode, offset[0], 1); -+ -+ /* Get indirect or direct nodes. */ -+ for (i = 1; i <= level; i++) -+ { -+ grub_f2fs_read_node (data, nids[i], node_block); -+ if (grub_errno) -+ goto fail; -+ -+ if (i < level) -+ nids[i + 1] = get_node_id (node_block, offset[i], 0); -+ } -+ -+ block_addr = grub_le_to_cpu32 (node_block->dn.addr[offset[level]]); -+ -+ fail: -+ grub_free (node_block); -+ -+ return block_addr; -+} -+ -+static grub_ssize_t -+grub_f2fs_read_file (grub_fshelp_node_t node, -+ grub_disk_read_hook_t read_hook, void *read_hook_data, -+ grub_off_t pos, grub_size_t len, char *buf) -+{ -+ struct grub_f2fs_inode *inode = &node->inode.i; -+ grub_off_t filesize = grub_f2fs_file_size (inode); -+ char *inline_addr = get_inline_addr (inode); -+ -+ if (inode->i_inline & F2FS_INLINE_DATA) -+ { -+ if (filesize > MAX_INLINE_DATA) -+ return -1; -+ -+ if (len > filesize - pos) -+ len = filesize - pos; -+ -+ grub_memcpy (buf, inline_addr + pos, len); -+ return len; -+ } -+ -+ return grub_fshelp_read_file (node->data->disk, node, -+ read_hook, read_hook_data, -+ pos, len, buf, grub_f2fs_get_block, -+ filesize, -+ F2FS_BLK_SEC_BITS, 0); -+} -+ -+static char * -+grub_f2fs_read_symlink (grub_fshelp_node_t node) -+{ -+ char *symlink; -+ struct grub_fshelp_node *diro = node; -+ grub_uint64_t filesize; -+ -+ if (!diro->inode_read) -+ { -+ grub_f2fs_read_node (diro->data, diro->ino, &diro->inode); -+ if (grub_errno) -+ return 0; -+ } -+ -+ filesize = grub_f2fs_file_size(&diro->inode.i); -+ -+ symlink = grub_malloc (filesize + 1); -+ if (!symlink) -+ return 0; -+ -+ grub_f2fs_read_file (diro, 0, 0, 0, filesize, symlink); -+ if (grub_errno) -+ { -+ grub_free (symlink); -+ return 0; -+ } -+ -+ symlink[filesize] = '\0'; -+ -+ return symlink; -+} -+ -+static int -+grub_f2fs_check_dentries (struct grub_f2fs_dir_iter_ctx *ctx) -+{ -+ struct grub_fshelp_node *fdiro; -+ int i; -+ -+ for (i = 0; i < ctx->max;) -+ { -+ char *filename; -+ enum grub_fshelp_filetype type = GRUB_FSHELP_UNKNOWN; -+ enum FILE_TYPE ftype; -+ int name_len; -+ int ret; -+ -+ if (grub_f2fs_test_bit_le (i, ctx->bitmap) == 0) -+ { -+ i++; -+ continue; -+ } -+ -+ ftype = ctx->dentry[i].file_type; -+ name_len = grub_le_to_cpu16 (ctx->dentry[i].name_len); -+ filename = grub_malloc (name_len + 1); -+ if (!filename) -+ return 0; -+ -+ grub_memcpy (filename, ctx->filename[i], name_len); -+ filename[name_len] = 0; -+ -+ fdiro = grub_malloc (sizeof (struct grub_fshelp_node)); -+ if (!fdiro) -+ { -+ grub_free(filename); -+ return 0; -+ } -+ -+ if (ftype == F2FS_FT_DIR) -+ type = GRUB_FSHELP_DIR; -+ else if (ftype == F2FS_FT_SYMLINK) -+ type = GRUB_FSHELP_SYMLINK; -+ else if (ftype == F2FS_FT_REG_FILE) -+ type = GRUB_FSHELP_REG; -+ -+ fdiro->data = ctx->data; -+ fdiro->ino = grub_le_to_cpu32 (ctx->dentry[i].ino); -+ fdiro->inode_read = 0; -+ -+ ret = ctx->hook (filename, type, fdiro, ctx->hook_data); -+ grub_free(filename); -+ if (ret) -+ return 1; -+ -+ i += (name_len + F2FS_SLOT_LEN - 1) / F2FS_SLOT_LEN; -+ } -+ -+ return 0; -+} -+ -+static int -+grub_f2fs_iterate_inline_dir (struct grub_f2fs_inode *dir, -+ struct grub_f2fs_dir_iter_ctx *ctx) -+{ -+ struct grub_f2fs_inline_dentry *de_blk; -+ -+ de_blk = (struct grub_f2fs_inline_dentry *) get_inline_addr (dir); -+ -+ ctx->bitmap = de_blk->dentry_bitmap; -+ ctx->dentry = de_blk->dentry; -+ ctx->filename = de_blk->filename; -+ ctx->max = NR_INLINE_DENTRY; -+ -+ return grub_f2fs_check_dentries (ctx); -+} -+ -+static int -+grub_f2fs_iterate_dir (grub_fshelp_node_t dir, -+ grub_fshelp_iterate_dir_hook_t hook, void *hook_data) -+{ -+ struct grub_fshelp_node *diro = (struct grub_fshelp_node *) dir; -+ struct grub_f2fs_inode *inode; -+ struct grub_f2fs_dir_iter_ctx ctx = { -+ .data = diro->data, -+ .hook = hook, -+ .hook_data = hook_data -+ }; -+ grub_off_t fpos = 0; -+ -+ if (!diro->inode_read) -+ { -+ grub_f2fs_read_node (diro->data, diro->ino, &diro->inode); -+ if (grub_errno) -+ return 0; -+ } -+ -+ inode = &diro->inode.i; -+ -+ if (inode->i_inline & F2FS_INLINE_DENTRY) -+ return grub_f2fs_iterate_inline_dir (inode, &ctx); -+ -+ while (fpos < grub_f2fs_file_size (inode)) -+ { -+ struct grub_f2fs_dentry_block *de_blk; -+ char *buf; -+ int ret; -+ -+ buf = grub_zalloc (F2FS_BLKSIZE); -+ if (!buf) -+ return 0; -+ -+ grub_f2fs_read_file (diro, 0, 0, fpos, F2FS_BLKSIZE, buf); -+ if (grub_errno) -+ { -+ grub_free (buf); -+ return 0; -+ } -+ -+ de_blk = (struct grub_f2fs_dentry_block *) buf; -+ -+ ctx.bitmap = de_blk->dentry_bitmap; -+ ctx.dentry = de_blk->dentry; -+ ctx.filename = de_blk->filename; -+ ctx.max = NR_DENTRY_IN_BLOCK; -+ -+ ret = grub_f2fs_check_dentries (&ctx); -+ grub_free (buf); -+ if (ret) -+ return 1; -+ -+ fpos += F2FS_BLKSIZE; -+ } -+ -+ return 0; -+} -+ -+static int -+grub_f2fs_dir_iter (const char *filename, enum grub_fshelp_filetype filetype, -+ grub_fshelp_node_t node, void *data) -+{ -+ struct grub_f2fs_dir_ctx *ctx = data; -+ struct grub_dirhook_info info; -+ -+ grub_memset (&info, 0, sizeof (info)); -+ if (!node->inode_read) -+ { -+ grub_f2fs_read_node (ctx->data, node->ino, &node->inode); -+ if (!grub_errno) -+ node->inode_read = 1; -+ grub_errno = GRUB_ERR_NONE; -+ } -+ if (node->inode_read) -+ { -+ info.mtimeset = 1; -+ info.mtime = grub_le_to_cpu64 (node->inode.i.i_mtime); -+ } -+ -+ info.dir = ((filetype & GRUB_FSHELP_TYPE_MASK) == GRUB_FSHELP_DIR); -+ grub_free (node); -+ -+ return ctx->hook (filename, &info, ctx->hook_data); -+} -+ -+static grub_err_t -+grub_f2fs_dir (grub_device_t device, const char *path, -+ grub_fs_dir_hook_t hook, void *hook_data) -+{ -+ struct grub_f2fs_dir_ctx ctx = { -+ .hook = hook, -+ .hook_data = hook_data -+ }; -+ struct grub_fshelp_node *fdiro = 0; -+ -+ grub_dl_ref (my_mod); -+ -+ ctx.data = grub_f2fs_mount (device->disk); -+ if (!ctx.data) -+ goto fail; -+ -+ grub_fshelp_find_file (path, &ctx.data->diropen, &fdiro, -+ grub_f2fs_iterate_dir, grub_f2fs_read_symlink, -+ GRUB_FSHELP_DIR); -+ if (grub_errno) -+ goto fail; -+ -+ grub_f2fs_iterate_dir (fdiro, grub_f2fs_dir_iter, &ctx); -+ -+ fail: -+ if (fdiro != &ctx.data->diropen) -+ grub_free (fdiro); -+ grub_free (ctx.data); -+ grub_dl_unref (my_mod); -+ -+ return grub_errno; -+} -+ -+/* Open a file named NAME and initialize FILE. */ -+static grub_err_t -+grub_f2fs_open (struct grub_file *file, const char *name) -+{ -+ struct grub_f2fs_data *data = NULL; -+ struct grub_fshelp_node *fdiro = 0; -+ struct grub_f2fs_inode *inode; -+ -+ grub_dl_ref (my_mod); -+ -+ data = grub_f2fs_mount (file->device->disk); -+ if (!data) -+ goto fail; -+ -+ grub_fshelp_find_file (name, &data->diropen, &fdiro, -+ grub_f2fs_iterate_dir, grub_f2fs_read_symlink, -+ GRUB_FSHELP_REG); -+ if (grub_errno) -+ goto fail; -+ -+ if (!fdiro->inode_read) -+ { -+ grub_f2fs_read_node (data, fdiro->ino, &fdiro->inode); -+ if (grub_errno) -+ goto fail; -+ } -+ -+ grub_memcpy (data->inode, &fdiro->inode, sizeof (*data->inode)); -+ grub_free (fdiro); -+ -+ inode = &(data->inode->i); -+ file->size = grub_f2fs_file_size (inode); -+ file->data = data; -+ file->offset = 0; -+ -+ if (inode->i_inline & F2FS_INLINE_DATA && file->size > MAX_INLINE_DATA) -+ grub_error (GRUB_ERR_BAD_FS, "corrupted inline_data: need fsck"); -+ -+ return 0; -+ -+ fail: -+ if (fdiro != &data->diropen) -+ grub_free (fdiro); -+ grub_free (data); -+ -+ grub_dl_unref (my_mod); -+ -+ return grub_errno; -+} -+ -+static grub_ssize_t -+grub_f2fs_read (grub_file_t file, char *buf, grub_size_t len) -+{ -+ struct grub_f2fs_data *data = (struct grub_f2fs_data *) file->data; -+ -+ return grub_f2fs_read_file (&data->diropen, -+ file->read_hook, file->read_hook_data, -+ file->offset, len, buf); -+} -+ -+static grub_err_t -+grub_f2fs_close (grub_file_t file) -+{ -+ struct grub_f2fs_data *data = (struct grub_f2fs_data *) file->data; -+ -+ grub_free (data); -+ -+ grub_dl_unref (my_mod); -+ -+ return GRUB_ERR_NONE; -+} -+ -+static grub_uint8_t * -+grub_f2fs_utf16_to_utf8 (grub_uint16_t *in_buf_le) -+{ -+ grub_uint16_t in_buf[MAX_VOLUME_NAME]; -+ grub_uint8_t *out_buf; -+ int len = 0; -+ -+ out_buf = grub_malloc (MAX_VOLUME_NAME * GRUB_MAX_UTF8_PER_UTF16 + 1); -+ if (!out_buf) -+ return NULL; -+ -+ while (*in_buf_le != 0 && len < MAX_VOLUME_NAME) { -+ in_buf[len] = grub_le_to_cpu16 (in_buf_le[len]); -+ len++; -+ } -+ -+ *grub_utf16_to_utf8 (out_buf, in_buf, len) = '\0'; -+ -+ return out_buf; -+} -+ -+static grub_err_t -+grub_f2fs_label (grub_device_t device, char **label) -+{ -+ struct grub_f2fs_data *data; -+ grub_disk_t disk = device->disk; -+ -+ grub_dl_ref (my_mod); -+ -+ data = grub_f2fs_mount (disk); -+ if (data) -+ *label = (char *) grub_f2fs_utf16_to_utf8 (data->sblock.volume_name); -+ else -+ *label = NULL; -+ -+ grub_free (data); -+ grub_dl_unref (my_mod); -+ -+ return grub_errno; -+} -+ -+static grub_err_t -+grub_f2fs_uuid (grub_device_t device, char **uuid) -+{ -+ struct grub_f2fs_data *data; -+ grub_disk_t disk = device->disk; -+ -+ grub_dl_ref (my_mod); -+ -+ data = grub_f2fs_mount (disk); -+ if (data) -+ { -+ *uuid = -+ grub_xasprintf -+ ("%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", -+ data->sblock.uuid[0], data->sblock.uuid[1], -+ data->sblock.uuid[2], data->sblock.uuid[3], -+ data->sblock.uuid[4], data->sblock.uuid[5], -+ data->sblock.uuid[6], data->sblock.uuid[7], -+ data->sblock.uuid[8], data->sblock.uuid[9], -+ data->sblock.uuid[10], data->sblock.uuid[11], -+ data->sblock.uuid[12], data->sblock.uuid[13], -+ data->sblock.uuid[14], data->sblock.uuid[15]); -+ } -+ else -+ *uuid = NULL; -+ -+ grub_free (data); -+ grub_dl_unref (my_mod); -+ -+ return grub_errno; -+} -+ -+static struct grub_fs grub_f2fs_fs = { -+ .name = "f2fs", -+ .dir = grub_f2fs_dir, -+ .open = grub_f2fs_open, -+ .read = grub_f2fs_read, -+ .close = grub_f2fs_close, -+ .label = grub_f2fs_label, -+ .uuid = grub_f2fs_uuid, -+#ifdef GRUB_UTIL -+ .reserved_first_sector = 1, -+ .blocklist_install = 0, -+#endif -+ .next = 0 -+}; -+ -+GRUB_MOD_INIT (f2fs) -+{ -+ grub_fs_register (&grub_f2fs_fs); -+ my_mod = mod; -+} -+ -+GRUB_MOD_FINI (f2fs) -+{ -+ grub_fs_unregister (&grub_f2fs_fs); -+} -diff --git a/grub-core/fs/udf.c b/grub-core/fs/udf.c -index 839bff88963baba7730d788869e1f50481a66a30..00a16098b47aff52a352fa9433e279beae261329 100644 ---- a/grub-core/fs/udf.c -+++ b/grub-core/fs/udf.c -@@ -321,6 +321,32 @@ struct grub_udf_partmap - }; - } GRUB_PACKED; - -+struct grub_udf_pvd -+{ -+ struct grub_udf_tag tag; -+ grub_uint32_t seq_num; -+ grub_uint32_t pvd_num; -+ grub_uint8_t ident[32]; -+ grub_uint16_t vol_seq_num; -+ grub_uint16_t max_vol_seq_num; -+ grub_uint16_t interchange_level; -+ grub_uint16_t max_interchange_level; -+ grub_uint32_t charset_list; -+ grub_uint32_t max_charset_list; -+ grub_uint8_t volset_ident[128]; -+ struct grub_udf_charspec desc_charset; -+ struct grub_udf_charspec expl_charset; -+ struct grub_udf_extent_ad vol_abstract; -+ struct grub_udf_extent_ad vol_copyright; -+ struct grub_udf_regid app_ident; -+ struct grub_udf_timestamp recording_time; -+ struct grub_udf_regid imp_ident; -+ grub_uint8_t imp_use[64]; -+ grub_uint32_t pred_vds_loc; -+ grub_uint16_t flags; -+ grub_uint8_t reserved[22]; -+} GRUB_PACKED; -+ - struct grub_udf_lvd - { - struct grub_udf_tag tag; -@@ -348,6 +374,7 @@ struct grub_udf_aed - struct grub_udf_data - { - grub_disk_t disk; -+ struct grub_udf_pvd pvd; - struct grub_udf_lvd lvd; - struct grub_udf_pd pds[GRUB_UDF_MAX_PDS]; - struct grub_udf_partmap *pms[GRUB_UDF_MAX_PMS]; -@@ -692,7 +719,17 @@ grub_udf_mount (grub_disk_t disk) - } - - tag.tag_ident = U16 (tag.tag_ident); -- if (tag.tag_ident == GRUB_UDF_TAG_IDENT_PD) -+ if (tag.tag_ident == GRUB_UDF_TAG_IDENT_PVD) -+ { -+ if (grub_disk_read (disk, block << lbshift, 0, -+ sizeof (struct grub_udf_pvd), -+ &data->pvd)) -+ { -+ grub_error (GRUB_ERR_BAD_FS, "not an UDF filesystem"); -+ goto fail; -+ } -+ } -+ else if (tag.tag_ident == GRUB_UDF_TAG_IDENT_PD) - { - if (data->npd >= GRUB_UDF_MAX_PDS) - { -@@ -860,6 +897,25 @@ read_string (const grub_uint8_t *raw, grub_size_t sz, char *outbuf) - return outbuf; - } - -+static char * -+read_dstring (const grub_uint8_t *raw, grub_size_t sz) -+{ -+ grub_size_t len; -+ -+ if (raw[0] == 0) { -+ char *outbuf = grub_malloc (1); -+ if (!outbuf) -+ return NULL; -+ outbuf[0] = 0; -+ return outbuf; -+ } -+ -+ len = raw[sz - 1]; -+ if (len > sz - 1) -+ len = sz - 1; -+ return read_string (raw, len, NULL); -+} -+ - static int - grub_udf_iterate_dir (grub_fshelp_node_t dir, - grub_fshelp_iterate_dir_hook_t hook, void *hook_data) -@@ -1197,7 +1253,7 @@ grub_udf_label (grub_device_t device, char **label) - - if (data) - { -- *label = read_string (data->lvd.ident, sizeof (data->lvd.ident), 0); -+ *label = read_dstring (data->lvd.ident, sizeof (data->lvd.ident)); - grub_free (data); - } - else -@@ -1206,6 +1262,87 @@ grub_udf_label (grub_device_t device, char **label) - return grub_errno; - } - -+static char * -+gen_uuid_from_volset (char *volset_ident) -+{ -+ grub_size_t i; -+ grub_size_t len; -+ grub_size_t nonhexpos; -+ grub_uint8_t buf[17]; -+ char *uuid; -+ -+ len = grub_strlen (volset_ident); -+ if (len < 8) -+ return NULL; -+ -+ uuid = grub_malloc (17); -+ if (!uuid) -+ return NULL; -+ -+ if (len > 16) -+ len = 16; -+ -+ grub_memset (buf, 0, sizeof (buf)); -+ grub_memcpy (buf, volset_ident, len); -+ -+ nonhexpos = 16; -+ for (i = 0; i < 16; ++i) -+ { -+ if (!grub_isxdigit (buf[i])) -+ { -+ nonhexpos = i; -+ break; -+ } -+ } -+ -+ if (nonhexpos < 8) -+ { -+ grub_snprintf (uuid, 17, "%02x%02x%02x%02x%02x%02x%02x%02x", -+ buf[0], buf[1], buf[2], buf[3], -+ buf[4], buf[5], buf[6], buf[7]); -+ } -+ else if (nonhexpos < 16) -+ { -+ for (i = 0; i < 8; ++i) -+ uuid[i] = grub_tolower (buf[i]); -+ grub_snprintf (uuid+8, 9, "%02x%02x%02x%02x", -+ buf[8], buf[9], buf[10], buf[11]); -+ } -+ else -+ { -+ for (i = 0; i < 16; ++i) -+ uuid[i] = grub_tolower (buf[i]); -+ uuid[16] = 0; -+ } -+ -+ return uuid; -+} -+ -+static grub_err_t -+grub_udf_uuid (grub_device_t device, char **uuid) -+{ -+ char *volset_ident; -+ struct grub_udf_data *data; -+ data = grub_udf_mount (device->disk); -+ -+ if (data) -+ { -+ volset_ident = read_dstring (data->pvd.volset_ident, sizeof (data->pvd.volset_ident)); -+ if (volset_ident) -+ { -+ *uuid = gen_uuid_from_volset (volset_ident); -+ grub_free (volset_ident); -+ } -+ else -+ *uuid = 0; -+ grub_free (data); -+ } -+ else -+ *uuid = 0; -+ -+ return grub_errno; -+} -+ - static struct grub_fs grub_udf_fs = { - .name = "udf", - .dir = grub_udf_dir, -@@ -1213,6 +1350,7 @@ static struct grub_fs grub_udf_fs = { - .read = grub_udf_read, - .close = grub_udf_close, - .label = grub_udf_label, -+ .uuid = grub_udf_uuid, - #ifdef GRUB_UTIL - .reserved_first_sector = 1, - .blocklist_install = 1, -diff --git a/grub-core/fs/xfs.c b/grub-core/fs/xfs.c -index 9f66dd6e4c6491e6b2cbfc7866335b432c824502..3b00c744e23c34243df781baa96e5b1b0d88417d 100644 ---- a/grub-core/fs/xfs.c -+++ b/grub-core/fs/xfs.c -@@ -79,9 +79,18 @@ GRUB_MOD_LICENSE ("GPLv3+"); - #define XFS_SB_FEAT_INCOMPAT_SPINODES (1 << 1) /* sparse inode chunks */ - #define XFS_SB_FEAT_INCOMPAT_META_UUID (1 << 2) /* metadata UUID */ - --/* We do not currently verify metadata UUID so it is safe to read such filesystem */ -+/* -+ * Directory entries with ftype are explicitly handled by GRUB code. -+ * -+ * We do not currently read the inode btrees, so it is safe to read filesystems -+ * with the XFS_SB_FEAT_INCOMPAT_SPINODES feature. -+ * -+ * We do not currently verify metadata UUID, so it is safe to read filesystems -+ * with the XFS_SB_FEAT_INCOMPAT_META_UUID feature. -+ */ - #define XFS_SB_FEAT_INCOMPAT_SUPPORTED \ - (XFS_SB_FEAT_INCOMPAT_FTYPE | \ -+ XFS_SB_FEAT_INCOMPAT_SPINODES | \ - XFS_SB_FEAT_INCOMPAT_META_UUID) - - struct grub_xfs_sblock -@@ -828,6 +837,9 @@ grub_xfs_iterate_dir (grub_fshelp_node_t dir, - entries = (grub_be_to_cpu32 (tail->leaf_count) - - grub_be_to_cpu32 (tail->leaf_stale)); - -+ if (!entries) -+ continue; -+ - /* Iterate over all entries within this block. */ - while ((char *)direntry < (char *)tail) - { -diff --git a/grub-core/fs/zfs/zfs_lz4.c b/grub-core/fs/zfs/zfs_lz4.c -index 2f73449f0d4c63cadc7b5b4388250a4d474594b6..5453822d0258527ba751e551cbb54753f0331043 100644 ---- a/grub-core/fs/zfs/zfs_lz4.c -+++ b/grub-core/fs/zfs/zfs_lz4.c -@@ -73,7 +73,6 @@ static int LZ4_uncompress_unknownOutputSize(const char *source, char *dest, - #define U32 grub_uint32_t - #define S32 grub_int32_t - #define U64 grub_uint64_t --typedef grub_size_t size_t; - - typedef struct _U16_S { - U16 v; -@@ -133,10 +132,10 @@ typedef struct _U64_S { - - /* Decompression functions */ - grub_err_t --lz4_decompress(void *s_start, void *d_start, size_t s_len, size_t d_len); -+lz4_decompress(void *s_start, void *d_start, grub_size_t s_len, grub_size_t d_len); - - grub_err_t --lz4_decompress(void *s_start, void *d_start, size_t s_len, size_t d_len) -+lz4_decompress(void *s_start, void *d_start, grub_size_t s_len, grub_size_t d_len) - { - const BYTE *src = s_start; - U32 bufsiz = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | -@@ -167,7 +166,7 @@ LZ4_uncompress_unknownOutputSize(const char *source, - BYTE *const oend = op + maxOutputSize; - BYTE *cpy; - -- size_t dec[] = { 0, 3, 2, 3, 0, 0, 0, 0 }; -+ grub_size_t dec[] = { 0, 3, 2, 3, 0, 0, 0, 0 }; - - /* Main Loop */ - while (ip < iend) { -@@ -237,8 +236,8 @@ LZ4_uncompress_unknownOutputSize(const char *source, - /* copy repeated sequence */ - if unlikely(op - ref < STEPSIZE) { - #if LZ4_ARCH64 -- size_t dec2table[] = { 0, 0, 0, -1, 0, 1, 2, 3 }; -- size_t dec2 = dec2table[op - ref]; -+ grub_size_t dec2table[] = { 0, 0, 0, -1, 0, 1, 2, 3 }; -+ grub_size_t dec2 = dec2table[op - ref]; - #else - const int dec2 = 0; - #endif -diff --git a/grub-core/io/bufio.c b/grub-core/io/bufio.c -index 22438277d7456358dfc6bcbb51317fd704987738..dbed64744317c2f849fb2bda8fd5a6b142affe91 100644 ---- a/grub-core/io/bufio.c -+++ b/grub-core/io/bufio.c -@@ -61,6 +61,13 @@ grub_bufio_open (grub_file_t io, int size) - size = ((io->size > GRUB_BUFIO_MAX_SIZE) ? GRUB_BUFIO_MAX_SIZE : - io->size); - -+ /* -+ * Round up size to power of 2 which the binary math to -+ * calculate next_buf in grub_bufio_read() requires. -+ */ -+ while (size & (size - 1)) -+ size = (size | (size - 1)) + 1; -+ - bufio = grub_zalloc (sizeof (struct grub_bufio) + size); - if (! bufio) - { -diff --git a/grub-core/io/gzio.c b/grub-core/io/gzio.c -index 0f2ea6bd845227265eef205c212e7c52ee03ebcf..86ea8cfdea2e0abd1f73c6df4dca58806c8f2d9b 100644 ---- a/grub-core/io/gzio.c -+++ b/grub-core/io/gzio.c -@@ -43,6 +43,7 @@ - #include - #include - #include -+#include - - GRUB_MOD_LICENSE ("GPLv3+"); - -@@ -94,6 +95,14 @@ struct grub_gzio - struct huft *tl; - /* The distance code table. */ - struct huft *td; -+ /* The checksum algorithm */ -+ const gcry_md_spec_t *hdesc; -+ /* The wanted checksum */ -+ grub_uint32_t orig_checksum; -+ /* The uncompressed length */ -+ grub_size_t orig_len; -+ /* Context for checksum calculation */ -+ grub_uint8_t *hcontext; - /* The lookup bits for the literal/length code table. */ - int bl; - /* The lookup bits for the distance code table. */ -@@ -140,24 +149,24 @@ eat_field (grub_file_t file, int len) - #define OLD_GZIP_MAGIC grub_le_to_cpu16 (0x9E1F) - - /* Compression methods (see algorithm.doc) */ --#define STORED 0 --#define COMPRESSED 1 --#define PACKED 2 --#define LZHED 3 -+#define GRUB_GZ_STORED 0 -+#define GRUB_GZ_COMPRESSED 1 -+#define GRUB_GZ_PACKED 2 -+#define GRUB_GZ_LZHED 3 - /* methods 4 to 7 reserved */ --#define DEFLATED 8 --#define MAX_METHODS 9 -+#define GRUB_GZ_DEFLATED 8 -+#define GRUB_GZ_MAX_METHODS 9 - - /* gzip flag byte */ --#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ --#define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */ --#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ --#define ORIG_NAME 0x08 /* bit 3 set: original file name present */ --#define COMMENT 0x10 /* bit 4 set: file comment present */ --#define ENCRYPTED 0x20 /* bit 5 set: file is encrypted */ --#define RESERVED 0xC0 /* bit 6,7: reserved */ -+#define GRUB_GZ_ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ -+#define GRUB_GZ_CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */ -+#define GRUB_GZ_EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ -+#define GRUB_GZ_ORIG_NAME 0x08 /* bit 3 set: original file name present */ -+#define GRUB_GZ_COMMENT 0x10 /* bit 4 set: file comment present */ -+#define GRUB_GZ_ENCRYPTED 0x20 /* bit 5 set: file is encrypted */ -+#define GRUB_GZ_RESERVED 0xC0 /* bit 6,7: reserved */ - --#define UNSUPPORTED_FLAGS (CONTINUATION | ENCRYPTED | RESERVED) -+#define GRUB_GZ_UNSUPPORTED_FLAGS (GRUB_GZ_CONTINUATION | GRUB_GZ_ENCRYPTED | GRUB_GZ_RESERVED) - - /* inflate block codes */ - #define INFLATE_STORED 0 -@@ -180,7 +189,7 @@ test_gzip_header (grub_file_t file) - grub_uint8_t os_type; - } hdr; - grub_uint16_t extra_len; -- grub_uint32_t orig_len; -+ grub_uint32_t crc32; - grub_gzio_t gzio = file->data; - - if (grub_file_tell (gzio->file) != 0) -@@ -201,26 +210,29 @@ test_gzip_header (grub_file_t file) - * problem occurs from here on, then we have corrupt or otherwise - * bad data, and the error should be reported to the user. - */ -- if (hdr.method != DEFLATED -- || (hdr.flags & UNSUPPORTED_FLAGS) -- || ((hdr.flags & EXTRA_FIELD) -+ if (hdr.method != GRUB_GZ_DEFLATED -+ || (hdr.flags & GRUB_GZ_UNSUPPORTED_FLAGS) -+ || ((hdr.flags & GRUB_GZ_EXTRA_FIELD) - && (grub_file_read (gzio->file, &extra_len, 2) != 2 - || eat_field (gzio->file, - grub_le_to_cpu16 (extra_len)))) -- || ((hdr.flags & ORIG_NAME) && eat_field (gzio->file, -1)) -- || ((hdr.flags & COMMENT) && eat_field (gzio->file, -1))) -+ || ((hdr.flags & GRUB_GZ_ORIG_NAME) && eat_field (gzio->file, -1)) -+ || ((hdr.flags & GRUB_GZ_COMMENT) && eat_field (gzio->file, -1))) - return 0; - - gzio->data_offset = grub_file_tell (gzio->file); - - /* FIXME: don't do this on not easily seekable files. */ - { -- grub_file_seek (gzio->file, grub_file_size (gzio->file) - 4); -- if (grub_file_read (gzio->file, &orig_len, 4) != 4) -+ grub_file_seek (gzio->file, grub_file_size (gzio->file) - 8); -+ if (grub_file_read (gzio->file, &crc32, 4) != 4) -+ return 0; -+ gzio->orig_checksum = grub_le_to_cpu32 (crc32); -+ if (grub_file_read (gzio->file, &gzio->orig_len, 4) != 4) - return 0; - /* FIXME: this does not handle files whose original size is over 4GB. - But how can we know the real original size? */ -- file->size = grub_le_to_cpu32 (orig_len); -+ file->size = grub_le_to_cpu32 (gzio->orig_len); - } - - initialize_tables (gzio); -@@ -1095,7 +1107,23 @@ inflate_window (grub_gzio_t gzio) - - gzio->saved_offset += gzio->wp; - -- /* XXX do CRC calculation here! */ -+ if (gzio->hcontext) -+ { -+ gzio->hdesc->write (gzio->hcontext, gzio->slide, gzio->wp); -+ -+ if (gzio->saved_offset == gzio->orig_len) -+ { -+ grub_uint32_t csum; -+ -+ gzio->hdesc->final (gzio->hcontext); -+ csum = grub_get_unaligned32 (gzio->hdesc->read (gzio->hcontext)); -+ csum = grub_be_to_cpu32 (csum); -+ if (csum != gzio->orig_checksum) -+ grub_error (GRUB_ERR_BAD_COMPRESSED_DATA, -+ "checksum mismatch %08x/%08x", -+ gzio->orig_checksum, csum); -+ } -+ } - } - - -@@ -1118,6 +1146,9 @@ initialize_tables (grub_gzio_t gzio) - huft_free (gzio->td); - gzio->tl = NULL; - gzio->td = NULL; -+ -+ if (gzio->hcontext) -+ gzio->hdesc->init(gzio->hcontext); - } - - -@@ -1143,6 +1174,9 @@ grub_gzio_open (grub_file_t io, const char *name __attribute__ ((unused))) - - gzio->file = io; - -+ gzio->hdesc = GRUB_MD_CRC32; -+ gzio->hcontext = grub_malloc(gzio->hdesc->contextsize); -+ - file->device = io->device; - file->data = gzio; - file->fs = &grub_gzio_fs; -@@ -1151,6 +1185,7 @@ grub_gzio_open (grub_file_t io, const char *name __attribute__ ((unused))) - if (! test_gzip_header (file)) - { - grub_errno = GRUB_ERR_NONE; -+ grub_free (gzio->hcontext); - grub_free (gzio); - grub_free (file); - grub_file_seek (io, 0); -@@ -1183,7 +1218,7 @@ test_zlib_header (grub_gzio_t gzio) - flg = get_byte (gzio); - - /* Check that compression method is DEFLATE. */ -- if ((cmf & 0xf) != DEFLATED) -+ if ((cmf & 0xf) != GRUB_GZ_DEFLATED) - { - /* TRANSLATORS: It's about given file having some strange format, not - complete lack of gzip support. */ -@@ -1287,6 +1322,7 @@ grub_gzio_close (grub_file_t file) - grub_file_close (gzio->file); - huft_free (gzio->tl); - huft_free (gzio->td); -+ grub_free (gzio->hcontext); - grub_free (gzio); - - /* No need to close the same device twice. */ -diff --git a/grub-core/kern/arm/cache.c b/grub-core/kern/arm/cache.c -index 34154ccdb0e09d7d9fd91c4164fe8577ce449260..af1c4bbf544f0ebcca5c0f58c847c8dddc1f2e91 100644 ---- a/grub-core/kern/arm/cache.c -+++ b/grub-core/kern/arm/cache.c -@@ -29,6 +29,8 @@ void grub_arm_clean_dcache_range_armv6 (grub_addr_t start, grub_addr_t end, - grub_addr_t dlinesz); - void grub_arm_clean_dcache_range_armv7 (grub_addr_t start, grub_addr_t end, - grub_addr_t dlinesz); -+void grub_arm_clean_dcache_range_poc_armv7 (grub_addr_t start, grub_addr_t end, -+ grub_addr_t dlinesz); - void grub_arm_invalidate_icache_range_armv6 (grub_addr_t start, grub_addr_t end, - grub_addr_t dlinesz); - void grub_arm_invalidate_icache_range_armv7 (grub_addr_t start, grub_addr_t end, -@@ -252,6 +254,38 @@ grub_arch_sync_caches (void *address, grub_size_t len) - } - } - -+void -+grub_arch_sync_dma_caches (volatile void *address, grub_size_t len) -+{ -+ grub_addr_t start = (grub_addr_t) address; -+ grub_addr_t end = start + len; -+ -+ if (type == ARCH_UNKNOWN) -+ probe_caches (); -+ start = ALIGN_DOWN (start, grub_arch_cache_max_linesz); -+ end = ALIGN_UP (end, grub_arch_cache_max_linesz); -+ switch (type) -+ { -+ case ARCH_ARMV6: -+ grub_arm_clean_dcache_range_armv6 (start, end, grub_arch_cache_dlinesz); -+ grub_arm_invalidate_icache_range_armv6 (start, end, -+ grub_arch_cache_ilinesz); -+ break; -+ case ARCH_ARMV5_WRITE_THROUGH: -+ case ARCH_ARMV6_UNIFIED: -+ grub_arm_clean_dcache_range_armv6 (start, end, grub_arch_cache_dlinesz); -+ break; -+ case ARCH_ARMV7: -+ grub_arm_clean_dcache_range_poc_armv7 (start, end, grub_arch_cache_dlinesz); -+ grub_arm_invalidate_icache_range_armv7 (start, end, -+ grub_arch_cache_ilinesz); -+ break; -+ /* Pacify GCC. */ -+ case ARCH_UNKNOWN: -+ break; -+ } -+} -+ - void - grub_arm_disable_caches_mmu (void) - { -diff --git a/grub-core/kern/arm/coreboot/cbtable.c b/grub-core/kern/arm/coreboot/cbtable.c -new file mode 100644 -index 0000000000000000000000000000000000000000..8a655bb5cc28fb013674dc792531d8a9ba1c4b85 ---- /dev/null -+++ b/grub-core/kern/arm/coreboot/cbtable.c -@@ -0,0 +1,40 @@ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * Copyright (C) 2007,2008,2013 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 -+ -+GRUB_MOD_LICENSE ("GPLv3+"); -+ -+#pragma GCC diagnostic ignored "-Wcast-align" -+ -+grub_linuxbios_table_header_t -+grub_linuxbios_get_tables (void) -+{ -+ grub_linuxbios_table_header_t table_header -+ = (grub_linuxbios_table_header_t) grub_arm_saved_registers.r[0]; -+ -+ if (!grub_linuxbios_check_signature (table_header)) -+ return 0; -+ -+ return table_header; -+} -diff --git a/grub-core/kern/arm/coreboot/dma.c b/grub-core/kern/arm/coreboot/dma.c -new file mode 100644 -index 0000000000000000000000000000000000000000..2c2a6278904631c91bd29b3c4338c606471672fe ---- /dev/null -+++ b/grub-core/kern/arm/coreboot/dma.c -@@ -0,0 +1,59 @@ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * Copyright (C) 2007,2009 Free Software Foundation, Inc. -+ * -+ * GRUB is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation, either version 3 of the License, or -+ * (at your option) any later version. -+ * -+ * GRUB is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with GRUB. If not, see . -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+struct grub_pci_dma_chunk * -+grub_memalign_dma32 (grub_size_t align, grub_size_t size) -+{ -+ void *ret; -+ if (align < 64) -+ align = 64; -+ size = ALIGN_UP (size, align); -+ ret = grub_memalign (align, size); -+ if (!ret) -+ return 0; -+ grub_arch_sync_dma_caches (ret, size); -+ return ret; -+} -+ -+void -+grub_dma_free (struct grub_pci_dma_chunk *ch) -+{ -+ grub_size_t size = (((struct grub_mm_header *) ch) - 1)->size * GRUB_MM_ALIGN; -+ grub_arch_sync_dma_caches (ch, size); -+ grub_free (ch); -+} -+ -+volatile void * -+grub_dma_get_virt (struct grub_pci_dma_chunk *ch) -+{ -+ return (void *) ch; -+} -+ -+grub_uint32_t -+grub_dma_get_phys (struct grub_pci_dma_chunk *ch) -+{ -+ return (grub_uint32_t) (grub_addr_t) ch; -+} -+ -diff --git a/grub-core/kern/arm/coreboot/init.c b/grub-core/kern/arm/coreboot/init.c -new file mode 100644 -index 0000000000000000000000000000000000000000..8d8c5b8291eff9743b0325b76f851d52509b1f4f ---- /dev/null -+++ b/grub-core/kern/arm/coreboot/init.c -@@ -0,0 +1,151 @@ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * Copyright (C) 2002,2003,2004,2005,2006,2007,2008,2009,2013 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 -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+extern grub_uint8_t _start[]; -+extern grub_uint8_t _end[]; -+extern grub_uint8_t _edata[]; -+grub_addr_t start_of_ram = ~(grub_addr_t)0; -+ -+void __attribute__ ((noreturn)) -+grub_exit (void) -+{ -+ /* We can't use grub_fatal() in this function. This would create an infinite -+ loop, since grub_fatal() calls grub_abort() which in turn calls grub_exit(). */ -+ while (1) -+ grub_cpu_idle (); -+} -+ -+static grub_uint64_t modend; -+static int have_memory = 0; -+ -+/* Helper for grub_machine_init. */ -+static int -+heap_init (grub_uint64_t addr, grub_uint64_t size, grub_memory_type_t type, -+ void *data __attribute__ ((unused))) -+{ -+ grub_uint64_t begin = addr, end = addr + size; -+ -+#if GRUB_CPU_SIZEOF_VOID_P == 4 -+ /* Restrict ourselves to 32-bit memory space. */ -+ if (begin > GRUB_ULONG_MAX) -+ return 0; -+ if (end > GRUB_ULONG_MAX) -+ end = GRUB_ULONG_MAX; -+#endif -+ -+ if (start_of_ram > begin) -+ start_of_ram = begin; -+ -+ if (type != GRUB_MEMORY_AVAILABLE) -+ return 0; -+ -+ if (modend && begin < modend) -+ { -+ if (begin < (grub_addr_t)_start) -+ { -+ grub_mm_init_region ((void *) (grub_addr_t) begin, (grub_size_t) ((grub_addr_t)_start - begin)); -+ have_memory = 1; -+ } -+ begin = modend; -+ } -+ -+ /* Avoid DMA problems. */ -+ if (end >= 0xfe000000) -+ end = 0xfe000000; -+ -+ if (end <= begin) -+ return 0; -+ -+ grub_mm_init_region ((void *) (grub_addr_t) begin, (grub_size_t) (end - begin)); -+ -+ have_memory = 1; -+ -+ return 0; -+} -+ -+void -+grub_machine_init (void) -+{ -+ struct grub_module_header *header; -+ void *dtb = 0; -+ grub_size_t dtb_size = 0; -+ -+ modend = grub_modules_get_end (); -+ -+ grub_video_coreboot_fb_early_init (); -+ -+ grub_machine_mmap_iterate (heap_init, NULL); -+ if (!have_memory) -+ grub_fatal ("No memory found"); -+ -+ grub_video_coreboot_fb_late_init (); -+ -+ grub_font_init (); -+ grub_gfxterm_init (); -+ -+ FOR_MODULES (header) -+ if (header->type == OBJ_TYPE_DTB) -+ { -+ char *dtb_orig_addr, *dtb_copy; -+ dtb_orig_addr = (char *) header + sizeof (struct grub_module_header); -+ -+ dtb_size = header->size - sizeof (struct grub_module_header); -+ dtb = dtb_copy = grub_malloc (dtb_size); -+ grub_memmove (dtb_copy, dtb_orig_addr, dtb_size); -+ break; -+ } -+ if (!dtb) -+ grub_fatal ("No DTB found"); -+ grub_fdtbus_init (dtb, dtb_size); -+ -+ grub_rk3288_spi_init (); -+ -+ grub_machine_timer_init (); -+ grub_cros_init (); -+ grub_pl050_init (); -+} -+ -+void -+grub_machine_get_bootlocation (char **device __attribute__ ((unused)), -+ char **path __attribute__ ((unused))) -+{ -+} -+ -+void -+grub_machine_fini (int flags __attribute__ ((unused))) -+{ -+} -diff --git a/grub-core/kern/arm/coreboot/timer.c b/grub-core/kern/arm/coreboot/timer.c -new file mode 100644 -index 0000000000000000000000000000000000000000..d97b844f8487c064922a552a5ea4d5f220031dba ---- /dev/null -+++ b/grub-core/kern/arm/coreboot/timer.c -@@ -0,0 +1,101 @@ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * Copyright (C) 2016 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 -+ -+grub_uint64_t -+grub_armv7_get_timer_value(void); -+ -+grub_uint32_t -+grub_armv7_get_timer_frequency(void); -+ -+grub_uint32_t -+grub_arm_pfr1(void); -+ -+static int have_timer = 0; -+static volatile grub_uint32_t *sp804_regs; -+ -+static grub_uint64_t -+sp804_get_time_ms (void) -+{ -+ static grub_uint32_t high, last_low; -+ grub_uint32_t low = ~sp804_regs[1]; -+ if (last_low > low) -+ high++; -+ last_low = low; -+ return grub_divmod64 ((((grub_uint64_t) high) << 32) | low, -+ 1000, 0); -+} -+ -+static grub_err_t -+sp804_attach(const struct grub_fdtbus_dev *dev) -+{ -+ if (have_timer) -+ return GRUB_ERR_NONE; -+ sp804_regs = grub_fdtbus_map_reg (dev, 0, 0); -+ if (!grub_fdtbus_is_mapping_valid (sp804_regs)) -+ return grub_error (GRUB_ERR_IO, "could not map sp804: %p", sp804_regs); -+ grub_install_get_time_ms (sp804_get_time_ms); -+ have_timer = 1; -+ return GRUB_ERR_NONE; -+} -+ -+struct grub_fdtbus_driver sp804 = -+{ -+ .compatible = "arm,sp804", -+ .attach = sp804_attach -+}; -+ -+static grub_uint32_t timer_frequency_in_khz; -+ -+static grub_uint64_t -+generic_get_time_ms (void) -+{ -+ return grub_divmod64 (grub_armv7_get_timer_value(), timer_frequency_in_khz, 0); -+} -+ -+static int -+try_generic_timer (void) -+{ -+ if (((grub_arm_pfr1 () >> 16) & 0xf) != 1) -+ return 0; -+ grub_printf ("freq = %x\n", grub_armv7_get_timer_frequency()); -+ timer_frequency_in_khz = 0x016e3600 / 1000; //grub_armv7_get_timer_frequency() / 1000; -+ if (timer_frequency_in_khz == 0) -+ return 0; -+ grub_install_get_time_ms (generic_get_time_ms); -+ have_timer = 1; -+ return 1; -+} -+ -+void -+grub_machine_timer_init (void) -+{ -+ grub_fdtbus_register (&sp804); -+ -+ if (!have_timer) -+ try_generic_timer (); -+ if (!have_timer) -+ grub_fatal ("No timer found"); -+} -diff --git a/grub-core/kern/arm/efi/misc.c b/grub-core/kern/arm/efi/misc.c -deleted file mode 100644 -index 7cd41842ae7662018c2ce5ff847aeb250572ec85..0000000000000000000000000000000000000000 ---- a/grub-core/kern/arm/efi/misc.c -+++ /dev/null -@@ -1,202 +0,0 @@ --/* misc.c - various system functions for an arm-based EFI system */ --/* -- * GRUB -- GRand Unified Bootloader -- * Copyright (C) 2013 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 -- --static inline grub_size_t --page_align (grub_size_t size) --{ -- return (size + (1 << 12) - 1) & (~((1 << 12) - 1)); --} -- --/* Find the optimal number of pages for the memory map. Is it better to -- move this code to efi/mm.c? */ --static grub_efi_uintn_t --find_mmap_size (void) --{ -- static grub_efi_uintn_t mmap_size = 0; -- -- if (mmap_size != 0) -- return mmap_size; -- -- mmap_size = (1 << 12); -- while (1) -- { -- int ret; -- grub_efi_memory_descriptor_t *mmap; -- grub_efi_uintn_t desc_size; -- -- mmap = grub_malloc (mmap_size); -- if (! mmap) -- return 0; -- -- ret = grub_efi_get_memory_map (&mmap_size, mmap, 0, &desc_size, 0); -- grub_free (mmap); -- -- if (ret < 0) -- { -- grub_error (GRUB_ERR_IO, "cannot get memory map"); -- return 0; -- } -- else if (ret > 0) -- break; -- -- mmap_size += (1 << 12); -- } -- -- /* Increase the size a bit for safety, because GRUB allocates more on -- later, and EFI itself may allocate more. */ -- mmap_size += (1 << 12); -- -- return page_align (mmap_size); --} -- --#define NEXT_MEMORY_DESCRIPTOR(desc, size) \ -- ((grub_efi_memory_descriptor_t *) ((char *) (desc) + (size))) --#define PAGE_SHIFT 12 -- --void * --grub_efi_allocate_loader_memory (grub_uint32_t min_offset, grub_uint32_t size) --{ -- grub_efi_uintn_t desc_size; -- grub_efi_memory_descriptor_t *mmap, *mmap_end; -- grub_efi_uintn_t mmap_size, tmp_mmap_size; -- grub_efi_memory_descriptor_t *desc; -- void *mem = NULL; -- grub_addr_t min_start = 0; -- -- mmap_size = find_mmap_size(); -- if (!mmap_size) -- return NULL; -- -- mmap = grub_malloc(mmap_size); -- if (!mmap) -- return NULL; -- -- tmp_mmap_size = mmap_size; -- if (grub_efi_get_memory_map (&tmp_mmap_size, mmap, 0, &desc_size, 0) <= 0) -- { -- grub_error (GRUB_ERR_IO, "cannot get memory map"); -- goto fail; -- } -- -- mmap_end = NEXT_MEMORY_DESCRIPTOR (mmap, tmp_mmap_size); -- /* Find lowest accessible RAM location */ -- { -- int found = 0; -- for (desc = mmap ; !found && (desc < mmap_end) ; -- desc = NEXT_MEMORY_DESCRIPTOR(desc, desc_size)) -- { -- switch (desc->type) -- { -- case GRUB_EFI_CONVENTIONAL_MEMORY: -- case GRUB_EFI_LOADER_CODE: -- case GRUB_EFI_LOADER_DATA: -- min_start = desc->physical_start + min_offset; -- found = 1; -- break; -- default: -- break; -- } -- } -- } -- -- /* First, find free pages for the real mode code -- and the memory map buffer. */ -- for (desc = mmap ; desc < mmap_end ; -- desc = NEXT_MEMORY_DESCRIPTOR(desc, desc_size)) -- { -- grub_uint64_t start, end; -- -- grub_dprintf("mm", "%s: 0x%08x bytes @ 0x%08x\n", -- __FUNCTION__, -- (grub_uint32_t) (desc->num_pages << PAGE_SHIFT), -- (grub_uint32_t) (desc->physical_start)); -- -- if (desc->type != GRUB_EFI_CONVENTIONAL_MEMORY) -- continue; -- -- start = desc->physical_start; -- end = start + (desc->num_pages << PAGE_SHIFT); -- grub_dprintf("mm", "%s: start=0x%016llx, end=0x%016llx\n", -- __FUNCTION__, start, end); -- start = start < min_start ? min_start : start; -- if (start + size > end) -- continue; -- grub_dprintf("mm", "%s: let's allocate some (0x%x) pages @ 0x%08x...\n", -- __FUNCTION__, (size >> PAGE_SHIFT), (grub_addr_t) start); -- mem = grub_efi_allocate_pages (start, (size >> PAGE_SHIFT) + 1); -- grub_dprintf("mm", "%s: retval=0x%08x\n", -- __FUNCTION__, (grub_addr_t) mem); -- if (! mem) -- { -- grub_error (GRUB_ERR_OUT_OF_MEMORY, "cannot allocate memory"); -- goto fail; -- } -- break; -- } -- -- if (! mem) -- { -- grub_error (GRUB_ERR_OUT_OF_MEMORY, "cannot allocate memory"); -- goto fail; -- } -- -- grub_free (mmap); -- return mem; -- -- fail: -- grub_free (mmap); -- return NULL; --} -- --grub_err_t --grub_efi_prepare_platform (void) --{ -- grub_efi_uintn_t mmap_size; -- grub_efi_uintn_t map_key; -- grub_efi_uintn_t desc_size; -- grub_efi_uint32_t desc_version; -- grub_efi_memory_descriptor_t *mmap_buf; -- grub_err_t err; -- -- /* -- * Cloned from IA64 -- * Must be done after grub_machine_fini because map_key is used by -- *exit_boot_services. -- */ -- mmap_size = find_mmap_size (); -- if (! mmap_size) -- return GRUB_ERR_OUT_OF_MEMORY; -- mmap_buf = grub_efi_allocate_pages (0, page_align (mmap_size) >> 12); -- if (! mmap_buf) -- return GRUB_ERR_OUT_OF_MEMORY; -- -- err = grub_efi_finish_boot_services (&mmap_size, mmap_buf, &map_key, -- &desc_size, &desc_version); -- if (err != GRUB_ERR_NONE) -- return err; -- -- return GRUB_ERR_NONE; --} -diff --git a/grub-core/kern/arm/uboot/init.c b/grub-core/kern/arm/uboot/init.c -new file mode 100644 -index 0000000000000000000000000000000000000000..2a6aa3fdd3dd049848015f6c67dfc0f30a79a9c4 ---- /dev/null -+++ b/grub-core/kern/arm/uboot/init.c -@@ -0,0 +1,70 @@ -+/* init.c - generic U-Boot initialization and finalization */ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * Copyright (C) 2016 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 -+ -+extern int (*grub_uboot_syscall_ptr) (int, int *, ...); -+ -+grub_uint32_t -+grub_uboot_get_machine_type (void) -+{ -+ return grub_arm_saved_registers.r[1]; -+} -+ -+grub_addr_t -+grub_uboot_get_boot_data (void) -+{ -+ return grub_arm_saved_registers.r[2]; -+} -+ -+int -+grub_uboot_api_init (void) -+{ -+ struct api_signature *start, *end; -+ struct api_signature *p; -+ grub_addr_t grub_uboot_search_hint = grub_arm_saved_registers.sp; -+ if (grub_uboot_search_hint) -+ { -+ /* Extended search range to work around Trim Slice U-Boot issue */ -+ start = (struct api_signature *) ((grub_uboot_search_hint & ~0x000fffff) -+ - 0x00500000); -+ end = -+ (struct api_signature *) ((grub_addr_t) start + UBOOT_API_SEARCH_LEN - -+ API_SIG_MAGLEN + 0x00500000); -+ } -+ else -+ { -+ start = 0; -+ end = (struct api_signature *) (256 * 1024 * 1024); -+ } -+ -+ /* Structure alignment is (at least) 8 bytes */ -+ for (p = start; p < end; p = (void *) ((grub_addr_t) p + 8)) -+ { -+ if (grub_memcmp (&(p->magic), API_SIG_MAGIC, API_SIG_MAGLEN) == 0) -+ { -+ grub_uboot_syscall_ptr = p->syscall; -+ return p->version; -+ } -+ } -+ -+ return 0; -+} -diff --git a/grub-core/kern/coreboot/cbtable.c b/grub-core/kern/coreboot/cbtable.c -new file mode 100644 -index 0000000000000000000000000000000000000000..aec63dbd1209e4c3cbbe165d54a78277ea72f361 ---- /dev/null -+++ b/grub-core/kern/coreboot/cbtable.c -@@ -0,0 +1,72 @@ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * Copyright (C) 2007,2008,2013 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 -+ -+#pragma GCC diagnostic ignored "-Wcast-align" -+ -+/* Helper for grub_linuxbios_table_iterate. */ -+int -+grub_linuxbios_check_signature (grub_linuxbios_table_header_t tbl_header) -+{ -+ if (! grub_memcmp (tbl_header->signature, "LBIO", 4)) -+ return 1; -+ -+ return 0; -+} -+ -+grub_err_t -+grub_linuxbios_table_iterate (int (*hook) (grub_linuxbios_table_item_t, -+ void *), -+ void *hook_data) -+{ -+ grub_linuxbios_table_header_t table_header = grub_linuxbios_get_tables (); -+ grub_linuxbios_table_item_t table_item; -+ -+ if (!table_header) -+ return 0; -+ -+signature_found: -+ -+ table_item = -+ (grub_linuxbios_table_item_t) ((char *) table_header + -+ table_header->header_size); -+ for (; table_item < (grub_linuxbios_table_item_t) ((char *) table_header -+ + table_header->header_size -+ + table_header->table_size); -+ table_item = (grub_linuxbios_table_item_t) ((char *) table_item + table_item->size)) -+ { -+ if (table_item->tag == GRUB_LINUXBIOS_MEMBER_LINK -+ && grub_linuxbios_check_signature ((grub_linuxbios_table_header_t) (grub_addr_t) -+ *(grub_uint64_t *) (table_item + 1))) -+ { -+ table_header = (grub_linuxbios_table_header_t) (grub_addr_t) -+ *(grub_uint64_t *) (table_item + 1); -+ goto signature_found; -+ } -+ if (hook (table_item, hook_data)) -+ return 1; -+ } -+ -+ return 0; -+} -diff --git a/grub-core/kern/i386/coreboot/mmap.c b/grub-core/kern/coreboot/mmap.c -similarity index 97% -rename from grub-core/kern/i386/coreboot/mmap.c -rename to grub-core/kern/coreboot/mmap.c -index 4d29f6b7d90591939cf5d837b39c5d259a55efb0..caf8f7cef1b4552c720eb3b7ca355eb6cec32955 100644 ---- a/grub-core/kern/i386/coreboot/mmap.c -+++ b/grub-core/kern/coreboot/mmap.c -@@ -16,8 +16,8 @@ - * along with GRUB. If not, see . - */ - --#include --#include -+#include -+#include - #include - #include - #include -@@ -49,6 +49,7 @@ iterate_linuxbios_table (grub_linuxbios_table_item_t table_item, void *data) - { - grub_uint64_t start = mem_region->addr; - grub_uint64_t end = mem_region->addr + mem_region->size; -+#ifdef __i386__ - /* Mark region 0xa0000 - 0x100000 as reserved. */ - if (start < 0x100000 && end >= 0xa0000 - && mem_region->type == GRUB_MACHINE_MEMORY_AVAILABLE) -@@ -75,6 +76,7 @@ iterate_linuxbios_table (grub_linuxbios_table_item_t table_item, void *data) - if (end <= start) - continue; - } -+#endif - if (ctx->hook (start, end - start, - /* Multiboot mmaps match with the coreboot mmap - definition. Therefore, we can just pass type -diff --git a/grub-core/kern/efi/efi.c b/grub-core/kern/efi/efi.c -index d467785fc6ce0763ec1392a65d6b30f1747ab5c4..708581fcbde007fc0174be636771b401d5e69ea2 100644 ---- a/grub-core/kern/efi/efi.c -+++ b/grub-core/kern/efi/efi.c -@@ -154,6 +154,15 @@ grub_efi_get_loaded_image (grub_efi_handle_t image_handle) - GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL); - } - -+void -+grub_reboot (void) -+{ -+ grub_machine_fini (GRUB_LOADER_FLAG_NORETURN); -+ efi_call_4 (grub_efi_system_table->runtime_services->reset_system, -+ GRUB_EFI_RESET_COLD, GRUB_EFI_SUCCESS, 0, NULL); -+ for (;;) ; -+} -+ - void - grub_exit (void) - { -diff --git a/grub-core/kern/efi/init.c b/grub-core/kern/efi/init.c -index 2c31847bf6db77fab377c90e7ed36897439d6027..3dfdf2d22b02ae8847a3e19a175517d2d71544fa 100644 ---- a/grub-core/kern/efi/init.c -+++ b/grub-core/kern/efi/init.c -@@ -80,4 +80,5 @@ grub_efi_fini (void) - { - grub_efidisk_fini (); - grub_console_fini (); -+ grub_efi_memory_fini (); - } -diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c -index 20a47aaf5d0df376090510ddb8337ecc8aa18e98..42ad7c570a5532c4f6a5bef9d1ff3295f413aa11 100644 ---- a/grub-core/kern/efi/mm.c -+++ b/grub-core/kern/efi/mm.c -@@ -49,38 +49,86 @@ static grub_efi_uintn_t finish_desc_size; - static grub_efi_uint32_t finish_desc_version; - int grub_efi_is_finished = 0; - -+/* -+ * We need to roll back EFI allocations on exit. Remember allocations that -+ * we'll free on exit. -+ */ -+struct efi_allocation; -+struct efi_allocation { -+ grub_efi_physical_address_t address; -+ grub_efi_uint64_t pages; -+ struct efi_allocation *next; -+}; -+static struct efi_allocation *efi_allocated_memory; -+ -+static void -+grub_efi_store_alloc (grub_efi_physical_address_t address, -+ grub_efi_uintn_t pages) -+{ -+ grub_efi_boot_services_t *b; -+ struct efi_allocation *alloc; -+ grub_efi_status_t status; -+ -+ b = grub_efi_system_table->boot_services; -+ status = efi_call_3 (b->allocate_pool, GRUB_EFI_LOADER_DATA, -+ sizeof(*alloc), (void**)&alloc); -+ -+ if (status == GRUB_EFI_SUCCESS) -+ { -+ alloc->next = efi_allocated_memory; -+ alloc->address = address; -+ alloc->pages = pages; -+ efi_allocated_memory = alloc; -+ } -+ else -+ grub_printf ("Could not malloc memory to remember EFI allocation. " -+ "Exiting GRUB won't free all memory.\n"); -+} -+ -+static void -+grub_efi_drop_alloc (grub_efi_physical_address_t address, -+ grub_efi_uintn_t pages) -+{ -+ struct efi_allocation *ea, *eap; -+ grub_efi_boot_services_t *b; -+ -+ b = grub_efi_system_table->boot_services; -+ -+ for (eap = NULL, ea = efi_allocated_memory; ea; eap = ea, ea = ea->next) -+ { -+ if (ea->address != address || ea->pages != pages) -+ continue; -+ -+ /* Remove the current entry from the list. */ -+ if (eap) -+ eap->next = ea->next; -+ else -+ efi_allocated_memory = ea->next; -+ -+ /* Then free the memory backing it. */ -+ efi_call_1 (b->free_pool, ea); -+ -+ /* And leave, we're done. */ -+ break; -+ } -+} -+ - /* Allocate pages. Return the pointer to the first of allocated pages. */ - void * --grub_efi_allocate_pages (grub_efi_physical_address_t address, -- grub_efi_uintn_t pages) -+grub_efi_allocate_pages_real (grub_efi_physical_address_t address, -+ grub_efi_uintn_t pages, -+ grub_efi_allocate_type_t alloctype, -+ grub_efi_memory_type_t memtype) - { -- grub_efi_allocate_type_t type; - grub_efi_status_t status; - grub_efi_boot_services_t *b; - --#if 1 - /* Limit the memory access to less than 4GB for 32-bit platforms. */ - if (address > GRUB_EFI_MAX_USABLE_ADDRESS) - return 0; --#endif -- --#if 1 -- if (address == 0) -- { -- type = GRUB_EFI_ALLOCATE_MAX_ADDRESS; -- address = GRUB_EFI_MAX_USABLE_ADDRESS; -- } -- else -- type = GRUB_EFI_ALLOCATE_ADDRESS; --#else -- if (address == 0) -- type = GRUB_EFI_ALLOCATE_ANY_PAGES; -- else -- type = GRUB_EFI_ALLOCATE_ADDRESS; --#endif - - b = grub_efi_system_table->boot_services; -- status = efi_call_4 (b->allocate_pages, type, GRUB_EFI_LOADER_DATA, pages, &address); -+ status = efi_call_4 (b->allocate_pages, alloctype, memtype, pages, &address); - if (status != GRUB_EFI_SUCCESS) - return 0; - -@@ -89,15 +137,34 @@ grub_efi_allocate_pages (grub_efi_physical_address_t address, - /* Uggh, the address 0 was allocated... This is too annoying, - so reallocate another one. */ - address = GRUB_EFI_MAX_USABLE_ADDRESS; -- status = efi_call_4 (b->allocate_pages, type, GRUB_EFI_LOADER_DATA, pages, &address); -+ status = efi_call_4 (b->allocate_pages, alloctype, memtype, pages, &address); - grub_efi_free_pages (0, pages); - if (status != GRUB_EFI_SUCCESS) - return 0; - } - -+ grub_efi_store_alloc (address, pages); -+ - return (void *) ((grub_addr_t) address); - } - -+void * -+grub_efi_allocate_any_pages (grub_efi_uintn_t pages) -+{ -+ return grub_efi_allocate_pages_real (GRUB_EFI_MAX_USABLE_ADDRESS, -+ pages, GRUB_EFI_ALLOCATE_MAX_ADDRESS, -+ GRUB_EFI_LOADER_DATA); -+} -+ -+void * -+grub_efi_allocate_fixed (grub_efi_physical_address_t address, -+ grub_efi_uintn_t pages) -+{ -+ return grub_efi_allocate_pages_real (address, pages, -+ GRUB_EFI_ALLOCATE_ADDRESS, -+ GRUB_EFI_LOADER_DATA); -+} -+ - /* Free pages starting from ADDRESS. */ - void - grub_efi_free_pages (grub_efi_physical_address_t address, -@@ -107,6 +174,8 @@ grub_efi_free_pages (grub_efi_physical_address_t address, - - b = grub_efi_system_table->boot_services; - efi_call_2 (b->free_pages, address, pages); -+ -+ grub_efi_drop_alloc (address, pages); - } - - #if defined (__i386__) || defined (__x86_64__) -@@ -217,6 +286,30 @@ grub_efi_finish_boot_services (grub_efi_uintn_t *outbuf_size, void *outbuf, - return GRUB_ERR_NONE; - } - -+/* -+ * To obtain the UEFI memory map, we must pass a buffer of sufficient size -+ * to hold the entire map. This function returns a sane start value for -+ * buffer size. -+ */ -+grub_efi_uintn_t -+grub_efi_find_mmap_size (void) -+{ -+ grub_efi_uintn_t mmap_size = 0; -+ grub_efi_uintn_t desc_size; -+ -+ if (grub_efi_get_memory_map (&mmap_size, NULL, NULL, &desc_size, 0) < 0) -+ { -+ grub_error (GRUB_ERR_IO, "cannot get EFI memory map size"); -+ return 0; -+ } -+ -+ /* -+ * Add an extra page, since UEFI can alter the memory map itself on -+ * callbacks or explicit calls, including console output. -+ */ -+ return ALIGN_UP (mmap_size + GRUB_EFI_PAGE_SIZE, GRUB_EFI_PAGE_SIZE); -+} -+ - /* Get the memory map as defined in the EFI spec. Return 1 if successful, - return 0 if partial, or return -1 if an error occurs. */ - int -@@ -402,7 +495,9 @@ add_memory_regions (grub_efi_memory_descriptor_t *memory_map, - pages = required_pages; - } - -- addr = grub_efi_allocate_pages (start, pages); -+ addr = grub_efi_allocate_pages_real (start, pages, -+ GRUB_EFI_ALLOCATE_ADDRESS, -+ GRUB_EFI_LOADER_CODE); - if (! addr) - grub_fatal ("cannot allocate conventional memory %p with %u pages", - (void *) ((grub_addr_t) start), -@@ -419,6 +514,20 @@ add_memory_regions (grub_efi_memory_descriptor_t *memory_map, - grub_fatal ("too little memory"); - } - -+void -+grub_efi_memory_fini (void) -+{ -+ /* -+ * Free all stale allocations. grub_efi_free_pages() will remove -+ * the found entry from the list and it will always find the first -+ * list entry (efi_allocated_memory is the list start). Hence we -+ * remove all entries from the list until none is left altogether. -+ */ -+ while (efi_allocated_memory) -+ grub_efi_free_pages (efi_allocated_memory->address, -+ efi_allocated_memory->pages); -+} -+ - #if 0 - /* Print the memory map. */ - static void -@@ -454,8 +563,7 @@ grub_efi_mm_init (void) - int mm_status; - - /* Prepare a memory region to store two memory maps. */ -- memory_map = grub_efi_allocate_pages (0, -- 2 * BYTES_TO_PAGES (MEMORY_MAP_SIZE)); -+ memory_map = grub_efi_allocate_any_pages (2 * BYTES_TO_PAGES (MEMORY_MAP_SIZE)); - if (! memory_map) - grub_fatal ("cannot allocate memory"); - -@@ -473,7 +581,7 @@ grub_efi_mm_init (void) - /* Freeing/allocating operations may increase memory map size. */ - map_size += desc_size * 32; - -- memory_map = grub_efi_allocate_pages (0, 2 * BYTES_TO_PAGES (map_size)); -+ memory_map = grub_efi_allocate_any_pages (2 * BYTES_TO_PAGES (map_size)); - if (! memory_map) - grub_fatal ("cannot allocate memory"); - -@@ -525,3 +633,34 @@ grub_efi_mm_init (void) - grub_efi_free_pages ((grub_addr_t) memory_map, - 2 * BYTES_TO_PAGES (MEMORY_MAP_SIZE)); - } -+ -+#if defined (__aarch64__) || defined (__arm__) -+grub_err_t -+grub_efi_get_ram_base(grub_addr_t *base_addr) -+{ -+ grub_efi_memory_descriptor_t *memory_map, *desc; -+ grub_efi_uintn_t memory_map_size, desc_size; -+ int ret; -+ -+ memory_map_size = grub_efi_find_mmap_size(); -+ -+ memory_map = grub_malloc (memory_map_size); -+ if (! memory_map) -+ return GRUB_ERR_OUT_OF_MEMORY; -+ ret = grub_efi_get_memory_map (&memory_map_size, memory_map, NULL, -+ &desc_size, NULL); -+ -+ if (ret < 1) -+ return GRUB_ERR_BUG; -+ -+ for (desc = memory_map, *base_addr = GRUB_UINT_MAX; -+ (grub_addr_t) desc < ((grub_addr_t) memory_map + memory_map_size); -+ desc = NEXT_MEMORY_DESCRIPTOR (desc, desc_size)) -+ if (desc->attribute & GRUB_EFI_MEMORY_WB) -+ *base_addr = grub_min (*base_addr, desc->physical_start); -+ -+ grub_free(memory_map); -+ -+ return GRUB_ERR_NONE; -+} -+#endif -diff --git a/grub-core/kern/i386/coreboot/cbtable.c b/grub-core/kern/i386/coreboot/cbtable.c -index 1669bc0ca23a2fe5dcfb8e2b6c973ddb5e27e880..34a2b59be1ffa926e9dcc931140695cc82be223c 100644 ---- a/grub-core/kern/i386/coreboot/cbtable.c -+++ b/grub-core/kern/i386/coreboot/cbtable.c -@@ -17,7 +17,7 @@ - */ - - #include --#include -+#include - #include - #include - #include -@@ -25,59 +25,20 @@ - - GRUB_MOD_LICENSE ("GPLv3+"); - --/* Helper for grub_linuxbios_table_iterate. */ --static int --check_signature (grub_linuxbios_table_header_t tbl_header) --{ -- if (! grub_memcmp (tbl_header->signature, "LBIO", 4)) -- return 1; -- -- return 0; --} -- --grub_err_t --grub_linuxbios_table_iterate (int (*hook) (grub_linuxbios_table_item_t, -- void *), -- void *hook_data) -+grub_linuxbios_table_header_t -+grub_linuxbios_get_tables (void) - { - grub_linuxbios_table_header_t table_header; -- grub_linuxbios_table_item_t table_item; -- - /* Assuming table_header is aligned to its size (8 bytes). */ -- - for (table_header = (grub_linuxbios_table_header_t) 0x500; - table_header < (grub_linuxbios_table_header_t) 0x1000; table_header++) -- if (check_signature (table_header)) -- goto signature_found; -+ if (grub_linuxbios_check_signature (table_header)) -+ return table_header; - - for (table_header = (grub_linuxbios_table_header_t) 0xf0000; - table_header < (grub_linuxbios_table_header_t) 0x100000; table_header++) -- if (check_signature (table_header)) -- goto signature_found; -- -- return 0; -- --signature_found: -- -- table_item = -- (grub_linuxbios_table_item_t) ((char *) table_header + -- table_header->header_size); -- for (; table_item < (grub_linuxbios_table_item_t) ((char *) table_header -- + table_header->header_size -- + table_header->table_size); -- table_item = (grub_linuxbios_table_item_t) ((char *) table_item + table_item->size)) -- { -- if (table_item->tag == GRUB_LINUXBIOS_MEMBER_LINK -- && check_signature ((grub_linuxbios_table_header_t) (grub_addr_t) -- *(grub_uint64_t *) (table_item + 1))) -- { -- table_header = (grub_linuxbios_table_header_t) (grub_addr_t) -- *(grub_uint64_t *) (table_item + 1); -- goto signature_found; -- } -- if (hook (table_item, hook_data)) -- return 1; -- } -+ if (grub_linuxbios_check_signature (table_header)) -+ return table_header; - - return 0; - } -diff --git a/grub-core/kern/i386/tsc.c b/grub-core/kern/i386/tsc.c -index 2e85289d848946da8260b826ed36114557299278..f266eb13185f20dd4c8f67fdffa9a4790d9e01da 100644 ---- a/grub-core/kern/i386/tsc.c -+++ b/grub-core/kern/i386/tsc.c -@@ -68,7 +68,7 @@ grub_tsc_init (void) - #ifdef GRUB_MACHINE_XEN - (void) (grub_tsc_calibrate_from_xen () || calibrate_tsc_hardcode()); - #elif defined (GRUB_MACHINE_EFI) -- (void) (grub_tsc_calibrate_from_pit () || grub_tsc_calibrate_from_pmtimer () || grub_tsc_calibrate_from_efi() || calibrate_tsc_hardcode()); -+ (void) (grub_tsc_calibrate_from_pmtimer () || grub_tsc_calibrate_from_pit () || grub_tsc_calibrate_from_efi() || calibrate_tsc_hardcode()); - #elif defined (GRUB_MACHINE_COREBOOT) - (void) (grub_tsc_calibrate_from_pmtimer () || grub_tsc_calibrate_from_pit () || calibrate_tsc_hardcode()); - #else -diff --git a/grub-core/kern/ieee1275/ieee1275.c b/grub-core/kern/ieee1275/ieee1275.c -index 98217029f458dcef3a5b227b300762ff14cf8c52..86f81a3c4671be293d823cd3235a66dff9774faa 100644 ---- a/grub-core/kern/ieee1275/ieee1275.c -+++ b/grub-core/kern/ieee1275/ieee1275.c -@@ -19,6 +19,7 @@ - - #include - #include -+#include - - #define IEEE1275_PHANDLE_INVALID ((grub_ieee1275_cell_t) -1) - #define IEEE1275_IHANDLE_INVALID ((grub_ieee1275_cell_t) 0) -@@ -482,6 +483,91 @@ grub_ieee1275_close (grub_ieee1275_ihandle_t ihandle) - return 0; - } - -+int -+grub_ieee1275_decode_unit4 (grub_ieee1275_ihandle_t ihandle, -+ void *addr, grub_size_t size, -+ grub_uint32_t *phy_lo, grub_uint32_t *phy_hi, -+ grub_uint32_t *lun_lo, grub_uint32_t *lun_hi) -+{ -+ struct decode_args -+ { -+ struct grub_ieee1275_common_hdr common; -+ grub_ieee1275_cell_t method; -+ grub_ieee1275_cell_t ihandle; -+ grub_ieee1275_cell_t size; -+ grub_ieee1275_cell_t addr; -+ grub_ieee1275_cell_t catch_result; -+ grub_ieee1275_cell_t tgt_h; -+ grub_ieee1275_cell_t tgt_l; -+ grub_ieee1275_cell_t lun_h; -+ grub_ieee1275_cell_t lun_l; -+ } -+ args; -+ -+ INIT_IEEE1275_COMMON (&args.common, "call-method", 4, 5); -+ args.method = (grub_ieee1275_cell_t) "decode-unit"; -+ args.ihandle = ihandle; -+ args.size = size; -+ args.addr = (grub_ieee1275_cell_t) addr; -+ args.catch_result = 1; -+ -+ if ((IEEE1275_CALL_ENTRY_FN (&args) == -1) || (args.catch_result)) -+ { -+ grub_error (GRUB_ERR_OUT_OF_RANGE, "decode-unit failed\n"); -+ return -1; -+ } -+ -+ *phy_lo = args.tgt_l; -+ *phy_hi = args.tgt_h; -+ *lun_lo = args.lun_l; -+ *lun_hi = args.lun_h; -+ return 0; -+} -+ -+char * -+grub_ieee1275_encode_uint4 (grub_ieee1275_ihandle_t ihandle, -+ grub_uint32_t phy_lo, grub_uint32_t phy_hi, -+ grub_uint32_t lun_lo, grub_uint32_t lun_hi, -+ grub_size_t *size) -+{ -+ char *addr; -+ struct encode_args -+ { -+ struct grub_ieee1275_common_hdr common; -+ grub_ieee1275_cell_t method; -+ grub_ieee1275_cell_t ihandle; -+ grub_ieee1275_cell_t tgt_h; -+ grub_ieee1275_cell_t tgt_l; -+ grub_ieee1275_cell_t lun_h; -+ grub_ieee1275_cell_t lun_l; -+ grub_ieee1275_cell_t catch_result; -+ grub_ieee1275_cell_t size; -+ grub_ieee1275_cell_t addr; -+ } -+ args; -+ -+ INIT_IEEE1275_COMMON (&args.common, "call-method", 6, 3); -+ args.method = (grub_ieee1275_cell_t) "encode-unit"; -+ args.ihandle = ihandle; -+ -+ args.tgt_l = phy_lo; -+ args.tgt_h = phy_hi; -+ args.lun_l = lun_lo; -+ args.lun_h = lun_hi; -+ args.catch_result = 1; -+ -+ if ((IEEE1275_CALL_ENTRY_FN (&args) == -1) || (args.catch_result)) -+ { -+ grub_error (GRUB_ERR_OUT_OF_RANGE, "encode-unit failed\n"); -+ return 0; -+ } -+ -+ addr = (void *)args.addr; -+ *size = args.size; -+ addr = grub_strdup ((char *)args.addr); -+ return addr; -+} -+ - int - grub_ieee1275_claim (grub_addr_t addr, grub_size_t size, unsigned int align, - grub_addr_t *result) -@@ -607,3 +693,117 @@ grub_ieee1275_milliseconds (grub_uint32_t *msecs) - *msecs = args.msecs; - return 0; - } -+ -+int -+grub_ieee1275_set_address (grub_ieee1275_ihandle_t ihandle, -+ grub_uint32_t target, grub_uint32_t lun) -+{ -+ struct set_address -+ { -+ struct grub_ieee1275_common_hdr common; -+ grub_ieee1275_cell_t method; -+ grub_ieee1275_cell_t ihandle; -+ grub_ieee1275_cell_t tgt; -+ grub_ieee1275_cell_t lun; -+ grub_ieee1275_cell_t catch_result; -+ } -+ args; -+ -+ INIT_IEEE1275_COMMON (&args.common, "call-method", 4, 1); -+ -+ /* -+ * IEEE 1275-1994 Standard for Boot (Initialization Configuration) -+ * Firmware: Core Requirements and Practices -+ * E.3.2.2 Bus-specific methods for bus nodes -+ * -+ * A package implementing the scsi-2 device type shall implement the -+ * following bus-specific method: -+ * -+ * set-address ( unit# target# -- ) -+ * Sets the SCSI target number (0x0..0xf) and unit number (0..7) to which -+ * subsequent commands apply. -+ */ -+ args.method = (grub_ieee1275_cell_t) "set-address"; -+ args.ihandle = ihandle; -+ args.tgt = target; -+ args.lun = lun; -+ -+ if (IEEE1275_CALL_ENTRY_FN (&args) == -1) -+ return -1; -+ -+ return args.catch_result; -+} -+ -+int -+grub_ieee1275_no_data_command (grub_ieee1275_ihandle_t ihandle, -+ const void *cmd_addr, grub_ssize_t *result) -+{ -+ struct set_address -+ { -+ struct grub_ieee1275_common_hdr common; -+ grub_ieee1275_cell_t method; -+ grub_ieee1275_cell_t ihandle; -+ grub_ieee1275_cell_t cmd_addr; -+ grub_ieee1275_cell_t error; -+ grub_ieee1275_cell_t catch_result; -+ } -+ args; -+ -+ INIT_IEEE1275_COMMON (&args.common, "call-method", 3, 2); -+ -+ /* -+ * IEEE 1275-1994 Standard for Boot (Initialization Configuration) -+ * Firmware: Core Requirements and Practices -+ * -+ * E.3.2.2 Bus-specific methods for bus nodes -+ * -+ * A package implementing the scsi-2 device type shall implement the -+ * following bus-specific method: -+ * -+ * no-data-command ( cmd-addr -- error? ) -+ * Executes a simple SCSI command, automatically retrying under -+ * certain conditions. cmd-addr is the address of a 6-byte command buffer -+ * containing an SCSI command that does not have a data transfer phase. -+ * Executes the command, retrying indefinitely with the same retry criteria -+ * as retry-command. -+ * -+ * error? is nonzero if an error occurred, zero otherwise. -+ * NOTE no-data-command is a convenience function. It provides -+ * no capabilities that are not present in retry-command, but for -+ * those commands that meet its restrictions, it is easier to use. -+ */ -+ args.method = (grub_ieee1275_cell_t) "no-data-command"; -+ args.ihandle = ihandle; -+ args.cmd_addr = (grub_ieee1275_cell_t) cmd_addr; -+ -+ if (IEEE1275_CALL_ENTRY_FN (&args) == -1) -+ return -1; -+ -+ if (result) -+ *result = args.error; -+ -+ return args.catch_result; -+} -+ -+int -+grub_ieee1275_get_block_size (grub_ieee1275_ihandle_t ihandle) -+{ -+ struct size_args_ieee1275 -+ { -+ struct grub_ieee1275_common_hdr common; -+ grub_ieee1275_cell_t method; -+ grub_ieee1275_cell_t ihandle; -+ grub_ieee1275_cell_t result; -+ grub_ieee1275_cell_t size; -+ } args; -+ -+ INIT_IEEE1275_COMMON (&args.common, "call-method", 2, 2); -+ args.method = (grub_ieee1275_cell_t) "block-size"; -+ args.ihandle = ihandle; -+ args.result = 1; -+ -+ if ((IEEE1275_CALL_ENTRY_FN (&args) == -1) || (args.result)) -+ return 0; -+ -+ return args.size; -+} -diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c -index 12590225eca1483066ea5e7b7443cea3198f6d9b..0d8ebf58b95e220b233e043d2b380007b48e1235 100644 ---- a/grub-core/kern/ieee1275/init.c -+++ b/grub-core/kern/ieee1275/init.c -@@ -94,28 +94,12 @@ void - grub_machine_get_bootlocation (char **device, char **path) - { - char *bootpath; -- grub_ssize_t bootpath_size; - char *filename; - char *type; - -- if (grub_ieee1275_get_property_length (grub_ieee1275_chosen, "bootpath", -- &bootpath_size) -- || bootpath_size <= 0) -- { -- /* Should never happen. */ -- grub_printf ("/chosen/bootpath property missing!\n"); -- return; -- } -- -- bootpath = (char *) grub_malloc ((grub_size_t) bootpath_size + 64); -+ bootpath = grub_ieee1275_get_boot_dev (); - if (! bootpath) -- { -- grub_print_error (); -- return; -- } -- grub_ieee1275_get_property (grub_ieee1275_chosen, "bootpath", bootpath, -- (grub_size_t) bootpath_size + 1, 0); -- bootpath[bootpath_size] = '\0'; -+ return; - - /* Transform an OF device path to a GRUB path. */ - -@@ -126,6 +110,8 @@ grub_machine_get_bootlocation (char **device, char **path) - char *ptr; - dev = grub_ieee1275_get_aliasdevname (bootpath); - canon = grub_ieee1275_canonicalise_devname (dev); -+ if (! canon) -+ return; - ptr = canon + grub_strlen (canon) - 1; - while (ptr > canon && (*ptr == ',' || *ptr == ':')) - ptr--; -diff --git a/grub-core/kern/ieee1275/openfw.c b/grub-core/kern/ieee1275/openfw.c -index ddb778340e4ab74148898b32cd27139fd4f1465b..62929d983bfaa2c83158ee4fe6797125c6d6b844 100644 ---- a/grub-core/kern/ieee1275/openfw.c -+++ b/grub-core/kern/ieee1275/openfw.c -@@ -561,3 +561,30 @@ grub_ieee1275_canonicalise_devname (const char *path) - return NULL; - } - -+char * -+grub_ieee1275_get_boot_dev (void) -+{ -+ char *bootpath; -+ grub_ssize_t bootpath_size; -+ -+ if (grub_ieee1275_get_property_length (grub_ieee1275_chosen, "bootpath", -+ &bootpath_size) -+ || bootpath_size <= 0) -+ { -+ /* Should never happen. */ -+ grub_printf ("/chosen/bootpath property missing!\n"); -+ return NULL; -+ } -+ -+ bootpath = (char *) grub_malloc ((grub_size_t) bootpath_size + 64); -+ if (! bootpath) -+ { -+ grub_print_error (); -+ return NULL; -+ } -+ grub_ieee1275_get_property (grub_ieee1275_chosen, "bootpath", bootpath, -+ (grub_size_t) bootpath_size + 1, 0); -+ bootpath[bootpath_size] = '\0'; -+ -+ return bootpath; -+} -diff --git a/grub-core/kern/misc.c b/grub-core/kern/misc.c -index d1a54df6c12e3358e07aa86366c65af22ca3af5c..3b633d51f4c63e2983e8b3419dc057437224fb93 100644 ---- a/grub-core/kern/misc.c -+++ b/grub-core/kern/misc.c -@@ -391,12 +391,13 @@ grub_strtoull (const char *str, char **end, int base) - unsigned long digit; - - digit = grub_tolower (*str) - '0'; -- if (digit > 9) -- { -- digit += '0' - 'a' + 10; -- if (digit >= (unsigned long) base) -- break; -- } -+ if (digit >= 'a' - '0') -+ digit += '0' - 'a' + 10; -+ else if (digit > 9) -+ break; -+ -+ if (digit >= (unsigned long) base) -+ break; - - found = 1; - -diff --git a/grub-core/kern/sparc64/ieee1275/ieee1275.c b/grub-core/kern/sparc64/ieee1275/ieee1275.c -index 53be692c3d88940572d423ceb09e4187372fcb5b..5a59aaf06193442fa5ec7a537c9cfb10dd3081aa 100644 ---- a/grub-core/kern/sparc64/ieee1275/ieee1275.c -+++ b/grub-core/kern/sparc64/ieee1275/ieee1275.c -@@ -89,3 +89,59 @@ grub_ieee1275_alloc_physmem (grub_addr_t *paddr, grub_size_t size, - - return args.catch_result; - } -+ -+grub_uint64_t -+grub_ieee1275_num_blocks (grub_ieee1275_ihandle_t ihandle) -+{ -+ struct nblocks_args_ieee1275 -+ { -+ struct grub_ieee1275_common_hdr common; -+ grub_ieee1275_cell_t method; -+ grub_ieee1275_cell_t ihandle; -+ grub_ieee1275_cell_t catch_result; -+ grub_ieee1275_cell_t blocks; -+ } -+ args; -+ -+ INIT_IEEE1275_COMMON (&args.common, "call-method", 2, 2); -+ args.method = (grub_ieee1275_cell_t) "#blocks"; -+ args.ihandle = ihandle; -+ args.catch_result = 1; -+ -+ if ((IEEE1275_CALL_ENTRY_FN (&args) == -1) || (args.catch_result != 0)) -+ return -1; -+ -+ /* -+ * If the number of blocks exceeds the range of an unsigned number, -+ * return 0 to alert the caller to try the #blocks64 command. -+ */ -+ if (args.blocks >= 0xffffffffULL) -+ return 0; -+ -+ return args.blocks; -+} -+ -+grub_uint64_t -+grub_ieee1275_num_blocks64 (grub_ieee1275_ihandle_t ihandle) -+{ -+ struct nblocks_args_ieee1275 -+ { -+ struct grub_ieee1275_common_hdr common; -+ grub_ieee1275_cell_t method; -+ grub_ieee1275_cell_t ihandle; -+ grub_ieee1275_cell_t catch_result; -+ grub_ieee1275_cell_t hi_blocks; -+ grub_ieee1275_cell_t lo_blocks; -+ } -+ args; -+ -+ INIT_IEEE1275_COMMON (&args.common, "call-method", 2, 3); -+ args.method = (grub_ieee1275_cell_t) "#blocks64"; -+ args.ihandle = ihandle; -+ args.catch_result = 1; -+ -+ if ((IEEE1275_CALL_ENTRY_FN (&args) == -1) || (args.catch_result != 0)) -+ return -1; -+ -+ return ((args.hi_blocks << 32) | (args.lo_blocks)); -+} -diff --git a/grub-core/kern/uboot/init.c b/grub-core/kern/uboot/init.c -index 5dcc106ed9bcc1fa2cdbe2ba6cbb9e709420ceb3..3e338645c573aa707343235029d9fc45d515a9dc 100644 ---- a/grub-core/kern/uboot/init.c -+++ b/grub-core/kern/uboot/init.c -@@ -36,30 +36,14 @@ - extern char __bss_start[]; - extern char _end[]; - extern grub_size_t grub_total_module_size; --extern int (*grub_uboot_syscall_ptr) (int, int *, ...); - static unsigned long timer_start; - --extern grub_uint32_t grub_uboot_machine_type; --extern grub_addr_t grub_uboot_boot_data; -- - void - grub_exit (void) - { - grub_uboot_return (0); - } - --grub_uint32_t --grub_uboot_get_machine_type (void) --{ -- return grub_uboot_machine_type; --} -- --grub_addr_t --grub_uboot_get_boot_data (void) --{ -- return grub_uboot_boot_data; --} -- - static grub_uint64_t - uboot_timer_ms (void) - { -diff --git a/grub-core/kern/uboot/uboot.c b/grub-core/kern/uboot/uboot.c -index 6800a4beb1c4e83ef9f4ac5da872d2557d8471e1..cf0168e62ddd26db50efd2351499fa7f74fce26c 100644 ---- a/grub-core/kern/uboot/uboot.c -+++ b/grub-core/kern/uboot/uboot.c -@@ -39,48 +39,13 @@ - * returns: 0 if the call not found, 1 if serviced - */ - --extern int (*grub_uboot_syscall_ptr) (int, int *, ...); - extern int grub_uboot_syscall (int, int *, ...); --extern grub_addr_t grub_uboot_search_hint; - - static struct sys_info uboot_sys_info; - static struct mem_region uboot_mem_info[5]; - static struct device_info * devices; - static int num_devices; - --int --grub_uboot_api_init (void) --{ -- struct api_signature *start, *end; -- struct api_signature *p; -- -- if (grub_uboot_search_hint) -- { -- /* Extended search range to work around Trim Slice U-Boot issue */ -- start = (struct api_signature *) ((grub_uboot_search_hint & ~0x000fffff) -- - 0x00500000); -- end = -- (struct api_signature *) ((grub_addr_t) start + UBOOT_API_SEARCH_LEN - -- API_SIG_MAGLEN + 0x00500000); -- } -- else -- { -- start = 0; -- end = (struct api_signature *) (256 * 1024 * 1024); -- } -- -- /* Structure alignment is (at least) 8 bytes */ -- for (p = start; p < end; p = (void *) ((grub_addr_t) p + 8)) -- { -- if (grub_memcmp (&(p->magic), API_SIG_MAGIC, API_SIG_MAGLEN) == 0) -- { -- grub_uboot_syscall_ptr = p->syscall; -- return p->version; -- } -- } -- -- return 0; --} - - /* - * All functions below are wrappers around the grub_uboot_syscall() function -diff --git a/grub-core/kern/x86_64/dl.c b/grub-core/kern/x86_64/dl.c -index 44069067312a890b4e3ebb5130861ed23572bc54..3a73e6e6ce2c5aefc33313e583cb259ea9bc2645 100644 ---- a/grub-core/kern/x86_64/dl.c -+++ b/grub-core/kern/x86_64/dl.c -@@ -70,6 +70,7 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr, - break; - - case R_X86_64_PC32: -+ case R_X86_64_PLT32: - { - grub_int64_t value; - value = ((grub_int32_t) *addr32) + rel->r_addend + sym->st_value - -diff --git a/grub-core/lib/crypto.c b/grub-core/lib/crypto.c -index 683a8aaa711c4eab0208d116cd7275a6ac678986..ca334d5a40e0716bdc9afbb79135c47d174532da 100644 ---- a/grub-core/lib/crypto.c -+++ b/grub-core/lib/crypto.c -@@ -462,7 +462,7 @@ grub_password_get (char buf[], unsigned buf_size) - if (key == '\n' || key == '\r') - break; - -- if (key == '\e') -+ if (key == GRUB_TERM_ESC) - { - cur_len = 0; - break; -@@ -487,7 +487,7 @@ grub_password_get (char buf[], unsigned buf_size) - grub_xputs ("\n"); - grub_refresh (); - -- return (key != '\e'); -+ return (key != GRUB_TERM_ESC); - } - #endif - -diff --git a/grub-core/lib/uboot/datetime.c b/grub-core/lib/dummy/datetime.c -similarity index 91% -rename from grub-core/lib/uboot/datetime.c -rename to grub-core/lib/dummy/datetime.c -index 4be716928a55b789510dfdcdd1833e29e5cd11fe..cf693fc6b621376b5cae0ca0a74b4421799b5a9e 100644 ---- a/grub-core/lib/uboot/datetime.c -+++ b/grub-core/lib/dummy/datetime.c -@@ -18,7 +18,6 @@ - - #include - #include --#include - #include - #include - -@@ -30,12 +29,12 @@ grub_err_t - grub_get_datetime (struct grub_datetime *datetime __attribute__ ((unused))) - { - return grub_error (GRUB_ERR_INVALID_COMMAND, -- "can\'t get datetime using U-Boot"); -+ "can\'t get datetime on this machine"); - } - - grub_err_t - grub_set_datetime (struct grub_datetime * datetime __attribute__ ((unused))) - { - return grub_error (GRUB_ERR_INVALID_COMMAND, -- "can\'t set datetime using U-Boot"); -+ "can\'t set datetime on this machine"); - } -diff --git a/grub-core/lib/uboot/halt.c b/grub-core/lib/dummy/halt.c -similarity index 100% -rename from grub-core/lib/uboot/halt.c -rename to grub-core/lib/dummy/halt.c -diff --git a/grub-core/lib/efi/reboot.c b/grub-core/lib/dummy/reboot.c -similarity index 77% -rename from grub-core/lib/efi/reboot.c -rename to grub-core/lib/dummy/reboot.c -index 7de8bcb5d6ea128dd406001d970d18ff00ea0f3c..b8cbed8f8117ca9c53cc2087dee87ae68876d64f 100644 ---- a/grub-core/lib/efi/reboot.c -+++ b/grub-core/lib/dummy/reboot.c -@@ -1,6 +1,6 @@ - /* - * GRUB -- GRand Unified Bootloader -- * Copyright (C) 2011 Free Software Foundation, Inc. -+ * Copyright (C) 2013 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,10 +16,8 @@ - * along with GRUB. If not, see . - */ - --#include --#include --#include - #include -+#include - #include - #include - -@@ -27,7 +25,8 @@ void - grub_reboot (void) - { - grub_machine_fini (GRUB_LOADER_FLAG_NORETURN); -- efi_call_4 (grub_efi_system_table->runtime_services->reset_system, -- GRUB_EFI_RESET_COLD, GRUB_EFI_SUCCESS, 0, NULL); -- for (;;) ; -+ -+ /* Just stop here */ -+ -+ while (1); - } -diff --git a/grub-core/lib/fdt.c b/grub-core/lib/fdt.c -index b5d520f208886aa663d4aac36cec9b43a2d0da42..0d371c5633e84bbf47114bfe2c23427982e25192 100644 ---- a/grub-core/lib/fdt.c -+++ b/grub-core/lib/fdt.c -@@ -41,11 +41,6 @@ GRUB_MOD_LICENSE ("GPLv3+"); - (2 * sizeof(grub_uint32_t) \ - + ALIGN_UP (grub_strlen (name) + 1, sizeof(grub_uint32_t))) - --/* Size needed by a property entry: 1 token (FDT_PROPERTY), plus len and nameoff -- fields, plus the property value, plus padding if needed. */ --#define prop_entry_size(prop_len) \ -- (3 * sizeof(grub_uint32_t) + ALIGN_UP(prop_len, sizeof(grub_uint32_t))) -- - #define SKIP_NODE_NAME(name, token, end) \ - name = (char *) ((token) + 1); \ - while (name < (char *) end) \ -@@ -86,7 +81,7 @@ static grub_uint32_t *get_next_node (const void *fdt, char *node_name) - case FDT_PROP: - /* Skip property token and following data (len, nameoff and property - value). */ -- token += prop_entry_size(grub_be_to_cpu32(*(token + 1))) -+ token += grub_fdt_prop_entry_size(grub_be_to_cpu32(*(token + 1))) - / sizeof(*token); - break; - case FDT_NOP: -@@ -102,13 +97,13 @@ static grub_uint32_t *get_next_node (const void *fdt, char *node_name) - static int get_mem_rsvmap_size (const void *fdt) - { - int size = 0; -- grub_uint64_t *ptr = (void *) ((grub_addr_t) fdt -- + grub_fdt_get_off_mem_rsvmap (fdt)); -+ grub_unaligned_uint64_t *ptr = (void *) ((grub_addr_t) fdt -+ + grub_fdt_get_off_mem_rsvmap (fdt)); - - do - { - size += 2 * sizeof(*ptr); -- if (!*ptr && !*(ptr + 1)) -+ if (!ptr[0].val && !ptr[1].val) - return size; - ptr += 2; - } while ((grub_addr_t) ptr <= (grub_addr_t) fdt + grub_fdt_get_totalsize (fdt) -@@ -150,7 +145,7 @@ static int add_subnode (void *fdt, int parentoffset, const char *name) - { - case FDT_PROP: - /* Skip len, nameoff and property value. */ -- token += prop_entry_size(grub_be_to_cpu32(*(token + 1))) -+ token += grub_fdt_prop_entry_size(grub_be_to_cpu32(*(token + 1))) - / sizeof(*token); - break; - case FDT_BEGIN_NODE: -@@ -229,7 +224,7 @@ static int rearrange_blocks (void *fdt, unsigned int clearance) - return 0; - } - --static grub_uint32_t *find_prop (void *fdt, unsigned int nodeoffset, -+static grub_uint32_t *find_prop (const void *fdt, unsigned int nodeoffset, - const char *name) - { - grub_uint32_t *prop = (void *) ((grub_addr_t) fdt -@@ -249,12 +244,12 @@ static grub_uint32_t *find_prop (void *fdt, unsigned int nodeoffset, - && !grub_strcmp (name, (char *) fdt + - grub_fdt_get_off_dt_strings (fdt) + nameoff)) - { -- if (prop + prop_entry_size(grub_be_to_cpu32(*(prop + 1))) -+ if (prop + grub_fdt_prop_entry_size(grub_be_to_cpu32(*(prop + 1))) - / sizeof (*prop) >= end) - return NULL; - return prop; - } -- prop += prop_entry_size(grub_be_to_cpu32(*(prop + 1))) / sizeof (*prop); -+ prop += grub_fdt_prop_entry_size(grub_be_to_cpu32(*(prop + 1))) / sizeof (*prop); - } - else if (grub_be_to_cpu32(*prop) == FDT_NOP) - prop++; -@@ -268,9 +263,9 @@ static grub_uint32_t *find_prop (void *fdt, unsigned int nodeoffset, - the size allocated for the FDT; if this function is called before the other - functions in this file and returns success, the other functions are - guaranteed not to access memory locations outside the allocated memory. */ --int grub_fdt_check_header_nosize (void *fdt) -+int grub_fdt_check_header_nosize (const void *fdt) - { -- if (((grub_addr_t) fdt & 0x7) || (grub_fdt_get_magic (fdt) != FDT_MAGIC) -+ if (((grub_addr_t) fdt & 0x3) || (grub_fdt_get_magic (fdt) != FDT_MAGIC) - || (grub_fdt_get_version (fdt) < FDT_SUPPORTED_VERSION) - || (grub_fdt_get_last_comp_version (fdt) > FDT_SUPPORTED_VERSION) - || (grub_fdt_get_off_dt_struct (fdt) & 0x00000003) -@@ -286,7 +281,7 @@ int grub_fdt_check_header_nosize (void *fdt) - return 0; - } - --int grub_fdt_check_header (void *fdt, unsigned int size) -+int grub_fdt_check_header (const void *fdt, unsigned int size) - { - if (size < sizeof (grub_fdt_header_t) - || (grub_fdt_get_totalsize (fdt) > size) -@@ -295,52 +290,105 @@ int grub_fdt_check_header (void *fdt, unsigned int size) - return 0; - } - -+static const grub_uint32_t * -+advance_token (const void *fdt, const grub_uint32_t *token, const grub_uint32_t *end, int skip_current) -+{ -+ for (; token < end; skip_current = 0) -+ { -+ switch (grub_be_to_cpu32 (*token)) -+ { -+ case FDT_BEGIN_NODE: -+ if (skip_current) -+ { -+ token = get_next_node (fdt, (char *) (token + 1)); -+ continue; -+ } -+ char *ptr; -+ for (ptr = (char *) (token + 1); *ptr && ptr < (char *) end; ptr++) -+ ; -+ if (ptr >= (char *) end) -+ return 0; -+ return token; -+ case FDT_PROP: -+ /* Skip property token and following data (len, nameoff and property -+ value). */ -+ if (token >= end - 1) -+ return 0; -+ token += grub_fdt_prop_entry_size(grub_be_to_cpu32(*(token + 1))) -+ / sizeof(*token); -+ break; -+ case FDT_NOP: -+ token++; -+ break; -+ default: -+ return 0; -+ } -+ } -+ return 0; -+} -+ -+int grub_fdt_next_node (const void *fdt, unsigned int currentoffset) -+{ -+ const grub_uint32_t *token = (const grub_uint32_t *) fdt + (currentoffset + grub_fdt_get_off_dt_struct (fdt)) / 4; -+ token = advance_token (fdt, token, (const void *) struct_end (fdt), 1); -+ if (!token) -+ return -1; -+ return (int) ((grub_addr_t) token - (grub_addr_t) fdt -+ - grub_fdt_get_off_dt_struct (fdt)); -+} -+ -+int grub_fdt_first_node (const void *fdt, unsigned int parentoffset) -+{ -+ const grub_uint32_t *token, *end; -+ char *node_name; -+ -+ if (parentoffset & 0x3) -+ return -1; -+ token = (const void *) ((grub_addr_t) fdt + grub_fdt_get_off_dt_struct(fdt) -+ + parentoffset); -+ end = (const void *) struct_end (fdt); -+ if ((token >= end) || (grub_be_to_cpu32(*token) != FDT_BEGIN_NODE)) -+ return -1; -+ SKIP_NODE_NAME(node_name, token, end); -+ token = advance_token (fdt, token, end, 0); -+ if (!token) -+ return -1; -+ return (int) ((grub_addr_t) token - (grub_addr_t) fdt -+ - grub_fdt_get_off_dt_struct (fdt)); -+} -+ - /* Find a direct sub-node of a given parent node. */ - int grub_fdt_find_subnode (const void *fdt, unsigned int parentoffset, - const char *name) - { -- grub_uint32_t *token, *end; -- char *node_name; -+ const grub_uint32_t *token, *end; -+ const char *node_name; -+ int skip_current = 0; - - if (parentoffset & 0x3) - return -1; -- token = (void *) ((grub_addr_t) fdt + grub_fdt_get_off_dt_struct(fdt) -+ token = (const void *) ((grub_addr_t) fdt + grub_fdt_get_off_dt_struct(fdt) - + parentoffset); -- end = (void *) struct_end (fdt); -+ end = (const void *) struct_end (fdt); - if ((token >= end) || (grub_be_to_cpu32(*token) != FDT_BEGIN_NODE)) - return -1; - SKIP_NODE_NAME(node_name, token, end); -- while (token < end) -- { -- switch (grub_be_to_cpu32(*token)) -- { -- case FDT_BEGIN_NODE: -- node_name = (char *) (token + 1); -- if (node_name + grub_strlen (name) >= (char *) end) -- return -1; -- if (!grub_strcmp (node_name, name)) -- return (int) ((grub_addr_t) token - (grub_addr_t) fdt -- - grub_fdt_get_off_dt_struct (fdt)); -- token = get_next_node (fdt, node_name); -- if (!token) -- return -1; -- break; -- case FDT_PROP: -- /* Skip property token and following data (len, nameoff and property -- value). */ -- if (token >= end - 1) -- return -1; -- token += prop_entry_size(grub_be_to_cpu32(*(token + 1))) -- / sizeof(*token); -- break; -- case FDT_NOP: -- token++; -- break; -- default: -- return -1; -- } -+ while (1) { -+ token = advance_token (fdt, token, end, skip_current); -+ if (!token) -+ return -1; -+ skip_current = 1; -+ node_name = (const char *) token + 4; -+ if (grub_strcmp (node_name, name) == 0) -+ return (int) ((grub_addr_t) token - (grub_addr_t) fdt -+ - grub_fdt_get_off_dt_struct (fdt)); - } -- return -1; -+} -+ -+const char * -+grub_fdt_get_nodename (const void *fdt, unsigned int nodeoffset) -+{ -+ return (const char *) fdt + grub_fdt_get_off_dt_struct(fdt) + nodeoffset + 4; - } - - int grub_fdt_add_subnode (void *fdt, unsigned int parentoffset, -@@ -359,6 +407,24 @@ int grub_fdt_add_subnode (void *fdt, unsigned int parentoffset, - return add_subnode (fdt, parentoffset, name); - } - -+const void * -+grub_fdt_get_prop (const void *fdt, unsigned int nodeoffset, const char *name, -+ grub_uint32_t *len) -+{ -+ grub_uint32_t *prop; -+ if ((nodeoffset >= grub_fdt_get_size_dt_struct (fdt)) || (nodeoffset & 0x3) -+ || (grub_be_to_cpu32(*(grub_uint32_t *) ((grub_addr_t) fdt -+ + grub_fdt_get_off_dt_struct (fdt) + nodeoffset)) -+ != FDT_BEGIN_NODE)) -+ return 0; -+ prop = find_prop (fdt, nodeoffset, name); -+ if (!prop) -+ return 0; -+ if (len) -+ *len = grub_be_to_cpu32 (*(prop + 1)); -+ return prop + 3; -+} -+ - int grub_fdt_set_prop (void *fdt, unsigned int nodeoffset, const char *name, - const void *val, grub_uint32_t len) - { -@@ -396,12 +462,12 @@ int grub_fdt_set_prop (void *fdt, unsigned int nodeoffset, const char *name, - unsigned int needed_space = 0; - - if (!prop) -- needed_space = prop_entry_size(len); -+ needed_space = grub_fdt_prop_entry_size(len); - if (!prop_name_present) - needed_space += grub_strlen (name) + 1; - if (needed_space > get_free_space (fdt)) - return -1; -- if (rearrange_blocks (fdt, !prop ? prop_entry_size(len) : 0) < 0) -+ if (rearrange_blocks (fdt, !prop ? grub_fdt_prop_entry_size(len) : 0) < 0) - return -1; - } - if (!prop_name_present) { -@@ -418,10 +484,10 @@ int grub_fdt_set_prop (void *fdt, unsigned int nodeoffset, const char *name, - + sizeof(grub_uint32_t)); - - prop = (void *) (node_name + ALIGN_UP(grub_strlen(node_name) + 1, 4)); -- grub_memmove (prop + prop_entry_size(len) / sizeof(*prop), prop, -+ grub_memmove (prop + grub_fdt_prop_entry_size(len) / sizeof(*prop), prop, - struct_end(fdt) - (grub_addr_t) prop); - grub_fdt_set_size_dt_struct (fdt, grub_fdt_get_size_dt_struct (fdt) -- + prop_entry_size(len)); -+ + grub_fdt_prop_entry_size(len)); - *prop = grub_cpu_to_be32_compile_time (FDT_PROP); - *(prop + 2) = grub_cpu_to_be32 (nameoff); - } -@@ -429,7 +495,7 @@ int grub_fdt_set_prop (void *fdt, unsigned int nodeoffset, const char *name, - - /* Insert padding bytes at the end of the value; if they are not needed, they - will be overwritten by the following memcpy. */ -- *(prop + prop_entry_size(len) / sizeof(grub_uint32_t) - 1) = 0; -+ *(prop + grub_fdt_prop_entry_size(len) / sizeof(grub_uint32_t) - 1) = 0; - - grub_memcpy (prop + 3, val, len); - return 0; -diff --git a/grub-core/lib/i386/reboot.c b/grub-core/lib/i386/reboot.c -index a234244dce5b4c5afd5c68e579c4519a870cda36..dce0b563dcd39ce7acc6d5ec0cc759e67c8c8b87 100644 ---- a/grub-core/lib/i386/reboot.c -+++ b/grub-core/lib/i386/reboot.c -@@ -16,6 +16,8 @@ - * along with GRUB. If not, see . - */ - -+#ifndef GRUB_MACHINE_EFI -+ - #include - #include - #include -@@ -58,3 +60,5 @@ grub_reboot (void) - - while (1); - } -+ -+#endif /* GRUB_MACHINE_EFI */ -diff --git a/grub-core/lib/libgcrypt/cipher/crc.c b/grub-core/lib/libgcrypt/cipher/crc.c -index 9e406f1b19b4d1d49c1ba5140c47d630972c0d8e..28454f8ab728c657d0b440371765030deb35a407 100644 ---- a/grub-core/lib/libgcrypt/cipher/crc.c -+++ b/grub-core/lib/libgcrypt/cipher/crc.c -@@ -28,116 +28,8 @@ - #include "cipher.h" - - #include "bithelp.h" -+#include "bufhelp.h" - --/* Table of CRCs of all 8-bit messages. Generated by running code -- from RFC 1952 modified to print out the table. */ --static u32 crc32_table[256] = { -- 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, -- 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, -- 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, -- 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, -- 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, -- 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, -- 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, -- 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, -- 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, -- 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, -- 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, -- 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, -- 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, -- 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, -- 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, -- 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, -- 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, -- 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, -- 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, -- 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, -- 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, -- 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, -- 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, -- 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, -- 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, -- 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, -- 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, -- 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, -- 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, -- 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, -- 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, -- 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, -- 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, -- 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, -- 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, -- 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, -- 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, -- 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, -- 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, -- 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, -- 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, -- 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, -- 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d --}; -- --/* -- * The following function was extracted from RFC 1952 by Simon -- * Josefsson, for the Shishi project, and modified to be compatible -- * with the modified CRC-32 used by RFC 1510, and subsequently -- * modified for GNU Libgcrypt to allow it to be used for calculating -- * both unmodified CRC-32 and modified CRC-32 values. Original -- * copyright and notice from the document follows: -- * -- * Copyright (c) 1996 L. Peter Deutsch -- * -- * Permission is granted to copy and distribute this document for -- * any purpose and without charge, including translations into -- * other languages and incorporation into compilations, provided -- * that the copyright notice and this notice are preserved, and -- * that any substantive changes or deletions from the original are -- * clearly marked. -- * -- * The copyright on RFCs, and consequently the function below, are -- * supposedly also retroactively claimed by the Internet Society -- * (according to rfc-editor@rfc-editor.org), with the following -- * copyright notice: -- * -- * Copyright (C) The Internet Society. All Rights Reserved. -- * -- * This document and translations of it may be copied and furnished -- * to others, and derivative works that comment on or otherwise -- * explain it or assist in its implementation may be prepared, -- * copied, published and distributed, in whole or in part, without -- * restriction of any kind, provided that the above copyright -- * notice and this paragraph are included on all such copies and -- * derivative works. However, this document itself may not be -- * modified in any way, such as by removing the copyright notice or -- * references to the Internet Society or other Internet -- * organizations, except as needed for the purpose of developing -- * Internet standards in which case the procedures for copyrights -- * defined in the Internet Standards process must be followed, or -- * as required to translate it into languages other than English. -- * -- * The limited permissions granted above are perpetual and will not be -- * revoked by the Internet Society or its successors or assigns. -- * -- * This document and the information contained herein is provided -- * on an "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET -- * ENGINEERING TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR -- * IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE -- * OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY -- * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A -- * PARTICULAR PURPOSE. -- * -- */ --static u32 --update_crc32 (u32 crc, const void *buf_arg, size_t len) --{ -- const char *buf = buf_arg; -- size_t n; -- -- for (n = 0; n < len; n++) -- crc = crc32_table[(crc ^ buf[n]) & 0xff] ^ (crc >> 8); -- -- return crc; --} - - typedef struct - { -@@ -146,8 +38,302 @@ typedef struct - } - CRC_CONTEXT; - -+ -+/* -+ * Code generated by universal_crc by Danjel McGougan -+ * -+ * CRC parameters used: -+ * bits: 32 -+ * poly: 0x04c11db7 -+ * init: 0xffffffff -+ * xor: 0xffffffff -+ * reverse: true -+ * non-direct: false -+ * -+ * CRC of the string "123456789" is 0xcbf43926 -+ */ -+ -+static const u32 crc32_table[1024] = { -+ 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, -+ 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, -+ 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, -+ 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, -+ 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, -+ 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, -+ 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, -+ 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, -+ 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, -+ 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, -+ 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, -+ 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, -+ 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, -+ 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, -+ 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, -+ 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, -+ 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, -+ 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, -+ 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, -+ 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, -+ 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, -+ 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, -+ 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, -+ 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, -+ 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, -+ 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, -+ 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, -+ 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, -+ 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, -+ 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, -+ 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, -+ 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, -+ 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, -+ 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, -+ 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, -+ 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, -+ 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, -+ 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, -+ 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, -+ 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, -+ 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, -+ 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, -+ 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, -+ 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, -+ 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, -+ 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, -+ 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, -+ 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, -+ 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, -+ 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, -+ 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, -+ 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, -+ 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, -+ 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, -+ 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, -+ 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, -+ 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, -+ 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, -+ 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, -+ 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, -+ 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, -+ 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, -+ 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, -+ 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d, -+ 0x00000000, 0x191b3141, 0x32366282, 0x2b2d53c3, -+ 0x646cc504, 0x7d77f445, 0x565aa786, 0x4f4196c7, -+ 0xc8d98a08, 0xd1c2bb49, 0xfaefe88a, 0xe3f4d9cb, -+ 0xacb54f0c, 0xb5ae7e4d, 0x9e832d8e, 0x87981ccf, -+ 0x4ac21251, 0x53d92310, 0x78f470d3, 0x61ef4192, -+ 0x2eaed755, 0x37b5e614, 0x1c98b5d7, 0x05838496, -+ 0x821b9859, 0x9b00a918, 0xb02dfadb, 0xa936cb9a, -+ 0xe6775d5d, 0xff6c6c1c, 0xd4413fdf, 0xcd5a0e9e, -+ 0x958424a2, 0x8c9f15e3, 0xa7b24620, 0xbea97761, -+ 0xf1e8e1a6, 0xe8f3d0e7, 0xc3de8324, 0xdac5b265, -+ 0x5d5daeaa, 0x44469feb, 0x6f6bcc28, 0x7670fd69, -+ 0x39316bae, 0x202a5aef, 0x0b07092c, 0x121c386d, -+ 0xdf4636f3, 0xc65d07b2, 0xed705471, 0xf46b6530, -+ 0xbb2af3f7, 0xa231c2b6, 0x891c9175, 0x9007a034, -+ 0x179fbcfb, 0x0e848dba, 0x25a9de79, 0x3cb2ef38, -+ 0x73f379ff, 0x6ae848be, 0x41c51b7d, 0x58de2a3c, -+ 0xf0794f05, 0xe9627e44, 0xc24f2d87, 0xdb541cc6, -+ 0x94158a01, 0x8d0ebb40, 0xa623e883, 0xbf38d9c2, -+ 0x38a0c50d, 0x21bbf44c, 0x0a96a78f, 0x138d96ce, -+ 0x5ccc0009, 0x45d73148, 0x6efa628b, 0x77e153ca, -+ 0xbabb5d54, 0xa3a06c15, 0x888d3fd6, 0x91960e97, -+ 0xded79850, 0xc7cca911, 0xece1fad2, 0xf5facb93, -+ 0x7262d75c, 0x6b79e61d, 0x4054b5de, 0x594f849f, -+ 0x160e1258, 0x0f152319, 0x243870da, 0x3d23419b, -+ 0x65fd6ba7, 0x7ce65ae6, 0x57cb0925, 0x4ed03864, -+ 0x0191aea3, 0x188a9fe2, 0x33a7cc21, 0x2abcfd60, -+ 0xad24e1af, 0xb43fd0ee, 0x9f12832d, 0x8609b26c, -+ 0xc94824ab, 0xd05315ea, 0xfb7e4629, 0xe2657768, -+ 0x2f3f79f6, 0x362448b7, 0x1d091b74, 0x04122a35, -+ 0x4b53bcf2, 0x52488db3, 0x7965de70, 0x607eef31, -+ 0xe7e6f3fe, 0xfefdc2bf, 0xd5d0917c, 0xcccba03d, -+ 0x838a36fa, 0x9a9107bb, 0xb1bc5478, 0xa8a76539, -+ 0x3b83984b, 0x2298a90a, 0x09b5fac9, 0x10aecb88, -+ 0x5fef5d4f, 0x46f46c0e, 0x6dd93fcd, 0x74c20e8c, -+ 0xf35a1243, 0xea412302, 0xc16c70c1, 0xd8774180, -+ 0x9736d747, 0x8e2de606, 0xa500b5c5, 0xbc1b8484, -+ 0x71418a1a, 0x685abb5b, 0x4377e898, 0x5a6cd9d9, -+ 0x152d4f1e, 0x0c367e5f, 0x271b2d9c, 0x3e001cdd, -+ 0xb9980012, 0xa0833153, 0x8bae6290, 0x92b553d1, -+ 0xddf4c516, 0xc4eff457, 0xefc2a794, 0xf6d996d5, -+ 0xae07bce9, 0xb71c8da8, 0x9c31de6b, 0x852aef2a, -+ 0xca6b79ed, 0xd37048ac, 0xf85d1b6f, 0xe1462a2e, -+ 0x66de36e1, 0x7fc507a0, 0x54e85463, 0x4df36522, -+ 0x02b2f3e5, 0x1ba9c2a4, 0x30849167, 0x299fa026, -+ 0xe4c5aeb8, 0xfdde9ff9, 0xd6f3cc3a, 0xcfe8fd7b, -+ 0x80a96bbc, 0x99b25afd, 0xb29f093e, 0xab84387f, -+ 0x2c1c24b0, 0x350715f1, 0x1e2a4632, 0x07317773, -+ 0x4870e1b4, 0x516bd0f5, 0x7a468336, 0x635db277, -+ 0xcbfad74e, 0xd2e1e60f, 0xf9ccb5cc, 0xe0d7848d, -+ 0xaf96124a, 0xb68d230b, 0x9da070c8, 0x84bb4189, -+ 0x03235d46, 0x1a386c07, 0x31153fc4, 0x280e0e85, -+ 0x674f9842, 0x7e54a903, 0x5579fac0, 0x4c62cb81, -+ 0x8138c51f, 0x9823f45e, 0xb30ea79d, 0xaa1596dc, -+ 0xe554001b, 0xfc4f315a, 0xd7626299, 0xce7953d8, -+ 0x49e14f17, 0x50fa7e56, 0x7bd72d95, 0x62cc1cd4, -+ 0x2d8d8a13, 0x3496bb52, 0x1fbbe891, 0x06a0d9d0, -+ 0x5e7ef3ec, 0x4765c2ad, 0x6c48916e, 0x7553a02f, -+ 0x3a1236e8, 0x230907a9, 0x0824546a, 0x113f652b, -+ 0x96a779e4, 0x8fbc48a5, 0xa4911b66, 0xbd8a2a27, -+ 0xf2cbbce0, 0xebd08da1, 0xc0fdde62, 0xd9e6ef23, -+ 0x14bce1bd, 0x0da7d0fc, 0x268a833f, 0x3f91b27e, -+ 0x70d024b9, 0x69cb15f8, 0x42e6463b, 0x5bfd777a, -+ 0xdc656bb5, 0xc57e5af4, 0xee530937, 0xf7483876, -+ 0xb809aeb1, 0xa1129ff0, 0x8a3fcc33, 0x9324fd72, -+ 0x00000000, 0x01c26a37, 0x0384d46e, 0x0246be59, -+ 0x0709a8dc, 0x06cbc2eb, 0x048d7cb2, 0x054f1685, -+ 0x0e1351b8, 0x0fd13b8f, 0x0d9785d6, 0x0c55efe1, -+ 0x091af964, 0x08d89353, 0x0a9e2d0a, 0x0b5c473d, -+ 0x1c26a370, 0x1de4c947, 0x1fa2771e, 0x1e601d29, -+ 0x1b2f0bac, 0x1aed619b, 0x18abdfc2, 0x1969b5f5, -+ 0x1235f2c8, 0x13f798ff, 0x11b126a6, 0x10734c91, -+ 0x153c5a14, 0x14fe3023, 0x16b88e7a, 0x177ae44d, -+ 0x384d46e0, 0x398f2cd7, 0x3bc9928e, 0x3a0bf8b9, -+ 0x3f44ee3c, 0x3e86840b, 0x3cc03a52, 0x3d025065, -+ 0x365e1758, 0x379c7d6f, 0x35dac336, 0x3418a901, -+ 0x3157bf84, 0x3095d5b3, 0x32d36bea, 0x331101dd, -+ 0x246be590, 0x25a98fa7, 0x27ef31fe, 0x262d5bc9, -+ 0x23624d4c, 0x22a0277b, 0x20e69922, 0x2124f315, -+ 0x2a78b428, 0x2bbade1f, 0x29fc6046, 0x283e0a71, -+ 0x2d711cf4, 0x2cb376c3, 0x2ef5c89a, 0x2f37a2ad, -+ 0x709a8dc0, 0x7158e7f7, 0x731e59ae, 0x72dc3399, -+ 0x7793251c, 0x76514f2b, 0x7417f172, 0x75d59b45, -+ 0x7e89dc78, 0x7f4bb64f, 0x7d0d0816, 0x7ccf6221, -+ 0x798074a4, 0x78421e93, 0x7a04a0ca, 0x7bc6cafd, -+ 0x6cbc2eb0, 0x6d7e4487, 0x6f38fade, 0x6efa90e9, -+ 0x6bb5866c, 0x6a77ec5b, 0x68315202, 0x69f33835, -+ 0x62af7f08, 0x636d153f, 0x612bab66, 0x60e9c151, -+ 0x65a6d7d4, 0x6464bde3, 0x662203ba, 0x67e0698d, -+ 0x48d7cb20, 0x4915a117, 0x4b531f4e, 0x4a917579, -+ 0x4fde63fc, 0x4e1c09cb, 0x4c5ab792, 0x4d98dda5, -+ 0x46c49a98, 0x4706f0af, 0x45404ef6, 0x448224c1, -+ 0x41cd3244, 0x400f5873, 0x4249e62a, 0x438b8c1d, -+ 0x54f16850, 0x55330267, 0x5775bc3e, 0x56b7d609, -+ 0x53f8c08c, 0x523aaabb, 0x507c14e2, 0x51be7ed5, -+ 0x5ae239e8, 0x5b2053df, 0x5966ed86, 0x58a487b1, -+ 0x5deb9134, 0x5c29fb03, 0x5e6f455a, 0x5fad2f6d, -+ 0xe1351b80, 0xe0f771b7, 0xe2b1cfee, 0xe373a5d9, -+ 0xe63cb35c, 0xe7fed96b, 0xe5b86732, 0xe47a0d05, -+ 0xef264a38, 0xeee4200f, 0xeca29e56, 0xed60f461, -+ 0xe82fe2e4, 0xe9ed88d3, 0xebab368a, 0xea695cbd, -+ 0xfd13b8f0, 0xfcd1d2c7, 0xfe976c9e, 0xff5506a9, -+ 0xfa1a102c, 0xfbd87a1b, 0xf99ec442, 0xf85cae75, -+ 0xf300e948, 0xf2c2837f, 0xf0843d26, 0xf1465711, -+ 0xf4094194, 0xf5cb2ba3, 0xf78d95fa, 0xf64fffcd, -+ 0xd9785d60, 0xd8ba3757, 0xdafc890e, 0xdb3ee339, -+ 0xde71f5bc, 0xdfb39f8b, 0xddf521d2, 0xdc374be5, -+ 0xd76b0cd8, 0xd6a966ef, 0xd4efd8b6, 0xd52db281, -+ 0xd062a404, 0xd1a0ce33, 0xd3e6706a, 0xd2241a5d, -+ 0xc55efe10, 0xc49c9427, 0xc6da2a7e, 0xc7184049, -+ 0xc25756cc, 0xc3953cfb, 0xc1d382a2, 0xc011e895, -+ 0xcb4dafa8, 0xca8fc59f, 0xc8c97bc6, 0xc90b11f1, -+ 0xcc440774, 0xcd866d43, 0xcfc0d31a, 0xce02b92d, -+ 0x91af9640, 0x906dfc77, 0x922b422e, 0x93e92819, -+ 0x96a63e9c, 0x976454ab, 0x9522eaf2, 0x94e080c5, -+ 0x9fbcc7f8, 0x9e7eadcf, 0x9c381396, 0x9dfa79a1, -+ 0x98b56f24, 0x99770513, 0x9b31bb4a, 0x9af3d17d, -+ 0x8d893530, 0x8c4b5f07, 0x8e0de15e, 0x8fcf8b69, -+ 0x8a809dec, 0x8b42f7db, 0x89044982, 0x88c623b5, -+ 0x839a6488, 0x82580ebf, 0x801eb0e6, 0x81dcdad1, -+ 0x8493cc54, 0x8551a663, 0x8717183a, 0x86d5720d, -+ 0xa9e2d0a0, 0xa820ba97, 0xaa6604ce, 0xaba46ef9, -+ 0xaeeb787c, 0xaf29124b, 0xad6fac12, 0xacadc625, -+ 0xa7f18118, 0xa633eb2f, 0xa4755576, 0xa5b73f41, -+ 0xa0f829c4, 0xa13a43f3, 0xa37cfdaa, 0xa2be979d, -+ 0xb5c473d0, 0xb40619e7, 0xb640a7be, 0xb782cd89, -+ 0xb2cddb0c, 0xb30fb13b, 0xb1490f62, 0xb08b6555, -+ 0xbbd72268, 0xba15485f, 0xb853f606, 0xb9919c31, -+ 0xbcde8ab4, 0xbd1ce083, 0xbf5a5eda, 0xbe9834ed, -+ 0x00000000, 0xb8bc6765, 0xaa09c88b, 0x12b5afee, -+ 0x8f629757, 0x37def032, 0x256b5fdc, 0x9dd738b9, -+ 0xc5b428ef, 0x7d084f8a, 0x6fbde064, 0xd7018701, -+ 0x4ad6bfb8, 0xf26ad8dd, 0xe0df7733, 0x58631056, -+ 0x5019579f, 0xe8a530fa, 0xfa109f14, 0x42acf871, -+ 0xdf7bc0c8, 0x67c7a7ad, 0x75720843, 0xcdce6f26, -+ 0x95ad7f70, 0x2d111815, 0x3fa4b7fb, 0x8718d09e, -+ 0x1acfe827, 0xa2738f42, 0xb0c620ac, 0x087a47c9, -+ 0xa032af3e, 0x188ec85b, 0x0a3b67b5, 0xb28700d0, -+ 0x2f503869, 0x97ec5f0c, 0x8559f0e2, 0x3de59787, -+ 0x658687d1, 0xdd3ae0b4, 0xcf8f4f5a, 0x7733283f, -+ 0xeae41086, 0x525877e3, 0x40edd80d, 0xf851bf68, -+ 0xf02bf8a1, 0x48979fc4, 0x5a22302a, 0xe29e574f, -+ 0x7f496ff6, 0xc7f50893, 0xd540a77d, 0x6dfcc018, -+ 0x359fd04e, 0x8d23b72b, 0x9f9618c5, 0x272a7fa0, -+ 0xbafd4719, 0x0241207c, 0x10f48f92, 0xa848e8f7, -+ 0x9b14583d, 0x23a83f58, 0x311d90b6, 0x89a1f7d3, -+ 0x1476cf6a, 0xaccaa80f, 0xbe7f07e1, 0x06c36084, -+ 0x5ea070d2, 0xe61c17b7, 0xf4a9b859, 0x4c15df3c, -+ 0xd1c2e785, 0x697e80e0, 0x7bcb2f0e, 0xc377486b, -+ 0xcb0d0fa2, 0x73b168c7, 0x6104c729, 0xd9b8a04c, -+ 0x446f98f5, 0xfcd3ff90, 0xee66507e, 0x56da371b, -+ 0x0eb9274d, 0xb6054028, 0xa4b0efc6, 0x1c0c88a3, -+ 0x81dbb01a, 0x3967d77f, 0x2bd27891, 0x936e1ff4, -+ 0x3b26f703, 0x839a9066, 0x912f3f88, 0x299358ed, -+ 0xb4446054, 0x0cf80731, 0x1e4da8df, 0xa6f1cfba, -+ 0xfe92dfec, 0x462eb889, 0x549b1767, 0xec277002, -+ 0x71f048bb, 0xc94c2fde, 0xdbf98030, 0x6345e755, -+ 0x6b3fa09c, 0xd383c7f9, 0xc1366817, 0x798a0f72, -+ 0xe45d37cb, 0x5ce150ae, 0x4e54ff40, 0xf6e89825, -+ 0xae8b8873, 0x1637ef16, 0x048240f8, 0xbc3e279d, -+ 0x21e91f24, 0x99557841, 0x8be0d7af, 0x335cb0ca, -+ 0xed59b63b, 0x55e5d15e, 0x47507eb0, 0xffec19d5, -+ 0x623b216c, 0xda874609, 0xc832e9e7, 0x708e8e82, -+ 0x28ed9ed4, 0x9051f9b1, 0x82e4565f, 0x3a58313a, -+ 0xa78f0983, 0x1f336ee6, 0x0d86c108, 0xb53aa66d, -+ 0xbd40e1a4, 0x05fc86c1, 0x1749292f, 0xaff54e4a, -+ 0x322276f3, 0x8a9e1196, 0x982bbe78, 0x2097d91d, -+ 0x78f4c94b, 0xc048ae2e, 0xd2fd01c0, 0x6a4166a5, -+ 0xf7965e1c, 0x4f2a3979, 0x5d9f9697, 0xe523f1f2, -+ 0x4d6b1905, 0xf5d77e60, 0xe762d18e, 0x5fdeb6eb, -+ 0xc2098e52, 0x7ab5e937, 0x680046d9, 0xd0bc21bc, -+ 0x88df31ea, 0x3063568f, 0x22d6f961, 0x9a6a9e04, -+ 0x07bda6bd, 0xbf01c1d8, 0xadb46e36, 0x15080953, -+ 0x1d724e9a, 0xa5ce29ff, 0xb77b8611, 0x0fc7e174, -+ 0x9210d9cd, 0x2aacbea8, 0x38191146, 0x80a57623, -+ 0xd8c66675, 0x607a0110, 0x72cfaefe, 0xca73c99b, -+ 0x57a4f122, 0xef189647, 0xfdad39a9, 0x45115ecc, -+ 0x764dee06, 0xcef18963, 0xdc44268d, 0x64f841e8, -+ 0xf92f7951, 0x41931e34, 0x5326b1da, 0xeb9ad6bf, -+ 0xb3f9c6e9, 0x0b45a18c, 0x19f00e62, 0xa14c6907, -+ 0x3c9b51be, 0x842736db, 0x96929935, 0x2e2efe50, -+ 0x2654b999, 0x9ee8defc, 0x8c5d7112, 0x34e11677, -+ 0xa9362ece, 0x118a49ab, 0x033fe645, 0xbb838120, -+ 0xe3e09176, 0x5b5cf613, 0x49e959fd, 0xf1553e98, -+ 0x6c820621, 0xd43e6144, 0xc68bceaa, 0x7e37a9cf, -+ 0xd67f4138, 0x6ec3265d, 0x7c7689b3, 0xc4caeed6, -+ 0x591dd66f, 0xe1a1b10a, 0xf3141ee4, 0x4ba87981, -+ 0x13cb69d7, 0xab770eb2, 0xb9c2a15c, 0x017ec639, -+ 0x9ca9fe80, 0x241599e5, 0x36a0360b, 0x8e1c516e, -+ 0x866616a7, 0x3eda71c2, 0x2c6fde2c, 0x94d3b949, -+ 0x090481f0, 0xb1b8e695, 0xa30d497b, 0x1bb12e1e, -+ 0x43d23e48, 0xfb6e592d, 0xe9dbf6c3, 0x516791a6, -+ 0xccb0a91f, 0x740cce7a, 0x66b96194, 0xde0506f1 -+}; -+ - /* CRC32 */ - -+static inline u32 -+crc32_next (u32 crc, byte data) -+{ -+ return (crc >> 8) ^ crc32_table[(crc & 0xff) ^ data]; -+} -+ -+/* -+ * Process 4 bytes in one go -+ */ -+static inline u32 -+crc32_next4 (u32 crc, u32 data) -+{ -+ crc ^= data; -+ crc = crc32_table[(crc & 0xff) + 0x300] ^ -+ crc32_table[((crc >> 8) & 0xff) + 0x200] ^ -+ crc32_table[((crc >> 16) & 0xff) + 0x100] ^ -+ crc32_table[(crc >> 24) & 0xff]; -+ return crc; -+} -+ - static void - crc32_init (void *context) - { -@@ -156,12 +342,40 @@ crc32_init (void *context) - } - - static void --crc32_write (void *context, const void *inbuf, size_t inlen) -+crc32_write (void *context, const void *inbuf_arg, size_t inlen) - { - CRC_CONTEXT *ctx = (CRC_CONTEXT *) context; -- if (!inbuf) -+ const byte *inbuf = inbuf_arg; -+ u32 crc; -+ -+ if (!inbuf || !inlen) - return; -- ctx->CRC = update_crc32 (ctx->CRC, inbuf, inlen); -+ -+ crc = ctx->CRC; -+ -+ while (inlen >= 16) -+ { -+ inlen -= 16; -+ crc = crc32_next4(crc, buf_get_le32(&inbuf[0])); -+ crc = crc32_next4(crc, buf_get_le32(&inbuf[4])); -+ crc = crc32_next4(crc, buf_get_le32(&inbuf[8])); -+ crc = crc32_next4(crc, buf_get_le32(&inbuf[12])); -+ inbuf += 16; -+ } -+ -+ while (inlen >= 4) -+ { -+ inlen -= 4; -+ crc = crc32_next4(crc, buf_get_le32(inbuf)); -+ inbuf += 4; -+ } -+ -+ while (inlen--) -+ { -+ crc = crc32_next(crc, *inbuf++); -+ } -+ -+ ctx->CRC = crc; - } - - static byte * -@@ -176,13 +390,12 @@ crc32_final (void *context) - { - CRC_CONTEXT *ctx = (CRC_CONTEXT *) context; - ctx->CRC ^= 0xffffffffL; -- ctx->buf[0] = (ctx->CRC >> 24) & 0xFF; -- ctx->buf[1] = (ctx->CRC >> 16) & 0xFF; -- ctx->buf[2] = (ctx->CRC >> 8) & 0xFF; -- ctx->buf[3] = (ctx->CRC ) & 0xFF; -+ buf_put_be32 (ctx->buf, ctx->CRC); - } - - /* CRC32 a'la RFC 1510 */ -+/* CRC of the string "123456789" is 0x2dfd2d88 */ -+ - static void - crc32rfc1510_init (void *context) - { -@@ -194,82 +407,366 @@ static void - crc32rfc1510_final (void *context) - { - CRC_CONTEXT *ctx = (CRC_CONTEXT *) context; -- ctx->buf[0] = (ctx->CRC >> 24) & 0xFF; -- ctx->buf[1] = (ctx->CRC >> 16) & 0xFF; -- ctx->buf[2] = (ctx->CRC >> 8) & 0xFF; -- ctx->buf[3] = (ctx->CRC ) & 0xFF; -+ buf_put_be32(ctx->buf, ctx->CRC); - } - - /* CRC24 a'la RFC 2440 */ - /* -- * The following CRC 24 routines are adapted from RFC 2440, which has -- * the following copyright notice: -+ * Code generated by universal_crc by Danjel McGougan - * -- * Copyright (C) The Internet Society (1998). All Rights Reserved. -+ * CRC parameters used: -+ * bits: 24 -+ * poly: 0x864cfb -+ * init: 0xb704ce -+ * xor: 0x000000 -+ * reverse: false -+ * non-direct: false - * -- * This document and translations of it may be copied and furnished -- * to others, and derivative works that comment on or otherwise -- * explain it or assist in its implementation may be prepared, -- * copied, published and distributed, in whole or in part, without -- * restriction of any kind, provided that the above copyright notice -- * and this paragraph are included on all such copies and derivative -- * works. However, this document itself may not be modified in any -- * way, such as by removing the copyright notice or references to -- * the Internet Society or other Internet organizations, except as -- * needed for the purpose of developing Internet standards in which -- * case the procedures for copyrights defined in the Internet -- * Standards process must be followed, or as required to translate -- * it into languages other than English. -- * -- * The limited permissions granted above are perpetual and will not be -- * revoked by the Internet Society or its successors or assigns. -- * -- * This document and the information contained herein is provided on -- * an "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET -- * ENGINEERING TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR -- * IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE -- * OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY -- * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR -- * PURPOSE. -+ * CRC of the string "123456789" is 0x21cf02 -+ */ -+ -+static const u32 crc24_table[1024] = -+{ -+ 0x00000000, 0x00fb4c86, 0x000dd58a, 0x00f6990c, -+ 0x00e1e693, 0x001aaa15, 0x00ec3319, 0x00177f9f, -+ 0x003981a1, 0x00c2cd27, 0x0034542b, 0x00cf18ad, -+ 0x00d86732, 0x00232bb4, 0x00d5b2b8, 0x002efe3e, -+ 0x00894ec5, 0x00720243, 0x00849b4f, 0x007fd7c9, -+ 0x0068a856, 0x0093e4d0, 0x00657ddc, 0x009e315a, -+ 0x00b0cf64, 0x004b83e2, 0x00bd1aee, 0x00465668, -+ 0x005129f7, 0x00aa6571, 0x005cfc7d, 0x00a7b0fb, -+ 0x00e9d10c, 0x00129d8a, 0x00e40486, 0x001f4800, -+ 0x0008379f, 0x00f37b19, 0x0005e215, 0x00feae93, -+ 0x00d050ad, 0x002b1c2b, 0x00dd8527, 0x0026c9a1, -+ 0x0031b63e, 0x00cafab8, 0x003c63b4, 0x00c72f32, -+ 0x00609fc9, 0x009bd34f, 0x006d4a43, 0x009606c5, -+ 0x0081795a, 0x007a35dc, 0x008cacd0, 0x0077e056, -+ 0x00591e68, 0x00a252ee, 0x0054cbe2, 0x00af8764, -+ 0x00b8f8fb, 0x0043b47d, 0x00b52d71, 0x004e61f7, -+ 0x00d2a319, 0x0029ef9f, 0x00df7693, 0x00243a15, -+ 0x0033458a, 0x00c8090c, 0x003e9000, 0x00c5dc86, -+ 0x00eb22b8, 0x00106e3e, 0x00e6f732, 0x001dbbb4, -+ 0x000ac42b, 0x00f188ad, 0x000711a1, 0x00fc5d27, -+ 0x005beddc, 0x00a0a15a, 0x00563856, 0x00ad74d0, -+ 0x00ba0b4f, 0x004147c9, 0x00b7dec5, 0x004c9243, -+ 0x00626c7d, 0x009920fb, 0x006fb9f7, 0x0094f571, -+ 0x00838aee, 0x0078c668, 0x008e5f64, 0x007513e2, -+ 0x003b7215, 0x00c03e93, 0x0036a79f, 0x00cdeb19, -+ 0x00da9486, 0x0021d800, 0x00d7410c, 0x002c0d8a, -+ 0x0002f3b4, 0x00f9bf32, 0x000f263e, 0x00f46ab8, -+ 0x00e31527, 0x001859a1, 0x00eec0ad, 0x00158c2b, -+ 0x00b23cd0, 0x00497056, 0x00bfe95a, 0x0044a5dc, -+ 0x0053da43, 0x00a896c5, 0x005e0fc9, 0x00a5434f, -+ 0x008bbd71, 0x0070f1f7, 0x008668fb, 0x007d247d, -+ 0x006a5be2, 0x00911764, 0x00678e68, 0x009cc2ee, -+ 0x00a44733, 0x005f0bb5, 0x00a992b9, 0x0052de3f, -+ 0x0045a1a0, 0x00beed26, 0x0048742a, 0x00b338ac, -+ 0x009dc692, 0x00668a14, 0x00901318, 0x006b5f9e, -+ 0x007c2001, 0x00876c87, 0x0071f58b, 0x008ab90d, -+ 0x002d09f6, 0x00d64570, 0x0020dc7c, 0x00db90fa, -+ 0x00ccef65, 0x0037a3e3, 0x00c13aef, 0x003a7669, -+ 0x00148857, 0x00efc4d1, 0x00195ddd, 0x00e2115b, -+ 0x00f56ec4, 0x000e2242, 0x00f8bb4e, 0x0003f7c8, -+ 0x004d963f, 0x00b6dab9, 0x004043b5, 0x00bb0f33, -+ 0x00ac70ac, 0x00573c2a, 0x00a1a526, 0x005ae9a0, -+ 0x0074179e, 0x008f5b18, 0x0079c214, 0x00828e92, -+ 0x0095f10d, 0x006ebd8b, 0x00982487, 0x00636801, -+ 0x00c4d8fa, 0x003f947c, 0x00c90d70, 0x003241f6, -+ 0x00253e69, 0x00de72ef, 0x0028ebe3, 0x00d3a765, -+ 0x00fd595b, 0x000615dd, 0x00f08cd1, 0x000bc057, -+ 0x001cbfc8, 0x00e7f34e, 0x00116a42, 0x00ea26c4, -+ 0x0076e42a, 0x008da8ac, 0x007b31a0, 0x00807d26, -+ 0x009702b9, 0x006c4e3f, 0x009ad733, 0x00619bb5, -+ 0x004f658b, 0x00b4290d, 0x0042b001, 0x00b9fc87, -+ 0x00ae8318, 0x0055cf9e, 0x00a35692, 0x00581a14, -+ 0x00ffaaef, 0x0004e669, 0x00f27f65, 0x000933e3, -+ 0x001e4c7c, 0x00e500fa, 0x001399f6, 0x00e8d570, -+ 0x00c62b4e, 0x003d67c8, 0x00cbfec4, 0x0030b242, -+ 0x0027cddd, 0x00dc815b, 0x002a1857, 0x00d154d1, -+ 0x009f3526, 0x006479a0, 0x0092e0ac, 0x0069ac2a, -+ 0x007ed3b5, 0x00859f33, 0x0073063f, 0x00884ab9, -+ 0x00a6b487, 0x005df801, 0x00ab610d, 0x00502d8b, -+ 0x00475214, 0x00bc1e92, 0x004a879e, 0x00b1cb18, -+ 0x00167be3, 0x00ed3765, 0x001bae69, 0x00e0e2ef, -+ 0x00f79d70, 0x000cd1f6, 0x00fa48fa, 0x0001047c, -+ 0x002ffa42, 0x00d4b6c4, 0x00222fc8, 0x00d9634e, -+ 0x00ce1cd1, 0x00355057, 0x00c3c95b, 0x003885dd, -+ 0x00000000, 0x00488f66, 0x00901ecd, 0x00d891ab, -+ 0x00db711c, 0x0093fe7a, 0x004b6fd1, 0x0003e0b7, -+ 0x00b6e338, 0x00fe6c5e, 0x0026fdf5, 0x006e7293, -+ 0x006d9224, 0x00251d42, 0x00fd8ce9, 0x00b5038f, -+ 0x006cc771, 0x00244817, 0x00fcd9bc, 0x00b456da, -+ 0x00b7b66d, 0x00ff390b, 0x0027a8a0, 0x006f27c6, -+ 0x00da2449, 0x0092ab2f, 0x004a3a84, 0x0002b5e2, -+ 0x00015555, 0x0049da33, 0x00914b98, 0x00d9c4fe, -+ 0x00d88ee3, 0x00900185, 0x0048902e, 0x00001f48, -+ 0x0003ffff, 0x004b7099, 0x0093e132, 0x00db6e54, -+ 0x006e6ddb, 0x0026e2bd, 0x00fe7316, 0x00b6fc70, -+ 0x00b51cc7, 0x00fd93a1, 0x0025020a, 0x006d8d6c, -+ 0x00b44992, 0x00fcc6f4, 0x0024575f, 0x006cd839, -+ 0x006f388e, 0x0027b7e8, 0x00ff2643, 0x00b7a925, -+ 0x0002aaaa, 0x004a25cc, 0x0092b467, 0x00da3b01, -+ 0x00d9dbb6, 0x009154d0, 0x0049c57b, 0x00014a1d, -+ 0x004b5141, 0x0003de27, 0x00db4f8c, 0x0093c0ea, -+ 0x0090205d, 0x00d8af3b, 0x00003e90, 0x0048b1f6, -+ 0x00fdb279, 0x00b53d1f, 0x006dacb4, 0x002523d2, -+ 0x0026c365, 0x006e4c03, 0x00b6dda8, 0x00fe52ce, -+ 0x00279630, 0x006f1956, 0x00b788fd, 0x00ff079b, -+ 0x00fce72c, 0x00b4684a, 0x006cf9e1, 0x00247687, -+ 0x00917508, 0x00d9fa6e, 0x00016bc5, 0x0049e4a3, -+ 0x004a0414, 0x00028b72, 0x00da1ad9, 0x009295bf, -+ 0x0093dfa2, 0x00db50c4, 0x0003c16f, 0x004b4e09, -+ 0x0048aebe, 0x000021d8, 0x00d8b073, 0x00903f15, -+ 0x00253c9a, 0x006db3fc, 0x00b52257, 0x00fdad31, -+ 0x00fe4d86, 0x00b6c2e0, 0x006e534b, 0x0026dc2d, -+ 0x00ff18d3, 0x00b797b5, 0x006f061e, 0x00278978, -+ 0x002469cf, 0x006ce6a9, 0x00b47702, 0x00fcf864, -+ 0x0049fbeb, 0x0001748d, 0x00d9e526, 0x00916a40, -+ 0x00928af7, 0x00da0591, 0x0002943a, 0x004a1b5c, -+ 0x0096a282, 0x00de2de4, 0x0006bc4f, 0x004e3329, -+ 0x004dd39e, 0x00055cf8, 0x00ddcd53, 0x00954235, -+ 0x002041ba, 0x0068cedc, 0x00b05f77, 0x00f8d011, -+ 0x00fb30a6, 0x00b3bfc0, 0x006b2e6b, 0x0023a10d, -+ 0x00fa65f3, 0x00b2ea95, 0x006a7b3e, 0x0022f458, -+ 0x002114ef, 0x00699b89, 0x00b10a22, 0x00f98544, -+ 0x004c86cb, 0x000409ad, 0x00dc9806, 0x00941760, -+ 0x0097f7d7, 0x00df78b1, 0x0007e91a, 0x004f667c, -+ 0x004e2c61, 0x0006a307, 0x00de32ac, 0x0096bdca, -+ 0x00955d7d, 0x00ddd21b, 0x000543b0, 0x004dccd6, -+ 0x00f8cf59, 0x00b0403f, 0x0068d194, 0x00205ef2, -+ 0x0023be45, 0x006b3123, 0x00b3a088, 0x00fb2fee, -+ 0x0022eb10, 0x006a6476, 0x00b2f5dd, 0x00fa7abb, -+ 0x00f99a0c, 0x00b1156a, 0x006984c1, 0x00210ba7, -+ 0x00940828, 0x00dc874e, 0x000416e5, 0x004c9983, -+ 0x004f7934, 0x0007f652, 0x00df67f9, 0x0097e89f, -+ 0x00ddf3c3, 0x00957ca5, 0x004ded0e, 0x00056268, -+ 0x000682df, 0x004e0db9, 0x00969c12, 0x00de1374, -+ 0x006b10fb, 0x00239f9d, 0x00fb0e36, 0x00b38150, -+ 0x00b061e7, 0x00f8ee81, 0x00207f2a, 0x0068f04c, -+ 0x00b134b2, 0x00f9bbd4, 0x00212a7f, 0x0069a519, -+ 0x006a45ae, 0x0022cac8, 0x00fa5b63, 0x00b2d405, -+ 0x0007d78a, 0x004f58ec, 0x0097c947, 0x00df4621, -+ 0x00dca696, 0x009429f0, 0x004cb85b, 0x0004373d, -+ 0x00057d20, 0x004df246, 0x009563ed, 0x00ddec8b, -+ 0x00de0c3c, 0x0096835a, 0x004e12f1, 0x00069d97, -+ 0x00b39e18, 0x00fb117e, 0x002380d5, 0x006b0fb3, -+ 0x0068ef04, 0x00206062, 0x00f8f1c9, 0x00b07eaf, -+ 0x0069ba51, 0x00213537, 0x00f9a49c, 0x00b12bfa, -+ 0x00b2cb4d, 0x00fa442b, 0x0022d580, 0x006a5ae6, -+ 0x00df5969, 0x0097d60f, 0x004f47a4, 0x0007c8c2, -+ 0x00042875, 0x004ca713, 0x009436b8, 0x00dcb9de, -+ 0x00000000, 0x00d70983, 0x00555f80, 0x00825603, -+ 0x0051f286, 0x0086fb05, 0x0004ad06, 0x00d3a485, -+ 0x0059a88b, 0x008ea108, 0x000cf70b, 0x00dbfe88, -+ 0x00085a0d, 0x00df538e, 0x005d058d, 0x008a0c0e, -+ 0x00491c91, 0x009e1512, 0x001c4311, 0x00cb4a92, -+ 0x0018ee17, 0x00cfe794, 0x004db197, 0x009ab814, -+ 0x0010b41a, 0x00c7bd99, 0x0045eb9a, 0x0092e219, -+ 0x0041469c, 0x00964f1f, 0x0014191c, 0x00c3109f, -+ 0x006974a4, 0x00be7d27, 0x003c2b24, 0x00eb22a7, -+ 0x00388622, 0x00ef8fa1, 0x006dd9a2, 0x00bad021, -+ 0x0030dc2f, 0x00e7d5ac, 0x006583af, 0x00b28a2c, -+ 0x00612ea9, 0x00b6272a, 0x00347129, 0x00e378aa, -+ 0x00206835, 0x00f761b6, 0x007537b5, 0x00a23e36, -+ 0x00719ab3, 0x00a69330, 0x0024c533, 0x00f3ccb0, -+ 0x0079c0be, 0x00aec93d, 0x002c9f3e, 0x00fb96bd, -+ 0x00283238, 0x00ff3bbb, 0x007d6db8, 0x00aa643b, -+ 0x0029a4ce, 0x00fead4d, 0x007cfb4e, 0x00abf2cd, -+ 0x00785648, 0x00af5fcb, 0x002d09c8, 0x00fa004b, -+ 0x00700c45, 0x00a705c6, 0x002553c5, 0x00f25a46, -+ 0x0021fec3, 0x00f6f740, 0x0074a143, 0x00a3a8c0, -+ 0x0060b85f, 0x00b7b1dc, 0x0035e7df, 0x00e2ee5c, -+ 0x00314ad9, 0x00e6435a, 0x00641559, 0x00b31cda, -+ 0x003910d4, 0x00ee1957, 0x006c4f54, 0x00bb46d7, -+ 0x0068e252, 0x00bfebd1, 0x003dbdd2, 0x00eab451, -+ 0x0040d06a, 0x0097d9e9, 0x00158fea, 0x00c28669, -+ 0x001122ec, 0x00c62b6f, 0x00447d6c, 0x009374ef, -+ 0x001978e1, 0x00ce7162, 0x004c2761, 0x009b2ee2, -+ 0x00488a67, 0x009f83e4, 0x001dd5e7, 0x00cadc64, -+ 0x0009ccfb, 0x00dec578, 0x005c937b, 0x008b9af8, -+ 0x00583e7d, 0x008f37fe, 0x000d61fd, 0x00da687e, -+ 0x00506470, 0x00876df3, 0x00053bf0, 0x00d23273, -+ 0x000196f6, 0x00d69f75, 0x0054c976, 0x0083c0f5, -+ 0x00a9041b, 0x007e0d98, 0x00fc5b9b, 0x002b5218, -+ 0x00f8f69d, 0x002fff1e, 0x00ada91d, 0x007aa09e, -+ 0x00f0ac90, 0x0027a513, 0x00a5f310, 0x0072fa93, -+ 0x00a15e16, 0x00765795, 0x00f40196, 0x00230815, -+ 0x00e0188a, 0x00371109, 0x00b5470a, 0x00624e89, -+ 0x00b1ea0c, 0x0066e38f, 0x00e4b58c, 0x0033bc0f, -+ 0x00b9b001, 0x006eb982, 0x00ecef81, 0x003be602, -+ 0x00e84287, 0x003f4b04, 0x00bd1d07, 0x006a1484, -+ 0x00c070bf, 0x0017793c, 0x00952f3f, 0x004226bc, -+ 0x00918239, 0x00468bba, 0x00c4ddb9, 0x0013d43a, -+ 0x0099d834, 0x004ed1b7, 0x00cc87b4, 0x001b8e37, -+ 0x00c82ab2, 0x001f2331, 0x009d7532, 0x004a7cb1, -+ 0x00896c2e, 0x005e65ad, 0x00dc33ae, 0x000b3a2d, -+ 0x00d89ea8, 0x000f972b, 0x008dc128, 0x005ac8ab, -+ 0x00d0c4a5, 0x0007cd26, 0x00859b25, 0x005292a6, -+ 0x00813623, 0x00563fa0, 0x00d469a3, 0x00036020, -+ 0x0080a0d5, 0x0057a956, 0x00d5ff55, 0x0002f6d6, -+ 0x00d15253, 0x00065bd0, 0x00840dd3, 0x00530450, -+ 0x00d9085e, 0x000e01dd, 0x008c57de, 0x005b5e5d, -+ 0x0088fad8, 0x005ff35b, 0x00dda558, 0x000aacdb, -+ 0x00c9bc44, 0x001eb5c7, 0x009ce3c4, 0x004bea47, -+ 0x00984ec2, 0x004f4741, 0x00cd1142, 0x001a18c1, -+ 0x009014cf, 0x00471d4c, 0x00c54b4f, 0x001242cc, -+ 0x00c1e649, 0x0016efca, 0x0094b9c9, 0x0043b04a, -+ 0x00e9d471, 0x003eddf2, 0x00bc8bf1, 0x006b8272, -+ 0x00b826f7, 0x006f2f74, 0x00ed7977, 0x003a70f4, -+ 0x00b07cfa, 0x00677579, 0x00e5237a, 0x00322af9, -+ 0x00e18e7c, 0x003687ff, 0x00b4d1fc, 0x0063d87f, -+ 0x00a0c8e0, 0x0077c163, 0x00f59760, 0x00229ee3, -+ 0x00f13a66, 0x002633e5, 0x00a465e6, 0x00736c65, -+ 0x00f9606b, 0x002e69e8, 0x00ac3feb, 0x007b3668, -+ 0x00a892ed, 0x007f9b6e, 0x00fdcd6d, 0x002ac4ee, -+ 0x00000000, 0x00520936, 0x00a4126c, 0x00f61b5a, -+ 0x004825d8, 0x001a2cee, 0x00ec37b4, 0x00be3e82, -+ 0x006b0636, 0x00390f00, 0x00cf145a, 0x009d1d6c, -+ 0x002323ee, 0x00712ad8, 0x00873182, 0x00d538b4, -+ 0x00d60c6c, 0x0084055a, 0x00721e00, 0x00201736, -+ 0x009e29b4, 0x00cc2082, 0x003a3bd8, 0x006832ee, -+ 0x00bd0a5a, 0x00ef036c, 0x00191836, 0x004b1100, -+ 0x00f52f82, 0x00a726b4, 0x00513dee, 0x000334d8, -+ 0x00ac19d8, 0x00fe10ee, 0x00080bb4, 0x005a0282, -+ 0x00e43c00, 0x00b63536, 0x00402e6c, 0x0012275a, -+ 0x00c71fee, 0x009516d8, 0x00630d82, 0x003104b4, -+ 0x008f3a36, 0x00dd3300, 0x002b285a, 0x0079216c, -+ 0x007a15b4, 0x00281c82, 0x00de07d8, 0x008c0eee, -+ 0x0032306c, 0x0060395a, 0x00962200, 0x00c42b36, -+ 0x00111382, 0x00431ab4, 0x00b501ee, 0x00e708d8, -+ 0x0059365a, 0x000b3f6c, 0x00fd2436, 0x00af2d00, -+ 0x00a37f36, 0x00f17600, 0x00076d5a, 0x0055646c, -+ 0x00eb5aee, 0x00b953d8, 0x004f4882, 0x001d41b4, -+ 0x00c87900, 0x009a7036, 0x006c6b6c, 0x003e625a, -+ 0x00805cd8, 0x00d255ee, 0x00244eb4, 0x00764782, -+ 0x0075735a, 0x00277a6c, 0x00d16136, 0x00836800, -+ 0x003d5682, 0x006f5fb4, 0x009944ee, 0x00cb4dd8, -+ 0x001e756c, 0x004c7c5a, 0x00ba6700, 0x00e86e36, -+ 0x005650b4, 0x00045982, 0x00f242d8, 0x00a04bee, -+ 0x000f66ee, 0x005d6fd8, 0x00ab7482, 0x00f97db4, -+ 0x00474336, 0x00154a00, 0x00e3515a, 0x00b1586c, -+ 0x006460d8, 0x003669ee, 0x00c072b4, 0x00927b82, -+ 0x002c4500, 0x007e4c36, 0x0088576c, 0x00da5e5a, -+ 0x00d96a82, 0x008b63b4, 0x007d78ee, 0x002f71d8, -+ 0x00914f5a, 0x00c3466c, 0x00355d36, 0x00675400, -+ 0x00b26cb4, 0x00e06582, 0x00167ed8, 0x004477ee, -+ 0x00fa496c, 0x00a8405a, 0x005e5b00, 0x000c5236, -+ 0x0046ff6c, 0x0014f65a, 0x00e2ed00, 0x00b0e436, -+ 0x000edab4, 0x005cd382, 0x00aac8d8, 0x00f8c1ee, -+ 0x002df95a, 0x007ff06c, 0x0089eb36, 0x00dbe200, -+ 0x0065dc82, 0x0037d5b4, 0x00c1ceee, 0x0093c7d8, -+ 0x0090f300, 0x00c2fa36, 0x0034e16c, 0x0066e85a, -+ 0x00d8d6d8, 0x008adfee, 0x007cc4b4, 0x002ecd82, -+ 0x00fbf536, 0x00a9fc00, 0x005fe75a, 0x000dee6c, -+ 0x00b3d0ee, 0x00e1d9d8, 0x0017c282, 0x0045cbb4, -+ 0x00eae6b4, 0x00b8ef82, 0x004ef4d8, 0x001cfdee, -+ 0x00a2c36c, 0x00f0ca5a, 0x0006d100, 0x0054d836, -+ 0x0081e082, 0x00d3e9b4, 0x0025f2ee, 0x0077fbd8, -+ 0x00c9c55a, 0x009bcc6c, 0x006dd736, 0x003fde00, -+ 0x003cead8, 0x006ee3ee, 0x0098f8b4, 0x00caf182, -+ 0x0074cf00, 0x0026c636, 0x00d0dd6c, 0x0082d45a, -+ 0x0057ecee, 0x0005e5d8, 0x00f3fe82, 0x00a1f7b4, -+ 0x001fc936, 0x004dc000, 0x00bbdb5a, 0x00e9d26c, -+ 0x00e5805a, 0x00b7896c, 0x00419236, 0x00139b00, -+ 0x00ada582, 0x00ffacb4, 0x0009b7ee, 0x005bbed8, -+ 0x008e866c, 0x00dc8f5a, 0x002a9400, 0x00789d36, -+ 0x00c6a3b4, 0x0094aa82, 0x0062b1d8, 0x0030b8ee, -+ 0x00338c36, 0x00618500, 0x00979e5a, 0x00c5976c, -+ 0x007ba9ee, 0x0029a0d8, 0x00dfbb82, 0x008db2b4, -+ 0x00588a00, 0x000a8336, 0x00fc986c, 0x00ae915a, -+ 0x0010afd8, 0x0042a6ee, 0x00b4bdb4, 0x00e6b482, -+ 0x00499982, 0x001b90b4, 0x00ed8bee, 0x00bf82d8, -+ 0x0001bc5a, 0x0053b56c, 0x00a5ae36, 0x00f7a700, -+ 0x00229fb4, 0x00709682, 0x00868dd8, 0x00d484ee, -+ 0x006aba6c, 0x0038b35a, 0x00cea800, 0x009ca136, -+ 0x009f95ee, 0x00cd9cd8, 0x003b8782, 0x00698eb4, -+ 0x00d7b036, 0x0085b900, 0x0073a25a, 0x0021ab6c, -+ 0x00f493d8, 0x00a69aee, 0x005081b4, 0x00028882, -+ 0x00bcb600, 0x00eebf36, 0x0018a46c, 0x004aad5a -+}; -+ -+static inline -+u32 crc24_init (void) -+{ -+ return 0xce04b7; -+} -+ -+static inline -+u32 crc24_next (u32 crc, byte data) -+{ -+ return (crc >> 8) ^ crc24_table[(crc & 0xff) ^ data]; -+} -+ -+/* -+ * Process 4 bytes in one go - */ -+static inline -+u32 crc24_next4 (u32 crc, u32 data) -+{ -+ crc ^= data; -+ crc = crc24_table[(crc & 0xff) + 0x300] ^ -+ crc24_table[((crc >> 8) & 0xff) + 0x200] ^ -+ crc24_table[((crc >> 16) & 0xff) + 0x100] ^ -+ crc24_table[(crc >> 24) & 0xff]; -+ return crc; -+} - --#define CRC24_INIT 0xb704ceL --#define CRC24_POLY 0x1864cfbL -+static inline -+u32 crc24_final (u32 crc) -+{ -+ return crc & 0xffffff; -+} - - static void - crc24rfc2440_init (void *context) - { - CRC_CONTEXT *ctx = (CRC_CONTEXT *) context; -- ctx->CRC = CRC24_INIT; -+ ctx->CRC = crc24_init(); - } - - static void - crc24rfc2440_write (void *context, const void *inbuf_arg, size_t inlen) - { - const unsigned char *inbuf = inbuf_arg; -- int i; - CRC_CONTEXT *ctx = (CRC_CONTEXT *) context; -+ u32 crc; - -- if (!inbuf) -+ if (!inbuf || !inlen) - return; - -- while (inlen--) { -- ctx->CRC ^= (*inbuf++) << 16; -- for (i = 0; i < 8; i++) { -- ctx->CRC <<= 1; -- if (ctx->CRC & 0x1000000) -- ctx->CRC ^= CRC24_POLY; -+ crc = ctx->CRC; -+ -+ while (inlen >= 16) -+ { -+ inlen -= 16; -+ crc = crc24_next4(crc, buf_get_le32(&inbuf[0])); -+ crc = crc24_next4(crc, buf_get_le32(&inbuf[4])); -+ crc = crc24_next4(crc, buf_get_le32(&inbuf[8])); -+ crc = crc24_next4(crc, buf_get_le32(&inbuf[12])); -+ inbuf += 16; - } -- } -+ -+ while (inlen >= 4) -+ { -+ inlen -= 4; -+ crc = crc24_next4(crc, buf_get_le32(inbuf)); -+ inbuf += 4; -+ } -+ -+ while (inlen--) -+ { -+ crc = crc24_next(crc, *inbuf++); -+ } -+ -+ ctx->CRC = crc; - } - - static void - crc24rfc2440_final (void *context) - { - CRC_CONTEXT *ctx = (CRC_CONTEXT *) context; -- ctx->buf[0] = (ctx->CRC >> 16) & 0xFF; -- ctx->buf[1] = (ctx->CRC >> 8) & 0xFF; -- ctx->buf[2] = (ctx->CRC ) & 0xFF; -+ ctx->CRC = crc24_final(ctx->CRC); -+ buf_put_le32 (ctx->buf, ctx->CRC); - } - - gcry_md_spec_t _gcry_digest_spec_crc32 = -diff --git a/grub-core/loader/arm/linux.c b/grub-core/loader/arm/linux.c -index 5b39f02bb2e592d85639891db6eb68a97ce12dfa..b4f609d2d01184b8d0a3e5aff448725f80a36a93 100644 ---- a/grub-core/loader/arm/linux.c -+++ b/grub-core/loader/arm/linux.c -@@ -42,21 +42,18 @@ static grub_size_t linux_size; - static char *linux_args; - - static grub_uint32_t machine_type; --static void *fdt_addr; -+static const void *current_fdt; - - typedef void (*kernel_entry_t) (int, unsigned long, void *); - --#define LINUX_ZIMAGE_OFFSET 0x24 --#define LINUX_ZIMAGE_MAGIC 0x016f2818 -- - #define LINUX_PHYS_OFFSET (0x00008000) - #define LINUX_INITRD_PHYS_OFFSET (LINUX_PHYS_OFFSET + 0x02000000) - #define LINUX_FDT_PHYS_OFFSET (LINUX_INITRD_PHYS_OFFSET - 0x10000) - - static grub_size_t --get_atag_size (grub_uint32_t *atag) -+get_atag_size (const grub_uint32_t *atag) - { -- grub_uint32_t *atag0 = atag; -+ const grub_uint32_t *atag0 = atag; - while (atag[0] && atag[1]) - atag += atag[0]; - return atag - atag0; -@@ -68,10 +65,11 @@ get_atag_size (grub_uint32_t *atag) - * Merges in command line parameters and sets up initrd addresses. - */ - static grub_err_t --linux_prepare_atag (void) -+linux_prepare_atag (void *target_atag) - { -- grub_uint32_t *atag_orig = (grub_uint32_t *) fdt_addr; -- grub_uint32_t *tmp_atag, *from, *to; -+ const grub_uint32_t *atag_orig = (const grub_uint32_t *) current_fdt; -+ grub_uint32_t *tmp_atag, *to; -+ const grub_uint32_t *from; - grub_size_t tmp_size; - grub_size_t arg_size = grub_strlen (linux_args); - char *cmdline_orig = NULL; -@@ -142,7 +140,7 @@ linux_prepare_atag (void) - to += 2; - - /* Copy updated FDT to its launch location */ -- grub_memcpy (atag_orig, tmp_atag, sizeof (grub_uint32_t) * (to - tmp_atag)); -+ grub_memcpy (target_atag, tmp_atag, sizeof (grub_uint32_t) * (to - tmp_atag)); - grub_free (tmp_atag); - - grub_dprintf ("loader", "ATAG updated for Linux boot\n"); -@@ -156,19 +154,19 @@ linux_prepare_atag (void) - * Merges in command line parameters and sets up initrd addresses. - */ - static grub_err_t --linux_prepare_fdt (void) -+linux_prepare_fdt (void *target_fdt) - { - int node; - int retval; - int tmp_size; - void *tmp_fdt; - -- tmp_size = grub_fdt_get_totalsize (fdt_addr) + 0x100 + grub_strlen (linux_args); -+ tmp_size = grub_fdt_get_totalsize (current_fdt) + 0x100 + grub_strlen (linux_args); - tmp_fdt = grub_malloc (tmp_size); - if (!tmp_fdt) - return grub_errno; - -- grub_memcpy (tmp_fdt, fdt_addr, grub_fdt_get_totalsize (fdt_addr)); -+ grub_memcpy (tmp_fdt, current_fdt, grub_fdt_get_totalsize (current_fdt)); - grub_fdt_set_totalsize (tmp_fdt, tmp_size); - - /* Find or create '/chosen' node */ -@@ -209,7 +207,7 @@ linux_prepare_fdt (void) - } - - /* Copy updated FDT to its launch location */ -- grub_memcpy (fdt_addr, tmp_fdt, tmp_size); -+ grub_memcpy (target_fdt, tmp_fdt, tmp_size); - grub_free (tmp_fdt); - - grub_dprintf ("loader", "FDT updated for Linux boot\n"); -@@ -226,16 +224,17 @@ linux_boot (void) - { - kernel_entry_t linuxmain; - int fdt_valid, atag_valid; -+ void *target_fdt = 0; - -- fdt_valid = (fdt_addr && grub_fdt_check_header_nosize (fdt_addr) == 0); -- atag_valid = ((((grub_uint16_t *) fdt_addr)[3] & ~3) == 0x5440 -- && *((grub_uint32_t *) fdt_addr)); -+ fdt_valid = (current_fdt && grub_fdt_check_header_nosize (current_fdt) == 0); -+ atag_valid = ((((const grub_uint16_t *) current_fdt)[3] & ~3) == 0x5440 -+ && *((const grub_uint32_t *) current_fdt)); - grub_dprintf ("loader", "atag: %p, %x, %x, %s, %s\n", -- fdt_addr, -- ((grub_uint16_t *) fdt_addr)[3], -- *((grub_uint32_t *) fdt_addr), -- (char *) fdt_addr, -- (char *) fdt_addr + 1); -+ current_fdt, -+ ((const grub_uint16_t *) current_fdt)[3], -+ *((const grub_uint32_t *) current_fdt), -+ (const char *) current_fdt, -+ (const char *) current_fdt + 1); - - if (!fdt_valid && machine_type == GRUB_ARM_MACHINE_TYPE_FDT) - return grub_error (GRUB_ERR_FILE_NOT_FOUND, -@@ -245,23 +244,40 @@ linux_boot (void) - - grub_dprintf ("loader", "Kernel at: 0x%x\n", linux_addr); - -+ if (fdt_valid || atag_valid) -+ { -+#ifdef GRUB_MACHINE_EFI -+ grub_size_t size; -+ if (fdt_valid) -+ size = grub_fdt_get_totalsize (current_fdt); -+ else -+ size = 4 * get_atag_size (current_fdt); -+ size += grub_strlen (linux_args) + 256; -+ target_fdt = grub_efi_allocate_loader_memory (LINUX_FDT_PHYS_OFFSET, size); -+ if (!target_fdt) -+ return grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory")); -+#else -+ target_fdt = (void *) LINUX_FDT_ADDRESS; -+#endif -+ } -+ - if (fdt_valid) - { - grub_err_t err; - -- err = linux_prepare_fdt (); -+ err = linux_prepare_fdt (target_fdt); - if (err) - return err; -- grub_dprintf ("loader", "FDT @ 0x%p\n", fdt_addr); -+ grub_dprintf ("loader", "FDT @ %p\n", target_fdt); - } - else if (atag_valid) - { - grub_err_t err; - -- err = linux_prepare_atag (); -+ err = linux_prepare_atag (target_fdt); - if (err) - return err; -- grub_dprintf ("loader", "ATAG @ 0x%p\n", fdt_addr); -+ grub_dprintf ("loader", "ATAG @ %p\n", target_fdt); - } - - grub_dprintf ("loader", "Jumping to Linux...\n"); -@@ -274,18 +290,9 @@ linux_boot (void) - */ - linuxmain = (kernel_entry_t) linux_addr; - --#ifdef GRUB_MACHINE_EFI -- { -- grub_err_t err; -- err = grub_efi_prepare_platform(); -- if (err != GRUB_ERR_NONE) -- return err; -- } --#endif -- - grub_arm_disable_caches_mmu (); - -- linuxmain (0, machine_type, fdt_addr); -+ linuxmain (0, machine_type, target_fdt); - - return grub_error (GRUB_ERR_BAD_OS, "Linux call returned"); - } -@@ -296,17 +303,12 @@ linux_boot (void) - static grub_err_t - linux_load (const char *filename, grub_file_t file) - { -+ struct linux_arm_kernel_header *lh; - int size; - - size = grub_file_size (file); - --#ifdef GRUB_MACHINE_EFI -- linux_addr = (grub_addr_t) grub_efi_allocate_loader_memory (LINUX_PHYS_OFFSET, size); -- if (!linux_addr) -- return grub_errno; --#else - linux_addr = LINUX_ADDRESS; --#endif - grub_dprintf ("loader", "Loading Linux to 0x%08x\n", - (grub_addr_t) linux_addr); - -@@ -318,9 +320,10 @@ linux_load (const char *filename, grub_file_t file) - return grub_errno; - } - -- if (size > LINUX_ZIMAGE_OFFSET + 4 -- && *(grub_uint32_t *) (linux_addr + LINUX_ZIMAGE_OFFSET) -- == LINUX_ZIMAGE_MAGIC) -+ lh = (void *) linux_addr; -+ -+ if ((grub_size_t) size > sizeof (*lh) && -+ lh->magic == GRUB_LINUX_ARM_MAGIC_SIGNATURE) - ; - else if (size > 0x8000 && *(grub_uint32_t *) (linux_addr) == 0xea000006 - && machine_type == GRUB_ARM_MACHINE_TYPE_RASPBERRY_PI) -@@ -410,20 +413,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), - - size = grub_get_initrd_size (&initrd_ctx); - --#ifdef GRUB_MACHINE_EFI -- if (initrd_start) -- grub_efi_free_pages (initrd_start, -- (initrd_end - initrd_start + 0xfff) >> 12); -- initrd_start = (grub_addr_t) grub_efi_allocate_loader_memory (LINUX_INITRD_PHYS_OFFSET, size); -- -- if (!initrd_start) -- { -- grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory")); -- goto fail; -- } --#else - initrd_start = LINUX_INITRD_ADDRESS; --#endif - - grub_dprintf ("loader", "Loading initrd to 0x%08x\n", - (grub_addr_t) initrd_start); -@@ -444,11 +434,26 @@ fail: - static grub_err_t - load_dtb (grub_file_t dtb, int size) - { -- if ((grub_file_read (dtb, fdt_addr, size) != size) -- || (grub_fdt_check_header (fdt_addr, size) != 0)) -- return grub_error (GRUB_ERR_BAD_OS, N_("invalid device tree")); -+ void *new_fdt = grub_zalloc (size); -+ if (!new_fdt) -+ return grub_errno; -+ grub_dprintf ("loader", "Loading device tree to %p\n", -+ new_fdt); -+ if ((grub_file_read (dtb, new_fdt, size) != size) -+ || (grub_fdt_check_header (new_fdt, size) != 0)) -+ { -+ grub_free (new_fdt); -+ return grub_error (GRUB_ERR_BAD_OS, N_("invalid device tree")); -+ } -+ -+ grub_fdt_set_totalsize (new_fdt, size); -+ current_fdt = new_fdt; -+ /* -+ * We've successfully loaded an FDT, so any machine type passed -+ * from firmware is now obsolete. -+ */ -+ machine_type = GRUB_ARM_MACHINE_TYPE_FDT; - -- grub_fdt_set_totalsize (fdt_addr, size); - return GRUB_ERR_NONE; - } - -@@ -464,42 +469,13 @@ grub_cmd_devicetree (grub_command_t cmd __attribute__ ((unused)), - - dtb = grub_file_open (argv[0]); - if (!dtb) -- goto out; -+ return grub_errno; - - size = grub_file_size (dtb); - if (size == 0) -- { -- grub_error (GRUB_ERR_BAD_OS, "empty file"); -- goto out; -- } -- --#ifdef GRUB_MACHINE_EFI -- fdt_addr = grub_efi_allocate_loader_memory (LINUX_FDT_PHYS_OFFSET, size); -- if (!fdt_addr) -- { -- grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory")); -- goto out; -- } --#else -- fdt_addr = (void *) LINUX_FDT_ADDRESS; --#endif -- -- grub_dprintf ("loader", "Loading device tree to 0x%08x\n", -- (grub_addr_t) fdt_addr); -- load_dtb (dtb, size); -- if (grub_errno != GRUB_ERR_NONE) -- { -- fdt_addr = NULL; -- goto out; -- } -- -- /* -- * We've successfully loaded an FDT, so any machine type passed -- * from firmware is now obsolete. -- */ -- machine_type = GRUB_ARM_MACHINE_TYPE_FDT; -- -- out: -+ grub_error (GRUB_ERR_BAD_OS, "empty file"); -+ else -+ load_dtb (dtb, size); - grub_file_close (dtb); - - return grub_errno; -@@ -517,7 +493,7 @@ GRUB_MOD_INIT (linux) - /* TRANSLATORS: DTB stands for device tree blob. */ - 0, N_("Load DTB file.")); - my_mod = mod; -- fdt_addr = (void *) grub_arm_firmware_get_boot_data (); -+ current_fdt = (const void *) grub_arm_firmware_get_boot_data (); - machine_type = grub_arm_firmware_get_machine_type (); - } - -diff --git a/grub-core/loader/arm64/linux.c b/grub-core/loader/arm64/linux.c -index 9519d2e4d3ec1229a76eb4bce773c78c7af24a6e..1f86229f86b01e4700bb13c9f936490ea9ac859f 100644 ---- a/grub-core/loader/arm64/linux.c -+++ b/grub-core/loader/arm64/linux.c -@@ -26,8 +26,9 @@ - #include - #include - #include --#include - #include -+#include -+#include - #include - #include - #include -@@ -47,18 +48,16 @@ static grub_addr_t initrd_start; - static grub_addr_t initrd_end; - - grub_err_t --grub_arm64_uefi_check_image (struct grub_arm64_linux_kernel_header * lh) -+grub_armxx_efi_linux_check_image (struct linux_armxx_kernel_header * lh) - { -- if (lh->magic != GRUB_ARM64_LINUX_MAGIC) -+ if (lh->magic != GRUB_LINUX_ARMXX_MAGIC_SIGNATURE) - return grub_error(GRUB_ERR_BAD_OS, "invalid magic number"); - -- if ((lh->code0 & 0xffff) != GRUB_EFI_PE_MAGIC) -+ if ((lh->code0 & 0xffff) != GRUB_PE32_MAGIC) - return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, - N_("plain image kernel not supported - rebuild with CONFIG_(U)EFI_STUB enabled")); - - grub_dprintf ("linux", "UEFI stub kernel:\n"); -- grub_dprintf ("linux", "text_offset = 0x%012llx\n", -- (long long unsigned) lh->text_offset); - grub_dprintf ("linux", "PE/COFF header @ %08x\n", lh->hdr_offset); - - return GRUB_ERR_NONE; -@@ -86,8 +85,8 @@ finalize_params_linux (void) - /* Set initrd info */ - if (initrd_start && initrd_end > initrd_start) - { -- grub_dprintf ("linux", "Initrd @ 0x%012lx-0x%012lx\n", -- initrd_start, initrd_end); -+ grub_dprintf ("linux", "Initrd @ %p-%p\n", -+ (void *) initrd_start, (void *) initrd_end); - - retval = grub_fdt_set_prop64 (fdt, node, "linux,initrd-start", - initrd_start); -@@ -110,7 +109,7 @@ failure: - } - - grub_err_t --grub_arm64_uefi_boot_image (grub_addr_t addr, grub_size_t size, char *args) -+grub_armxx_efi_linux_boot_image (grub_addr_t addr, grub_size_t size, char *args) - { - grub_efi_memory_mapped_device_path_t *mempath; - grub_efi_handle_t image_handle; -@@ -148,8 +147,7 @@ grub_arm64_uefi_boot_image (grub_addr_t addr, grub_size_t size, char *args) - loaded_image->load_options_size = len = - (grub_strlen (args) + 1) * sizeof (grub_efi_char16_t); - loaded_image->load_options = -- grub_efi_allocate_pages (0, -- GRUB_EFI_BYTES_TO_PAGES (loaded_image->load_options_size)); -+ grub_efi_allocate_any_pages (GRUB_EFI_BYTES_TO_PAGES (loaded_image->load_options_size)); - if (!loaded_image->load_options) - return grub_errno; - -@@ -162,7 +160,7 @@ grub_arm64_uefi_boot_image (grub_addr_t addr, grub_size_t size, char *args) - - /* When successful, not reached */ - b->unload_image (image_handle); -- grub_efi_free_pages ((grub_efi_physical_address_t) loaded_image->load_options, -+ grub_efi_free_pages ((grub_addr_t) loaded_image->load_options, - GRUB_EFI_BYTES_TO_PAGES (loaded_image->load_options_size)); - - return grub_errno; -@@ -174,8 +172,8 @@ grub_linux_boot (void) - if (finalize_params_linux () != GRUB_ERR_NONE) - return grub_errno; - -- return (grub_arm64_uefi_boot_image((grub_addr_t)kernel_addr, -- kernel_size, linux_args)); -+ return (grub_armxx_efi_linux_boot_image((grub_addr_t)kernel_addr, -+ kernel_size, linux_args)); - } - - static grub_err_t -@@ -189,12 +187,48 @@ grub_linux_unload (void) - initrd_start = initrd_end = 0; - grub_free (linux_args); - if (kernel_addr) -- grub_efi_free_pages ((grub_efi_physical_address_t) kernel_addr, -+ grub_efi_free_pages ((grub_addr_t) kernel_addr, - GRUB_EFI_BYTES_TO_PAGES (kernel_size)); - grub_fdt_unload (); - return GRUB_ERR_NONE; - } - -+/* -+ * As per linux/Documentation/arm/Booting -+ * ARM initrd needs to be covered by kernel linear mapping, -+ * so place it in the first 512MB of DRAM. -+ * -+ * As per linux/Documentation/arm64/booting.txt -+ * ARM64 initrd needs to be contained entirely within a 1GB aligned window -+ * of up to 32GB of size that covers the kernel image as well. -+ * Since the EFI stub loader will attempt to load the kernel near start of -+ * RAM, place the buffer in the first 32GB of RAM. -+ */ -+#ifdef __arm__ -+#define INITRD_MAX_ADDRESS_OFFSET (512U * 1024 * 1024) -+#else /* __aarch64__ */ -+#define INITRD_MAX_ADDRESS_OFFSET (32ULL * 1024 * 1024 * 1024) -+#endif -+ -+/* -+ * This function returns a pointer to a legally allocated initrd buffer, -+ * or NULL if unsuccessful -+ */ -+static void * -+allocate_initrd_mem (int initrd_pages) -+{ -+ grub_addr_t max_addr; -+ -+ if (grub_efi_get_ram_base (&max_addr) != GRUB_ERR_NONE) -+ return NULL; -+ -+ max_addr += INITRD_MAX_ADDRESS_OFFSET - 1; -+ -+ return grub_efi_allocate_pages_real (max_addr, initrd_pages, -+ GRUB_EFI_ALLOCATE_MAX_ADDRESS, -+ GRUB_EFI_LOADER_DATA); -+} -+ - static grub_err_t - grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), - int argc, char *argv[]) -@@ -223,7 +257,8 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), - grub_dprintf ("linux", "Loading initrd\n"); - - initrd_pages = (GRUB_EFI_BYTES_TO_PAGES (initrd_size)); -- initrd_mem = grub_efi_allocate_pages (0, initrd_pages); -+ initrd_mem = allocate_initrd_mem (initrd_pages); -+ - if (!initrd_mem) - { - grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory")); -@@ -241,8 +276,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), - fail: - grub_initrd_close (&initrd_ctx); - if (initrd_mem && !initrd_start) -- grub_efi_free_pages ((grub_efi_physical_address_t) initrd_mem, -- initrd_pages); -+ grub_efi_free_pages ((grub_addr_t) initrd_mem, initrd_pages); - - return grub_errno; - } -@@ -252,7 +286,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), - int argc, char *argv[]) - { - grub_file_t file = 0; -- struct grub_arm64_linux_kernel_header lh; -+ struct linux_armxx_kernel_header lh; - - grub_dl_ref (my_mod); - -@@ -271,13 +305,13 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), - if (grub_file_read (file, &lh, sizeof (lh)) < (long) sizeof (lh)) - return grub_errno; - -- if (grub_arm64_uefi_check_image (&lh) != GRUB_ERR_NONE) -+ if (grub_armxx_efi_linux_check_image (&lh) != GRUB_ERR_NONE) - goto fail; - - grub_loader_unset(); - - grub_dprintf ("linux", "kernel file size: %lld\n", (long long) kernel_size); -- kernel_addr = grub_efi_allocate_pages (0, GRUB_EFI_BYTES_TO_PAGES (kernel_size)); -+ kernel_addr = grub_efi_allocate_any_pages (GRUB_EFI_BYTES_TO_PAGES (kernel_size)); - grub_dprintf ("linux", "kernel numpages: %lld\n", - (long long) GRUB_EFI_BYTES_TO_PAGES (kernel_size)); - if (!kernel_addr) -@@ -329,7 +363,7 @@ fail: - grub_free (linux_args); - - if (kernel_addr && !loaded) -- grub_efi_free_pages ((grub_efi_physical_address_t) kernel_addr, -+ grub_efi_free_pages ((grub_addr_t) kernel_addr, - GRUB_EFI_BYTES_TO_PAGES (kernel_size)); - - return grub_errno; -diff --git a/grub-core/loader/arm64/xen_boot.c b/grub-core/loader/arm64/xen_boot.c -index a914eb8e2df24ebaab41a2eb0ed205bcebafcf5d..1003a0b9997a46ea7e5106da02ef77e9be3a21fc 100644 ---- a/grub-core/loader/arm64/xen_boot.c -+++ b/grub-core/loader/arm64/xen_boot.c -@@ -27,9 +27,10 @@ - #include - #include - #include --#include - #include - #include -+#include -+#include - #include /* required by struct xen_hypervisor_header */ - #include - #include -@@ -66,7 +67,7 @@ typedef enum module_type module_type_t; - - struct xen_hypervisor_header - { -- struct grub_arm64_linux_kernel_header efi_head; -+ struct linux_arm64_kernel_header efi_head; - - /* This is always PE\0\0. */ - grub_uint8_t signature[GRUB_PE32_SIGNATURE_SIZE]; -@@ -115,6 +116,17 @@ prepare_xen_hypervisor_params (void *xen_boot_fdt) - if (chosen_node < 1) - return grub_error (GRUB_ERR_IO, "failed to get chosen node in FDT"); - -+ /* -+ * The address and size are always written using 64-bits value. Set -+ * #address-cells and #size-cells accordingly. -+ */ -+ retval = grub_fdt_set_prop32 (xen_boot_fdt, chosen_node, "#address-cells", 2); -+ if (retval) -+ return grub_error (GRUB_ERR_IO, "failed to set #address-cells"); -+ retval = grub_fdt_set_prop32 (xen_boot_fdt, chosen_node, "#size-cells", 2); -+ if (retval) -+ return grub_error (GRUB_ERR_IO, "failed to set #size-cells"); -+ - grub_dprintf ("xen_loader", - "Xen Hypervisor cmdline : %s @ %p size:%d\n", - xen_hypervisor->cmdline, xen_hypervisor->cmdline, -@@ -156,7 +168,7 @@ prepare_xen_module_params (struct xen_boot_binary *module, void *xen_boot_fdt) - grub_fdt_add_subnode (xen_boot_fdt, chosen_node, module_name); - - retval = grub_fdt_set_prop (xen_boot_fdt, module_node, "compatible", -- MODULE_CUSTOM_COMPATIBLE, sizeof(MODULE_CUSTOM_COMPATIBLE) - 1); -+ MODULE_CUSTOM_COMPATIBLE, sizeof(MODULE_CUSTOM_COMPATIBLE)); - if (retval) - return grub_error (GRUB_ERR_IO, "failed to update FDT"); - -@@ -253,9 +265,9 @@ xen_boot (void) - if (err) - return err; - -- return grub_arm64_uefi_boot_image (xen_hypervisor->start, -- xen_hypervisor->size, -- xen_hypervisor->cmdline); -+ return grub_armxx_efi_linux_boot_image (xen_hypervisor->start, -+ xen_hypervisor->size, -+ xen_hypervisor->cmdline); - } - - static void -@@ -324,10 +336,9 @@ xen_boot_binary_load (struct xen_boot_binary *binary, grub_file_t file, - grub_dprintf ("xen_loader", "Xen_boot file size: 0x%lx\n", binary->size); - - binary->start -- = (grub_addr_t) grub_efi_allocate_pages (0, -- GRUB_EFI_BYTES_TO_PAGES -- (binary->size + -- binary->align)); -+ = (grub_addr_t) grub_efi_allocate_any_pages (GRUB_EFI_BYTES_TO_PAGES -+ (binary->size + -+ binary->align)); - if (!binary->start) - { - grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory")); -@@ -379,6 +390,20 @@ grub_cmd_xen_module (grub_command_t cmd __attribute__((unused)), - - struct xen_boot_binary *module = NULL; - grub_file_t file = 0; -+ int nounzip = 0; -+ -+ if (!argc) -+ { -+ grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); -+ goto fail; -+ } -+ -+ if (grub_strcmp (argv[0], "--nounzip") == 0) -+ { -+ argv++; -+ argc--; -+ nounzip = 1; -+ } - - if (!argc) - { -@@ -403,6 +428,8 @@ grub_cmd_xen_module (grub_command_t cmd __attribute__((unused)), - - grub_dprintf ("xen_loader", "Init module and node info\n"); - -+ if (nounzip) -+ grub_file_filter_disable_compression (); - file = grub_file_open (argv[0]); - if (!file) - goto fail; -@@ -441,8 +468,8 @@ grub_cmd_xen_hypervisor (grub_command_t cmd __attribute__ ((unused)), - - if (grub_file_read (file, &sh, sizeof (sh)) != (long) sizeof (sh)) - goto fail; -- if (grub_arm64_uefi_check_image -- ((struct grub_arm64_linux_kernel_header *) &sh) != GRUB_ERR_NONE) -+ if (grub_armxx_efi_linux_check_image -+ ((struct linux_armxx_kernel_header *) &sh) != GRUB_ERR_NONE) - goto fail; - grub_file_seek (file, 0); - -diff --git a/grub-core/loader/arm64/fdt.c b/grub-core/loader/efi/fdt.c -similarity index 79% -rename from grub-core/loader/arm64/fdt.c -rename to grub-core/loader/efi/fdt.c -index db49cf64991764686c3f643e5289abbd4874a559..a4c6e8036454c1a53deefad791133488281462ea 100644 ---- a/grub-core/loader/arm64/fdt.c -+++ b/grub-core/loader/efi/fdt.c -@@ -18,26 +18,33 @@ - - #include - #include --#include - #include - #include - #include - #include - #include -+#include -+#include - - static void *loaded_fdt; - static void *fdt; - -+#define FDT_ADDR_CELLS_STRING "#address-cells" -+#define FDT_SIZE_CELLS_STRING "#size-cells" -+#define FDT_ADDR_SIZE_EXTRA ((2 * grub_fdt_prop_entry_size (sizeof(grub_uint32_t))) + \ -+ sizeof (FDT_ADDR_CELLS_STRING) + \ -+ sizeof (FDT_SIZE_CELLS_STRING)) -+ - void * - grub_fdt_load (grub_size_t additional_size) - { - void *raw_fdt; -- grub_size_t size; -+ unsigned int size; - - if (fdt) - { - size = GRUB_EFI_BYTES_TO_PAGES (grub_fdt_get_totalsize (fdt)); -- grub_efi_free_pages ((grub_efi_physical_address_t) fdt, size); -+ grub_efi_free_pages ((grub_addr_t) fdt, size); - } - - if (loaded_fdt) -@@ -45,12 +52,15 @@ grub_fdt_load (grub_size_t additional_size) - else - raw_fdt = grub_efi_get_firmware_fdt(); - -- size = -- raw_fdt ? grub_fdt_get_totalsize (raw_fdt) : GRUB_FDT_EMPTY_TREE_SZ; -+ if (raw_fdt) -+ size = grub_fdt_get_totalsize (raw_fdt); -+ else -+ size = GRUB_FDT_EMPTY_TREE_SZ + FDT_ADDR_SIZE_EXTRA; -+ - size += additional_size; - -- grub_dprintf ("linux", "allocating %ld bytes for fdt\n", size); -- fdt = grub_efi_allocate_pages (0, GRUB_EFI_BYTES_TO_PAGES (size)); -+ grub_dprintf ("linux", "allocating %d bytes for fdt\n", size); -+ fdt = grub_efi_allocate_any_pages (GRUB_EFI_BYTES_TO_PAGES (size)); - if (!fdt) - return NULL; - -@@ -62,6 +72,8 @@ grub_fdt_load (grub_size_t additional_size) - else - { - grub_fdt_create_empty_tree (fdt, size); -+ grub_fdt_set_prop32 (fdt, 0, FDT_ADDR_CELLS_STRING, 2); -+ grub_fdt_set_prop32 (fdt, 0, FDT_SIZE_CELLS_STRING, 2); - } - return fdt; - } -@@ -88,7 +100,7 @@ grub_fdt_unload (void) { - if (!fdt) { - return; - } -- grub_efi_free_pages ((grub_efi_physical_address_t) fdt, -+ grub_efi_free_pages ((grub_addr_t) fdt, - GRUB_EFI_BYTES_TO_PAGES (grub_fdt_get_totalsize (fdt))); - fdt = NULL; - } -diff --git a/grub-core/loader/i386/linux.c b/grub-core/loader/i386/linux.c -index 083f9417cb65e509e673dba09a71616c5661ab05..9b53d3168f9bb78eab7a124518e83915183912b9 100644 ---- a/grub-core/loader/i386/linux.c -+++ b/grub-core/loader/i386/linux.c -@@ -306,6 +306,12 @@ grub_linux_setup_video (struct linux_kernel_params *params) - params->lfb_line_len = mode_info.pitch; - - params->lfb_base = (grub_size_t) framebuffer; -+ -+#if defined (GRUB_MACHINE_EFI) && defined (__x86_64__) -+ params->ext_lfb_base = (grub_size_t) (((grub_uint64_t)(grub_size_t) framebuffer) >> 32); -+ params->capabilities |= VIDEO_CAPABILITY_64BIT_BASE; -+#endif -+ - params->lfb_size = ALIGN_UP (params->lfb_line_len * params->lfb_height, 65536); - - params->red_mask_size = mode_info.red_mask_size; -@@ -678,7 +684,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), - int argc, char *argv[]) - { - grub_file_t file = 0; -- struct linux_kernel_header lh; -+ struct linux_i386_kernel_header lh; - grub_uint8_t setup_sects; - grub_size_t real_size, prot_size, prot_file_size; - grub_ssize_t len; -@@ -721,7 +727,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), - - /* FIXME: 2.03 is not always good enough (Linux 2.4 can be 2.03 and - still not support 32-bit boot. */ -- if (lh.header != grub_cpu_to_le32_compile_time (GRUB_LINUX_MAGIC_SIGNATURE) -+ if (lh.header != grub_cpu_to_le32_compile_time (GRUB_LINUX_I386_MAGIC_SIGNATURE) - || grub_le_to_cpu16 (lh.version) < 0x0203) - { - grub_error (GRUB_ERR_BAD_OS, "version too old for 32-bit boot" -diff --git a/grub-core/loader/i386/multiboot_mbi.c b/grub-core/loader/i386/multiboot_mbi.c -index fd7b41b0cad4f26d1170d70692ac1ac27fd6bd73..dc98dbcae258b340e155c64f1f73213ac724806a 100644 ---- a/grub-core/loader/i386/multiboot_mbi.c -+++ b/grub-core/loader/i386/multiboot_mbi.c -@@ -239,7 +239,7 @@ grub_multiboot_get_mbi_size (void) - ret = sizeof (struct multiboot_info) + ALIGN_UP (cmdline_size, 4) - + modcnt * sizeof (struct multiboot_mod_list) + total_modcmd - + ALIGN_UP (sizeof(PACKAGE_STRING), 4) -- + grub_get_multiboot_mmap_count () * sizeof (struct multiboot_mmap_entry) -+ + grub_multiboot_get_mmap_count () * sizeof (struct multiboot_mmap_entry) - + elf_sec_entsize * elf_sec_num - + 256 * sizeof (struct multiboot_color) - #if GRUB_MACHINE_HAS_VBE || GRUB_MACHINE_HAS_VGA_TEXT -@@ -542,7 +542,7 @@ grub_multiboot_make_mbi (grub_uint32_t *target) - mbi->mods_count = 0; - } - -- mmap_size = grub_get_multiboot_mmap_count () -+ mmap_size = grub_multiboot_get_mmap_count () - * sizeof (struct multiboot_mmap_entry); - grub_fill_multiboot_mmap ((struct multiboot_mmap_entry *) ptrorig); - mbi->mmap_length = mmap_size; -diff --git a/grub-core/loader/i386/pc/chainloader.c b/grub-core/loader/i386/pc/chainloader.c -index c79c4fe0fc99a876b3e92f0a24f16cd636e00a0d..ef3a322b78cf10a406c0420780f821e2e1d1b284 100644 ---- a/grub-core/loader/i386/pc/chainloader.c -+++ b/grub-core/loader/i386/pc/chainloader.c -@@ -19,6 +19,7 @@ - - #include - #include -+#include - #include - #include - #include -@@ -86,9 +87,16 @@ grub_chainloader_unload (void) - void - grub_chainloader_patch_bpb (void *bs, grub_device_t dev, grub_uint8_t dl) - { -- grub_uint32_t part_start = 0; -+ grub_uint32_t part_start = 0, heads = 0, sectors = 0; - if (dev && dev->disk) -- part_start = grub_partition_get_start (dev->disk->partition); -+ { -+ part_start = grub_partition_get_start (dev->disk->partition); -+ if (dev->disk->data) -+ { -+ heads = ((struct grub_biosdisk_data *)(dev->disk->data))->heads; -+ sectors = ((struct grub_biosdisk_data *)(dev->disk->data))->sectors; -+ } -+ } - if (grub_memcmp ((char *) &((struct grub_ntfs_bpb *) bs)->oem_name, - "NTFS", 4) == 0) - { -@@ -117,7 +125,7 @@ grub_chainloader_patch_bpb (void *bs, grub_device_t dev, grub_uint8_t dl) - - if (bpb->num_reserved_sectors == 0) - break; -- if (bpb->num_total_sectors_16 == 0 || bpb->num_total_sectors_32 == 0) -+ if (bpb->num_total_sectors_16 == 0 && bpb->num_total_sectors_32 == 0) - break; - - if (bpb->num_fats == 0) -@@ -127,12 +135,20 @@ grub_chainloader_patch_bpb (void *bs, grub_device_t dev, grub_uint8_t dl) - { - bpb->num_hidden_sectors = grub_cpu_to_le32 (part_start); - bpb->version_specific.fat12_or_fat16.num_ph_drive = dl; -+ if (sectors) -+ bpb->sectors_per_track = grub_cpu_to_le16 (sectors); -+ if (heads) -+ bpb->num_heads = grub_cpu_to_le16 (heads); - return; - } - if (bpb->version_specific.fat32.sectors_per_fat_32) - { - bpb->num_hidden_sectors = grub_cpu_to_le32 (part_start); - bpb->version_specific.fat32.num_ph_drive = dl; -+ if (sectors) -+ bpb->sectors_per_track = grub_cpu_to_le16 (sectors); -+ if (heads) -+ bpb->num_heads = grub_cpu_to_le16 (heads); - return; - } - break; -diff --git a/grub-core/loader/i386/pc/linux.c b/grub-core/loader/i386/pc/linux.c -index a293b17aa101b308635bbed4086ae1547b91b884..b69cb7a3a7f8a9ca96a91a78c47fa1515e628699 100644 ---- a/grub-core/loader/i386/pc/linux.c -+++ b/grub-core/loader/i386/pc/linux.c -@@ -121,7 +121,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), - int argc, char *argv[]) - { - grub_file_t file = 0; -- struct linux_kernel_header lh; -+ struct linux_i386_kernel_header lh; - grub_uint8_t setup_sects; - grub_size_t real_size; - grub_ssize_t len; -@@ -169,7 +169,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), - - maximal_cmdline_size = 256; - -- if (lh.header == grub_cpu_to_le32_compile_time (GRUB_LINUX_MAGIC_SIGNATURE) -+ if (lh.header == grub_cpu_to_le32_compile_time (GRUB_LINUX_I386_MAGIC_SIGNATURE) - && grub_le_to_cpu16 (lh.version) >= 0x0200) - { - grub_linux_is_bzimage = (lh.loadflags & GRUB_LINUX_FLAG_BIG_KERNEL); -@@ -322,7 +322,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), - goto fail; - } - -- if (lh.header != grub_cpu_to_le32_compile_time (GRUB_LINUX_MAGIC_SIGNATURE) -+ if (lh.header != grub_cpu_to_le32_compile_time (GRUB_LINUX_I386_MAGIC_SIGNATURE) - || grub_le_to_cpu16 (lh.version) < 0x0200) - /* Clear the heap space. */ - grub_memset (grub_linux_real_chunk -@@ -387,7 +387,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), - { - grub_size_t size = 0; - grub_addr_t addr_max, addr_min; -- struct linux_kernel_header *lh; -+ struct linux_i386_kernel_header *lh; - grub_uint8_t *initrd_chunk; - grub_addr_t initrd_addr; - grub_err_t err; -@@ -405,9 +405,9 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), - goto fail; - } - -- lh = (struct linux_kernel_header *) grub_linux_real_chunk; -+ lh = (struct linux_i386_kernel_header *) grub_linux_real_chunk; - -- if (!(lh->header == grub_cpu_to_le32_compile_time (GRUB_LINUX_MAGIC_SIGNATURE) -+ if (!(lh->header == grub_cpu_to_le32_compile_time (GRUB_LINUX_I386_MAGIC_SIGNATURE) - && grub_le_to_cpu16 (lh->version) >= 0x0200)) - { - grub_error (GRUB_ERR_BAD_OS, "the kernel is too old for initrd"); -diff --git a/grub-core/loader/i386/xen_file.c b/grub-core/loader/i386/xen_file.c -index 99fad4cadae42ab09497babca15cd9606557fcd2..77a93e7b228316e1df731e01e51e67f9225b4482 100644 ---- a/grub-core/loader/i386/xen_file.c -+++ b/grub-core/loader/i386/xen_file.c -@@ -26,7 +26,7 @@ grub_elf_t - grub_xen_file (grub_file_t file) - { - grub_elf_t elf; -- struct linux_kernel_header lh; -+ struct linux_i386_kernel_header lh; - grub_file_t off_file; - grub_uint32_t payload_offset, payload_length; - grub_uint8_t magic[6]; -@@ -43,7 +43,7 @@ grub_xen_file (grub_file_t file) - goto fail; - - if (lh.boot_flag != grub_cpu_to_le16_compile_time (0xaa55) -- || lh.header != grub_cpu_to_le32_compile_time (GRUB_LINUX_MAGIC_SIGNATURE) -+ || lh.header != grub_cpu_to_le32_compile_time (GRUB_LINUX_I386_MAGIC_SIGNATURE) - || grub_le_to_cpu16 (lh.version) < 0x0208) - { - grub_error (GRUB_ERR_BAD_OS, "version too old for xen boot"); -diff --git a/grub-core/loader/ia64/efi/linux.c b/grub-core/loader/ia64/efi/linux.c -index efaa42ccdd2bf74321de20cf5033a80676cc7dc3..750330d4572d0dcd09d02b4b75c1f03045fa897b 100644 ---- a/grub-core/loader/ia64/efi/linux.c -+++ b/grub-core/loader/ia64/efi/linux.c -@@ -252,7 +252,7 @@ allocate_pages (grub_uint64_t align, grub_uint64_t size_pages, - aligned_start += align; - if (aligned_start + size > end) - continue; -- mem = grub_efi_allocate_pages (aligned_start, size_pages); -+ mem = grub_efi_allocate_fixed (aligned_start, size_pages); - if (! mem) - { - grub_error (GRUB_ERR_OUT_OF_MEMORY, "cannot allocate memory"); -@@ -326,7 +326,7 @@ grub_linux_boot (void) - mmap_size = find_mmap_size (); - if (! mmap_size) - return grub_errno; -- mmap_buf = grub_efi_allocate_pages (0, page_align (mmap_size) >> 12); -+ mmap_buf = grub_efi_allocate_any_pages (page_align (mmap_size) >> 12); - if (! mmap_buf) - return grub_error (GRUB_ERR_IO, "cannot allocate memory map"); - err = grub_efi_finish_boot_services (&mmap_size, mmap_buf, &map_key, -@@ -422,7 +422,7 @@ grub_load_elf64 (grub_file_t file, void *buffer, const char *filename) - relocate = grub_env_get ("linux_relocate"); - if (!relocate || grub_strcmp (relocate, "force") != 0) - { -- kernel_mem = grub_efi_allocate_pages (low_addr, kernel_pages); -+ kernel_mem = grub_efi_allocate_fixed (low_addr, kernel_pages); - reloc_offset = 0; - } - /* Try to relocate. */ -@@ -524,7 +524,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)), - len += grub_strlen (argv[i]) + 1; - len += sizeof (struct ia64_boot_param) + 512; /* Room for extensions. */ - boot_param_pages = page_align (len) >> 12; -- boot_param = grub_efi_allocate_pages (0, boot_param_pages); -+ boot_param = grub_efi_allocate_any_pages (boot_param_pages); - if (boot_param == 0) - { - grub_error (GRUB_ERR_OUT_OF_MEMORY, -@@ -589,7 +589,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), - grub_dprintf ("linux", "Loading initrd\n"); - - initrd_pages = (page_align (initrd_size) >> 12); -- initrd_mem = grub_efi_allocate_pages (0, initrd_pages); -+ initrd_mem = grub_efi_allocate_any_pages (initrd_pages); - if (! initrd_mem) - { - grub_error (GRUB_ERR_OUT_OF_MEMORY, "cannot allocate pages"); -diff --git a/grub-core/loader/multiboot.c b/grub-core/loader/multiboot.c -index bd9d5b3e698588db594a2c334d715e0e883bab92..40c67e82489ec3ecf891ae564cde810bf280b242 100644 ---- a/grub-core/loader/multiboot.c -+++ b/grub-core/loader/multiboot.c -@@ -28,7 +28,15 @@ - - #include - #include -+#ifdef GRUB_USE_MULTIBOOT2 -+#include -+#define GRUB_MULTIBOOT_CONSOLE_FRAMEBUFFER GRUB_MULTIBOOT2_CONSOLE_FRAMEBUFFER -+#define GRUB_MULTIBOOT_CONSOLE_EGA_TEXT GRUB_MULTIBOOT2_CONSOLE_EGA_TEXT -+#define GRUB_MULTIBOOT(x) grub_multiboot2_ ## x -+#else - #include -+#define GRUB_MULTIBOOT(x) grub_multiboot_ ## x -+#endif - #include - #include - #include -@@ -49,8 +57,8 @@ GRUB_MOD_LICENSE ("GPLv3+"); - #include - #endif - --struct grub_relocator *grub_multiboot_relocator = NULL; --grub_uint32_t grub_multiboot_payload_eip; -+struct grub_relocator *GRUB_MULTIBOOT (relocator) = NULL; -+grub_uint32_t GRUB_MULTIBOOT (payload_eip); - #if defined (GRUB_MACHINE_PCBIOS) || defined (GRUB_MACHINE_MULTIBOOT) || defined (GRUB_MACHINE_COREBOOT) || defined (GRUB_MACHINE_QEMU) - #define DEFAULT_VIDEO_MODE "text" - #else -@@ -78,7 +86,7 @@ count_hook (grub_uint64_t addr __attribute__ ((unused)), - /* Return the length of the Multiboot mmap that will be needed to allocate - our platform's map. */ - grub_uint32_t --grub_get_multiboot_mmap_count (void) -+GRUB_MULTIBOOT (get_mmap_count) (void) - { - grub_size_t count = 0; - -@@ -88,7 +96,7 @@ grub_get_multiboot_mmap_count (void) - } - - grub_err_t --grub_multiboot_set_video_mode (void) -+GRUB_MULTIBOOT (set_video_mode) (void) - { - grub_err_t err; - const char *modevar; -@@ -130,9 +138,12 @@ static void - efi_boot (struct grub_relocator *rel, - grub_uint32_t target) - { -+#ifdef GRUB_USE_MULTIBOOT2 -+ struct grub_relocator_efi_state state_efi = MULTIBOOT2_EFI_INITIAL_STATE; -+#else - struct grub_relocator_efi_state state_efi = MULTIBOOT_EFI_INITIAL_STATE; -- -- state_efi.MULTIBOOT_EFI_ENTRY_REGISTER = grub_multiboot_payload_eip; -+#endif -+ state_efi.MULTIBOOT_EFI_ENTRY_REGISTER = GRUB_MULTIBOOT (payload_eip); - state_efi.MULTIBOOT_EFI_MBI_REGISTER = target; - - grub_relocator_efi_boot (rel, state_efi); -@@ -164,19 +175,23 @@ static grub_err_t - grub_multiboot_boot (void) - { - grub_err_t err; -+ -+#ifdef GRUB_USE_MULTIBOOT2 -+ struct grub_relocator32_state state = MULTIBOOT2_INITIAL_STATE; -+#else - struct grub_relocator32_state state = MULTIBOOT_INITIAL_STATE; -+#endif -+ state.MULTIBOOT_ENTRY_REGISTER = GRUB_MULTIBOOT (payload_eip); - -- state.MULTIBOOT_ENTRY_REGISTER = grub_multiboot_payload_eip; -- -- err = grub_multiboot_make_mbi (&state.MULTIBOOT_MBI_REGISTER); -+ err = GRUB_MULTIBOOT (make_mbi) (&state.MULTIBOOT_MBI_REGISTER); - - if (err) - return err; - - if (grub_efi_is_finished) -- normal_boot (grub_multiboot_relocator, state); -+ normal_boot (GRUB_MULTIBOOT (relocator), state); - else -- efi_boot (grub_multiboot_relocator, state.MULTIBOOT_MBI_REGISTER); -+ efi_boot (GRUB_MULTIBOOT (relocator), state.MULTIBOOT_MBI_REGISTER); - - /* Not reached. */ - return GRUB_ERR_NONE; -@@ -185,10 +200,10 @@ grub_multiboot_boot (void) - static grub_err_t - grub_multiboot_unload (void) - { -- grub_multiboot_free_mbi (); -+ GRUB_MULTIBOOT (free_mbi) (); - -- grub_relocator_unload (grub_multiboot_relocator); -- grub_multiboot_relocator = NULL; -+ grub_relocator_unload (GRUB_MULTIBOOT (relocator)); -+ GRUB_MULTIBOOT (relocator) = NULL; - - grub_dl_unref (my_mod); - -@@ -207,7 +222,7 @@ static grub_uint64_t highest_load; - - /* Load ELF32 or ELF64. */ - grub_err_t --grub_multiboot_load_elf (mbi_load_data_t *mld) -+GRUB_MULTIBOOT (load_elf) (mbi_load_data_t *mld) - { - if (grub_multiboot_is_elf32 (mld->buffer)) - return grub_multiboot_load_elf32 (mld); -@@ -218,9 +233,9 @@ grub_multiboot_load_elf (mbi_load_data_t *mld) - } - - grub_err_t --grub_multiboot_set_console (int console_type, int accepted_consoles, -- int width, int height, int depth, -- int console_req) -+GRUB_MULTIBOOT (set_console) (int console_type, int accepted_consoles, -+ int width, int height, int depth, -+ int console_req) - { - console_required = console_req; - if (!(accepted_consoles -@@ -313,19 +328,19 @@ grub_cmd_multiboot (grub_command_t cmd __attribute__ ((unused)), - grub_dl_ref (my_mod); - - /* Skip filename. */ -- grub_multiboot_init_mbi (argc - 1, argv + 1); -+ GRUB_MULTIBOOT (init_mbi) (argc - 1, argv + 1); - -- grub_relocator_unload (grub_multiboot_relocator); -- grub_multiboot_relocator = grub_relocator_new (); -+ grub_relocator_unload (GRUB_MULTIBOOT (relocator)); -+ GRUB_MULTIBOOT (relocator) = grub_relocator_new (); - -- if (!grub_multiboot_relocator) -+ if (!GRUB_MULTIBOOT (relocator)) - goto fail; - -- err = grub_multiboot_load (file, argv[0]); -+ err = GRUB_MULTIBOOT (load) (file, argv[0]); - if (err) - goto fail; - -- grub_multiboot_set_bootdev (); -+ GRUB_MULTIBOOT (set_bootdev) (); - - grub_loader_set (grub_multiboot_boot, grub_multiboot_unload, 0); - -@@ -335,8 +350,8 @@ grub_cmd_multiboot (grub_command_t cmd __attribute__ ((unused)), - - if (grub_errno != GRUB_ERR_NONE) - { -- grub_relocator_unload (grub_multiboot_relocator); -- grub_multiboot_relocator = NULL; -+ grub_relocator_unload (GRUB_MULTIBOOT (relocator)); -+ GRUB_MULTIBOOT (relocator) = NULL; - grub_dl_unref (my_mod); - } - -@@ -368,7 +383,7 @@ grub_cmd_module (grub_command_t cmd __attribute__ ((unused)), - if (argc == 0) - return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); - -- if (!grub_multiboot_relocator) -+ if (!GRUB_MULTIBOOT (relocator)) - return grub_error (GRUB_ERR_BAD_ARGUMENT, - N_("you need to load the kernel first")); - -@@ -389,7 +404,7 @@ grub_cmd_module (grub_command_t cmd __attribute__ ((unused)), - if (size) - { - grub_relocator_chunk_t ch; -- err = grub_relocator_alloc_chunk_align (grub_multiboot_relocator, &ch, -+ err = grub_relocator_alloc_chunk_align (GRUB_MULTIBOOT (relocator), &ch, - lowest_addr, (0xffffffff - size) + 1, - size, MULTIBOOT_MOD_ALIGN, - GRUB_RELOCATOR_PREFERENCE_NONE, 1); -@@ -407,7 +422,7 @@ grub_cmd_module (grub_command_t cmd __attribute__ ((unused)), - target = 0; - } - -- err = grub_multiboot_add_module (target, size, argc - 1, argv + 1); -+ err = GRUB_MULTIBOOT (add_module) (target, size, argc - 1, argv + 1); - if (err) - { - grub_file_close (file); -diff --git a/grub-core/loader/multiboot_elfxx.c b/grub-core/loader/multiboot_elfxx.c -index 5e649ed2545bee3fbe9602c9d97079160dc6420a..70cd1db513e679f0e02e06dc2de24747a62b88ba 100644 ---- a/grub-core/loader/multiboot_elfxx.c -+++ b/grub-core/loader/multiboot_elfxx.c -@@ -57,9 +57,9 @@ CONCAT(grub_multiboot_load_elf, XX) (mbi_load_data_t *mld) - char *phdr_base; - grub_err_t err; - grub_relocator_chunk_t ch; -- grub_uint32_t load_offset, load_size; -+ grub_uint32_t load_offset = 0, load_size; - int i; -- void *source; -+ void *source = NULL; - - if (ehdr->e_ident[EI_MAG0] != ELFMAG0 - || ehdr->e_ident[EI_MAG1] != ELFMAG1 -@@ -97,38 +97,38 @@ CONCAT(grub_multiboot_load_elf, XX) (mbi_load_data_t *mld) - return grub_error (GRUB_ERR_BAD_OS, "segment crosses 4 GiB border"); - #endif - -- load_size = highest_load - mld->link_base_addr; -- - if (mld->relocatable) - { -+ load_size = highest_load - mld->link_base_addr; -+ -+ grub_dprintf ("multiboot_loader", "align=0x%lx, preference=0x%x, " -+ "load_size=0x%x, avoid_efi_boot_services=%d\n", -+ (long) mld->align, mld->preference, load_size, -+ mld->avoid_efi_boot_services); -+ - if (load_size > mld->max_addr || mld->min_addr > mld->max_addr - load_size) - return grub_error (GRUB_ERR_BAD_OS, "invalid min/max address and/or load size"); - -- err = grub_relocator_alloc_chunk_align (grub_multiboot_relocator, &ch, -+ err = grub_relocator_alloc_chunk_align (GRUB_MULTIBOOT (relocator), &ch, - mld->min_addr, mld->max_addr - load_size, - load_size, mld->align ? mld->align : 1, - mld->preference, mld->avoid_efi_boot_services); -+ -+ if (err) -+ { -+ grub_dprintf ("multiboot_loader", "Cannot allocate memory for OS image\n"); -+ return err; -+ } -+ -+ mld->load_base_addr = get_physical_target_address (ch); -+ source = get_virtual_current_address (ch); - } - else -- err = grub_relocator_alloc_chunk_addr (grub_multiboot_relocator, &ch, -- mld->link_base_addr, load_size); -+ mld->load_base_addr = mld->link_base_addr; - -- if (err) -- { -- grub_dprintf ("multiboot_loader", "Cannot allocate memory for OS image\n"); -- return err; -- } -- -- mld->load_base_addr = get_physical_target_address (ch); -- source = get_virtual_current_address (ch); -- -- grub_dprintf ("multiboot_loader", "link_base_addr=0x%x, load_base_addr=0x%x, " -- "load_size=0x%x, relocatable=%d\n", mld->link_base_addr, -- mld->load_base_addr, load_size, mld->relocatable); -- -- if (mld->relocatable) -- grub_dprintf ("multiboot_loader", "align=0x%lx, preference=0x%x, avoid_efi_boot_services=%d\n", -- (long) mld->align, mld->preference, mld->avoid_efi_boot_services); -+ grub_dprintf ("multiboot_loader", "relocatable=%d, link_base_addr=0x%x, " -+ "load_base_addr=0x%x\n", mld->relocatable, -+ mld->link_base_addr, mld->load_base_addr); - - /* Load every loadable segment in memory. */ - for (i = 0; i < ehdr->e_phnum; i++) -@@ -139,7 +139,24 @@ CONCAT(grub_multiboot_load_elf, XX) (mbi_load_data_t *mld) - grub_dprintf ("multiboot_loader", "segment %d: paddr=0x%lx, memsz=0x%lx, vaddr=0x%lx\n", - i, (long) phdr(i)->p_paddr, (long) phdr(i)->p_memsz, (long) phdr(i)->p_vaddr); - -- load_offset = phdr(i)->p_paddr - mld->link_base_addr; -+ if (mld->relocatable) -+ { -+ load_offset = phdr(i)->p_paddr - mld->link_base_addr; -+ grub_dprintf ("multiboot_loader", "segment %d: load_offset=0x%x\n", i, load_offset); -+ } -+ else -+ { -+ err = grub_relocator_alloc_chunk_addr (GRUB_MULTIBOOT (relocator), &ch, -+ phdr(i)->p_paddr, phdr(i)->p_memsz); -+ -+ if (err) -+ { -+ grub_dprintf ("multiboot_loader", "Cannot allocate memory for OS image\n"); -+ return err; -+ } -+ -+ source = get_virtual_current_address (ch); -+ } - - if (phdr(i)->p_filesz != 0) - { -@@ -167,7 +184,7 @@ CONCAT(grub_multiboot_load_elf, XX) (mbi_load_data_t *mld) - if (phdr(i)->p_vaddr <= ehdr->e_entry - && phdr(i)->p_vaddr + phdr(i)->p_memsz > ehdr->e_entry) - { -- grub_multiboot_payload_eip = (ehdr->e_entry - phdr(i)->p_vaddr) -+ GRUB_MULTIBOOT (payload_eip) = (ehdr->e_entry - phdr(i)->p_vaddr) - + phdr(i)->p_paddr; - #ifdef MULTIBOOT_LOAD_ELF64 - # ifdef __mips -@@ -191,7 +208,7 @@ CONCAT(grub_multiboot_load_elf, XX) (mbi_load_data_t *mld) - #if defined (__i386__) || defined (__x86_64__) - - #elif defined (__mips) -- grub_multiboot_payload_eip |= 0x80000000; -+ GRUB_MULTIBOOT (payload_eip) |= 0x80000000; - #else - #error Please complete this - #endif -@@ -238,7 +255,7 @@ CONCAT(grub_multiboot_load_elf, XX) (mbi_load_data_t *mld) - if (sh->sh_size == 0) - continue; - -- err = grub_relocator_alloc_chunk_align (grub_multiboot_relocator, &ch, 0, -+ err = grub_relocator_alloc_chunk_align (GRUB_MULTIBOOT (relocator), &ch, 0, - (0xffffffff - sh->sh_size) + 1, - sh->sh_size, sh->sh_addralign, - GRUB_RELOCATOR_PREFERENCE_NONE, -@@ -264,8 +281,8 @@ CONCAT(grub_multiboot_load_elf, XX) (mbi_load_data_t *mld) - } - sh->sh_addr = target; - } -- grub_multiboot_add_elfsyms (ehdr->e_shnum, ehdr->e_shentsize, -- ehdr->e_shstrndx, shdr); -+ GRUB_MULTIBOOT (add_elfsyms) (ehdr->e_shnum, ehdr->e_shentsize, -+ ehdr->e_shstrndx, shdr); - } - - #undef phdr -diff --git a/grub-core/loader/multiboot_mbi2.c b/grub-core/loader/multiboot_mbi2.c -index b0679a9f6c9848d81cb74cf799ad3a7b235d937c..4df6595954d889028e4525bb66b42cf391f4c9ce 100644 ---- a/grub-core/loader/multiboot_mbi2.c -+++ b/grub-core/loader/multiboot_mbi2.c -@@ -22,7 +22,7 @@ - #include - #include - #endif --#include -+#include - #include - #include - #include -@@ -71,7 +71,7 @@ static int keep_bs = 0; - static grub_uint32_t load_base_addr; - - void --grub_multiboot_add_elfsyms (grub_size_t num, grub_size_t entsize, -+grub_multiboot2_add_elfsyms (grub_size_t num, grub_size_t entsize, - unsigned shndx, void *data) - { - elf_sec_num = num; -@@ -90,17 +90,17 @@ find_header (grub_properly_aligned_t *buffer, grub_ssize_t len) - ((char *) header <= (char *) buffer + len - 12); - header = (struct multiboot_header *) ((grub_uint32_t *) header + MULTIBOOT_HEADER_ALIGN / 4)) - { -- if (header->magic == MULTIBOOT_HEADER_MAGIC -+ if (header->magic == MULTIBOOT2_HEADER_MAGIC - && !(header->magic + header->architecture - + header->header_length + header->checksum) -- && header->architecture == MULTIBOOT_ARCHITECTURE_CURRENT) -+ && header->architecture == MULTIBOOT2_ARCHITECTURE_CURRENT) - return header; - } - return NULL; - } - - grub_err_t --grub_multiboot_load (grub_file_t file, const char *filename) -+grub_multiboot2_load (grub_file_t file, const char *filename) - { - grub_ssize_t len; - struct multiboot_header *header; -@@ -112,7 +112,7 @@ grub_multiboot_load (grub_file_t file, const char *filename) - grub_addr_t entry = 0, efi_entry = 0; - grub_uint32_t console_required = 0; - struct multiboot_header_tag_framebuffer *fbtag = NULL; -- int accepted_consoles = GRUB_MULTIBOOT_CONSOLE_EGA_TEXT; -+ int accepted_consoles = GRUB_MULTIBOOT2_CONSOLE_EGA_TEXT; - mbi_load_data_t mld; - - mld.mbi_ver = 2; -@@ -210,7 +210,7 @@ grub_multiboot_load (grub_file_t file, const char *filename) - case MULTIBOOT_HEADER_TAG_CONSOLE_FLAGS: - if (!(((struct multiboot_header_tag_console_flags *) tag)->console_flags - & MULTIBOOT_CONSOLE_FLAGS_EGA_TEXT_SUPPORTED)) -- accepted_consoles &= ~GRUB_MULTIBOOT_CONSOLE_EGA_TEXT; -+ accepted_consoles &= ~GRUB_MULTIBOOT2_CONSOLE_EGA_TEXT; - if (((struct multiboot_header_tag_console_flags *) tag)->console_flags - & MULTIBOOT_CONSOLE_FLAGS_CONSOLE_REQUIRED) - console_required = 1; -@@ -218,7 +218,7 @@ grub_multiboot_load (grub_file_t file, const char *filename) - - case MULTIBOOT_HEADER_TAG_FRAMEBUFFER: - fbtag = (struct multiboot_header_tag_framebuffer *) tag; -- accepted_consoles |= GRUB_MULTIBOOT_CONSOLE_FRAMEBUFFER; -+ accepted_consoles |= GRUB_MULTIBOOT2_CONSOLE_FRAMEBUFFER; - break; - - case MULTIBOOT_HEADER_TAG_RELOCATABLE: -@@ -295,13 +295,13 @@ grub_multiboot_load (grub_file_t file, const char *filename) - return grub_error (GRUB_ERR_BAD_OS, "invalid min/max address and/or load size"); - } - -- err = grub_relocator_alloc_chunk_align (grub_multiboot_relocator, &ch, -+ err = grub_relocator_alloc_chunk_align (grub_multiboot2_relocator, &ch, - mld.min_addr, mld.max_addr - code_size, - code_size, mld.align ? mld.align : 1, - mld.preference, keep_bs); - } - else -- err = grub_relocator_alloc_chunk_addr (grub_multiboot_relocator, -+ err = grub_relocator_alloc_chunk_addr (grub_multiboot2_relocator, - &ch, load_addr, code_size); - if (err) - { -@@ -343,7 +343,7 @@ grub_multiboot_load (grub_file_t file, const char *filename) - mld.file = file; - mld.filename = filename; - mld.avoid_efi_boot_services = keep_bs; -- err = grub_multiboot_load_elf (&mld); -+ err = grub_multiboot2_load_elf (&mld); - if (err) - { - grub_free (mld.buffer); -@@ -354,9 +354,9 @@ grub_multiboot_load (grub_file_t file, const char *filename) - load_base_addr = mld.load_base_addr; - - if (keep_bs && efi_entry_specified) -- grub_multiboot_payload_eip = efi_entry; -+ grub_multiboot2_payload_eip = efi_entry; - else if (entry_specified) -- grub_multiboot_payload_eip = entry; -+ grub_multiboot2_payload_eip = entry; - - if (mld.relocatable) - { -@@ -370,20 +370,20 @@ grub_multiboot_load (grub_file_t file, const char *filename) - * 64-bit int here. - */ - if (mld.load_base_addr >= mld.link_base_addr) -- grub_multiboot_payload_eip += mld.load_base_addr - mld.link_base_addr; -+ grub_multiboot2_payload_eip += mld.load_base_addr - mld.link_base_addr; - else -- grub_multiboot_payload_eip -= mld.link_base_addr - mld.load_base_addr; -+ grub_multiboot2_payload_eip -= mld.link_base_addr - mld.load_base_addr; - } - - if (fbtag) -- err = grub_multiboot_set_console (GRUB_MULTIBOOT_CONSOLE_FRAMEBUFFER, -- accepted_consoles, -- fbtag->width, fbtag->height, -- fbtag->depth, console_required); -+ err = grub_multiboot2_set_console (GRUB_MULTIBOOT2_CONSOLE_FRAMEBUFFER, -+ accepted_consoles, -+ fbtag->width, fbtag->height, -+ fbtag->depth, console_required); - else -- err = grub_multiboot_set_console (GRUB_MULTIBOOT_CONSOLE_EGA_TEXT, -- accepted_consoles, -- 0, 0, 0, console_required); -+ err = grub_multiboot2_set_console (GRUB_MULTIBOOT2_CONSOLE_EGA_TEXT, -+ accepted_consoles, -+ 0, 0, 0, console_required); - return err; - } - -@@ -459,7 +459,7 @@ net_size (void) - } - - static grub_size_t --grub_multiboot_get_mbi_size (void) -+grub_multiboot2_get_mbi_size (void) - { - #ifdef GRUB_MACHINE_EFI - if (!keep_bs && !efi_mmap_size) -@@ -478,7 +478,7 @@ grub_multiboot_get_mbi_size (void) - + ALIGN_UP (sizeof (struct multiboot_tag_elf_sections), MULTIBOOT_TAG_ALIGN) - + ALIGN_UP (elf_sec_entsize * elf_sec_num, MULTIBOOT_TAG_ALIGN) - + ALIGN_UP ((sizeof (struct multiboot_tag_mmap) -- + grub_get_multiboot_mmap_count () -+ + grub_multiboot2_get_mmap_count () - * sizeof (struct multiboot_mmap_entry)), MULTIBOOT_TAG_ALIGN) - + ALIGN_UP (sizeof (struct multiboot_tag_framebuffer), MULTIBOOT_TAG_ALIGN) - + ALIGN_UP (sizeof (struct multiboot_tag_old_acpi) -@@ -522,7 +522,7 @@ grub_fill_multiboot_mmap (struct multiboot_tag_mmap *tag) - - tag->type = MULTIBOOT_TAG_TYPE_MMAP; - tag->size = sizeof (struct multiboot_tag_mmap) -- + sizeof (struct multiboot_mmap_entry) * grub_get_multiboot_mmap_count (); -+ + sizeof (struct multiboot_mmap_entry) * grub_multiboot2_get_mmap_count (); - tag->entry_size = sizeof (struct multiboot_mmap_entry); - tag->entry_version = 0; - -@@ -588,7 +588,7 @@ retrieve_video_parameters (grub_properly_aligned_t **ptrorig) - struct multiboot_tag_framebuffer *tag - = (struct multiboot_tag_framebuffer *) *ptrorig; - -- err = grub_multiboot_set_video_mode (); -+ err = grub_multiboot2_set_video_mode (); - if (err) - { - grub_print_error (); -@@ -731,7 +731,7 @@ retrieve_video_parameters (grub_properly_aligned_t **ptrorig) - } - - grub_err_t --grub_multiboot_make_mbi (grub_uint32_t *target) -+grub_multiboot2_make_mbi (grub_uint32_t *target) - { - grub_properly_aligned_t *ptrorig; - grub_properly_aligned_t *mbistart; -@@ -739,11 +739,11 @@ grub_multiboot_make_mbi (grub_uint32_t *target) - grub_size_t bufsize; - grub_relocator_chunk_t ch; - -- bufsize = grub_multiboot_get_mbi_size (); -+ bufsize = grub_multiboot2_get_mbi_size (); - - COMPILE_TIME_ASSERT (MULTIBOOT_TAG_ALIGN % sizeof (grub_properly_aligned_t) == 0); - -- err = grub_relocator_alloc_chunk_align (grub_multiboot_relocator, &ch, -+ err = grub_relocator_alloc_chunk_align (grub_multiboot2_relocator, &ch, - 0, 0xffffffff - bufsize, - bufsize, MULTIBOOT_TAG_ALIGN, - GRUB_RELOCATOR_PREFERENCE_NONE, 1); -@@ -1039,7 +1039,7 @@ grub_multiboot_make_mbi (grub_uint32_t *target) - } - - void --grub_multiboot_free_mbi (void) -+grub_multiboot2_free_mbi (void) - { - struct module *cur, *next; - -@@ -1061,11 +1061,11 @@ grub_multiboot_free_mbi (void) - } - - grub_err_t --grub_multiboot_init_mbi (int argc, char *argv[]) -+grub_multiboot2_init_mbi (int argc, char *argv[]) - { - grub_ssize_t len = 0; - -- grub_multiboot_free_mbi (); -+ grub_multiboot2_free_mbi (); - - len = grub_loader_cmdline_size (argc, argv); - -@@ -1081,7 +1081,7 @@ grub_multiboot_init_mbi (int argc, char *argv[]) - } - - grub_err_t --grub_multiboot_add_module (grub_addr_t start, grub_size_t size, -+grub_multiboot2_add_module (grub_addr_t start, grub_size_t size, - int argc, char *argv[]) - { - struct module *newmod; -@@ -1119,7 +1119,7 @@ grub_multiboot_add_module (grub_addr_t start, grub_size_t size, - } - - void --grub_multiboot_set_bootdev (void) -+grub_multiboot2_set_bootdev (void) - { - grub_device_t dev; - -diff --git a/grub-core/net/arp.c b/grub-core/net/arp.c -index 4b68c4151a11db214602f74e111e7552801d8450..54306e3b16d25fe5d3bdf9502683822237be488d 100644 ---- a/grub-core/net/arp.c -+++ b/grub-core/net/arp.c -@@ -111,8 +111,8 @@ grub_net_arp_send_request (struct grub_net_network_level_interface *inf, - } - - grub_err_t --grub_net_arp_receive (struct grub_net_buff *nb, -- struct grub_net_card *card) -+grub_net_arp_receive (struct grub_net_buff *nb, struct grub_net_card *card, -+ grub_uint16_t *vlantag) - { - struct arppkt *arp_packet = (struct arppkt *) nb->data; - grub_net_network_level_address_t sender_addr, target_addr; -@@ -138,6 +138,14 @@ grub_net_arp_receive (struct grub_net_buff *nb, - - FOR_NET_NETWORK_LEVEL_INTERFACES (inf) - { -+ /* Verify vlantag id */ -+ if (inf->card == card && inf->vlantag != *vlantag) -+ { -+ grub_dprintf ("net", "invalid vlantag! %x != %x\n", -+ inf->vlantag, *vlantag); -+ break; -+ } -+ - /* Am I the protocol address target? */ - if (grub_net_addr_cmp (&inf->address, &target_addr) == 0 - && arp_packet->op == grub_cpu_to_be16_compile_time (ARP_REQUEST)) -diff --git a/grub-core/net/drivers/ieee1275/ofnet.c b/grub-core/net/drivers/ieee1275/ofnet.c -index a78d164db1a0abbaf0417f70dc7180b9b2c4df76..002446be1c385934762824a965806ffb75f422a0 100644 ---- a/grub-core/net/drivers/ieee1275/ofnet.c -+++ b/grub-core/net/drivers/ieee1275/ofnet.c -@@ -153,11 +153,11 @@ grub_ieee1275_parse_bootpath (const char *devpath, char *bootpath, - char *comma_char = 0; - char *equal_char = 0; - grub_size_t field_counter = 0; -- - grub_net_network_level_address_t client_addr, gateway_addr, subnet_mask; - grub_net_link_level_address_t hw_addr; - grub_net_interface_flags_t flags = 0; - struct grub_net_network_level_interface *inter = NULL; -+ grub_uint16_t vlantag = 0; - - hw_addr.type = GRUB_NET_LINK_LEVEL_PROTOCOL_ETHERNET; - -@@ -175,6 +175,11 @@ grub_ieee1275_parse_bootpath (const char *devpath, char *bootpath, - *equal_char = 0; - grub_env_set_net_property ((*card)->name, args, equal_char + 1, - grub_strlen(equal_char + 1)); -+ -+ if ((grub_strcmp (args, "vtag") == 0) && -+ (grub_strlen (equal_char + 1) == 8)) -+ vlantag = grub_strtoul (equal_char + 1 + 4, 0, 16); -+ - *equal_char = '='; - } - else -@@ -213,8 +218,10 @@ grub_ieee1275_parse_bootpath (const char *devpath, char *bootpath, - hw_addr.mac, sizeof(hw_addr.mac), 0); - inter = grub_net_add_addr ((*card)->name, *card, &client_addr, &hw_addr, - flags); -+ inter->vlantag = vlantag; - grub_net_add_ipv4_local (inter, - __builtin_ctz (~grub_le_to_cpu32 (subnet_mask.ipv4))); -+ - } - - if (gateway_addr.ipv4 != 0) -diff --git a/grub-core/net/ethernet.c b/grub-core/net/ethernet.c -index c397b1b348ce559070cabe1e0b6e28e4dbf254d8..4d7ceed6f93c7e87019546b544a4365a504f5f9f 100644 ---- a/grub-core/net/ethernet.c -+++ b/grub-core/net/ethernet.c -@@ -18,6 +18,7 @@ - - #include - #include -+#include - #include - #include - #include -@@ -56,10 +57,17 @@ send_ethernet_packet (struct grub_net_network_level_interface *inf, - { - struct etherhdr *eth; - grub_err_t err; -+ grub_uint8_t etherhdr_size; -+ grub_uint16_t vlantag_id = VLANTAG_IDENTIFIER; - -- COMPILE_TIME_ASSERT (sizeof (*eth) < GRUB_NET_MAX_LINK_HEADER_SIZE); -+ etherhdr_size = sizeof (*eth); -+ COMPILE_TIME_ASSERT (sizeof (*eth) + 4 < GRUB_NET_MAX_LINK_HEADER_SIZE); - -- err = grub_netbuff_push (nb, sizeof (*eth)); -+ /* Increase ethernet header in case of vlantag */ -+ if (inf->vlantag != 0) -+ etherhdr_size += 4; -+ -+ err = grub_netbuff_push (nb, etherhdr_size); - if (err) - return err; - eth = (struct etherhdr *) nb->data; -@@ -76,6 +84,19 @@ send_ethernet_packet (struct grub_net_network_level_interface *inf, - return err; - inf->card->opened = 1; - } -+ -+ /* Check and add a vlan-tag if needed. */ -+ if (inf->vlantag != 0) -+ { -+ /* Move eth type to the right */ -+ grub_memcpy ((char *) nb->data + etherhdr_size - 2, -+ (char *) nb->data + etherhdr_size - 6, 2); -+ -+ /* Add the tag in the middle */ -+ grub_memcpy ((char *) nb->data + etherhdr_size - 6, &vlantag_id, 2); -+ grub_memcpy ((char *) nb->data + etherhdr_size - 4, (char *) &(inf->vlantag), 2); -+ } -+ - return inf->card->driver->send (inf->card, nb); - } - -@@ -90,10 +111,25 @@ grub_net_recv_ethernet_packet (struct grub_net_buff *nb, - grub_net_link_level_address_t hwaddress; - grub_net_link_level_address_t src_hwaddress; - grub_err_t err; -+ grub_uint8_t etherhdr_size = sizeof (*eth); -+ grub_uint16_t vlantag = 0; -+ -+ -+ /* Check if a vlan-tag is present. If so, the ethernet header is 4 bytes */ -+ /* longer than the original one. The vlantag id is extracted and the header */ -+ /* is reseted to the original size. */ -+ if (grub_get_unaligned16 (nb->data + etherhdr_size - 2) == VLANTAG_IDENTIFIER) -+ { -+ vlantag = grub_get_unaligned16 (nb->data + etherhdr_size); -+ etherhdr_size += 4; -+ /* Move eth type to the original position */ -+ grub_memcpy((char *) nb->data + etherhdr_size - 6, -+ (char *) nb->data + etherhdr_size - 2, 2); -+ } - - eth = (struct etherhdr *) nb->data; - type = grub_be_to_cpu16 (eth->type); -- err = grub_netbuff_pull (nb, sizeof (*eth)); -+ err = grub_netbuff_pull (nb, etherhdr_size); - if (err) - return err; - -@@ -121,13 +157,14 @@ grub_net_recv_ethernet_packet (struct grub_net_buff *nb, - { - /* ARP packet. */ - case GRUB_NET_ETHERTYPE_ARP: -- grub_net_arp_receive (nb, card); -+ grub_net_arp_receive (nb, card, &vlantag); - grub_netbuff_free (nb); - return GRUB_ERR_NONE; - /* IP packet. */ - case GRUB_NET_ETHERTYPE_IP: - case GRUB_NET_ETHERTYPE_IP6: -- return grub_net_recv_ip_packets (nb, card, &hwaddress, &src_hwaddress); -+ return grub_net_recv_ip_packets (nb, card, &hwaddress, &src_hwaddress, -+ &vlantag); - } - grub_netbuff_free (nb); - return GRUB_ERR_NONE; -diff --git a/grub-core/net/ip.c b/grub-core/net/ip.c -index aba4f89087bc14b1fe28a77794dd6792beb0bf36..7c95cc7464a09af4b223c94d6653a03f0dbee062 100644 ---- a/grub-core/net/ip.c -+++ b/grub-core/net/ip.c -@@ -228,12 +228,13 @@ handle_dgram (struct grub_net_buff *nb, - grub_net_ip_protocol_t proto, - const grub_net_network_level_address_t *source, - const grub_net_network_level_address_t *dest, -+ grub_uint16_t *vlantag, - grub_uint8_t ttl) - { - struct grub_net_network_level_interface *inf = NULL; - grub_err_t err; - int multicast = 0; -- -+ - /* DHCP needs special treatment since we don't know IP yet. */ - { - struct udphdr *udph; -@@ -293,6 +294,15 @@ handle_dgram (struct grub_net_buff *nb, - && grub_net_addr_cmp (&inf->address, dest) == 0 - && grub_net_hwaddr_cmp (&inf->hwaddress, hwaddress) == 0) - break; -+ -+ /* Verify vlantag id */ -+ if (inf->card == card && inf->vlantag != *vlantag) -+ { -+ grub_dprintf ("net", "invalid vlantag! %x != %x\n", -+ inf->vlantag, *vlantag); -+ break; -+ } -+ - /* Solicited node multicast. */ - if (inf->card == card - && inf->address.type == GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV6 -@@ -383,7 +393,8 @@ static grub_err_t - grub_net_recv_ip4_packets (struct grub_net_buff *nb, - struct grub_net_card *card, - const grub_net_link_level_address_t *hwaddress, -- const grub_net_link_level_address_t *src_hwaddress) -+ const grub_net_link_level_address_t *src_hwaddress, -+ grub_uint16_t *vlantag) - { - struct iphdr *iph = (struct iphdr *) nb->data; - grub_err_t err; -@@ -458,7 +469,7 @@ grub_net_recv_ip4_packets (struct grub_net_buff *nb, - dest.ipv4 = iph->dest; - - return handle_dgram (nb, card, src_hwaddress, hwaddress, iph->protocol, -- &source, &dest, iph->ttl); -+ &source, &dest, vlantag, iph->ttl); - } - - for (prev = &reassembles, rsm = *prev; rsm; prev = &rsm->next, rsm = *prev) -@@ -594,7 +605,7 @@ grub_net_recv_ip4_packets (struct grub_net_buff *nb, - dest.ipv4 = dst; - - return handle_dgram (ret, card, src_hwaddress, -- hwaddress, proto, &source, &dest, -+ hwaddress, proto, &source, &dest, vlantag, - ttl); - } - } -@@ -652,7 +663,8 @@ static grub_err_t - grub_net_recv_ip6_packets (struct grub_net_buff *nb, - struct grub_net_card *card, - const grub_net_link_level_address_t *hwaddress, -- const grub_net_link_level_address_t *src_hwaddress) -+ const grub_net_link_level_address_t *src_hwaddress, -+ grub_uint16_t *vlantag) - { - struct ip6hdr *iph = (struct ip6hdr *) nb->data; - grub_err_t err; -@@ -703,21 +715,24 @@ grub_net_recv_ip6_packets (struct grub_net_buff *nb, - grub_memcpy (dest.ipv6, &iph->dest, sizeof (dest.ipv6)); - - return handle_dgram (nb, card, src_hwaddress, hwaddress, iph->protocol, -- &source, &dest, iph->ttl); -+ &source, &dest, vlantag, iph->ttl); - } - - grub_err_t - grub_net_recv_ip_packets (struct grub_net_buff *nb, - struct grub_net_card *card, - const grub_net_link_level_address_t *hwaddress, -- const grub_net_link_level_address_t *src_hwaddress) -+ const grub_net_link_level_address_t *src_hwaddress, -+ grub_uint16_t *vlantag) - { - struct iphdr *iph = (struct iphdr *) nb->data; - - if ((iph->verhdrlen >> 4) == 4) -- return grub_net_recv_ip4_packets (nb, card, hwaddress, src_hwaddress); -+ return grub_net_recv_ip4_packets (nb, card, hwaddress, src_hwaddress, -+ vlantag); - if ((iph->verhdrlen >> 4) == 6) -- return grub_net_recv_ip6_packets (nb, card, hwaddress, src_hwaddress); -+ return grub_net_recv_ip6_packets (nb, card, hwaddress, src_hwaddress, -+ vlantag); - grub_dprintf ("net", "Bad IP version: %d\n", (iph->verhdrlen >> 4)); - grub_netbuff_free (nb); - return GRUB_ERR_NONE; -diff --git a/grub-core/normal/auth.c b/grub-core/normal/auth.c -index 7338f8245e3a9bbe47e821fb43c2b699b9527ffb..6be678c0de1ac236b60f765e767ae43d113b1117 100644 ---- a/grub-core/normal/auth.c -+++ b/grub-core/normal/auth.c -@@ -166,13 +166,13 @@ grub_username_get (char buf[], unsigned buf_size) - if (key == '\n' || key == '\r') - break; - -- if (key == '\e') -+ if (key == GRUB_TERM_ESC) - { - cur_len = 0; - break; - } - -- if (key == '\b') -+ if (key == GRUB_TERM_BACKSPACE) - { - if (cur_len) - { -@@ -197,7 +197,7 @@ grub_username_get (char buf[], unsigned buf_size) - grub_xputs ("\n"); - grub_refresh (); - -- return (key != '\e'); -+ return (key != GRUB_TERM_ESC); - } - - grub_err_t -diff --git a/grub-core/normal/cmdline.c b/grub-core/normal/cmdline.c -index a36180d75305f421e96903a46acb9dd99af06572..c037d5050ed2b34fa3b2ac0c7564e4208ca143c4 100644 ---- a/grub-core/normal/cmdline.c -+++ b/grub-core/normal/cmdline.c -@@ -626,12 +626,12 @@ grub_cmdline_get (const char *prompt_translated) - cl_insert (cl_terms, nterms, &lpos, &llen, &max_len, &buf, kill_buf); - break; - -- case '\e': -+ case GRUB_TERM_ESC: - grub_free (cl_terms); - grub_free (buf); - return 0; - -- case '\b': -+ case GRUB_TERM_BACKSPACE: - if (lpos > 0) - { - lpos--; -diff --git a/grub-core/normal/crypto.c b/grub-core/normal/crypto.c -index 2bfd67c8ef388097701a7415df3cd7321c6a1e57..e6d345f33458a167e703235d611afdd8c2a245b0 100644 ---- a/grub-core/normal/crypto.c -+++ b/grub-core/normal/crypto.c -@@ -147,8 +147,8 @@ read_crypto_list (const char *prefix) - if (! cur->modname) - { - grub_errno = GRUB_ERR_NONE; -- grub_free (cur); - grub_free (cur->name); -+ grub_free (cur); - continue; - } - cur->next = crypto_specs; -diff --git a/grub-core/normal/menu.c b/grub-core/normal/menu.c -index 719e2fb1c260b16d96cea2b787d7f7e592b428b7..e7a83c2d6e2aaa8248ed739b28f2c6be76622eb4 100644 ---- a/grub-core/normal/menu.c -+++ b/grub-core/normal/menu.c -@@ -763,7 +763,7 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot) - *auto_boot = 0; - return current_entry; - -- case '\e': -+ case GRUB_TERM_ESC: - if (nested) - { - menu_fini (); -diff --git a/grub-core/normal/menu_entry.c b/grub-core/normal/menu_entry.c -index eeeee5580abea9798278ef85cf417366cf4f0e0a..cdf3590a3646ce4be0caf99cafedcbc38cbe51e4 100644 ---- a/grub-core/normal/menu_entry.c -+++ b/grub-core/normal/menu_entry.c -@@ -1403,7 +1403,7 @@ grub_menu_entry_run (grub_menu_entry_t entry) - goto fail; - break; - -- case '\e': -+ case GRUB_TERM_ESC: - destroy_screen (screen); - return; - -diff --git a/grub-core/osdep/linux/ofpath.c b/grub-core/osdep/linux/ofpath.c -index a79682a5e31e1b4e77d9b99f55cc5a1fca9e159b..a6153d359546d237933cba0f300e7d59fdb1007b 100644 ---- a/grub-core/osdep/linux/ofpath.c -+++ b/grub-core/osdep/linux/ofpath.c -@@ -38,6 +38,46 @@ - #include - #include - -+#ifdef __sparc__ -+typedef enum -+ { -+ GRUB_OFPATH_SPARC_WWN_ADDR = 1, -+ GRUB_OFPATH_SPARC_TGT_LUN, -+ } ofpath_sparc_addressing; -+ -+struct ofpath_sparc_hba -+{ -+ grub_uint32_t device_id; -+ ofpath_sparc_addressing addressing; -+}; -+ -+static struct ofpath_sparc_hba sparc_lsi_hba[] = { -+ /* Rhea, Jasper 320, LSI53C1020/1030. */ -+ {0x30, GRUB_OFPATH_SPARC_TGT_LUN}, -+ /* SAS-1068E. */ -+ {0x50, GRUB_OFPATH_SPARC_TGT_LUN}, -+ /* SAS-1064E. */ -+ {0x56, GRUB_OFPATH_SPARC_TGT_LUN}, -+ /* Pandora SAS-1068E. */ -+ {0x58, GRUB_OFPATH_SPARC_TGT_LUN}, -+ /* Aspen, Invader, LSI SAS-3108. */ -+ {0x5d, GRUB_OFPATH_SPARC_TGT_LUN}, -+ /* Niwot, SAS 2108. */ -+ {0x79, GRUB_OFPATH_SPARC_TGT_LUN}, -+ /* Erie, Falcon, LSI SAS 2008. */ -+ {0x72, GRUB_OFPATH_SPARC_WWN_ADDR}, -+ /* LSI WarpDrive 6203. */ -+ {0x7e, GRUB_OFPATH_SPARC_WWN_ADDR}, -+ /* LSI SAS 2308. */ -+ {0x87, GRUB_OFPATH_SPARC_WWN_ADDR}, -+ /* LSI SAS 3008. */ -+ {0x97, GRUB_OFPATH_SPARC_WWN_ADDR}, -+ {0, 0} -+}; -+ -+static const int LSI_VENDOR_ID = 0x1000; -+#endif -+ - #ifdef OFPATH_STANDALONE - #define xmalloc malloc - void -@@ -120,6 +160,8 @@ find_obppath (const char *sysfs_path_orig) - #endif - - fd = open(path, O_RDONLY); -+ -+#ifndef __sparc__ - if (fd < 0 || fstat (fd, &st) < 0) - { - if (fd >= 0) -@@ -127,6 +169,7 @@ find_obppath (const char *sysfs_path_orig) - snprintf(path, path_size, "%s/devspec", sysfs_path); - fd = open(path, O_RDONLY); - } -+#endif - - if (fd < 0 || fstat (fd, &st) < 0) - { -@@ -307,6 +350,55 @@ of_path_of_ide(const char *sys_devname __attribute__((unused)), const char *devi - return ret; - } - -+#ifdef __sparc__ -+static char * -+of_path_of_nvme(const char *sys_devname __attribute__((unused)), -+ const char *device, -+ const char *devnode __attribute__((unused)), -+ const char *devicenode) -+{ -+ char *sysfs_path, *of_path, disk[MAX_DISK_CAT]; -+ const char *digit_string, *part_end; -+ -+ digit_string = trailing_digits (device); -+ part_end = devicenode + strlen (devicenode) - 1; -+ -+ if ((*digit_string != '\0') && (*part_end == 'p')) -+ { -+ /* We have a partition number, strip it off. */ -+ int part; -+ char *nvmedev, *end; -+ -+ nvmedev = strdup (devicenode); -+ -+ if (!nvmedev) -+ return NULL; -+ -+ end = nvmedev + strlen (nvmedev) - 1; -+ /* Remove the p. */ -+ *end = '\0'; -+ sscanf (digit_string, "%d", &part); -+ snprintf (disk, sizeof (disk), "/disk@1:%c", 'a' + (part - 1)); -+ sysfs_path = block_device_get_sysfs_path_and_link (nvmedev); -+ free (nvmedev); -+ } -+ else -+ { -+ /* We do not have the parition. */ -+ snprintf (disk, sizeof (disk), "/disk@1"); -+ sysfs_path = block_device_get_sysfs_path_and_link (device); -+ } -+ -+ of_path = find_obppath (sysfs_path); -+ -+ if (of_path) -+ strcat (of_path, disk); -+ -+ free (sysfs_path); -+ return of_path; -+} -+#endif -+ - static int - vendor_is_ATA(const char *path) - { -@@ -335,6 +427,64 @@ vendor_is_ATA(const char *path) - return (memcmp(bufcont, "ATA", 3) == 0); - } - -+#ifdef __sparc__ -+static void -+check_hba_identifiers (const char *sysfs_path, int *vendor, int *device_id) -+{ -+ char *ed = strstr (sysfs_path, "host"); -+ size_t path_size; -+ char *p, *path; -+ char buf[8]; -+ int fd; -+ -+ if (!ed) -+ return; -+ -+ p = xstrdup (sysfs_path); -+ ed = strstr (p, "host"); -+ -+ *ed = '\0'; -+ -+ path_size = (strlen (p) + sizeof ("vendor")); -+ path = xmalloc (path_size); -+ -+ if (!path) -+ goto out; -+ -+ snprintf (path, path_size, "%svendor", p); -+ fd = open (path, O_RDONLY); -+ -+ if (fd < 0) -+ goto out; -+ -+ memset (buf, 0, sizeof (buf)); -+ -+ if (read (fd, buf, sizeof (buf) - 1) < 0) -+ goto out; -+ -+ close (fd); -+ sscanf (buf, "%x", vendor); -+ -+ snprintf (path, path_size, "%sdevice", p); -+ fd = open (path, O_RDONLY); -+ -+ if (fd < 0) -+ goto out; -+ -+ memset (buf, 0, sizeof (buf)); -+ -+ if (read (fd, buf, sizeof (buf) - 1) < 0) -+ goto out; -+ -+ close (fd); -+ sscanf (buf, "%x", device_id); -+ -+ out: -+ free (path); -+ free (p); -+} -+#endif -+ - static void - check_sas (const char *sysfs_path, int *tgt, unsigned long int *sas_address) - { -@@ -396,7 +546,7 @@ of_path_of_scsi(const char *sys_devname __attribute__((unused)), const char *dev - { - const char *p, *digit_string, *disk_name; - int host, bus, tgt, lun; -- unsigned long int sas_address; -+ unsigned long int sas_address = 0; - char *sysfs_path, disk[MAX_DISK_CAT - sizeof ("/fp@0,0")]; - char *of_path; - -@@ -413,9 +563,8 @@ of_path_of_scsi(const char *sys_devname __attribute__((unused)), const char *dev - } - - of_path = find_obppath(sysfs_path); -- free (sysfs_path); - if (!of_path) -- return NULL; -+ goto out; - - if (strstr (of_path, "qlc")) - strcat (of_path, "/fp@0,0"); -@@ -444,6 +593,46 @@ of_path_of_scsi(const char *sys_devname __attribute__((unused)), const char *dev - } - else - { -+#ifdef __sparc__ -+ ofpath_sparc_addressing addressing = GRUB_OFPATH_SPARC_TGT_LUN; -+ int vendor = 0, device_id = 0; -+ char *optr = disk; -+ -+ check_hba_identifiers (sysfs_path, &vendor, &device_id); -+ -+ if (vendor == LSI_VENDOR_ID) -+ { -+ struct ofpath_sparc_hba *lsi_hba; -+ -+ /* -+ * Over time different OF addressing schemes have been supported. -+ * There is no generic addressing scheme that works across -+ * every HBA. -+ */ -+ for (lsi_hba = sparc_lsi_hba; lsi_hba->device_id; lsi_hba++) -+ if (lsi_hba->device_id == device_id) -+ { -+ addressing = lsi_hba->addressing; -+ break; -+ } -+ } -+ -+ if (addressing == GRUB_OFPATH_SPARC_WWN_ADDR) -+ optr += snprintf (disk, sizeof (disk), "/%s@w%lx,%x", disk_name, -+ sas_address, lun); -+ else -+ optr += snprintf (disk, sizeof (disk), "/%s@%x,%x", disk_name, tgt, -+ lun); -+ -+ if (*digit_string != '\0') -+ { -+ int part; -+ -+ sscanf (digit_string, "%d", &part); -+ snprintf (optr, sizeof (disk) - (optr - disk - 1), ":%c", 'a' -+ + (part - 1)); -+ } -+#else - if (lun == 0) - { - int sas_id = 0; -@@ -491,8 +680,12 @@ of_path_of_scsi(const char *sys_devname __attribute__((unused)), const char *dev - } - free (lunstr); - } -+#endif - } - strcat(of_path, disk); -+ -+ out: -+ free (sysfs_path); - return of_path; - } - -@@ -537,6 +730,11 @@ grub_util_devname_to_ofpath (const char *sys_devname) - /* All the models I've seen have a devalias "floppy". - New models have no floppy at all. */ - ofpath = xstrdup ("floppy"); -+#ifdef __sparc__ -+ else if (device[0] == 'n' && device[1] == 'v' && device[2] == 'm' -+ && device[3] == 'e') -+ ofpath = of_path_of_nvme (name_buf, device, devnode, devicenode); -+#endif - else - { - grub_util_warn (_("unknown device type %s"), device); -diff --git a/grub-core/osdep/unix/exec.c b/grub-core/osdep/unix/exec.c -index 935ff120ebe117f7492715813789db364ef1b12f..db3259f6504d5d5958cfa330bfd4a8b12b64f970 100644 ---- a/grub-core/osdep/unix/exec.c -+++ b/grub-core/osdep/unix/exec.c -@@ -99,7 +99,7 @@ grub_util_exec_redirect_all (const char *const *argv, const char *stdin_file, - { - fd = open (stdin_file, O_RDONLY); - if (fd < 0) -- exit (127); -+ _exit (127); - dup2 (fd, STDIN_FILENO); - close (fd); - } -@@ -108,7 +108,7 @@ grub_util_exec_redirect_all (const char *const *argv, const char *stdin_file, - { - fd = open (stdout_file, O_WRONLY | O_CREAT, 0700); - if (fd < 0) -- exit (127); -+ _exit (127); - dup2 (fd, STDOUT_FILENO); - close (fd); - } -@@ -117,7 +117,7 @@ grub_util_exec_redirect_all (const char *const *argv, const char *stdin_file, - { - fd = open (stderr_file, O_WRONLY | O_CREAT, 0700); - if (fd < 0) -- exit (127); -+ _exit (127); - dup2 (fd, STDERR_FILENO); - close (fd); - } -@@ -126,7 +126,7 @@ grub_util_exec_redirect_all (const char *const *argv, const char *stdin_file, - setenv ("LC_ALL", "C", 1); - - execvp ((char *) argv[0], (char **) argv); -- exit (127); -+ _exit (127); - } - waitpid (pid, &status, 0); - if (!WIFEXITED (status)) -diff --git a/grub-core/osdep/unix/getroot.c b/grub-core/osdep/unix/getroot.c -index 4bf37b027be660a14994fb316f08dd478490c4e2..3046e22cc012d1012add87931a018043e3ecc714 100644 ---- a/grub-core/osdep/unix/getroot.c -+++ b/grub-core/osdep/unix/getroot.c -@@ -428,8 +428,11 @@ grub_find_device (const char *dir, dev_t dev) - { - #ifdef __linux__ - /* Skip device names like /dev/dm-0, which are short-hand aliases -- to more descriptive device names, e.g. those under /dev/mapper */ -- if (ent->d_name[0] == 'd' && -+ to more descriptive device names, e.g. those under /dev/mapper. -+ Also, don't skip devices which names start with dm-[0-9] in -+ directories below /dev, e.g. /dev/mapper/dm-0-luks. */ -+ if (strcmp (dir, "/dev") == 0 && -+ ent->d_name[0] == 'd' && - ent->d_name[1] == 'm' && - ent->d_name[2] == '-' && - ent->d_name[3] >= '0' && -diff --git a/grub-core/osdep/unix/hostdisk.c b/grub-core/osdep/unix/hostdisk.c -index 2a8c5882e3d10b98bc305a116f8cca06acfe89f5..5450cf4166e04c2cfab806e93dfa63c6abdb9698 100644 ---- a/grub-core/osdep/unix/hostdisk.c -+++ b/grub-core/osdep/unix/hostdisk.c -@@ -77,11 +77,19 @@ grub_util_get_fd_size (grub_util_fd_t fd, const char *name, unsigned *log_secsiz - int - grub_util_fd_seek (grub_util_fd_t fd, grub_uint64_t off) - { -+#if SIZEOF_OFF_T == 8 - off_t offset = (off_t) off; - - if (lseek (fd, offset, SEEK_SET) != offset) - return -1; -+#elif SIZEOF_OFF64_T == 8 -+ off64_t offset = (off64_t) off; - -+ if (lseek64 (fd, offset, SEEK_SET) != offset) -+ return -1; -+#else -+#error "No large file support" -+#endif - return 0; - } - -diff --git a/grub-core/osdep/unix/platform.c b/grub-core/osdep/unix/platform.c -index a3fcfcacaa814d3ab62104f0dd406ef0c2163613..ca448bc11a05b9e0c6203a799ff62ab1dd75274f 100644 ---- a/grub-core/osdep/unix/platform.c -+++ b/grub-core/osdep/unix/platform.c -@@ -78,19 +78,20 @@ get_ofpathname (const char *dev) - dev); - } - --static void -+static int - grub_install_remove_efi_entries_by_distributor (const char *efi_distributor) - { - int fd; - pid_t pid = grub_util_exec_pipe ((const char * []){ "efibootmgr", NULL }, &fd); - char *line = NULL; - size_t len = 0; -+ int rc; - - if (!pid) - { - grub_util_warn (_("Unable to open stream from %s: %s"), - "efibootmgr", strerror (errno)); -- return; -+ return errno; - } - - FILE *fp = fdopen (fd, "r"); -@@ -98,7 +99,7 @@ grub_install_remove_efi_entries_by_distributor (const char *efi_distributor) - { - grub_util_warn (_("Unable to open stream from %s: %s"), - "efibootmgr", strerror (errno)); -- return; -+ return errno; - } - - line = xmalloc (80); -@@ -119,23 +120,25 @@ grub_install_remove_efi_entries_by_distributor (const char *efi_distributor) - bootnum = line + sizeof ("Boot") - 1; - bootnum[4] = '\0'; - if (!verbosity) -- grub_util_exec ((const char * []){ "efibootmgr", "-q", -+ rc = grub_util_exec ((const char * []){ "efibootmgr", "-q", - "-b", bootnum, "-B", NULL }); - else -- grub_util_exec ((const char * []){ "efibootmgr", -+ rc = grub_util_exec ((const char * []){ "efibootmgr", - "-b", bootnum, "-B", NULL }); - } - - free (line); -+ return rc; - } - --void -+int - grub_install_register_efi (grub_device_t efidir_grub_dev, - const char *efifile_path, - const char *efi_distributor) - { - const char * efidir_disk; - int efidir_part; -+ int ret; - efidir_disk = grub_util_biosdisk_get_osdev (efidir_grub_dev->disk); - efidir_part = efidir_grub_dev->disk->partition ? efidir_grub_dev->disk->partition->number + 1 : 1; - -@@ -151,23 +154,26 @@ grub_install_register_efi (grub_device_t efidir_grub_dev, - grub_util_exec ((const char * []){ "modprobe", "-q", "efivars", NULL }); - #endif - /* Delete old entries from the same distributor. */ -- grub_install_remove_efi_entries_by_distributor (efi_distributor); -+ ret = grub_install_remove_efi_entries_by_distributor (efi_distributor); -+ if (ret) -+ return ret; - - char *efidir_part_str = xasprintf ("%d", efidir_part); - - if (!verbosity) -- grub_util_exec ((const char * []){ "efibootmgr", "-q", -+ ret = grub_util_exec ((const char * []){ "efibootmgr", "-q", - "-c", "-d", efidir_disk, - "-p", efidir_part_str, "-w", - "-L", efi_distributor, "-l", - efifile_path, NULL }); - else -- grub_util_exec ((const char * []){ "efibootmgr", -+ ret = grub_util_exec ((const char * []){ "efibootmgr", - "-c", "-d", efidir_disk, - "-p", efidir_part_str, "-w", - "-L", efi_distributor, "-l", - efifile_path, NULL }); - free (efidir_part_str); -+ return ret; - } - - void -diff --git a/grub-core/partmap/gpt.c b/grub-core/partmap/gpt.c -index 83bcba7791421825da6922a7ee346f4fd5fcd7a4..103f6796f39f38209b0f554842aa6697faa5df2f 100644 ---- a/grub-core/partmap/gpt.c -+++ b/grub-core/partmap/gpt.c -@@ -33,10 +33,10 @@ static grub_uint8_t grub_gpt_magic[8] = - 0x45, 0x46, 0x49, 0x20, 0x50, 0x41, 0x52, 0x54 - }; - --static const grub_gpt_part_type_t grub_gpt_partition_type_empty = GRUB_GPT_PARTITION_TYPE_EMPTY; -+static const grub_gpt_part_guid_t grub_gpt_partition_type_empty = GRUB_GPT_PARTITION_TYPE_EMPTY; - - #ifdef GRUB_UTIL --static const grub_gpt_part_type_t grub_gpt_partition_type_bios_boot = GRUB_GPT_PARTITION_TYPE_BIOS_BOOT; -+static const grub_gpt_part_guid_t grub_gpt_partition_type_bios_boot = GRUB_GPT_PARTITION_TYPE_BIOS_BOOT; - #endif - - /* 512 << 7 = 65536 byte sectors. */ -diff --git a/grub-core/term/arm/cros.c b/grub-core/term/arm/cros.c -new file mode 100644 -index 0000000000000000000000000000000000000000..1ff9f8ccfb8270884ba962a05ca99df4c6ed1f41 ---- /dev/null -+++ b/grub-core/term/arm/cros.c -@@ -0,0 +1,125 @@ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * -+ * Copyright (C) 2012 Google Inc. -+ * Copyright (C) 2016 Free Software Foundation, Inc. -+ * -+ * This is based on depthcharge code. -+ * -+ * 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 -+#include -+#include -+ -+struct grub_ps2_state ps2_state; -+ -+struct grub_cros_ec_keyscan old_scan; -+ -+static const struct grub_fdtbus_dev *cros_ec; -+ -+static grub_uint8_t map_code[GRUB_CROS_EC_KEYSCAN_COLS][GRUB_CROS_EC_KEYSCAN_ROWS]; -+ -+static grub_uint8_t e0_translate[16] = -+ { -+ 0x1c, 0x1d, 0x35, 0x00, -+ 0x38, 0x00, 0x47, 0x48, -+ 0x49, 0x4b, 0x4d, 0x4f, -+ 0x50, 0x51, 0x52, 0x53, -+ }; -+ -+/* If there is a character pending, return it; -+ otherwise return GRUB_TERM_NO_KEY. */ -+static int -+grub_cros_keyboard_getkey (struct grub_term_input *term __attribute__ ((unused))) -+{ -+ struct grub_cros_ec_keyscan scan; -+ int i, j; -+ if (grub_cros_ec_scan_keyboard (cros_ec, &scan) < 0) -+ return GRUB_TERM_NO_KEY; -+ for (i = 0; i < GRUB_CROS_EC_KEYSCAN_COLS; i++) -+ if (scan.data[i] ^ old_scan.data[i]) -+ for (j = 0; j < GRUB_CROS_EC_KEYSCAN_ROWS; j++) -+ if ((scan.data[i] ^ old_scan.data[i]) & (1 << j)) -+ { -+ grub_uint8_t code = map_code[i][j]; -+ int ret; -+ grub_uint8_t brk = 0; -+ if (!(scan.data[i] & (1 << j))) -+ brk = 0x80; -+ grub_dprintf ("cros_keyboard", "key <%d, %d> code %x\n", i, j, code); -+ if (code < 0x60) -+ ret = grub_ps2_process_incoming_byte (&ps2_state, code | brk); -+ else if (code >= 0x60 && code < 0x70 && e0_translate[code - 0x60]) -+ { -+ grub_ps2_process_incoming_byte (&ps2_state, 0xe0); -+ ret = grub_ps2_process_incoming_byte (&ps2_state, e0_translate[code - 0x60] | brk); -+ } -+ else -+ ret = GRUB_TERM_NO_KEY; -+ old_scan.data[i] ^= (1 << j); -+ if (ret != GRUB_TERM_NO_KEY) -+ return ret; -+ } -+ return GRUB_TERM_NO_KEY; -+} -+ -+static struct grub_term_input grub_cros_keyboard_term = -+ { -+ .name = "cros_keyboard", -+ .getkey = grub_cros_keyboard_getkey -+ }; -+ -+static grub_err_t -+cros_attach (const struct grub_fdtbus_dev *dev) -+{ -+ grub_size_t keymap_size, i; -+ const grub_uint8_t *keymap = grub_fdtbus_get_prop (dev, "linux,keymap", &keymap_size); -+ -+ if (!dev->parent || !grub_cros_ec_validate (dev->parent)) -+ return GRUB_ERR_IO; -+ -+ if (keymap) -+ { -+ for (i = 0; i + 3 < keymap_size; i += 4) -+ if (keymap[i+1] < GRUB_CROS_EC_KEYSCAN_COLS && keymap[i] < GRUB_CROS_EC_KEYSCAN_ROWS -+ && keymap[i+2] == 0 && keymap[i+3] < 0x80) -+ map_code[keymap[i+1]][keymap[i]] = keymap[i+3]; -+ } -+ -+ cros_ec = dev->parent; -+ ps2_state.current_set = 1; -+ ps2_state.at_keyboard_status = 0; -+ grub_term_register_input ("cros_keyboard", &grub_cros_keyboard_term); -+ return GRUB_ERR_NONE; -+} -+ -+static struct grub_fdtbus_driver cros = -+{ -+ .compatible = "google,cros-ec-keyb", -+ .attach = cros_attach -+}; -+ -+void -+grub_cros_init (void) -+{ -+ grub_fdtbus_register (&cros); -+} -diff --git a/grub-core/term/arm/cros_ec.c b/grub-core/term/arm/cros_ec.c -new file mode 100644 -index 0000000000000000000000000000000000000000..f4144818b5bfdb9a512316ccc321586d539653ac ---- /dev/null -+++ b/grub-core/term/arm/cros_ec.c -@@ -0,0 +1,238 @@ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * -+ * Copyright (C) 2012 Google Inc. -+ * Copyright (C) 2016 Free Software Foundation, Inc. -+ * -+ * This is based on depthcharge code. -+ * -+ * 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 -+ -+static const grub_uint64_t FRAMING_TIMEOUT_MS = 300; -+ -+static const grub_uint8_t EC_FRAMING_BYTE = 0xec; -+ -+#define EC_CMD_MKBP_STATE 0x60 -+#define EC_CMD_VERSION0 0xdc -+ -+static grub_uint64_t last_transfer; -+ -+static void -+stop_bus (const struct grub_fdtbus_dev *spi) -+{ -+ spi->driver->stop (spi); -+ last_transfer = grub_get_time_ms (); -+} -+ -+static int -+wait_for_frame (const struct grub_fdtbus_dev *spi) -+{ -+ grub_uint64_t start = grub_get_time_ms (); -+ grub_uint8_t byte; -+ do -+ { -+ if (spi->driver->receive (spi, &byte, 1)) -+ return -1; -+ if (byte != EC_FRAMING_BYTE && -+ grub_get_time_ms () - start > FRAMING_TIMEOUT_MS) -+ { -+ grub_dprintf ("cros", "Timeout waiting for framing byte.\n"); -+ return -1; -+ } -+ } -+ while (byte != EC_FRAMING_BYTE); -+ return 0; -+} -+ -+/* -+ * Calculate a simple 8-bit checksum of a data block -+ * -+ * @param data Data block to checksum -+ * @param size Size of data block in bytes -+ * @return checksum value (0 to 255) -+ */ -+static grub_uint8_t -+cros_ec_calc_checksum (const void *data, int size) -+{ -+ grub_uint8_t csum; -+ const grub_uint8_t *bytes = data; -+ int i; -+ -+ for (i = csum = 0; i < size; i++) -+ csum += bytes[i]; -+ return csum & 0xff; -+} -+ -+enum -+{ -+ /* response, arglen */ -+ CROS_EC_SPI_IN_HDR_SIZE = 2, -+ /* version, cmd, arglen */ -+ CROS_EC_SPI_OUT_HDR_SIZE = 3 -+}; -+ -+static grub_uint8_t busbuf[256]; -+#define MSG_BYTES ((int)sizeof (busbuf)) -+ -+static int -+ec_command (const struct grub_fdtbus_dev *dev, int cmd, int cmd_version, -+ const void *dout, int dout_len, void *din, int din_len) -+{ -+ const struct grub_fdtbus_dev *spi = dev->parent; -+ grub_uint8_t *bytes; -+ -+ /* Header + data + checksum. */ -+ grub_uint32_t out_bytes = CROS_EC_SPI_OUT_HDR_SIZE + dout_len + 1; -+ grub_uint32_t in_bytes = CROS_EC_SPI_IN_HDR_SIZE + din_len + 1; -+ -+ /* -+ * Sanity-check I/O sizes given transaction overhead in internal -+ * buffers. -+ */ -+ if (out_bytes > MSG_BYTES) -+ { -+ grub_dprintf ("cros", "Cannot send %d bytes\n", dout_len); -+ return -1; -+ } -+ if (in_bytes > MSG_BYTES) -+ { -+ grub_dprintf ("cros", "Cannot receive %d bytes\n", din_len); -+ return -1; -+ } -+ -+ /* Prepare the output. */ -+ bytes = busbuf; -+ *bytes++ = EC_CMD_VERSION0 + cmd_version; -+ *bytes++ = cmd; -+ *bytes++ = dout_len; -+ grub_memcpy (bytes, dout, dout_len); -+ bytes += dout_len; -+ -+ *bytes++ = cros_ec_calc_checksum (busbuf, -+ CROS_EC_SPI_OUT_HDR_SIZE + dout_len); -+ -+ /* Depthcharge uses 200 us here but GRUB timer resolution is only 1ms, -+ decrease this when we increase timer resolution. */ -+ while (grub_get_time_ms () - last_transfer < 1) -+ ; -+ -+ if (spi->driver->start (spi)) -+ return -1; -+ -+ /* Allow EC to ramp up clock after being awoken. */ -+ /* Depthcharge only waits 100 us here but GRUB timer resolution is only 1ms, -+ decrease this when we increase timer resolution. */ -+ grub_millisleep (1); -+ -+ if (spi->driver->send (spi, busbuf, out_bytes)) -+ { -+ stop_bus (spi); -+ return -1; -+ } -+ -+ /* Wait until the EC is ready. */ -+ if (wait_for_frame (spi)) -+ { -+ stop_bus (spi); -+ return -1; -+ } -+ -+ /* Read the response code and the data length. */ -+ bytes = busbuf; -+ if (spi->driver->receive (spi, bytes, 2)) -+ { -+ stop_bus (spi); -+ return -1; -+ } -+ grub_uint8_t result = *bytes++; -+ grub_uint8_t length = *bytes++; -+ -+ /* Make sure there's enough room for the data. */ -+ if (CROS_EC_SPI_IN_HDR_SIZE + length + 1 > MSG_BYTES) -+ { -+ grub_dprintf ("cros", "Received length %#02x too large\n", length); -+ stop_bus (spi); -+ return -1; -+ } -+ -+ /* Read the data and the checksum, and finish up. */ -+ if (spi->driver->receive (spi, bytes, length + 1)) -+ { -+ stop_bus (spi); -+ return -1; -+ } -+ bytes += length; -+ int expected = *bytes++; -+ stop_bus (spi); -+ -+ /* Check the integrity of the response. */ -+ if (result != 0) -+ { -+ grub_dprintf ("cros", "Received bad result code %d\n", result); -+ return -result; -+ } -+ -+ int csum = cros_ec_calc_checksum (busbuf, -+ CROS_EC_SPI_IN_HDR_SIZE + length); -+ -+ if (csum != expected) -+ { -+ grub_dprintf ("cros", "Invalid checksum rx %#02x, calced %#02x\n", -+ expected, csum); -+ return -1; -+ } -+ -+ /* If the caller wants the response, copy it out for them. */ -+ if (length < din_len) -+ din_len = length; -+ if (din) -+ { -+ grub_memcpy (din, (grub_uint8_t *) busbuf + CROS_EC_SPI_IN_HDR_SIZE, din_len); -+ } -+ -+ return din_len; -+} -+ -+int -+grub_cros_ec_scan_keyboard (const struct grub_fdtbus_dev *dev, struct grub_cros_ec_keyscan *scan) -+{ -+ if (ec_command (dev, EC_CMD_MKBP_STATE, 0, NULL, 0, scan, -+ sizeof (*scan)) < (int) sizeof (*scan)) -+ return -1; -+ -+ return 0; -+} -+ -+int -+grub_cros_ec_validate (const struct grub_fdtbus_dev *dev) -+{ -+ if (!grub_fdtbus_is_compatible("google,cros-ec-spi", dev)) -+ return 0; -+ if (!dev->parent) -+ return 0; -+ if (!dev->parent->driver) -+ return 0; -+ if (!dev->parent->driver->send -+ || !dev->parent->driver->receive) -+ return 0; -+ return 1; -+} -+ -diff --git a/grub-core/term/arm/pl050.c b/grub-core/term/arm/pl050.c -new file mode 100644 -index 0000000000000000000000000000000000000000..e4cda305666df20eba26e10d74b879361e83d6ea ---- /dev/null -+++ b/grub-core/term/arm/pl050.c -@@ -0,0 +1,189 @@ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * Copyright (C) 2007,2008,2009 Free Software Foundation, Inc. -+ * -+ * GRUB is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation, either version 3 of the License, or -+ * (at your option) any later version. -+ * -+ * GRUB is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with GRUB. If not, see . -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+static volatile grub_uint32_t *pl050_regs; -+ -+struct grub_ps2_state ps2_state; -+ -+static void -+keyboard_controller_wait_until_ready (void) -+{ -+ while (! (pl050_regs[1] & 0x40)); -+} -+ -+static grub_uint8_t -+wait_ack (void) -+{ -+ grub_uint64_t endtime; -+ grub_uint8_t ack; -+ -+ endtime = grub_get_time_ms () + 20; -+ do -+ ack = pl050_regs[2]; -+ while (ack != GRUB_AT_ACK && ack != GRUB_AT_NACK -+ && grub_get_time_ms () < endtime); -+ return ack; -+} -+ -+ -+static int -+write_mode (int mode) -+{ -+ unsigned i; -+ for (i = 0; i < GRUB_AT_TRIES; i++) -+ { -+ grub_uint8_t ack; -+ keyboard_controller_wait_until_ready (); -+ pl050_regs[2] = 0xf0; -+ keyboard_controller_wait_until_ready (); -+ pl050_regs[2] = mode; -+ keyboard_controller_wait_until_ready (); -+ ack = wait_ack (); -+ if (ack == GRUB_AT_NACK) -+ continue; -+ if (ack == GRUB_AT_ACK) -+ break; -+ return 0; -+ } -+ -+ return (i != GRUB_AT_TRIES); -+} -+ -+static int -+query_mode (void) -+{ -+ grub_uint8_t ret; -+ int e; -+ -+ e = write_mode (0); -+ if (!e) -+ return 0; -+ -+ keyboard_controller_wait_until_ready (); -+ -+ do -+ ret = pl050_regs[2]; -+ while (ret == GRUB_AT_ACK); -+ -+ /* QEMU translates the set even in no-translate mode. */ -+ if (ret == 0x43 || ret == 1) -+ return 1; -+ if (ret == 0x41 || ret == 2) -+ return 2; -+ if (ret == 0x3f || ret == 3) -+ return 3; -+ return 0; -+} -+ -+static void -+set_scancodes (void) -+{ -+ write_mode (2); -+ ps2_state.current_set = query_mode (); -+ grub_dprintf ("atkeyb", "returned set %d\n", ps2_state.current_set); -+ if (ps2_state.current_set == 2) -+ return; -+ -+ write_mode (1); -+ ps2_state.current_set = query_mode (); -+ grub_dprintf ("atkeyb", "returned set %d\n", ps2_state.current_set); -+ if (ps2_state.current_set == 1) -+ return; -+ grub_dprintf ("atkeyb", "no supported scancode set found\n"); -+} -+ -+static void -+keyboard_controller_led (grub_uint8_t leds) -+{ -+ keyboard_controller_wait_until_ready (); -+ pl050_regs[2] = 0xed; -+ keyboard_controller_wait_until_ready (); -+ pl050_regs[2] = leds & 0x7; -+} -+ -+/* If there is a character pending, return it; -+ otherwise return GRUB_TERM_NO_KEY. */ -+static int -+grub_pl050_keyboard_getkey (struct grub_term_input *term __attribute__ ((unused))) -+{ -+ grub_uint8_t at_key; -+ int ret; -+ grub_uint8_t old_led; -+ -+ if (!(pl050_regs[1] & 0x10)) -+ return -1; -+ at_key = pl050_regs[2]; -+ old_led = ps2_state.led_status; -+ -+ ret = grub_ps2_process_incoming_byte (&ps2_state, at_key); -+ if (old_led != ps2_state.led_status) -+ keyboard_controller_led (ps2_state.led_status); -+ return ret; -+} -+ -+static struct grub_term_input grub_pl050_keyboard_term = -+ { -+ .name = "pl050_keyboard", -+ .getkey = grub_pl050_keyboard_getkey -+ }; -+ -+static grub_err_t -+pl050_attach(const struct grub_fdtbus_dev *dev) -+{ -+ const grub_uint32_t *reg; -+ reg = grub_fdtbus_get_prop (dev, "reg", 0); -+ -+ /* Mouse. Nothing to do. */ -+ if (grub_be_to_cpu32 (*reg) == 0x7000) -+ return 0; -+ -+ pl050_regs = grub_fdtbus_map_reg (dev, 0, 0); -+ -+ if (!grub_fdtbus_is_mapping_valid (pl050_regs)) -+ return grub_error (GRUB_ERR_IO, "could not map pl050"); -+ -+ ps2_state.at_keyboard_status = 0; -+ set_scancodes (); -+ keyboard_controller_led (ps2_state.led_status); -+ -+ grub_term_register_input ("pl050_keyboard", &grub_pl050_keyboard_term); -+ return GRUB_ERR_NONE; -+} -+ -+struct grub_fdtbus_driver pl050 = -+{ -+ .compatible = "arm,pl050", -+ .attach = pl050_attach -+}; -+ -+void -+grub_pl050_init (void) -+{ -+ grub_fdtbus_register (&pl050); -+} -diff --git a/grub-core/term/at_keyboard.c b/grub-core/term/at_keyboard.c -index b4ea9ff7e637f59c653b86cea79d4d664c78af84..f0a986eb176aef6c4fe3f5a65c646756e5bbde56 100644 ---- a/grub-core/term/at_keyboard.c -+++ b/grub-core/term/at_keyboard.c -@@ -22,215 +22,26 @@ - #include - #include - #include --#include - #include - #include -+#include - - GRUB_MOD_LICENSE ("GPLv3+"); - --static short at_keyboard_status = 0; --static int e0_received = 0; --static int f0_received = 0; -- --static grub_uint8_t led_status; -- --#define KEYBOARD_LED_SCROLL (1 << 0) --#define KEYBOARD_LED_NUM (1 << 1) --#define KEYBOARD_LED_CAPS (1 << 2) -- - static grub_uint8_t grub_keyboard_controller_orig; - static grub_uint8_t grub_keyboard_orig_set; --static grub_uint8_t current_set; -- --static void --grub_keyboard_controller_init (void); -- --static const grub_uint8_t set1_mapping[128] = -- { -- /* 0x00 */ 0 /* Unused */, GRUB_KEYBOARD_KEY_ESCAPE, -- /* 0x02 */ GRUB_KEYBOARD_KEY_1, GRUB_KEYBOARD_KEY_2, -- /* 0x04 */ GRUB_KEYBOARD_KEY_3, GRUB_KEYBOARD_KEY_4, -- /* 0x06 */ GRUB_KEYBOARD_KEY_5, GRUB_KEYBOARD_KEY_6, -- /* 0x08 */ GRUB_KEYBOARD_KEY_7, GRUB_KEYBOARD_KEY_8, -- /* 0x0a */ GRUB_KEYBOARD_KEY_9, GRUB_KEYBOARD_KEY_0, -- /* 0x0c */ GRUB_KEYBOARD_KEY_DASH, GRUB_KEYBOARD_KEY_EQUAL, -- /* 0x0e */ GRUB_KEYBOARD_KEY_BACKSPACE, GRUB_KEYBOARD_KEY_TAB, -- /* 0x10 */ GRUB_KEYBOARD_KEY_Q, GRUB_KEYBOARD_KEY_W, -- /* 0x12 */ GRUB_KEYBOARD_KEY_E, GRUB_KEYBOARD_KEY_R, -- /* 0x14 */ GRUB_KEYBOARD_KEY_T, GRUB_KEYBOARD_KEY_Y, -- /* 0x16 */ GRUB_KEYBOARD_KEY_U, GRUB_KEYBOARD_KEY_I, -- /* 0x18 */ GRUB_KEYBOARD_KEY_O, GRUB_KEYBOARD_KEY_P, -- /* 0x1a */ GRUB_KEYBOARD_KEY_LBRACKET, GRUB_KEYBOARD_KEY_RBRACKET, -- /* 0x1c */ GRUB_KEYBOARD_KEY_ENTER, GRUB_KEYBOARD_KEY_LEFT_CTRL, -- /* 0x1e */ GRUB_KEYBOARD_KEY_A, GRUB_KEYBOARD_KEY_S, -- /* 0x20 */ GRUB_KEYBOARD_KEY_D, GRUB_KEYBOARD_KEY_F, -- /* 0x22 */ GRUB_KEYBOARD_KEY_G, GRUB_KEYBOARD_KEY_H, -- /* 0x24 */ GRUB_KEYBOARD_KEY_J, GRUB_KEYBOARD_KEY_K, -- /* 0x26 */ GRUB_KEYBOARD_KEY_L, GRUB_KEYBOARD_KEY_SEMICOLON, -- /* 0x28 */ GRUB_KEYBOARD_KEY_DQUOTE, GRUB_KEYBOARD_KEY_RQUOTE, -- /* 0x2a */ GRUB_KEYBOARD_KEY_LEFT_SHIFT, GRUB_KEYBOARD_KEY_BACKSLASH, -- /* 0x2c */ GRUB_KEYBOARD_KEY_Z, GRUB_KEYBOARD_KEY_X, -- /* 0x2e */ GRUB_KEYBOARD_KEY_C, GRUB_KEYBOARD_KEY_V, -- /* 0x30 */ GRUB_KEYBOARD_KEY_B, GRUB_KEYBOARD_KEY_N, -- /* 0x32 */ GRUB_KEYBOARD_KEY_M, GRUB_KEYBOARD_KEY_COMMA, -- /* 0x34 */ GRUB_KEYBOARD_KEY_DOT, GRUB_KEYBOARD_KEY_SLASH, -- /* 0x36 */ GRUB_KEYBOARD_KEY_RIGHT_SHIFT, GRUB_KEYBOARD_KEY_NUMMUL, -- /* 0x38 */ GRUB_KEYBOARD_KEY_LEFT_ALT, GRUB_KEYBOARD_KEY_SPACE, -- /* 0x3a */ GRUB_KEYBOARD_KEY_CAPS_LOCK, GRUB_KEYBOARD_KEY_F1, -- /* 0x3c */ GRUB_KEYBOARD_KEY_F2, GRUB_KEYBOARD_KEY_F3, -- /* 0x3e */ GRUB_KEYBOARD_KEY_F4, GRUB_KEYBOARD_KEY_F5, -- /* 0x40 */ GRUB_KEYBOARD_KEY_F6, GRUB_KEYBOARD_KEY_F7, -- /* 0x42 */ GRUB_KEYBOARD_KEY_F8, GRUB_KEYBOARD_KEY_F9, -- /* 0x44 */ GRUB_KEYBOARD_KEY_F10, GRUB_KEYBOARD_KEY_NUM_LOCK, -- /* 0x46 */ GRUB_KEYBOARD_KEY_SCROLL_LOCK, GRUB_KEYBOARD_KEY_NUM7, -- /* 0x48 */ GRUB_KEYBOARD_KEY_NUM8, GRUB_KEYBOARD_KEY_NUM9, -- /* 0x4a */ GRUB_KEYBOARD_KEY_NUMMINUS, GRUB_KEYBOARD_KEY_NUM4, -- /* 0x4c */ GRUB_KEYBOARD_KEY_NUM5, GRUB_KEYBOARD_KEY_NUM6, -- /* 0x4e */ GRUB_KEYBOARD_KEY_NUMPLUS, GRUB_KEYBOARD_KEY_NUM1, -- /* 0x50 */ GRUB_KEYBOARD_KEY_NUM2, GRUB_KEYBOARD_KEY_NUM3, -- /* 0x52 */ GRUB_KEYBOARD_KEY_NUM0, GRUB_KEYBOARD_KEY_NUMDOT, -- /* 0x54 */ 0, 0, -- /* 0x56 */ GRUB_KEYBOARD_KEY_102ND, GRUB_KEYBOARD_KEY_F11, -- /* 0x58 */ GRUB_KEYBOARD_KEY_F12, 0, -- /* 0x5a */ 0, 0, -- /* 0x5c */ 0, 0, -- /* 0x5e */ 0, 0, -- /* 0x60 */ 0, 0, -- /* 0x62 */ 0, 0, -- /* OLPC keys. Just mapped to normal keys. */ -- /* 0x64 */ 0, GRUB_KEYBOARD_KEY_UP, -- /* 0x66 */ GRUB_KEYBOARD_KEY_DOWN, GRUB_KEYBOARD_KEY_LEFT, -- /* 0x68 */ GRUB_KEYBOARD_KEY_RIGHT, 0, -- /* 0x6a */ 0, 0, -- /* 0x6c */ 0, 0, -- /* 0x6e */ 0, 0, -- /* 0x70 */ 0, 0, -- /* 0x72 */ 0, GRUB_KEYBOARD_KEY_JP_RO, -- /* 0x74 */ 0, 0, -- /* 0x76 */ 0, 0, -- /* 0x78 */ 0, 0, -- /* 0x7a */ 0, 0, -- /* 0x7c */ 0, GRUB_KEYBOARD_KEY_JP_YEN, -- /* 0x7e */ GRUB_KEYBOARD_KEY_KPCOMMA -- }; -- --static const struct --{ -- grub_uint8_t from, to; --} set1_e0_mapping[] = -- { -- {0x1c, GRUB_KEYBOARD_KEY_NUMENTER}, -- {0x1d, GRUB_KEYBOARD_KEY_RIGHT_CTRL}, -- {0x35, GRUB_KEYBOARD_KEY_NUMSLASH }, -- {0x38, GRUB_KEYBOARD_KEY_RIGHT_ALT}, -- {0x47, GRUB_KEYBOARD_KEY_HOME}, -- {0x48, GRUB_KEYBOARD_KEY_UP}, -- {0x49, GRUB_KEYBOARD_KEY_PPAGE}, -- {0x4b, GRUB_KEYBOARD_KEY_LEFT}, -- {0x4d, GRUB_KEYBOARD_KEY_RIGHT}, -- {0x4f, GRUB_KEYBOARD_KEY_END}, -- {0x50, GRUB_KEYBOARD_KEY_DOWN}, -- {0x51, GRUB_KEYBOARD_KEY_NPAGE}, -- {0x52, GRUB_KEYBOARD_KEY_INSERT}, -- {0x53, GRUB_KEYBOARD_KEY_DELETE}, -- }; -- --static const grub_uint8_t set2_mapping[256] = -- { -- /* 0x00 */ 0, GRUB_KEYBOARD_KEY_F9, -- /* 0x02 */ 0, GRUB_KEYBOARD_KEY_F5, -- /* 0x04 */ GRUB_KEYBOARD_KEY_F3, GRUB_KEYBOARD_KEY_F1, -- /* 0x06 */ GRUB_KEYBOARD_KEY_F2, GRUB_KEYBOARD_KEY_F12, -- /* 0x08 */ 0, GRUB_KEYBOARD_KEY_F10, -- /* 0x0a */ GRUB_KEYBOARD_KEY_F8, GRUB_KEYBOARD_KEY_F6, -- /* 0x0c */ GRUB_KEYBOARD_KEY_F4, GRUB_KEYBOARD_KEY_TAB, -- /* 0x0e */ GRUB_KEYBOARD_KEY_RQUOTE, 0, -- /* 0x10 */ 0, GRUB_KEYBOARD_KEY_LEFT_ALT, -- /* 0x12 */ GRUB_KEYBOARD_KEY_LEFT_SHIFT, 0, -- /* 0x14 */ GRUB_KEYBOARD_KEY_LEFT_CTRL, GRUB_KEYBOARD_KEY_Q, -- /* 0x16 */ GRUB_KEYBOARD_KEY_1, 0, -- /* 0x18 */ 0, 0, -- /* 0x1a */ GRUB_KEYBOARD_KEY_Z, GRUB_KEYBOARD_KEY_S, -- /* 0x1c */ GRUB_KEYBOARD_KEY_A, GRUB_KEYBOARD_KEY_W, -- /* 0x1e */ GRUB_KEYBOARD_KEY_2, 0, -- /* 0x20 */ 0, GRUB_KEYBOARD_KEY_C, -- /* 0x22 */ GRUB_KEYBOARD_KEY_X, GRUB_KEYBOARD_KEY_D, -- /* 0x24 */ GRUB_KEYBOARD_KEY_E, GRUB_KEYBOARD_KEY_4, -- /* 0x26 */ GRUB_KEYBOARD_KEY_3, 0, -- /* 0x28 */ 0, GRUB_KEYBOARD_KEY_SPACE, -- /* 0x2a */ GRUB_KEYBOARD_KEY_V, GRUB_KEYBOARD_KEY_F, -- /* 0x2c */ GRUB_KEYBOARD_KEY_T, GRUB_KEYBOARD_KEY_R, -- /* 0x2e */ GRUB_KEYBOARD_KEY_5, 0, -- /* 0x30 */ 0, GRUB_KEYBOARD_KEY_N, -- /* 0x32 */ GRUB_KEYBOARD_KEY_B, GRUB_KEYBOARD_KEY_H, -- /* 0x34 */ GRUB_KEYBOARD_KEY_G, GRUB_KEYBOARD_KEY_Y, -- /* 0x36 */ GRUB_KEYBOARD_KEY_6, 0, -- /* 0x38 */ 0, 0, -- /* 0x3a */ GRUB_KEYBOARD_KEY_M, GRUB_KEYBOARD_KEY_J, -- /* 0x3c */ GRUB_KEYBOARD_KEY_U, GRUB_KEYBOARD_KEY_7, -- /* 0x3e */ GRUB_KEYBOARD_KEY_8, 0, -- /* 0x40 */ 0, GRUB_KEYBOARD_KEY_COMMA, -- /* 0x42 */ GRUB_KEYBOARD_KEY_K, GRUB_KEYBOARD_KEY_I, -- /* 0x44 */ GRUB_KEYBOARD_KEY_O, GRUB_KEYBOARD_KEY_0, -- /* 0x46 */ GRUB_KEYBOARD_KEY_9, 0, -- /* 0x48 */ 0, GRUB_KEYBOARD_KEY_DOT, -- /* 0x4a */ GRUB_KEYBOARD_KEY_SLASH, GRUB_KEYBOARD_KEY_L, -- /* 0x4c */ GRUB_KEYBOARD_KEY_SEMICOLON, GRUB_KEYBOARD_KEY_P, -- /* 0x4e */ GRUB_KEYBOARD_KEY_DASH, 0, -- /* 0x50 */ 0, GRUB_KEYBOARD_KEY_JP_RO, -- /* 0x52 */ GRUB_KEYBOARD_KEY_DQUOTE, 0, -- /* 0x54 */ GRUB_KEYBOARD_KEY_LBRACKET, GRUB_KEYBOARD_KEY_EQUAL, -- /* 0x56 */ 0, 0, -- /* 0x58 */ GRUB_KEYBOARD_KEY_CAPS_LOCK, GRUB_KEYBOARD_KEY_RIGHT_SHIFT, -- /* 0x5a */ GRUB_KEYBOARD_KEY_ENTER, GRUB_KEYBOARD_KEY_RBRACKET, -- /* 0x5c */ 0, GRUB_KEYBOARD_KEY_BACKSLASH, -- /* 0x5e */ 0, 0, -- /* 0x60 */ 0, GRUB_KEYBOARD_KEY_102ND, -- /* 0x62 */ 0, 0, -- /* 0x64 */ 0, 0, -- /* 0x66 */ GRUB_KEYBOARD_KEY_BACKSPACE, 0, -- /* 0x68 */ 0, GRUB_KEYBOARD_KEY_NUM1, -- /* 0x6a */ GRUB_KEYBOARD_KEY_JP_YEN, GRUB_KEYBOARD_KEY_NUM4, -- /* 0x6c */ GRUB_KEYBOARD_KEY_NUM7, GRUB_KEYBOARD_KEY_KPCOMMA, -- /* 0x6e */ 0, 0, -- /* 0x70 */ GRUB_KEYBOARD_KEY_NUM0, GRUB_KEYBOARD_KEY_NUMDOT, -- /* 0x72 */ GRUB_KEYBOARD_KEY_NUM2, GRUB_KEYBOARD_KEY_NUM5, -- /* 0x74 */ GRUB_KEYBOARD_KEY_NUM6, GRUB_KEYBOARD_KEY_NUM8, -- /* 0x76 */ GRUB_KEYBOARD_KEY_ESCAPE, GRUB_KEYBOARD_KEY_NUM_LOCK, -- /* 0x78 */ GRUB_KEYBOARD_KEY_F11, GRUB_KEYBOARD_KEY_NUMPLUS, -- /* 0x7a */ GRUB_KEYBOARD_KEY_NUM3, GRUB_KEYBOARD_KEY_NUMMINUS, -- /* 0x7c */ GRUB_KEYBOARD_KEY_NUMMUL, GRUB_KEYBOARD_KEY_NUM9, -- /* 0x7e */ GRUB_KEYBOARD_KEY_SCROLL_LOCK, 0, -- /* 0x80 */ 0, 0, -- /* 0x82 */ 0, GRUB_KEYBOARD_KEY_F7, -- }; -- --static const struct --{ -- grub_uint8_t from, to; --} set2_e0_mapping[] = -- { -- {0x11, GRUB_KEYBOARD_KEY_RIGHT_ALT}, -- {0x14, GRUB_KEYBOARD_KEY_RIGHT_CTRL}, -- {0x4a, GRUB_KEYBOARD_KEY_NUMSLASH}, -- {0x5a, GRUB_KEYBOARD_KEY_NUMENTER}, -- {0x69, GRUB_KEYBOARD_KEY_END}, -- {0x6b, GRUB_KEYBOARD_KEY_LEFT}, -- {0x6c, GRUB_KEYBOARD_KEY_HOME}, -- {0x70, GRUB_KEYBOARD_KEY_INSERT}, -- {0x71, GRUB_KEYBOARD_KEY_DELETE}, -- {0x72, GRUB_KEYBOARD_KEY_DOWN}, -- {0x74, GRUB_KEYBOARD_KEY_RIGHT}, -- {0x75, GRUB_KEYBOARD_KEY_UP}, -- {0x7a, GRUB_KEYBOARD_KEY_NPAGE}, -- {0x7d, GRUB_KEYBOARD_KEY_PPAGE}, -- }; -+struct grub_ps2_state ps2_state; - - static int ping_sent; - -+static void -+grub_keyboard_controller_init (void); -+ - static void - keyboard_controller_wait_until_ready (void) - { -+ /* 50 us would be enough but our current time resolution is 1ms. */ -+ grub_millisleep (1); - while (! KEYBOARD_COMMAND_ISREADY (grub_inb (KEYBOARD_REG_STATUS))); - } - -@@ -241,10 +52,11 @@ wait_ack (void) - grub_uint8_t ack; - - endtime = grub_get_time_ms () + 20; -- do -+ do { -+ keyboard_controller_wait_until_ready (); - ack = grub_inb (KEYBOARD_REG_DATA); -- while (ack != GRUB_AT_ACK && ack != GRUB_AT_NACK -- && grub_get_time_ms () < endtime); -+ } while (ack != GRUB_AT_ACK && ack != GRUB_AT_NACK -+ && grub_get_time_ms () < endtime); - return ack; - } - -@@ -326,12 +138,10 @@ query_mode (void) - if (!e) - return 0; - -- keyboard_controller_wait_until_ready (); -- -- do -+ do { -+ keyboard_controller_wait_until_ready (); - ret = grub_inb (KEYBOARD_REG_DATA); -- while (ret == GRUB_AT_ACK); -- -+ } while (ret == GRUB_AT_ACK); - /* QEMU translates the set even in no-translate mode. */ - if (ret == 0x43 || ret == 1) - return 1; -@@ -350,28 +160,32 @@ set_scancodes (void) - if (!grub_keyboard_orig_set) - { - grub_dprintf ("atkeyb", "No sets support assumed\n"); -- current_set = 1; -+ ps2_state.current_set = 1; - return; - } - - #if !USE_SCANCODE_SET -- current_set = 1; -+ ps2_state.current_set = 1; - return; - #else - - grub_keyboard_controller_write (grub_keyboard_controller_orig -- & ~KEYBOARD_AT_TRANSLATE); -+ & ~KEYBOARD_AT_TRANSLATE -+ & ~KEYBOARD_AT_DISABLE); -+ -+ keyboard_controller_wait_until_ready (); -+ grub_outb (KEYBOARD_COMMAND_ENABLE, KEYBOARD_REG_DATA); - - write_mode (2); -- current_set = query_mode (); -- grub_dprintf ("atkeyb", "returned set %d\n", current_set); -- if (current_set == 2) -+ ps2_state.current_set = query_mode (); -+ grub_dprintf ("atkeyb", "returned set %d\n", ps2_state.current_set); -+ if (ps2_state.current_set == 2) - return; - - write_mode (1); -- current_set = query_mode (); -- grub_dprintf ("atkeyb", "returned set %d\n", current_set); -- if (current_set == 1) -+ ps2_state.current_set = query_mode (); -+ grub_dprintf ("atkeyb", "returned set %d\n", ps2_state.current_set); -+ if (ps2_state.current_set == 1) - return; - grub_dprintf ("atkeyb", "no supported scancode set found\n"); - #endif -@@ -386,164 +200,10 @@ keyboard_controller_led (grub_uint8_t leds) - grub_outb (leds & 0x7, KEYBOARD_REG_DATA); - } - --static int --fetch_key (int *is_break) --{ -- int was_ext = 0; -- grub_uint8_t at_key; -- int ret = 0; -- -- if (! KEYBOARD_ISREADY (grub_inb (KEYBOARD_REG_STATUS))) -- return -1; -- at_key = grub_inb (KEYBOARD_REG_DATA); -- /* May happen if no keyboard is connected. Just ignore this. */ -- if (at_key == 0xff) -- return -1; -- if (at_key == 0xe0) -- { -- e0_received = 1; -- return -1; -- } -- -- if ((current_set == 2 || current_set == 3) && at_key == 0xf0) -- { -- f0_received = 1; -- return -1; -- } -- -- /* Setting LEDs may generate ACKs. */ -- if (at_key == GRUB_AT_ACK) -- return -1; -- -- was_ext = e0_received; -- e0_received = 0; -- -- switch (current_set) -- { -- case 1: -- *is_break = !!(at_key & 0x80); -- if (!was_ext) -- ret = set1_mapping[at_key & 0x7f]; -- else -- { -- unsigned i; -- for (i = 0; i < ARRAY_SIZE (set1_e0_mapping); i++) -- if (set1_e0_mapping[i].from == (at_key & 0x7f)) -- { -- ret = set1_e0_mapping[i].to; -- break; -- } -- } -- break; -- case 2: -- *is_break = f0_received; -- f0_received = 0; -- if (!was_ext) -- ret = set2_mapping[at_key]; -- else -- { -- unsigned i; -- for (i = 0; i < ARRAY_SIZE (set2_e0_mapping); i++) -- if (set2_e0_mapping[i].from == at_key) -- { -- ret = set2_e0_mapping[i].to; -- break; -- } -- } -- break; -- default: -- return -1; -- } -- if (!ret) -- { -- if (was_ext) -- grub_dprintf ("atkeyb", "Unknown key 0xe0+0x%02x from set %d\n", -- at_key, current_set); -- else -- grub_dprintf ("atkeyb", "Unknown key 0x%02x from set %d\n", -- at_key, current_set); -- return -1; -- } -- return ret; --} -- --/* FIXME: This should become an interrupt service routine. For now -- it's just used to catch events from control keys. */ --static int --grub_keyboard_isr (grub_keyboard_key_t key, int is_break) --{ -- if (!is_break) -- switch (key) -- { -- case GRUB_KEYBOARD_KEY_LEFT_SHIFT: -- at_keyboard_status |= GRUB_TERM_STATUS_LSHIFT; -- return 1; -- case GRUB_KEYBOARD_KEY_RIGHT_SHIFT: -- at_keyboard_status |= GRUB_TERM_STATUS_RSHIFT; -- return 1; -- case GRUB_KEYBOARD_KEY_LEFT_CTRL: -- at_keyboard_status |= GRUB_TERM_STATUS_LCTRL; -- return 1; -- case GRUB_KEYBOARD_KEY_RIGHT_CTRL: -- at_keyboard_status |= GRUB_TERM_STATUS_RCTRL; -- return 1; -- case GRUB_KEYBOARD_KEY_RIGHT_ALT: -- at_keyboard_status |= GRUB_TERM_STATUS_RALT; -- return 1; -- case GRUB_KEYBOARD_KEY_LEFT_ALT: -- at_keyboard_status |= GRUB_TERM_STATUS_LALT; -- return 1; -- default: -- return 0; -- } -- else -- switch (key) -- { -- case GRUB_KEYBOARD_KEY_LEFT_SHIFT: -- at_keyboard_status &= ~GRUB_TERM_STATUS_LSHIFT; -- return 1; -- case GRUB_KEYBOARD_KEY_RIGHT_SHIFT: -- at_keyboard_status &= ~GRUB_TERM_STATUS_RSHIFT; -- return 1; -- case GRUB_KEYBOARD_KEY_LEFT_CTRL: -- at_keyboard_status &= ~GRUB_TERM_STATUS_LCTRL; -- return 1; -- case GRUB_KEYBOARD_KEY_RIGHT_CTRL: -- at_keyboard_status &= ~GRUB_TERM_STATUS_RCTRL; -- return 1; -- case GRUB_KEYBOARD_KEY_RIGHT_ALT: -- at_keyboard_status &= ~GRUB_TERM_STATUS_RALT; -- return 1; -- case GRUB_KEYBOARD_KEY_LEFT_ALT: -- at_keyboard_status &= ~GRUB_TERM_STATUS_LALT; -- return 1; -- default: -- return 0; -- } --} -- --/* If there is a raw key pending, return it; otherwise return -1. */ --static int --grub_keyboard_getkey (void) --{ -- int key; -- int is_break = 0; -- -- key = fetch_key (&is_break); -- if (key == -1) -- return -1; -- -- if (grub_keyboard_isr (key, is_break)) -- return -1; -- if (is_break) -- return -1; -- return key; --} -- - int - grub_at_keyboard_is_alive (void) - { -- if (current_set != 0) -+ if (ps2_state.current_set != 0) - return 1; - if (ping_sent - && KEYBOARD_COMMAND_ISREADY (grub_inb (KEYBOARD_REG_STATUS)) -@@ -566,51 +226,28 @@ grub_at_keyboard_is_alive (void) - static int - grub_at_keyboard_getkey (struct grub_term_input *term __attribute__ ((unused))) - { -- int code; -+ grub_uint8_t at_key; -+ int ret; -+ grub_uint8_t old_led; - - if (!grub_at_keyboard_is_alive ()) - return GRUB_TERM_NO_KEY; - -- code = grub_keyboard_getkey (); -- if (code == -1) -- return GRUB_TERM_NO_KEY; --#ifdef DEBUG_AT_KEYBOARD -- grub_dprintf ("atkeyb", "Detected key 0x%x\n", code); --#endif -- switch (code) -- { -- case GRUB_KEYBOARD_KEY_CAPS_LOCK: -- at_keyboard_status ^= GRUB_TERM_STATUS_CAPS; -- led_status ^= KEYBOARD_LED_CAPS; -- keyboard_controller_led (led_status); -+ if (! KEYBOARD_ISREADY (grub_inb (KEYBOARD_REG_STATUS))) -+ return -1; -+ at_key = grub_inb (KEYBOARD_REG_DATA); -+ old_led = ps2_state.led_status; - --#ifdef DEBUG_AT_KEYBOARD -- grub_dprintf ("atkeyb", "caps_lock = %d\n", !!(at_keyboard_status & GRUB_KEYBOARD_STATUS_CAPS_LOCK)); --#endif -- return GRUB_TERM_NO_KEY; -- case GRUB_KEYBOARD_KEY_NUM_LOCK: -- at_keyboard_status ^= GRUB_TERM_STATUS_NUM; -- led_status ^= KEYBOARD_LED_NUM; -- keyboard_controller_led (led_status); -- --#ifdef DEBUG_AT_KEYBOARD -- grub_dprintf ("atkeyb", "num_lock = %d\n", !!(at_keyboard_status & GRUB_KEYBOARD_STATUS_NUM_LOCK)); --#endif -- return GRUB_TERM_NO_KEY; -- case GRUB_KEYBOARD_KEY_SCROLL_LOCK: -- at_keyboard_status ^= GRUB_TERM_STATUS_SCROLL; -- led_status ^= KEYBOARD_LED_SCROLL; -- keyboard_controller_led (led_status); -- return GRUB_TERM_NO_KEY; -- default: -- return grub_term_map_key (code, at_keyboard_status); -- } -+ ret = grub_ps2_process_incoming_byte (&ps2_state, at_key); -+ if (old_led != ps2_state.led_status) -+ keyboard_controller_led (ps2_state.led_status); -+ return ret; - } - - static void - grub_keyboard_controller_init (void) - { -- at_keyboard_status = 0; -+ ps2_state.at_keyboard_status = 0; - /* Drain input buffer. */ - while (1) - { -@@ -632,13 +269,13 @@ grub_keyboard_controller_init (void) - grub_keyboard_orig_set = query_mode (); - #endif - set_scancodes (); -- keyboard_controller_led (led_status); -+ keyboard_controller_led (ps2_state.led_status); - } - - static grub_err_t - grub_keyboard_controller_fini (struct grub_term_input *term __attribute__ ((unused))) - { -- if (current_set == 0) -+ if (ps2_state.current_set == 0) - return GRUB_ERR_NONE; - if (grub_keyboard_orig_set) - write_mode (grub_keyboard_orig_set); -@@ -655,7 +292,7 @@ grub_at_fini_hw (int noreturn __attribute__ ((unused))) - static grub_err_t - grub_at_restore_hw (void) - { -- if (current_set == 0) -+ if (ps2_state.current_set == 0) - return GRUB_ERR_NONE; - - /* Drain input buffer. */ -@@ -668,7 +305,7 @@ grub_at_restore_hw (void) - grub_inb (KEYBOARD_REG_DATA); - } - set_scancodes (); -- keyboard_controller_led (led_status); -+ keyboard_controller_led (ps2_state.led_status); - - return GRUB_ERR_NONE; - } -diff --git a/grub-core/term/efi/console.c b/grub-core/term/efi/console.c -index 7d31095b1ef8d01886a0516343f2e5c5601265dd..4840cc59d3f68944fb2ca6b40cc6488e74b5da02 100644 ---- a/grub-core/term/efi/console.c -+++ b/grub-core/term/efi/console.c -@@ -104,7 +104,7 @@ const unsigned efi_codes[] = - GRUB_TERM_KEY_DC, GRUB_TERM_KEY_PPAGE, GRUB_TERM_KEY_NPAGE, GRUB_TERM_KEY_F1, - GRUB_TERM_KEY_F2, GRUB_TERM_KEY_F3, GRUB_TERM_KEY_F4, GRUB_TERM_KEY_F5, - GRUB_TERM_KEY_F6, GRUB_TERM_KEY_F7, GRUB_TERM_KEY_F8, GRUB_TERM_KEY_F9, -- GRUB_TERM_KEY_F10, GRUB_TERM_KEY_F11, GRUB_TERM_KEY_F12, '\e' -+ GRUB_TERM_KEY_F10, GRUB_TERM_KEY_F11, GRUB_TERM_KEY_F12, GRUB_TERM_ESC - }; - - static int -@@ -122,6 +122,9 @@ grub_efi_translate_key (grub_efi_input_key_t key) - else - return key.unicode_char; - } -+ /* Some devices send enter with scan_code 0x0d (F3) and unicode_char 0x0d. */ -+ else if (key.scan_code == '\r' && key.unicode_char == '\r') -+ return key.unicode_char; - else if (key.scan_code < ARRAY_SIZE (efi_codes)) - return efi_codes[key.scan_code]; - -diff --git a/grub-core/term/i386/coreboot/cbmemc.c b/grub-core/term/i386/coreboot/cbmemc.c -index 25e64a05c03286f644b39398e9e68cbdde333510..cea9b84315bdaf3b1238acc915f35ba6148ffbcf 100644 ---- a/grub-core/term/i386/coreboot/cbmemc.c -+++ b/grub-core/term/i386/coreboot/cbmemc.c -@@ -23,17 +23,20 @@ - #include - #include - #include --#include -+#include - #include - #include - - GRUB_MOD_LICENSE ("GPLv3+"); - -+#define CURSOR_MASK ((1 << 28) - 1) -+#define OVERFLOW (1 << 31) -+ - struct grub_linuxbios_cbmemc - { - grub_uint32_t size; -- grub_uint32_t pointer; -- char data[0]; -+ grub_uint32_t cursor; -+ char body[0]; - }; - - static struct grub_linuxbios_cbmemc *cbmemc; -@@ -41,11 +44,20 @@ static struct grub_linuxbios_cbmemc *cbmemc; - static void - put (struct grub_term_output *term __attribute__ ((unused)), const int c) - { -+ grub_uint32_t flags, cursor; - if (!cbmemc) - return; -- if (cbmemc->pointer < cbmemc->size) -- cbmemc->data[cbmemc->pointer] = c; -- cbmemc->pointer++; -+ flags = cbmemc->cursor & ~CURSOR_MASK; -+ cursor = cbmemc->cursor & CURSOR_MASK; -+ if (cursor >= cbmemc->size) -+ return; -+ cbmemc->body[cursor++] = c; -+ if (cursor >= cbmemc->size) -+ { -+ cursor = 0; -+ flags |= OVERFLOW; -+ } -+ cbmemc->cursor = flags | cursor; - } - - struct grub_terminfo_output_state grub_cbmemc_terminfo_output = -@@ -87,21 +99,29 @@ grub_cmd_cbmemc (struct grub_command *cmd __attribute__ ((unused)), - int argc __attribute__ ((unused)), - char *argv[] __attribute__ ((unused))) - { -- grub_size_t len; -- char *str; -- struct grub_linuxbios_cbmemc *cbmemc_saved; -+ grub_size_t size, cursor; -+ struct grub_linuxbios_cbmemc *real_cbmemc; - - if (!cbmemc) - return grub_error (GRUB_ERR_IO, "no CBMEM console found"); - -- len = cbmemc->pointer; -- if (len > cbmemc->size) -- len = cbmemc->size; -- str = cbmemc->data; -- cbmemc_saved = cbmemc; -+ real_cbmemc = cbmemc; - cbmemc = 0; -- grub_xnputs (str, len); -- cbmemc = cbmemc_saved; -+ cursor = real_cbmemc->cursor & CURSOR_MASK; -+ if (!(real_cbmemc->cursor & OVERFLOW) && cursor < real_cbmemc->size) -+ size = cursor; -+ else -+ size = real_cbmemc->size; -+ if (real_cbmemc->cursor & OVERFLOW) -+ { -+ if (cursor > size) -+ cursor = 0; -+ grub_xnputs(real_cbmemc->body + cursor, size - cursor); -+ grub_xnputs(real_cbmemc->body, cursor); -+ } -+ else -+ grub_xnputs(real_cbmemc->body, size); -+ cbmemc = real_cbmemc; - return 0; - } - -diff --git a/grub-core/term/i386/pc/console.c b/grub-core/term/i386/pc/console.c -index 28de46b576a667fd40c5852b16a4bcc3ea681849..f6142a2dea8036f5301c81a9e2fbd5ddbff5fd90 100644 ---- a/grub-core/term/i386/pc/console.c -+++ b/grub-core/term/i386/pc/console.c -@@ -204,7 +204,7 @@ static int - grub_console_getkey (struct grub_term_input *term __attribute__ ((unused))) - { - const grub_uint16_t bypass_table[] = { -- 0x0100 | '\e', 0x0f00 | '\t', 0x0e00 | '\b', 0x1c00 | '\r', 0x1c00 | '\n' -+ 0x0100 | GRUB_TERM_ESC, 0x0f00 | GRUB_TERM_TAB, 0x0e00 | GRUB_TERM_BACKSPACE, 0x1c00 | '\r', 0x1c00 | '\n' - }; - struct grub_bios_int_registers regs; - unsigned i; -diff --git a/grub-core/term/ps2.c b/grub-core/term/ps2.c -new file mode 100644 -index 0000000000000000000000000000000000000000..7ae4e9f2f8cd4a0ba4405c21581f906f7b458379 ---- /dev/null -+++ b/grub-core/term/ps2.c -@@ -0,0 +1,387 @@ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * Copyright (C) 2007,2008,2009 Free Software Foundation, Inc. -+ * -+ * GRUB is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation, either version 3 of the License, or -+ * (at your option) any later version. -+ * -+ * GRUB is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with GRUB. If not, see . -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+ -+#define KEYBOARD_LED_SCROLL (1 << 0) -+#define KEYBOARD_LED_NUM (1 << 1) -+#define KEYBOARD_LED_CAPS (1 << 2) -+ -+static const grub_uint8_t set1_mapping[128] = -+ { -+ /* 0x00 */ 0 /* Unused */, GRUB_KEYBOARD_KEY_ESCAPE, -+ /* 0x02 */ GRUB_KEYBOARD_KEY_1, GRUB_KEYBOARD_KEY_2, -+ /* 0x04 */ GRUB_KEYBOARD_KEY_3, GRUB_KEYBOARD_KEY_4, -+ /* 0x06 */ GRUB_KEYBOARD_KEY_5, GRUB_KEYBOARD_KEY_6, -+ /* 0x08 */ GRUB_KEYBOARD_KEY_7, GRUB_KEYBOARD_KEY_8, -+ /* 0x0a */ GRUB_KEYBOARD_KEY_9, GRUB_KEYBOARD_KEY_0, -+ /* 0x0c */ GRUB_KEYBOARD_KEY_DASH, GRUB_KEYBOARD_KEY_EQUAL, -+ /* 0x0e */ GRUB_KEYBOARD_KEY_BACKSPACE, GRUB_KEYBOARD_KEY_TAB, -+ /* 0x10 */ GRUB_KEYBOARD_KEY_Q, GRUB_KEYBOARD_KEY_W, -+ /* 0x12 */ GRUB_KEYBOARD_KEY_E, GRUB_KEYBOARD_KEY_R, -+ /* 0x14 */ GRUB_KEYBOARD_KEY_T, GRUB_KEYBOARD_KEY_Y, -+ /* 0x16 */ GRUB_KEYBOARD_KEY_U, GRUB_KEYBOARD_KEY_I, -+ /* 0x18 */ GRUB_KEYBOARD_KEY_O, GRUB_KEYBOARD_KEY_P, -+ /* 0x1a */ GRUB_KEYBOARD_KEY_LBRACKET, GRUB_KEYBOARD_KEY_RBRACKET, -+ /* 0x1c */ GRUB_KEYBOARD_KEY_ENTER, GRUB_KEYBOARD_KEY_LEFT_CTRL, -+ /* 0x1e */ GRUB_KEYBOARD_KEY_A, GRUB_KEYBOARD_KEY_S, -+ /* 0x20 */ GRUB_KEYBOARD_KEY_D, GRUB_KEYBOARD_KEY_F, -+ /* 0x22 */ GRUB_KEYBOARD_KEY_G, GRUB_KEYBOARD_KEY_H, -+ /* 0x24 */ GRUB_KEYBOARD_KEY_J, GRUB_KEYBOARD_KEY_K, -+ /* 0x26 */ GRUB_KEYBOARD_KEY_L, GRUB_KEYBOARD_KEY_SEMICOLON, -+ /* 0x28 */ GRUB_KEYBOARD_KEY_DQUOTE, GRUB_KEYBOARD_KEY_RQUOTE, -+ /* 0x2a */ GRUB_KEYBOARD_KEY_LEFT_SHIFT, GRUB_KEYBOARD_KEY_BACKSLASH, -+ /* 0x2c */ GRUB_KEYBOARD_KEY_Z, GRUB_KEYBOARD_KEY_X, -+ /* 0x2e */ GRUB_KEYBOARD_KEY_C, GRUB_KEYBOARD_KEY_V, -+ /* 0x30 */ GRUB_KEYBOARD_KEY_B, GRUB_KEYBOARD_KEY_N, -+ /* 0x32 */ GRUB_KEYBOARD_KEY_M, GRUB_KEYBOARD_KEY_COMMA, -+ /* 0x34 */ GRUB_KEYBOARD_KEY_DOT, GRUB_KEYBOARD_KEY_SLASH, -+ /* 0x36 */ GRUB_KEYBOARD_KEY_RIGHT_SHIFT, GRUB_KEYBOARD_KEY_NUMMUL, -+ /* 0x38 */ GRUB_KEYBOARD_KEY_LEFT_ALT, GRUB_KEYBOARD_KEY_SPACE, -+ /* 0x3a */ GRUB_KEYBOARD_KEY_CAPS_LOCK, GRUB_KEYBOARD_KEY_F1, -+ /* 0x3c */ GRUB_KEYBOARD_KEY_F2, GRUB_KEYBOARD_KEY_F3, -+ /* 0x3e */ GRUB_KEYBOARD_KEY_F4, GRUB_KEYBOARD_KEY_F5, -+ /* 0x40 */ GRUB_KEYBOARD_KEY_F6, GRUB_KEYBOARD_KEY_F7, -+ /* 0x42 */ GRUB_KEYBOARD_KEY_F8, GRUB_KEYBOARD_KEY_F9, -+ /* 0x44 */ GRUB_KEYBOARD_KEY_F10, GRUB_KEYBOARD_KEY_NUM_LOCK, -+ /* 0x46 */ GRUB_KEYBOARD_KEY_SCROLL_LOCK, GRUB_KEYBOARD_KEY_NUM7, -+ /* 0x48 */ GRUB_KEYBOARD_KEY_NUM8, GRUB_KEYBOARD_KEY_NUM9, -+ /* 0x4a */ GRUB_KEYBOARD_KEY_NUMMINUS, GRUB_KEYBOARD_KEY_NUM4, -+ /* 0x4c */ GRUB_KEYBOARD_KEY_NUM5, GRUB_KEYBOARD_KEY_NUM6, -+ /* 0x4e */ GRUB_KEYBOARD_KEY_NUMPLUS, GRUB_KEYBOARD_KEY_NUM1, -+ /* 0x50 */ GRUB_KEYBOARD_KEY_NUM2, GRUB_KEYBOARD_KEY_NUM3, -+ /* 0x52 */ GRUB_KEYBOARD_KEY_NUM0, GRUB_KEYBOARD_KEY_NUMDOT, -+ /* 0x54 */ 0, 0, -+ /* 0x56 */ GRUB_KEYBOARD_KEY_102ND, GRUB_KEYBOARD_KEY_F11, -+ /* 0x58 */ GRUB_KEYBOARD_KEY_F12, 0, -+ /* 0x5a */ 0, 0, -+ /* 0x5c */ 0, 0, -+ /* 0x5e */ 0, 0, -+ /* 0x60 */ 0, 0, -+ /* 0x62 */ 0, 0, -+ /* OLPC keys. Just mapped to normal keys. */ -+ /* 0x64 */ 0, GRUB_KEYBOARD_KEY_UP, -+ /* 0x66 */ GRUB_KEYBOARD_KEY_DOWN, GRUB_KEYBOARD_KEY_LEFT, -+ /* 0x68 */ GRUB_KEYBOARD_KEY_RIGHT, 0, -+ /* 0x6a */ 0, 0, -+ /* 0x6c */ 0, 0, -+ /* 0x6e */ 0, 0, -+ /* 0x70 */ 0, 0, -+ /* 0x72 */ 0, GRUB_KEYBOARD_KEY_JP_RO, -+ /* 0x74 */ 0, 0, -+ /* 0x76 */ 0, 0, -+ /* 0x78 */ 0, 0, -+ /* 0x7a */ 0, 0, -+ /* 0x7c */ 0, GRUB_KEYBOARD_KEY_JP_YEN, -+ /* 0x7e */ GRUB_KEYBOARD_KEY_KPCOMMA -+ }; -+ -+static const struct -+{ -+ grub_uint8_t from, to; -+} set1_e0_mapping[] = -+ { -+ {0x1c, GRUB_KEYBOARD_KEY_NUMENTER}, -+ {0x1d, GRUB_KEYBOARD_KEY_RIGHT_CTRL}, -+ {0x35, GRUB_KEYBOARD_KEY_NUMSLASH }, -+ {0x38, GRUB_KEYBOARD_KEY_RIGHT_ALT}, -+ {0x47, GRUB_KEYBOARD_KEY_HOME}, -+ {0x48, GRUB_KEYBOARD_KEY_UP}, -+ {0x49, GRUB_KEYBOARD_KEY_PPAGE}, -+ {0x4b, GRUB_KEYBOARD_KEY_LEFT}, -+ {0x4d, GRUB_KEYBOARD_KEY_RIGHT}, -+ {0x4f, GRUB_KEYBOARD_KEY_END}, -+ {0x50, GRUB_KEYBOARD_KEY_DOWN}, -+ {0x51, GRUB_KEYBOARD_KEY_NPAGE}, -+ {0x52, GRUB_KEYBOARD_KEY_INSERT}, -+ {0x53, GRUB_KEYBOARD_KEY_DELETE}, -+ }; -+ -+static const grub_uint8_t set2_mapping[256] = -+ { -+ /* 0x00 */ 0, GRUB_KEYBOARD_KEY_F9, -+ /* 0x02 */ 0, GRUB_KEYBOARD_KEY_F5, -+ /* 0x04 */ GRUB_KEYBOARD_KEY_F3, GRUB_KEYBOARD_KEY_F1, -+ /* 0x06 */ GRUB_KEYBOARD_KEY_F2, GRUB_KEYBOARD_KEY_F12, -+ /* 0x08 */ 0, GRUB_KEYBOARD_KEY_F10, -+ /* 0x0a */ GRUB_KEYBOARD_KEY_F8, GRUB_KEYBOARD_KEY_F6, -+ /* 0x0c */ GRUB_KEYBOARD_KEY_F4, GRUB_KEYBOARD_KEY_TAB, -+ /* 0x0e */ GRUB_KEYBOARD_KEY_RQUOTE, 0, -+ /* 0x10 */ 0, GRUB_KEYBOARD_KEY_LEFT_ALT, -+ /* 0x12 */ GRUB_KEYBOARD_KEY_LEFT_SHIFT, 0, -+ /* 0x14 */ GRUB_KEYBOARD_KEY_LEFT_CTRL, GRUB_KEYBOARD_KEY_Q, -+ /* 0x16 */ GRUB_KEYBOARD_KEY_1, 0, -+ /* 0x18 */ 0, 0, -+ /* 0x1a */ GRUB_KEYBOARD_KEY_Z, GRUB_KEYBOARD_KEY_S, -+ /* 0x1c */ GRUB_KEYBOARD_KEY_A, GRUB_KEYBOARD_KEY_W, -+ /* 0x1e */ GRUB_KEYBOARD_KEY_2, 0, -+ /* 0x20 */ 0, GRUB_KEYBOARD_KEY_C, -+ /* 0x22 */ GRUB_KEYBOARD_KEY_X, GRUB_KEYBOARD_KEY_D, -+ /* 0x24 */ GRUB_KEYBOARD_KEY_E, GRUB_KEYBOARD_KEY_4, -+ /* 0x26 */ GRUB_KEYBOARD_KEY_3, 0, -+ /* 0x28 */ 0, GRUB_KEYBOARD_KEY_SPACE, -+ /* 0x2a */ GRUB_KEYBOARD_KEY_V, GRUB_KEYBOARD_KEY_F, -+ /* 0x2c */ GRUB_KEYBOARD_KEY_T, GRUB_KEYBOARD_KEY_R, -+ /* 0x2e */ GRUB_KEYBOARD_KEY_5, 0, -+ /* 0x30 */ 0, GRUB_KEYBOARD_KEY_N, -+ /* 0x32 */ GRUB_KEYBOARD_KEY_B, GRUB_KEYBOARD_KEY_H, -+ /* 0x34 */ GRUB_KEYBOARD_KEY_G, GRUB_KEYBOARD_KEY_Y, -+ /* 0x36 */ GRUB_KEYBOARD_KEY_6, 0, -+ /* 0x38 */ 0, 0, -+ /* 0x3a */ GRUB_KEYBOARD_KEY_M, GRUB_KEYBOARD_KEY_J, -+ /* 0x3c */ GRUB_KEYBOARD_KEY_U, GRUB_KEYBOARD_KEY_7, -+ /* 0x3e */ GRUB_KEYBOARD_KEY_8, 0, -+ /* 0x40 */ 0, GRUB_KEYBOARD_KEY_COMMA, -+ /* 0x42 */ GRUB_KEYBOARD_KEY_K, GRUB_KEYBOARD_KEY_I, -+ /* 0x44 */ GRUB_KEYBOARD_KEY_O, GRUB_KEYBOARD_KEY_0, -+ /* 0x46 */ GRUB_KEYBOARD_KEY_9, 0, -+ /* 0x48 */ 0, GRUB_KEYBOARD_KEY_DOT, -+ /* 0x4a */ GRUB_KEYBOARD_KEY_SLASH, GRUB_KEYBOARD_KEY_L, -+ /* 0x4c */ GRUB_KEYBOARD_KEY_SEMICOLON, GRUB_KEYBOARD_KEY_P, -+ /* 0x4e */ GRUB_KEYBOARD_KEY_DASH, 0, -+ /* 0x50 */ 0, GRUB_KEYBOARD_KEY_JP_RO, -+ /* 0x52 */ GRUB_KEYBOARD_KEY_DQUOTE, 0, -+ /* 0x54 */ GRUB_KEYBOARD_KEY_LBRACKET, GRUB_KEYBOARD_KEY_EQUAL, -+ /* 0x56 */ 0, 0, -+ /* 0x58 */ GRUB_KEYBOARD_KEY_CAPS_LOCK, GRUB_KEYBOARD_KEY_RIGHT_SHIFT, -+ /* 0x5a */ GRUB_KEYBOARD_KEY_ENTER, GRUB_KEYBOARD_KEY_RBRACKET, -+ /* 0x5c */ 0, GRUB_KEYBOARD_KEY_BACKSLASH, -+ /* 0x5e */ 0, 0, -+ /* 0x60 */ 0, GRUB_KEYBOARD_KEY_102ND, -+ /* 0x62 */ 0, 0, -+ /* 0x64 */ 0, 0, -+ /* 0x66 */ GRUB_KEYBOARD_KEY_BACKSPACE, 0, -+ /* 0x68 */ 0, GRUB_KEYBOARD_KEY_NUM1, -+ /* 0x6a */ GRUB_KEYBOARD_KEY_JP_YEN, GRUB_KEYBOARD_KEY_NUM4, -+ /* 0x6c */ GRUB_KEYBOARD_KEY_NUM7, GRUB_KEYBOARD_KEY_KPCOMMA, -+ /* 0x6e */ 0, 0, -+ /* 0x70 */ GRUB_KEYBOARD_KEY_NUM0, GRUB_KEYBOARD_KEY_NUMDOT, -+ /* 0x72 */ GRUB_KEYBOARD_KEY_NUM2, GRUB_KEYBOARD_KEY_NUM5, -+ /* 0x74 */ GRUB_KEYBOARD_KEY_NUM6, GRUB_KEYBOARD_KEY_NUM8, -+ /* 0x76 */ GRUB_KEYBOARD_KEY_ESCAPE, GRUB_KEYBOARD_KEY_NUM_LOCK, -+ /* 0x78 */ GRUB_KEYBOARD_KEY_F11, GRUB_KEYBOARD_KEY_NUMPLUS, -+ /* 0x7a */ GRUB_KEYBOARD_KEY_NUM3, GRUB_KEYBOARD_KEY_NUMMINUS, -+ /* 0x7c */ GRUB_KEYBOARD_KEY_NUMMUL, GRUB_KEYBOARD_KEY_NUM9, -+ /* 0x7e */ GRUB_KEYBOARD_KEY_SCROLL_LOCK, 0, -+ /* 0x80 */ 0, 0, -+ /* 0x82 */ 0, GRUB_KEYBOARD_KEY_F7, -+ }; -+ -+static const struct -+{ -+ grub_uint8_t from, to; -+} set2_e0_mapping[] = -+ { -+ {0x11, GRUB_KEYBOARD_KEY_RIGHT_ALT}, -+ {0x14, GRUB_KEYBOARD_KEY_RIGHT_CTRL}, -+ {0x4a, GRUB_KEYBOARD_KEY_NUMSLASH}, -+ {0x5a, GRUB_KEYBOARD_KEY_NUMENTER}, -+ {0x69, GRUB_KEYBOARD_KEY_END}, -+ {0x6b, GRUB_KEYBOARD_KEY_LEFT}, -+ {0x6c, GRUB_KEYBOARD_KEY_HOME}, -+ {0x70, GRUB_KEYBOARD_KEY_INSERT}, -+ {0x71, GRUB_KEYBOARD_KEY_DELETE}, -+ {0x72, GRUB_KEYBOARD_KEY_DOWN}, -+ {0x74, GRUB_KEYBOARD_KEY_RIGHT}, -+ {0x75, GRUB_KEYBOARD_KEY_UP}, -+ {0x7a, GRUB_KEYBOARD_KEY_NPAGE}, -+ {0x7d, GRUB_KEYBOARD_KEY_PPAGE}, -+ }; -+ -+static int -+fetch_key (struct grub_ps2_state *ps2_state, grub_uint8_t at_key, int *is_break) -+{ -+ int was_ext = 0; -+ int ret = 0; -+ -+ /* May happen if no keyboard is connected. Just ignore this. */ -+ if (at_key == 0xff) -+ return -1; -+ if (at_key == 0xe0) -+ { -+ ps2_state->e0_received = 1; -+ return -1; -+ } -+ -+ if ((ps2_state->current_set == 2 || ps2_state->current_set == 3) && at_key == 0xf0) -+ { -+ ps2_state->f0_received = 1; -+ return -1; -+ } -+ -+ /* Setting LEDs may generate ACKs. */ -+ if (at_key == GRUB_AT_ACK) -+ return -1; -+ -+ was_ext = ps2_state->e0_received; -+ ps2_state->e0_received = 0; -+ -+ switch (ps2_state->current_set) -+ { -+ case 1: -+ *is_break = !!(at_key & 0x80); -+ if (!was_ext) -+ ret = set1_mapping[at_key & 0x7f]; -+ else -+ { -+ unsigned i; -+ for (i = 0; i < ARRAY_SIZE (set1_e0_mapping); i++) -+ if (set1_e0_mapping[i].from == (at_key & 0x7f)) -+ { -+ ret = set1_e0_mapping[i].to; -+ break; -+ } -+ } -+ break; -+ case 2: -+ *is_break = ps2_state->f0_received; -+ ps2_state->f0_received = 0; -+ if (!was_ext) -+ ret = set2_mapping[at_key]; -+ else -+ { -+ unsigned i; -+ for (i = 0; i < ARRAY_SIZE (set2_e0_mapping); i++) -+ if (set2_e0_mapping[i].from == at_key) -+ { -+ ret = set2_e0_mapping[i].to; -+ break; -+ } -+ } -+ break; -+ default: -+ return -1; -+ } -+ if (!ret) -+ { -+ if (was_ext) -+ grub_dprintf ("atkeyb", "Unknown key 0xe0+0x%02x from set %d\n", -+ at_key, ps2_state->current_set); -+ else -+ grub_dprintf ("atkeyb", "Unknown key 0x%02x from set %d\n", -+ at_key, ps2_state->current_set); -+ return -1; -+ } -+ return ret; -+} -+ -+/* FIXME: This should become an interrupt service routine. For now -+ it's just used to catch events from control keys. */ -+static int -+grub_keyboard_isr (struct grub_ps2_state *ps2_state, -+ grub_keyboard_key_t key, int is_break) -+{ -+ if (!is_break) -+ switch (key) -+ { -+ case GRUB_KEYBOARD_KEY_LEFT_SHIFT: -+ ps2_state->at_keyboard_status |= GRUB_TERM_STATUS_LSHIFT; -+ return 1; -+ case GRUB_KEYBOARD_KEY_RIGHT_SHIFT: -+ ps2_state->at_keyboard_status |= GRUB_TERM_STATUS_RSHIFT; -+ return 1; -+ case GRUB_KEYBOARD_KEY_LEFT_CTRL: -+ ps2_state->at_keyboard_status |= GRUB_TERM_STATUS_LCTRL; -+ return 1; -+ case GRUB_KEYBOARD_KEY_RIGHT_CTRL: -+ ps2_state->at_keyboard_status |= GRUB_TERM_STATUS_RCTRL; -+ return 1; -+ case GRUB_KEYBOARD_KEY_RIGHT_ALT: -+ ps2_state->at_keyboard_status |= GRUB_TERM_STATUS_RALT; -+ return 1; -+ case GRUB_KEYBOARD_KEY_LEFT_ALT: -+ ps2_state->at_keyboard_status |= GRUB_TERM_STATUS_LALT; -+ return 1; -+ default: -+ return 0; -+ } -+ else -+ switch (key) -+ { -+ case GRUB_KEYBOARD_KEY_LEFT_SHIFT: -+ ps2_state->at_keyboard_status &= ~GRUB_TERM_STATUS_LSHIFT; -+ return 1; -+ case GRUB_KEYBOARD_KEY_RIGHT_SHIFT: -+ ps2_state->at_keyboard_status &= ~GRUB_TERM_STATUS_RSHIFT; -+ return 1; -+ case GRUB_KEYBOARD_KEY_LEFT_CTRL: -+ ps2_state->at_keyboard_status &= ~GRUB_TERM_STATUS_LCTRL; -+ return 1; -+ case GRUB_KEYBOARD_KEY_RIGHT_CTRL: -+ ps2_state->at_keyboard_status &= ~GRUB_TERM_STATUS_RCTRL; -+ return 1; -+ case GRUB_KEYBOARD_KEY_RIGHT_ALT: -+ ps2_state->at_keyboard_status &= ~GRUB_TERM_STATUS_RALT; -+ return 1; -+ case GRUB_KEYBOARD_KEY_LEFT_ALT: -+ ps2_state->at_keyboard_status &= ~GRUB_TERM_STATUS_LALT; -+ return 1; -+ default: -+ return 0; -+ } -+} -+ -+/* If there is a key pending, return it; otherwise return GRUB_TERM_NO_KEY. */ -+int -+grub_ps2_process_incoming_byte (struct grub_ps2_state *ps2_state, -+ grub_uint8_t at_key) -+{ -+ int code; -+ int is_break = 0; -+ -+ code = fetch_key (ps2_state, at_key, &is_break); -+ if (code == -1) -+ return GRUB_TERM_NO_KEY; -+ -+ if (grub_keyboard_isr (ps2_state, code, is_break)) -+ return GRUB_TERM_NO_KEY; -+ if (is_break) -+ return GRUB_TERM_NO_KEY; -+#ifdef DEBUG_AT_KEYBOARD -+ grub_dprintf ("atkeyb", "Detected key 0x%x\n", code); -+#endif -+ switch (code) -+ { -+ case GRUB_KEYBOARD_KEY_CAPS_LOCK: -+ ps2_state->at_keyboard_status ^= GRUB_TERM_STATUS_CAPS; -+ ps2_state->led_status ^= KEYBOARD_LED_CAPS; -+ -+#ifdef DEBUG_AT_KEYBOARD -+ grub_dprintf ("atkeyb", "caps_lock = %d\n", !!(ps2_state->at_keyboard_status & GRUB_KEYBOARD_STATUS_CAPS_LOCK)); -+#endif -+ return GRUB_TERM_NO_KEY; -+ case GRUB_KEYBOARD_KEY_NUM_LOCK: -+ ps2_state->at_keyboard_status ^= GRUB_TERM_STATUS_NUM; -+ ps2_state->led_status ^= KEYBOARD_LED_NUM; -+ -+#ifdef DEBUG_AT_KEYBOARD -+ grub_dprintf ("atkeyb", "num_lock = %d\n", !!(ps2_state->at_keyboard_status & GRUB_KEYBOARD_STATUS_NUM_LOCK)); -+#endif -+ return GRUB_TERM_NO_KEY; -+ case GRUB_KEYBOARD_KEY_SCROLL_LOCK: -+ ps2_state->at_keyboard_status ^= GRUB_TERM_STATUS_SCROLL; -+ ps2_state->led_status ^= KEYBOARD_LED_SCROLL; -+ return GRUB_TERM_NO_KEY; -+ default: -+ return grub_term_map_key (code, ps2_state->at_keyboard_status); -+ } -+} -diff --git a/grub-core/term/terminfo.c b/grub-core/term/terminfo.c -index f0d3e3debc60aa8dd04a5643a8a0537ffb88ec26..d317efa368d846963743a243fd672026a2221933 100644 ---- a/grub-core/term/terminfo.c -+++ b/grub-core/term/terminfo.c -@@ -426,12 +426,12 @@ grub_terminfo_readkey (struct grub_term_input *term, int *keys, int *len, - } - *len = 1; - keys[0] = c; -- if (c != ANSI_CSI && c != '\e') -+ if (c != ANSI_CSI && c != GRUB_TERM_ESC) - { - /* Backspace: Ctrl-h. */ - if (c == 0x7f) -- c = '\b'; -- if (c < 0x20 && c != '\t' && c!= '\b' && c != '\n' && c != '\r') -+ c = GRUB_TERM_BACKSPACE; -+ if (c < 0x20 && c != GRUB_TERM_TAB && c!= GRUB_TERM_BACKSPACE && c != '\n' && c != '\r') - c = GRUB_TERM_CTRL | (c - 1 + 'a'); - *len = 1; - keys[0] = c; -@@ -487,7 +487,7 @@ grub_terminfo_readkey (struct grub_term_input *term, int *keys, int *len, - GRUB_TERM_KEY_HOME, GRUB_TERM_KEY_END }; - unsigned i; - -- if (c == '\e') -+ if (c == GRUB_TERM_ESC) - { - CONTINUE_READ; - -@@ -606,7 +606,7 @@ grub_terminfo_getkey (struct grub_term_input *termi) - &data->npending, data->readkey); - - #if defined(__powerpc__) && defined(GRUB_MACHINE_IEEE1275) -- if (data->npending == 1 && data->input_buf[0] == '\e' -+ if (data->npending == 1 && data->input_buf[0] == GRUB_TERM_ESC - && grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_BROKEN_REPEAT) - && grub_get_time_ms () - data->last_key_time < 1000 - && (data->last_key & GRUB_TERM_EXTENDED)) -diff --git a/grub-core/tests/cmdline_cat_test.c b/grub-core/tests/cmdline_cat_test.c -index f1e21439e2be229d386cb310d62164fc9a5f4f92..baea7688a1d3c49d37a2c03e585109ccd04328f8 100644 ---- a/grub-core/tests/cmdline_cat_test.c -+++ b/grub-core/tests/cmdline_cat_test.c -@@ -103,7 +103,7 @@ cmdline_cat_test (void) - '/', 't', 'e', 's', 't', '.', - 't', 'x', 't', '\n', - GRUB_TERM_NO_KEY, -- GRUB_TERM_NO_KEY, '\e'}, -+ GRUB_TERM_NO_KEY, GRUB_TERM_ESC}, - 23); - - grub_video_checksum ("cmdline_cat"); -diff --git a/grub-core/tests/gfxterm_menu.c b/grub-core/tests/gfxterm_menu.c -index 8f63dc27a35bd769ecb5d94599de3ba9e97cf5dc..12836fb96598d98b5cbf371a953e6ec702eb50de 100644 ---- a/grub-core/tests/gfxterm_menu.c -+++ b/grub-core/tests/gfxterm_menu.c -@@ -146,7 +146,7 @@ gfxterm_menu (void) - return; - } - grub_terminal_input_fake_sequence ((int []) { -1, -1, -1, GRUB_TERM_KEY_DOWN, -1, 'e', -- -1, GRUB_TERM_KEY_RIGHT, -1, 'x', -1, '\e', -1, '\e' }, 14); -+ -1, GRUB_TERM_KEY_RIGHT, -1, 'x', -1, GRUB_TERM_ESC, -1, GRUB_TERM_ESC }, 14); - - grub_video_checksum (tests[j].name); - -diff --git a/grub-core/tests/lib/functional_test.c b/grub-core/tests/lib/functional_test.c -index d4822a12456525e4abc5f587bc897364db4e52b7..96781fb39b5f37b201345f60fe4297629bb672cf 100644 ---- a/grub-core/tests/lib/functional_test.c -+++ b/grub-core/tests/lib/functional_test.c -@@ -26,14 +26,23 @@ GRUB_MOD_LICENSE ("GPLv3+"); - - static grub_err_t - grub_functional_test (grub_extcmd_context_t ctxt __attribute__ ((unused)), -- int argc __attribute__ ((unused)), -- char **args __attribute__ ((unused))) -+ int argc, -+ char **args) - { - grub_test_t test; - int ok = 1; -+ int i; - - FOR_LIST_ELEMENTS (test, grub_test_list) - { -+ if (argc != 0) -+ { -+ for (i = 0; i < argc; i++) -+ if (grub_strcmp(args[i], test->name) == 0) -+ break; -+ if (i == argc) -+ continue; -+ } - grub_errno = 0; - ok = ok && !grub_test_run (test); - grub_errno = 0; -diff --git a/grub-core/video/i386/coreboot/cbfb.c b/grub-core/video/coreboot/cbfb.c -similarity index 99% -rename from grub-core/video/i386/coreboot/cbfb.c -rename to grub-core/video/coreboot/cbfb.c -index dede0c37ea3e8a8948cd6535d26d008e117206bc..9af81fa5b01b63677d97ba9a242e60080df84e5a 100644 ---- a/grub-core/video/i386/coreboot/cbfb.c -+++ b/grub-core/video/coreboot/cbfb.c -@@ -25,7 +25,7 @@ - #include - #include - #include --#include -+#include - #include - - struct grub_linuxbios_table_framebuffer *grub_video_coreboot_fbtable; -diff --git a/grub-core/video/efi_uga.c b/grub-core/video/efi_uga.c -index 464ede874daff480fb4199927cb30d48f0558e8b..044af1d20d38f08e3b5c5dcec4281c0b452cf8ea 100644 ---- a/grub-core/video/efi_uga.c -+++ b/grub-core/video/efi_uga.c -@@ -94,10 +94,19 @@ static int - find_card (grub_pci_device_t dev, grub_pci_id_t pciid, void *data) - { - struct find_framebuf_ctx *ctx = data; -- grub_pci_address_t addr; -+ grub_pci_address_t addr, rcaddr; -+ grub_uint32_t subclass; - - addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS); -- if (grub_pci_read (addr) >> 24 == 0x3) -+ subclass = (grub_pci_read (addr) >> 16) & 0xffff; -+ -+ if (subclass != GRUB_PCI_CLASS_SUBCLASS_VGA) -+ return 0; -+ -+ /* Enable MEM address spaces */ -+ rcaddr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND); -+ grub_pci_write_word (rcaddr, grub_pci_read_word (rcaddr) | GRUB_PCI_COMMAND_MEM_ENABLED); -+ - { - int i; - -diff --git a/tests/printf_unit_test.c b/tests/printf_unit_test.c -index d7b12c6dbee6e84ace9d9f81d476622194810b26..098c29fd9ce2d28a5b83b74afc0f9e40b7c401ec 100644 ---- a/tests/printf_unit_test.c -+++ b/tests/printf_unit_test.c -@@ -23,6 +23,10 @@ - - #define MSG "printf test failed: %s, %s", real, expected - -+#if defined(__GNUC__) && __GNUC__ >= 7 -+#pragma GCC diagnostic ignored "-Wformat-truncation=" -+#endif -+ - static void - printf_test (void) - { -diff --git a/util/grub-install-common.c b/util/grub-install-common.c -index 452b230daedc3db0296cab014e89ddacf1c21347..0a2e24a79f11916527650d124e38c6184c4ceb93 100644 ---- a/util/grub-install-common.c -+++ b/util/grub-install-common.c -@@ -73,6 +73,7 @@ grub_install_help_filter (int key, const char *text, - - static int (*compress_func) (const char *src, const char *dest) = NULL; - char *grub_install_copy_buffer; -+static char *dtb; - - int - grub_install_copy_file (const char *src, -@@ -364,6 +365,11 @@ grub_install_parse (int key, char *arg) - case GRUB_INSTALL_OPTIONS_INSTALL_FONTS: - handle_install_list (&install_fonts, arg, 0); - return 1; -+ case GRUB_INSTALL_OPTIONS_DTB: -+ if (dtb) -+ free (dtb); -+ dtb = xstrdup (arg); -+ return 1; - case GRUB_INSTALL_OPTIONS_INSTALL_COMPRESS: - if (strcmp (arg, "no") == 0 - || strcmp (arg, "none") == 0) -@@ -486,9 +492,10 @@ grub_install_make_image_wrap_file (const char *dir, const char *prefix, - - grub_util_info ("grub-mkimage --directory '%s' --prefix '%s'" - " --output '%s' " -+ " --dtb '%s' " - "--format '%s' --compression '%s' %s %s\n", - dir, prefix, -- outname, mkimage_target, -+ outname, dtb ? : "", mkimage_target, - compnames[compression], note ? "--note" : "", s); - free (s); - -@@ -499,7 +506,7 @@ grub_install_make_image_wrap_file (const char *dir, const char *prefix, - grub_install_generate_image (dir, prefix, fp, outname, - modules.entries, memdisk_path, - pubkeys, npubkeys, config_path, tgt, -- note, compression); -+ note, compression, dtb); - while (dc--) - grub_install_pop_module (); - } -@@ -585,6 +592,7 @@ copy_all (const char *srcd, - grub_util_fd_closedir (d); - } - -+#if !(defined (GRUB_UTIL) && defined(ENABLE_NLS) && ENABLE_NLS) - static const char * - get_localedir (void) - { -@@ -639,6 +647,59 @@ copy_locales (const char *dstd) - } - grub_util_fd_closedir (d); - } -+#endif -+ -+static void -+grub_install_copy_nls(const char *src __attribute__ ((unused)), -+ const char *dst __attribute__ ((unused))) -+{ -+#if !(defined (GRUB_UTIL) && defined(ENABLE_NLS) && ENABLE_NLS) -+ char *dst_locale; -+ -+ dst_locale = grub_util_path_concat (2, dst, "locale"); -+ grub_install_mkdir_p (dst_locale); -+ clean_grub_dir (dst_locale); -+ -+ if (install_locales.is_default) -+ { -+ char *srcd = grub_util_path_concat (2, src, "po"); -+ copy_by_ext (srcd, dst_locale, ".mo", 0); -+ copy_locales (dst_locale); -+ free (srcd); -+ } -+ else -+ { -+ size_t i; -+ const char *locale_dir = get_localedir (); -+ -+ for (i = 0; i < install_locales.n_entries; i++) -+ { -+ char *srcf = grub_util_path_concat_ext (3, src, "po", -+ install_locales.entries[i], -+ ".mo"); -+ char *dstf = grub_util_path_concat_ext (2, dst_locale, -+ install_locales.entries[i], -+ ".mo"); -+ if (grub_install_compress_file (srcf, dstf, 0)) -+ { -+ free (srcf); -+ free (dstf); -+ continue; -+ } -+ free (srcf); -+ srcf = grub_util_path_concat_ext (4, locale_dir, -+ install_locales.entries[i], -+ "LC_MESSAGES", PACKAGE, ".mo"); -+ if (grub_install_compress_file (srcf, dstf, 0) == 0) -+ grub_util_error (_("cannot find locale `%s'"), -+ install_locales.entries[i]); -+ free (srcf); -+ free (dstf); -+ } -+ } -+ free (dst_locale); -+#endif -+} - - static struct - { -@@ -666,6 +727,7 @@ static struct - [GRUB_INSTALL_PLATFORM_ARM_EFI] = { "arm", "efi" }, - [GRUB_INSTALL_PLATFORM_ARM64_EFI] = { "arm64", "efi" }, - [GRUB_INSTALL_PLATFORM_ARM_UBOOT] = { "arm", "uboot" }, -+ [GRUB_INSTALL_PLATFORM_ARM_COREBOOT] = { "arm", "coreboot" }, - }; - - char * -@@ -723,7 +785,7 @@ grub_install_copy_files (const char *src, - const char *dst, - enum grub_install_plat platid) - { -- char *dst_platform, *dst_locale, *dst_fonts; -+ char *dst_platform, *dst_fonts; - const char *pkgdatadir = grub_util_get_pkgdatadir (); - char *themes_dir; - -@@ -734,13 +796,12 @@ grub_install_copy_files (const char *src, - dst_platform = grub_util_path_concat (2, dst, platform); - free (platform); - } -- dst_locale = grub_util_path_concat (2, dst, "locale"); - dst_fonts = grub_util_path_concat (2, dst, "fonts"); - grub_install_mkdir_p (dst_platform); -- grub_install_mkdir_p (dst_locale); - clean_grub_dir (dst); - clean_grub_dir (dst_platform); -- clean_grub_dir (dst_locale); -+ -+ grub_install_copy_nls(src, dst); - - if (install_modules.is_default) - copy_by_ext (src, dst_platform, ".mod", 1); -@@ -789,50 +850,6 @@ grub_install_copy_files (const char *src, - free (dstf); - } - -- if (install_locales.is_default) -- { -- char *srcd = grub_util_path_concat (2, src, "po"); -- copy_by_ext (srcd, dst_locale, ".mo", 0); -- copy_locales (dst_locale); -- free (srcd); -- } -- else -- { -- const char *locale_dir = get_localedir (); -- -- for (i = 0; i < install_locales.n_entries; i++) -- { -- char *srcf = grub_util_path_concat_ext (3, src, -- "po", -- install_locales.entries[i], -- ".mo"); -- char *dstf = grub_util_path_concat_ext (2, dst_locale, -- install_locales.entries[i], -- ".mo"); -- if (grub_install_compress_file (srcf, dstf, 0)) -- { -- free (srcf); -- free (dstf); -- continue; -- } -- free (srcf); -- srcf = grub_util_path_concat_ext (4, -- locale_dir, -- install_locales.entries[i], -- "LC_MESSAGES", -- PACKAGE, -- ".mo"); -- if (grub_install_compress_file (srcf, dstf, 0)) -- { -- free (srcf); -- free (dstf); -- continue; -- } -- grub_util_error (_("cannot find locale `%s'"), -- install_locales.entries[i]); -- } -- } -- - if (install_themes.is_default) - { - install_themes.is_default = 0; -@@ -895,7 +912,6 @@ grub_install_copy_files (const char *src, - } - - free (dst_platform); -- free (dst_locale); - free (dst_fonts); - } - -diff --git a/util/grub-install.c b/util/grub-install.c -index 9074d3e9e52d2a2e215a10b2f8b3cf627ca80db3..78d0138cb0a8c891f8140f1804d68d275eb690f6 100644 ---- a/util/grub-install.c -+++ b/util/grub-install.c -@@ -486,6 +486,7 @@ have_bootdev (enum grub_install_plat pl) - - case GRUB_INSTALL_PLATFORM_I386_QEMU: - case GRUB_INSTALL_PLATFORM_I386_COREBOOT: -+ case GRUB_INSTALL_PLATFORM_ARM_COREBOOT: - case GRUB_INSTALL_PLATFORM_I386_MULTIBOOT: - case GRUB_INSTALL_PLATFORM_MIPSEL_QEMU_MIPS: - case GRUB_INSTALL_PLATFORM_MIPS_QEMU_MIPS: -@@ -713,7 +714,7 @@ is_prep_partition (grub_device_t dev) - if (grub_disk_read (dev->disk, p->offset, p->index, - sizeof (gptdata), &gptdata) == 0) - { -- const grub_gpt_part_type_t template = { -+ const grub_gpt_part_guid_t template = { - grub_cpu_to_le32_compile_time (0x9e1a2d38), - grub_cpu_to_le16_compile_time (0xc612), - grub_cpu_to_le16_compile_time (0x4316), -@@ -911,6 +912,7 @@ main (int argc, char *argv[]) - - case GRUB_INSTALL_PLATFORM_I386_QEMU: - case GRUB_INSTALL_PLATFORM_I386_COREBOOT: -+ case GRUB_INSTALL_PLATFORM_ARM_COREBOOT: - case GRUB_INSTALL_PLATFORM_I386_MULTIBOOT: - case GRUB_INSTALL_PLATFORM_MIPSEL_LOONGSON: - case GRUB_INSTALL_PLATFORM_MIPSEL_QEMU_MIPS: -@@ -946,6 +948,7 @@ main (int argc, char *argv[]) - case GRUB_INSTALL_PLATFORM_ARM_UBOOT: - case GRUB_INSTALL_PLATFORM_I386_QEMU: - case GRUB_INSTALL_PLATFORM_I386_COREBOOT: -+ case GRUB_INSTALL_PLATFORM_ARM_COREBOOT: - case GRUB_INSTALL_PLATFORM_I386_MULTIBOOT: - case GRUB_INSTALL_PLATFORM_MIPSEL_LOONGSON: - case GRUB_INSTALL_PLATFORM_MIPSEL_QEMU_MIPS: -@@ -1448,6 +1451,7 @@ main (int argc, char *argv[]) - case GRUB_INSTALL_PLATFORM_MIPSEL_LOONGSON: - case GRUB_INSTALL_PLATFORM_I386_QEMU: - case GRUB_INSTALL_PLATFORM_I386_COREBOOT: -+ case GRUB_INSTALL_PLATFORM_ARM_COREBOOT: - case GRUB_INSTALL_PLATFORM_I386_MULTIBOOT: - case GRUB_INSTALL_PLATFORM_MIPSEL_QEMU_MIPS: - case GRUB_INSTALL_PLATFORM_MIPS_QEMU_MIPS: -@@ -1468,6 +1472,7 @@ main (int argc, char *argv[]) - { - grub_util_fprint_full_disk_name (load_cfg_f, g, dev); - fprintf (load_cfg_f, " "); -+ free (g); - } - if (dev != grub_dev) - grub_device_close (dev); -@@ -1542,6 +1547,7 @@ main (int argc, char *argv[]) - break; - - case GRUB_INSTALL_PLATFORM_I386_COREBOOT: -+ case GRUB_INSTALL_PLATFORM_ARM_COREBOOT: - case GRUB_INSTALL_PLATFORM_I386_MULTIBOOT: - case GRUB_INSTALL_PLATFORM_I386_IEEE1275: - case GRUB_INSTALL_PLATFORM_POWERPC_IEEE1275: -@@ -1629,6 +1635,7 @@ main (int argc, char *argv[]) - case GRUB_INSTALL_PLATFORM_MIPSEL_QEMU_MIPS: - case GRUB_INSTALL_PLATFORM_MIPS_QEMU_MIPS: - case GRUB_INSTALL_PLATFORM_I386_COREBOOT: -+ case GRUB_INSTALL_PLATFORM_ARM_COREBOOT: - case GRUB_INSTALL_PLATFORM_I386_MULTIBOOT: - case GRUB_INSTALL_PLATFORM_I386_PC: - case GRUB_INSTALL_PLATFORM_MIPSEL_ARC: -@@ -1841,9 +1848,13 @@ main (int argc, char *argv[]) - if (!removable && update_nvram) - { - /* Try to make this image bootable using the EFI Boot Manager, if available. */ -- grub_install_register_efi (efidir_grub_dev, -- "\\System\\Library\\CoreServices", -- efi_distributor); -+ int ret; -+ ret = grub_install_register_efi (efidir_grub_dev, -+ "\\System\\Library\\CoreServices", -+ efi_distributor); -+ if (ret) -+ grub_util_error (_("efibootmgr failed to register the boot entry: %s"), -+ strerror (ret)); - } - - grub_device_close (ins_dev); -@@ -1864,6 +1875,7 @@ main (int argc, char *argv[]) - { - char * efifile_path; - char * part; -+ int ret; - - /* Try to make this image bootable using the EFI Boot Manager, if available. */ - if (!efi_distributor || efi_distributor[0] == '\0') -@@ -1880,8 +1892,11 @@ main (int argc, char *argv[]) - efidir_grub_dev->disk->name, - (part ? ",": ""), (part ? : "")); - grub_free (part); -- grub_install_register_efi (efidir_grub_dev, -- efifile_path, efi_distributor); -+ ret = grub_install_register_efi (efidir_grub_dev, -+ efifile_path, efi_distributor); -+ if (ret) -+ grub_util_error (_("efibootmgr failed to register the boot entry: %s"), -+ strerror (ret)); - } - break; - -@@ -1889,6 +1904,7 @@ main (int argc, char *argv[]) - case GRUB_INSTALL_PLATFORM_MIPSEL_QEMU_MIPS: - case GRUB_INSTALL_PLATFORM_MIPS_QEMU_MIPS: - case GRUB_INSTALL_PLATFORM_I386_COREBOOT: -+ case GRUB_INSTALL_PLATFORM_ARM_COREBOOT: - case GRUB_INSTALL_PLATFORM_I386_MULTIBOOT: - case GRUB_INSTALL_PLATFORM_MIPSEL_ARC: - case GRUB_INSTALL_PLATFORM_ARM_UBOOT: -diff --git a/util/grub-mkimage.c b/util/grub-mkimage.c -index aba19d21b9a774e63ad49f166554d90f8c667e36..98d24cc06ea57b88a4f02f38f177f44ec4f38f3f 100644 ---- a/util/grub-mkimage.c -+++ b/util/grub-mkimage.c -@@ -71,6 +71,7 @@ static struct argp_option options[] = { - N_("embed FILE as a memdisk image\n" - "Implies `-p (memdisk)/boot/grub' and overrides any prefix supplied previously," - " but the prefix itself can be overridden by later options"), 0}, -+ {"dtb", 'D', N_("FILE"), 0, N_("embed FILE as a device tree (DTB)\n"), 0}, - /* TRANSLATORS: "embed" is a verb (command description). "*/ - {"config", 'c', N_("FILE"), 0, N_("embed FILE as an early config"), 0}, - /* TRANSLATORS: "embed" is a verb (command description). "*/ -@@ -117,6 +118,7 @@ struct arguments - char *dir; - char *prefix; - char *memdisk; -+ char *dtb; - char **pubkeys; - size_t npubkeys; - char *font; -@@ -176,6 +178,13 @@ argp_parser (int key, char *arg, struct argp_state *state) - arguments->prefix = xstrdup ("(memdisk)/boot/grub"); - break; - -+ case 'D': -+ if (arguments->dtb) -+ free (arguments->dtb); -+ -+ arguments->dtb = xstrdup (arg); -+ break; -+ - case 'k': - arguments->pubkeys = xrealloc (arguments->pubkeys, - sizeof (arguments->pubkeys[0]) -@@ -300,7 +309,7 @@ main (int argc, char *argv[]) - arguments.memdisk, arguments.pubkeys, - arguments.npubkeys, arguments.config, - arguments.image_target, arguments.note, -- arguments.comp); -+ arguments.comp, arguments.dtb); - - grub_util_file_sync (fp); - fclose (fp); -diff --git a/util/grub-mkimage32.c b/util/grub-mkimage32.c -index 9b31397bc40b95b69a1edc4f2d4c4b5d6eaa63cd..1f2ccccd225bbbb32e7e38801ddafeb90d9a69bb 100644 ---- a/util/grub-mkimage32.c -+++ b/util/grub-mkimage32.c -@@ -19,4 +19,6 @@ - # define ELF_ST_TYPE(val) ELF32_ST_TYPE(val) - #define XEN_NOTE_SIZE 132 - -+#ifndef GRUB_MKIMAGEXX - #include "grub-mkimagexx.c" -+#endif -diff --git a/util/grub-mkimage64.c b/util/grub-mkimage64.c -index d83345924705353b3c20a1e4dd087371ec5383ec..4ff72a625e0030d05cee0675a481b0803cda081e 100644 ---- a/util/grub-mkimage64.c -+++ b/util/grub-mkimage64.c -@@ -19,4 +19,6 @@ - # define ELF_ST_TYPE(val) ELF64_ST_TYPE(val) - #define XEN_NOTE_SIZE 120 - -+#ifndef GRUB_MKIMAGEXX - #include "grub-mkimagexx.c" -+#endif -diff --git a/util/grub-mkimagexx.c b/util/grub-mkimagexx.c -index e63f148e48cf6f66852b15063405f81371d95ae9..a483c674c4908bca02ecda73de78d04456667a37 100644 ---- a/util/grub-mkimagexx.c -+++ b/util/grub-mkimagexx.c -@@ -50,6 +50,15 @@ - - #pragma GCC diagnostic ignored "-Wcast-align" - -+#define GRUB_MKIMAGEXX -+#if !defined(MKIMAGE_ELF32) && !defined(MKIMAGE_ELF64) -+#if __SIZEOF_POINTER__ == 8 -+#include "grub-mkimage64.c" -+#else -+#include "grub-mkimage32.c" -+#endif -+#endif -+ - /* These structures are defined according to the CHRP binding to IEEE1275, - "Client Program Format" section. */ - -@@ -84,10 +93,22 @@ struct fixup_block_list - - #define ALIGN_ADDR(x) (ALIGN_UP((x), image_target->voidp_sizeof)) - -+struct section_metadata -+{ -+ Elf_Half num_sections; -+ Elf_Shdr *sections; -+ Elf_Addr *addrs; -+ Elf_Addr *vaddrs; -+ Elf_Half section_entsize; -+ Elf_Shdr *symtab; -+ const char *strtab; -+}; -+ - static int - is_relocatable (const struct grub_install_image_target_desc *image_target) - { -- return image_target->id == IMAGE_EFI || image_target->id == IMAGE_UBOOT; -+ return image_target->id == IMAGE_EFI || image_target->id == IMAGE_UBOOT -+ || (image_target->id == IMAGE_COREBOOT && image_target->elf_target == EM_ARM); - } - - #ifdef MKIMAGE_ELF32 -@@ -185,8 +206,8 @@ grub_arm_reloc_jump24 (grub_uint32_t *target, Elf32_Addr sym_addr) - void - SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc *image_target, - int note, char **core_img, size_t *core_size, -- Elf_Addr target_addr, grub_size_t align, -- size_t kernel_size, size_t bss_size) -+ Elf_Addr target_addr, -+ struct grub_mkimage_layout *layout) - { - char *elf_img; - size_t program_size; -@@ -214,7 +235,7 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc - footer_size += XEN_NOTE_SIZE; - } - header_size = ALIGN_UP (sizeof (*ehdr) + phnum * sizeof (*phdr) -- + shnum * sizeof (*shdr) + string_size, align); -+ + shnum * sizeof (*shdr) + string_size, layout->align); - - program_size = ALIGN_ADDR (*core_size); - -@@ -258,7 +279,8 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc - ehdr->e_entry = grub_host_to_target32 (target_addr); - phdr->p_vaddr = grub_host_to_target32 (target_addr); - phdr->p_paddr = grub_host_to_target32 (target_addr); -- phdr->p_align = grub_host_to_target32 (align > image_target->link_align ? align : image_target->link_align); -+ phdr->p_align = grub_host_to_target32 (layout->align > image_target->link_align ? -+ layout->align : image_target->link_align); - if (image_target->id == IMAGE_LOONGSON_ELF) - ehdr->e_flags = grub_host_to_target32 (0x1000 | EF_MIPS_NOREORDER - | EF_MIPS_PIC | EF_MIPS_CPIC); -@@ -272,27 +294,34 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc - else - { - grub_uint32_t target_addr_mods; -- phdr->p_filesz = grub_host_to_target32 (kernel_size); -- phdr->p_memsz = grub_host_to_target32 (kernel_size + bss_size); -+ phdr->p_filesz = grub_host_to_target32 (layout->kernel_size); -+ if (image_target->id == IMAGE_COREBOOT && image_target->elf_target == EM_ARM) -+ phdr->p_memsz = grub_host_to_target32 (layout->kernel_size); -+ else -+ phdr->p_memsz = grub_host_to_target32 (layout->kernel_size + layout->bss_size); - - phdr++; - phdr->p_type = grub_host_to_target32 (PT_GNU_STACK); -- phdr->p_offset = grub_host_to_target32 (header_size + kernel_size); -+ phdr->p_offset = grub_host_to_target32 (header_size + layout->kernel_size); - phdr->p_paddr = phdr->p_vaddr = phdr->p_filesz = phdr->p_memsz = 0; - phdr->p_flags = grub_host_to_target32 (PF_R | PF_W | PF_X); - phdr->p_align = grub_host_to_target32 (image_target->link_align); - - phdr++; - phdr->p_type = grub_host_to_target32 (PT_LOAD); -- phdr->p_offset = grub_host_to_target32 (header_size + kernel_size); -+ phdr->p_offset = grub_host_to_target32 (header_size + layout->kernel_size); - phdr->p_flags = grub_host_to_target32 (PF_R | PF_W | PF_X); - phdr->p_filesz = phdr->p_memsz -- = grub_host_to_target32 (*core_size - kernel_size); -+ = grub_host_to_target32 (*core_size - layout->kernel_size); - -- if (image_target->id == IMAGE_COREBOOT) -+ if (image_target->id == IMAGE_COREBOOT && image_target->elf_target == EM_386) - target_addr_mods = GRUB_KERNEL_I386_COREBOOT_MODULES_ADDR; -+ else if (image_target->id == IMAGE_COREBOOT && image_target->elf_target == EM_ARM) -+ target_addr_mods = ALIGN_UP (target_addr + layout->end -+ + image_target->mod_gap, -+ image_target->mod_align); - else -- target_addr_mods = ALIGN_UP (target_addr + kernel_size + bss_size -+ target_addr_mods = ALIGN_UP (target_addr + layout->kernel_size + layout->bss_size - + image_target->mod_gap, - image_target->mod_align); - phdr->p_vaddr = grub_host_to_target_addr (target_addr_mods); -@@ -434,7 +463,7 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc - shdr->sh_size = grub_host_to_target32 (string_size); - shdr->sh_link = grub_host_to_target32 (0); - shdr->sh_info = grub_host_to_target32 (0); -- shdr->sh_addralign = grub_host_to_target32 (align); -+ shdr->sh_addralign = grub_host_to_target32 (layout->align); - shdr->sh_entsize = grub_host_to_target32 (0); - shdr++; - -@@ -445,10 +474,10 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc - shdr->sh_type = grub_host_to_target32 (SHT_PROGBITS); - shdr->sh_addr = grub_host_to_target_addr (target_addr); - shdr->sh_offset = grub_host_to_target_addr (header_size); -- shdr->sh_size = grub_host_to_target32 (kernel_size); -+ shdr->sh_size = grub_host_to_target32 (layout->kernel_size); - shdr->sh_link = grub_host_to_target32 (0); - shdr->sh_info = grub_host_to_target32 (0); -- shdr->sh_addralign = grub_host_to_target32 (align); -+ shdr->sh_addralign = grub_host_to_target32 (layout->align); - shdr->sh_entsize = grub_host_to_target32 (0); - shdr++; - -@@ -456,9 +485,9 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc - shdr->sh_name = grub_host_to_target32 (ptr - str_start); - ptr += sizeof ("mods"); - shdr->sh_type = grub_host_to_target32 (SHT_PROGBITS); -- shdr->sh_addr = grub_host_to_target_addr (target_addr + kernel_size); -- shdr->sh_offset = grub_host_to_target_addr (header_size + kernel_size); -- shdr->sh_size = grub_host_to_target32 (*core_size - kernel_size); -+ shdr->sh_addr = grub_host_to_target_addr (target_addr + layout->kernel_size); -+ shdr->sh_offset = grub_host_to_target_addr (header_size + layout->kernel_size); -+ shdr->sh_size = grub_host_to_target32 (*core_size - layout->kernel_size); - shdr->sh_link = grub_host_to_target32 (0); - shdr->sh_info = grub_host_to_target32 (0); - shdr->sh_addralign = grub_host_to_target32 (image_target->voidp_sizeof); -@@ -471,7 +500,7 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc - shdr->sh_name = grub_host_to_target32 (ptr - str_start); - ptr += sizeof (".xen"); - shdr->sh_type = grub_host_to_target32 (SHT_PROGBITS); -- shdr->sh_addr = grub_host_to_target_addr (target_addr + kernel_size); -+ shdr->sh_addr = grub_host_to_target_addr (target_addr + layout->kernel_size); - shdr->sh_offset = grub_host_to_target_addr (program_size + header_size); - shdr->sh_size = grub_host_to_target32 (XEN_NOTE_SIZE); - shdr->sh_link = grub_host_to_target32 (0); -@@ -490,9 +519,7 @@ SUFFIX (grub_mkimage_generate_elf) (const struct grub_install_image_target_desc - /* Relocate symbols; note that this function overwrites the symbol table. - Return the address of a start symbol. */ - static Elf_Addr --SUFFIX (relocate_symbols) (Elf_Ehdr *e, Elf_Shdr *sections, -- Elf_Shdr *symtab_section, Elf_Addr *section_addresses, -- Elf_Half section_entsize, Elf_Half num_sections, -+SUFFIX (relocate_symbols) (Elf_Ehdr *e, struct section_metadata *smd, - void *jumpers, Elf_Addr jumpers_addr, - Elf_Addr bss_start, Elf_Addr end, - const struct grub_install_image_target_desc *image_target) -@@ -502,19 +529,18 @@ SUFFIX (relocate_symbols) (Elf_Ehdr *e, Elf_Shdr *sections, - Elf_Addr start_address = (Elf_Addr) -1; - Elf_Sym *sym; - Elf_Word i; -- Elf_Shdr *strtab_section; -- const char *strtab; -+ Elf_Shdr *symtab_section; -+ const char *symtab; - grub_uint64_t *jptr = jumpers; - -- strtab_section -- = (Elf_Shdr *) ((char *) sections -- + (grub_target_to_host32 (symtab_section->sh_link) -- * section_entsize)); -- strtab = (char *) e + grub_target_to_host (strtab_section->sh_offset); -+ symtab_section = (Elf_Shdr *) ((char *) smd->sections -+ + grub_target_to_host32 (smd->symtab->sh_link) -+ * smd->section_entsize); -+ symtab = (char *) e + grub_target_to_host (symtab_section->sh_offset); - -- symtab_size = grub_target_to_host (symtab_section->sh_size); -- sym_size = grub_target_to_host (symtab_section->sh_entsize); -- symtab_offset = grub_target_to_host (symtab_section->sh_offset); -+ symtab_size = grub_target_to_host (smd->symtab->sh_size); -+ sym_size = grub_target_to_host (smd->symtab->sh_entsize); -+ symtab_offset = grub_target_to_host (smd->symtab->sh_offset); - num_syms = symtab_size / sym_size; - - for (i = 0, sym = (Elf_Sym *) ((char *) e + symtab_offset); -@@ -524,7 +550,7 @@ SUFFIX (relocate_symbols) (Elf_Ehdr *e, Elf_Shdr *sections, - Elf_Section cur_index; - const char *name; - -- name = strtab + grub_target_to_host32 (sym->st_name); -+ name = symtab + grub_target_to_host32 (sym->st_name); - - cur_index = grub_target_to_host16 (sym->st_shndx); - if (cur_index == STN_ABS) -@@ -542,12 +568,12 @@ SUFFIX (relocate_symbols) (Elf_Ehdr *e, Elf_Shdr *sections, - else - continue; - } -- else if (cur_index >= num_sections) -+ else if (cur_index >= smd->num_sections) - grub_util_error ("section %d does not exist", cur_index); - else - { - sym->st_value = (grub_target_to_host (sym->st_value) -- + section_addresses[cur_index]); -+ + smd->vaddrs[cur_index]); - } - - if (image_target->elf_target == EM_IA_64 && ELF_ST_TYPE (sym->st_info) -@@ -562,7 +588,7 @@ SUFFIX (relocate_symbols) (Elf_Ehdr *e, Elf_Shdr *sections, - grub_util_info ("locating %s at 0x%" GRUB_HOST_PRIxLONG_LONG - " (0x%" GRUB_HOST_PRIxLONG_LONG ")", name, - (unsigned long long) sym->st_value, -- (unsigned long long) section_addresses[cur_index]); -+ (unsigned long long) smd->vaddrs[cur_index]); - - if (start_address == (Elf_Addr)-1) - if (strcmp (name, "_start") == 0 || strcmp (name, "start") == 0) -@@ -699,17 +725,19 @@ arm_get_trampoline_size (Elf_Ehdr *e, - } - #endif - -+static int -+SUFFIX (is_kept_section) (Elf_Shdr *s, const struct grub_install_image_target_desc *image_target); -+static int -+SUFFIX (is_kept_reloc_section) (Elf_Shdr *s, const struct grub_install_image_target_desc *image_target, -+ struct section_metadata *smd); -+ - /* Deal with relocation information. This function relocates addresses - within the virtual address space starting from 0. So only relative - addresses can be fully resolved. Absolute addresses must be relocated - again by a PE32 relocator when loaded. */ - static void --SUFFIX (relocate_addresses) (Elf_Ehdr *e, Elf_Shdr *sections, -- Elf_Addr *section_addresses, -- Elf_Half section_entsize, Elf_Half num_sections, -- const char *strtab, -- char *pe_target, Elf_Addr tramp_off, -- Elf_Addr got_off, -+SUFFIX (relocate_addrs) (Elf_Ehdr *e, struct section_metadata *smd, -+ char *pe_target, Elf_Addr tramp_off, Elf_Addr got_off, - const struct grub_install_image_target_desc *image_target) - { - Elf_Half i; -@@ -723,33 +751,37 @@ SUFFIX (relocate_addresses) (Elf_Ehdr *e, Elf_Shdr *sections, - grub_uint32_t *tr = (void *) (pe_target + tramp_off); - #endif - -- for (i = 0, s = sections; -- i < num_sections; -- i++, s = (Elf_Shdr *) ((char *) s + section_entsize)) -+ for (i = 0, s = smd->sections; -+ i < smd->num_sections; -+ i++, s = (Elf_Shdr *) ((char *) s + smd->section_entsize)) - if ((s->sh_type == grub_host_to_target32 (SHT_REL)) || - (s->sh_type == grub_host_to_target32 (SHT_RELA))) - { - Elf_Rela *r; - Elf_Word rtab_size, r_size, num_rs; - Elf_Off rtab_offset; -- Elf_Shdr *symtab_section; - Elf_Word target_section_index; - Elf_Addr target_section_addr; - Elf_Shdr *target_section; - Elf_Word j; - -- symtab_section = (Elf_Shdr *) ((char *) sections -- + (grub_target_to_host32 (s->sh_link) -- * section_entsize)); -+ if (!SUFFIX (is_kept_section) (s, image_target) && -+ !SUFFIX (is_kept_reloc_section) (s, image_target, smd)) -+ { -+ grub_util_info ("not translating relocations for omitted section %s", -+ smd->strtab + grub_le_to_cpu32 (s->sh_name)); -+ continue; -+ } -+ - target_section_index = grub_target_to_host32 (s->sh_info); -- target_section_addr = section_addresses[target_section_index]; -- target_section = (Elf_Shdr *) ((char *) sections -+ target_section_addr = smd->addrs[target_section_index]; -+ target_section = (Elf_Shdr *) ((char *) smd->sections - + (target_section_index -- * section_entsize)); -+ * smd->section_entsize)); - - grub_util_info ("dealing with the relocation section %s for %s", -- strtab + grub_target_to_host32 (s->sh_name), -- strtab + grub_target_to_host32 (target_section->sh_name)); -+ smd->strtab + grub_target_to_host32 (s->sh_name), -+ smd->strtab + grub_target_to_host32 (target_section->sh_name)); - - rtab_size = grub_target_to_host (s->sh_size); - r_size = grub_target_to_host (s->sh_entsize); -@@ -770,7 +802,7 @@ SUFFIX (relocate_addresses) (Elf_Ehdr *e, Elf_Shdr *sections, - target = SUFFIX (get_target_address) (e, target_section, - offset, image_target); - info = grub_target_to_host (r->r_info); -- sym_addr = SUFFIX (get_symbol_address) (e, symtab_section, -+ sym_addr = SUFFIX (get_symbol_address) (e, smd->symtab, - ELF_R_SYM (info), image_target); - - addend = (s->sh_type == grub_target_to_host32 (SHT_RELA)) ? -@@ -832,6 +864,7 @@ SUFFIX (relocate_addresses) (Elf_Ehdr *e, Elf_Shdr *sections, - break; - - case R_X86_64_PC32: -+ case R_X86_64_PLT32: - { - grub_uint32_t *t32 = (grub_uint32_t *) target; - *t32 = grub_host_to_target64 (grub_target_to_host32 (*t32) -@@ -900,8 +933,8 @@ SUFFIX (relocate_addresses) (Elf_Ehdr *e, Elf_Shdr *sections, - Elf_Sym *sym; - - sym = (Elf_Sym *) ((char *) e -- + grub_target_to_host (symtab_section->sh_offset) -- + ELF_R_SYM (info) * grub_target_to_host (symtab_section->sh_entsize)); -+ + grub_target_to_host (smd->symtab->sh_offset) -+ + ELF_R_SYM (info) * grub_target_to_host (smd->symtab->sh_entsize)); - if (ELF_ST_TYPE (sym->st_info) == STT_FUNC) - sym_addr = grub_target_to_host64 (*(grub_uint64_t *) (pe_target - + sym->st_value -@@ -1086,8 +1119,8 @@ SUFFIX (relocate_addresses) (Elf_Ehdr *e, Elf_Shdr *sections, - - (char *) e), - sym_addr); - sym = (Elf_Sym *) ((char *) e -- + grub_target_to_host (symtab_section->sh_offset) -- + ELF_R_SYM (info) * grub_target_to_host (symtab_section->sh_entsize)); -+ + grub_target_to_host (smd->symtab->sh_offset) -+ + ELF_R_SYM (info) * grub_target_to_host (smd->symtab->sh_entsize)); - if (ELF_ST_TYPE (sym->st_info) != STT_FUNC) - sym_addr |= 1; - if (!(sym_addr & 1)) -@@ -1625,9 +1658,7 @@ create_u64_fixups (struct translate_context *ctx, - /* Make a .reloc section. */ - static void - make_reloc_section (Elf_Ehdr *e, struct grub_mkimage_layout *layout, -- Elf_Addr *section_addresses, Elf_Shdr *sections, -- Elf_Half section_entsize, Elf_Half num_sections, -- const char *strtab, -+ struct section_metadata *smd, - const struct grub_install_image_target_desc *image_target) - { - unsigned i; -@@ -1636,8 +1667,8 @@ make_reloc_section (Elf_Ehdr *e, struct grub_mkimage_layout *layout, - - translate_reloc_start (&ctx, image_target); - -- for (i = 0, s = sections; i < num_sections; -- i++, s = (Elf_Shdr *) ((char *) s + section_entsize)) -+ for (i = 0, s = smd->sections; i < smd->num_sections; -+ i++, s = (Elf_Shdr *) ((char *) s + smd->section_entsize)) - if ((grub_target_to_host32 (s->sh_type) == SHT_REL) || - (grub_target_to_host32 (s->sh_type) == SHT_RELA)) - { -@@ -1647,15 +1678,22 @@ make_reloc_section (Elf_Ehdr *e, struct grub_mkimage_layout *layout, - Elf_Addr section_address; - Elf_Word j; - -+ if (!SUFFIX (is_kept_reloc_section) (s, image_target, smd)) -+ { -+ grub_util_info ("not translating the skipped relocation section %s", -+ smd->strtab + grub_le_to_cpu32 (s->sh_name)); -+ continue; -+ } -+ - grub_util_info ("translating the relocation section %s", -- strtab + grub_le_to_cpu32 (s->sh_name)); -+ smd->strtab + grub_le_to_cpu32 (s->sh_name)); - - rtab_size = grub_target_to_host (s->sh_size); - r_size = grub_target_to_host (s->sh_entsize); - rtab_offset = grub_target_to_host (s->sh_offset); - num_rs = rtab_size / r_size; - -- section_address = section_addresses[grub_le_to_cpu32 (s->sh_info)]; -+ section_address = smd->vaddrs[grub_le_to_cpu32 (s->sh_info)]; - - for (j = 0, r = (Elf_Rel *) ((char *) e + rtab_offset); - j < num_rs; -@@ -1722,6 +1760,56 @@ SUFFIX (is_bss_section) (Elf_Shdr *s, const struct grub_install_image_target_des - == SHF_ALLOC) && (grub_target_to_host32 (s->sh_type) == SHT_NOBITS); - } - -+/* Determine if a section is going to be in the final output */ -+static int -+SUFFIX (is_kept_section) (Elf_Shdr *s, const struct grub_install_image_target_desc *image_target) -+{ -+ /* We keep .text and .data */ -+ if (SUFFIX (is_text_section) (s, image_target) -+ || SUFFIX (is_data_section) (s, image_target)) -+ return 1; -+ -+ /* -+ * And we keep .bss if we're producing PE binaries or the target doesn't -+ * have a relocating loader. Platforms other than EFI and U-boot shouldn't -+ * have .bss in their binaries as we build with -Wl,-Ttext. -+ */ -+ if (SUFFIX (is_bss_section) (s, image_target) -+ && (image_target->id == IMAGE_EFI || !is_relocatable (image_target))) -+ return 1; -+ -+ /* Otherwise this is not a section we're keeping in the final output. */ -+ return 0; -+} -+ -+static int -+SUFFIX (is_kept_reloc_section) (Elf_Shdr *s, const struct grub_install_image_target_desc *image_target, -+ struct section_metadata *smd) -+{ -+ int i; -+ int r = 0; -+ const char *name = smd->strtab + grub_host_to_target32 (s->sh_name); -+ -+ if (!strncmp (name, ".rela.", 6)) -+ name += 5; -+ else if (!strncmp (name, ".rel.", 5)) -+ name += 4; -+ else -+ return 1; -+ -+ for (i = 0, s = smd->sections; i < smd->num_sections; -+ i++, s = (Elf_Shdr *) ((char *) s + smd->section_entsize)) -+ { -+ const char *sname = smd->strtab + grub_host_to_target32 (s->sh_name); -+ if (strcmp (sname, name)) -+ continue; -+ -+ return SUFFIX (is_kept_section) (s, image_target); -+ } -+ -+ return r; -+} -+ - /* Return if the ELF header is valid. */ - static int - SUFFIX (check_elf_header) (Elf_Ehdr *e, size_t size, const struct grub_install_image_target_desc *image_target) -@@ -1742,12 +1830,11 @@ SUFFIX (check_elf_header) (Elf_Ehdr *e, size_t size, const struct grub_install_i - static Elf_Addr - SUFFIX (put_section) (Elf_Shdr *s, int i, - Elf_Addr current_address, -- Elf_Addr *section_addresses, -- const char *strtab, -+ struct section_metadata *smd, - const struct grub_install_image_target_desc *image_target) - { - Elf_Word align = grub_host_to_target_addr (s->sh_addralign); -- const char *name = strtab + grub_host_to_target32 (s->sh_name); -+ const char *name = smd->strtab + grub_host_to_target32 (s->sh_name); - - if (align) - current_address = ALIGN_UP (current_address + image_target->vaddr_offset, -@@ -1759,24 +1846,23 @@ SUFFIX (put_section) (Elf_Shdr *s, int i, - name, (unsigned long long) current_address); - if (!is_relocatable (image_target)) - current_address = grub_host_to_target_addr (s->sh_addr) -- - image_target->link_addr; -- section_addresses[i] = current_address; -+ - image_target->link_addr; -+ smd->addrs[i] = current_address; - current_address += grub_host_to_target_addr (s->sh_size); - return current_address; - } - --/* Locate section addresses by merging code sections and data sections -- into .text and .data, respectively. Return the array of section -- addresses. */ --static Elf_Addr * -+/* -+ * Locate section addresses by merging code sections and data sections -+ * into .text and .data, respectively. -+ */ -+static void - SUFFIX (locate_sections) (Elf_Ehdr *e, const char *kernel_path, -- Elf_Shdr *sections, Elf_Half section_entsize, -- Elf_Half num_sections, const char *strtab, -+ struct section_metadata *smd, - struct grub_mkimage_layout *layout, - const struct grub_install_image_target_desc *image_target) - { - int i; -- Elf_Addr *section_addresses; - Elf_Shdr *s; - - layout->align = 1; -@@ -1784,30 +1870,23 @@ SUFFIX (locate_sections) (Elf_Ehdr *e, const char *kernel_path, - if (image_target->elf_target == EM_AARCH64) - layout->align = 4096; - -- section_addresses = xmalloc (sizeof (*section_addresses) * num_sections); -- memset (section_addresses, 0, sizeof (*section_addresses) * num_sections); -- - layout->kernel_size = 0; - -- for (i = 0, s = sections; -- i < num_sections; -- i++, s = (Elf_Shdr *) ((char *) s + section_entsize)) -- if ((grub_target_to_host (s->sh_flags) & SHF_ALLOC) -+ for (i = 0, s = smd->sections; -+ i < smd->num_sections; -+ i++, s = (Elf_Shdr *) ((char *) s + smd->section_entsize)) -+ if ((grub_target_to_host (s->sh_flags) & SHF_ALLOC) - && grub_host_to_target32 (s->sh_addralign) > layout->align) - layout->align = grub_host_to_target32 (s->sh_addralign); - -- - /* .text */ -- for (i = 0, s = sections; -- i < num_sections; -- i++, s = (Elf_Shdr *) ((char *) s + section_entsize)) -+ for (i = 0, s = smd->sections; -+ i < smd->num_sections; -+ i++, s = (Elf_Shdr *) ((char *) s + smd->section_entsize)) - if (SUFFIX (is_text_section) (s, image_target)) - { -- layout->kernel_size = SUFFIX (put_section) (s, i, -- layout->kernel_size, -- section_addresses, -- strtab, -- image_target); -+ layout->kernel_size = SUFFIX (put_section) (s, i, layout->kernel_size, -+ smd, image_target); - if (!is_relocatable (image_target) && - grub_host_to_target_addr (s->sh_addr) != image_target->link_addr) - { -@@ -1827,15 +1906,12 @@ SUFFIX (locate_sections) (Elf_Ehdr *e, const char *kernel_path, - layout->exec_size = layout->kernel_size; - - /* .data */ -- for (i = 0, s = sections; -- i < num_sections; -- i++, s = (Elf_Shdr *) ((char *) s + section_entsize)) -+ for (i = 0, s = smd->sections; -+ i < smd->num_sections; -+ i++, s = (Elf_Shdr *) ((char *) s + smd->section_entsize)) - if (SUFFIX (is_data_section) (s, image_target)) -- layout->kernel_size = SUFFIX (put_section) (s, i, -- layout->kernel_size, -- section_addresses, -- strtab, -- image_target); -+ layout->kernel_size = SUFFIX (put_section) (s, i, layout->kernel_size, smd, -+ image_target); - - #ifdef MKIMAGE_ELF32 - if (image_target->elf_target == EM_ARM) -@@ -1846,8 +1922,8 @@ SUFFIX (locate_sections) (Elf_Ehdr *e, const char *kernel_path, - - layout->kernel_size = ALIGN_UP (layout->kernel_size, 16); - -- tramp = arm_get_trampoline_size (e, sections, section_entsize, -- num_sections, image_target); -+ tramp = arm_get_trampoline_size (e, smd->sections, smd->section_entsize, -+ smd->num_sections, image_target); - - layout->tramp_off = layout->kernel_size; - layout->kernel_size += ALIGN_UP (tramp, 16); -@@ -1858,15 +1934,18 @@ SUFFIX (locate_sections) (Elf_Ehdr *e, const char *kernel_path, - layout->end = layout->kernel_size; - - /* .bss */ -- for (i = 0, s = sections; -- i < num_sections; -- i++, s = (Elf_Shdr *) ((char *) s + section_entsize)) -- if (SUFFIX (is_bss_section) (s, image_target)) -- layout->end = SUFFIX (put_section) (s, i, -- layout->end, -- section_addresses, -- strtab, -- image_target); -+ for (i = 0, s = smd->sections; -+ i < smd->num_sections; -+ i++, s = (Elf_Shdr *) ((char *) s + smd->section_entsize)) -+ { -+ if (SUFFIX (is_bss_section) (s, image_target)) -+ layout->end = SUFFIX (put_section) (s, i, layout->end, smd, image_target); -+ -+ /* -+ * This must to be in the last time this function passes through the loop. -+ */ -+ smd->vaddrs[i] = smd->addrs[i] + image_target->vaddr_offset; -+ } - - layout->end = ALIGN_UP (layout->end + image_target->vaddr_offset, - image_target->section_align) - image_target->vaddr_offset; -@@ -1875,10 +1954,8 @@ SUFFIX (locate_sections) (Elf_Ehdr *e, const char *kernel_path, - Platforms other than EFI and U-boot shouldn't have .bss in - their binaries as we build with -Wl,-Ttext. - */ -- if (image_target->id != IMAGE_UBOOT) -+ if (image_target->id == IMAGE_EFI || !is_relocatable (image_target)) - layout->kernel_size = layout->end; -- -- return section_addresses; - } - - char * -@@ -1888,18 +1965,12 @@ SUFFIX (grub_mkimage_load_image) (const char *kernel_path, - const struct grub_install_image_target_desc *image_target) - { - char *kernel_img, *out_img; -- const char *strtab; -+ struct section_metadata smd = { 0, 0, 0, 0, 0, 0, 0 }; - Elf_Ehdr *e; -- Elf_Shdr *sections; -- Elf_Addr *section_addresses; -- Elf_Addr *section_vaddresses; - int i; - Elf_Shdr *s; -- Elf_Half num_sections; - Elf_Off section_offset; -- Elf_Half section_entsize; - grub_size_t kernel_size; -- Elf_Shdr *symtab_section = 0; - - grub_memset (layout, 0, sizeof (*layout)); - -@@ -1914,48 +1985,45 @@ SUFFIX (grub_mkimage_load_image) (const char *kernel_path, - grub_util_error ("invalid ELF header"); - - section_offset = grub_target_to_host (e->e_shoff); -- section_entsize = grub_target_to_host16 (e->e_shentsize); -- num_sections = grub_target_to_host16 (e->e_shnum); -+ smd.section_entsize = grub_target_to_host16 (e->e_shentsize); -+ smd.num_sections = grub_target_to_host16 (e->e_shnum); - -- if (kernel_size < section_offset + (grub_uint32_t) section_entsize * num_sections) -+ if (kernel_size < section_offset -+ + (grub_uint32_t) smd.section_entsize * smd.num_sections) - grub_util_error (_("premature end of file %s"), kernel_path); - -- sections = (Elf_Shdr *) (kernel_img + section_offset); -+ smd.sections = (Elf_Shdr *) (kernel_img + section_offset); - - /* Relocate sections then symbols in the virtual address space. */ -- s = (Elf_Shdr *) ((char *) sections -- + grub_host_to_target16 (e->e_shstrndx) * section_entsize); -- strtab = (char *) e + grub_host_to_target_addr (s->sh_offset); -+ s = (Elf_Shdr *) ((char *) smd.sections -+ + grub_host_to_target16 (e->e_shstrndx) * smd.section_entsize); -+ smd.strtab = (char *) e + grub_host_to_target_addr (s->sh_offset); - -- section_addresses = SUFFIX (locate_sections) (e, kernel_path, -- sections, section_entsize, -- num_sections, strtab, -- layout, -- image_target); -+ smd.addrs = xmalloc (sizeof (*smd.addrs) * smd.num_sections); -+ memset (smd.addrs, 0, sizeof (*smd.addrs) * smd.num_sections); -+ smd.vaddrs = xmalloc (sizeof (*smd.vaddrs) * smd.num_sections); -+ memset (smd.vaddrs, 0, sizeof (*smd.vaddrs) * smd.num_sections); - -- section_vaddresses = xmalloc (sizeof (*section_addresses) * num_sections); -- -- for (i = 0; i < num_sections; i++) -- section_vaddresses[i] = section_addresses[i] + image_target->vaddr_offset; -+ SUFFIX (locate_sections) (e, kernel_path, &smd, layout, image_target); - - if (!is_relocatable (image_target)) - { - Elf_Addr current_address = layout->kernel_size; - -- for (i = 0, s = sections; -- i < num_sections; -- i++, s = (Elf_Shdr *) ((char *) s + section_entsize)) -+ for (i = 0, s = smd.sections; -+ i < smd.num_sections; -+ i++, s = (Elf_Shdr *) ((char *) s + smd.section_entsize)) - if (grub_target_to_host32 (s->sh_type) == SHT_NOBITS) - { - Elf_Word sec_align = grub_host_to_target_addr (s->sh_addralign); -- const char *name = strtab + grub_host_to_target32 (s->sh_name); -+ const char *name = smd.strtab + grub_host_to_target32 (s->sh_name); - - if (sec_align) - current_address = ALIGN_UP (current_address - + image_target->vaddr_offset, - sec_align) - - image_target->vaddr_offset; -- -+ - grub_util_info ("locating the section %s at 0x%" - GRUB_HOST_PRIxLONG_LONG, - name, (unsigned long long) current_address); -@@ -1963,7 +2031,7 @@ SUFFIX (grub_mkimage_load_image) (const char *kernel_path, - current_address = grub_host_to_target_addr (s->sh_addr) - - image_target->link_addr; - -- section_vaddresses[i] = current_address -+ smd.vaddrs[i] = current_address - + image_target->vaddr_offset; - current_address += grub_host_to_target_addr (s->sh_size); - } -@@ -1978,21 +2046,22 @@ SUFFIX (grub_mkimage_load_image) (const char *kernel_path, - if (image_target->id == IMAGE_SPARC64_AOUT - || image_target->id == IMAGE_SPARC64_RAW - || image_target->id == IMAGE_UBOOT -+ || image_target->id == IMAGE_COREBOOT - || image_target->id == IMAGE_SPARC64_CDCORE) - layout->kernel_size = ALIGN_UP (layout->kernel_size, image_target->mod_align); - - if (is_relocatable (image_target)) - { -- symtab_section = NULL; -- for (i = 0, s = sections; -- i < num_sections; -- i++, s = (Elf_Shdr *) ((char *) s + section_entsize)) -+ smd.symtab = NULL; -+ for (i = 0, s = smd.sections; -+ i < smd.num_sections; -+ i++, s = (Elf_Shdr *) ((char *) s + smd.section_entsize)) - if (s->sh_type == grub_host_to_target32 (SHT_SYMTAB)) - { -- symtab_section = s; -+ smd.symtab = s; - break; - } -- if (! symtab_section) -+ if (! smd.symtab) - grub_util_error ("%s", _("no symbol table")); - #ifdef MKIMAGE_ELF64 - if (image_target->elf_target == EM_IA_64) -@@ -2007,7 +2076,7 @@ SUFFIX (grub_mkimage_load_image) (const char *kernel_path, - layout->kernel_size += ALIGN_UP (tramp, 16); - - layout->ia64jmp_off = layout->kernel_size; -- layout->ia64jmpnum = SUFFIX (count_funcs) (e, symtab_section, -+ layout->ia64jmpnum = SUFFIX (count_funcs) (e, smd.symtab, - image_target); - layout->kernel_size += 16 * layout->ia64jmpnum; - -@@ -2038,31 +2107,19 @@ SUFFIX (grub_mkimage_load_image) (const char *kernel_path, - - if (is_relocatable (image_target)) - { -- layout->start_address = SUFFIX (relocate_symbols) (e, sections, symtab_section, -- section_vaddresses, section_entsize, -- num_sections, -- (char *) out_img + layout->ia64jmp_off, -- layout->ia64jmp_off -- + image_target->vaddr_offset, -- layout->bss_start, -- layout->end, -- image_target); -+ layout->start_address = SUFFIX (relocate_symbols) (e, &smd, -+ (char *) out_img + layout->ia64jmp_off, -+ layout->ia64jmp_off + image_target->vaddr_offset, -+ layout->bss_start, layout->end, image_target); -+ - if (layout->start_address == (Elf_Addr) -1) - grub_util_error ("start symbol is not defined"); - -- /* Resolve addresses in the virtual address space. */ -- SUFFIX (relocate_addresses) (e, sections, section_addresses, -- section_entsize, -- num_sections, strtab, -- out_img, layout->tramp_off, -- layout->got_off, -- image_target); -+ /* Resolve addrs in the virtual address space. */ -+ SUFFIX (relocate_addrs) (e, &smd, out_img, layout->tramp_off, -+ layout->got_off, image_target); - -- make_reloc_section (e, layout, -- section_vaddresses, sections, -- section_entsize, num_sections, -- strtab, -- image_target); -+ make_reloc_section (e, layout, &smd, image_target); - if (image_target->id != IMAGE_EFI) - { - out_img = xrealloc (out_img, layout->kernel_size + total_module_size -@@ -2074,30 +2131,25 @@ SUFFIX (grub_mkimage_load_image) (const char *kernel_path, - } - } - -- for (i = 0, s = sections; -- i < num_sections; -- i++, s = (Elf_Shdr *) ((char *) s + section_entsize)) -- if (SUFFIX (is_data_section) (s, image_target) -- /* Explicitly initialize BSS -- when producing PE32 to avoid a bug in EFI implementations. -- Platforms other than EFI and U-boot shouldn't have .bss in -- their binaries as we build with -Wl,-Ttext. -- */ -- || (SUFFIX (is_bss_section) (s, image_target) && (image_target->id != IMAGE_UBOOT)) -- || SUFFIX (is_text_section) (s, image_target)) -+ for (i = 0, s = smd.sections; -+ i < smd.num_sections; -+ i++, s = (Elf_Shdr *) ((char *) s + smd.section_entsize)) -+ if (SUFFIX (is_kept_section) (s, image_target)) - { - if (grub_target_to_host32 (s->sh_type) == SHT_NOBITS) -- memset (out_img + section_addresses[i], 0, -+ memset (out_img + smd.addrs[i], 0, - grub_host_to_target_addr (s->sh_size)); - else -- memcpy (out_img + section_addresses[i], -+ memcpy (out_img + smd.addrs[i], - kernel_img + grub_host_to_target_addr (s->sh_offset), - grub_host_to_target_addr (s->sh_size)); - } - free (kernel_img); - -- free (section_vaddresses); -- free (section_addresses); -+ free (smd.vaddrs); -+ smd.vaddrs = NULL; -+ free (smd.addrs); -+ smd.addrs = NULL; - - return out_img; - } -diff --git a/util/grub-mkrescue.c b/util/grub-mkrescue.c -index 238d4840e2f9613c6392e16cb88e7f413cae41c4..9545945d8f3b1a85dea8404fe1a0c9b3a3b84ba1 100644 ---- a/util/grub-mkrescue.c -+++ b/util/grub-mkrescue.c -@@ -323,6 +323,7 @@ check_xorriso (const char *val) - char *buf = NULL; - size_t len = 0; - int ret = 0; -+ int wstatus = 0; - - argv[0] = xorriso; - argv[1] = "-as"; -@@ -347,8 +348,10 @@ check_xorriso (const char *val) - } - - close (fd); -- waitpid (pid, NULL, 0); -+ waitpid (pid, &wstatus, 0); - free (buf); -+ if (!WIFEXITED (wstatus) || WEXITSTATUS(wstatus) != 0) -+ return 0; - return ret; - } - -@@ -426,6 +429,7 @@ main (int argc, char *argv[]) - char **argp_argv; - int xorriso_tail_argc; - char **xorriso_tail_argv; -+ int rv; - - grub_util_host_init (&argc, &argv); - grub_util_disable_fd_syncs (); -@@ -478,6 +482,10 @@ main (int argc, char *argv[]) - if (!output_image) - grub_util_error ("%s", _("output file must be specified")); - -+ if (!check_xorriso ("graft-points")) { -+ grub_util_error ("%s", _("xorriso not found")); -+ } -+ - grub_init_all (); - grub_hostfs_init (); - grub_host_init (); -@@ -787,7 +795,6 @@ main (int argc, char *argv[]) - free (efidir_efi_boot); - - efiimgfat = grub_util_path_concat (2, iso9660_dir, "efi.img"); -- int rv; - rv = grub_util_exec ((const char * []) { "mformat", "-C", "-f", "2880", "-L", "16", "-i", - efiimgfat, "::", NULL }); - if (rv != 0) -@@ -960,7 +967,9 @@ main (int argc, char *argv[]) - - xorriso_argv[xorriso_argc] = NULL; - -- grub_util_exec ((const char *const *)xorriso_argv); -+ rv = grub_util_exec ((const char *const *)xorriso_argv); -+ if (rv != 0) -+ grub_util_error ("`%s` invocation failed\n", "xorriso"); - - grub_util_unlink_recursive (iso9660_dir); - -diff --git a/util/grub-module-verifier.c b/util/grub-module-verifier.c -index 9179285a5ffe5d641a4c2726ce8367dba623d29e..a79271f663166f4d302e1f73d1bcd400c9e8604e 100644 ---- a/util/grub-module-verifier.c -+++ b/util/grub-module-verifier.c -@@ -19,6 +19,7 @@ struct grub_module_verifier_arch archs[] = { - -1 - }, (int[]){ - R_X86_64_PC32, -+ R_X86_64_PLT32, - -1 - } - }, -diff --git a/util/grub-probe.c b/util/grub-probe.c -index 8ac527d2f2a17142c5cf873d27c5818477d2c1a4..e45dbf9e049bd41f3122793330b2d0f7bcc844f8 100644 ---- a/util/grub-probe.c -+++ b/util/grub-probe.c -@@ -28,6 +28,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -62,6 +63,7 @@ enum { - PRINT_DRIVE, - PRINT_DEVICE, - PRINT_PARTMAP, -+ PRINT_PARTUUID, - PRINT_ABSTRACTION, - PRINT_CRYPTODISK_UUID, - PRINT_HINT_STR, -@@ -85,6 +87,7 @@ static const char *targets[] = - [PRINT_DRIVE] = "drive", - [PRINT_DEVICE] = "device", - [PRINT_PARTMAP] = "partmap", -+ [PRINT_PARTUUID] = "partuuid", - [PRINT_ABSTRACTION] = "abstraction", - [PRINT_CRYPTODISK_UUID] = "cryptodisk_uuid", - [PRINT_HINT_STR] = "hints_string", -@@ -129,6 +132,20 @@ get_targets_string (void) - return str; - } - -+static int -+print_gpt_guid (grub_gpt_part_guid_t guid) -+{ -+ guid.data1 = grub_le_to_cpu32 (guid.data1); -+ guid.data2 = grub_le_to_cpu16 (guid.data2); -+ guid.data3 = grub_le_to_cpu16 (guid.data3); -+ -+ return grub_printf ("%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", -+ guid.data1, guid.data2, guid.data3, guid.data4[0], -+ guid.data4[1], guid.data4[2], guid.data4[3], -+ guid.data4[4], guid.data4[5], guid.data4[6], -+ guid.data4[7]); -+} -+ - static void - do_print (const char *x, void *data) - { -@@ -167,6 +184,45 @@ probe_partmap (grub_disk_t disk, char delim) - } - } - -+static void -+probe_partuuid (grub_disk_t disk, char delim) -+{ -+ grub_partition_t p = disk->partition; -+ -+ /* -+ * Nested partitions not supported for now. -+ * Non-nested partitions must have disk->partition->parent == NULL -+ */ -+ if (p && p->parent == NULL) -+ { -+ disk->partition = p->parent; -+ -+ if (strcmp(p->partmap->name, "msdos") == 0) -+ { -+ /* -+ * The partition GUID for MSDOS is the partition number (starting -+ * with 1) prepended with the NT disk signature. -+ */ -+ grub_uint32_t nt_disk_sig; -+ -+ if (grub_disk_read (disk, 0, GRUB_BOOT_MACHINE_WINDOWS_NT_MAGIC, -+ sizeof(nt_disk_sig), &nt_disk_sig) == 0) -+ grub_printf ("%08x-%02x", -+ grub_le_to_cpu32(nt_disk_sig), 1 + p->number); -+ } -+ else if (strcmp(p->partmap->name, "gpt") == 0) -+ { -+ struct grub_gpt_partentry gptdata; -+ -+ if (grub_disk_read (disk, p->offset, p->index, -+ sizeof(gptdata), &gptdata) == 0) -+ print_gpt_guid(gptdata.guid); -+ } -+ -+ disk->partition = p; -+ } -+} -+ - static void - probe_cryptodisk_uuid (grub_disk_t disk, char delim) - { -@@ -621,6 +677,12 @@ probe (const char *path, char **device_names, char delim) - /* Check if dev->disk itself is contained in a partmap. */ - probe_partmap (dev->disk, delim); - -+ else if (print == PRINT_PARTUUID) -+ { -+ probe_partuuid (dev->disk, delim); -+ putchar (delim); -+ } -+ - else if (print == PRINT_MSDOS_PARTTYPE) - { - if (dev->disk->partition -@@ -641,21 +703,7 @@ probe (const char *path, char **device_names, char delim) - - if (grub_disk_read (dev->disk, p->offset, p->index, - sizeof (gptdata), &gptdata) == 0) -- { -- grub_gpt_part_type_t gpttype; -- gpttype.data1 = grub_le_to_cpu32 (gptdata.type.data1); -- gpttype.data2 = grub_le_to_cpu16 (gptdata.type.data2); -- gpttype.data3 = grub_le_to_cpu16 (gptdata.type.data3); -- grub_memcpy (gpttype.data4, gptdata.type.data4, 8); -- -- grub_printf ("%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", -- gpttype.data1, gpttype.data2, -- gpttype.data3, gpttype.data4[0], -- gpttype.data4[1], gpttype.data4[2], -- gpttype.data4[3], gpttype.data4[4], -- gpttype.data4[5], gpttype.data4[6], -- gpttype.data4[7]); -- } -+ print_gpt_guid(gptdata.type); - dev->disk->partition = p; - } - putchar (delim); -diff --git a/util/ieee1275/grub-ofpathname.c b/util/ieee1275/grub-ofpathname.c -index 8e5d766cb63871c1479a42626c8cfa7fddd6f771..300fbddad7c54e2b52d90a7de5eb868a9a1ae705 100644 ---- a/util/ieee1275/grub-ofpathname.c -+++ b/util/ieee1275/grub-ofpathname.c -@@ -46,7 +46,9 @@ int main(int argc, char **argv) - } - - of_path = grub_util_devname_to_ofpath (argv[1]); -- printf("%s\n", of_path); -+ -+ if (of_path) -+ printf ("%s\n", of_path); - - free (of_path); - -diff --git a/util/mkimage.c b/util/mkimage.c -index 9ad4cfe4223b661c11ab9d3783cb13c88100631c..e22d82afa61a6aa4209c7ab6d2aa5b58f95e1bfe 100644 ---- a/util/mkimage.c -+++ b/util/mkimage.c -@@ -533,6 +533,45 @@ static const struct grub_install_image_target_desc image_targets[] = - .mod_align = GRUB_KERNEL_ARM_UBOOT_MOD_ALIGN, - .link_align = 4 - }, -+ /* For coreboot versions that don't support self-relocating images. */ -+ { -+ .dirname = "arm-coreboot-vexpress", -+ .names = { "arm-coreboot-vexpress", NULL }, -+ .voidp_sizeof = 4, -+ .bigendian = 0, -+ .id = IMAGE_COREBOOT, -+ .flags = PLATFORM_FLAGS_NONE, -+ .total_module_size = GRUB_KERNEL_ARM_COREBOOT_TOTAL_MODULE_SIZE, -+ .decompressor_compressed_size = TARGET_NO_FIELD, -+ .decompressor_uncompressed_size = TARGET_NO_FIELD, -+ .decompressor_uncompressed_addr = TARGET_NO_FIELD, -+ .section_align = GRUB_KERNEL_ARM_COREBOOT_MOD_ALIGN, -+ .vaddr_offset = 0, -+ .elf_target = EM_ARM, -+ .mod_gap = GRUB_KERNEL_ARM_COREBOOT_MOD_GAP, -+ .mod_align = GRUB_KERNEL_ARM_COREBOOT_MOD_ALIGN, -+ .link_align = 4, -+ .link_addr = 0x62000000, -+ }, -+ { -+ .dirname = "arm-coreboot-veyron", -+ .names = { "arm-coreboot-veyron", NULL }, -+ .voidp_sizeof = 4, -+ .bigendian = 0, -+ .id = IMAGE_COREBOOT, -+ .flags = PLATFORM_FLAGS_NONE, -+ .total_module_size = GRUB_KERNEL_ARM_COREBOOT_TOTAL_MODULE_SIZE, -+ .decompressor_compressed_size = TARGET_NO_FIELD, -+ .decompressor_uncompressed_size = TARGET_NO_FIELD, -+ .decompressor_uncompressed_addr = TARGET_NO_FIELD, -+ .section_align = GRUB_KERNEL_ARM_COREBOOT_MOD_ALIGN, -+ .vaddr_offset = 0, -+ .elf_target = EM_ARM, -+ .mod_gap = GRUB_KERNEL_ARM_COREBOOT_MOD_GAP, -+ .mod_align = GRUB_KERNEL_ARM_COREBOOT_MOD_ALIGN, -+ .link_align = 4, -+ .link_addr = 0x43000000, -+ }, - { - .dirname = "arm-efi", - .names = { "arm-efi", NULL }, -@@ -738,13 +777,12 @@ grub_install_generate_image (const char *dir, const char *prefix, - char *memdisk_path, char **pubkey_paths, - size_t npubkeys, char *config_path, - const struct grub_install_image_target_desc *image_target, -- int note, -- grub_compression_t comp) -+ int note, grub_compression_t comp, const char *dtb_path) - { - char *kernel_img, *core_img; - size_t total_module_size, core_size; - size_t memdisk_size = 0, config_size = 0; -- size_t prefix_size = 0; -+ size_t prefix_size = 0, dtb_size = 0; - char *kernel_path; - size_t offset; - struct grub_util_path_list *path_list, *p; -@@ -789,6 +827,12 @@ grub_install_generate_image (const char *dir, const char *prefix, - total_module_size += memdisk_size + sizeof (struct grub_module_header); - } - -+ if (dtb_path) -+ { -+ dtb_size = ALIGN_UP(grub_util_get_image_size (dtb_path), 4); -+ total_module_size += dtb_size + sizeof (struct grub_module_header); -+ } -+ - if (config_path) - { - config_size = ALIGN_ADDR (grub_util_get_image_size (config_path) + 1); -@@ -911,6 +955,19 @@ grub_install_generate_image (const char *dir, const char *prefix, - offset += memdisk_size; - } - -+ if (dtb_path) -+ { -+ struct grub_module_header *header; -+ -+ header = (struct grub_module_header *) (kernel_img + offset); -+ header->type = grub_host_to_target32 (OBJ_TYPE_DTB); -+ header->size = grub_host_to_target32 (dtb_size + sizeof (*header)); -+ offset += sizeof (*header); -+ -+ grub_util_load_image (dtb_path, kernel_img + offset); -+ offset += dtb_size; -+ } -+ - if (config_path) - { - struct grub_module_header *header; -@@ -1033,7 +1090,7 @@ grub_install_generate_image (const char *dir, const char *prefix, - /* fallthrough */ - case IMAGE_COREBOOT: - case IMAGE_QEMU: -- if (layout.kernel_size + layout.bss_size + GRUB_KERNEL_I386_PC_LINK_ADDR > 0x68000) -+ if (image_target->elf_target != EM_ARM && layout.kernel_size + layout.bss_size + GRUB_KERNEL_I386_PC_LINK_ADDR > 0x68000) - grub_util_error (_("kernel image is too big (0x%x > 0x%x)"), - (unsigned) layout.kernel_size + (unsigned) layout.bss_size - + GRUB_KERNEL_I386_PC_LINK_ADDR, -@@ -1638,10 +1695,10 @@ grub_install_generate_image (const char *dir, const char *prefix, - target_addr = image_target->link_addr; - if (image_target->voidp_sizeof == 4) - grub_mkimage_generate_elf32 (image_target, note, &core_img, &core_size, -- target_addr, layout.align, layout.kernel_size, layout.bss_size); -+ target_addr, &layout); - else - grub_mkimage_generate_elf64 (image_target, note, &core_img, &core_size, -- target_addr, layout.align, layout.kernel_size, layout.bss_size); -+ target_addr, &layout); - } - break; - } -diff --git a/util/setup.c b/util/setup.c -index 8aa5a39a79465c33b0ff6a5a6b1bc82128df2e18..9c1e1b7da6a85ea7aece6433f2eaf81a6ccde451 100644 ---- a/util/setup.c -+++ b/util/setup.c -@@ -137,6 +137,9 @@ struct blocklists - struct grub_boot_blocklist *first_block, *block; - #ifdef GRUB_SETUP_BIOS - grub_uint16_t current_segment; -+#endif -+#ifdef GRUB_SETUP_SPARC64 -+ grub_uint64_t gpt_offset; - #endif - grub_uint16_t last_length; - grub_disk_addr_t first_sector; -@@ -151,6 +154,10 @@ save_blocklists (grub_disk_addr_t sector, unsigned offset, unsigned length, - struct grub_boot_blocklist *prev = bl->block + 1; - grub_uint64_t seclen; - -+#ifdef GRUB_SETUP_SPARC64 -+ sector -= bl->gpt_offset; -+#endif -+ - grub_util_info ("saving <%" GRUB_HOST_PRIuLONG_LONG ",%u,%u>", - (unsigned long long) sector, offset, length); - -@@ -298,9 +305,8 @@ SETUP (const char *dir, - bl.first_block = (struct grub_boot_blocklist *) (core_img - + GRUB_DISK_SECTOR_SIZE - - sizeof (*bl.block)); -- grub_util_info ("root is `%s', dest is `%s'", root, dest); - -- grub_util_info ("Opening dest"); -+ grub_util_info ("Opening dest `%s'", dest); - dest_dev = grub_device_open (dest); - if (! dest_dev) - grub_util_error ("%s", grub_errmsg); -@@ -662,6 +668,16 @@ unable_to_embed: - - bl.block = bl.first_block; - -+#ifdef GRUB_SETUP_SPARC64 -+ { -+ grub_partition_t container = root_dev->disk->partition; -+ bl.gpt_offset = 0; -+ -+ if (grub_strstr (container->partmap->name, "gpt")) -+ bl.gpt_offset = grub_partition_get_start (container); -+ } -+#endif -+ - grub_install_get_blocklist (root_dev, core_path, core_img, core_size, - save_blocklists, &bl); - -@@ -721,15 +737,18 @@ unable_to_embed: - { - char *buf, *ptr = core_img; - size_t len = core_size; -- grub_uint64_t blk; -+ grub_uint64_t blk, offset = 0; - grub_partition_t container = core_dev->disk->partition; - grub_err_t err; - - core_dev->disk->partition = 0; -+#ifdef GRUB_SETUP_SPARC64 -+ offset = bl.gpt_offset; -+#endif - - buf = xmalloc (core_size); - blk = bl.first_sector; -- err = grub_disk_read (core_dev->disk, blk, 0, GRUB_DISK_SECTOR_SIZE, buf); -+ err = grub_disk_read (core_dev->disk, blk + offset, 0, GRUB_DISK_SECTOR_SIZE, buf); - if (err) - grub_util_error (_("cannot read `%s': %s"), core_dev->disk->name, - grub_errmsg); -@@ -748,7 +767,7 @@ unable_to_embed: - if (cur > len) - cur = len; - -- err = grub_disk_read (core_dev->disk, blk, 0, cur, buf); -+ err = grub_disk_read (core_dev->disk, blk + offset, 0, cur, buf); - if (err) - grub_util_error (_("cannot read `%s': %s"), core_dev->disk->name, - grub_errmsg); -diff --git a/grub-core/lib/libgcrypt/cipher/bufhelp.h b/grub-core/lib/libgcrypt/cipher/bufhelp.h -new file mode 100644 -index 0000000000000000000000000000000000000000..df3559472312d8c6c0c038e27571c546ce489283 ---- /dev/null -+++ b/grub-core/lib/libgcrypt/cipher/bufhelp.h -@@ -0,0 +1,432 @@ -+/* bufhelp.h - Some buffer manipulation helpers -+ * Copyright (C) 2012 Jussi Kivilinna -+ * -+ * This file is part of Libgcrypt. -+ * -+ * Libgcrypt is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU Lesser General Public License as -+ * published by the Free Software Foundation; either version 2.1 of -+ * the License, or (at your option) any later version. -+ * -+ * Libgcrypt 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 Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with this program; if not, see . -+ */ -+#ifndef GCRYPT_BUFHELP_H -+#define GCRYPT_BUFHELP_H -+ -+ -+#include "bithelp.h" -+ -+ -+#undef BUFHELP_FAST_UNALIGNED_ACCESS -+#if defined(HAVE_GCC_ATTRIBUTE_PACKED) && \ -+ defined(HAVE_GCC_ATTRIBUTE_ALIGNED) && \ -+ (defined(__i386__) || defined(__x86_64__) || \ -+ (defined(__arm__) && defined(__ARM_FEATURE_UNALIGNED)) || \ -+ defined(__aarch64__)) -+/* These architectures are able of unaligned memory accesses and can -+ handle those fast. -+ */ -+# define BUFHELP_FAST_UNALIGNED_ACCESS 1 -+#endif -+ -+ -+#ifdef BUFHELP_FAST_UNALIGNED_ACCESS -+/* Define type with one-byte alignment on architectures with fast unaligned -+ memory accesses. -+ */ -+typedef struct bufhelp_int_s -+{ -+ uintptr_t a; -+} __attribute__((packed, aligned(1))) bufhelp_int_t; -+#else -+/* Define type with default alignment for other architectures (unaligned -+ accessed handled in per byte loops). -+ */ -+typedef struct bufhelp_int_s -+{ -+ uintptr_t a; -+} bufhelp_int_t; -+#endif -+ -+ -+/* Optimized function for small buffer copying */ -+static inline void -+buf_cpy(void *_dst, const void *_src, size_t len) -+{ -+#if __GNUC__ >= 4 && (defined(__x86_64__) || defined(__i386__)) -+ /* For AMD64 and i386, memcpy is faster. */ -+ memcpy(_dst, _src, len); -+#else -+ byte *dst = _dst; -+ const byte *src = _src; -+ bufhelp_int_t *ldst; -+ const bufhelp_int_t *lsrc; -+#ifndef BUFHELP_FAST_UNALIGNED_ACCESS -+ const unsigned int longmask = sizeof(bufhelp_int_t) - 1; -+ -+ /* Skip fast processing if buffers are unaligned. */ -+ if (((uintptr_t)dst | (uintptr_t)src) & longmask) -+ goto do_bytes; -+#endif -+ -+ ldst = (bufhelp_int_t *)(void *)dst; -+ lsrc = (const bufhelp_int_t *)(const void *)src; -+ -+ for (; len >= sizeof(bufhelp_int_t); len -= sizeof(bufhelp_int_t)) -+ (ldst++)->a = (lsrc++)->a; -+ -+ dst = (byte *)ldst; -+ src = (const byte *)lsrc; -+ -+#ifndef BUFHELP_FAST_UNALIGNED_ACCESS -+do_bytes: -+#endif -+ /* Handle tail. */ -+ for (; len; len--) -+ *dst++ = *src++; -+#endif /*__GNUC__ >= 4 && (__x86_64__ || __i386__)*/ -+} -+ -+ -+/* Optimized function for buffer xoring */ -+static inline void -+buf_xor(void *_dst, const void *_src1, const void *_src2, size_t len) -+{ -+ byte *dst = _dst; -+ const byte *src1 = _src1; -+ const byte *src2 = _src2; -+ bufhelp_int_t *ldst; -+ const bufhelp_int_t *lsrc1, *lsrc2; -+#ifndef BUFHELP_FAST_UNALIGNED_ACCESS -+ const unsigned int longmask = sizeof(bufhelp_int_t) - 1; -+ -+ /* Skip fast processing if buffers are unaligned. */ -+ if (((uintptr_t)dst | (uintptr_t)src1 | (uintptr_t)src2) & longmask) -+ goto do_bytes; -+#endif -+ -+ ldst = (bufhelp_int_t *)(void *)dst; -+ lsrc1 = (const bufhelp_int_t *)(const void *)src1; -+ lsrc2 = (const bufhelp_int_t *)(const void *)src2; -+ -+ for (; len >= sizeof(bufhelp_int_t); len -= sizeof(bufhelp_int_t)) -+ (ldst++)->a = (lsrc1++)->a ^ (lsrc2++)->a; -+ -+ dst = (byte *)ldst; -+ src1 = (const byte *)lsrc1; -+ src2 = (const byte *)lsrc2; -+ -+#ifndef BUFHELP_FAST_UNALIGNED_ACCESS -+do_bytes: -+#endif -+ /* Handle tail. */ -+ for (; len; len--) -+ *dst++ = *src1++ ^ *src2++; -+} -+ -+ -+/* Optimized function for in-place buffer xoring. */ -+static inline void -+buf_xor_1(void *_dst, const void *_src, size_t len) -+{ -+ byte *dst = _dst; -+ const byte *src = _src; -+ bufhelp_int_t *ldst; -+ const bufhelp_int_t *lsrc; -+#ifndef BUFHELP_FAST_UNALIGNED_ACCESS -+ const unsigned int longmask = sizeof(bufhelp_int_t) - 1; -+ -+ /* Skip fast processing if buffers are unaligned. */ -+ if (((uintptr_t)dst | (uintptr_t)src) & longmask) -+ goto do_bytes; -+#endif -+ -+ ldst = (bufhelp_int_t *)(void *)dst; -+ lsrc = (const bufhelp_int_t *)(const void *)src; -+ -+ for (; len >= sizeof(bufhelp_int_t); len -= sizeof(bufhelp_int_t)) -+ (ldst++)->a ^= (lsrc++)->a; -+ -+ dst = (byte *)ldst; -+ src = (const byte *)lsrc; -+ -+#ifndef BUFHELP_FAST_UNALIGNED_ACCESS -+do_bytes: -+#endif -+ /* Handle tail. */ -+ for (; len; len--) -+ *dst++ ^= *src++; -+} -+ -+ -+/* Optimized function for buffer xoring with two destination buffers. Used -+ mainly by CFB mode encryption. */ -+static inline void -+buf_xor_2dst(void *_dst1, void *_dst2, const void *_src, size_t len) -+{ -+ byte *dst1 = _dst1; -+ byte *dst2 = _dst2; -+ const byte *src = _src; -+ bufhelp_int_t *ldst1, *ldst2; -+ const bufhelp_int_t *lsrc; -+#ifndef BUFHELP_FAST_UNALIGNED_ACCESS -+ const unsigned int longmask = sizeof(bufhelp_int_t) - 1; -+ -+ /* Skip fast processing if buffers are unaligned. */ -+ if (((uintptr_t)src | (uintptr_t)dst1 | (uintptr_t)dst2) & longmask) -+ goto do_bytes; -+#endif -+ -+ ldst1 = (bufhelp_int_t *)(void *)dst1; -+ ldst2 = (bufhelp_int_t *)(void *)dst2; -+ lsrc = (const bufhelp_int_t *)(const void *)src; -+ -+ for (; len >= sizeof(bufhelp_int_t); len -= sizeof(bufhelp_int_t)) -+ (ldst1++)->a = ((ldst2++)->a ^= (lsrc++)->a); -+ -+ dst1 = (byte *)ldst1; -+ dst2 = (byte *)ldst2; -+ src = (const byte *)lsrc; -+ -+#ifndef BUFHELP_FAST_UNALIGNED_ACCESS -+do_bytes: -+#endif -+ /* Handle tail. */ -+ for (; len; len--) -+ *dst1++ = (*dst2++ ^= *src++); -+} -+ -+ -+/* Optimized function for combined buffer xoring and copying. Used by mainly -+ CBC mode decryption. */ -+static inline void -+buf_xor_n_copy_2(void *_dst_xor, const void *_src_xor, void *_srcdst_cpy, -+ const void *_src_cpy, size_t len) -+{ -+ byte *dst_xor = _dst_xor; -+ byte *srcdst_cpy = _srcdst_cpy; -+ const byte *src_xor = _src_xor; -+ const byte *src_cpy = _src_cpy; -+ byte temp; -+ bufhelp_int_t *ldst_xor, *lsrcdst_cpy; -+ const bufhelp_int_t *lsrc_cpy, *lsrc_xor; -+ uintptr_t ltemp; -+#ifndef BUFHELP_FAST_UNALIGNED_ACCESS -+ const unsigned int longmask = sizeof(bufhelp_int_t) - 1; -+ -+ /* Skip fast processing if buffers are unaligned. */ -+ if (((uintptr_t)src_cpy | (uintptr_t)src_xor | (uintptr_t)dst_xor | -+ (uintptr_t)srcdst_cpy) & longmask) -+ goto do_bytes; -+#endif -+ -+ ldst_xor = (bufhelp_int_t *)(void *)dst_xor; -+ lsrc_xor = (const bufhelp_int_t *)(void *)src_xor; -+ lsrcdst_cpy = (bufhelp_int_t *)(void *)srcdst_cpy; -+ lsrc_cpy = (const bufhelp_int_t *)(const void *)src_cpy; -+ -+ for (; len >= sizeof(bufhelp_int_t); len -= sizeof(bufhelp_int_t)) -+ { -+ ltemp = (lsrc_cpy++)->a; -+ (ldst_xor++)->a = (lsrcdst_cpy)->a ^ (lsrc_xor++)->a; -+ (lsrcdst_cpy++)->a = ltemp; -+ } -+ -+ dst_xor = (byte *)ldst_xor; -+ src_xor = (const byte *)lsrc_xor; -+ srcdst_cpy = (byte *)lsrcdst_cpy; -+ src_cpy = (const byte *)lsrc_cpy; -+ -+#ifndef BUFHELP_FAST_UNALIGNED_ACCESS -+do_bytes: -+#endif -+ /* Handle tail. */ -+ for (; len; len--) -+ { -+ temp = *src_cpy++; -+ *dst_xor++ = *srcdst_cpy ^ *src_xor++; -+ *srcdst_cpy++ = temp; -+ } -+} -+ -+ -+/* Optimized function for combined buffer xoring and copying. Used by mainly -+ CFB mode decryption. */ -+static inline void -+buf_xor_n_copy(void *_dst_xor, void *_srcdst_cpy, const void *_src, size_t len) -+{ -+ buf_xor_n_copy_2(_dst_xor, _src, _srcdst_cpy, _src, len); -+} -+ -+ -+/* Constant-time compare of two buffers. Returns 1 if buffers are equal, -+ and 0 if buffers differ. */ -+static inline int -+buf_eq_const(const void *_a, const void *_b, size_t len) -+{ -+ const byte *a = _a; -+ const byte *b = _b; -+ size_t diff, i; -+ -+ /* Constant-time compare. */ -+ for (i = 0, diff = 0; i < len; i++) -+ diff -= !!(a[i] - b[i]); -+ -+ return !diff; -+} -+ -+ -+#ifndef BUFHELP_FAST_UNALIGNED_ACCESS -+ -+/* Functions for loading and storing unaligned u32 values of different -+ endianness. */ -+static inline u32 buf_get_be32(const void *_buf) -+{ -+ const byte *in = _buf; -+ return ((u32)in[0] << 24) | ((u32)in[1] << 16) | \ -+ ((u32)in[2] << 8) | (u32)in[3]; -+} -+ -+static inline u32 buf_get_le32(const void *_buf) -+{ -+ const byte *in = _buf; -+ return ((u32)in[3] << 24) | ((u32)in[2] << 16) | \ -+ ((u32)in[1] << 8) | (u32)in[0]; -+} -+ -+static inline void buf_put_be32(void *_buf, u32 val) -+{ -+ byte *out = _buf; -+ out[0] = val >> 24; -+ out[1] = val >> 16; -+ out[2] = val >> 8; -+ out[3] = val; -+} -+ -+static inline void buf_put_le32(void *_buf, u32 val) -+{ -+ byte *out = _buf; -+ out[3] = val >> 24; -+ out[2] = val >> 16; -+ out[1] = val >> 8; -+ out[0] = val; -+} -+ -+ -+/* Functions for loading and storing unaligned u64 values of different -+ endianness. */ -+static inline u64 buf_get_be64(const void *_buf) -+{ -+ const byte *in = _buf; -+ return ((u64)in[0] << 56) | ((u64)in[1] << 48) | \ -+ ((u64)in[2] << 40) | ((u64)in[3] << 32) | \ -+ ((u64)in[4] << 24) | ((u64)in[5] << 16) | \ -+ ((u64)in[6] << 8) | (u64)in[7]; -+} -+ -+static inline u64 buf_get_le64(const void *_buf) -+{ -+ const byte *in = _buf; -+ return ((u64)in[7] << 56) | ((u64)in[6] << 48) | \ -+ ((u64)in[5] << 40) | ((u64)in[4] << 32) | \ -+ ((u64)in[3] << 24) | ((u64)in[2] << 16) | \ -+ ((u64)in[1] << 8) | (u64)in[0]; -+} -+ -+static inline void buf_put_be64(void *_buf, u64 val) -+{ -+ byte *out = _buf; -+ out[0] = val >> 56; -+ out[1] = val >> 48; -+ out[2] = val >> 40; -+ out[3] = val >> 32; -+ out[4] = val >> 24; -+ out[5] = val >> 16; -+ out[6] = val >> 8; -+ out[7] = val; -+} -+ -+static inline void buf_put_le64(void *_buf, u64 val) -+{ -+ byte *out = _buf; -+ out[7] = val >> 56; -+ out[6] = val >> 48; -+ out[5] = val >> 40; -+ out[4] = val >> 32; -+ out[3] = val >> 24; -+ out[2] = val >> 16; -+ out[1] = val >> 8; -+ out[0] = val; -+} -+ -+#else /*BUFHELP_FAST_UNALIGNED_ACCESS*/ -+ -+typedef struct bufhelp_u32_s -+{ -+ u32 a; -+} __attribute__((packed, aligned(1))) bufhelp_u32_t; -+ -+/* Functions for loading and storing unaligned u32 values of different -+ endianness. */ -+static inline u32 buf_get_be32(const void *_buf) -+{ -+ return be_bswap32(((const bufhelp_u32_t *)_buf)->a); -+} -+ -+static inline u32 buf_get_le32(const void *_buf) -+{ -+ return le_bswap32(((const bufhelp_u32_t *)_buf)->a); -+} -+ -+static inline void buf_put_be32(void *_buf, u32 val) -+{ -+ bufhelp_u32_t *out = _buf; -+ out->a = be_bswap32(val); -+} -+ -+static inline void buf_put_le32(void *_buf, u32 val) -+{ -+ bufhelp_u32_t *out = _buf; -+ out->a = le_bswap32(val); -+} -+ -+ -+typedef struct bufhelp_u64_s -+{ -+ u64 a; -+} __attribute__((packed, aligned(1))) bufhelp_u64_t; -+ -+/* Functions for loading and storing unaligned u64 values of different -+ endianness. */ -+static inline u64 buf_get_be64(const void *_buf) -+{ -+ return be_bswap64(((const bufhelp_u64_t *)_buf)->a); -+} -+ -+static inline u64 buf_get_le64(const void *_buf) -+{ -+ return le_bswap64(((const bufhelp_u64_t *)_buf)->a); -+} -+ -+static inline void buf_put_be64(void *_buf, u64 val) -+{ -+ bufhelp_u64_t *out = _buf; -+ out->a = be_bswap64(val); -+} -+ -+static inline void buf_put_le64(void *_buf, u64 val) -+{ -+ bufhelp_u64_t *out = _buf; -+ out->a = le_bswap64(val); -+} -+ -+ -+#endif /*BUFHELP_FAST_UNALIGNED_ACCESS*/ -+ -+#endif /*GCRYPT_BUFHELP_H*/ -diff --git a/grub-core/tests/checksums.h b/grub-core/tests/checksums.h -index 68d8ce7c7753ff721ab0d5a12d40b2aff20c694c..8273bd105deec0bf21f507e0eddb867f104afc5d 100644 ---- a/grub-core/tests/checksums.h -+++ b/grub-core/tests/checksums.h -@@ -1,129 +1,129 @@ -- { "cmdline_cat", 640, 480, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi16 */, (grub_uint32_t []) { 0x59c36f00, 0xcd5fc34e, 0xcd5fc34e, 0xeabbecab, 0xeabbecab, 0xc9950151, 0xc9950151, 0x2be222b6, 0x2be222b6, 0xe88c769e, 0xe88c769e, 0x6be4910e, 0x6be4910e, 0x1dc1fe4f, 0x1dc1fe4f, 0xd7613e8f, 0xd7613e8f, 0xf8124196, 0xf8124196, 0x130f5935, 0x130f5935, 0x2872330e, 0x2872330e, 0xaa7b7868, 0xaa7b7868, 0x558eaeea, 0x558eaeea, 0x92f7960f, 0x92f7960f, 0xc5bfc709, 0xc5bfc709, 0x699732fe, 0x699732fe, 0xc859125f, 0xc859125f, 0xfc6ac729, 0xfc6ac729, 0xcdab6cd4, 0xcdab6cd4, 0x58a8b7f8, 0x58a8b7f8, 0xc0e73385, 0x6560d6ef, 0x3be8bb5d, 0x3be8bb5d, }, 45 }, -- { "cmdline_cat", 800, 600, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi16 */, (grub_uint32_t []) { 0xaa4593fe, 0x13029f94, 0x13029f94, 0x7785fdab, 0x7785fdab, 0x95a7c1e8, 0x95a7c1e8, 0x315ab3e3, 0x315ab3e3, 0x6787f012, 0x6787f012, 0x79b1ecdc, 0x79b1ecdc, 0xdbc67810, 0xdbc67810, 0xafaa982e, 0xafaa982e, 0xc5cd0157, 0xc5cd0157, 0x3c50dd64, 0x3c50dd64, 0x1056cac0, 0x1056cac0, 0x1d7a41fa, 0x1d7a41fa, 0x5690b1e8, 0x5690b1e8, 0x616831d6, 0x616831d6, 0xfaf8e726, 0xfaf8e726, 0xd1ec5e26, 0xd1ec5e26, 0x3c269e1f, 0x3c269e1f, 0x1aa7952d, 0x1aa7952d, 0x6e7e2f99, 0x6e7e2f99, 0x98f4c02, 0x98f4c02, 0xc3f1abf2, 0xe348bb73, 0xea53cd60, 0xea53cd60, }, 45 }, -- { "cmdline_cat", 1024, 768, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi16 */, (grub_uint32_t []) { 0xc9cbf769, 0x8fbb4f4c, 0x8fbb4f4c, 0x5dc00167, 0x5dc00167, 0xbc124df8, 0xbc124df8, 0x31cf0f8e, 0x31cf0f8e, 0x798cc4ed, 0x798cc4ed, 0xc5d2a091, 0xc5d2a091, 0xb58a0591, 0xb58a0591, 0x4d118aca, 0x4d118aca, 0xbb06c7ee, 0xbb06c7ee, 0x42179db7, 0x42179db7, 0x65f2d81e, 0x65f2d81e, 0xa2628bcb, 0xa2628bcb, 0xbdb7f4b, 0xbdb7f4b, 0x66b10309, 0x66b10309, 0x1a550ea9, 0x1a550ea9, 0x377a297d, 0x377a297d, 0x2ea99015, 0x2ea99015, 0x4e20d7bc, 0x4e20d7bc, 0x8ecbde02, 0x8ecbde02, 0xdfa2195a, 0xdfa2195a, 0xe113d2a, 0xe204ee5b, 0x734679c1, 0x734679c1, }, 45 }, -- { "cmdline_cat", 640, 480, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 640x480xrgba8888 */, (grub_uint32_t []) { 0x9813a416, 0xe2f6bfe1, 0xe2f6bfe1, 0xf18aee15, 0xf18aee15, 0x5e83b689, 0x5e83b689, 0xb7e8b42c, 0xb7e8b42c, 0x85d78f92, 0x85d78f92, 0xd56fadae, 0xd56fadae, 0x7632f5bf, 0x7632f5bf, 0x2769a748, 0x2769a748, 0x4a6112cd, 0x4a6112cd, 0x4f9b66a4, 0x4f9b66a4, 0x70457d38, 0x70457d38, 0x8cadb1a7, 0x8cadb1a7, 0x451341f, 0x451341f, 0x8a62e741, 0x8a62e741, 0x1b1f9031, 0x1b1f9031, 0x75ab630e, 0x75ab630e, 0xd5ff53ac, 0xd5ff53ac, 0x73a2b3c7, 0x73a2b3c7, 0x7b52acd5, 0x7b52acd5, 0xf6f3e48c, 0xf6f3e48c, 0x8d0db133, 0x8db24310, 0x7aef56d4, 0x7aef56d4, }, 45 }, -- { "cmdline_cat", 800, 600, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 800x600xrgba8888 */, (grub_uint32_t []) { 0x5fcf013d, 0x838a3f40, 0x838a3f40, 0x7351ba96, 0x7351ba96, 0x660963bb, 0x660963bb, 0x6f3362a6, 0x6f3362a6, 0x915d35d9, 0x915d35d9, 0xc7edaee9, 0xc7edaee9, 0xbc8ec24c, 0xbc8ec24c, 0xeb120ffd, 0xeb120ffd, 0x8f6d8232, 0x8f6d8232, 0x2de5d515, 0x2de5d515, 0x4f2ecd91, 0x4f2ecd91, 0x555a9b90, 0x555a9b90, 0x8f7b0d77, 0x8f7b0d77, 0x5f9536af, 0x5f9536af, 0x3dd79dbe, 0x3dd79dbe, 0xb555a0, 0xb555a0, 0x75aec882, 0x75aec882, 0xd5da89cb, 0xd5da89cb, 0xb47b3257, 0xb47b3257, 0x7c97c046, 0x7c97c046, 0x726a7abe, 0x4c8b8a56, 0xcffa0854, 0xcffa0854, }, 45 }, -- { "cmdline_cat", 1024, 768, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 1024x768xrgba8888 */, (grub_uint32_t []) { 0xdd28f52b, 0x7bf761e, 0x7bf761e, 0xaf0b6dae, 0xaf0b6dae, 0x7db15930, 0x7db15930, 0xc9720d56, 0xc9720d56, 0x55590d6c, 0x55590d6c, 0xa0d193d9, 0xa0d193d9, 0x728987b2, 0x728987b2, 0x28aecde6, 0x28aecde6, 0xa59bb094, 0xa59bb094, 0x2d0b049d, 0x2d0b049d, 0xd8421240, 0xd8421240, 0x51fa339, 0x51fa339, 0xc625cc46, 0xc625cc46, 0x2c9e6fcc, 0x2c9e6fcc, 0x3d06ffd5, 0x3d06ffd5, 0x8dd72816, 0x8dd72816, 0xfcf2a982, 0xfcf2a982, 0x6ef2870f, 0x6ef2870f, 0xba2caab7, 0xba2caab7, 0x8e5a5872, 0x8e5a5872, 0x62b2fedc, 0x2bd3b588, 0x34ebdb15, 0x34ebdb15, }, 45 }, -- { "cmdline_cat", 2560, 1440, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 2560x1440xrgba8888 */, (grub_uint32_t []) { 0x43d1f34, 0xa133280a, 0xa133280a, 0x1e8f4227, 0x1e8f4227, 0xa01cd911, 0xa01cd911, 0xdcb3d617, 0xdcb3d617, 0x51200351, 0x51200351, 0x609ba305, 0x609ba305, 0x5d96abfd, 0x5d96abfd, 0xd855cc70, 0xd855cc70, 0xdbfaf18d, 0xdbfaf18d, 0x84814843, 0x84814843, 0x4b00e630, 0x4b00e630, 0xd362b0f5, 0xd362b0f5, 0xec863355, 0xec863355, 0x195898d0, 0x195898d0, 0xe8c698c7, 0xe8c698c7, 0x884229e7, 0x884229e7, 0xb41ed3a9, 0xb41ed3a9, 0x2be1ce40, 0x2be1ce40, 0x8c33eb7c, 0x8c33eb7c, 0xbbce1da, 0xbbce1da, 0xef9415fa, 0x22fbc0d, 0xd82c182c, 0xd82c182c, }, 45 }, -- { "gfxterm_menu", 640, 480, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi16 */, (grub_uint32_t []) { 0x59c36f00, 0xbe029c, 0x6671ee1f, 0xbe029c, 0x4348cfdb, 0x59c36f00, 0x59c36f00, 0x3ad73295, 0x3ad73295, 0x3ad73295, 0x44575ff3, 0x44575ff3, 0x44575ff3, 0x26a14a21, 0x26a14a21, 0x26a14a21, 0x59c36f00, 0x4348cfdb, 0x4348cfdb, 0x59c36f00, }, 20 }, -- { "gfxterm_menu", 800, 600, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi16 */, (grub_uint32_t []) { 0xaa4593fe, 0x14e228ef, 0xb0c8af57, 0x14e228ef, 0x3ae7ad90, 0xaa4593fe, 0xaa4593fe, 0xbec19c1b, 0xbec19c1b, 0xbec19c1b, 0x1834917c, 0x1834917c, 0x1834917c, 0x350c3a04, 0x350c3a04, 0x350c3a04, 0xaa4593fe, 0x3ae7ad90, 0x3ae7ad90, 0xaa4593fe, }, 20 }, -- { "gfxterm_menu", 1024, 768, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi16 */, (grub_uint32_t []) { 0xc9cbf769, 0x651fb144, 0xdf93ee9c, 0x651fb144, 0x3808dcc0, 0xc9cbf769, 0xc9cbf769, 0xe4861949, 0xe4861949, 0xe4861949, 0x1a5ed885, 0x1a5ed885, 0x1a5ed885, 0xf314678d, 0xf314678d, 0xf314678d, 0xc9cbf769, 0x3808dcc0, 0x3808dcc0, 0xc9cbf769, }, 20 }, -- { "gfxterm_menu", 640, 480, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 640x480xrgba8888 */, (grub_uint32_t []) { 0x9813a416, 0xdfd0119e, 0x6c7018a9, 0xdfd0119e, 0x71865846, 0x9813a416, 0x9813a416, 0xb5e8801c, 0xb5e8801c, 0xb5e8801c, 0x2433062f, 0x2433062f, 0x2433062f, 0x3d893bff, 0x3d893bff, 0x3d893bff, 0x9813a416, 0x71865846, 0x71865846, 0x9813a416, }, 20 }, -- { "gfxterm_menu", 800, 600, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 800x600xrgba8888 */, (grub_uint32_t []) { 0x5fcf013d, 0x4e4844e0, 0x5ebe5f81, 0x4e4844e0, 0x38ee7153, 0x5fcf013d, 0x5fcf013d, 0x819b5c4e, 0x819b5c4e, 0x819b5c4e, 0x538b4438, 0x538b4438, 0x538b4438, 0x45f87ba7, 0x45f87ba7, 0x45f87ba7, 0x5fcf013d, 0x38ee7153, 0x38ee7153, 0x5fcf013d, }, 20 }, -- { "gfxterm_menu", 1024, 768, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 1024x768xrgba8888 */, (grub_uint32_t []) { 0xdd28f52b, 0x701427d4, 0x246c830a, 0x701427d4, 0x6b11fdd3, 0xdd28f52b, 0xdd28f52b, 0xcd83646c, 0xcd83646c, 0xcd83646c, 0xecbf9d88, 0xecbf9d88, 0xecbf9d88, 0x91075604, 0x91075604, 0x91075604, 0xdd28f52b, 0x6b11fdd3, 0x6b11fdd3, 0xdd28f52b, }, 20 }, -- { "gfxterm_menu", 2560, 1440, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 2560x1440xrgba8888 */, (grub_uint32_t []) { 0x43d1f34, 0x7b5bd4c, 0xac246af1, 0x7b5bd4c, 0xf80aa6cc, 0x43d1f34, 0x43d1f34, 0xb200c08a, 0xb200c08a, 0xb200c08a, 0xcd0a6922, 0xcd0a6922, 0xcd0a6922, 0x545b6ca4, 0x545b6ca4, 0x545b6ca4, 0x43d1f34, 0xf80aa6cc, 0xf80aa6cc, 0x43d1f34, }, 20 }, -- { "gfxmenu", 640, 480, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi16 */, (grub_uint32_t []) { 0x59c36f00, 0x1027210c, 0x64e51c81, 0x1027210c, 0x45ca4a8a, 0x9a2e0d26, 0x12fd0f21, 0x12fd0f21, 0x12fd0f21, 0x4e25f9e1, 0x4e25f9e1, 0x4e25f9e1, 0x67bd3773, 0x67bd3773, 0x67bd3773, 0x59c36f00, 0x45ca4a8a, 0x45ca4a8a, }, 18 }, -- { "gfxmenu", 800, 600, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi16 */, (grub_uint32_t []) { 0xaa4593fe, 0x8d12f697, 0xc5b32248, 0x8d12f697, 0x56720aa4, 0xa9d58ccd, 0xf766a14d, 0xf766a14d, 0xf766a14d, 0xa2390b47, 0xa2390b47, 0xa2390b47, 0xcb0ac30e, 0xcb0ac30e, 0xcb0ac30e, 0xaa4593fe, 0x56720aa4, 0x56720aa4, }, 18 }, -- { "gfxmenu", 1024, 768, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi16 */, (grub_uint32_t []) { 0xc9cbf769, 0xa5ec9f45, 0xdb7085d8, 0xa5ec9f45, 0x9caf1d3f, 0x5411be8b, 0xedc0ad83, 0xedc0ad83, 0xedc0ad83, 0x927e0b17, 0x927e0b17, 0x927e0b17, 0xd00a6b6f, 0xd00a6b6f, 0xd00a6b6f, 0xc9cbf769, 0x9caf1d3f, 0x9caf1d3f, }, 18 }, -- { "gfxmenu", 640, 480, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 640x480xrgba8888 */, (grub_uint32_t []) { 0x1c3742c9, 0xce8e83bf, 0xeb96c838, 0xce8e83bf, 0x73cb3bc1, 0x740d78cf, 0xb35c7e64, 0xb35c7e64, 0xb35c7e64, 0x58f99418, 0x58f99418, 0x58f99418, 0x5eb294e8, 0x5eb294e8, 0x5eb294e8, 0x1c3742c9, 0x73cb3bc1, 0x73cb3bc1, }, 18 }, -- { "gfxmenu", 800, 600, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 800x600xrgba8888 */, (grub_uint32_t []) { 0xcc5a7bed, 0x56a03e51, 0xee7d8d4b, 0x56a03e51, 0x5bdf9413, 0xbcda144c, 0x220f7a5e, 0x220f7a5e, 0x220f7a5e, 0x4d46a64f, 0x4d46a64f, 0x4d46a64f, 0x40b0384c, 0x40b0384c, 0x40b0384c, 0xcc5a7bed, 0x5bdf9413, 0x5bdf9413, }, 18 }, -- { "gfxmenu", 1024, 768, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 1024x768xrgba8888 */, (grub_uint32_t []) { 0xef4a3312, 0xea8a9cf0, 0x8929e522, 0xea8a9cf0, 0x78f3dfbc, 0x5d55a141, 0x377f1aeb, 0x377f1aeb, 0x377f1aeb, 0xf1cd5ef5, 0xf1cd5ef5, 0xf1cd5ef5, 0xe5a88e4a, 0xe5a88e4a, 0xe5a88e4a, 0xef4a3312, 0x78f3dfbc, 0x78f3dfbc, }, 18 }, -- { "gfxmenu", 2560, 1440, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 2560x1440xrgba8888 */, (grub_uint32_t []) { 0x54e48d80, 0x6dcf1d57, 0x925a4c8f, 0x6dcf1d57, 0x69005b38, 0x6d6bb4bc, 0x756a36b9, 0x756a36b9, 0x756a36b9, 0xf499c068, 0xf499c068, 0xf499c068, 0x623d7907, 0x623d7907, 0x623d7907, 0x54e48d80, 0x69005b38, 0x69005b38, }, 18 }, -- { "gfxterm_ar", 640, 480, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi16 */, (grub_uint32_t []) { 0x59c36f00, 0xa49d26b0, 0xaa7d9b28, 0xa49d26b0, 0xe76bebf7, 0x59c36f00, 0x59c36f00, 0xea6ab252, 0xea6ab252, 0xea6ab252, 0x94eadf34, 0x94eadf34, 0x94eadf34, 0xf61ccae6, 0xf61ccae6, 0xf61ccae6, 0x59c36f00, 0xe76bebf7, 0xe76bebf7, 0x59c36f00, }, 20 }, -- { "gfxterm_ar", 800, 600, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi16 */, (grub_uint32_t []) { 0xaa4593fe, 0x7a277db, 0xf3bf80f7, 0x7a277db, 0x29a7f2a4, 0xaa4593fe, 0xaa4593fe, 0xf1cd57e3, 0xf1cd57e3, 0xf1cd57e3, 0x57385a84, 0x57385a84, 0x57385a84, 0x7a00f1fc, 0x7a00f1fc, 0x7a00f1fc, 0xaa4593fe, 0x29a7f2a4, 0x29a7f2a4, 0xaa4593fe, }, 20 }, -- { "gfxterm_ar", 1024, 768, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi16 */, (grub_uint32_t []) { 0xc9cbf769, 0x631edf85, 0x71926408, 0x631edf85, 0x3e09b201, 0xc9cbf769, 0xc9cbf769, 0xf224ab3, 0xf224ab3, 0xf224ab3, 0xf1fa8b7f, 0xf1fa8b7f, 0xf1fa8b7f, 0x18b03477, 0x18b03477, 0x18b03477, 0xc9cbf769, 0x3e09b201, 0x3e09b201, 0xc9cbf769, }, 20 }, -- { "gfxterm_ar", 640, 480, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 640x480xrgba8888 */, (grub_uint32_t []) { 0x9813a416, 0xfbaf4635, 0xe69ef474, 0xfbaf4635, 0x55f90fed, 0x9813a416, 0x9813a416, 0x3aad8f41, 0x3aad8f41, 0x3aad8f41, 0xab760972, 0xab760972, 0xab760972, 0xb2cc34a2, 0xb2cc34a2, 0xb2cc34a2, 0x9813a416, 0x55f90fed, 0x55f90fed, 0x9813a416, }, 20 }, -- { "gfxterm_ar", 800, 600, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 800x600xrgba8888 */, (grub_uint32_t []) { 0x5fcf013d, 0xdce50745, 0x1d8009e4, 0xdce50745, 0xaa4332f6, 0x5fcf013d, 0x5fcf013d, 0x354e5749, 0x354e5749, 0x354e5749, 0xe75e4f3f, 0xe75e4f3f, 0xe75e4f3f, 0xf12d70a0, 0xf12d70a0, 0xf12d70a0, 0x5fcf013d, 0xaa4332f6, 0xaa4332f6, 0x5fcf013d, }, 20 }, -- { "gfxterm_ar", 1024, 768, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 1024x768xrgba8888 */, (grub_uint32_t []) { 0xdd28f52b, 0x3efebeff, 0xf101dfe2, 0x3efebeff, 0x25fb64f8, 0xdd28f52b, 0xdd28f52b, 0x70c69ebd, 0x70c69ebd, 0x70c69ebd, 0x51fa6759, 0x51fa6759, 0x51fa6759, 0x2c42acd5, 0x2c42acd5, 0x2c42acd5, 0xdd28f52b, 0x25fb64f8, 0x25fb64f8, 0xdd28f52b, }, 20 }, -- { "gfxterm_ar", 2560, 1440, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 2560x1440xrgba8888 */, (grub_uint32_t []) { 0x43d1f34, 0x59a34c64, 0x281cca78, 0x59a34c64, 0xa61c57e4, 0x43d1f34, 0x43d1f34, 0x95131d4, 0x95131d4, 0x95131d4, 0x765b987c, 0x765b987c, 0x765b987c, 0xef0a9dfa, 0xef0a9dfa, 0xef0a9dfa, 0x43d1f34, 0xa61c57e4, 0xa61c57e4, 0x43d1f34, }, 20 }, -- { "gfxterm_cyr", 640, 480, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi16 */, (grub_uint32_t []) { 0x59c36f00, 0xa37c165, 0x72063383, 0xa37c165, 0x49c10c22, 0x59c36f00, 0x59c36f00, 0x4e53de8e, 0x4e53de8e, 0x4e53de8e, 0x30d3b3e8, 0x30d3b3e8, 0x30d3b3e8, 0x5225a63a, 0x5225a63a, 0x5225a63a, 0x59c36f00, 0x49c10c22, 0x49c10c22, 0x59c36f00, }, 20 }, -- { "gfxterm_cyr", 800, 600, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi16 */, (grub_uint32_t []) { 0xaa4593fe, 0x45bba0ba, 0xe60fd0b6, 0x45bba0ba, 0x6bbe25c5, 0xaa4593fe, 0xaa4593fe, 0x28de2b41, 0x28de2b41, 0x28de2b41, 0x8e2b2626, 0x8e2b2626, 0x8e2b2626, 0xa3138d5e, 0xa3138d5e, 0xa3138d5e, 0xaa4593fe, 0x6bbe25c5, 0x6bbe25c5, 0xaa4593fe, }, 20 }, -- { "gfxterm_cyr", 1024, 768, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi16 */, (grub_uint32_t []) { 0xc9cbf769, 0xb43d4e9d, 0x16f88820, 0xb43d4e9d, 0xe92a2319, 0xc9cbf769, 0xc9cbf769, 0xb8959ec7, 0xb8959ec7, 0xb8959ec7, 0x464d5f0b, 0x464d5f0b, 0x464d5f0b, 0xaf07e003, 0xaf07e003, 0xaf07e003, 0xc9cbf769, 0xe92a2319, 0xe92a2319, 0xc9cbf769, }, 20 }, -- { "gfxterm_cyr", 640, 480, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 640x480xrgba8888 */, (grub_uint32_t []) { 0x9813a416, 0x46760365, 0x685ae30e, 0x46760365, 0xe8204abd, 0x9813a416, 0x9813a416, 0x8896050a, 0x8896050a, 0x8896050a, 0x194d8339, 0x194d8339, 0x194d8339, 0xf7bee9, 0xf7bee9, 0xf7bee9, 0x9813a416, 0xe8204abd, 0xe8204abd, 0x9813a416, }, 20 }, -- { "gfxterm_cyr", 800, 600, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 800x600xrgba8888 */, (grub_uint32_t []) { 0x5fcf013d, 0x6859aa86, 0xf3f11deb, 0x6859aa86, 0x1eff9f35, 0x5fcf013d, 0x5fcf013d, 0xd72b1482, 0xd72b1482, 0xd72b1482, 0x53b0cf4, 0x53b0cf4, 0x53b0cf4, 0x1348336b, 0x1348336b, 0x1348336b, 0x5fcf013d, 0x1eff9f35, 0x1eff9f35, 0x5fcf013d, }, 20 }, -- { "gfxterm_cyr", 1024, 768, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 1024x768xrgba8888 */, (grub_uint32_t []) { 0xdd28f52b, 0x688451e7, 0xf6936b72, 0x688451e7, 0x73818be0, 0xdd28f52b, 0xdd28f52b, 0xf12a65ac, 0xf12a65ac, 0xf12a65ac, 0xd0169c48, 0xd0169c48, 0xd0169c48, 0xadae57c4, 0xadae57c4, 0xadae57c4, 0xdd28f52b, 0x73818be0, 0x73818be0, 0xdd28f52b, }, 20 }, -- { "gfxterm_cyr", 2560, 1440, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 2560x1440xrgba8888 */, (grub_uint32_t []) { 0x43d1f34, 0x9616af94, 0xd466be40, 0x9616af94, 0x69a9b414, 0x43d1f34, 0x43d1f34, 0xf3bb3240, 0xf3bb3240, 0xf3bb3240, 0x8cb19be8, 0x8cb19be8, 0x8cb19be8, 0x15e09e6e, 0x15e09e6e, 0x15e09e6e, 0x43d1f34, 0x69a9b414, 0x69a9b414, 0x43d1f34, }, 20 }, -- { "gfxterm_heb", 640, 480, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi16 */, (grub_uint32_t []) { 0x59c36f00, 0x8708d1bd, 0x85dd5e9c, 0x8708d1bd, 0xc4fe1cfa, 0x59c36f00, 0x59c36f00, 0x7ae8aced, 0x7ae8aced, 0x7ae8aced, 0x468c18b, 0x468c18b, 0x468c18b, 0x669ed459, 0x669ed459, 0x669ed459, 0x59c36f00, 0xc4fe1cfa, 0xc4fe1cfa, 0x59c36f00, }, 20 }, -- { "gfxterm_heb", 800, 600, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi16 */, (grub_uint32_t []) { 0xaa4593fe, 0xa72b1043, 0x147d4ce0, 0xa72b1043, 0x892e953c, 0xaa4593fe, 0xaa4593fe, 0xb7b1dd40, 0xb7b1dd40, 0xb7b1dd40, 0x1144d027, 0x1144d027, 0x1144d027, 0x3c7c7b5f, 0x3c7c7b5f, 0x3c7c7b5f, 0xaa4593fe, 0x892e953c, 0x892e953c, 0xaa4593fe, }, 20 }, -- { "gfxterm_heb", 1024, 768, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi16 */, (grub_uint32_t []) { 0xc9cbf769, 0xc5fb1817, 0x745fb26c, 0xc5fb1817, 0x98ec7593, 0xc9cbf769, 0xc9cbf769, 0xf5f17e2d, 0xf5f17e2d, 0xf5f17e2d, 0xb29bfe1, 0xb29bfe1, 0xb29bfe1, 0xe26300e9, 0xe26300e9, 0xe26300e9, 0xc9cbf769, 0x98ec7593, 0x98ec7593, 0xc9cbf769, }, 20 }, -- { "gfxterm_heb", 640, 480, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 640x480xrgba8888 */, (grub_uint32_t []) { 0x9813a416, 0x4be837e1, 0xbf4963ca, 0x4be837e1, 0xe5be7e39, 0x9813a416, 0x9813a416, 0xd886fca0, 0xd886fca0, 0xd886fca0, 0x495d7a93, 0x495d7a93, 0x495d7a93, 0x50e74743, 0x50e74743, 0x50e74743, 0x9813a416, 0xe5be7e39, 0xe5be7e39, 0x9813a416, }, 20 }, -- { "gfxterm_heb", 800, 600, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 800x600xrgba8888 */, (grub_uint32_t []) { 0x5fcf013d, 0x21a8ccb8, 0x17719be, 0x21a8ccb8, 0x570ef90b, 0x5fcf013d, 0x5fcf013d, 0x2a7b5333, 0x2a7b5333, 0x2a7b5333, 0xf86b4b45, 0xf86b4b45, 0xf86b4b45, 0xee1874da, 0xee1874da, 0xee1874da, 0x5fcf013d, 0x570ef90b, 0x570ef90b, 0x5fcf013d, }, 20 }, -- { "gfxterm_heb", 1024, 768, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 1024x768xrgba8888 */, (grub_uint32_t []) { 0xdd28f52b, 0x7001fe50, 0x4798153f, 0x7001fe50, 0x6b042457, 0xdd28f52b, 0xdd28f52b, 0x46489369, 0x46489369, 0x46489369, 0x67746a8d, 0x67746a8d, 0x67746a8d, 0x1acca101, 0x1acca101, 0x1acca101, 0xdd28f52b, 0x6b042457, 0x6b042457, 0xdd28f52b, }, 20 }, -- { "gfxterm_heb", 2560, 1440, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 2560x1440xrgba8888 */, (grub_uint32_t []) { 0x43d1f34, 0x6e10591c, 0x48bd926e, 0x6e10591c, 0x91af429c, 0x43d1f34, 0x43d1f34, 0x59cb829, 0x59cb829, 0x59cb829, 0x7a961181, 0x7a961181, 0x7a961181, 0xe3c71407, 0xe3c71407, 0xe3c71407, 0x43d1f34, 0x91af429c, 0x91af429c, 0x43d1f34, }, 20 }, -- { "gfxterm_gre", 640, 480, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi16 */, (grub_uint32_t []) { 0x59c36f00, 0x67627ed5, 0xdb276cef, 0x67627ed5, 0x2494b392, 0x59c36f00, 0x59c36f00, 0x43f511f3, 0x43f511f3, 0x43f511f3, 0x3d757c95, 0x3d757c95, 0x3d757c95, 0x5f836947, 0x5f836947, 0x5f836947, 0x59c36f00, 0x2494b392, 0x2494b392, 0x59c36f00, }, 20 }, -- { "gfxterm_gre", 800, 600, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi16 */, (grub_uint32_t []) { 0xaa4593fe, 0x987cbf71, 0x6e4c645c, 0x987cbf71, 0xb6793a0e, 0xaa4593fe, 0xaa4593fe, 0xb943d716, 0xb943d716, 0xb943d716, 0x1fb6da71, 0x1fb6da71, 0x1fb6da71, 0x328e7109, 0x328e7109, 0x328e7109, 0xaa4593fe, 0xb6793a0e, 0xb6793a0e, 0xaa4593fe, }, 20 }, -- { "gfxterm_gre", 1024, 768, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi16 */, (grub_uint32_t []) { 0xc9cbf769, 0xf9987c07, 0x4a92eed9, 0xf9987c07, 0xa48f1183, 0xc9cbf769, 0xc9cbf769, 0x5eb3ddf4, 0x5eb3ddf4, 0x5eb3ddf4, 0xa06b1c38, 0xa06b1c38, 0xa06b1c38, 0x4921a330, 0x4921a330, 0x4921a330, 0xc9cbf769, 0xa48f1183, 0xa48f1183, 0xc9cbf769, }, 20 }, -- { "gfxterm_gre", 640, 480, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 640x480xrgba8888 */, (grub_uint32_t []) { 0x9813a416, 0xccd804e2, 0xb99e8d91, 0xccd804e2, 0x628e4d3a, 0x9813a416, 0x9813a416, 0x5aec5acc, 0x5aec5acc, 0x5aec5acc, 0xcb37dcff, 0xcb37dcff, 0xcb37dcff, 0xd28de12f, 0xd28de12f, 0xd28de12f, 0x9813a416, 0x628e4d3a, 0x628e4d3a, 0x9813a416, }, 20 }, -- { "gfxterm_gre", 800, 600, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 800x600xrgba8888 */, (grub_uint32_t []) { 0x5fcf013d, 0x4990d896, 0x2b3aa242, 0x4990d896, 0x3f36ed25, 0x5fcf013d, 0x5fcf013d, 0x3cc6048d, 0x3cc6048d, 0x3cc6048d, 0xeed61cfb, 0xeed61cfb, 0xeed61cfb, 0xf8a52364, 0xf8a52364, 0xf8a52364, 0x5fcf013d, 0x3f36ed25, 0x3f36ed25, 0x5fcf013d, }, 20 }, -- { "gfxterm_gre", 1024, 768, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 1024x768xrgba8888 */, (grub_uint32_t []) { 0xdd28f52b, 0x4ff5c69f, 0x66586489, 0x4ff5c69f, 0x54f01c98, 0xdd28f52b, 0xdd28f52b, 0xc3ff0bf5, 0xc3ff0bf5, 0xc3ff0bf5, 0xe2c3f211, 0xe2c3f211, 0xe2c3f211, 0x9f7b399d, 0x9f7b399d, 0x9f7b399d, 0xdd28f52b, 0x54f01c98, 0x54f01c98, 0xdd28f52b, }, 20 }, -- { "gfxterm_gre", 2560, 1440, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 2560x1440xrgba8888 */, (grub_uint32_t []) { 0x43d1f34, 0x909b7bb4, 0x2bb2a58c, 0x909b7bb4, 0x6f246034, 0x43d1f34, 0x43d1f34, 0x2df40751, 0x2df40751, 0x2df40751, 0x52feaef9, 0x52feaef9, 0x52feaef9, 0xcbafab7f, 0xcbafab7f, 0xcbafab7f, 0x43d1f34, 0x6f246034, 0x6f246034, 0x43d1f34, }, 20 }, -- { "gfxterm_ru", 640, 480, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi16 */, (grub_uint32_t []) { 0x59c36f00, 0xc77bfcc6, 0xffcdf45d, 0xc77bfcc6, 0x848d3181, 0x59c36f00, 0x59c36f00, 0xd79cd5e, 0xd79cd5e, 0xd79cd5e, 0x73f9a038, 0x73f9a038, 0x73f9a038, 0x110fb5ea, 0x110fb5ea, 0x110fb5ea, 0x59c36f00, 0x848d3181, 0x848d3181, 0x59c36f00, }, 20 }, -- { "gfxterm_ru", 800, 600, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi16 */, (grub_uint32_t []) { 0xaa4593fe, 0xd5494aa5, 0xa0924ec, 0xd5494aa5, 0xfb4ccfda, 0xaa4593fe, 0xaa4593fe, 0x8692c636, 0x8692c636, 0x8692c636, 0x2067cb51, 0x2067cb51, 0x2067cb51, 0xd5f6029, 0xd5f6029, 0xd5f6029, 0xaa4593fe, 0xfb4ccfda, 0xfb4ccfda, 0xaa4593fe, }, 20 }, -- { "gfxterm_ru", 1024, 768, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi16 */, (grub_uint32_t []) { 0xc9cbf769, 0x2436c4f, 0x2cde4e0c, 0x2436c4f, 0x5f5401cb, 0xc9cbf769, 0xc9cbf769, 0x558f50ae, 0x558f50ae, 0x558f50ae, 0xab579162, 0xab579162, 0xab579162, 0x421d2e6a, 0x421d2e6a, 0x421d2e6a, 0xc9cbf769, 0x5f5401cb, 0x5f5401cb, 0xc9cbf769, }, 20 }, -- { "gfxterm_ru", 640, 480, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 640x480xrgba8888 */, (grub_uint32_t []) { 0x9813a416, 0x86f8a68c, 0xf4116451, 0x86f8a68c, 0x28aeef54, 0x9813a416, 0x9813a416, 0x7befbe43, 0x7befbe43, 0x7befbe43, 0xea343870, 0xea343870, 0xea343870, 0xf38e05a0, 0xf38e05a0, 0xf38e05a0, 0x9813a416, 0x28aeef54, 0x28aeef54, 0x9813a416, }, 20 }, -- { "gfxterm_ru", 800, 600, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 800x600xrgba8888 */, (grub_uint32_t []) { 0x5fcf013d, 0x156c292f, 0x3c8eb473, 0x156c292f, 0x63ca1c9c, 0x5fcf013d, 0x5fcf013d, 0x895ea16b, 0x895ea16b, 0x895ea16b, 0x5b4eb91d, 0x5b4eb91d, 0x5b4eb91d, 0x4d3d8682, 0x4d3d8682, 0x4d3d8682, 0x5fcf013d, 0x63ca1c9c, 0x63ca1c9c, 0x5fcf013d, }, 20 }, -- { "gfxterm_ru", 1024, 768, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 1024x768xrgba8888 */, (grub_uint32_t []) { 0xdd28f52b, 0xf57ebf12, 0x798b299b, 0xf57ebf12, 0xee7b6515, 0xdd28f52b, 0xdd28f52b, 0x22563fc6, 0x22563fc6, 0x22563fc6, 0x36ac622, 0x36ac622, 0x36ac622, 0x7ed20dae, 0x7ed20dae, 0x7ed20dae, 0xdd28f52b, 0xee7b6515, 0xee7b6515, 0xdd28f52b, }, 20 }, -- { "gfxterm_ru", 2560, 1440, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 2560x1440xrgba8888 */, (grub_uint32_t []) { 0x43d1f34, 0x2bc82eb1, 0x94064cc8, 0x2bc82eb1, 0xd4773531, 0x43d1f34, 0x43d1f34, 0x44cbf2f0, 0x44cbf2f0, 0x44cbf2f0, 0x3bc15b58, 0x3bc15b58, 0x3bc15b58, 0xa2905ede, 0xa2905ede, 0xa2905ede, 0x43d1f34, 0xd4773531, 0xd4773531, 0x43d1f34, }, 20 }, -- { "gfxterm_fr", 640, 480, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi16 */, (grub_uint32_t []) { 0x59c36f00, 0x7f6dd146, 0x548af474, 0x7f6dd146, 0x3c9b1c01, 0x59c36f00, 0x59c36f00, 0x7d913e8d, 0x7d913e8d, 0x7d913e8d, 0x31153eb, 0x31153eb, 0x31153eb, 0x61e74639, 0x61e74639, 0x61e74639, 0x59c36f00, 0x3c9b1c01, 0x3c9b1c01, 0x59c36f00, }, 20 }, -- { "gfxterm_fr", 800, 600, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi16 */, (grub_uint32_t []) { 0xaa4593fe, 0xf29ad079, 0x50d47c0, 0xf29ad079, 0xdc9f5506, 0xaa4593fe, 0xaa4593fe, 0x6bcf4c90, 0x6bcf4c90, 0x6bcf4c90, 0xcd3a41f7, 0xcd3a41f7, 0xcd3a41f7, 0xe002ea8f, 0xe002ea8f, 0xe002ea8f, 0xaa4593fe, 0xdc9f5506, 0xdc9f5506, 0xaa4593fe, }, 20 }, -- { "gfxterm_fr", 1024, 768, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi16 */, (grub_uint32_t []) { 0xc9cbf769, 0xb25e3082, 0x2ed845dd, 0xb25e3082, 0xef495d06, 0xc9cbf769, 0xc9cbf769, 0xd5322575, 0xd5322575, 0xd5322575, 0x2beae4b9, 0x2beae4b9, 0x2beae4b9, 0xc2a05bb1, 0xc2a05bb1, 0xc2a05bb1, 0xc9cbf769, 0xef495d06, 0xef495d06, 0xc9cbf769, }, 20 }, -- { "gfxterm_fr", 640, 480, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 640x480xrgba8888 */, (grub_uint32_t []) { 0x9813a416, 0x4cdfcd2e, 0x8bf091f, 0x4cdfcd2e, 0xe28984f6, 0x9813a416, 0x9813a416, 0x8217f630, 0x8217f630, 0x8217f630, 0x13cc7003, 0x13cc7003, 0x13cc7003, 0xa764dd3, 0xa764dd3, 0xa764dd3, 0x9813a416, 0xe28984f6, 0xe28984f6, 0x9813a416, }, 20 }, -- { "gfxterm_fr", 800, 600, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 800x600xrgba8888 */, (grub_uint32_t []) { 0x5fcf013d, 0xf2b49f88, 0x2eff252d, 0xf2b49f88, 0x8412aa3b, 0x5fcf013d, 0x5fcf013d, 0x5d3b9fe7, 0x5d3b9fe7, 0x5d3b9fe7, 0x8f2b8791, 0x8f2b8791, 0x8f2b8791, 0x9958b80e, 0x9958b80e, 0x9958b80e, 0x5fcf013d, 0x8412aa3b, 0x8412aa3b, 0x5fcf013d, }, 20 }, -- { "gfxterm_fr", 1024, 768, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 1024x768xrgba8888 */, (grub_uint32_t []) { 0xdd28f52b, 0x786673be, 0x536f1359, 0x786673be, 0x6363a9b9, 0xdd28f52b, 0xdd28f52b, 0x38653b12, 0x38653b12, 0x38653b12, 0x1959c2f6, 0x1959c2f6, 0x1959c2f6, 0x64e1097a, 0x64e1097a, 0x64e1097a, 0xdd28f52b, 0x6363a9b9, 0x6363a9b9, 0xdd28f52b, }, 20 }, -- { "gfxterm_fr", 2560, 1440, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 2560x1440xrgba8888 */, (grub_uint32_t []) { 0x43d1f34, 0xac4a1127, 0x699c2ad8, 0xac4a1127, 0x53f50aa7, 0x43d1f34, 0x43d1f34, 0xfa47dfba, 0xfa47dfba, 0xfa47dfba, 0x854d7612, 0x854d7612, 0x854d7612, 0x1c1c7394, 0x1c1c7394, 0x1c1c7394, 0x43d1f34, 0x53f50aa7, 0x53f50aa7, 0x43d1f34, }, 20 }, -- { "gfxterm_quot", 640, 480, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi16 */, (grub_uint32_t []) { 0x59c36f00, 0xbc5f6633, 0xda908ab0, 0xbc5f6633, 0xffa9ab74, 0x59c36f00, 0x59c36f00, 0x3ad73295, 0x3ad73295, 0x3ad73295, 0x44575ff3, 0x44575ff3, 0x44575ff3, 0x26a14a21, 0x26a14a21, 0x26a14a21, 0x59c36f00, 0xffa9ab74, 0xffa9ab74, 0x59c36f00, }, 20 }, -- { "gfxterm_quot", 800, 600, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi16 */, (grub_uint32_t []) { 0xaa4593fe, 0xad820d6b, 0x9a88ad3, 0xad820d6b, 0x83878814, 0xaa4593fe, 0xaa4593fe, 0xbec19c1b, 0xbec19c1b, 0xbec19c1b, 0x1834917c, 0x1834917c, 0x1834917c, 0x350c3a04, 0x350c3a04, 0x350c3a04, 0xaa4593fe, 0x83878814, 0x83878814, 0xaa4593fe, }, 20 }, -- { "gfxterm_quot", 1024, 768, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi16 */, (grub_uint32_t []) { 0xc9cbf769, 0xe5774112, 0x5ffb1eca, 0xe5774112, 0xb8602c96, 0xc9cbf769, 0xc9cbf769, 0xe4861949, 0xe4861949, 0xe4861949, 0x1a5ed885, 0x1a5ed885, 0x1a5ed885, 0xf314678d, 0xf314678d, 0xf314678d, 0xc9cbf769, 0xb8602c96, 0xb8602c96, 0xc9cbf769, }, 20 }, -- { "gfxterm_quot", 640, 480, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 640x480xrgba8888 */, (grub_uint32_t []) { 0x9813a416, 0x6af1a2bc, 0xd951ab8b, 0x6af1a2bc, 0xc4a7eb64, 0x9813a416, 0x9813a416, 0xb5e8801c, 0xb5e8801c, 0xb5e8801c, 0x2433062f, 0x2433062f, 0x2433062f, 0x3d893bff, 0x3d893bff, 0x3d893bff, 0x9813a416, 0xc4a7eb64, 0xc4a7eb64, 0x9813a416, }, 20 }, -- { "gfxterm_quot", 800, 600, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 800x600xrgba8888 */, (grub_uint32_t []) { 0x5fcf013d, 0xc6baa18, 0x1c9db179, 0xc6baa18, 0x7acd9fab, 0x5fcf013d, 0x5fcf013d, 0x819b5c4e, 0x819b5c4e, 0x819b5c4e, 0x538b4438, 0x538b4438, 0x538b4438, 0x45f87ba7, 0x45f87ba7, 0x45f87ba7, 0x5fcf013d, 0x7acd9fab, 0x7acd9fab, 0x5fcf013d, }, 20 }, -- { "gfxterm_quot", 1024, 768, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 1024x768xrgba8888 */, (grub_uint32_t []) { 0xdd28f52b, 0xe424a6ab, 0xb05c0275, 0xe424a6ab, 0xff217cac, 0xdd28f52b, 0xdd28f52b, 0xcd83646c, 0xcd83646c, 0xcd83646c, 0xecbf9d88, 0xecbf9d88, 0xecbf9d88, 0x91075604, 0x91075604, 0x91075604, 0xdd28f52b, 0xff217cac, 0xff217cac, 0xdd28f52b, }, 20 }, -- { "gfxterm_quot", 2560, 1440, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 2560x1440xrgba8888 */, (grub_uint32_t []) { 0x43d1f34, 0x4a7dff41, 0xe1ec28fc, 0x4a7dff41, 0xb5c2e4c1, 0x43d1f34, 0x43d1f34, 0xb200c08a, 0xb200c08a, 0xb200c08a, 0xcd0a6922, 0xcd0a6922, 0xcd0a6922, 0x545b6ca4, 0x545b6ca4, 0x545b6ca4, 0x43d1f34, 0xb5c2e4c1, 0xb5c2e4c1, 0x43d1f34, }, 20 }, -- { "gfxterm_piglatin", 640, 480, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi16 */, (grub_uint32_t []) { 0x59c36f00, 0xd3d3e4a2, 0x9c635046, 0xd3d3e4a2, 0x902529e5, 0x59c36f00, 0x59c36f00, 0x85e713, 0x85e713, 0x85e713, 0x7e058a75, 0x7e058a75, 0x7e058a75, 0x1cf39fa7, 0x1cf39fa7, 0x1cf39fa7, 0x59c36f00, 0x902529e5, 0x902529e5, 0x59c36f00, }, 20 }, -- { "gfxterm_piglatin", 800, 600, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi16 */, (grub_uint32_t []) { 0xaa4593fe, 0xd61c80f5, 0xdf78b496, 0xd61c80f5, 0xf819058a, 0xaa4593fe, 0xaa4593fe, 0xefc0f7e7, 0xefc0f7e7, 0xefc0f7e7, 0x4935fa80, 0x4935fa80, 0x4935fa80, 0x640d51f8, 0x640d51f8, 0x640d51f8, 0xaa4593fe, 0xf819058a, 0xf819058a, 0xaa4593fe, }, 20 }, -- { "gfxterm_piglatin", 1024, 768, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi16 */, (grub_uint32_t []) { 0xc9cbf769, 0x936bc89d, 0x523a3e80, 0x936bc89d, 0xce7ca519, 0xc9cbf769, 0xc9cbf769, 0xaa99ffb1, 0xaa99ffb1, 0xaa99ffb1, 0x54413e7d, 0x54413e7d, 0x54413e7d, 0xbd0b8175, 0xbd0b8175, 0xbd0b8175, 0xc9cbf769, 0xce7ca519, 0xce7ca519, 0xc9cbf769, }, 20 }, -- { "gfxterm_piglatin", 640, 480, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 640x480xrgba8888 */, (grub_uint32_t []) { 0x9813a416, 0x4fdd0291, 0x133fa83d, 0x4fdd0291, 0xe18b4b49, 0x9813a416, 0x9813a416, 0x74c38e90, 0x74c38e90, 0x74c38e90, 0xe51808a3, 0xe51808a3, 0xe51808a3, 0xfca23573, 0xfca23573, 0xfca23573, 0x9813a416, 0xe18b4b49, 0xe18b4b49, 0x9813a416, }, 20 }, -- { "gfxterm_piglatin", 800, 600, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 800x600xrgba8888 */, (grub_uint32_t []) { 0x5fcf013d, 0x538203b0, 0x2a92e789, 0x538203b0, 0x25243603, 0x5fcf013d, 0x5fcf013d, 0x5e4d3dd8, 0x5e4d3dd8, 0x5e4d3dd8, 0x8c5d25ae, 0x8c5d25ae, 0x8c5d25ae, 0x9a2e1a31, 0x9a2e1a31, 0x9a2e1a31, 0x5fcf013d, 0x25243603, 0x25243603, 0x5fcf013d, }, 20 }, -- { "gfxterm_piglatin", 1024, 768, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 1024x768xrgba8888 */, (grub_uint32_t []) { 0xdd28f52b, 0xcfc85125, 0xa5b0e11b, 0xcfc85125, 0xd4cd8b22, 0xdd28f52b, 0xdd28f52b, 0x1af8cddc, 0x1af8cddc, 0x1af8cddc, 0x3bc43438, 0x3bc43438, 0x3bc43438, 0x467cffb4, 0x467cffb4, 0x467cffb4, 0xdd28f52b, 0xd4cd8b22, 0xd4cd8b22, 0xdd28f52b, }, 20 }, -- { "gfxterm_piglatin", 2560, 1440, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 2560x1440xrgba8888 */, (grub_uint32_t []) { 0x43d1f34, 0xf2469ffb, 0x1d0c1d2, 0xf2469ffb, 0xdf9847b, 0x43d1f34, 0x43d1f34, 0xa2837c7a, 0xa2837c7a, 0xa2837c7a, 0xdd89d5d2, 0xdd89d5d2, 0xdd89d5d2, 0x44d8d054, 0x44d8d054, 0x44d8d054, 0x43d1f34, 0xdf9847b, 0xdf9847b, 0x43d1f34, }, 20 }, -- { "gfxterm_ch", 640, 480, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi16 */, (grub_uint32_t []) { 0x59c36f00, 0x27851cc1, 0x15f731b5, 0x27851cc1, 0x6473d186, 0x59c36f00, 0x59c36f00, 0x125bcddf, 0x125bcddf, 0x125bcddf, 0x6cdba0b9, 0x6cdba0b9, 0x6cdba0b9, 0xe2db56b, 0xe2db56b, 0xe2db56b, 0x59c36f00, 0x6473d186, 0x6473d186, 0x59c36f00, }, 20 }, -- { "gfxterm_ch", 800, 600, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi16 */, (grub_uint32_t []) { 0xaa4593fe, 0xfcb223c, 0x2c2e18b9, 0xfcb223c, 0x21cea743, 0xaa4593fe, 0xaa4593fe, 0xd700be1a, 0xd700be1a, 0xd700be1a, 0x71f5b37d, 0x71f5b37d, 0x71f5b37d, 0x5ccd1805, 0x5ccd1805, 0x5ccd1805, 0xaa4593fe, 0x21cea743, 0x21cea743, 0xaa4593fe, }, 20 }, -- { "gfxterm_ch", 1024, 768, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi16 */, (grub_uint32_t []) { 0xc9cbf769, 0x807efaa5, 0xb673036a, 0x807efaa5, 0xdd699721, 0xc9cbf769, 0xc9cbf769, 0xdca3ed4b, 0xdca3ed4b, 0xdca3ed4b, 0x227b2c87, 0x227b2c87, 0x227b2c87, 0xcb31938f, 0xcb31938f, 0xcb31938f, 0xc9cbf769, 0xdd699721, 0xdd699721, 0xc9cbf769, }, 20 }, -- { "gfxterm_ch", 640, 480, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 640x480xrgba8888 */, (grub_uint32_t []) { 0x9813a416, 0x651d0d50, 0xf0dc38fc, 0x651d0d50, 0xcb4b4488, 0x9813a416, 0x9813a416, 0x80d03ee8, 0x80d03ee8, 0x80d03ee8, 0x110bb8db, 0x110bb8db, 0x110bb8db, 0x8b1850b, 0x8b1850b, 0x8b1850b, 0x9813a416, 0xcb4b4488, 0xcb4b4488, 0x9813a416, }, 20 }, -- { "gfxterm_ch", 800, 600, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 800x600xrgba8888 */, (grub_uint32_t []) { 0x5fcf013d, 0xb9b068f, 0xdc68ac3c, 0xb9b068f, 0x7d3d333c, 0x5fcf013d, 0x5fcf013d, 0xa1f0a6e4, 0xa1f0a6e4, 0xa1f0a6e4, 0x73e0be92, 0x73e0be92, 0x73e0be92, 0x6593810d, 0x6593810d, 0x6593810d, 0x5fcf013d, 0x7d3d333c, 0x7d3d333c, 0x5fcf013d, }, 20 }, -- { "gfxterm_ch", 1024, 768, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 1024x768xrgba8888 */, (grub_uint32_t []) { 0xdd28f52b, 0xf0789d7e, 0x6f2f2b61, 0xf0789d7e, 0xeb7d4779, 0xdd28f52b, 0xdd28f52b, 0xb995630, 0xb995630, 0xb995630, 0x2aa5afd4, 0x2aa5afd4, 0x2aa5afd4, 0x571d6458, 0x571d6458, 0x571d6458, 0xdd28f52b, 0xeb7d4779, 0xeb7d4779, 0xdd28f52b, }, 20 }, -- { "gfxterm_ch", 2560, 1440, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 2560x1440xrgba8888 */, (grub_uint32_t []) { 0x43d1f34, 0x819821ff, 0xdd19128c, 0x819821ff, 0x7e273a7f, 0x43d1f34, 0x43d1f34, 0xf35981d3, 0xf35981d3, 0xf35981d3, 0x8c53287b, 0x8c53287b, 0x8c53287b, 0x15022dfd, 0x15022dfd, 0x15022dfd, 0x43d1f34, 0x7e273a7f, 0x7e273a7f, 0x43d1f34, }, 20 }, -- { "gfxterm_red", 640, 480, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi16 */, (grub_uint32_t []) { 0x59c36f00, 0xa99604d1, 0xcf59e852, 0xa99604d1, 0xfebbba0f, 0x59c36f00, 0x59c36f00, 0x53767ce3, 0x53767ce3, 0x53767ce3, 0x2df61185, 0x2df61185, 0x2df61185, 0x4f000457, 0x4f000457, 0x4f000457, 0x59c36f00, 0xfebbba0f, 0xfebbba0f, 0x59c36f00, }, 20 }, -- { "gfxterm_red", 800, 600, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi16 */, (grub_uint32_t []) { 0xaa4593fe, 0x7d0a218, 0xa3fa25a0, 0x7d0a218, 0xb777784e, 0xaa4593fe, 0xaa4593fe, 0x35db26e1, 0x35db26e1, 0x35db26e1, 0x932e2b86, 0x932e2b86, 0x932e2b86, 0xbe1680fe, 0xbe1680fe, 0xbe1680fe, 0xaa4593fe, 0xb777784e, 0xb777784e, 0xaa4593fe, }, 20 }, -- { "gfxterm_red", 1024, 768, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi16 */, (grub_uint32_t []) { 0xc9cbf769, 0x63be90f4, 0xd932cf2c, 0x63be90f4, 0x739b8e5a, 0xc9cbf769, 0xc9cbf769, 0x70a00efe, 0x70a00efe, 0x70a00efe, 0x8e78cf32, 0x8e78cf32, 0x8e78cf32, 0x6732703a, 0x6732703a, 0x6732703a, 0xc9cbf769, 0x739b8e5a, 0x739b8e5a, 0xc9cbf769, }, 20 }, -- { "gfxterm_red", 640, 480, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 640x480xrgba8888 */, (grub_uint32_t []) { 0x9813a416, 0x53460c90, 0xe0e605a7, 0x53460c90, 0x6337f0bf, 0x9813a416, 0x9813a416, 0x4161864c, 0x4161864c, 0x4161864c, 0xd0ba007f, 0xd0ba007f, 0xd0ba007f, 0xc9003daf, 0xc9003daf, 0xc9003daf, 0x9813a416, 0x6337f0bf, 0x6337f0bf, 0x9813a416, }, 20 }, -- { "gfxterm_red", 800, 600, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 800x600xrgba8888 */, (grub_uint32_t []) { 0x5fcf013d, 0xf54761a0, 0xe5b17ac1, 0xf54761a0, 0x5b408e55, 0x5fcf013d, 0x5fcf013d, 0x580fda0e, 0x580fda0e, 0x580fda0e, 0x8a1fc278, 0x8a1fc278, 0x8a1fc278, 0x9c6cfde7, 0x9c6cfde7, 0x9c6cfde7, 0x5fcf013d, 0x5b408e55, 0x5b408e55, 0x5fcf013d, }, 20 }, -- { "gfxterm_red", 1024, 768, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 1024x768xrgba8888 */, (grub_uint32_t []) { 0xdd28f52b, 0xec78b0c1, 0xb800141f, 0xec78b0c1, 0x621c7b1b, 0xdd28f52b, 0xdd28f52b, 0x8f60179, 0x8f60179, 0x8f60179, 0x29caf89d, 0x29caf89d, 0x29caf89d, 0x54723311, 0x54723311, 0x54723311, 0xdd28f52b, 0x621c7b1b, 0x621c7b1b, 0xdd28f52b, }, 20 }, -- { "gfxterm_red", 2560, 1440, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 2560x1440xrgba8888 */, (grub_uint32_t []) { 0x43d1f34, 0xf209411b, 0x599896a6, 0xf209411b, 0x6551c7bb, 0x43d1f34, 0x43d1f34, 0x5ac6bb4a, 0x5ac6bb4a, 0x5ac6bb4a, 0x25cc12e2, 0x25cc12e2, 0x25cc12e2, 0xbc9d1764, 0xbc9d1764, 0xbc9d1764, 0x43d1f34, 0x6551c7bb, 0x6551c7bb, 0x43d1f34, }, 20 }, -- { "gfxterm_high", 640, 480, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi16 */, (grub_uint32_t []) { 0x59c36f00, 0x93b4fcd8, 0xf57b105b, 0x93b4fcd8, 0x2bfe5312, 0x59c36f00, 0x59c36f00, 0x3ad73295, 0x3ad73295, 0x3ad73295, 0x44575ff3, 0x44575ff3, 0x44575ff3, 0x26a14a21, 0x26a14a21, 0x26a14a21, 0x59c36f00, 0x2bfe5312, 0x2bfe5312, 0x59c36f00, }, 20 }, -- { "gfxterm_high", 800, 600, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi16 */, (grub_uint32_t []) { 0xaa4593fe, 0x656c9044, 0xc14617fc, 0x656c9044, 0xa6ea58cb, 0xaa4593fe, 0xaa4593fe, 0xbec19c1b, 0xbec19c1b, 0xbec19c1b, 0x1834917c, 0x1834917c, 0x1834917c, 0x350c3a04, 0x350c3a04, 0x350c3a04, 0xaa4593fe, 0xa6ea58cb, 0xa6ea58cb, 0xaa4593fe, }, 20 }, -- { "gfxterm_high", 1024, 768, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi16 */, (grub_uint32_t []) { 0xc9cbf769, 0xa11479ed, 0x1b982635, 0xa11479ed, 0xe37185d0, 0xc9cbf769, 0xc9cbf769, 0xe4861949, 0xe4861949, 0xe4861949, 0x1a5ed885, 0x1a5ed885, 0x1a5ed885, 0xf314678d, 0xf314678d, 0xf314678d, 0xc9cbf769, 0xe37185d0, 0xe37185d0, 0xc9cbf769, }, 20 }, -- { "gfxterm_high", 640, 480, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 640x480xrgba8888 */, (grub_uint32_t []) { 0x9813a416, 0x244770a7, 0x97e77990, 0x244770a7, 0x6a54d2ee, 0x9813a416, 0x9813a416, 0xb5e8801c, 0xb5e8801c, 0xb5e8801c, 0x2433062f, 0x2433062f, 0x2433062f, 0x3d893bff, 0x3d893bff, 0x3d893bff, 0x9813a416, 0x6a54d2ee, 0x6a54d2ee, 0x9813a416, }, 20 }, -- { "gfxterm_high", 800, 600, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 800x600xrgba8888 */, (grub_uint32_t []) { 0x5fcf013d, 0x8ca34476, 0x9c555f17, 0x8ca34476, 0x1fc54b41, 0x5fcf013d, 0x5fcf013d, 0x819b5c4e, 0x819b5c4e, 0x819b5c4e, 0x538b4438, 0x538b4438, 0x538b4438, 0x45f87ba7, 0x45f87ba7, 0x45f87ba7, 0x5fcf013d, 0x1fc54b41, 0x1fc54b41, 0x5fcf013d, }, 20 }, -- { "gfxterm_high", 1024, 768, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 1024x768xrgba8888 */, (grub_uint32_t []) { 0xdd28f52b, 0xf19f6af8, 0xa5e7ce26, 0xf19f6af8, 0x1619aea6, 0xdd28f52b, 0xdd28f52b, 0xcd83646c, 0xcd83646c, 0xcd83646c, 0xecbf9d88, 0xecbf9d88, 0xecbf9d88, 0x91075604, 0x91075604, 0x91075604, 0xdd28f52b, 0x1619aea6, 0x1619aea6, 0xdd28f52b, }, 20 }, -- { "gfxterm_high", 2560, 1440, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 2560x1440xrgba8888 */, (grub_uint32_t []) { 0x43d1f34, 0x5f75414f, 0xf4e496f2, 0x5f75414f, 0x27fd1fe0, 0x43d1f34, 0x43d1f34, 0xb200c08a, 0xb200c08a, 0xb200c08a, 0xcd0a6922, 0xcd0a6922, 0xcd0a6922, 0x545b6ca4, 0x545b6ca4, 0x545b6ca4, 0x43d1f34, 0x27fd1fe0, 0x27fd1fe0, 0x43d1f34, }, 20 }, -- { "videotest", 640, 480, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi16 */, (grub_uint32_t []) { 0x1368a483, 0x1368a483, 0x1368a483, 0x1368a483, 0x1368a483, }, 5 }, -- { "videotest", 800, 600, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi16 */, (grub_uint32_t []) { 0x7033079c, 0x7033079c, 0x7033079c, 0x7033079c, 0x7033079c, }, 5 }, -- { "videotest", 1024, 768, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi16 */, (grub_uint32_t []) { 0xff583fbf, 0xff583fbf, 0xff583fbf, 0xff583fbf, 0xff583fbf, }, 5 }, -- { "videotest", 640, 480, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 640x480xrgba8888 */, (grub_uint32_t []) { 0x4c2cef83, 0x1b215a88, 0xe2378595, 0xb53a309e, 0x15f64d5e, }, 5 }, -- { "videotest", 800, 600, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 800x600xrgba8888 */, (grub_uint32_t []) { 0x758f388c, 0xd4442397, 0x33f5784b, 0x923e6350, 0xf97bb902, }, 5 }, -- { "videotest", 1024, 768, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 1024x768xrgba8888 */, (grub_uint32_t []) { 0xb9f6f52a, 0x4e24e8b7, 0x53beb8e1, 0xa46ca57c, 0x688a184d, }, 5 }, -- { "videotest", 2560, 1440, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 2560x1440xrgba8888 */, (grub_uint32_t []) { 0x5bd98ce3, 0x15df7962, 0xc7d467e1, 0x89d29260, 0x662e2c16, }, 5 }, -- { "videotest", 640, 480, 0x2, 256, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi256 */, (grub_uint32_t []) { 0xf9847b65, 0xf9847b65, 0xf9847b65, 0xf9847b65, 0xf9847b65, }, 5 }, -- { "videotest", 800, 600, 0x2, 256, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi256 */, (grub_uint32_t []) { 0xc421716d, 0xc421716d, 0xc421716d, 0xc421716d, 0xc421716d, }, 5 }, -- { "videotest", 1024, 768, 0x2, 256, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi256 */, (grub_uint32_t []) { 0x5d46f2a8, 0x5d46f2a8, 0x5d46f2a8, 0x5d46f2a8, 0x5d46f2a8, }, 5 }, -- { "videotest", 640, 480, 0x1, 256, 15, 2, 10, 5, 5, 5, 0, 5, 0, 0 /* 640x480xrgba5550 */, (grub_uint32_t []) { 0x25690db2, 0x25690db2, 0x25690db2, 0x25690db2, 0x25690db2, }, 5 }, -- { "videotest", 800, 600, 0x1, 256, 15, 2, 10, 5, 5, 5, 0, 5, 0, 0 /* 800x600xrgba5550 */, (grub_uint32_t []) { 0x7333f220, 0x7333f220, 0x7333f220, 0x7333f220, 0x7333f220, }, 5 }, -- { "videotest", 1024, 768, 0x1, 256, 15, 2, 10, 5, 5, 5, 0, 5, 0, 0 /* 1024x768xrgba5550 */, (grub_uint32_t []) { 0xac52d537, 0xac52d537, 0xac52d537, 0xac52d537, 0xac52d537, }, 5 }, -- { "videotest", 640, 480, 0x1, 256, 16, 2, 11, 5, 5, 6, 0, 5, 0, 0 /* 640x480xrgba5650 */, (grub_uint32_t []) { 0xd4cbcd66, 0xd4cbcd66, 0xd4cbcd66, 0xd4cbcd66, 0xd4cbcd66, }, 5 }, -- { "videotest", 800, 600, 0x1, 256, 16, 2, 11, 5, 5, 6, 0, 5, 0, 0 /* 800x600xrgba5650 */, (grub_uint32_t []) { 0x9d23f9d1, 0x9d23f9d1, 0x9d23f9d1, 0x9d23f9d1, 0x9d23f9d1, }, 5 }, -- { "videotest", 1024, 768, 0x1, 256, 16, 2, 11, 5, 5, 6, 0, 5, 0, 0 /* 1024x768xrgba5650 */, (grub_uint32_t []) { 0x89acbf88, 0x89acbf88, 0x89acbf88, 0x89acbf88, 0x89acbf88, }, 5 }, -- { "videotest", 640, 480, 0x1, 256, 24, 3, 16, 8, 8, 8, 0, 8, 0, 0 /* 640x480xrgba8880 */, (grub_uint32_t []) { 0x335fadcb, 0x1f517b5c, 0x6b4200e5, 0x474cd672, 0x8364f797, }, 5 }, -- { "videotest", 800, 600, 0x1, 256, 24, 3, 16, 8, 8, 8, 0, 8, 0, 0 /* 800x600xrgba8880 */, (grub_uint32_t []) { 0xcf9985f8, 0x1d92c7fc, 0x6e637701, 0xbc683505, 0x898016fb, }, 5 }, -- { "videotest", 1024, 768, 0x1, 256, 24, 3, 16, 8, 8, 8, 0, 8, 0, 0 /* 1024x768xrgba8880 */, (grub_uint32_t []) { 0xdb824190, 0x378d05dc, 0x670bff9, 0xea7ffbb5, 0x658bcbb3, }, 5 }, -- { "videotest", 640, 480, 0x1, 256, 15, 2, 0, 5, 5, 5, 10, 5, 0, 0 /* 640x480xbgra5550 */, (grub_uint32_t []) { 0x18ed532e, 0x18ed532e, 0x18ed532e, 0x18ed532e, 0x18ed532e, }, 5 }, -- { "videotest", 800, 600, 0x1, 256, 15, 2, 0, 5, 5, 5, 10, 5, 0, 0 /* 800x600xbgra5550 */, (grub_uint32_t []) { 0x2b35b09f, 0x2b35b09f, 0x2b35b09f, 0x2b35b09f, 0x2b35b09f, }, 5 }, -- { "videotest", 1024, 768, 0x1, 256, 15, 2, 0, 5, 5, 5, 10, 5, 0, 0 /* 1024x768xbgra5550 */, (grub_uint32_t []) { 0xa24c4d98, 0xa24c4d98, 0xa24c4d98, 0xa24c4d98, 0xa24c4d98, }, 5 }, -- { "videotest", 640, 480, 0x1, 256, 16, 2, 0, 5, 5, 6, 11, 5, 0, 0 /* 640x480xbgra5650 */, (grub_uint32_t []) { 0xc07dde33, 0xc07dde33, 0xc07dde33, 0xc07dde33, 0xc07dde33, }, 5 }, -- { "videotest", 800, 600, 0x1, 256, 16, 2, 0, 5, 5, 6, 11, 5, 0, 0 /* 800x600xbgra5650 */, (grub_uint32_t []) { 0x7e6ed757, 0x7e6ed757, 0x7e6ed757, 0x7e6ed757, 0x7e6ed757, }, 5 }, -- { "videotest", 1024, 768, 0x1, 256, 16, 2, 0, 5, 5, 6, 11, 5, 0, 0 /* 1024x768xbgra5650 */, (grub_uint32_t []) { 0x700255dd, 0x700255dd, 0x700255dd, 0x700255dd, 0x700255dd, }, 5 }, -- { "videotest", 640, 480, 0x1, 256, 24, 3, 0, 8, 8, 8, 16, 8, 0, 0 /* 640x480xbgra8880 */, (grub_uint32_t []) { 0x157232bd, 0x5e6bdacd, 0x8341e25d, 0xc8580a2d, 0x3cf9e58c, }, 5 }, -- { "videotest", 800, 600, 0x1, 256, 24, 3, 0, 8, 8, 8, 16, 8, 0, 0 /* 800x600xbgra8880 */, (grub_uint32_t []) { 0xbfafd7cd, 0x51650951, 0x67d61c04, 0x891cc298, 0xab036ae, }, 5 }, -- { "videotest", 1024, 768, 0x1, 256, 24, 3, 0, 8, 8, 8, 16, 8, 0, 0 /* 1024x768xbgra8880 */, (grub_uint32_t []) { 0x760580c9, 0xdc6d8205, 0x2739f3a0, 0x8d51f16c, 0xd47d661b, }, 5 }, -- { "videotest", 640, 480, 0x1, 256, 32, 4, 0, 8, 8, 8, 16, 8, 24, 8 /* 640x480xbgra8888 */, (grub_uint32_t []) { 0xada3b5f, 0x24cd61a6, 0x56f48ead, 0x78e3d454, 0xb28750bb, }, 5 }, -- { "videotest", 800, 600, 0x1, 256, 32, 4, 0, 8, 8, 8, 16, 8, 24, 8 /* 800x600xbgra8888 */, (grub_uint32_t []) { 0x827694e2, 0x9d97c3dd, 0xbdb43a9c, 0xa2556da3, 0xfdf3c81e, }, 5 }, -- { "videotest", 1024, 768, 0x1, 256, 32, 4, 0, 8, 8, 8, 16, 8, 24, 8 /* 1024x768xbgra8888 */, (grub_uint32_t []) { 0x664534a5, 0xcd0979a0, 0x3531d85e, 0x9e7d955b, 0xc0aced53, }, 5 }, -+ { "cmdline_cat", 640, 480, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi16 */, (grub_uint32_t []) { 0x59c36f00, 0xc69be699, 0xc69be699, 0xe17fc97c, 0xe17fc97c, 0xc2512486, 0xc2512486, 0x20260761, 0x20260761, 0xe3485349, 0xe3485349, 0x6020b4d9, 0x6020b4d9, 0x1605db98, 0x1605db98, 0xdca51b58, 0xdca51b58, 0xf3d66441, 0xf3d66441, 0x18cb7ce2, 0x18cb7ce2, 0x23b616d9, 0x23b616d9, 0xa1bf5dbf, 0xa1bf5dbf, 0x5e4a8b3d, 0x5e4a8b3d, 0x9933b3d8, 0x9933b3d8, 0xce7be2de, 0xce7be2de, 0x62531729, 0x62531729, 0xc39d3788, 0xc39d3788, 0xf7aee2fe, 0xf7aee2fe, 0xc66f4903, 0xc66f4903, 0x536c922f, 0x536c922f, 0xcb231652, 0x4ae07b67, 0x146816d5, 0x146816d5, }, 45 }, -+ { "cmdline_cat", 800, 600, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi16 */, (grub_uint32_t []) { 0xaa4593fe, 0x29d0cfb7, 0x29d0cfb7, 0x4d57ad88, 0x4d57ad88, 0xaf7591cb, 0xaf7591cb, 0xb88e3c0, 0xb88e3c0, 0x5d55a031, 0x5d55a031, 0x4363bcff, 0x4363bcff, 0xe1142833, 0xe1142833, 0x9578c80d, 0x9578c80d, 0xff1f5174, 0xff1f5174, 0x6828d47, 0x6828d47, 0x2a849ae3, 0x2a849ae3, 0x27a811d9, 0x27a811d9, 0x6c42e1cb, 0x6c42e1cb, 0x5bba61f5, 0x5bba61f5, 0xc02ab705, 0xc02ab705, 0xeb3e0e05, 0xeb3e0e05, 0x6f4ce3c, 0x6f4ce3c, 0x2075c50e, 0x2075c50e, 0x54ac7fba, 0x54ac7fba, 0x335d1c21, 0x335d1c21, 0xf923fbd1, 0x1b489d4d, 0x1253eb5e, 0x1253eb5e, }, 45 }, -+ { "cmdline_cat", 1024, 768, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi16 */, (grub_uint32_t []) { 0xc9cbf769, 0x6ff92a98, 0x6ff92a98, 0xbd8264b3, 0xbd8264b3, 0x5c50282c, 0x5c50282c, 0xd18d6a5a, 0xd18d6a5a, 0x99cea139, 0x99cea139, 0x2590c545, 0x2590c545, 0x55c86045, 0x55c86045, 0xad53ef1e, 0xad53ef1e, 0x5b44a23a, 0x5b44a23a, 0xa255f863, 0xa255f863, 0x85b0bdca, 0x85b0bdca, 0x4220ee1f, 0x4220ee1f, 0xeb991a9f, 0xeb991a9f, 0x86f366dd, 0x86f366dd, 0xfa176b7d, 0xfa176b7d, 0xd7384ca9, 0xd7384ca9, 0xceebf5c1, 0xceebf5c1, 0xae62b268, 0xae62b268, 0x6e89bbd6, 0x6e89bbd6, 0x3fe07c8e, 0x3fe07c8e, 0xee5358fe, 0x162d1a8a, 0x876f8d10, 0x876f8d10, }, 45 }, -+ { "cmdline_cat", 640, 480, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 640x480xrgba8888 */, (grub_uint32_t []) { 0x9813a416, 0xb96afaea, 0xb96afaea, 0xaa16ab1e, 0xaa16ab1e, 0x51ff382, 0x51ff382, 0xec74f127, 0xec74f127, 0xde4bca99, 0xde4bca99, 0x8ef3e8a5, 0x8ef3e8a5, 0x2daeb0b4, 0x2daeb0b4, 0x7cf5e243, 0x7cf5e243, 0x11fd57c6, 0x11fd57c6, 0x140723af, 0x140723af, 0x2bd93833, 0x2bd93833, 0xd731f4ac, 0xd731f4ac, 0x5fcd7114, 0x5fcd7114, 0xd1fea24a, 0xd1fea24a, 0x4083d53a, 0x4083d53a, 0x2e372605, 0x2e372605, 0x8e6316a7, 0x8e6316a7, 0x283ef6cc, 0x283ef6cc, 0x20cee9de, 0x20cee9de, 0xad6fa187, 0xad6fa187, 0xd691f438, 0xf3257e63, 0x4786ba7, 0x4786ba7, }, 45 }, -+ { "cmdline_cat", 800, 600, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 800x600xrgba8888 */, (grub_uint32_t []) { 0x5fcf013d, 0x48acf1bf, 0x48acf1bf, 0xb8777469, 0xb8777469, 0xad2fad44, 0xad2fad44, 0xa415ac59, 0xa415ac59, 0x5a7bfb26, 0x5a7bfb26, 0xccb6016, 0xccb6016, 0x77a80cb3, 0x77a80cb3, 0x2034c102, 0x2034c102, 0x444b4ccd, 0x444b4ccd, 0xe6c31bea, 0xe6c31bea, 0x8408036e, 0x8408036e, 0x9e7c556f, 0x9e7c556f, 0x445dc388, 0x445dc388, 0x94b3f850, 0x94b3f850, 0xf6f15341, 0xf6f15341, 0xcb939b5f, 0xcb939b5f, 0xbe88067d, 0xbe88067d, 0x1efc4734, 0x1efc4734, 0x7f5dfca8, 0x7f5dfca8, 0xb7b10eb9, 0xb7b10eb9, 0xb94cb441, 0x9571329, 0x8a26912b, 0x8a26912b, }, 45 }, -+ { "cmdline_cat", 1024, 768, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 1024x768xrgba8888 */, (grub_uint32_t []) { 0xdd28f52b, 0xc508d04e, 0xc508d04e, 0x6dbccbfe, 0x6dbccbfe, 0xbf06ff60, 0xbf06ff60, 0xbc5ab06, 0xbc5ab06, 0x97eeab3c, 0x97eeab3c, 0x62663589, 0x62663589, 0xb03e21e2, 0xb03e21e2, 0xea196bb6, 0xea196bb6, 0x672c16c4, 0x672c16c4, 0xefbca2cd, 0xefbca2cd, 0x1af5b410, 0x1af5b410, 0xc7a80569, 0xc7a80569, 0x4926a16, 0x4926a16, 0xee29c99c, 0xee29c99c, 0xffb15985, 0xffb15985, 0x4f608e46, 0x4f608e46, 0x3e450fd2, 0x3e450fd2, 0xac45215f, 0xac45215f, 0x789b0ce7, 0x789b0ce7, 0x4cedfe22, 0x4cedfe22, 0xa005588c, 0x701da05c, 0x6f25cec1, 0x6f25cec1, }, 45 }, -+ { "cmdline_cat", 2560, 1440, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 2560x1440xrgba8888 */, (grub_uint32_t []) { 0x43d1f34, 0x29e7a7f, 0x29e7a7f, 0xbd221052, 0xbd221052, 0x3b18b64, 0x3b18b64, 0x7f1e8462, 0x7f1e8462, 0xf28d5124, 0xf28d5124, 0xc336f170, 0xc336f170, 0xfe3bf988, 0xfe3bf988, 0x7bf89e05, 0x7bf89e05, 0x7857a3f8, 0x7857a3f8, 0x272c1a36, 0x272c1a36, 0xe8adb445, 0xe8adb445, 0x70cfe280, 0x70cfe280, 0x4f2b6120, 0x4f2b6120, 0xbaf5caa5, 0xbaf5caa5, 0x4b6bcab2, 0x4b6bcab2, 0x2bef7b92, 0x2bef7b92, 0x17b381dc, 0x17b381dc, 0x884c9c35, 0x884c9c35, 0x2f9eb909, 0x2f9eb909, 0xa811b3af, 0xa811b3af, 0x4c39478f, 0x5a72c3ab, 0x8071678a, 0x8071678a, }, 45 }, -+ { "gfxterm_menu", 640, 480, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi16 */, (grub_uint32_t []) { 0x59c36f00, 0xd9f04953, 0xbf3fa5d0, 0xd9f04953, 0x9a068414, 0x59c36f00, 0x59c36f00, 0x620c0067, 0x620c0067, 0x620c0067, 0x1c8c6d01, 0x1c8c6d01, 0x1c8c6d01, 0xc3269013, 0xc3269013, 0xc3269013, 0x59c36f00, 0x9a068414, 0x9a068414, 0x59c36f00, }, 20 }, -+ { "gfxterm_menu", 800, 600, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi16 */, (grub_uint32_t []) { 0xaa4593fe, 0x9254157f, 0x367e92c7, 0x9254157f, 0xbc519000, 0xaa4593fe, 0xaa4593fe, 0xa8a596c8, 0xa8a596c8, 0xa8a596c8, 0xe509baf, 0xe509baf, 0xe509baf, 0x16f0dc06, 0x16f0dc06, 0x16f0dc06, 0xaa4593fe, 0xbc519000, 0xbc519000, 0xaa4593fe, }, 20 }, -+ { "gfxterm_menu", 1024, 768, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi16 */, (grub_uint32_t []) { 0xc9cbf769, 0x354b1976, 0x8fc746ae, 0x354b1976, 0x685c74f2, 0xc9cbf769, 0xc9cbf769, 0x3ce35e1d, 0x3ce35e1d, 0x3ce35e1d, 0xc23b9fd1, 0xc23b9fd1, 0xc23b9fd1, 0x5b18528e, 0x5b18528e, 0x5b18528e, 0xc9cbf769, 0x685c74f2, 0x685c74f2, 0xc9cbf769, }, 20 }, -+ { "gfxterm_menu", 640, 480, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 640x480xrgba8888 */, (grub_uint32_t []) { 0x9813a416, 0x1c9ec014, 0xaf3ec923, 0x1c9ec014, 0x43f5296, 0x9813a416, 0x9813a416, 0x43fda3fa, 0x43fda3fa, 0x43fda3fa, 0xd22625c9, 0xd22625c9, 0xd22625c9, 0x76a62c0a, 0x76a62c0a, 0x76a62c0a, 0x9813a416, 0x43f5296, 0x43f5296, 0x9813a416, }, 20 }, -+ { "gfxterm_menu", 800, 600, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 800x600xrgba8888 */, (grub_uint32_t []) { 0x5fcf013d, 0xa704f7ea, 0xb7f2ec8b, 0xa704f7ea, 0xb279bf59, 0x5fcf013d, 0x5fcf013d, 0xf3582c48, 0xf3582c48, 0xf3582c48, 0x2148343e, 0x2148343e, 0x2148343e, 0x9c719024, 0x9c719024, 0x9c719024, 0x5fcf013d, 0xb279bf59, 0xb279bf59, 0x5fcf013d, }, 20 }, -+ { "gfxterm_menu", 1024, 768, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 1024x768xrgba8888 */, (grub_uint32_t []) { 0xdd28f52b, 0xf293ce36, 0xa6eb6ae8, 0xf293ce36, 0xcd87647e, 0xdd28f52b, 0xdd28f52b, 0xb3c7ef80, 0xb3c7ef80, 0xb3c7ef80, 0x92fb1664, 0x92fb1664, 0x92fb1664, 0xd15b5e2e, 0xd15b5e2e, 0xd15b5e2e, 0xdd28f52b, 0xcd87647e, 0xcd87647e, 0xdd28f52b, }, 20 }, -+ { "gfxterm_menu", 2560, 1440, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 2560x1440xrgba8888 */, (grub_uint32_t []) { 0x43d1f34, 0x31e75bd7, 0x9a768c6a, 0x31e75bd7, 0xa8fc31a6, 0x43d1f34, 0x43d1f34, 0xa0717008, 0xa0717008, 0xa0717008, 0xdf7bd9a0, 0xdf7bd9a0, 0xdf7bd9a0, 0x8e5a9312, 0x8e5a9312, 0x8e5a9312, 0x43d1f34, 0xa8fc31a6, 0xa8fc31a6, 0x43d1f34, }, 20 }, -+ { "gfxmenu", 640, 480, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi16 */, (grub_uint32_t []) { 0x59c36f00, 0x1ce7bd78, 0x682580f5, 0x1ce7bd78, 0x490ad6fe, 0x9a2e0d26, 0x64eb71ba, 0x64eb71ba, 0x64eb71ba, 0x3833877a, 0x3833877a, 0x3833877a, 0xcfc14f0a, 0xcfc14f0a, 0xcfc14f0a, 0x59c36f00, 0x490ad6fe, 0x490ad6fe, }, 18 }, -+ { "gfxmenu", 800, 600, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi16 */, (grub_uint32_t []) { 0xaa4593fe, 0x2b6ff87d, 0x63ce2ca2, 0x2b6ff87d, 0xf00f044e, 0xa9d58ccd, 0xe2c46577, 0xe2c46577, 0xe2c46577, 0xb79bcf7d, 0xb79bcf7d, 0xb79bcf7d, 0xbc30ed71, 0xbc30ed71, 0xbc30ed71, 0xaa4593fe, 0xf00f044e, 0xf00f044e, }, 18 }, -+ { "gfxmenu", 1024, 768, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi16 */, (grub_uint32_t []) { 0xc9cbf769, 0xe61cadba, 0x9880b727, 0xe61cadba, 0xdf5f2fc0, 0x5411be8b, 0x4449774e, 0x4449774e, 0x4449774e, 0x3bf7d1da, 0x3bf7d1da, 0x3bf7d1da, 0xd2ddee01, 0xd2ddee01, 0xd2ddee01, 0xc9cbf769, 0xdf5f2fc0, 0xdf5f2fc0, }, 18 }, -+ { "gfxmenu", 640, 480, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 640x480xrgba8888 */, (grub_uint32_t []) { 0x1c3742c9, 0xbe54acf7, 0x9b4ce770, 0xbe54acf7, 0x3111489, 0x740d78cf, 0x314c4c59, 0x314c4c59, 0x314c4c59, 0xdae9a625, 0xdae9a625, 0xdae9a625, 0xcbf8af57, 0xcbf8af57, 0xcbf8af57, 0x1c3742c9, 0x3111489, 0x3111489, }, 18 }, -+ { "gfxmenu", 800, 600, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 800x600xrgba8888 */, (grub_uint32_t []) { 0xcc5a7bed, 0xee571de5, 0x568aaeff, 0xee571de5, 0xe328b7a7, 0xbcda144c, 0xf56e1b60, 0xf56e1b60, 0xf56e1b60, 0x9a27c771, 0x9a27c771, 0x9a27c771, 0xd6d05397, 0xd6d05397, 0xd6d05397, 0xcc5a7bed, 0xe328b7a7, 0xe328b7a7, }, 18 }, -+ { "gfxmenu", 1024, 768, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 1024x768xrgba8888 */, (grub_uint32_t []) { 0xef4a3312, 0x1db9877c, 0x7e1afeae, 0x1db9877c, 0x8fc0c430, 0x5d55a141, 0x96f335c6, 0x96f335c6, 0x96f335c6, 0x504171d8, 0x504171d8, 0x504171d8, 0x69f71c0, 0x69f71c0, 0x69f71c0, 0xef4a3312, 0x8fc0c430, 0x8fc0c430, }, 18 }, -+ { "gfxmenu", 2560, 1440, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 2560x1440xrgba8888 */, (grub_uint32_t []) { 0x54e48d80, 0x151819bd, 0xea8d4865, 0x151819bd, 0x11d75fd2, 0x6d6bb4bc, 0x650ccd09, 0x650ccd09, 0x650ccd09, 0xe4ff3bd8, 0xe4ff3bd8, 0xe4ff3bd8, 0xc5308b73, 0xc5308b73, 0xc5308b73, 0x54e48d80, 0x11d75fd2, 0x11d75fd2, }, 18 }, -+ { "gfxterm_ar", 640, 480, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi16 */, (grub_uint32_t []) { 0x59c36f00, 0xd0b06c3d, 0xde50d1a5, 0xd0b06c3d, 0x9346a17a, 0x59c36f00, 0x59c36f00, 0xacff5d47, 0xacff5d47, 0xacff5d47, 0xd27f3021, 0xd27f3021, 0xd27f3021, 0xdd5cd33, 0xdd5cd33, 0xdd5cd33, 0x59c36f00, 0x9346a17a, 0x9346a17a, 0x59c36f00, }, 20 }, -+ { "gfxterm_ar", 800, 600, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi16 */, (grub_uint32_t []) { 0xaa4593fe, 0xf32d50c1, 0x730a7ed, 0xf32d50c1, 0xdd28d5be, 0xaa4593fe, 0xaa4593fe, 0xba8a2d4c, 0xba8a2d4c, 0xba8a2d4c, 0x1c7f202b, 0x1c7f202b, 0x1c7f202b, 0x4df6782, 0x4df6782, 0x4df6782, 0xaa4593fe, 0xdd28d5be, 0xdd28d5be, 0xaa4593fe, }, 20 }, -+ { "gfxterm_ar", 1024, 768, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi16 */, (grub_uint32_t []) { 0xc9cbf769, 0x711a4ac1, 0x6396f14c, 0x711a4ac1, 0x2c0d2745, 0xc9cbf769, 0xc9cbf769, 0x6b6ccbb0, 0x6b6ccbb0, 0x6b6ccbb0, 0x95b40a7c, 0x95b40a7c, 0x95b40a7c, 0xc97c723, 0xc97c723, 0xc97c723, 0xc9cbf769, 0x2c0d2745, 0x2c0d2745, 0xc9cbf769, }, 20 }, -+ { "gfxterm_ar", 640, 480, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 640x480xrgba8888 */, (grub_uint32_t []) { 0x9813a416, 0x29baad6a, 0x348b1f2b, 0x29baad6a, 0x311b3fe8, 0x9813a416, 0x9813a416, 0xe8e982cc, 0xe8e982cc, 0xe8e982cc, 0x793204ff, 0x793204ff, 0x793204ff, 0xddb20d3c, 0xddb20d3c, 0xddb20d3c, 0x9813a416, 0x311b3fe8, 0x311b3fe8, 0x9813a416, }, 20 }, -+ { "gfxterm_ar", 800, 600, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 800x600xrgba8888 */, (grub_uint32_t []) { 0x5fcf013d, 0xf834b3bb, 0x3951bd1a, 0xf834b3bb, 0xed49fb08, 0x5fcf013d, 0x5fcf013d, 0x5aefa2a7, 0x5aefa2a7, 0x5aefa2a7, 0x88ffbad1, 0x88ffbad1, 0x88ffbad1, 0x35c61ecb, 0x35c61ecb, 0x35c61ecb, 0x5fcf013d, 0xed49fb08, 0xed49fb08, 0x5fcf013d, }, 20 }, -+ { "gfxterm_ar", 1024, 768, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 1024x768xrgba8888 */, (grub_uint32_t []) { 0xdd28f52b, 0x7e9a7a47, 0xb1651b5a, 0x7e9a7a47, 0x418ed00f, 0xdd28f52b, 0xdd28f52b, 0x83f9db69, 0x83f9db69, 0x83f9db69, 0xa2c5228d, 0xa2c5228d, 0xa2c5228d, 0xe1656ac7, 0xe1656ac7, 0xe1656ac7, 0xdd28f52b, 0x418ed00f, 0x418ed00f, 0xdd28f52b, }, 20 }, -+ { "gfxterm_ar", 2560, 1440, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 2560x1440xrgba8888 */, (grub_uint32_t []) { 0x43d1f34, 0xc6a0340, 0x7dd5855c, 0xc6a0340, 0x95716931, 0x43d1f34, 0x43d1f34, 0x5f1c24c0, 0x5f1c24c0, 0x5f1c24c0, 0x20168d68, 0x20168d68, 0x20168d68, 0x7137c7da, 0x7137c7da, 0x7137c7da, 0x43d1f34, 0x95716931, 0x95716931, 0x43d1f34, }, 20 }, -+ { "gfxterm_cyr", 640, 480, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi16 */, (grub_uint32_t []) { 0x59c36f00, 0xd3798aaa, 0xab48784c, 0xd3798aaa, 0x908f47ed, 0x59c36f00, 0x59c36f00, 0x1688ec7c, 0x1688ec7c, 0x1688ec7c, 0x6808811a, 0x6808811a, 0x6808811a, 0xb7a27c08, 0xb7a27c08, 0xb7a27c08, 0x59c36f00, 0x908f47ed, 0x908f47ed, 0x59c36f00, }, 20 }, -+ { "gfxterm_cyr", 800, 600, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi16 */, (grub_uint32_t []) { 0xaa4593fe, 0xc30d9d2a, 0x60b9ed26, 0xc30d9d2a, 0xed081855, 0xaa4593fe, 0xaa4593fe, 0x3eba2192, 0x3eba2192, 0x3eba2192, 0x984f2cf5, 0x984f2cf5, 0x984f2cf5, 0x80ef6b5c, 0x80ef6b5c, 0x80ef6b5c, 0xaa4593fe, 0xed081855, 0xed081855, 0xaa4593fe, }, 20 }, -+ { "gfxterm_cyr", 1024, 768, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi16 */, (grub_uint32_t []) { 0xc9cbf769, 0xe469e6af, 0x46ac2012, 0xe469e6af, 0xb97e8b2b, 0xc9cbf769, 0xc9cbf769, 0x60f0d993, 0x60f0d993, 0x60f0d993, 0x9e28185f, 0x9e28185f, 0x9e28185f, 0x70bd500, 0x70bd500, 0x70bd500, 0xc9cbf769, 0xb97e8b2b, 0xb97e8b2b, 0xc9cbf769, }, 20 }, -+ { "gfxterm_cyr", 640, 480, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 640x480xrgba8888 */, (grub_uint32_t []) { 0x9813a416, 0x8538d2ef, 0xab143284, 0x8538d2ef, 0x9d99406d, 0x9813a416, 0x9813a416, 0x7e8326ec, 0x7e8326ec, 0x7e8326ec, 0xef58a0df, 0xef58a0df, 0xef58a0df, 0x4bd8a91c, 0x4bd8a91c, 0x4bd8a91c, 0x9813a416, 0x9d99406d, 0x9d99406d, 0x9813a416, }, 20 }, -+ { "gfxterm_cyr", 800, 600, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 800x600xrgba8888 */, (grub_uint32_t []) { 0x5fcf013d, 0x8115198c, 0x1abdaee1, 0x8115198c, 0x9468513f, 0x5fcf013d, 0x5fcf013d, 0xa5e86484, 0xa5e86484, 0xa5e86484, 0x77f87cf2, 0x77f87cf2, 0x77f87cf2, 0xcac1d8e8, 0xcac1d8e8, 0xcac1d8e8, 0x5fcf013d, 0x9468513f, 0x9468513f, 0x5fcf013d, }, 20 }, -+ { "gfxterm_cyr", 1024, 768, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 1024x768xrgba8888 */, (grub_uint32_t []) { 0xdd28f52b, 0xea03b805, 0x74148290, 0xea03b805, 0xd517124d, 0xdd28f52b, 0xdd28f52b, 0x8f6eee40, 0x8f6eee40, 0x8f6eee40, 0xae5217a4, 0xae5217a4, 0xae5217a4, 0xedf25fee, 0xedf25fee, 0xedf25fee, 0xdd28f52b, 0xd517124d, 0xd517124d, 0xdd28f52b, }, 20 }, -+ { "gfxterm_cyr", 2560, 1440, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 2560x1440xrgba8888 */, (grub_uint32_t []) { 0x43d1f34, 0xa044490f, 0xe23458db, 0xa044490f, 0x395f237e, 0x43d1f34, 0x43d1f34, 0xe1ca82c2, 0xe1ca82c2, 0xe1ca82c2, 0x9ec02b6a, 0x9ec02b6a, 0x9ec02b6a, 0xcfe161d8, 0xcfe161d8, 0xcfe161d8, 0x43d1f34, 0x395f237e, 0x395f237e, 0x43d1f34, }, 20 }, -+ { "gfxterm_heb", 640, 480, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi16 */, (grub_uint32_t []) { 0x59c36f00, 0xf3259b30, 0xf1f01411, 0xf3259b30, 0xb0d35677, 0x59c36f00, 0x59c36f00, 0x97895f8e, 0x97895f8e, 0x97895f8e, 0xe90932e8, 0xe90932e8, 0xe90932e8, 0x36a3cffa, 0x36a3cffa, 0x36a3cffa, 0x59c36f00, 0xb0d35677, 0xb0d35677, 0x59c36f00, }, 20 }, -+ { "gfxterm_heb", 800, 600, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi16 */, (grub_uint32_t []) { 0xaa4593fe, 0x53a43759, 0xe0f26bfa, 0x53a43759, 0x7da1b226, 0xaa4593fe, 0xaa4593fe, 0xbf482a4e, 0xbf482a4e, 0xbf482a4e, 0x19bd2729, 0x19bd2729, 0x19bd2729, 0x11d6080, 0x11d6080, 0x11d6080, 0xaa4593fe, 0x7da1b226, 0x7da1b226, 0xaa4593fe, }, 20 }, -+ { "gfxterm_heb", 1024, 768, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi16 */, (grub_uint32_t []) { 0xc9cbf769, 0xd7ff8d53, 0x665b2728, 0xd7ff8d53, 0x8ae8e0d7, 0xc9cbf769, 0xc9cbf769, 0x5a693e73, 0x5a693e73, 0x5a693e73, 0xa4b1ffbf, 0xa4b1ffbf, 0xa4b1ffbf, 0x3d9232e0, 0x3d9232e0, 0x3d9232e0, 0xc9cbf769, 0x8ae8e0d7, 0x8ae8e0d7, 0xc9cbf769, }, 20 }, -+ { "gfxterm_heb", 640, 480, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 640x480xrgba8888 */, (grub_uint32_t []) { 0x9813a416, 0x99fddcbe, 0x6d5c8895, 0x99fddcbe, 0x815c4e3c, 0x9813a416, 0x9813a416, 0x9bcf9821, 0x9bcf9821, 0x9bcf9821, 0xa141e12, 0xa141e12, 0xa141e12, 0xae9417d1, 0xae9417d1, 0xae9417d1, 0x9813a416, 0x815c4e3c, 0x815c4e3c, 0x9813a416, }, 20 }, -+ { "gfxterm_heb", 800, 600, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 800x600xrgba8888 */, (grub_uint32_t []) { 0x5fcf013d, 0x5797846, 0x25a6ad40, 0x5797846, 0x100430f5, 0x5fcf013d, 0x5fcf013d, 0xddc86daf, 0xddc86daf, 0xddc86daf, 0xfd875d9, 0xfd875d9, 0xfd875d9, 0xb2e1d1c3, 0xb2e1d1c3, 0xb2e1d1c3, 0x5fcf013d, 0x100430f5, 0x100430f5, 0x5fcf013d, }, 20 }, -+ { "gfxterm_heb", 1024, 768, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 1024x768xrgba8888 */, (grub_uint32_t []) { 0xdd28f52b, 0x30653ae8, 0x7fcd187, 0x30653ae8, 0xf7190a0, 0xdd28f52b, 0xdd28f52b, 0x24c3d325, 0x24c3d325, 0x24c3d325, 0x5ff2ac1, 0x5ff2ac1, 0x5ff2ac1, 0x465f628b, 0x465f628b, 0x465f628b, 0xdd28f52b, 0xf7190a0, 0xf7190a0, 0xdd28f52b, }, 20 }, -+ { "gfxterm_heb", 2560, 1440, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 2560x1440xrgba8888 */, (grub_uint32_t []) { 0x43d1f34, 0x3bd91638, 0x1d74dd4a, 0x3bd91638, 0xa2c27c49, 0x43d1f34, 0x43d1f34, 0x53d1ad3d, 0x53d1ad3d, 0x53d1ad3d, 0x2cdb0495, 0x2cdb0495, 0x2cdb0495, 0x7dfa4e27, 0x7dfa4e27, 0x7dfa4e27, 0x43d1f34, 0xa2c27c49, 0xa2c27c49, 0x43d1f34, }, 20 }, -+ { "gfxterm_gre", 640, 480, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi16 */, (grub_uint32_t []) { 0x59c36f00, 0xbe2c351a, 0x2692720, 0xbe2c351a, 0xfddaf85d, 0x59c36f00, 0x59c36f00, 0x1b2e2301, 0x1b2e2301, 0x1b2e2301, 0x65ae4e67, 0x65ae4e67, 0x65ae4e67, 0xba04b375, 0xba04b375, 0xba04b375, 0x59c36f00, 0xfddaf85d, 0xfddaf85d, 0x59c36f00, }, 20 }, -+ { "gfxterm_gre", 800, 600, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi16 */, (grub_uint32_t []) { 0xaa4593fe, 0x1eca82e1, 0xe8fa59cc, 0x1eca82e1, 0x30cf079e, 0xaa4593fe, 0xaa4593fe, 0xaf27ddc5, 0xaf27ddc5, 0xaf27ddc5, 0x9d2d0a2, 0x9d2d0a2, 0x9d2d0a2, 0x1172970b, 0x1172970b, 0x1172970b, 0xaa4593fe, 0x30cf079e, 0x30cf079e, 0xaa4593fe, }, 20 }, -+ { "gfxterm_gre", 1024, 768, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi16 */, (grub_uint32_t []) { 0xc9cbf769, 0xa9ccd435, 0x1ac646eb, 0xa9ccd435, 0xf4dbb9b1, 0xc9cbf769, 0xc9cbf769, 0x86d69aa0, 0x86d69aa0, 0x86d69aa0, 0x780e5b6c, 0x780e5b6c, 0x780e5b6c, 0xe12d9633, 0xe12d9633, 0xe12d9633, 0xc9cbf769, 0xf4dbb9b1, 0xf4dbb9b1, 0xc9cbf769, }, 20 }, -+ { "gfxterm_gre", 640, 480, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 640x480xrgba8888 */, (grub_uint32_t []) { 0x9813a416, 0xf96d568, 0x7ad05c1b, 0xf96d568, 0x173747ea, 0x9813a416, 0x9813a416, 0xacf9792a, 0xacf9792a, 0xacf9792a, 0x3d22ff19, 0x3d22ff19, 0x3d22ff19, 0x99a2f6da, 0x99a2f6da, 0x99a2f6da, 0x9813a416, 0x173747ea, 0x173747ea, 0x9813a416, }, 20 }, -+ { "gfxterm_gre", 800, 600, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 800x600xrgba8888 */, (grub_uint32_t []) { 0x5fcf013d, 0xa0dc6b9c, 0xc2761148, 0xa0dc6b9c, 0xb5a1232f, 0x5fcf013d, 0x5fcf013d, 0x4e05748b, 0x4e05748b, 0x4e05748b, 0x9c156cfd, 0x9c156cfd, 0x9c156cfd, 0x212cc8e7, 0x212cc8e7, 0x212cc8e7, 0x5fcf013d, 0xb5a1232f, 0xb5a1232f, 0x5fcf013d, }, 20 }, -+ { "gfxterm_gre", 1024, 768, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 1024x768xrgba8888 */, (grub_uint32_t []) { 0xdd28f52b, 0xcd722f7d, 0xe4df8d6b, 0xcd722f7d, 0xf2668535, 0xdd28f52b, 0xdd28f52b, 0xbdbb8019, 0xbdbb8019, 0xbdbb8019, 0x9c8779fd, 0x9c8779fd, 0x9c8779fd, 0xdf2731b7, 0xdf2731b7, 0xdf2731b7, 0xdd28f52b, 0xf2668535, 0xf2668535, 0xdd28f52b, }, 20 }, -+ { "gfxterm_gre", 2560, 1440, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 2560x1440xrgba8888 */, (grub_uint32_t []) { 0x43d1f34, 0xa6c99d2f, 0x1de04317, 0xa6c99d2f, 0x3fd2f75e, 0x43d1f34, 0x43d1f34, 0x3f85b7d3, 0x3f85b7d3, 0x3f85b7d3, 0x408f1e7b, 0x408f1e7b, 0x408f1e7b, 0x11ae54c9, 0x11ae54c9, 0x11ae54c9, 0x43d1f34, 0x3fd2f75e, 0x3fd2f75e, 0x43d1f34, }, 20 }, -+ { "gfxterm_ru", 640, 480, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi16 */, (grub_uint32_t []) { 0x59c36f00, 0x1e35b709, 0x2683bf92, 0x1e35b709, 0x5dc37a4e, 0x59c36f00, 0x59c36f00, 0xd697967f, 0xd697967f, 0xd697967f, 0xa817fb19, 0xa817fb19, 0xa817fb19, 0x77bd060b, 0x77bd060b, 0x77bd060b, 0x59c36f00, 0x5dc37a4e, 0x5dc37a4e, 0x59c36f00, }, 20 }, -+ { "gfxterm_ru", 800, 600, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi16 */, (grub_uint32_t []) { 0xaa4593fe, 0x53ff7735, 0x8cbf197c, 0x53ff7735, 0x7dfaf24a, 0xaa4593fe, 0xaa4593fe, 0x389a922, 0x389a922, 0x389a922, 0xa57ca445, 0xa57ca445, 0xa57ca445, 0xbddce3ec, 0xbddce3ec, 0xbddce3ec, 0xaa4593fe, 0x7dfaf24a, 0x7dfaf24a, 0xaa4593fe, }, 20 }, -+ { "gfxterm_ru", 1024, 768, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi16 */, (grub_uint32_t []) { 0xc9cbf769, 0x5217c47d, 0x7c8ae63e, 0x5217c47d, 0xf00a9f9, 0xc9cbf769, 0xc9cbf769, 0x3995409, 0x3995409, 0x3995409, 0xfd4195c5, 0xfd4195c5, 0xfd4195c5, 0x6462589a, 0x6462589a, 0x6462589a, 0xc9cbf769, 0xf00a9f9, 0xf00a9f9, 0xc9cbf769, }, 20 }, -+ { "gfxterm_ru", 640, 480, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 640x480xrgba8888 */, (grub_uint32_t []) { 0x9813a416, 0x45b67706, 0x375fb5db, 0x45b67706, 0x5d17e584, 0x9813a416, 0x9813a416, 0x8195719b, 0x8195719b, 0x8195719b, 0x104ef7a8, 0x104ef7a8, 0x104ef7a8, 0xb4cefe6b, 0xb4cefe6b, 0xb4cefe6b, 0x9813a416, 0x5d17e584, 0x5d17e584, 0x9813a416, }, 20 }, -+ { "gfxterm_ru", 800, 600, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 800x600xrgba8888 */, (grub_uint32_t []) { 0x5fcf013d, 0xfc209a25, 0xd5c20779, 0xfc209a25, 0xe95dd296, 0x5fcf013d, 0x5fcf013d, 0xe5699efe, 0xe5699efe, 0xe5699efe, 0x37798688, 0x37798688, 0x37798688, 0x8a402292, 0x8a402292, 0x8a402292, 0x5fcf013d, 0xe95dd296, 0xe95dd296, 0x5fcf013d, }, 20 }, -+ { "gfxterm_ru", 1024, 768, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 1024x768xrgba8888 */, (grub_uint32_t []) { 0xdd28f52b, 0x77f956f0, 0xfb0cc079, 0x77f956f0, 0x48edfcb8, 0xdd28f52b, 0xdd28f52b, 0xd51b1dc9, 0xd51b1dc9, 0xd51b1dc9, 0xf427e42d, 0xf427e42d, 0xf427e42d, 0xb787ac67, 0xb787ac67, 0xb787ac67, 0xdd28f52b, 0x48edfcb8, 0x48edfcb8, 0xdd28f52b, }, 20 }, -+ { "gfxterm_ru", 2560, 1440, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 2560x1440xrgba8888 */, (grub_uint32_t []) { 0x43d1f34, 0x1d9ac82a, 0xa254aa53, 0x1d9ac82a, 0x8481a25b, 0x43d1f34, 0x43d1f34, 0xc304df68, 0xc304df68, 0xc304df68, 0xbc0e76c0, 0xbc0e76c0, 0xbc0e76c0, 0xed2f3c72, 0xed2f3c72, 0xed2f3c72, 0x43d1f34, 0x8481a25b, 0x8481a25b, 0x43d1f34, }, 20 }, -+ { "gfxterm_fr", 640, 480, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi16 */, (grub_uint32_t []) { 0x59c36f00, 0xa6239a89, 0x8dc4bfbb, 0xa6239a89, 0xe5d557ce, 0x59c36f00, 0x59c36f00, 0x244cf807, 0x244cf807, 0x244cf807, 0x5acc9561, 0x5acc9561, 0x5acc9561, 0x85666873, 0x85666873, 0x85666873, 0x59c36f00, 0xe5d557ce, 0xe5d557ce, 0x59c36f00, }, 20 }, -+ { "gfxterm_fr", 800, 600, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi16 */, (grub_uint32_t []) { 0xaa4593fe, 0x742cede9, 0x83bb7a50, 0x742cede9, 0x5a296896, 0xaa4593fe, 0xaa4593fe, 0xd83f8aeb, 0xd83f8aeb, 0xd83f8aeb, 0x7eca878c, 0x7eca878c, 0x7eca878c, 0x666ac025, 0x666ac025, 0x666ac025, 0xaa4593fe, 0x5a296896, 0x5a296896, 0xaa4593fe, }, 20 }, -+ { "gfxterm_fr", 1024, 768, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi16 */, (grub_uint32_t []) { 0xc9cbf769, 0xe20a98b0, 0x7e8cedef, 0xe20a98b0, 0xbf1df534, 0xc9cbf769, 0xc9cbf769, 0x2748b88c, 0x2748b88c, 0x2748b88c, 0xd9907940, 0xd9907940, 0xd9907940, 0x40b3b41f, 0x40b3b41f, 0x40b3b41f, 0xc9cbf769, 0xbf1df534, 0xbf1df534, 0xc9cbf769, }, 20 }, -+ { "gfxterm_fr", 640, 480, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 640x480xrgba8888 */, (grub_uint32_t []) { 0x9813a416, 0x8f911ca4, 0xcbf1d895, 0x8f911ca4, 0x97308e26, 0x9813a416, 0x9813a416, 0x5b359bf4, 0x5b359bf4, 0x5b359bf4, 0xcaee1dc7, 0xcaee1dc7, 0xcaee1dc7, 0x6e6e1404, 0x6e6e1404, 0x6e6e1404, 0x9813a416, 0x97308e26, 0x97308e26, 0x9813a416, }, 20 }, -+ { "gfxterm_fr", 800, 600, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 800x600xrgba8888 */, (grub_uint32_t []) { 0x5fcf013d, 0x1bf82c82, 0xc7b39627, 0x1bf82c82, 0xe856431, 0x5fcf013d, 0x5fcf013d, 0xa9dbae99, 0xa9dbae99, 0xa9dbae99, 0x7bcbb6ef, 0x7bcbb6ef, 0x7bcbb6ef, 0xc6f212f5, 0xc6f212f5, 0xc6f212f5, 0x5fcf013d, 0xe856431, 0xe856431, 0x5fcf013d, }, 20 }, -+ { "gfxterm_fr", 1024, 768, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 1024x768xrgba8888 */, (grub_uint32_t []) { 0xdd28f52b, 0xfae19a5c, 0xd1e8fabb, 0xfae19a5c, 0xc5f53014, 0xdd28f52b, 0xdd28f52b, 0xfa2c5565, 0xfa2c5565, 0xfa2c5565, 0xdb10ac81, 0xdb10ac81, 0xdb10ac81, 0x98b0e4cb, 0x98b0e4cb, 0x98b0e4cb, 0xdd28f52b, 0xc5f53014, 0xc5f53014, 0xdd28f52b, }, 20 }, -+ { "gfxterm_fr", 2560, 1440, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 2560x1440xrgba8888 */, (grub_uint32_t []) { 0x43d1f34, 0x9a18f7bc, 0x5fcecc43, 0x9a18f7bc, 0x3039dcd, 0x43d1f34, 0x43d1f34, 0x287a2b96, 0x287a2b96, 0x287a2b96, 0x5770823e, 0x5770823e, 0x5770823e, 0x651c88c, 0x651c88c, 0x651c88c, 0x43d1f34, 0x3039dcd, 0x3039dcd, 0x43d1f34, }, 20 }, -+ { "gfxterm_quot", 640, 480, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi16 */, (grub_uint32_t []) { 0x59c36f00, 0x65112dfc, 0x3dec17f, 0x65112dfc, 0x26e7e0bb, 0x59c36f00, 0x59c36f00, 0x620c0067, 0x620c0067, 0x620c0067, 0x1c8c6d01, 0x1c8c6d01, 0x1c8c6d01, 0xc3269013, 0xc3269013, 0xc3269013, 0x59c36f00, 0x26e7e0bb, 0x26e7e0bb, 0x59c36f00, }, 20 }, -+ { "gfxterm_quot", 800, 600, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi16 */, (grub_uint32_t []) { 0xaa4593fe, 0x2b3430fb, 0x8f1eb743, 0x2b3430fb, 0x531b584, 0xaa4593fe, 0xaa4593fe, 0xa8a596c8, 0xa8a596c8, 0xa8a596c8, 0xe509baf, 0xe509baf, 0xe509baf, 0x16f0dc06, 0x16f0dc06, 0x16f0dc06, 0xaa4593fe, 0x531b584, 0x531b584, 0xaa4593fe, }, 20 }, -+ { "gfxterm_quot", 1024, 768, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi16 */, (grub_uint32_t []) { 0xc9cbf769, 0xb523e920, 0xfafb6f8, 0xb523e920, 0xe83484a4, 0xc9cbf769, 0xc9cbf769, 0x3ce35e1d, 0x3ce35e1d, 0x3ce35e1d, 0xc23b9fd1, 0xc23b9fd1, 0xc23b9fd1, 0x5b18528e, 0x5b18528e, 0x5b18528e, 0xc9cbf769, 0xe83484a4, 0xe83484a4, 0xc9cbf769, }, 20 }, -+ { "gfxterm_quot", 640, 480, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 640x480xrgba8888 */, (grub_uint32_t []) { 0x9813a416, 0xa9bf7336, 0x1a1f7a01, 0xa9bf7336, 0xb11ee1b4, 0x9813a416, 0x9813a416, 0x43fda3fa, 0x43fda3fa, 0x43fda3fa, 0xd22625c9, 0xd22625c9, 0xd22625c9, 0x76a62c0a, 0x76a62c0a, 0x76a62c0a, 0x9813a416, 0xb11ee1b4, 0xb11ee1b4, 0x9813a416, }, 20 }, -+ { "gfxterm_quot", 800, 600, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 800x600xrgba8888 */, (grub_uint32_t []) { 0x5fcf013d, 0xe5271912, 0xf5d10273, 0xe5271912, 0xf05a51a1, 0x5fcf013d, 0x5fcf013d, 0xf3582c48, 0xf3582c48, 0xf3582c48, 0x2148343e, 0x2148343e, 0x2148343e, 0x9c719024, 0x9c719024, 0x9c719024, 0x5fcf013d, 0xf05a51a1, 0xf05a51a1, 0x5fcf013d, }, 20 }, -+ { "gfxterm_quot", 1024, 768, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 1024x768xrgba8888 */, (grub_uint32_t []) { 0xdd28f52b, 0x66a34f49, 0x32dbeb97, 0x66a34f49, 0x59b7e501, 0xdd28f52b, 0xdd28f52b, 0xb3c7ef80, 0xb3c7ef80, 0xb3c7ef80, 0x92fb1664, 0x92fb1664, 0x92fb1664, 0xd15b5e2e, 0xd15b5e2e, 0xd15b5e2e, 0xdd28f52b, 0x59b7e501, 0x59b7e501, 0xdd28f52b, }, 20 }, -+ { "gfxterm_quot", 2560, 1440, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 2560x1440xrgba8888 */, (grub_uint32_t []) { 0x43d1f34, 0x7c2f19da, 0xd7bece67, 0x7c2f19da, 0xe53473ab, 0x43d1f34, 0x43d1f34, 0xa0717008, 0xa0717008, 0xa0717008, 0xdf7bd9a0, 0xdf7bd9a0, 0xdf7bd9a0, 0x8e5a9312, 0x8e5a9312, 0x8e5a9312, 0x43d1f34, 0xe53473ab, 0xe53473ab, 0x43d1f34, }, 20 }, -+ { "gfxterm_piglatin", 640, 480, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi16 */, (grub_uint32_t []) { 0x59c36f00, 0x37943894, 0x78248c70, 0x37943894, 0x7462f5d3, 0x59c36f00, 0x59c36f00, 0xf4be229a, 0xf4be229a, 0xf4be229a, 0x8a3e4ffc, 0x8a3e4ffc, 0x8a3e4ffc, 0x5594b2ee, 0x5594b2ee, 0x5594b2ee, 0x59c36f00, 0x7462f5d3, 0x7462f5d3, 0x59c36f00, }, 20 }, -+ { "gfxterm_piglatin", 800, 600, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi16 */, (grub_uint32_t []) { 0xaa4593fe, 0xd5158e6c, 0xdc71ba0f, 0xd5158e6c, 0xfb100b13, 0xaa4593fe, 0xaa4593fe, 0xd3ed72a3, 0xd3ed72a3, 0xd3ed72a3, 0x75187fc4, 0x75187fc4, 0x75187fc4, 0x6db8386d, 0x6db8386d, 0x6db8386d, 0xaa4593fe, 0xfb100b13, 0xfb100b13, 0xaa4593fe, }, 20 }, -+ { "gfxterm_piglatin", 1024, 768, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi16 */, (grub_uint32_t []) { 0xc9cbf769, 0x6277a9e6, 0xa3265ffb, 0x6277a9e6, 0x3f60c462, 0xc9cbf769, 0xc9cbf769, 0x2dcf8a8d, 0x2dcf8a8d, 0x2dcf8a8d, 0xd3174b41, 0xd3174b41, 0xd3174b41, 0x4a34861e, 0x4a34861e, 0x4a34861e, 0xc9cbf769, 0x3f60c462, 0x3f60c462, 0xc9cbf769, }, 20 }, -+ { "gfxterm_piglatin", 640, 480, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 640x480xrgba8888 */, (grub_uint32_t []) { 0x9813a416, 0x81115dc4, 0xddf3f768, 0x81115dc4, 0x99b0cf46, 0x9813a416, 0x9813a416, 0x9b9d96df, 0x9b9d96df, 0x9b9d96df, 0xa4610ec, 0xa4610ec, 0xa4610ec, 0xaec6192f, 0xaec6192f, 0xaec6192f, 0x9813a416, 0x99b0cf46, 0x99b0cf46, 0x9813a416, }, 20 }, -+ { "gfxterm_piglatin", 800, 600, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 800x600xrgba8888 */, (grub_uint32_t []) { 0x5fcf013d, 0x5e96a904, 0x27864d3d, 0x5e96a904, 0x4bebe1b7, 0x5fcf013d, 0x5fcf013d, 0x18cae7f4, 0x18cae7f4, 0x18cae7f4, 0xcadaff82, 0xcadaff82, 0xcadaff82, 0x77e35b98, 0x77e35b98, 0x77e35b98, 0x5fcf013d, 0x4bebe1b7, 0x4bebe1b7, 0x5fcf013d, }, 20 }, -+ { "gfxterm_piglatin", 1024, 768, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 1024x768xrgba8888 */, (grub_uint32_t []) { 0xdd28f52b, 0xd00b19f8, 0xba73a9c6, 0xd00b19f8, 0xef1fb3b0, 0xdd28f52b, 0xdd28f52b, 0xb660046d, 0xb660046d, 0xb660046d, 0x975cfd89, 0x975cfd89, 0x975cfd89, 0xd4fcb5c3, 0xd4fcb5c3, 0xd4fcb5c3, 0xdd28f52b, 0xef1fb3b0, 0xef1fb3b0, 0xdd28f52b, }, 20 }, -+ { "gfxterm_piglatin", 2560, 1440, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 2560x1440xrgba8888 */, (grub_uint32_t []) { 0x43d1f34, 0x8b4b98cd, 0x78ddc6e4, 0x8b4b98cd, 0x1250f2bc, 0x43d1f34, 0x43d1f34, 0x4889d3fd, 0x4889d3fd, 0x4889d3fd, 0x37837a55, 0x37837a55, 0x37837a55, 0x66a230e7, 0x66a230e7, 0x66a230e7, 0x43d1f34, 0x1250f2bc, 0x1250f2bc, 0x43d1f34, }, 20 }, -+ { "gfxterm_ch", 640, 480, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi16 */, (grub_uint32_t []) { 0x59c36f00, 0xfecb570e, 0xccb97a7a, 0xfecb570e, 0xbd3d9a49, 0x59c36f00, 0x59c36f00, 0x40281258, 0x40281258, 0x40281258, 0x3ea87f3e, 0x3ea87f3e, 0x3ea87f3e, 0xe102822c, 0xe102822c, 0xe102822c, 0x59c36f00, 0xbd3d9a49, 0xbd3d9a49, 0x59c36f00, }, 20 }, -+ { "gfxterm_ch", 800, 600, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi16 */, (grub_uint32_t []) { 0xaa4593fe, 0x897d1fac, 0xaa982529, 0x897d1fac, 0xa7789ad3, 0xaa4593fe, 0xaa4593fe, 0xa482510, 0xa482510, 0xa482510, 0xacbd2877, 0xacbd2877, 0xacbd2877, 0xb41d6fde, 0xb41d6fde, 0xb41d6fde, 0xaa4593fe, 0xa7789ad3, 0xa7789ad3, 0xaa4593fe, }, 20 }, -+ { "gfxterm_ch", 1024, 768, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi16 */, (grub_uint32_t []) { 0xc9cbf769, 0xd02a5297, 0xe627ab58, 0xd02a5297, 0x8d3d3f13, 0xc9cbf769, 0xc9cbf769, 0xbf0a8b7f, 0xbf0a8b7f, 0xbf0a8b7f, 0x41d24ab3, 0x41d24ab3, 0x41d24ab3, 0xd8f187ec, 0xd8f187ec, 0xd8f187ec, 0xc9cbf769, 0x8d3d3f13, 0x8d3d3f13, 0xc9cbf769, }, 20 }, -+ { "gfxterm_ch", 640, 480, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 640x480xrgba8888 */, (grub_uint32_t []) { 0x9813a416, 0xa653dcda, 0x3392e976, 0xa653dcda, 0xbef24e58, 0x9813a416, 0x9813a416, 0x4f2bc106, 0x4f2bc106, 0x4f2bc106, 0xdef04735, 0xdef04735, 0xdef04735, 0x7a704ef6, 0x7a704ef6, 0x7a704ef6, 0x9813a416, 0xbef24e58, 0xbef24e58, 0x9813a416, }, 20 }, -+ { "gfxterm_ch", 800, 600, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 800x600xrgba8888 */, (grub_uint32_t []) { 0x5fcf013d, 0xe2d7b585, 0x35241f36, 0xe2d7b585, 0xf7aafd36, 0x5fcf013d, 0x5fcf013d, 0xf2bd04db, 0xf2bd04db, 0xf2bd04db, 0x20ad1cad, 0x20ad1cad, 0x20ad1cad, 0x9d94b8b7, 0x9d94b8b7, 0x9d94b8b7, 0x5fcf013d, 0xf7aafd36, 0xf7aafd36, 0x5fcf013d, }, 20 }, -+ { "gfxterm_ch", 1024, 768, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 1024x768xrgba8888 */, (grub_uint32_t []) { 0xdd28f52b, 0x72ff749c, 0xeda8c283, 0x72ff749c, 0x4debded4, 0xdd28f52b, 0xdd28f52b, 0xb8c9cc22, 0xb8c9cc22, 0xb8c9cc22, 0x99f535c6, 0x99f535c6, 0x99f535c6, 0xda557d8c, 0xda557d8c, 0xda557d8c, 0xdd28f52b, 0x4debded4, 0x4debded4, 0xdd28f52b, }, 20 }, -+ { "gfxterm_ch", 2560, 1440, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 2560x1440xrgba8888 */, (grub_uint32_t []) { 0x43d1f34, 0xb7cac764, 0xeb4bf417, 0xb7cac764, 0x2ed1ad15, 0x43d1f34, 0x43d1f34, 0xce718801, 0xce718801, 0xce718801, 0xb17b21a9, 0xb17b21a9, 0xb17b21a9, 0xe05a6b1b, 0xe05a6b1b, 0xe05a6b1b, 0x43d1f34, 0x2ed1ad15, 0x2ed1ad15, 0x43d1f34, }, 20 }, -+ { "gfxterm_red", 640, 480, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi16 */, (grub_uint32_t []) { 0x59c36f00, 0x930e8e13, 0xf5c16290, 0x930e8e13, 0x27f5f1c0, 0x59c36f00, 0x59c36f00, 0xbad4e11, 0xbad4e11, 0xbad4e11, 0x752d2377, 0x752d2377, 0x752d2377, 0xaa87de65, 0xaa87de65, 0xaa87de65, 0x59c36f00, 0x27f5f1c0, 0x27f5f1c0, 0x59c36f00, }, 20 }, -+ { "gfxterm_red", 800, 600, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi16 */, (grub_uint32_t []) { 0xaa4593fe, 0xff9301f2, 0x5bb9864a, 0xff9301f2, 0x31c145de, 0xaa4593fe, 0xaa4593fe, 0x23bf2c32, 0x23bf2c32, 0x23bf2c32, 0x854a2155, 0x854a2155, 0x854a2155, 0x9dea66fc, 0x9dea66fc, 0x9dea66fc, 0xaa4593fe, 0x31c145de, 0x31c145de, 0xaa4593fe, }, 20 }, -+ { "gfxterm_red", 1024, 768, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi16 */, (grub_uint32_t []) { 0xc9cbf769, 0xfc5938ef, 0x46d56737, 0xfc5938ef, 0x23cf2668, 0xc9cbf769, 0xc9cbf769, 0xa8c549aa, 0xa8c549aa, 0xa8c549aa, 0x561d8866, 0x561d8866, 0x561d8866, 0xcf3e4539, 0xcf3e4539, 0xcf3e4539, 0xc9cbf769, 0x23cf2668, 0x23cf2668, 0xc9cbf769, }, 20 }, -+ { "gfxterm_red", 640, 480, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 640x480xrgba8888 */, (grub_uint32_t []) { 0x9813a416, 0xe7160822, 0x54b60115, 0xe7160822, 0x168efa6f, 0x9813a416, 0x9813a416, 0xb774a5aa, 0xb774a5aa, 0xb774a5aa, 0x26af2399, 0x26af2399, 0x26af2399, 0x822f2a5a, 0x822f2a5a, 0x822f2a5a, 0x9813a416, 0x168efa6f, 0x168efa6f, 0x9813a416, }, 20 }, -+ { "gfxterm_red", 800, 600, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 800x600xrgba8888 */, (grub_uint32_t []) { 0x5fcf013d, 0xf655f9b2, 0xe6a3e2d3, 0xf655f9b2, 0xd1d7405f, 0x5fcf013d, 0x5fcf013d, 0x2accaa08, 0x2accaa08, 0x2accaa08, 0xf8dcb27e, 0xf8dcb27e, 0xf8dcb27e, 0x45e51664, 0x45e51664, 0x45e51664, 0x5fcf013d, 0xd1d7405f, 0xd1d7405f, 0x5fcf013d, }, 20 }, -+ { "gfxterm_red", 1024, 768, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 1024x768xrgba8888 */, (grub_uint32_t []) { 0xdd28f52b, 0x2d85ebdc, 0x79fd4f02, 0x2d85ebdc, 0xc48ae2b6, 0xdd28f52b, 0xdd28f52b, 0x76b28a95, 0x76b28a95, 0x76b28a95, 0x578e7371, 0x578e7371, 0x578e7371, 0x142e3b3b, 0x142e3b3b, 0x142e3b3b, 0xdd28f52b, 0xc48ae2b6, 0xc48ae2b6, 0xdd28f52b, }, 20 }, -+ { "gfxterm_red", 2560, 1440, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 2560x1440xrgba8888 */, (grub_uint32_t []) { 0x43d1f34, 0x29c00f98, 0x8251d825, 0x29c00f98, 0x35a750d1, 0x43d1f34, 0x43d1f34, 0x48b70bc8, 0x48b70bc8, 0x48b70bc8, 0x37bda260, 0x37bda260, 0x37bda260, 0x669ce8d2, 0x669ce8d2, 0x669ce8d2, 0x43d1f34, 0x35a750d1, 0x35a750d1, 0x43d1f34, }, 20 }, -+ { "gfxterm_high", 640, 480, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi16 */, (grub_uint32_t []) { 0x59c36f00, 0x4afab717, 0x2c355b94, 0x4afab717, 0x1166d9d0, 0x59c36f00, 0x59c36f00, 0x620c0067, 0x620c0067, 0x620c0067, 0x1c8c6d01, 0x1c8c6d01, 0x1c8c6d01, 0xc3269013, 0xc3269013, 0xc3269013, 0x59c36f00, 0x1166d9d0, 0x1166d9d0, 0x59c36f00, }, 20 }, -+ { "gfxterm_high", 800, 600, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi16 */, (grub_uint32_t []) { 0xaa4593fe, 0xe3daadd4, 0x47f02a6c, 0xe3daadd4, 0x5ea9fb21, 0xaa4593fe, 0xaa4593fe, 0xa8a596c8, 0xa8a596c8, 0xa8a596c8, 0xe509baf, 0xe509baf, 0xe509baf, 0x16f0dc06, 0x16f0dc06, 0x16f0dc06, 0xaa4593fe, 0x5ea9fb21, 0x5ea9fb21, 0xaa4593fe, }, 20 }, -+ { "gfxterm_high", 1024, 768, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi16 */, (grub_uint32_t []) { 0xc9cbf769, 0xf140d1df, 0x4bcc8e07, 0xf140d1df, 0x7c962dcb, 0xc9cbf769, 0xc9cbf769, 0x3ce35e1d, 0x3ce35e1d, 0x3ce35e1d, 0xc23b9fd1, 0xc23b9fd1, 0xc23b9fd1, 0x5b18528e, 0x5b18528e, 0x5b18528e, 0xc9cbf769, 0x7c962dcb, 0x7c962dcb, 0xc9cbf769, }, 20 }, -+ { "gfxterm_high", 640, 480, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 640x480xrgba8888 */, (grub_uint32_t []) { 0x9813a416, 0xe709a12d, 0x54a9a81a, 0xe709a12d, 0xde04d65c, 0x9813a416, 0x9813a416, 0x43fda3fa, 0x43fda3fa, 0x43fda3fa, 0xd22625c9, 0xd22625c9, 0xd22625c9, 0x76a62c0a, 0x76a62c0a, 0x76a62c0a, 0x9813a416, 0xde04d65c, 0xde04d65c, 0x9813a416, }, 20 }, -+ { "gfxterm_high", 800, 600, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 800x600xrgba8888 */, (grub_uint32_t []) { 0x5fcf013d, 0x65eff77c, 0x7519ec1d, 0x65eff77c, 0x1cd7d353, 0x5fcf013d, 0x5fcf013d, 0xf3582c48, 0xf3582c48, 0xf3582c48, 0x2148343e, 0x2148343e, 0x2148343e, 0x9c719024, 0x9c719024, 0x9c719024, 0x5fcf013d, 0x1cd7d353, 0x1cd7d353, 0x5fcf013d, }, 20 }, -+ { "gfxterm_high", 1024, 768, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 1024x768xrgba8888 */, (grub_uint32_t []) { 0xdd28f52b, 0x7318831a, 0x276027c4, 0x7318831a, 0xd7e4f5bb, 0xdd28f52b, 0xdd28f52b, 0xb3c7ef80, 0xb3c7ef80, 0xb3c7ef80, 0x92fb1664, 0x92fb1664, 0x92fb1664, 0xd15b5e2e, 0xd15b5e2e, 0xd15b5e2e, 0xdd28f52b, 0xd7e4f5bb, 0xd7e4f5bb, 0xdd28f52b, }, 20 }, -+ { "gfxterm_high", 2560, 1440, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 2560x1440xrgba8888 */, (grub_uint32_t []) { 0x43d1f34, 0x6927a7d4, 0xc2b67069, 0x6927a7d4, 0xfc345163, 0x43d1f34, 0x43d1f34, 0xa0717008, 0xa0717008, 0xa0717008, 0xdf7bd9a0, 0xdf7bd9a0, 0xdf7bd9a0, 0x8e5a9312, 0x8e5a9312, 0x8e5a9312, 0x43d1f34, 0xfc345163, 0xfc345163, 0x43d1f34, }, 20 }, -+ { "videotest", 640, 480, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi16 */, (grub_uint32_t []) { 0xe6012f70, 0xe6012f70, 0xe6012f70, 0xe6012f70, 0xe6012f70, }, 5 }, -+ { "videotest", 800, 600, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi16 */, (grub_uint32_t []) { 0xfb6be77b, 0xfb6be77b, 0xfb6be77b, 0xfb6be77b, 0xfb6be77b, }, 5 }, -+ { "videotest", 1024, 768, 0x2, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi16 */, (grub_uint32_t []) { 0x67c0629f, 0x67c0629f, 0x67c0629f, 0x67c0629f, 0x67c0629f, }, 5 }, -+ { "videotest", 640, 480, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 640x480xrgba8888 */, (grub_uint32_t []) { 0x8f20afbb, 0xd8f7abc, 0x8f937344, 0xd3ca643, 0x8e471645, }, 5 }, -+ { "videotest", 800, 600, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 800x600xrgba8888 */, (grub_uint32_t []) { 0xdca764da, 0x9f76da9a, 0x5b04185a, 0x18d5a61a, 0xd60deb2b, }, 5 }, -+ { "videotest", 1024, 768, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 1024x768xrgba8888 */, (grub_uint32_t []) { 0x7b87af36, 0x7cb96093, 0x75fa307c, 0x72c4ffd9, 0x677c91a2, }, 5 }, -+ { "videotest", 2560, 1440, 0x1, 256, 32, 4, 16, 8, 8, 8, 0, 8, 24, 8 /* 2560x1440xrgba8888 */, (grub_uint32_t []) { 0x72981c65, 0x50120635, 0x378c28c5, 0x15063295, 0xf8b07525, }, 5 }, -+ { "videotest", 640, 480, 0x2, 256, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 640x480xi256 */, (grub_uint32_t []) { 0xc8f64b58, 0xc8f64b58, 0xc8f64b58, 0xc8f64b58, 0xc8f64b58, }, 5 }, -+ { "videotest", 800, 600, 0x2, 256, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 800x600xi256 */, (grub_uint32_t []) { 0x2b499dfa, 0x2b499dfa, 0x2b499dfa, 0x2b499dfa, 0x2b499dfa, }, 5 }, -+ { "videotest", 1024, 768, 0x2, 256, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0 /* 1024x768xi256 */, (grub_uint32_t []) { 0x6156b420, 0x6156b420, 0x6156b420, 0x6156b420, 0x6156b420, }, 5 }, -+ { "videotest", 640, 480, 0x1, 256, 15, 2, 10, 5, 5, 5, 0, 5, 0, 0 /* 640x480xrgba5550 */, (grub_uint32_t []) { 0x363285ca, 0x363285ca, 0x363285ca, 0x363285ca, 0x363285ca, }, 5 }, -+ { "videotest", 800, 600, 0x1, 256, 15, 2, 10, 5, 5, 5, 0, 5, 0, 0 /* 800x600xrgba5550 */, (grub_uint32_t []) { 0x25bb37f4, 0x25bb37f4, 0x25bb37f4, 0x25bb37f4, 0x25bb37f4, }, 5 }, -+ { "videotest", 1024, 768, 0x1, 256, 15, 2, 10, 5, 5, 5, 0, 5, 0, 0 /* 1024x768xrgba5550 */, (grub_uint32_t []) { 0xeeab9e91, 0xeeab9e91, 0xeeab9e91, 0xeeab9e91, 0xeeab9e91, }, 5 }, -+ { "videotest", 640, 480, 0x1, 256, 16, 2, 11, 5, 5, 6, 0, 5, 0, 0 /* 640x480xrgba5650 */, (grub_uint32_t []) { 0x26a9a50b, 0x26a9a50b, 0x26a9a50b, 0x26a9a50b, 0x26a9a50b, }, 5 }, -+ { "videotest", 800, 600, 0x1, 256, 16, 2, 11, 5, 5, 6, 0, 5, 0, 0 /* 800x600xrgba5650 */, (grub_uint32_t []) { 0x2c0f4fe7, 0x2c0f4fe7, 0x2c0f4fe7, 0x2c0f4fe7, 0x2c0f4fe7, }, 5 }, -+ { "videotest", 1024, 768, 0x1, 256, 16, 2, 11, 5, 5, 6, 0, 5, 0, 0 /* 1024x768xrgba5650 */, (grub_uint32_t []) { 0x46c11052, 0x46c11052, 0x46c11052, 0x46c11052, 0x46c11052, }, 5 }, -+ { "videotest", 640, 480, 0x1, 256, 24, 3, 16, 8, 8, 8, 0, 8, 0, 0 /* 640x480xrgba8880 */, (grub_uint32_t []) { 0xe56cf615, 0xcd2be572, 0xb5e2d0db, 0x9da5c3bc, 0x4470bb89, }, 5 }, -+ { "videotest", 800, 600, 0x1, 256, 24, 3, 16, 8, 8, 8, 0, 8, 0, 0 /* 800x600xrgba8880 */, (grub_uint32_t []) { 0x2a25b871, 0x4bf85361, 0xe99e6e51, 0x88438541, 0xa8be62c0, }, 5 }, -+ { "videotest", 1024, 768, 0x1, 256, 24, 3, 16, 8, 8, 8, 0, 8, 0, 0 /* 1024x768xrgba8880 */, (grub_uint32_t []) { 0x81523037, 0xd8c0bfd3, 0x32772fff, 0x6be5a01b, 0xe2f47956, }, 5 }, -+ { "videotest", 640, 480, 0x1, 256, 15, 2, 0, 5, 5, 5, 10, 5, 0, 0 /* 640x480xbgra5550 */, (grub_uint32_t []) { 0x1833bb41, 0x1833bb41, 0x1833bb41, 0x1833bb41, 0x1833bb41, }, 5 }, -+ { "videotest", 800, 600, 0x1, 256, 15, 2, 0, 5, 5, 5, 10, 5, 0, 0 /* 800x600xbgra5550 */, (grub_uint32_t []) { 0x2c39a0e8, 0x2c39a0e8, 0x2c39a0e8, 0x2c39a0e8, 0x2c39a0e8, }, 5 }, -+ { "videotest", 1024, 768, 0x1, 256, 15, 2, 0, 5, 5, 5, 10, 5, 0, 0 /* 1024x768xbgra5550 */, (grub_uint32_t []) { 0xf0d4c23, 0xf0d4c23, 0xf0d4c23, 0xf0d4c23, 0xf0d4c23, }, 5 }, -+ { "videotest", 640, 480, 0x1, 256, 16, 2, 0, 5, 5, 6, 11, 5, 0, 0 /* 640x480xbgra5650 */, (grub_uint32_t []) { 0x456d063c, 0x456d063c, 0x456d063c, 0x456d063c, 0x456d063c, }, 5 }, -+ { "videotest", 800, 600, 0x1, 256, 16, 2, 0, 5, 5, 6, 11, 5, 0, 0 /* 800x600xbgra5650 */, (grub_uint32_t []) { 0x47e15a2e, 0x47e15a2e, 0x47e15a2e, 0x47e15a2e, 0x47e15a2e, }, 5 }, -+ { "videotest", 1024, 768, 0x1, 256, 16, 2, 0, 5, 5, 6, 11, 5, 0, 0 /* 1024x768xbgra5650 */, (grub_uint32_t []) { 0x54d7300d, 0x54d7300d, 0x54d7300d, 0x54d7300d, 0x54d7300d, }, 5 }, -+ { "videotest", 640, 480, 0x1, 256, 24, 3, 0, 8, 8, 8, 16, 8, 0, 0 /* 640x480xbgra8880 */, (grub_uint32_t []) { 0x770da211, 0x8ef2528e, 0x811e35de, 0x78e1c541, 0x9ec6fb7e, }, 5 }, -+ { "videotest", 800, 600, 0x1, 256, 24, 3, 0, 8, 8, 8, 16, 8, 0, 0 /* 800x600xbgra8880 */, (grub_uint32_t []) { 0xeb181fbc, 0xae648cc1, 0x61e13946, 0x249daa3b, 0xfb0624b9, }, 5 }, -+ { "videotest", 1024, 768, 0x1, 256, 24, 3, 0, 8, 8, 8, 16, 8, 0, 0 /* 1024x768xbgra8880 */, (grub_uint32_t []) { 0x2b6f64dc, 0xc25f8431, 0xfce2d3f7, 0x15d2331a, 0x81987c7b, }, 5 }, -+ { "videotest", 640, 480, 0x1, 256, 32, 4, 0, 8, 8, 8, 16, 8, 24, 8 /* 640x480xbgra8888 */, (grub_uint32_t []) { 0xa260f7dd, 0x3e2f4980, 0x9f13fd96, 0x35c43cb, 0xd886e34b, }, 5 }, -+ { "videotest", 800, 600, 0x1, 256, 32, 4, 0, 8, 8, 8, 16, 8, 24, 8 /* 800x600xbgra8888 */, (grub_uint32_t []) { 0x41a9bff8, 0xa0d3f7c3, 0x86b1597f, 0x67cb1144, 0xca740407, }, 5 }, -+ { "videotest", 1024, 768, 0x1, 256, 32, 4, 0, 8, 8, 8, 16, 8, 24, 8 /* 1024x768xbgra8888 */, (grub_uint32_t []) { 0x8f7a3b6d, 0xcb84c6e3, 0x687c071, 0x42793dff, 0x996dbba4, }, 5 }, -diff --git a/include/grub/aout.h b/include/grub/aout.h -index 10d7dde61ececf0e980c6ad62420764fcefd5e67..c8c1d94eca518042992a6fc5e3777f81a39b431d 100644 ---- a/include/grub/aout.h -+++ b/include/grub/aout.h -@@ -52,6 +52,7 @@ - #define GRUB_AOUT_HEADER 1 - - #include -+#include - - struct grub_aout32_header - { -diff --git a/include/grub/arc/arc.h b/include/grub/arc/arc.h -index 7615a49a92cac0ac16326c188e438b789b09acec..999de7196753b58781a02c5311c9bc3834408021 100644 ---- a/include/grub/arc/arc.h -+++ b/include/grub/arc/arc.h -@@ -53,7 +53,7 @@ enum grub_arc_memory_type - #ifndef GRUB_CPU_WORDS_BIGENDIAN - GRUB_ARC_MEMORY_FREE_CONTIGUOUS, - #endif -- } grub_arc_memory_type_t; -+ }; - - struct grub_arc_timeinfo - { -diff --git a/include/grub/arm/coreboot/console.h b/include/grub/arm/coreboot/console.h -new file mode 100644 -index 0000000000000000000000000000000000000000..13a14b783839a6cae96845973ae3087bcaef670e ---- /dev/null -+++ b/include/grub/arm/coreboot/console.h -@@ -0,0 +1,29 @@ -+/* -+ * 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_MACHINE_CONSOLE_HEADER -+#define GRUB_MACHINE_CONSOLE_HEADER 1 -+ -+void grub_video_coreboot_fb_init (void); -+void grub_video_coreboot_fb_early_init (void); -+void grub_video_coreboot_fb_late_init (void); -+void grub_video_coreboot_fb_fini (void); -+ -+extern struct grub_linuxbios_table_framebuffer *grub_video_coreboot_fbtable; -+ -+#endif /* ! GRUB_MACHINE_CONSOLE_HEADER */ -diff --git a/include/grub/arm/coreboot/kernel.h b/include/grub/arm/coreboot/kernel.h -new file mode 100644 -index 0000000000000000000000000000000000000000..2695053427050f306b8ca86ba066df90c519e8e0 ---- /dev/null -+++ b/include/grub/arm/coreboot/kernel.h -@@ -0,0 +1,44 @@ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * Copyright (C) 2013 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_KERNEL_MACHINE_HEADER -+#define GRUB_KERNEL_MACHINE_HEADER 1 -+ -+#ifndef ASM_FILE -+ -+#include -+#include -+ -+struct grub_fdt_board -+{ -+ const char *vendor, *part; -+ const grub_uint8_t *dtb; -+ grub_size_t dtb_size; -+}; -+ -+extern struct grub_fdt_board grub_fdt_boards[]; -+void grub_machine_timer_init (void); -+void grub_pl050_init (void); -+void grub_cros_init (void); -+void grub_rk3288_spi_init (void); -+extern grub_addr_t EXPORT_VAR (start_of_ram); -+#endif /* ! ASM_FILE */ -+ -+#define GRUB_KERNEL_MACHINE_STACK_SIZE GRUB_KERNEL_ARM_STACK_SIZE -+ -+#endif /* ! GRUB_KERNEL_MACHINE_HEADER */ -diff --git a/include/grub/arm/cros_ec.h b/include/grub/arm/cros_ec.h -new file mode 100644 -index 0000000000000000000000000000000000000000..45a372572a5c3c411c9b2b7f328135f5cbe551c8 ---- /dev/null -+++ b/include/grub/arm/cros_ec.h -@@ -0,0 +1,21 @@ -+#ifndef GRUB_ARM_CROS_EC_H -+#define GRUB_ARM_CROS_EC_H 1 -+ -+#include -+#include -+ -+#define GRUB_CROS_EC_KEYSCAN_COLS 13 -+#define GRUB_CROS_EC_KEYSCAN_ROWS 8 -+ -+struct grub_cros_ec_keyscan { -+ grub_uint8_t data[GRUB_CROS_EC_KEYSCAN_COLS]; -+}; -+ -+int -+grub_cros_ec_scan_keyboard (const struct grub_fdtbus_dev *dev, -+ struct grub_cros_ec_keyscan *scan); -+ -+int -+grub_cros_ec_validate (const struct grub_fdtbus_dev *dev); -+ -+#endif -diff --git a/include/grub/arm/linux.h b/include/grub/arm/linux.h -index a66caad13db8c5c3b0da10f624d01a81640eab44..712ba17b9ba30cf850b6a9011d08a04d57816227 100644 ---- a/include/grub/arm/linux.h -+++ b/include/grub/arm/linux.h -@@ -17,14 +17,28 @@ - * along with GRUB. If not, see . - */ - --#ifndef GRUB_LINUX_CPU_HEADER --#define GRUB_LINUX_CPU_HEADER 1 -- --#define LINUX_ZIMAGE_OFFSET 0x24 --#define LINUX_ZIMAGE_MAGIC 0x016f2818 -+#ifndef GRUB_ARM_LINUX_HEADER -+#define GRUB_ARM_LINUX_HEADER 1 - - #include "system.h" - -+#define GRUB_LINUX_ARM_MAGIC_SIGNATURE 0x016f2818 -+ -+struct linux_arm_kernel_header { -+ grub_uint32_t code0; -+ grub_uint32_t reserved1[8]; -+ grub_uint32_t magic; -+ grub_uint32_t start; /* _start */ -+ grub_uint32_t end; /* _edata */ -+ grub_uint32_t reserved2[4]; -+ grub_uint32_t hdr_offset; -+}; -+ -+#if defined(__arm__) -+# define GRUB_LINUX_ARMXX_MAGIC_SIGNATURE GRUB_LINUX_ARM_MAGIC_SIGNATURE -+# define linux_armxx_kernel_header linux_arm_kernel_header -+#endif -+ - #if defined GRUB_MACHINE_UBOOT - # include - # define LINUX_ADDRESS (start_of_ram + 0x8000) -@@ -32,15 +46,17 @@ - # define LINUX_FDT_ADDRESS (LINUX_INITRD_ADDRESS - 0x10000) - # define grub_arm_firmware_get_boot_data grub_uboot_get_boot_data - # define grub_arm_firmware_get_machine_type grub_uboot_get_machine_type --#elif defined GRUB_MACHINE_EFI --# include --# include --/* On UEFI platforms - load the images at the lowest available address not -- less than *_PHYS_OFFSET from the first available memory location. */ --# define LINUX_PHYS_OFFSET (0x00008000) --# define LINUX_INITRD_PHYS_OFFSET (LINUX_PHYS_OFFSET + 0x02000000) --# define LINUX_FDT_PHYS_OFFSET (LINUX_INITRD_PHYS_OFFSET - 0x10000) --# define grub_arm_firmware_get_boot_data (grub_addr_t)grub_efi_get_firmware_fdt -+#elif defined (GRUB_MACHINE_COREBOOT) -+#include -+#include -+# define LINUX_ADDRESS (start_of_ram + 0x8000) -+# define LINUX_INITRD_ADDRESS (start_of_ram + 0x02000000) -+# define LINUX_FDT_ADDRESS (LINUX_INITRD_ADDRESS - 0x10000) -+static inline const void * -+grub_arm_firmware_get_boot_data (void) -+{ -+ return grub_fdtbus_get_fdt (); -+} - static inline grub_uint32_t - grub_arm_firmware_get_machine_type (void) - { -@@ -48,6 +64,4 @@ grub_arm_firmware_get_machine_type (void) - } - #endif - --#define FDT_ADDITIONAL_ENTRIES_SIZE 0x300 -- --#endif /* ! GRUB_LINUX_CPU_HEADER */ -+#endif /* ! GRUB_ARM_LINUX_HEADER */ -diff --git a/include/grub/arm/startup.h b/include/grub/arm/startup.h -new file mode 100644 -index 0000000000000000000000000000000000000000..9afb6c57c0bc4c53e96f711bf545d94a8ed07aa5 ---- /dev/null -+++ b/include/grub/arm/startup.h -@@ -0,0 +1,16 @@ -+#ifndef GRUB_STARTUP_CPU_HEADER -+#define GRUB_STARTUP_CPU_HEADER -+ -+struct grub_arm_startup_registers -+{ -+ /* registers 0-11 */ -+ /* for U-boot r[1] is machine type */ -+ /* for U-boot r[2] is boot data */ -+ grub_uint32_t r[12]; -+ grub_uint32_t sp; -+ grub_uint32_t lr; -+}; -+ -+extern struct grub_arm_startup_registers grub_arm_saved_registers; -+ -+#endif -diff --git a/include/grub/arm64/linux.h b/include/grub/arm64/linux.h -index 1ea23696e7a096e53075af2314da11ecce91f8d7..8655067e03924793293ba86cb1bae2e44efa5fee 100644 ---- a/include/grub/arm64/linux.h -+++ b/include/grub/arm64/linux.h -@@ -16,17 +16,13 @@ - * along with GRUB. If not, see . - */ - --#ifndef GRUB_LINUX_CPU_HEADER --#define GRUB_LINUX_CPU_HEADER 1 -+#ifndef GRUB_ARM64_LINUX_HEADER -+#define GRUB_ARM64_LINUX_HEADER 1 - --#include -- --#define GRUB_ARM64_LINUX_MAGIC 0x644d5241 /* 'ARM\x64' */ -- --#define GRUB_EFI_PE_MAGIC 0x5A4D -+#define GRUB_LINUX_ARM64_MAGIC_SIGNATURE 0x644d5241 /* 'ARM\x64' */ - - /* From linux/Documentation/arm64/booting.txt */ --struct grub_arm64_linux_kernel_header -+struct linux_arm64_kernel_header - { - grub_uint32_t code0; /* Executable code */ - grub_uint32_t code1; /* Executable code */ -@@ -40,9 +36,9 @@ struct grub_arm64_linux_kernel_header - grub_uint32_t hdr_offset; /* Offset of PE/COFF header */ - }; - --grub_err_t grub_arm64_uefi_check_image (struct grub_arm64_linux_kernel_header -- *lh); --grub_err_t grub_arm64_uefi_boot_image (grub_addr_t addr, grub_size_t size, -- char *args); -+#if defined(__aarch64__) -+# define GRUB_LINUX_ARMXX_MAGIC_SIGNATURE GRUB_LINUX_ARM64_MAGIC_SIGNATURE -+# define linux_armxx_kernel_header linux_arm64_kernel_header -+#endif - --#endif /* ! GRUB_LINUX_CPU_HEADER */ -+#endif /* ! GRUB_ARM64_LINUX_HEADER */ -diff --git a/include/grub/at_keyboard.h b/include/grub/at_keyboard.h -index b4f8ff0a06117756a770129683796edf0050b867..bcb4d9ba78f1376bdaa82249418f847eb4e543a6 100644 ---- a/include/grub/at_keyboard.h -+++ b/include/grub/at_keyboard.h -@@ -23,13 +23,11 @@ - #define KEYBOARD_COMMAND_ISREADY(x) !((x) & 0x02) - #define KEYBOARD_COMMAND_READ 0x20 - #define KEYBOARD_COMMAND_WRITE 0x60 -+#define KEYBOARD_COMMAND_ENABLE 0xf4 - #define KEYBOARD_COMMAND_REBOOT 0xfe - - #define KEYBOARD_AT_TRANSLATE 0x40 -- --#define GRUB_AT_ACK 0xfa --#define GRUB_AT_NACK 0xfe --#define GRUB_AT_TRIES 5 -+#define KEYBOARD_AT_DISABLE 0x10 - - #define KEYBOARD_ISMAKE(x) !((x) & 0x80) - #define KEYBOARD_ISREADY(x) ((x) & 0x01) -diff --git a/include/grub/autoefi.h b/include/grub/autoefi.h -index b75591176eb9d785de3f2867e32edc1b9a626280..b7a252e079e2137b4d27639b5c981e9085cb8a82 100644 ---- a/include/grub/autoefi.h -+++ b/include/grub/autoefi.h -@@ -55,7 +55,7 @@ static inline grub_err_t grub_autoefi_prepare (void) - # define SYSTEM_TABLE_PTR GRUB_EFIEMU_SYSTEM_TABLE_PTR - # define SIZEOF_OF_UINTN GRUB_EFIEMU_SIZEOF_OF_UINTN - # define SYSTEM_TABLE GRUB_EFIEMU_SYSTEM_TABLE --# define grub_efi_allocate_pages(x,y) (x) -+# define grub_efi_allocate_fixed(x,y) (x) - # define grub_efi_free_pages(x,y) GRUB_EFI_SUCCESS - # define grub_autoefi_finish_boot_services grub_efiemu_finish_boot_services - # define EFI_PRESENT 1 -diff --git a/include/grub/cache.h b/include/grub/cache.h -index fc669dfd1892c14bb43c6230e48067a0ff8e7c23..ccfa717e669625e0db96df0692c65f5a4c5ff916 100644 ---- a/include/grub/cache.h -+++ b/include/grub/cache.h -@@ -34,15 +34,16 @@ void EXPORT_FUNC(grub_arch_sync_caches) (void *address, grub_size_t len); - #endif - - #ifndef GRUB_MACHINE_EMU --#ifdef _mips --void EXPORT_FUNC(grub_arch_sync_dma_caches) (volatile void *address, -- grub_size_t len); --#else -+#if defined (__aarch64__) || defined (__powerpc__) || defined (__sparc__) -+ -+#elif defined (__i386__) || defined (__x86_64__) - static inline void - grub_arch_sync_dma_caches (volatile void *address __attribute__ ((unused)), - grub_size_t len __attribute__ ((unused))) - { - } -+#else -+void EXPORT_FUNC(grub_arch_sync_dma_caches) (volatile void *address, grub_size_t len); - #endif - #endif - -diff --git a/include/grub/i386/coreboot/lbio.h b/include/grub/coreboot/lbio.h -similarity index 93% -rename from include/grub/i386/coreboot/lbio.h -rename to include/grub/coreboot/lbio.h -index 1c3fa6f1953c3a6b41ea3644c30f000c98524224..5076d36c71ba32e5c55a6242287e5fe159e09b4f 100644 ---- a/include/grub/i386/coreboot/lbio.h -+++ b/include/grub/coreboot/lbio.h -@@ -20,6 +20,9 @@ - #ifndef _GRUB_MACHINE_LBIO_HEADER - #define _GRUB_MACHINE_LBIO_HEADER 1 - -+#include -+#include -+ - struct grub_linuxbios_table_header - { - grub_uint8_t signature[4]; -@@ -102,4 +105,10 @@ EXPORT_FUNC(grub_linuxbios_table_iterate) (int (*hook) (grub_linuxbios_table_ite - void *), - void *hook_data); - -+grub_linuxbios_table_header_t -+grub_linuxbios_get_tables (void); -+ -+int -+grub_linuxbios_check_signature (grub_linuxbios_table_header_t tbl_header); -+ - #endif -diff --git a/include/grub/dma.h b/include/grub/dma.h -new file mode 100644 -index 0000000000000000000000000000000000000000..19992ebc131d4fc93a45f31992ad3c03b9de2821 ---- /dev/null -+++ b/include/grub/dma.h -@@ -0,0 +1,44 @@ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * Copyright (C) 2008,2009 Free Software Foundation, Inc. -+ * -+ * GRUB is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation, either version 3 of the License, or -+ * (at your option) any later version. -+ * -+ * GRUB is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with GRUB. If not, see . -+ */ -+ -+#ifndef GRUB_DMA_H -+#define GRUB_DMA_H 1 -+ -+struct grub_pci_dma_chunk; -+ -+struct grub_pci_dma_chunk *EXPORT_FUNC(grub_memalign_dma32) (grub_size_t align, -+ grub_size_t size); -+void EXPORT_FUNC(grub_dma_free) (struct grub_pci_dma_chunk *ch); -+volatile void *EXPORT_FUNC(grub_dma_get_virt) (struct grub_pci_dma_chunk *ch); -+grub_uint32_t EXPORT_FUNC(grub_dma_get_phys) (struct grub_pci_dma_chunk *ch); -+ -+static inline void * -+grub_dma_phys2virt (grub_uint32_t phys, struct grub_pci_dma_chunk *chunk) -+{ -+ return ((grub_uint8_t *) grub_dma_get_virt (chunk) -+ + (phys - grub_dma_get_phys (chunk))); -+} -+ -+static inline grub_uint32_t -+grub_dma_virt2phys (volatile void *virt, struct grub_pci_dma_chunk *chunk) -+{ -+ return (((grub_uint8_t *) virt - (grub_uint8_t *) grub_dma_get_virt (chunk)) -+ + grub_dma_get_phys (chunk)); -+} -+ -+#endif -diff --git a/include/grub/efi/efi.h b/include/grub/efi/efi.h -index e9c601f34103ae1a4ced7e93be8204970bfef193..2c6648d46fc1a377312c81220c38470d9d1cc99a 100644 ---- a/include/grub/efi/efi.h -+++ b/include/grub/efi/efi.h -@@ -38,16 +38,25 @@ void *EXPORT_FUNC(grub_efi_open_protocol) (grub_efi_handle_t handle, - int EXPORT_FUNC(grub_efi_set_text_mode) (int on); - void EXPORT_FUNC(grub_efi_stall) (grub_efi_uintn_t microseconds); - void * --EXPORT_FUNC(grub_efi_allocate_pages) (grub_efi_physical_address_t address, -+EXPORT_FUNC(grub_efi_allocate_pages_real) (grub_efi_physical_address_t address, -+ grub_efi_uintn_t pages, -+ grub_efi_allocate_type_t alloctype, -+ grub_efi_memory_type_t memtype); -+void * -+EXPORT_FUNC(grub_efi_allocate_fixed) (grub_efi_physical_address_t address, - grub_efi_uintn_t pages); -+void * -+EXPORT_FUNC(grub_efi_allocate_any_pages) (grub_efi_uintn_t pages); - void EXPORT_FUNC(grub_efi_free_pages) (grub_efi_physical_address_t address, - grub_efi_uintn_t pages); -+grub_efi_uintn_t EXPORT_FUNC(grub_efi_find_mmap_size) (void); - int - EXPORT_FUNC(grub_efi_get_memory_map) (grub_efi_uintn_t *memory_map_size, - grub_efi_memory_descriptor_t *memory_map, - grub_efi_uintn_t *map_key, - grub_efi_uintn_t *descriptor_size, - grub_efi_uint32_t *descriptor_version); -+void grub_efi_memory_fini (void); - grub_efi_loaded_image_t *EXPORT_FUNC(grub_efi_get_loaded_image) (grub_efi_handle_t image_handle); - void EXPORT_FUNC(grub_efi_print_device_path) (grub_efi_device_path_t *dp); - char *EXPORT_FUNC(grub_efi_get_filename) (grub_efi_device_path_t *dp); -@@ -83,6 +92,11 @@ extern void (*EXPORT_VAR(grub_efi_net_config)) (grub_efi_handle_t hnd, - - #if defined(__arm__) || defined(__aarch64__) - void *EXPORT_FUNC(grub_efi_get_firmware_fdt)(void); -+grub_err_t EXPORT_FUNC(grub_efi_get_ram_base)(grub_addr_t *); -+#include -+grub_err_t grub_armxx_efi_linux_check_image(struct linux_armxx_kernel_header *lh); -+grub_err_t grub_armxx_efi_linux_boot_image(grub_addr_t addr, grub_size_t size, -+ char *args); - #endif - - grub_addr_t grub_efi_modules_addr (void); -diff --git a/include/grub/arm64/fdtload.h b/include/grub/efi/fdtload.h -similarity index 89% -rename from include/grub/arm64/fdtload.h -rename to include/grub/efi/fdtload.h -index 7b9ddba916d9980fbad51e7b02d99f0737ebc3fa..713c9424d0a9ebe47b1923a247e691566842b2d0 100644 ---- a/include/grub/arm64/fdtload.h -+++ b/include/grub/efi/fdtload.h -@@ -29,7 +29,4 @@ grub_fdt_unload (void); - grub_err_t - grub_fdt_install (void); - --#define GRUB_EFI_PAGE_SHIFT 12 --#define GRUB_EFI_BYTES_TO_PAGES(bytes) (((bytes) + 0xfff) >> GRUB_EFI_PAGE_SHIFT) -- - #endif -diff --git a/include/grub/efi/memory.h b/include/grub/efi/memory.h -index 20526b14676de9295d17968f5ddc837a06bc56b6..08fe62277839dde3434e506cde78174f1977e9c9 100644 ---- a/include/grub/efi/memory.h -+++ b/include/grub/efi/memory.h -@@ -22,6 +22,13 @@ - #include - #include - -+/* The term "page" in UEFI refers only to a 4 KiB-aligned 4 KiB size region of -+ memory. It is not concerned with underlying translation management concepts, -+ but only used as the granule for memory allocations. */ -+#define GRUB_EFI_PAGE_SHIFT 12 -+#define GRUB_EFI_PAGE_SIZE (1 << GRUB_EFI_PAGE_SHIFT) -+#define GRUB_EFI_BYTES_TO_PAGES(bytes) (((bytes) + 0xfff) >> GRUB_EFI_PAGE_SHIFT) -+ - #define GRUB_MMAP_REGISTER_BY_FIRMWARE 1 - - grub_err_t grub_machine_mmap_register (grub_uint64_t start, grub_uint64_t size, -diff --git a/include/grub/efi/pe32.h b/include/grub/efi/pe32.h -index f79c36c026e0a518b3f9edaca36251d6d4943757..7d44732d2c353b74271262a1cf094d4aafd8dd10 100644 ---- a/include/grub/efi/pe32.h -+++ b/include/grub/efi/pe32.h -@@ -45,6 +45,8 @@ - - #define GRUB_PE32_MSDOS_STUB_SIZE 0x80 - -+#define GRUB_PE32_MAGIC 0x5a4d -+ - /* According to the spec, the minimal alignment is 512 bytes... - But some examples (such as EFI drivers in the Intel - Sample Implementation) use 32 bytes (0x20) instead, and it seems -diff --git a/include/grub/efiemu/runtime.h b/include/grub/efiemu/runtime.h -index 9b6b729f4ccde7274678b1324c16c9f6854477a2..36d2dedf47e4346b86f17882dc554207201b6401 100644 ---- a/include/grub/efiemu/runtime.h -+++ b/include/grub/efiemu/runtime.h -@@ -29,7 +29,7 @@ struct grub_efiemu_ptv_rel - - struct efi_variable - { -- grub_efi_guid_t guid; -+ grub_efi_packed_guid_t guid; - grub_uint32_t namelen; - grub_uint32_t size; - grub_efi_uint32_t attributes; -diff --git a/include/grub/fat.h b/include/grub/fat.h -index 4a5aab7934652cfde20c6fb291e00c29170b8753..8d7e4a1e54d644e6d70bb249802c699d5092728e 100644 ---- a/include/grub/fat.h -+++ b/include/grub/fat.h -@@ -28,20 +28,15 @@ struct grub_fat_bpb - grub_uint16_t bytes_per_sector; - grub_uint8_t sectors_per_cluster; - grub_uint16_t num_reserved_sectors; -- grub_uint8_t num_fats; -- /* 0x10 */ -+ grub_uint8_t num_fats; /* 0x10 */ - grub_uint16_t num_root_entries; - grub_uint16_t num_total_sectors_16; -- grub_uint8_t media; -- /*0 x15 */ -+ grub_uint8_t media; /* 0x15 */ - grub_uint16_t sectors_per_fat_16; -- grub_uint16_t sectors_per_track; -- /*0 x19 */ -- grub_uint16_t num_heads; -- /*0 x1b */ -- grub_uint32_t num_hidden_sectors; -- /* 0x1f */ -- grub_uint32_t num_total_sectors_32; -+ grub_uint16_t sectors_per_track; /* 0x18 */ -+ grub_uint16_t num_heads; /* 0x1A */ -+ grub_uint32_t num_hidden_sectors; /* 0x1C */ -+ grub_uint32_t num_total_sectors_32; /* 0x20 */ - union - { - struct -diff --git a/include/grub/fdt.h b/include/grub/fdt.h -index fdfca75bf487f17e8621fee5d1642f4874a2bf16..158b1bc4b3ad8bac60860e298b816781d6c57090 100644 ---- a/include/grub/fdt.h -+++ b/include/grub/fdt.h -@@ -20,6 +20,7 @@ - #define GRUB_FDT_HEADER 1 - - #include -+#include - - #define FDT_MAGIC 0xD00DFEED - -@@ -49,6 +50,11 @@ struct grub_fdt_empty_tree { - - #define GRUB_FDT_EMPTY_TREE_SZ sizeof (struct grub_fdt_empty_tree) - -+/* Size needed by a property entry: 1 token (FDT_PROPERTY), plus len and nameoff -+ fields, plus the property value, plus padding if needed. */ -+#define grub_fdt_prop_entry_size(prop_len) \ -+ (3 * sizeof(grub_uint32_t) + ALIGN_UP(prop_len, sizeof(grub_uint32_t))) -+ - #define grub_fdt_get_header(fdt, field) \ - grub_be_to_cpu32(((const grub_fdt_header_t *)(fdt))->field) - #define grub_fdt_set_header(fdt, field, value) \ -@@ -95,16 +101,22 @@ struct grub_fdt_empty_tree { - #define grub_fdt_set_size_dt_struct(fdt, value) \ - grub_fdt_set_header(fdt, size_dt_struct, value) - --int grub_fdt_create_empty_tree (void *fdt, unsigned int size); --int grub_fdt_check_header (void *fdt, unsigned int size); --int grub_fdt_check_header_nosize (void *fdt); --int grub_fdt_find_subnode (const void *fdt, unsigned int parentoffset, -- const char *name); --int grub_fdt_add_subnode (void *fdt, unsigned int parentoffset, -+int EXPORT_FUNC(grub_fdt_create_empty_tree) (void *fdt, unsigned int size); -+int EXPORT_FUNC(grub_fdt_check_header) (const void *fdt, unsigned int size); -+int EXPORT_FUNC(grub_fdt_check_header_nosize) (const void *fdt); -+int EXPORT_FUNC(grub_fdt_find_subnode) (const void *fdt, unsigned int parentoffset, -+ const char *name); -+int EXPORT_FUNC(grub_fdt_first_node) (const void *fdt, unsigned int parentoffset); -+int EXPORT_FUNC(grub_fdt_next_node) (const void *fdt, unsigned int currentoffset); -+int EXPORT_FUNC(grub_fdt_add_subnode) (void *fdt, unsigned int parentoffset, - const char *name); -+const char * -+EXPORT_FUNC(grub_fdt_get_nodename) (const void *fdt, unsigned int nodeoffset); -+const void *EXPORT_FUNC(grub_fdt_get_prop) (const void *fdt, unsigned int nodeoffset, const char *name, -+ grub_uint32_t *len); - --int grub_fdt_set_prop (void *fdt, unsigned int nodeoffset, const char *name, -- const void *val, grub_uint32_t len); -+int EXPORT_FUNC(grub_fdt_set_prop) (void *fdt, unsigned int nodeoffset, const char *name, -+ const void *val, grub_uint32_t len); - #define grub_fdt_set_prop32(fdt, nodeoffset, name, val) \ - ({ \ - grub_uint32_t _val = grub_cpu_to_be32(val); \ -diff --git a/include/grub/fdtbus.h b/include/grub/fdtbus.h -new file mode 100644 -index 0000000000000000000000000000000000000000..f519c40ec35faea9aeedca055164012d9d9b3fb5 ---- /dev/null -+++ b/include/grub/fdtbus.h -@@ -0,0 +1,89 @@ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * Copyright (C) 2016 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_FDTBUS_HEADER -+#define GRUB_FDTBUS_HEADER 1 -+ -+#include -+#include -+ -+struct grub_fdtbus_dev -+{ -+ struct grub_fdtbus_dev *next; -+ struct grub_fdtbus_dev *parent; -+ int node; -+ struct grub_fdtbus_driver *driver; -+}; -+ -+struct grub_fdtbus_driver -+{ -+ struct grub_fdtbus_driver *next; -+ struct grub_fdtbus_driver **prev; -+ -+ const char *compatible; -+ -+ grub_err_t (*attach) (const struct grub_fdtbus_dev *dev); -+ void (*detach) (const struct grub_fdtbus_dev *dev); -+ -+ /* Message bus operations. */ -+ grub_err_t (*send) (const struct grub_fdtbus_dev *dev, const void *data, grub_size_t sz); -+ grub_err_t (*receive) (const struct grub_fdtbus_dev *dev, void *data, grub_size_t sz); -+ grub_err_t (*start) (const struct grub_fdtbus_dev *dev); -+ void (*stop) (const struct grub_fdtbus_dev *dev); -+}; -+ -+extern char EXPORT_VAR(grub_fdtbus_invalid_mapping)[1]; -+ -+static inline int -+grub_fdtbus_is_mapping_valid (volatile void *m) -+{ -+ return m != grub_fdtbus_invalid_mapping; -+} -+ -+volatile void * -+EXPORT_FUNC(grub_fdtbus_map_reg) (const struct grub_fdtbus_dev *dev, int reg, grub_size_t *size); -+ -+const void * -+EXPORT_FUNC(grub_fdtbus_get_fdt) (void); -+ -+const char * -+EXPORT_FUNC(grub_fdtbus_get_name) (const struct grub_fdtbus_dev *dev); -+ -+const void * -+EXPORT_FUNC(grub_fdtbus_get_prop) (const struct grub_fdtbus_dev *dev, -+ const char *name, -+ grub_uint32_t *len); -+ -+void -+EXPORT_FUNC(grub_fdtbus_register) (struct grub_fdtbus_driver *driver); -+ -+void -+EXPORT_FUNC(grub_fdtbus_unregister) (struct grub_fdtbus_driver *driver); -+ -+int -+EXPORT_FUNC(grub_fdtbus_is_compatible) (const char *compat_string, -+ const struct grub_fdtbus_dev *dev); -+ -+/* Must be called before any register(). */ -+/* dtb is assumed to be unfreeable and must remain -+ valid for lifetime of GRUB. -+ */ -+void -+grub_fdtbus_init (const void *dtb, grub_size_t size); -+ -+#endif -diff --git a/include/grub/gpt_partition.h b/include/grub/gpt_partition.h -index 1b32f6725a498f16941991771efe6a7a04ed6f5e..7a93f43291cce490cbaecc140ef2e5e0577ae274 100644 ---- a/include/grub/gpt_partition.h -+++ b/include/grub/gpt_partition.h -@@ -22,14 +22,14 @@ - #include - #include - --struct grub_gpt_part_type -+struct grub_gpt_part_guid - { - grub_uint32_t data1; - grub_uint16_t data2; - grub_uint16_t data3; - grub_uint8_t data4[8]; --} __attribute__ ((aligned(8))); --typedef struct grub_gpt_part_type grub_gpt_part_type_t; -+} GRUB_PACKED; -+typedef struct grub_gpt_part_guid grub_gpt_part_guid_t; - - #define GRUB_GPT_PARTITION_TYPE_EMPTY \ - { 0x0, 0x0, 0x0, \ -@@ -70,8 +70,8 @@ struct grub_gpt_header - - struct grub_gpt_partentry - { -- grub_gpt_part_type_t type; -- grub_uint8_t guid[16]; -+ grub_gpt_part_guid_t type; -+ grub_gpt_part_guid_t guid; - grub_uint64_t start; - grub_uint64_t end; - grub_uint64_t attrib; -diff --git a/include/grub/i386/linux.h b/include/grub/i386/linux.h -index da0ca3b83cdc7355fc5b9815415ad7fc8732d153..60c7c3b5e660276dc11d23f4a53ccc2f1e5536a5 100644 ---- a/include/grub/i386/linux.h -+++ b/include/grub/i386/linux.h -@@ -16,10 +16,10 @@ - * along with GRUB. If not, see . - */ - --#ifndef GRUB_LINUX_MACHINE_HEADER --#define GRUB_LINUX_MACHINE_HEADER 1 -+#ifndef GRUB_I386_LINUX_HEADER -+#define GRUB_I386_LINUX_HEADER 1 - --#define GRUB_LINUX_MAGIC_SIGNATURE 0x53726448 /* "HdrS" */ -+#define GRUB_LINUX_I386_MAGIC_SIGNATURE 0x53726448 /* "HdrS" */ - #define GRUB_LINUX_DEFAULT_SETUP_SECTS 4 - #define GRUB_LINUX_INITRD_MAX_ADDRESS 0x37FFFFFF - #define GRUB_LINUX_MAX_SETUP_SECTS 64 -@@ -43,6 +43,9 @@ - - #define GRUB_LINUX_CL_MAGIC 0xA33F - -+#define VIDEO_CAPABILITY_SKIP_QUIRKS (1 << 0) -+#define VIDEO_CAPABILITY_64BIT_BASE (1 << 1) /* Frame buffer base is 64-bit. */ -+ - #ifdef __x86_64__ - - #define GRUB_LINUX_EFI_SIGNATURE \ -@@ -85,7 +88,7 @@ enum - }; - - /* For the Linux/i386 boot protocol version 2.10. */ --struct linux_kernel_header -+struct linux_i386_kernel_header - { - grub_uint8_t code1[0x0020]; - grub_uint16_t cl_magic; /* Magic number 0xA33F */ -@@ -188,8 +191,9 @@ struct linux_kernel_params - grub_uint16_t lfb_pages; /* 32 */ - grub_uint16_t vesa_attrib; /* 34 */ - grub_uint32_t capabilities; /* 36 */ -+ grub_uint32_t ext_lfb_base; /* 3a */ - -- grub_uint8_t padding3[0x40 - 0x3a]; -+ grub_uint8_t padding3[0x40 - 0x3e]; - - grub_uint16_t apm_version; /* 40 */ - grub_uint16_t apm_code_segment; /* 42 */ -@@ -312,4 +316,4 @@ struct linux_kernel_params - } GRUB_PACKED; - #endif /* ! ASM_FILE */ - --#endif /* ! GRUB_LINUX_MACHINE_HEADER */ -+#endif /* ! GRUB_I386_LINUX_HEADER */ -diff --git a/include/grub/i386/multiboot.h b/include/grub/i386/multiboot.h -index 807a1de27f900c8393476736051e20ee1af6717c..0b596fc2060a63f2fd9e1c67cb002279454aebe5 100644 ---- a/include/grub/i386/multiboot.h -+++ b/include/grub/i386/multiboot.h -@@ -19,6 +19,13 @@ - #ifndef GRUB_MULTIBOOT_CPU_HEADER - #define GRUB_MULTIBOOT_CPU_HEADER 1 - -+#define MULTIBOOT2_INITIAL_STATE { .eax = MULTIBOOT2_BOOTLOADER_MAGIC, \ -+ .ecx = 0, \ -+ .edx = 0, \ -+ /* Set esp to some random location in low memory to avoid breaking */ \ -+ /* non-compliant kernels. */ \ -+ .esp = 0x7ff00 \ -+ } - #define MULTIBOOT_INITIAL_STATE { .eax = MULTIBOOT_BOOTLOADER_MAGIC, \ - .ecx = 0, \ - .edx = 0, \ -@@ -28,7 +35,7 @@ - } - #define MULTIBOOT_ENTRY_REGISTER eip - #define MULTIBOOT_MBI_REGISTER ebx --#define MULTIBOOT_ARCHITECTURE_CURRENT MULTIBOOT_ARCHITECTURE_I386 -+#define MULTIBOOT2_ARCHITECTURE_CURRENT MULTIBOOT2_ARCHITECTURE_I386 - - #ifdef GRUB_MACHINE_EFI - #ifdef __x86_64__ -@@ -36,6 +43,10 @@ - .rcx = 0, \ - .rdx = 0, \ - } -+#define MULTIBOOT2_EFI_INITIAL_STATE { .rax = MULTIBOOT2_BOOTLOADER_MAGIC, \ -+ .rcx = 0, \ -+ .rdx = 0, \ -+ } - #define MULTIBOOT_EFI_ENTRY_REGISTER rip - #define MULTIBOOT_EFI_MBI_REGISTER rbx - #endif -diff --git a/include/grub/ieee1275/ieee1275.h b/include/grub/ieee1275/ieee1275.h -index 8e425130327e193af1c1e34760e7255c9d6e6223..8868f3a756fe57b90188e25aaba2b203edacde13 100644 ---- a/include/grub/ieee1275/ieee1275.h -+++ b/include/grub/ieee1275/ieee1275.h -@@ -210,7 +210,25 @@ int EXPORT_FUNC(grub_ieee1275_set_property) (grub_ieee1275_phandle_t phandle, - int EXPORT_FUNC(grub_ieee1275_set_color) (grub_ieee1275_ihandle_t ihandle, - int index, int r, int g, int b); - int EXPORT_FUNC(grub_ieee1275_milliseconds) (grub_uint32_t *msecs); -- -+int EXPORT_FUNC(grub_ieee1275_set_address) (grub_ieee1275_ihandle_t ihandle, -+ grub_uint32_t target, -+ grub_uint32_t lun); -+int EXPORT_FUNC(grub_ieee1275_no_data_command) (grub_ieee1275_ihandle_t ihandle, -+ const void *cmd_addr, -+ grub_ssize_t *result); -+int EXPORT_FUNC(grub_ieee1275_decode_unit4) (grub_ieee1275_ihandle_t ihandle, -+ void *addr, grub_size_t size, -+ grub_uint32_t *phy_lo, -+ grub_uint32_t *phy_hi, -+ grub_uint32_t *lun_lo, -+ grub_uint32_t *lun_hi); -+char *EXPORT_FUNC(grub_ieee1275_encode_uint4) (grub_ieee1275_ihandle_t ihandle, -+ grub_uint32_t phy_lo, -+ grub_uint32_t phy_hi, -+ grub_uint32_t lun_lo, -+ grub_uint32_t lun_hi, -+ grub_size_t *size); -+int EXPORT_FUNC(grub_ieee1275_get_block_size) (grub_ieee1275_ihandle_t ihandle); - - grub_err_t EXPORT_FUNC(grub_claimmap) (grub_addr_t addr, grub_size_t size); - -@@ -235,6 +253,8 @@ void EXPORT_FUNC(grub_ieee1275_children_peer) (struct grub_ieee1275_devalias *al - void EXPORT_FUNC(grub_ieee1275_children_first) (const char *devpath, - struct grub_ieee1275_devalias *alias); - -+char *EXPORT_FUNC(grub_ieee1275_get_boot_dev) (void); -+ - #define FOR_IEEE1275_DEVALIASES(alias) for (grub_ieee1275_devalias_init_iterator (&(alias)); grub_ieee1275_devalias_next (&(alias));) - - #define FOR_IEEE1275_DEVCHILDREN(devpath, alias) for (grub_ieee1275_children_first ((devpath), &(alias)); \ -diff --git a/include/grub/kernel.h b/include/grub/kernel.h -index 20ddf2da297d5c883ed5b5542f2cfd99ee9c18da..ecd88ca72c6dea39be9f046463e7c51c874cb351 100644 ---- a/include/grub/kernel.h -+++ b/include/grub/kernel.h -@@ -28,7 +28,8 @@ enum - OBJ_TYPE_MEMDISK, - OBJ_TYPE_CONFIG, - OBJ_TYPE_PREFIX, -- OBJ_TYPE_PUBKEY -+ OBJ_TYPE_PUBKEY, -+ OBJ_TYPE_DTB - }; - - /* The module header. */ -diff --git a/include/grub/mips/multiboot.h b/include/grub/mips/multiboot.h -index 4aebf29e73240b575bb90c699fd02e8185ab5171..cdfb41e315af4aa22d549f76fb0131835abd957e 100644 ---- a/include/grub/mips/multiboot.h -+++ b/include/grub/mips/multiboot.h -@@ -19,11 +19,11 @@ - #ifndef GRUB_MULTIBOOT_CPU_HEADER - #define GRUB_MULTIBOOT_CPU_HEADER 1 - --#define MULTIBOOT_INITIAL_STATE { .gpr[4] = MULTIBOOT_BOOTLOADER_MAGIC, \ -+#define MULTIBOOT2_INITIAL_STATE { .gpr[4] = MULTIBOOT2_BOOTLOADER_MAGIC, \ - .jumpreg = 1 } - #define MULTIBOOT_ENTRY_REGISTER gpr[1] - #define MULTIBOOT_MBI_REGISTER gpr[5] --#define MULTIBOOT_ARCHITECTURE_CURRENT MULTIBOOT_ARCHITECTURE_MIPS32 -+#define MULTIBOOT2_ARCHITECTURE_CURRENT MULTIBOOT2_ARCHITECTURE_MIPS32 - - #define MULTIBOOT_ELF32_MACHINE EM_MIPS - #define MULTIBOOT_ELF64_MACHINE EM_MIPS -diff --git a/include/grub/misc.h b/include/grub/misc.h -index 2a9f87cc255eda94476733513807ec757c6d9cd9..372f009e84f12a58c3185dda63216bab7325be8f 100644 ---- a/include/grub/misc.h -+++ b/include/grub/misc.h -@@ -396,7 +396,8 @@ grub_abs (int x) - } - - /* Reboot the machine. */ --#if defined (GRUB_MACHINE_EMU) || defined (GRUB_MACHINE_QEMU_MIPS) -+#if defined (GRUB_MACHINE_EMU) || defined (GRUB_MACHINE_QEMU_MIPS) || \ -+ defined (GRUB_MACHINE_EFI) - void EXPORT_FUNC(grub_reboot) (void) __attribute__ ((noreturn)); - #else - void grub_reboot (void) __attribute__ ((noreturn)); -diff --git a/include/grub/multiboot.h b/include/grub/multiboot.h -index c96492bb5fa771831a62d4ab1bac3798328093f0..bd0a9873e6c158f77190c38546007c544cb0d6c9 100644 ---- a/include/grub/multiboot.h -+++ b/include/grub/multiboot.h -@@ -22,19 +22,11 @@ - - #include - --#ifdef GRUB_USE_MULTIBOOT2 --#include --/* Same thing as far as our loader is concerned. */ --#define MULTIBOOT_BOOTLOADER_MAGIC MULTIBOOT2_BOOTLOADER_MAGIC --#define MULTIBOOT_HEADER_MAGIC MULTIBOOT2_HEADER_MAGIC --#else - #include --#endif - - #include - #include - --#ifndef GRUB_USE_MULTIBOOT2 - typedef enum - { - GRUB_MULTIBOOT_QUIRKS_NONE = 0, -@@ -42,7 +34,6 @@ typedef enum - GRUB_MULTIBOOT_QUIRK_MODULES_AFTER_KERNEL = 2 - } grub_multiboot_quirks_t; - extern grub_multiboot_quirks_t grub_multiboot_quirks; --#endif - - extern struct grub_relocator *grub_multiboot_relocator; - -@@ -60,7 +51,7 @@ void - grub_multiboot_add_elfsyms (grub_size_t num, grub_size_t entsize, - unsigned shndx, void *data); - --grub_uint32_t grub_get_multiboot_mmap_count (void); -+grub_uint32_t grub_multiboot_get_mmap_count (void); - grub_err_t grub_multiboot_set_video_mode (void); - - /* FIXME: support coreboot as well. */ -diff --git a/include/grub/multiboot2.h b/include/grub/multiboot2.h -new file mode 100644 -index 0000000000000000000000000000000000000000..502d34ef18045e898680f2198522139c3066b587 ---- /dev/null -+++ b/include/grub/multiboot2.h -@@ -0,0 +1,104 @@ -+/* multiboot.h - multiboot header file with grub definitions. */ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * Copyright (C) 2003,2007,2008,2010 Free Software Foundation, Inc. -+ * -+ * GRUB is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation, either version 3 of the License, or -+ * (at your option) any later version. -+ * -+ * GRUB is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with GRUB. If not, see . -+ */ -+ -+#ifndef GRUB_MULTIBOOT2_HEADER -+#define GRUB_MULTIBOOT2_HEADER 1 -+ -+#include -+ -+#include -+ -+#include -+#include -+ -+extern struct grub_relocator *grub_multiboot2_relocator; -+ -+void grub_multiboot2 (int argc, char *argv[]); -+void grub_module2 (int argc, char *argv[]); -+ -+void grub_multiboot2_set_accepts_video (int val); -+grub_err_t grub_multiboot2_make_mbi (grub_uint32_t *target); -+void grub_multiboot2_free_mbi (void); -+grub_err_t grub_multiboot2_init_mbi (int argc, char *argv[]); -+grub_err_t grub_multiboot2_add_module (grub_addr_t start, grub_size_t size, -+ int argc, char *argv[]); -+void grub_multiboot2_set_bootdev (void); -+void -+grub_multiboot2_add_elfsyms (grub_size_t num, grub_size_t entsize, -+ unsigned shndx, void *data); -+ -+grub_uint32_t grub_multiboot2_get_mmap_count (void); -+grub_err_t grub_multiboot2_set_video_mode (void); -+ -+/* FIXME: support coreboot as well. */ -+#if defined (GRUB_MACHINE_PCBIOS) -+#define GRUB_MACHINE_HAS_VBE 1 -+#else -+#define GRUB_MACHINE_HAS_VBE 0 -+#endif -+ -+#if defined (GRUB_MACHINE_PCBIOS) || defined (GRUB_MACHINE_COREBOOT) || defined (GRUB_MACHINE_MULTIBOOT) || defined (GRUB_MACHINE_QEMU) -+#define GRUB_MACHINE_HAS_VGA_TEXT 1 -+#else -+#define GRUB_MACHINE_HAS_VGA_TEXT 0 -+#endif -+ -+#if defined (GRUB_MACHINE_EFI) || defined (GRUB_MACHINE_PCBIOS) || defined (GRUB_MACHINE_COREBOOT) || defined (GRUB_MACHINE_MULTIBOOT) -+#define GRUB_MACHINE_HAS_ACPI 1 -+#else -+#define GRUB_MACHINE_HAS_ACPI 0 -+#endif -+ -+#define GRUB_MULTIBOOT2_CONSOLE_EGA_TEXT 1 -+#define GRUB_MULTIBOOT2_CONSOLE_FRAMEBUFFER 2 -+ -+grub_err_t -+grub_multiboot2_set_console (int console_type, int accepted_consoles, -+ int width, int height, int depth, -+ int console_required); -+grub_err_t -+grub_multiboot2_load (grub_file_t file, const char *filename); -+ -+struct mbi_load_data -+{ -+ grub_file_t file; -+ const char *filename; -+ void *buffer; -+ unsigned int mbi_ver; -+ int relocatable; -+ grub_uint32_t min_addr; -+ grub_uint32_t max_addr; -+ grub_size_t align; -+ grub_uint32_t preference; -+ grub_uint32_t link_base_addr; -+ grub_uint32_t load_base_addr; -+ int avoid_efi_boot_services; -+}; -+typedef struct mbi_load_data mbi_load_data_t; -+ -+/* Load ELF32 or ELF64. */ -+grub_err_t -+grub_multiboot2_load_elf (mbi_load_data_t *mld); -+ -+extern grub_size_t grub_multiboot2_pure_size; -+extern grub_size_t grub_multiboot2_alloc_mbi; -+extern grub_uint32_t grub_multiboot2_payload_eip; -+ -+ -+#endif /* ! GRUB_MULTIBOOT_HEADER */ -diff --git a/include/grub/net.h b/include/grub/net.h -index 2192fa18628862e8e3a6046d854b12613e914ff9..1096b24322eb1ba36e8c996872fce2a255e6bccc 100644 ---- a/include/grub/net.h -+++ b/include/grub/net.h -@@ -291,6 +291,7 @@ struct grub_net_network_level_interface - grub_net_interface_flags_t flags; - struct grub_net_bootp_packet *dhcp_ack; - grub_size_t dhcp_acklen; -+ grub_uint16_t vlantag; - void *data; - }; - -@@ -561,4 +562,6 @@ extern char *grub_net_default_server; - #define GRUB_NET_INTERVAL 400 - #define GRUB_NET_INTERVAL_ADDITION 20 - -+#define VLANTAG_IDENTIFIER 0x8100 -+ - #endif /* ! GRUB_NET_HEADER */ -diff --git a/include/grub/net/arp.h b/include/grub/net/arp.h -index bb1703622e1529479618e7f71b0d5e88adb631d1..8d9d081134f52e2d33c23928baae7f6b4c08470f 100644 ---- a/include/grub/net/arp.h -+++ b/include/grub/net/arp.h -@@ -22,10 +22,11 @@ - #include - - extern grub_err_t grub_net_arp_receive (struct grub_net_buff *nb, -- struct grub_net_card *card); -+ struct grub_net_card *card, -+ grub_uint16_t *vlantag); - - grub_err_t - grub_net_arp_send_request (struct grub_net_network_level_interface *inf, -- const grub_net_network_level_address_t *proto_addr); -+ const grub_net_network_level_address_t *proto_addr); - - #endif -diff --git a/include/grub/net/ip.h b/include/grub/net/ip.h -index dcceaa56894605a39f87858964da7af11951ff11..ab9d68f98252b9772853a712ff1e8556162002ee 100644 ---- a/include/grub/net/ip.h -+++ b/include/grub/net/ip.h -@@ -48,7 +48,8 @@ grub_err_t - grub_net_recv_ip_packets (struct grub_net_buff *nb, - struct grub_net_card *card, - const grub_net_link_level_address_t *hwaddress, -- const grub_net_link_level_address_t *src_hwaddress); -+ const grub_net_link_level_address_t *src_hwaddress, -+ grub_uint16_t *vlantag); - - grub_err_t - grub_net_send_ip_packet (struct grub_net_network_level_interface *inf, -diff --git a/include/grub/offsets.h b/include/grub/offsets.h -index c88c86d4d2ebddddb23f25c50ad2c29b52e54ccb..330e4c70738abcacc3c1d53fb16ae1ec8896d9e3 100644 ---- a/include/grub/offsets.h -+++ b/include/grub/offsets.h -@@ -50,7 +50,7 @@ - /* The offset of GRUB_CORE_ENTRY_ADDR. */ - #define GRUB_KERNEL_I386_QEMU_CORE_ENTRY_ADDR 0x8 - --#define GRUB_KERNEL_I386_QEMU_LINK_ADDR 0x8200 -+#define GRUB_KERNEL_I386_QEMU_LINK_ADDR 0x9000 - - /* The offset of GRUB_TOTAL_MODULE_SIZE. */ - #define GRUB_KERNEL_SPARC64_IEEE1275_TOTAL_MODULE_SIZE 0x8 -@@ -91,7 +91,7 @@ - - #define GRUB_KERNEL_MIPS_ARC_TOTAL_MODULE_SIZE 0x08 - --#define GRUB_KERNEL_I386_COREBOOT_LINK_ADDR 0x8200 -+#define GRUB_KERNEL_I386_COREBOOT_LINK_ADDR 0x9000 - #define GRUB_KERNEL_I386_COREBOOT_MODULES_ADDR 0x100000 - - #define GRUB_KERNEL_I386_IEEE1275_LINK_ADDR 0x10000 -@@ -122,6 +122,12 @@ - #define GRUB_KERNEL_ARM_UBOOT_MOD_ALIGN 0x8 - #define GRUB_KERNEL_ARM_UBOOT_TOTAL_MODULE_SIZE 0x4 - -+#define GRUB_KERNEL_ARM_COREBOOT_MOD_ALIGN 0x8 -+#define GRUB_KERNEL_ARM_COREBOOT_TOTAL_MODULE_SIZE 0x4 -+ -+#define GRUB_KERNEL_ARM_STACK_SIZE 0x40000 -+#define GRUB_KERNEL_ARM_COREBOOT_MOD_GAP (GRUB_KERNEL_ARM_STACK_SIZE + 1024) -+ - /* Minimal gap between _end and the start of the modules. It's a hack - for PowerMac to prevent "CLAIM failed" error. The real fix is to - rewrite grub-mkimage to generate valid ELF files. */ -diff --git a/include/grub/pci.h b/include/grub/pci.h -index 70d9a05131b240bbe3c7fe12df899c8e3de237ce..262c89b748bbfccc98ffa27912ce7e2a5005f545 100644 ---- a/include/grub/pci.h -+++ b/include/grub/pci.h -@@ -142,27 +142,7 @@ grub_pci_address_t EXPORT_FUNC(grub_pci_make_address) (grub_pci_device_t dev, - void EXPORT_FUNC(grub_pci_iterate) (grub_pci_iteratefunc_t hook, - void *hook_data); - --struct grub_pci_dma_chunk; -- --struct grub_pci_dma_chunk *EXPORT_FUNC(grub_memalign_dma32) (grub_size_t align, -- grub_size_t size); --void EXPORT_FUNC(grub_dma_free) (struct grub_pci_dma_chunk *ch); --volatile void *EXPORT_FUNC(grub_dma_get_virt) (struct grub_pci_dma_chunk *ch); --grub_uint32_t EXPORT_FUNC(grub_dma_get_phys) (struct grub_pci_dma_chunk *ch); -- --static inline void * --grub_dma_phys2virt (grub_uint32_t phys, struct grub_pci_dma_chunk *chunk) --{ -- return ((grub_uint8_t *) grub_dma_get_virt (chunk) -- + (phys - grub_dma_get_phys (chunk))); --} -- --static inline grub_uint32_t --grub_dma_virt2phys (volatile void *virt, struct grub_pci_dma_chunk *chunk) --{ -- return (((grub_uint8_t *) virt - (grub_uint8_t *) grub_dma_get_virt (chunk)) -- + grub_dma_get_phys (chunk)); --} -+#include - - grub_uint8_t - EXPORT_FUNC (grub_pci_find_capability) (grub_pci_device_t dev, grub_uint8_t cap); -diff --git a/include/grub/ps2.h b/include/grub/ps2.h -new file mode 100644 -index 0000000000000000000000000000000000000000..4f2e527e49767c297646f1ea3d0e09bdc2855892 ---- /dev/null -+++ b/include/grub/ps2.h -@@ -0,0 +1,43 @@ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * Copyright (C) 2007,2008,2009 Free Software Foundation, Inc. -+ * -+ * GRUB is free software: you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation, either version 3 of the License, or -+ * (at your option) any later version. -+ * -+ * GRUB is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with GRUB. If not, see . -+ */ -+ -+#ifndef GRUB_PS2_HEADER -+#define GRUB_PS2_HEADER 1 -+ -+#include -+ -+#define GRUB_AT_ACK 0xfa -+#define GRUB_AT_NACK 0xfe -+#define GRUB_AT_TRIES 5 -+ -+/* Make sure it's zeroed-out and set current_set at init. */ -+struct grub_ps2_state -+{ -+ int e0_received; -+ int f0_received; -+ grub_uint8_t led_status; -+ short at_keyboard_status; -+ grub_uint8_t current_set; -+}; -+ -+/* If there is a key pending, return it; otherwise return GRUB_TERM_NO_KEY. */ -+int -+grub_ps2_process_incoming_byte (struct grub_ps2_state *ps2_state, -+ grub_uint8_t data); -+ -+#endif -diff --git a/include/grub/sparc64/ieee1275/ieee1275.h b/include/grub/sparc64/ieee1275/ieee1275.h -index 32c77f80f1a136c0127aecb6d5643ebd64cb5e88..4b18468d8d654bb3fe62050e7a4f439e1544889c 100644 ---- a/include/grub/sparc64/ieee1275/ieee1275.h -+++ b/include/grub/sparc64/ieee1275/ieee1275.h -@@ -42,6 +42,8 @@ extern int EXPORT_FUNC(grub_ieee1275_claim_vaddr) (grub_addr_t vaddr, - extern int EXPORT_FUNC(grub_ieee1275_alloc_physmem) (grub_addr_t *paddr, - grub_size_t size, - grub_uint32_t align); -+extern grub_uint64_t EXPORT_FUNC(grub_ieee1275_num_blocks) (grub_uint32_t ihandle); -+extern grub_uint64_t EXPORT_FUNC(grub_ieee1275_num_blocks64) (grub_uint32_t ihandle); - - extern grub_addr_t EXPORT_VAR (grub_ieee1275_original_stack); - -diff --git a/include/grub/term.h b/include/grub/term.h -index 5ffb38f69aaa8911a66bdc6f417a72666b19e514..8117e2a24dac3f270d05408f1897fae9f0fa1593 100644 ---- a/include/grub/term.h -+++ b/include/grub/term.h -@@ -55,7 +55,8 @@ - #define GRUB_TERM_KEY_INSERT (GRUB_TERM_EXTENDED | 0x52) - #define GRUB_TERM_KEY_CENTER (GRUB_TERM_EXTENDED | 0x4c) - --#define GRUB_TERM_ESC '\e' -+/* Hex value is used for ESC, since '\e' is nonstandard */ -+#define GRUB_TERM_ESC 0x1b - #define GRUB_TERM_TAB '\t' - #define GRUB_TERM_BACKSPACE '\b' - -diff --git a/include/grub/usb.h b/include/grub/usb.h -index 11d96481ff6b58cc43f468bcb2020475663fa098..512ae1dd0e64931c852847c9d52efdbd6b2caccb 100644 ---- a/include/grub/usb.h -+++ b/include/grub/usb.h -@@ -321,5 +321,9 @@ grub_usb_err_t - grub_usb_check_transfer (grub_usb_transfer_t trans, grub_size_t *actual); - void - grub_usb_cancel_transfer (grub_usb_transfer_t trans); -+void -+grub_ehci_init_device (volatile void *regs); -+void -+grub_ehci_pci_scan (void); - - #endif /* GRUB_USB_H */ -diff --git a/include/grub/util/install.h b/include/grub/util/install.h -index 5ca4811cd130f6810f07e6fbce89af1de36827c7..0dba8b67f93d44f875f2d1065ed5bf745f7813a5 100644 ---- a/include/grub/util/install.h -+++ b/include/grub/util/install.h -@@ -29,6 +29,8 @@ - #define GRUB_INSTALL_OPTIONS \ - { "modules", GRUB_INSTALL_OPTIONS_MODULES, N_("MODULES"), \ - 0, N_("pre-load specified modules MODULES"), 1 }, \ -+ { "dtb", GRUB_INSTALL_OPTIONS_DTB, N_("FILE"), \ -+ 0, N_("embed a specific DTB"), 1 }, \ - { "install-modules", GRUB_INSTALL_OPTIONS_INSTALL_MODULES, \ - N_("MODULES"), 0, \ - N_("install only MODULES and their dependencies [default=all]"), 1 }, \ -@@ -99,6 +101,7 @@ enum grub_install_plat - GRUB_INSTALL_PLATFORM_I386_XEN, - GRUB_INSTALL_PLATFORM_X86_64_XEN, - GRUB_INSTALL_PLATFORM_ARM64_EFI, -+ GRUB_INSTALL_PLATFORM_ARM_COREBOOT, - GRUB_INSTALL_PLATFORM_MAX - }; - -@@ -115,7 +118,8 @@ enum grub_install_options { - GRUB_INSTALL_OPTIONS_LOCALE_DIRECTORY, - GRUB_INSTALL_OPTIONS_THEMES_DIRECTORY, - GRUB_INSTALL_OPTIONS_GRUB_MKIMAGE, -- GRUB_INSTALL_OPTIONS_INSTALL_CORE_COMPRESS -+ GRUB_INSTALL_OPTIONS_INSTALL_CORE_COMPRESS, -+ GRUB_INSTALL_OPTIONS_DTB - }; - - extern char *grub_install_source_directory; -@@ -176,7 +180,7 @@ grub_install_generate_image (const char *dir, const char *prefix, - char *config_path, - const struct grub_install_image_target_desc *image_target, - int note, -- grub_compression_t comp); -+ grub_compression_t comp, const char *dtb_file); - - const struct grub_install_image_target_desc * - grub_install_get_image_target (const char *arg); -@@ -206,7 +210,7 @@ grub_install_create_envblk_file (const char *name); - const char * - grub_install_get_default_x86_platform (void); - --void -+int - grub_install_register_efi (grub_device_t efidir_grub_dev, - const char *efifile_path, - const char *efi_distributor); -diff --git a/include/grub/util/mkimage.h b/include/grub/util/mkimage.h -index 1a18708a89c6e5503dd29b0b76f5098cef3ac893..b3a5ca132bc4d336f8d85158726bcce77fd7cd37 100644 ---- a/include/grub/util/mkimage.h -+++ b/include/grub/util/mkimage.h -@@ -51,13 +51,13 @@ grub_mkimage_load_image64 (const char *kernel_path, - void - grub_mkimage_generate_elf32 (const struct grub_install_image_target_desc *image_target, - int note, char **core_img, size_t *core_size, -- Elf32_Addr target_addr, grub_size_t align, -- size_t kernel_size, size_t bss_size); -+ Elf32_Addr target_addr, -+ struct grub_mkimage_layout *layout); - void - grub_mkimage_generate_elf64 (const struct grub_install_image_target_desc *image_target, - int note, char **core_img, size_t *core_size, -- Elf64_Addr target_addr, grub_size_t align, -- size_t kernel_size, size_t bss_size); -+ Elf64_Addr target_addr, -+ struct grub_mkimage_layout *layout); - - struct grub_install_image_target_desc - { -diff --git a/include/multiboot2.h b/include/multiboot2.h -index 5a3db5a7cae38c26be516dc76a4fa6a9ad4ed354..5693923c014f2fa9e855dcc89c7328a19e0e6408 100644 ---- a/include/multiboot2.h -+++ b/include/multiboot2.h -@@ -75,8 +75,8 @@ - #define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS_EFI64 9 - #define MULTIBOOT_HEADER_TAG_RELOCATABLE 10 - --#define MULTIBOOT_ARCHITECTURE_I386 0 --#define MULTIBOOT_ARCHITECTURE_MIPS32 4 -+#define MULTIBOOT2_ARCHITECTURE_I386 0 -+#define MULTIBOOT2_ARCHITECTURE_MIPS32 4 - #define MULTIBOOT_HEADER_TAG_OPTIONAL 1 - - #define MULTIBOOT_LOAD_PREFERENCE_NONE 0 -diff --git a/grub-core/boot/i386/pc/diskboot.S b/grub-core/boot/i386/pc/diskboot.S -index 1ee4cf5b2e0fd03ba177e953fafdaf5e0ca457a6..c1addc0df29bc78009238690a9514ea301bf3a29 100644 ---- a/grub-core/boot/i386/pc/diskboot.S -+++ b/grub-core/boot/i386/pc/diskboot.S -@@ -37,8 +37,8 @@ - start: - _start: - /* -- * _start is loaded at 0x2000 and is jumped to with -- * CS:IP 0:0x2000 in kernel. -+ * _start is loaded at 0x8000 and is jumped to with -+ * CS:IP 0:0x8000 in kernel. - */ - - /* -diff --git a/grub-core/boot/sparc64/ieee1275/boot.S b/grub-core/boot/sparc64/ieee1275/boot.S -index 586efb4014e8648e560fb43eee8eea8b09da669b..9ea9b4e06627bbd8b7da422ffba3357b4fba0a6a 100644 ---- a/grub-core/boot/sparc64/ieee1275/boot.S -+++ b/grub-core/boot/sparc64/ieee1275/boot.S -@@ -69,6 +69,10 @@ prom_seek_name: .asciz "seek" - prom_read_name: .asciz "read" - prom_exit_name: .asciz "exit" - grub_name: .asciz "GRUB " -+#ifdef CDBOOT -+prom_close_name: .asciz "close" -+#endif -+ - #define GRUB_NAME_LEN 5 - - .align 4 -@@ -213,6 +217,12 @@ bootpath_known: - call prom_call_3_1_o1 - #ifdef CDBOOT - LDUW_ABS(kernel_size, 0x00, %o3) -+ -+ GET_ABS(prom_close_name, %o0) -+ mov 1, %g1 -+ mov 0, %o5 -+ call prom_call -+ mov BOOTDEV_REG, %o1 - #else - mov 512, %o3 - #endif -diff --git a/grub-core/kern/arm/cache_armv7.S b/grub-core/kern/arm/cache_armv7.S -index 1ef2754af8a7612c35c26011fab442dbba074dfd..5ae76a3d819c002676f54db3311f517791e0c4e8 100644 ---- a/grub-core/kern/arm/cache_armv7.S -+++ b/grub-core/kern/arm/cache_armv7.S -@@ -33,6 +33,18 @@ - # define ISB isb - #define ARMV7 1 - -+FUNCTION(grub_arm_clean_dcache_range_poc_armv7) -+ DSB -+ @ Clean data cache for range to point-of-coherence -+1: cmp r0, r1 -+ bge 2f -+ mcr p15, 0, r0, c7, c14, 1 @ DCCMVAC -+ add r0, r0, r2 @ Next line -+ b 1b -+2: DSB -+ bx lr -+ -+ - @ r0 - CLIDR - @ r1 - LoC - @ r2 - current level -diff --git a/include/grub/arm/efi/loader.h b/grub-core/kern/arm/coreboot/coreboot.S -similarity index 62% -rename from include/grub/arm/efi/loader.h -rename to grub-core/kern/arm/coreboot/coreboot.S -index 4bab18e83ee833d6932fea917d839fe7dcc212d1..a1104526c154bd5a9dfd9e3680d8bb787c1088ef 100644 ---- a/include/grub/arm/efi/loader.h -+++ b/grub-core/kern/arm/coreboot/coreboot.S -@@ -1,6 +1,6 @@ - /* - * GRUB -- GRand Unified Bootloader -- * Copyright (C) 2013 Free Software Foundation, Inc. -+ * Copyright (C) 2016 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,11 +16,29 @@ - * along with GRUB. If not, see . - */ - --#ifndef GRUB_LOADER_MACHINE_HEADER --#define GRUB_LOADER_MACHINE_HEADER 1 -+#include - --grub_err_t EXPORT_FUNC (grub_efi_prepare_platform) (void); --void * EXPORT_FUNC (grub_efi_allocate_loader_memory) (grub_uint32_t min_offset, -- grub_uint32_t size); -+ .file "coreboot.S" -+ .text -+ .syntax unified -+#if !defined (__thumb2__) -+ .arch armv7a -+ .arm -+#else -+ .arch armv7 -+ .thumb -+#endif -+ -+FUNCTION(grub_arm_pfr1) -+ mrc p15, 0, r0, c0, c1, 1 -+ bx lr -+ -+FUNCTION(grub_armv7_get_timer_value) -+ isb -+ mrrc p15, 1, r0, r1, c14 -+ bx lr -+ -+FUNCTION(grub_armv7_get_timer_frequency) -+ mrc p15, 0, r0, c14, c0, 0 -+ bx lr - --#endif /* ! GRUB_LOADER_MACHINE_HEADER */ -diff --git a/grub-core/kern/arm/uboot/startup.S b/grub-core/kern/arm/startup.S -similarity index 77% -rename from grub-core/kern/arm/uboot/startup.S -rename to grub-core/kern/arm/startup.S -index 5efaae16e838b48dd4d9a5debfc2937a558c65ba..3946fe8e183023f80e3a90ae4ee7b942f02f204d 100644 ---- a/grub-core/kern/arm/uboot/startup.S -+++ b/grub-core/kern/arm/startup.S -@@ -24,6 +24,7 @@ - * GRUB is called from U-Boot as a Linux Kernel type image, which - * means among other things that it always enters in ARM state. - * -+ * coreboot starts in ARM mode as well. - * - * Overview of GRUB image layout: - * -@@ -86,7 +87,7 @@ FUNCTION(codestart) - @ Stack pointer used as start address for signature probing - mov r12, sp - adr sp, entry_state -- push {r1-r12,lr} @ store U-Boot context (sp in r12) -+ push {r0-r12,lr} @ store U-Boot context (sp in r12) - - adr r1, _start - ldr r0, bss_start_ptr @ src -@@ -127,6 +128,8 @@ reloc_done: - - str r1, EXT_C(grub_modbase) - -+ /* Coreboot already places modules at right place. */ -+#ifndef GRUB_MACHINE_COREBOOT - add r1, r1, r2 - add r0, r0, r2 - sub r1, r1, #4 -@@ -136,6 +139,7 @@ reloc_done: - str r3, [r1], #-4 @ *dst-- = r3 - subs r2, #4 @ remaining -= 4 - bne 1b @ while remaining != 0 -+#endif - - @ Since we _are_ the C run-time, we need to manually zero the BSS - @ region before continuing -@@ -153,69 +157,21 @@ reloc_done: - - b EXT_C(grub_main) - -- /* -- * uboot_syscall(): -- * This function is effectively a veneer, so it cannot -- * modify the stack or corrupt any registers other than -- * r12 (ip). Furthermore it needs to restore r8 for -- * U-Boot (Global Data Pointer) and preserve it for Grub. -- */ --FUNCTION(grub_uboot_syscall) -- str r8, transition_space -- str lr, transition_space + 4 -- str r9, transition_space + 8 -- -- ldr r8, gd_backup -- ldr r9, gd_backup + 4 -- -- bl do_syscall -- -- ldr r8, transition_space -- ldr lr, transition_space + 4 -- ldr r9, transition_space + 8 -- -- bx lr --do_syscall: -- -- ldr ip, grub_uboot_syscall_ptr -- bx ip -- --FUNCTION(grub_uboot_return) -- adr sp, entry_state_end -- pop {r4-r12, lr} -- mov sp, r12 -- bx lr -- -- - .align 3 --@ U-boot context stack space --entry_state_end: --VARIABLE(grub_uboot_machine_type) -+@ U-boot/coreboot context stack space -+VARIABLE(grub_arm_saved_registers) -+ .long 0 @ r0 - .long 0 @ r1 --VARIABLE(grub_uboot_boot_data) - .long 0 @ r2 - .long 0 @ r3 - .long 0 @ r4 - .long 0 @ r5 - .long 0 @ r6 - .long 0 @ r7 --gd_backup: -- .long 0 @ r8 - U-Boot global data pointer up to 2013-09-21 -- .long 0 @ r9 - U-Boot global data pointer 2013-09-21 onwards -- .long 0 @ r10 -- .long 0 @ r11 --VARIABLE(grub_uboot_search_hint)@ U-Boot stack pointer - -- .long 0 @ also API signature address hint. -- .long 0 @ lr --entry_state: @ backup for U-Boot context -- --@ GRUB context stack space --transition_space: - .long 0 @ r8 -- .long 0 @ lr - .long 0 @ r9 -- --VARIABLE(grub_uboot_syscall_ptr) -- .long 0 @ -- -- END -+ .long 0 @ r10 -+ .long 0 @ r11 -+ .long 0 @ sp -+ .long 0 @ lr -+entry_state: -diff --git a/grub-core/kern/arm/uboot/uboot.S b/grub-core/kern/arm/uboot/uboot.S -new file mode 100644 -index 0000000000000000000000000000000000000000..d128775f19ea1f862b46bc82b05b453be577d741 ---- /dev/null -+++ b/grub-core/kern/arm/uboot/uboot.S -@@ -0,0 +1,73 @@ -+/* -+ * GRUB -- GRand Unified Bootloader -+ * Copyright (C) 2013 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 -+ -+ /* -+ * uboot_syscall(): -+ * This function is effectively a veneer, so it cannot -+ * modify the stack or corrupt any registers other than -+ * r12 (ip). Furthermore it needs to restore r8 for -+ * U-Boot (Global Data Pointer) and preserve it for Grub. -+ */ -+FUNCTION(grub_uboot_syscall) -+ str r8, transition_space -+ str lr, transition_space + 4 -+ str r9, transition_space + 8 -+ -+ ldr ip, saved_registers_ptr -+ ldr r8, [ip, #4 * 8] -+ ldr r9, [ip, #4 * 9] -+ -+ bl do_syscall -+ -+ ldr r8, transition_space -+ ldr lr, transition_space + 4 -+ ldr r9, transition_space + 8 -+ -+ bx lr -+do_syscall: -+ -+ ldr ip, grub_uboot_syscall_ptr -+ bx ip -+ -+FUNCTION(grub_uboot_return) -+ ldr ip, saved_registers_ptr -+ ldr sp, [ip, #4 * 4] -+ pop {r4-r12, lr} -+ mov sp, r12 -+ bx lr -+ -+ -+ .align 3 -+ -+@ GRUB context stack space -+transition_space: -+ .long 0 @ r8 -+ .long 0 @ lr -+ .long 0 @ r9 -+ -+saved_registers_ptr: -+ .long EXT_C(grub_arm_saved_registers) -+ -+VARIABLE(grub_uboot_syscall_ptr) -+ .long 0 @ -+ -+ END -diff --git a/conf/Makefile.common b/conf/Makefile.common -index 11296b550a7cd40ded498613620f556d78c67d84..311da61c6c59fed3de8cba06c2c581b217d8273f 100644 ---- a/conf/Makefile.common -+++ b/conf/Makefile.common -@@ -86,9 +86,11 @@ CPPFLAGS_TERMINAL_LIST += '-Dgrub_term_register_output(...)=OUTPUT_TERMINAL_LIST - CPPFLAGS_COMMAND_LIST = '-Dgrub_register_command(...)=COMMAND_LIST_MARKER(__VA_ARGS__)' - CPPFLAGS_COMMAND_LIST += '-Dgrub_register_extcmd(...)=EXTCOMMAND_LIST_MARKER(__VA_ARGS__)' - CPPFLAGS_COMMAND_LIST += '-Dgrub_register_command_p1(...)=P1COMMAND_LIST_MARKER(__VA_ARGS__)' -+CPPFLAGS_FDT_LIST := '-Dgrub_fdtbus_register(...)=FDT_DRIVER_LIST_MARKER(__VA_ARGS__)' - CPPFLAGS_MARKER = $(CPPFLAGS_FS_LIST) $(CPPFLAGS_VIDEO_LIST) \ - $(CPPFLAGS_PARTTOOL_LIST) $(CPPFLAGS_PARTMAP_LIST) \ -- $(CPPFLAGS_TERMINAL_LIST) $(CPPFLAGS_COMMAND_LIST) -+ $(CPPFLAGS_TERMINAL_LIST) $(CPPFLAGS_COMMAND_LIST) \ -+ $(CPPFLAGS_FDT_LIST) - - # Define these variables to calm down automake - -diff --git a/docs/grub.texi b/docs/grub.texi -index e935af33ea5e24d832e588d1345e3721b826d5a0..2adfa97bee8f8b2dcd53ead368dfd6f115b8cb82 100644 ---- a/docs/grub.texi -+++ b/docs/grub.texi -@@ -360,8 +360,9 @@ blocklist notation. The currently supported filesystem types are @dfn{Amiga - Fast FileSystem (AFFS)}, @dfn{AtheOS fs}, @dfn{BeFS}, - @dfn{BtrFS} (including raid0, raid1, raid10, gzip and lzo), - @dfn{cpio} (little- and big-endian bin, odc and newc variants), --@dfn{Linux ext2/ext3/ext4}, @dfn{DOS FAT12/FAT16/FAT32}, @dfn{exFAT}, @dfn{HFS}, --@dfn{HFS+}, @dfn{ISO9660} (including Joliet, Rock-ridge and multi-chunk files), -+@dfn{Linux ext2/ext3/ext4}, @dfn{DOS FAT12/FAT16/FAT32}, -+@dfn{exFAT}, @dfn{F2FS}, @dfn{HFS}, @dfn{HFS+}, -+@dfn{ISO9660} (including Joliet, Rock-ridge and multi-chunk files), - @dfn{JFS}, @dfn{Minix fs} (versions 1, 2 and 3), @dfn{nilfs2}, - @dfn{NTFS} (including compression), @dfn{ReiserFS}, @dfn{ROMFS}, - @dfn{Amiga Smart FileSystem (SFS)}, @dfn{Squash4}, @dfn{tar}, @dfn{UDF}, -@@ -1213,10 +1214,11 @@ GRUB is configured using @file{grub.cfg}, usually located under - need to write the whole thing by hand. - - @menu --* Simple configuration:: Recommended for most users --* Shell-like scripting:: For power users and developers --* Multi-boot manual config:: For non-standard multi-OS scenarios --* Embedded configuration:: Embedding a configuration file into GRUB -+* Simple configuration:: Recommended for most users -+* Root Identifcation Heuristics:: Summary on how the root file system is identified. -+* Shell-like scripting:: For power users and developers -+* Multi-boot manual config:: For non-standard multi-OS scenarios -+* Embedded configuration:: Embedding a configuration file into GRUB - @end menu - - -@@ -1398,6 +1400,25 @@ for all respectively normal entries. - The values of these options replace the values of @samp{GRUB_CMDLINE_LINUX} - and @samp{GRUB_CMDLINE_LINUX_DEFAULT} for Linux and Xen menu entries. - -+@item GRUB_EARLY_INITRD_LINUX_CUSTOM -+@itemx GRUB_EARLY_INITRD_LINUX_STOCK -+List of space-separated early initrd images to be loaded from @samp{/boot}. -+This is for loading things like CPU microcode, firmware, ACPI tables, crypto -+keys, and so on. These early images will be loaded in the order declared, -+and all will be loaded before the actual functional initrd image. -+ -+@samp{GRUB_EARLY_INITRD_LINUX_STOCK} is for your distribution to declare -+images that are provided by the distribution. It should not be modified -+without understanding the consequences. They will be loaded first. -+ -+@samp{GRUB_EARLY_INITRD_LINUX_CUSTOM} is for your custom created images. -+ -+The default stock images are as follows, though they may be overridden by -+your distribution: -+@example -+intel-uc.img intel-ucode.img amd-uc.img amd-ucode.img early_ucode.cpio microcode.cpio -+@end example -+ - @item GRUB_DISABLE_LINUX_UUID - Normally, @command{grub-mkconfig} will generate menu entries that use - universally-unique identifiers (UUIDs) to identify the root filesystem to -@@ -1405,6 +1426,17 @@ the Linux kernel, using a @samp{root=UUID=...} kernel parameter. This is - usually more reliable, but in some cases it may not be appropriate. To - disable the use of UUIDs, set this option to @samp{true}. - -+@item GRUB_DISABLE_LINUX_PARTUUID -+If @command{grub-mkconfig} cannot identify the root filesystem via its -+universally-unique indentifier (UUID), @command{grub-mkconfig} can use the UUID -+of the partition containing the filesystem to identify the root filesystem to -+the Linux kernel via a @samp{root=PARTUUID=...} kernel parameter. This is not -+as reliable as using the filesystem UUID, but is more reliable than using the -+Linux device names. When @samp{GRUB_DISABLE_LINUX_PARTUUID} is set to -+@samp{false}, the Linux kernel version must be 2.6.37 (3.10 for systems using -+the MSDOS partition scheme) or newer. This option defaults to @samp{true}. To -+enable the use of partition UUIDs, set this option to @samp{false}. -+ - @item GRUB_DISABLE_RECOVERY - If this option is set to @samp{true}, disable the generation of recovery - mode menu entries. -@@ -1536,6 +1568,53 @@ edit the scripts in @file{/etc/grub.d} directly. - menu entries; simply type the menu entries you want to add at the end of - that file, making sure to leave at least the first two lines intact. - -+@node Root Identifcation Heuristics -+@section Root Identifcation Heuristics -+If the target operating system uses the Linux kernel, @command{grub-mkconfig} -+attempts to identify the root file system via a heuristic algoirthm. This -+algorithm selects the identification method of the root file system by -+considering three factors. The first is if an initrd for the target operating -+system is also present. The second is @samp{GRUB_DISABLE_LINUX_UUID} and if set -+to @samp{true}, prevents @command{grub-mkconfig} from identifying the root file -+system by its UUID. The third is @samp{GRUB_DISABLE_LINUX_PARTUUID} and if set -+to @samp{true}, prevents @command{grub-mkconfig} from identifying the root file -+system via the UUID of its enclosing partition. If the variables are assigned -+any other value, that value is considered equivalent to @samp{false}. The -+variables are also considered to be set to @samp{false} if they are not set. -+ -+When booting, the Linux kernel will delegate the task of mounting the root -+filesystem to the initrd. Most initrd images determine the root file system by -+checking the Linux kernel's command-line for the @samp{root} key and use its -+value as the identification method of the root file system. To improve the -+reliability of booting, most initrd images also allow the root file system to be -+identified by its UUID. Because of this behavior, the @command{grub-mkconfig} -+command will set @samp{root} to @samp{root=UUID=...} to provide the initrd with -+the filesystem UUID of the root file system. -+ -+If no initrd is detected or @samp{GRUB_DISABLE_LINUX_UUID} is set to @samp{true} -+then @command{grub-command} will identify the root filesystem by setting the -+kernel command-line variable @samp{root} to @samp{root=PARTUUID=...} unless -+@samp{GRUB_DISABLE_LINUX_PARTUUID} is also set to @samp{true}. If -+@samp{GRUB_DISABLE_LINUX_PARTUUID} is also set to @samp{true}, -+@command{grub-command} will identify by its Linux device name. -+ -+The following table summarizes the behavior of the @command{grub-mkconfig} -+command. -+ -+@multitable {detected} {GRUB_DISABLE_LINUX_PARTUUID} {GRUB_DISABLE_LINUX_UUID} {Linux Root} -+@headitem Initrd detected @tab GRUB_DISABLE_LINUX_PARTUUID Set To @tab GRUB_DISABLE_LINUX_UUID Set To @tab Linux Root ID Method -+@item false @tab false @tab false @tab part UUID -+@item false @tab false @tab true @tab part UUID -+@item false @tab true @tab false @tab dev name -+@item false @tab true @tab true @tab dev name -+@item true @tab false @tab false @tab fs UUID -+@item true @tab false @tab true @tab part UUID -+@item true @tab true @tab false @tab fs UUID -+@item true @tab true @tab true @tab dev name -+@end multitable -+ -+Remember, @samp{GRUB_DISABLE_LINUX_PARTUUID} and @samp{GRUB_DISABLE_LINUX_UUID} -+are also considered to be set to @samp{false} when they are unset. - - @node Shell-like scripting - @section Writing full configuration files directly -@@ -3873,11 +3952,9 @@ you forget a command, you can run the command @command{help} - @comment * vbeinfo:: List available video modes - * verify_detached:: Verify detached digital signature - * videoinfo:: List available video modes --@comment * xen_*:: Xen boot commands --* xen_hypervisor:: Load xen hypervisor binary --* xen_linux:: Load dom0 kernel for xen hypervisor --* xen_initrd:: Load dom0 initrd for dom0 kernel --* xen_xsm:: Load xen security module for xen hypervisor -+@comment * xen_*:: Xen boot commands for AArch64 -+* xen_hypervisor:: Load xen hypervisor binary (only on AArch64) -+* xen_module:: Load xen modules for xen hypervisor (only on AArch64) - @end menu - - -@@ -4645,7 +4722,7 @@ range 0-0xFF (prefix with @samp{0x} to enter it in hexadecimal). - When enabled, this hides the selected partition by setting the @dfn{hidden} - bit in its partition type code; when disabled, unhides the selected - partition by clearing this bit. This is useful only when booting DOS or --Wwindows and multiple primary FAT partitions exist in one disk. See also -+Windows and multiple primary FAT partitions exist in one disk. See also - @ref{DOS/Windows}. - @end table - @end deffn -@@ -5153,32 +5230,22 @@ List available video modes. If resolution is given, show only matching modes. - Load a Xen hypervisor binary from @var{file}. The rest of the line is passed - verbatim as the @dfn{kernel command-line}. Any other binaries must be - reloaded after using this command. -+This command is only available on AArch64 systems. - @end deffn - --@node xen_linux --@subsection xen_linux -+@node xen_module -+@subsection xen_module - --@deffn Command xen_linux file [arguments] --Load a dom0 kernel image for xen hypervisor at the booting process of xen. -+@deffn Command xen_module [--nounzip] file [arguments] -+Load a module for xen hypervisor at the booting process of xen. - The rest of the line is passed verbatim as the module command line. -+Modules should be loaded in the following order: -+ - dom0 kernel image -+ - dom0 ramdisk if present -+ - XSM policy if present -+This command is only available on AArch64 systems. - @end deffn - --@node xen_initrd --@subsection xen_initrd -- --@deffn Command xen_initrd file --Load a initrd image for dom0 kernel at the booting process of xen. --@end deffn -- --@node xen_xsm --@subsection xen_xsm -- --@deffn Command xen_xsm file --Load a xen security module for xen hypervisor at the booting process of xen. --See @uref{http://wiki.xen.org/wiki/XSM} for more detail. --@end deffn -- -- - @node Networking commands - @section The list of networking commands - -@@ -5368,7 +5435,7 @@ NTFS, JFS, UDF, HFS+, exFAT, long filenames in FAT, Joliet part of - ISO9660 are treated as UTF-16 as per specification. AFS and BFS are read - as UTF-8, again according to specification. BtrFS, cpio, tar, squash4, minix, - minix2, minix3, ROMFS, ReiserFS, XFS, ext2, ext3, ext4, FAT (short names), --RockRidge part of ISO9660, nilfs2, UFS1, UFS2 and ZFS are assumed -+F2FS, RockRidge part of ISO9660, nilfs2, UFS1, UFS2 and ZFS are assumed - to be UTF-8. This might be false on systems configured with legacy charset - but as long as the charset used is superset of ASCII you should be able to - access ASCII-named files. And it's recommended to configure your system to use -diff --git a/gentpl.py b/gentpl.py -index f08bcc404f6a8bd8c3b13a6d5bb041ee32422776..da67965a41a40cde7c987b719fea39cd02ba10e5 100644 ---- a/gentpl.py -+++ b/gentpl.py -@@ -31,7 +31,8 @@ GRUB_PLATFORMS = [ "emu", "i386_pc", "i386_efi", "i386_qemu", "i386_coreboot", - "i386_xen", "x86_64_xen", - "mips_loongson", "sparc64_ieee1275", - "powerpc_ieee1275", "mips_arc", "ia64_efi", -- "mips_qemu_mips", "arm_uboot", "arm_efi", "arm64_efi" ] -+ "mips_qemu_mips", "arm_uboot", "arm_efi", "arm64_efi", -+ "arm_coreboot"] - - GROUPS = {} - -@@ -44,7 +45,7 @@ GROUPS["x86"] = GROUPS["i386"] + GROUPS["x86_64"] - GROUPS["mips"] = [ "mips_loongson", "mips_qemu_mips", "mips_arc" ] - GROUPS["sparc64"] = [ "sparc64_ieee1275" ] - GROUPS["powerpc"] = [ "powerpc_ieee1275" ] --GROUPS["arm"] = [ "arm_uboot", "arm_efi" ] -+GROUPS["arm"] = [ "arm_uboot", "arm_efi", "arm_coreboot" ] - GROUPS["arm64"] = [ "arm64_efi" ] - - # Groups based on firmware -@@ -52,6 +53,7 @@ GROUPS["efi"] = [ "i386_efi", "x86_64_efi", "ia64_efi", "arm_efi", "arm64_efi" - GROUPS["ieee1275"] = [ "i386_ieee1275", "sparc64_ieee1275", "powerpc_ieee1275" ] - GROUPS["uboot"] = [ "arm_uboot" ] - GROUPS["xen"] = [ "i386_xen", "x86_64_xen" ] -+GROUPS["coreboot"] = [ "i386_coreboot", "arm_coreboot" ] - - # emu is a special case so many core functionality isn't needed on this platform - GROUPS["noemu"] = GRUB_PLATFORMS[:]; GROUPS["noemu"].remove("emu") -@@ -61,10 +63,10 @@ GROUPS["cmos"] = GROUPS["x86"][:] + ["mips_loongson", "mips_qemu_mips", - "sparc64_ieee1275", "powerpc_ieee1275"] - GROUPS["cmos"].remove("i386_efi"); GROUPS["cmos"].remove("x86_64_efi"); - GROUPS["pci"] = GROUPS["x86"] + ["mips_loongson"] --GROUPS["usb"] = GROUPS["pci"] -+GROUPS["usb"] = GROUPS["pci"] + ["arm_coreboot"] - - # If gfxterm is main output console integrate it into kernel --GROUPS["videoinkernel"] = ["mips_loongson", "i386_coreboot" ] -+GROUPS["videoinkernel"] = ["mips_loongson", "i386_coreboot", "arm_coreboot" ] - GROUPS["videomodules"] = GRUB_PLATFORMS[:]; - for i in GROUPS["videoinkernel"]: GROUPS["videomodules"].remove(i) - -diff --git a/grub-core/Makefile.am b/grub-core/Makefile.am -index 04e9395fd949460672c1113c3d49c90a5d4471ec..f4ff62b769ae99f1d9b2fadf51378966c93d835c 100644 ---- a/grub-core/Makefile.am -+++ b/grub-core/Makefile.am -@@ -112,7 +112,7 @@ endif - - if COND_i386_coreboot - KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h --KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/coreboot/lbio.h -+KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/coreboot/lbio.h - KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/video.h - KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/video_fb.h - KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/gfxterm.h -@@ -239,8 +239,21 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h - KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/arm/system.h - endif - -+if COND_arm_coreboot -+KERNEL_HEADER_FILES += $(top_builddir)/include/grub/keyboard_layouts.h -+KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/arm/system.h -+KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/video.h -+KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/video_fb.h -+KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/gfxterm.h -+KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/font.h -+KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/bufio.h -+KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/fdt.h -+KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/dma.h -+KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/arm/coreboot/kernel.h -+KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/fdtbus.h -+endif -+ - if COND_arm_efi --KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/arm/efi/loader.h - KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h - KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h - KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/arm/system.h -@@ -278,7 +291,7 @@ BUILT_SOURCES += symlist.h - - symlist.c: symlist.h gensymlist.sh - $(TARGET_CPP) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS_KERNEL) $(CPPFLAGS) -DGRUB_SYMBOL_GENERATOR=1 symlist.h > symlist.p || (rm -f symlist.p; exit 1) -- cat symlist.p | /bin/sh $(srcdir)/gensymlist.sh $(top_builddir)/config.h $(KERNEL_HEADER_FILES) >$@ || (rm -f $@; exit 1) -+ cat symlist.p | $(SHELL) $(srcdir)/gensymlist.sh $(top_builddir)/config.h $(KERNEL_HEADER_FILES) >$@ || (rm -f $@; exit 1) - rm -f symlist.p - CLEANFILES += symlist.c - BUILT_SOURCES += symlist.c -@@ -358,6 +371,16 @@ terminal.lst: $(MARKER_FILES) - platform_DATA += terminal.lst - CLEANFILES += terminal.lst - -+fdt.lst: $(MARKER_FILES) -+ (for pp in $^; do \ -+ b=`basename $$pp .marker`; \ -+ sed -n \ -+ -e "/FDT_DRIVER_LIST_MARKER *( *\"/{s/.*( *\"\([^\"]*\)\".*/i\1: $$b/;p;}" \ -+ -e "/FDT_DRIVER_LIST_MARKER *( *\"/{s/.*( *\"\([^\"]*\)\".*/o\1: $$b/;p;}" $$pp; \ -+ done) | sort -u > $@ -+platform_DATA += fdt.lst -+CLEANFILES += fdt.lst -+ - parttool.lst: $(MARKER_FILES) - (for pp in $^; do \ - b=`basename $$pp .marker`; \ -diff --git a/grub-core/genmod.sh.in b/grub-core/genmod.sh.in -index 03cc3b7f69ed3cfb69b744f8114895fd0e14fde7..1250589b3f5f88b52d7ea6de361427339fe7e578 100644 ---- a/grub-core/genmod.sh.in -+++ b/grub-core/genmod.sh.in -@@ -1,4 +1,4 @@ --#! /bin/sh -+#! @BUILD_SHEBANG@ - set -e - - # Copyright (C) 2010 Free Software Foundation, Inc. -@@ -58,6 +58,10 @@ if test x@TARGET_APPLE_LINKER@ != x1; then - -K grub_mod_init -K grub_mod_fini \ - -K _grub_mod_init -K _grub_mod_fini \ - -R .note.gnu.gold-version -R .note.GNU-stack \ -+ -R .gnu.build.attributes \ -+ -R .rel.gnu.build.attributes \ -+ -R .rela.gnu.build.attributes \ -+ -R .eh_frame -R .rela.eh_frame -R .rel.eh_frame \ - -R .note -R .comment -R .ARM.exidx $tmpfile || exit 1 - fi - if ! test -z "${TARGET_OBJ2ELF}"; then -diff --git a/grub-core/genmoddep.awk b/grub-core/genmoddep.awk -index bd98d84cdd7427eef2f3651f455377d469955250..04c2863e5abfa4d950df2c41d579dea03a361927 100644 ---- a/grub-core/genmoddep.awk -+++ b/grub-core/genmoddep.awk -@@ -18,6 +18,10 @@ BEGIN { - - { - if ($1 == "defined") { -+ if ($3 !~ /^\.refptr\./ && $3 in symtab) { -+ printf "%s in %s is duplicated in %s\n", $3, $2, symtab[$3] >"/dev/stderr"; -+ error++; -+ } - symtab[$3] = $2; - modtab[$2] = "" modtab[$2] - } else if ($1 == "undefined") { -diff --git a/grub-core/gensyminfo.sh.in b/grub-core/gensyminfo.sh.in -index 2e8716b425cb04d9379ef5e2c629283d0f346c90..9bc7675327a6d9229492548671dd004054282434 100644 ---- a/grub-core/gensyminfo.sh.in -+++ b/grub-core/gensyminfo.sh.in -@@ -1,4 +1,4 @@ --#! /bin/sh -+#! @BUILD_SHEBANG@ - set -e - - # Copyright (C) 2010 Free Software Foundation, Inc. -diff --git a/grub-core/modinfo.sh.in b/grub-core/modinfo.sh.in -index faf0ad30edbe878270a185add45aa70e245d8b3a..f6cd657ce0f8307547fc5d011efa35622c318e63 100644 ---- a/grub-core/modinfo.sh.in -+++ b/grub-core/modinfo.sh.in -@@ -1,4 +1,4 @@ --#!/bin/sh -+#!@BUILD_SHEBANG@ - - # User-controllable options - grub_modinfo_target_cpu=@target_cpu@ -diff --git a/grub-core/script/yylex.l b/grub-core/script/yylex.l -index 95b2191705ac826833e0951fa323242a9f8859d1..7b44c37b76ffa87f24b6f04260b9519f0c8654c0 100644 ---- a/grub-core/script/yylex.l -+++ b/grub-core/script/yylex.l -@@ -91,7 +91,7 @@ typedef size_t yy_size_t; - #define stdin 0 - #define stdout 0 - --#define fprintf(...) 0 -+#define fprintf(...) (void)0 - #define exit(...) grub_fatal("fatal error in lexer") - #endif - -diff --git a/po/Makefile.in.in b/po/Makefile.in.in -index 3619458e85f2bed3f92a76a9d919c26a30116dee..e68e9da843d927bfb6bbd519f4b3923c733abd7c 100644 ---- a/po/Makefile.in.in -+++ b/po/Makefile.in.in -@@ -15,7 +15,7 @@ PACKAGE = @PACKAGE@ - VERSION = @VERSION@ - PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ - --SHELL = /bin/sh -+SHELL = @SHELL@ - @SET_MAKE@ - - srcdir = @srcdir@ -diff --git a/po/exclude.pot b/po/exclude.pot -index 0a9b215eaf1971bf2a2af8a36e9605043de38e36..816089c30cbd36939b2a72724b3d591a0ac8a290 100644 -GIT binary patch -delta 49 -zcmaEUhNJl`#|G_WNh^i)qS7SY?UJ|KB{OOs -F1^~&~5lR36 - -delta 27 -jcmZoZ%klgS#|G`>=`Ng%LX#(mur$XeZ;wr8R67g+m_Q0B - -diff --git a/tests/ahci_test.in b/tests/ahci_test.in -index 1d01d1f59a0aac8911ff7ca3e62565f2dee5954d..7df56046201e4c2e4a55bdcdd403853cde902268 100644 ---- a/tests/ahci_test.in -+++ b/tests/ahci_test.in -@@ -1,4 +1,4 @@ --#! /bin/sh -+#! @BUILD_SHEBANG@ - # Copyright (C) 2013 Free Software Foundation, Inc. - # - # GRUB is free software: you can redistribute it and/or modify -diff --git a/tests/btrfs_test.in b/tests/btrfs_test.in -index c55d9477f78e01b6556bc0da9695f038523936f4..2b37ddd3324cc77f1edeb03feb369c22d03204a2 100644 ---- a/tests/btrfs_test.in -+++ b/tests/btrfs_test.in -@@ -1,4 +1,4 @@ --#!/bin/sh -+#!@BUILD_SHEBANG@ - - set -e - -diff --git a/tests/cdboot_test.in b/tests/cdboot_test.in -index 1cc901977c229dcf839bf58bede2b34f04252d57..75acdfedb7fe4a634d4122e44b3cd01778ed6f35 100644 ---- a/tests/cdboot_test.in -+++ b/tests/cdboot_test.in -@@ -1,4 +1,4 @@ --#! /bin/sh -+#! @BUILD_SHEBANG@ - # Copyright (C) 2013 Free Software Foundation, Inc. - # - # GRUB is free software: you can redistribute it and/or modify -diff --git a/tests/core_compress_test.in b/tests/core_compress_test.in -index 1003587ccca65616b0c7e3c1b90353ef7f459299..9d216ebcff60bfce04e3be4dbd1f8834800a6948 100644 ---- a/tests/core_compress_test.in -+++ b/tests/core_compress_test.in -@@ -1,4 +1,4 @@ --#! /bin/sh -+#! @BUILD_SHEBANG@ - # Copyright (C) 2013 Free Software Foundation, Inc. - # - # GRUB is free software: you can redistribute it and/or modify -diff --git a/tests/cpio_test.in b/tests/cpio_test.in -index 0b09db549f07868a524376f0eb25fd6a2cac9e40..5742cf17b9d8f587d00590d481f0a00aaf6cada8 100644 ---- a/tests/cpio_test.in -+++ b/tests/cpio_test.in -@@ -1,4 +1,4 @@ --#!/bin/sh -+#!@BUILD_SHEBANG@ - - set -e - -diff --git a/tests/ehci_test.in b/tests/ehci_test.in -index 7dd8d3e8fbd4a76b8efb88d69ecd8989546dc543..b197f8cdc922628ed35863dfa384eeef4cc4cc09 100644 ---- a/tests/ehci_test.in -+++ b/tests/ehci_test.in -@@ -1,4 +1,4 @@ --#! /bin/sh -+#! @BUILD_SHEBANG@ - # Copyright (C) 2013 Free Software Foundation, Inc. - # - # GRUB is free software: you can redistribute it and/or modify -diff --git a/tests/example_scripted_test.in b/tests/example_scripted_test.in -index 09633e89341e079a05fda7461d867e1541df4287..783b7f13853f39f9ec63b8da1da6e8a1b3a887a5 100644 ---- a/tests/example_scripted_test.in -+++ b/tests/example_scripted_test.in -@@ -1,4 +1,4 @@ --#!/bin/sh -+#!@BUILD_SHEBANG@ - set -e - - true -diff --git a/tests/exfat_test.in b/tests/exfat_test.in -index fc1a0fe5ec0306434434f0b49b20c44a1736dca1..cd3cd4cb2f70bb99df7edbfa8b5697f4316548ac 100644 ---- a/tests/exfat_test.in -+++ b/tests/exfat_test.in -@@ -1,4 +1,4 @@ --#!/bin/sh -+#!@BUILD_SHEBANG@ - - set -e - -diff --git a/tests/ext234_test.in b/tests/ext234_test.in -index c986960a8bec696deb37a55cba00915219d77215..4f1eb527eb2ed41095266dba6d5013ead77d9be3 100644 ---- a/tests/ext234_test.in -+++ b/tests/ext234_test.in -@@ -1,4 +1,4 @@ --#!/bin/sh -+#!@BUILD_SHEBANG@ - - set -e - -@@ -30,3 +30,4 @@ fi - "@builddir@/grub-fs-tester" ext3 - "@builddir@/grub-fs-tester" ext4 - "@builddir@/grub-fs-tester" ext4_metabg -+"@builddir@/grub-fs-tester" ext4_encrypt -diff --git a/tests/f2fs_test.in b/tests/f2fs_test.in -new file mode 100644 -index 0000000000000000000000000000000000000000..1ea77c826d32bd01e33d13ea7ad6639eb1cb77b0 ---- /dev/null -+++ b/tests/f2fs_test.in -@@ -0,0 +1,19 @@ -+#!/bin/sh -+ -+set -e -+ -+if [ "x$EUID" = "x" ] ; then -+ EUID=`id -u` -+fi -+ -+if [ "$EUID" != 0 ] ; then -+ exit 77 -+fi -+ -+if ! which mkfs.f2fs >/dev/null 2>&1; then -+ echo "mkfs.f2fs not installed; cannot test f2fs." -+ exit 77 -+fi -+ -+ -+"@builddir@/grub-fs-tester" f2fs -diff --git a/tests/fat_test.in b/tests/fat_test.in -index 1d132b51703c43e269d5500ca1740fa1e6b9a42c..b6b4748ca694b59337441a2f3111863e01799884 100644 ---- a/tests/fat_test.in -+++ b/tests/fat_test.in -@@ -1,4 +1,4 @@ --#!/bin/sh -+#!@BUILD_SHEBANG@ - - set -e - -diff --git a/tests/fddboot_test.in b/tests/fddboot_test.in -index a59645b7f873872490ac2474a30420c2df7a5caf..2d7dfc8891f6d7fdf42f88dea1213428e23b6f2e 100644 ---- a/tests/fddboot_test.in -+++ b/tests/fddboot_test.in -@@ -1,4 +1,4 @@ --#! /bin/sh -+#! @BUILD_SHEBANG@ - # Copyright (C) 2013 Free Software Foundation, Inc. - # - # GRUB is free software: you can redistribute it and/or modify -diff --git a/tests/file_filter_test.in b/tests/file_filter_test.in -index 8909e4021fb1d507cd5bf3b63319824fdc005dd5..bfb6382274e48d409d6cf6f918fc252f993f717f 100644 ---- a/tests/file_filter_test.in -+++ b/tests/file_filter_test.in -@@ -1,4 +1,4 @@ --#! /bin/sh -+#! @BUILD_SHEBANG@ - # Copyright (C) 2014 Free Software Foundation, Inc. - # - # GRUB is free software: you can redistribute it and/or modify -diff --git a/tests/gettext_strings_test.in b/tests/gettext_strings_test.in -index 5c305e75b7e9583f6be8a23d389051cf1fe2c243..813999ebe6ea5ee35796669e58baa57d0a2ace95 100644 ---- a/tests/gettext_strings_test.in -+++ b/tests/gettext_strings_test.in -@@ -1,4 +1,4 @@ --#!/bin/sh -+#!@BUILD_SHEBANG@ - - cd '@srcdir@' - -diff --git a/tests/grub_cmd_date.in b/tests/grub_cmd_date.in -index a459353e8a51c22fb966a842af532cff904de2a3..f7c9ca00432fa3307a2fb53ac88ca11115d7f73f 100644 ---- a/tests/grub_cmd_date.in -+++ b/tests/grub_cmd_date.in -@@ -1,4 +1,4 @@ --#! /bin/bash -+#! @BUILD_SHEBANG@ - set -e - - . "@builddir@/grub-core/modinfo.sh" -@@ -9,7 +9,7 @@ if [ "${grub_modinfo_target_cpu}-${grub_modinfo_platform}" = sparc64-ieee1275 ]; - fi - - pdt="$(date -u +%s)" --dt=`echo date | @builddir@/grub-shell` -+dt=`echo date | @builddir@/grub-shell | sed 's, [A-Z][a-z]*$,,'` - dtg="$(date -u -d "$dt" +%s)" - ndt="$(date -u +%s)" - -diff --git a/tests/grub_cmd_regexp.in b/tests/grub_cmd_regexp.in -index e7e6257011525ee42ca6945485208155fe717d24..6520bd6d79acc0c8f5bfddc443912d74e826a0c8 100644 ---- a/tests/grub_cmd_regexp.in -+++ b/tests/grub_cmd_regexp.in -@@ -1,4 +1,4 @@ --#! /bin/bash -+#! @BUILD_SHEBANG@ - set -e - - # Run GRUB script in a Qemu instance -diff --git a/tests/grub_cmd_set_date.in b/tests/grub_cmd_set_date.in -index c594ae3fc14ebf7a6be86b90f4d048747383a69f..aac120a6c52731649678549d34372af14fef52d9 100644 ---- a/tests/grub_cmd_set_date.in -+++ b/tests/grub_cmd_set_date.in -@@ -1,4 +1,4 @@ --#! /bin/bash -+#! @BUILD_SHEBANG@ - set -e - - . "@builddir@/grub-core/modinfo.sh" -diff --git a/tests/grub_cmd_sleep.in b/tests/grub_cmd_sleep.in -index eb362aa2439d713bf4246e2c56932bbc6200d710..8797f6632845f5a76ac22b813c223897ceddd672 100644 ---- a/tests/grub_cmd_sleep.in -+++ b/tests/grub_cmd_sleep.in -@@ -1,4 +1,4 @@ --#! /bin/bash -+#! @BUILD_SHEBANG@ - set -e - - . "@builddir@/grub-core/modinfo.sh" -@@ -11,8 +11,8 @@ fi - # Compare RTC with interval timer. - # Not 100% proper but should check that timer is running ok - dt=`echo 'date; sleep 10; date' | @builddir@/grub-shell` --dt1="$(date -u -d "$(echo "$dt" | head -n 1)" +%s)" --dt2="$(date -u -d "$(echo "$dt" | tail -n 1)" +%s)" -+dt1="$(date -u -d "$(echo "$dt" | head -n 1 | sed 's, [A-Z][a-z]*$,,')" +%s)" -+dt2="$(date -u -d "$(echo "$dt" | tail -n 1 | sed 's, [A-Z][a-z]*$,,')" +%s)" - - # Ignore QEMU bug - if [ "${grub_modinfo_target_cpu}" = arm ] && [ $((dt2 - dt1)) -ge 15 ] && [ $((dt2 - dt1)) -le 17 ]; then -diff --git a/tests/grub_cmd_test.in b/tests/grub_cmd_test.in -index 6269891c9eeddb70f42da372e5636089e666818d..3399eb2929408570e9dad99db8dbc7215b41aea4 100644 ---- a/tests/grub_cmd_test.in -+++ b/tests/grub_cmd_test.in -@@ -1,4 +1,4 @@ --#! /bin/bash -+#! @BUILD_SHEBANG@ - - # create a randome file - empty="`mktemp "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"`" || exit 1 -diff --git a/tests/grub_cmd_tr.in b/tests/grub_cmd_tr.in -index 3fb15e35c8ac3ac218abf580f8ff5cdcaa2925ca..bed469c03ddc9a762112896d75af399678af711e 100644 ---- a/tests/grub_cmd_tr.in -+++ b/tests/grub_cmd_tr.in -@@ -1,4 +1,4 @@ --#! /bin/bash -e -+#! @BUILD_SHEBANG@ -e - - # Run GRUB script in a Qemu instance - # Copyright (C) 2010 Free Software Foundation, Inc. -diff --git a/tests/grub_func_test.in b/tests/grub_func_test.in -index c8cc263763377fd23d6c7f1eca49c1edafe530a7..c67f9e422534a402614eb280fe67d165fd0bb906 100644 ---- a/tests/grub_func_test.in -+++ b/tests/grub_func_test.in -@@ -1,4 +1,4 @@ --#! /bin/bash -+#! @BUILD_SHEBANG@ - set -e - - . "@builddir@/grub-core/modinfo.sh" -diff --git a/tests/grub_script_blanklines.in b/tests/grub_script_blanklines.in -index 89ed763d3f4e0bb2a3ac3a61de9e0ec49b2eaccf..bd8735491be3b947c72fffbf5767d7ab6bcf91ae 100644 ---- a/tests/grub_script_blanklines.in -+++ b/tests/grub_script_blanklines.in -@@ -1,4 +1,4 @@ --#! /bin/sh -+#! @BUILD_SHEBANG@ - set -e - - @builddir@/grub-script-check < 4096 - MAXBLKSIZE=4096;; -@@ -169,7 +196,12 @@ for ((LOGSECSIZE=MINLOGSECSIZE;LOGSECSIZE<=MAXLOGSECSIZE;LOGSECSIZE=LOGSECSIZE + - MINBLKSIZE=1024 - MAXBLKSIZE=4096;; - esac -- for ((BLKSIZE=MINBLKSIZE;BLKSIZE<=MAXBLKSIZE;BLKSIZE=BLKSTEP?BLKSIZE+BLKSTEP:2*BLKSIZE)); do -+ if test "$BLKSTEP" -eq 0; then -+ blksizes="$(powrange "$MINBLKSIZE" "$MAXBLKSIZE")" -+ else -+ blksizes="$(range "$MINBLKSIZE" "$MAXBLKSIZE" "$BLKSTEP")" -+ fi -+ for BLKSIZE in $blksizes; do - MAXDEVICES=1 - MINDEVICES=1 - export fs -@@ -199,13 +231,11 @@ for ((LOGSECSIZE=MINLOGSECSIZE;LOGSECSIZE<=MAXLOGSECSIZE;LOGSECSIZE=LOGSECSIZE + - MAXDEVICES=7;; - esac - -- for ((NDEVICES=MINDEVICES; NDEVICES <= MAXDEVICES; NDEVICES++)); do -+ for NDEVICES in $(range "$MINDEVICES" "$MAXDEVICES" 1); do - export NDEVICES -- unset FSIMAGES -- for ((i=0; i < NDEVICES; i++)); do -- FSIMAGES[i]="${tempdir}/${fs}_${SECSIZE}_${BLKSIZE}_${NDEVICES}_$i.img" -- done -- export FSIMAGES -+ unset FSIMAGEP -+ FSIMAGEP="${tempdir}/${fs}_${SECSIZE}_${BLKSIZE}_${NDEVICES}_" -+ export FSIMAGEP - unset NEED_IMAGES; - - case x$fs in -@@ -226,11 +256,7 @@ for ((LOGSECSIZE=MINLOGSECSIZE;LOGSECSIZE<=MAXLOGSECSIZE;LOGSECSIZE=LOGSECSIZE + - *) - NEED_IMAGES_N=$NDEVICES;; - esac -- for ((i=0;i < NEED_IMAGES_N; i++)); do -- NEED_IMAGES[i]="${FSIMAGES[i]}"; -- done - export NEED_IMAGES_N -- export NEED_IMAGES - - MNTPOINTRO="${tempdir}/${fs}_ro" - MNTPOINTRW="${tempdir}/${fs}_rw" -@@ -238,20 +264,25 @@ for ((LOGSECSIZE=MINLOGSECSIZE;LOGSECSIZE<=MAXLOGSECSIZE;LOGSECSIZE=LOGSECSIZE + - MOUNTFS="$fs" - MASTER="${tempdir}/master" - FSLABEL="grub_;/testé莭莽茝😁киритi urewfceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoifoirefoireoifoijfoirereoireoivoioirevoinvoinreoinvnoieoinreoinveoinveoinreoinvoineoinoinoineoinernoiveoinvreoiioewdioewoirvnoireoivfoirewfewoifoijewoijfoijewfoijfewoijoijoijoijoijoijoijfewceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoifoirefoireoifoijfoirereoireoivoioirevoinvoinreoinvnoieoinreoinveoinveoinreoinvoineoinoinoineoinernoiveoinvreoiioewdioewoirvnoireoivfoirewfewoifoijewoijfoijewfoijfewoijoijoijoijoijoijoijfewrewfceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoifoirefoireoifoijfoirereoireoivoioirevoinvoinreoinvnoieoinreoinveoinveoinreoinvoineoinoinoineoinernoiveoinvreoiioewdioewoirvnoireoivfoirewfewoifoijewoijfoijewfoijfewoijoijoijoijoijoijoijfewceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoifoirefoireoifoijfoirereoireoivoioirevoinvoinreoinvnoieoinreoinveoinveoinreoinvoineoinoinoineoinernoiveoinvreoiioewdioewoirvnoireoivfoirewfewoifoijewoijfoijewfoijfewoijoijoijoijoijoijoijfew" -- CFILESN=1 -- if test -f /usr/share/dict/american-english; then -- CFILESSRC[0]="/usr/share/dict/american-english" -- else -- CFILESSRC[0]="/usr/share/dict/linux.words" -+ CFILESRC= -+ for cand in /usr/share/dict/american-english /usr/share/dict/linux.words /data/data/com.termux/files/usr/share/hunspell/en_US.dic; do -+ if test -f "$cand" ; then -+ CFILESRC="$cand" -+ break -+ fi -+ done -+ if test "$CFILESRC" = "" ; then -+ echo "Couldn't find compressible file" >&2 -+ exit 1 - fi - case x"$fs" in - # FS LIMITATION: 8.3 names - xmsdos*) -- CFILES[0]="american.eng";; -+ CFILE="american.eng";; - xiso9660) -- CFILES[0]="american_english";; -+ CFILE="american_english";; - *) -- CFILES[0]="american-english";; -+ CFILE="american-english";; - esac - # OS LIMITATION: Limited by NAME_MAX (usually 255) in GNU/Linux - LONGNAME="qwertzuiopasdfghjklyxcvbnm1234567890qwertzuiopasdfghjklyxcvbnm1234567890oiewqfiewioqoiqoiurqruewqoiuwoieoiiuewqroreqiufieiuwrnureweriuvceoiroiewqoiricdsalkcndsakfirefoiwqeoircorejwoijfreoijojoiewjfwnfcoirenfoirefnreoifenoiwfnoi" -@@ -268,6 +299,10 @@ for ((LOGSECSIZE=MINLOGSECSIZE;LOGSECSIZE<=MAXLOGSECSIZE;LOGSECSIZE=LOGSECSIZE + - x"btrfs"*) - FSLABEL="grub_;/testé莭莽😁киритi urewfceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoi";; - -+ # FS LIMITATION: f2fs label is at most 512 UTF-16 chars -+ x"f2fs") -+ FSLABEL="grub_;/testé䏌䐓䏕киритiurewfceniuewruewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoirvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoircreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoifoiq";; -+ - # FS LIMITATION: exfat is at most 15 UTF-16 chars - x"exfat") - FSLABEL="géт ;/莭莽😁кир";; -@@ -388,8 +423,8 @@ for ((LOGSECSIZE=MINLOGSECSIZE;LOGSECSIZE<=MAXLOGSECSIZE;LOGSECSIZE=LOGSECSIZE + - ;; - x"vfat16" | xmsdos16) - BIGBLOCKCNT=$((25000 * BLKSIZE)) -- if [ $BIGBLOCKCNT -gt $((16#ffffffff)) ]; then -- BIGBLOCKCNT=$((16#ffffffff)) -+ if [ $BIGBLOCKCNT -gt 4294967295 ]; then -+ BIGBLOCKCNT=4294967295 - fi - ;; - x"minix") -@@ -410,7 +445,7 @@ for ((LOGSECSIZE=MINLOGSECSIZE;LOGSECSIZE<=MAXLOGSECSIZE;LOGSECSIZE=LOGSECSIZE + - BIGBLOCKCNT=$((4000 * 1048576));; - # FS LIMITATION: These FS have uint32 as file size field - x"vfat"* | xmsdos* | x"cpio_crc" | x"cpio_newc" | x"cpio_bin" | x"cpio_hpbin" | xsfs*) -- BIGBLOCKCNT=$((16#ffffffff));; -+ BIGBLOCKCNT=4294967295;; - # FS LIMITATION: These FS have int32 as file size field - # FIXME: not so sure about AFFS - # OS LIMITATION: minix2/minix3 could be formatted in a way to permit more. -@@ -477,7 +512,7 @@ for ((LOGSECSIZE=MINLOGSECSIZE;LOGSECSIZE<=MAXLOGSECSIZE;LOGSECSIZE=LOGSECSIZE + - # FIXME: Not sure about BtrFS, NTFS, JFS, AFS, UDF and SFS. Check it. - # FS LIMITATION: as far as I know those FS don't store their last modification date. - x"jfs_caseins" | x"jfs" | x"xfs" | x"xfs_crc" | x"btrfs"* | x"reiserfs_old" | x"reiserfs" \ -- | x"bfs" | x"afs" \ -+ | x"bfs" | x"afs" | x"f2fs" \ - | x"tarfs" | x"cpio_"* | x"minix" | x"minix2" \ - | x"minix3" | x"ntfs"* | x"udf" | x"sfs"*) - NOFSTIME=y;; -@@ -543,18 +578,18 @@ for ((LOGSECSIZE=MINLOGSECSIZE;LOGSECSIZE<=MAXLOGSECSIZE;LOGSECSIZE=LOGSECSIZE + - - PDIR="" - # OS LIMITATION: Limited by PATH_MAX (usually 1024) -- for ((i=0;i /dev/null -- LODEVICES[i]=`losetup -f` -- losetup "${LODEVICES[i]}" "${FSIMAGES[i]}" -+ for i in $(range 0 $((NDEVICES-1)) 1); do -+ dd if=/dev/zero of="$FSIMAGEP${i}.img" count=1 bs=1 seek=$((DISKSIZE-1)) &> /dev/null -+ LODEVICE=$(losetup --find --show "$FSIMAGEP${i}.img") -+ LODEVICES="$LODEVICES $LODEVICE" -+ if test "$i" = 0; then -+ MOUNTDEVICE="$LODEVICE" -+ fi - done ;; - esac - -- MOUNTDEVICE="${LODEVICES[0]}" - case x"$fs" in - x"afs") - ;; - x"btrfs") -- "mkfs.btrfs" -s $SECSIZE -L "$FSLABEL" "${LODEVICES[0]}" ;; -+ "mkfs.btrfs" -s $SECSIZE -L "$FSLABEL" "${MOUNTDEVICE}" ;; - x"btrfs_zlib" | x"btrfs_lzo") -- "mkfs.btrfs" -s $SECSIZE -L "$FSLABEL" "${LODEVICES[0]}" -+ "mkfs.btrfs" -s $SECSIZE -L "$FSLABEL" "${MOUNTDEVICE}" - MOUNTOPTS="compress=${fs/btrfs_/}," - MOUNTFS="btrfs" - ;; - x"btrfs_raid0") -- "mkfs.btrfs" -s $SECSIZE -d raid0 -m raid0 -L "$FSLABEL" "${LODEVICES[@]}" -+ "mkfs.btrfs" -s $SECSIZE -d raid0 -m raid0 -L "$FSLABEL" $LODEVICES - MOUNTFS="btrfs" - ;; - x"btrfs_raid1") -- "mkfs.btrfs" -s $SECSIZE -d raid1 -m raid1 -L "$FSLABEL" "${LODEVICES[@]}" -+ "mkfs.btrfs" -s $SECSIZE -d raid1 -m raid1 -L "$FSLABEL" $LODEVICES - MOUNTFS="btrfs" - ;; - x"btrfs_raid10") -- "mkfs.btrfs" -s $SECSIZE -d raid10 -m raid10 -L "$FSLABEL" "${LODEVICES[@]}" -+ "mkfs.btrfs" -s $SECSIZE -d raid10 -m raid10 -L "$FSLABEL" $LODEVICES - MOUNTFS="btrfs" - ;; - x"btrfs_single") -- "mkfs.btrfs" -s $SECSIZE -d single -L "$FSLABEL" "${LODEVICES[@]}" -+ "mkfs.btrfs" -s $SECSIZE -d single -L "$FSLABEL" $LODEVICES - MOUNTFS="btrfs" - ;; - x"exfat") -- "mkfs.$fs" -s $((BLKSIZE/512)) -n "$FSLABEL" "${LODEVICES[0]}" -+ "mkfs.$fs" -s $((BLKSIZE/512)) -n "$FSLABEL" "${MOUNTDEVICE}" - MOUNTOPTS="iocharset=utf8," - MOUNTFS="exfat-fuse";; - x"minix") -- "mkfs.minix" "${LODEVICES[0]}" -+ "mkfs.minix" "${MOUNTDEVICE}" - ;; - # mkfs.hfs and mkfs.hfsplus don't fill UUID. - x"hfsplus") -- "mkfs.hfsplus" -b $BLKSIZE -v "$FSLABEL" "${LODEVICES[0]}" -- dd if=/dev/urandom of="${LODEVICES[0]}" bs=1 seek=$((16#468)) conv=notrunc count=8 ;; -+ "mkfs.hfsplus" -b $BLKSIZE -v "$FSLABEL" "${MOUNTDEVICE}" -+ dd if=/dev/urandom of="${MOUNTDEVICE}" bs=1 seek=$((16#468)) conv=notrunc count=8 ;; - x"hfsplus_wrap") -- "mkfs.hfsplus" -w -b $BLKSIZE -v "$FSLABEL" "${LODEVICES[0]}" -- dd if=/dev/urandom of="${LODEVICES[0]}" bs=1 seek=$((16#468)) conv=notrunc count=8 -+ "mkfs.hfsplus" -w -b $BLKSIZE -v "$FSLABEL" "${MOUNTDEVICE}" -+ dd if=/dev/urandom of="${MOUNTDEVICE}" bs=1 seek=$((16#468)) conv=notrunc count=8 - MOUNTFS="hfsplus";; - x"hfsplus_casesens") -- "mkfs.hfsplus" -s -b $BLKSIZE -v "$FSLABEL" "${LODEVICES[0]}" -- dd if=/dev/urandom of="${LODEVICES[0]}" bs=1 seek=$((16#468)) conv=notrunc count=8 -+ "mkfs.hfsplus" -s -b $BLKSIZE -v "$FSLABEL" "${MOUNTDEVICE}" -+ dd if=/dev/urandom of="${MOUNTDEVICE}" bs=1 seek=$((16#468)) conv=notrunc count=8 - MOUNTFS="hfsplus";; - x"hfs") -- "mkfs.hfs" -b $BLKSIZE -v "`echo $FSLABEL |recode utf8..macroman`" -h "${LODEVICES[0]}" -- dd if=/dev/urandom of="${LODEVICES[0]}" bs=1 seek=$((16#474)) conv=notrunc count=8 -+ "mkfs.hfs" -b $BLKSIZE -v "`echo $FSLABEL |recode utf8..macroman`" -h "${MOUNTDEVICE}" -+ dd if=/dev/urandom of="${MOUNTDEVICE}" bs=1 seek=$((16#474)) conv=notrunc count=8 - MOUNTOPTS="iocharset=utf8,codepage=macroman," - ;; - x"vfat"*|xmsdos*) -@@ -643,98 +682,98 @@ for ((LOGSECSIZE=MINLOGSECSIZE;LOGSECSIZE<=MAXLOGSECSIZE;LOGSECSIZE=LOGSECSIZE + - else - A= - fi -- "mkfs.vfat" -a $A -S $SECSIZE -s $((BLKSIZE/SECSIZE)) -F "${BITS:0:2}" -n "$FSLABEL" "${FSIMAGES[0]}" -+ "mkfs.vfat" -a $A -S $SECSIZE -s $((BLKSIZE/SECSIZE)) -F "${BITS:0:2}" -n "$FSLABEL" "${MOUNTDEVICE}" - MOUNTOPTS="iocharset=utf8,codepage=437," - MOUNTFS="$(echo "$fs"|sed 's,[0-9]*a\?$,,')";; - x"minix2") -- "mkfs.minix" -v "${LODEVICES[0]}" -+ "mkfs.minix" -v "${MOUNTDEVICE}" - MOUNTFS="minix";; - x"minix3") -- "mkfs.minix" -B $BLKSIZE -3 "${LODEVICES[0]}" -+ "mkfs.minix" -B $BLKSIZE -3 "${MOUNTDEVICE}" - MOUNTFS="minix";; - x"ntfs"*) -- "mkfs.ntfs" -s "$SECSIZE" -c "$BLKSIZE" -L "$FSLABEL" -Q -q "${LODEVICES[0]}" -+ "mkfs.ntfs" -s "$SECSIZE" -c "$BLKSIZE" -L "$FSLABEL" -Q -q "${MOUNTDEVICE}" - MOUNTOPTS="iocharset=utf8,compression," - MOUNTFS="ntfs-3g";; - x"udf") -- "mkudffs" --utf8 -b $BLKSIZE --lvid="$FSLABEL" "${LODEVICES[0]}" -+ "mkudffs" --utf8 -b $BLKSIZE --lvid="$FSLABEL" "${MOUNTDEVICE}" - MOUNTOPTS="iocharset=utf8,bs=$BLKSIZE,";; - x"ufs2") -- "mkfs.ufs" -b $BLKSIZE -L "$FSLABEL" -O 2 "${LODEVICES[0]}" -+ "mkfs.ufs" -b $BLKSIZE -L "$FSLABEL" -O 2 "${MOUNTDEVICE}" - MOUNTOPTS="ufstype=ufs2," - MOUNTFS="ufs";; - x"ufs1") -- "mkfs.ufs" -b $BLKSIZE -L "$FSLABEL" -O 1 "${LODEVICES[0]}" -+ "mkfs.ufs" -b $BLKSIZE -L "$FSLABEL" -O 1 "${MOUNTDEVICE}" - MOUNTOPTS="ufstype=44bsd," - MOUNTFS="ufs";; - x"ufs1_sun") -- "mkfs.ufs" -b $BLKSIZE -L "$FSLABEL" -O 1 "${LODEVICES[0]}" -+ "mkfs.ufs" -b $BLKSIZE -L "$FSLABEL" -O 1 "${MOUNTDEVICE}" - MOUNTOPTS="ufstype=sun," - MOUNTFS="ufs";; - x"zfs") -- "zpool" create -R "$MNTPOINTRW" "$FSLABEL" "${LODEVICES[0]}" -+ "zpool" create -R "$MNTPOINTRW" "$FSLABEL" "${MOUNTDEVICE}" - sleep 1 - "zfs" create "$FSLABEL"/"grub fs" - sleep 1;; - x"zfs_caseins") -- "zpool" create -R "$MNTPOINTRW" "$FSLABEL" "${LODEVICES[0]}" -+ "zpool" create -R "$MNTPOINTRW" "$FSLABEL" "${MOUNTDEVICE}" - sleep 1 - "zfs" create -o casesensitivity=insensitive "$FSLABEL"/"grub fs" - sleep 1;; - x"zfs_lzjb" | xzfs_gzip | xzfs_zle) -- "zpool" create -O compression=${fs/zfs_/} -R "$MNTPOINTRW" "$FSLABEL" "${LODEVICES[0]}" -+ "zpool" create -O compression=${fs/zfs_/} -R "$MNTPOINTRW" "$FSLABEL" "${MOUNTDEVICE}" - sleep 1 - "zfs" create -o compression=${fs/zfs_/} "$FSLABEL"/"grub fs" - sleep 1;; - x"zfs_raidz") -- "zpool" create -R "$MNTPOINTRW" "$FSLABEL" raidz1 "${LODEVICES[@]}" -+ "zpool" create -R "$MNTPOINTRW" "$FSLABEL" raidz1 $LODEVICES - sleep 1 - "zfs" create "$FSLABEL"/"grub fs" - sleep 1;; - x"zfs_raidz2") -- "zpool" create -R "$MNTPOINTRW" "$FSLABEL" raidz2 "${LODEVICES[@]}" -+ "zpool" create -R "$MNTPOINTRW" "$FSLABEL" raidz2 $LODEVICES - sleep 1 - "zfs" create "$FSLABEL"/"grub fs" - sleep 1;; - x"zfs_raidz3") -- "zpool" create -R "$MNTPOINTRW" "$FSLABEL" raidz3 "${LODEVICES[@]}" -+ "zpool" create -R "$MNTPOINTRW" "$FSLABEL" raidz3 $LODEVICES - sleep 1 - "zfs" create "$FSLABEL"/"grub fs" - sleep 1;; - x"zfs_mirror") -- "zpool" create -R "$MNTPOINTRW" "$FSLABEL" mirror "${LODEVICES[@]}" -+ "zpool" create -R "$MNTPOINTRW" "$FSLABEL" mirror $LODEVICES - sleep 1 - "zfs" create "$FSLABEL"/"grub fs" - sleep 1;; - x"zfs_stripe") -- "zpool" create -R "$MNTPOINTRW" "$FSLABEL" "${LODEVICES[@]}" -+ "zpool" create -R "$MNTPOINTRW" "$FSLABEL" $LODEVICES - sleep 1 - "zfs" create "$FSLABEL"/"grub fs" - sleep 1;; - x"tarfs" | x"cpio_"* | x"iso9660" | xjoliet | xrockridge | xrockridge_joliet | x"iso9660_1999" | xjoliet_1999 | xrockridge_1999 | xrockridge_joliet_1999 | x"ziso9660" | x"romfs" | x"squash4_"*) - INSTDEVICE=/dev/null;; - x"reiserfs") -- "mkfs.reiserfs" --format=3.6 -b $BLKSIZE -l "$FSLABEL" -q "${LODEVICES[0]}" ;; -+ "mkfs.reiserfs" --format=3.6 -b $BLKSIZE -l "$FSLABEL" -q "${MOUNTDEVICE}" ;; - x"reiserfs_old") -- "mkfs.reiserfs" --format=3.5 -b $BLKSIZE -l "$FSLABEL" -q "${LODEVICES[0]}" -+ "mkfs.reiserfs" --format=3.5 -b $BLKSIZE -l "$FSLABEL" -q "${MOUNTDEVICE}" - MOUNTFS=reiserfs;; - x"jfs") -- "mkfs.jfs" -L "$FSLABEL" -q "${LODEVICES[0]}" -+ "mkfs.jfs" -L "$FSLABEL" -q "${MOUNTDEVICE}" - MOUNTOPTS="iocharset=utf8,";; - x"jfs_caseins") -- "mkfs.jfs" -O -L "$FSLABEL" -q "${LODEVICES[0]}" -+ "mkfs.jfs" -O -L "$FSLABEL" -q "${MOUNTDEVICE}" - MOUNTFS=jfs - MOUNTOPTS="iocharset=utf8,";; - x"mdraid"*) -- mdadm -C --chunk=$((BLKSIZE/1024)) --force -e "${fs:6:1}.${fs:7:1}" "/dev/md/${fs}_${NDEVICES}" --level="${fs:13}" --raid-devices="$NDEVICES" "${LODEVICES[@]}" -+ mdadm -C --chunk=$((BLKSIZE/1024)) --force -e "${fs:6:1}.${fs:7:1}" "/dev/md/${fs}_${NDEVICES}" --level="${fs:13}" --raid-devices="$NDEVICES" $LODEVICES - MOUNTDEVICE="/dev/md/${fs}_${NDEVICES}" - MOUNTFS=ext2 - "mkfs.ext2" -L "$FSLABEL" -q "${MOUNTDEVICE}" ;; - x"lvm"*) -- for ((i=0;i /dev/null; -+ cp "${CFILESRC}" "$MNTPOINTRW/$OSDIR/${CFILE}" &> /dev/null; - else -- for ((i=0;i<$CFILESN;i++)); do -- cp "${CFILESSRC[i]}" "$MNTPOINTRW/$OSDIR/${CFILES[i]}"; -- done -+ -+ cp "${CFILESRC}" "$MNTPOINTRW/$OSDIR/${CFILE}"; -+ - fi - - if [ x$NOSYMLINK != xy ]; then -@@ -968,48 +1015,48 @@ for ((LOGSECSIZE=MINLOGSECSIZE;LOGSECSIZE<=MAXLOGSECSIZE;LOGSECSIZE=LOGSECSIZE + - sleep 2 - ;; - x"tarfs") -- (cd "$MASTER"; tar cf "${FSIMAGES[0]}" .) ;; -+ (cd "$MASTER"; tar cf "${FSIMAGEP}0.img" .) ;; - x"cpio_"*) -- (cd "$MASTER"; find . | cpio -o -H "${fs/cpio_/}" > "${FSIMAGES[0]}" ) ;; -+ (cd "$MASTER"; find . | cpio -o -H "$(echo ${fs} | sed 's@^cpio_@@')" > "${FSIMAGEP}0.img" ) ;; - x"ziso9660") - FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); -- xorriso -compliance rec_mtime -set_filter_r --zisofs -- -zisofs default -as mkisofs -iso-level 3 -graft-points -R -J -joliet-long -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGES[0]}" -- -set_filter_r --zisofs -- -zisofs default -add /="$MASTER" ;; -+ xorriso -compliance rec_mtime -set_filter_r --zisofs -- -zisofs default -as mkisofs -iso-level 3 -graft-points -R -J -joliet-long -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGEP}0.img" -- -set_filter_r --zisofs -- -zisofs default -add /="$MASTER" ;; - x"iso9660") - FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); -- xorriso --rockridge off -compliance rec_mtime -as mkisofs -iso-level 3 -graft-points -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGES[0]}" /="$MASTER" ;; -+ xorriso --rockridge off -compliance rec_mtime -as mkisofs -iso-level 3 -graft-points -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGEP}0.img" /="$MASTER" ;; - x"joliet") - FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); -- xorriso --rockridge off -compliance rec_mtime -as mkisofs -iso-level 3 -graft-points -J -joliet-long -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGES[0]}" /="$MASTER" ;; -+ xorriso --rockridge off -compliance rec_mtime -as mkisofs -iso-level 3 -graft-points -J -joliet-long -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGEP}0.img" /="$MASTER" ;; - x"rockridge") - FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); -- xorriso --rockridge on -compliance rec_mtime -as mkisofs -iso-level 3 -graft-points -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGES[0]}" /="$MASTER" ;; -+ xorriso --rockridge on -compliance rec_mtime -as mkisofs -iso-level 3 -graft-points -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGEP}0.img" /="$MASTER" ;; - x"rockridge_joliet") - FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); -- xorriso --rockridge on -compliance rec_mtime -as mkisofs -iso-level 3 -graft-points -J -joliet-long -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGES[0]}" /="$MASTER" ;; -+ xorriso --rockridge on -compliance rec_mtime -as mkisofs -iso-level 3 -graft-points -J -joliet-long -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGEP}0.img" /="$MASTER" ;; - x"iso9660_1999") - FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); -- xorriso --rockridge off -compliance rec_mtime -as mkisofs -iso-level 4 -graft-points -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGES[0]}" /="$MASTER" ;; -+ xorriso --rockridge off -compliance rec_mtime -as mkisofs -iso-level 4 -graft-points -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGEP}0.img" /="$MASTER" ;; - x"joliet_1999") - FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); -- xorriso --rockridge off -compliance rec_mtime -as mkisofs -iso-level 4 -graft-points -J -joliet-long -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGES[0]}" /="$MASTER" ;; -+ xorriso --rockridge off -compliance rec_mtime -as mkisofs -iso-level 4 -graft-points -J -joliet-long -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGEP}0.img" /="$MASTER" ;; - x"rockridge_1999") - FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); -- xorriso --rockridge on -compliance rec_mtime -as mkisofs -iso-level 4 -graft-points -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGES[0]}" /="$MASTER" ;; -+ xorriso --rockridge on -compliance rec_mtime -as mkisofs -iso-level 4 -graft-points -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGEP}0.img" /="$MASTER" ;; - x"rockridge_joliet_1999") - FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); -- xorriso --rockridge on -compliance rec_mtime -as mkisofs -iso-level 4 -graft-points -J -joliet-long -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGES[0]}" /="$MASTER" ;; -+ xorriso --rockridge on -compliance rec_mtime -as mkisofs -iso-level 4 -graft-points -J -joliet-long -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGEP}0.img" /="$MASTER" ;; - x"romfs") -- genromfs -V "$FSLABEL" -f "${FSIMAGES[0]}" -d "$MASTER" ;; -+ genromfs -V "$FSLABEL" -f "${FSIMAGEP}0.img" -d "$MASTER" ;; - xsquash4_*) -- echo mksquashfs "$MASTER" "${FSIMAGES[0]}" -always-use-fragments -comp "${fs/squash4_/}" -b $BLKSIZE -- mksquashfs "$MASTER" "${FSIMAGES[0]}" -always-use-fragments -comp "${fs/squash4_/}" -b $BLKSIZE ;; -+ echo mksquashfs "$MASTER" "${FSIMAGEP}0.img" -always-use-fragments -comp "${fs/squash4_/}" -b $BLKSIZE -+ mksquashfs "$MASTER" "${FSIMAGEP}0.img" -always-use-fragments -comp "${fs/squash4_/}" -b $BLKSIZE ;; - x"bfs") - sleep 1 - fusermount -u "$MNTPOINTRW" - ;; - xlvm*) - sleep 1 -- for ((try=0;try < 20; try++)); do -+ for try in $(range 0 20 1); do - if umount "$MNTPOINTRW" ; then - break; - fi -@@ -1021,7 +1068,7 @@ for ((LOGSECSIZE=MINLOGSECSIZE;LOGSECSIZE<=MAXLOGSECSIZE;LOGSECSIZE=LOGSECSIZE + - ;; - xmdraid*) - sleep 1 -- for ((try=0;try < 20; try++)); do -+ for try in $(range 0 20 1); do - if umount "$MNTPOINTRW" ; then - break; - fi -@@ -1033,7 +1080,7 @@ for ((LOGSECSIZE=MINLOGSECSIZE;LOGSECSIZE<=MAXLOGSECSIZE;LOGSECSIZE=LOGSECSIZE + - ;; - *) - sleep 1 -- for ((try=0;try < 20; try++)); do -+ for try in $(range 0 20 1); do - if umount "$MNTPOINTRW" ; then - break; - fi -@@ -1066,7 +1113,7 @@ for ((LOGSECSIZE=MINLOGSECSIZE;LOGSECSIZE<=MAXLOGSECSIZE;LOGSECSIZE=LOGSECSIZE + - sleep 1 - mount -t "$MOUNTFS" "${MOUNTDEVICE}" "$MNTPOINTRO" -o ${MOUNTOPTS}${SELINUXOPTS}ro ;; - xmdraid*) -- mdadm --assemble /dev/md/"${fs}_$NDEVICES" "${LODEVICES[@]}" -+ mdadm --assemble /dev/md/"${fs}_$NDEVICES" $LODEVICES - sleep 1 - mount -t "$MOUNTFS" "${MOUNTDEVICE}" "$MNTPOINTRO" -o ${MOUNTOPTS}${SELINUXOPTS}ro ;; - *) -@@ -1085,7 +1132,7 @@ for ((LOGSECSIZE=MINLOGSECSIZE;LOGSECSIZE<=MAXLOGSECSIZE;LOGSECSIZE=LOGSECSIZE + - else - echo LIST FAIL - echo "$LSROUT" -- TZ=UTC ls --time-style=+%Y%m%d%H%M%S.%N -l "$MNTPOINTRO" -+ TZ=UTC ls -l "$MNTPOINTRO" - exit 1 - fi - -@@ -1094,7 +1141,7 @@ for ((LOGSECSIZE=MINLOGSECSIZE;LOGSECSIZE<=MAXLOGSECSIZE;LOGSECSIZE=LOGSECSIZE + - else - echo NLIST FAIL - echo "$LSROUT" -- TZ=UTC ls --time-style=+%Y%m%d%H%M%S.%N -lA "$MNTPOINTRO" -+ TZ=UTC ls -lA "$MNTPOINTRO" - exit 1 - fi - -@@ -1103,7 +1150,7 @@ for ((LOGSECSIZE=MINLOGSECSIZE;LOGSECSIZE<=MAXLOGSECSIZE;LOGSECSIZE=LOGSECSIZE + - else - echo ILIST FAIL - echo "$LSROUT" -- TZ=UTC ls --time-style=+%Y%m%d%H%M%S.%N -l "$MNTPOINTRO" -+ TZ=UTC ls -l "$MNTPOINTRO" - exit 1 - fi - -@@ -1112,7 +1159,7 @@ for ((LOGSECSIZE=MINLOGSECSIZE;LOGSECSIZE<=MAXLOGSECSIZE;LOGSECSIZE=LOGSECSIZE + - else - echo LONG LIST FAIL - echo "$LSROUT" -- TZ=UTC ls --time-style=+%Y%m%d%H%M%S.%N -l "$MNTPOINTRO" -+ TZ=UTC ls -l "$MNTPOINTRO" - exit 1 - fi - -@@ -1123,7 +1170,7 @@ for ((LOGSECSIZE=MINLOGSECSIZE;LOGSECSIZE<=MAXLOGSECSIZE;LOGSECSIZE=LOGSECSIZE + - else - echo TIME FAIL - echo "$LSROUT" -- TZ=UTC ls --time-style=+%Y%m%d%H%M%S.%N -l "$MNTPOINTRO" -+ TZ=UTC ls -l "$MNTPOINTRO" - exit 1 - fi - -@@ -1133,7 +1180,7 @@ for ((LOGSECSIZE=MINLOGSECSIZE;LOGSECSIZE<=MAXLOGSECSIZE;LOGSECSIZE=LOGSECSIZE + - else - echo LONG TIME FAIL - echo "$LSROUT" -- TZ=UTC ls --time-style=+%Y%m%d%H%M%S.%N -l "$MNTPOINTRO" -+ TZ=UTC ls -l "$MNTPOINTRO" - exit 1 - fi - fi -@@ -1149,7 +1196,7 @@ for ((LOGSECSIZE=MINLOGSECSIZE;LOGSECSIZE<=MAXLOGSECSIZE;LOGSECSIZE=LOGSECSIZE + - else - echo DOT IN ROOTDIR FAIL - echo "$LSROUT" -- TZ=UTC ls --time-style=+%Y%m%d%H%M%S.%N -l "$MNTPOINTRO" -+ TZ=UTC ls -l "$MNTPOINTRO" - exit 1 - fi - -@@ -1163,7 +1210,7 @@ for ((LOGSECSIZE=MINLOGSECSIZE;LOGSECSIZE<=MAXLOGSECSIZE;LOGSECSIZE=LOGSECSIZE + - else - echo DOTDOT IN ROOTDIR FAIL - echo "$LSROUT" -- TZ=UTC ls --time-style=+%Y%m%d%H%M%S.%N -l "$MNTPOINTRO" -+ TZ=UTC ls -l "$MNTPOINTRO" - exit 1 - fi - ;; -@@ -1180,7 +1227,7 @@ for ((LOGSECSIZE=MINLOGSECSIZE;LOGSECSIZE<=MAXLOGSECSIZE;LOGSECSIZE=LOGSECSIZE + - else - echo SLIST FAIL - echo "$LSROUT" -- TZ=UTC ls --time-style=+%Y%m%d%H%M%S.%N -l "$MNTPOINTRO/sdir" -+ TZ=UTC ls -l "$MNTPOINTRO/sdir" - exit 1 - fi - -@@ -1195,7 +1242,7 @@ for ((LOGSECSIZE=MINLOGSECSIZE;LOGSECSIZE<=MAXLOGSECSIZE;LOGSECSIZE=LOGSECSIZE + - else - echo PLIST FAIL - echo "$LSROUT" -- TZ=UTC ls --time-style=+%Y%m%d%H%M%S.%N -l "$MNTPOINTRO/$PDIR" -+ TZ=UTC ls -l "$MNTPOINTRO/$PDIR" - exit 1 - fi - -@@ -1210,7 +1257,7 @@ for ((LOGSECSIZE=MINLOGSECSIZE;LOGSECSIZE<=MAXLOGSECSIZE;LOGSECSIZE=LOGSECSIZE + - else - echo DOT IN SUBDIR FAIL - echo "$LSROUT" -- TZ=UTC ls --time-style=+%Y%m%d%H%M%S.%N -l "$MNTPOINTRO/$OSDIR/sdir" -+ TZ=UTC ls -l "$MNTPOINTRO/$OSDIR/sdir" - exit 1 - fi - -@@ -1225,7 +1272,7 @@ for ((LOGSECSIZE=MINLOGSECSIZE;LOGSECSIZE<=MAXLOGSECSIZE;LOGSECSIZE=LOGSECSIZE + - else - echo DOTDOT IN SUBDIR FAIL - echo "$LSROUT" -- TZ=UTC ls --time-style=+%Y%m%d%H%M%S.%N -l "$MNTPOINTRO/$OSDIR/ssdir" -+ TZ=UTC ls -l "$MNTPOINTRO/$OSDIR/ssdir" - exit 1 - fi - -@@ -1245,8 +1292,8 @@ for ((LOGSECSIZE=MINLOGSECSIZE;LOGSECSIZE<=MAXLOGSECSIZE;LOGSECSIZE=LOGSECSIZE + - case x"$fs" in - x"iso9660" | x"ziso9660" | xrockridge | xjoliet | xrockridge_joliet | x"iso9660_1999" | xrockridge_1999 | xjoliet_1999 | xrockridge_joliet_1999) ;; - x"zfs"*) -- for ((i=0;i /dev/null || echo "$LSOUT" | grep -F 'Last modification time '"$FSTIMEM1" > /dev/null || echo "$LSOUT" | grep -F 'Last modification time '"$FSTIMEM2" || echo "$LSOUT" | grep -F 'Last modification time '"$FSTIMEM3" > /dev/null; then -- : -- else -- echo FSTIME FAIL -- echo "$FSTIME" -- echo "$LSOUT" -- exit 1 -+ if echo "$LSOUT" | grep -F 'Last modification time '"$FSTIME" > /dev/null || echo "$LSOUT" | grep -F 'Last modification time '"$FSTIMEM1" > /dev/null || echo "$LSOUT" | grep -F 'Last modification time '"$FSTIMEM2" || echo "$LSOUT" | grep -F 'Last modification time '"$FSTIMEM3" > /dev/null; then -+ : -+ else -+ echo FSTIME FAIL -+ echo "$FSTIME" -+ echo "$LSOUT" -+ exit 1 -+ fi - fi - - if [ x$NOHARDLINK != xy ]; then -@@ -1410,11 +1457,9 @@ for ((LOGSECSIZE=MINLOGSECSIZE;LOGSECSIZE<=MAXLOGSECSIZE;LOGSECSIZE=LOGSECSIZE + - exit 1 - fi - ok=true -- for ((i=0;i<$CFILESN;i++)); do -- if ! run_grubfstest cmp "$GRUBDIR/${CFILES[i]}" "$MNTPOINTRO/$OSDIR/${CFILES[i]}" ; then -- ok=false; -- fi -- done -+ if ! run_grubfstest cmp "$GRUBDIR/${CFILE}" "$MNTPOINTRO/$OSDIR/${CFILE}" ; then -+ ok=false; -+ fi - if test x$ok = xtrue; then - : - else -@@ -1503,15 +1548,17 @@ for ((LOGSECSIZE=MINLOGSECSIZE;LOGSECSIZE<=MAXLOGSECSIZE;LOGSECSIZE=LOGSECSIZE + - sleep 1 - ;; - esac -- for ((i=0; i < NDEVICES; i++)); do -- case x"$fs" in -- x"tarfs" | x"cpio_"* | x"iso9660" | xrockridge | xjoliet | xrockridge_joliet | x"ziso9660" | x"romfs" | x"squash4_"* | x"iso9660_1999" | xrockridge_1999 | xjoliet_1999 | xrockridge_joliet_1999) ;; -- *) -- while ! losetup -d "${LODEVICES[i]}"; do -+ case x"$fs" in -+ x"tarfs" | x"cpio_"* | x"iso9660" | xrockridge | xjoliet | xrockridge_joliet | x"ziso9660" | x"romfs" | x"squash4_"* | x"iso9660_1999" | xrockridge_1999 | xjoliet_1999 | xrockridge_joliet_1999) ;; -+ *) -+ for lodev in $LODEVICES; do -+ while ! losetup -d "$lodev"; do - sleep 1 -- done;; -- esac -- rm "${FSIMAGES[i]}" -+ done -+ done;; -+ esac -+ for i in $(range 0 $((NDEVICES-1)) 1); do -+ rm "$FSIMAGEP${i}.img" - done - if [ x"$fs" = x"zfs" ]; then - rmdir "$MNTPOINTRW"/"grub fs" || true -diff --git a/tests/util/grub-shell-tester.in b/tests/util/grub-shell-tester.in -index 5adce0a47fe3208e14bbbf4820685d67b43ef9bb..8a87109b15240de9d61f2ac02becfcb5300582f1 100644 ---- a/tests/util/grub-shell-tester.in -+++ b/tests/util/grub-shell-tester.in -@@ -1,4 +1,4 @@ --#! /bin/sh -+#! @BUILD_SHEBANG@ - set -e - - # Compares GRUB script output with BASH output. -diff --git a/tests/util/grub-shell.in b/tests/util/grub-shell.in -index 814f36c6bd2438b7f9c59f5f4a9777e95b9e38db..d690d6734efb82109f7635c4688b6fc7417a5751 100644 ---- a/tests/util/grub-shell.in -+++ b/tests/util/grub-shell.in -@@ -1,4 +1,4 @@ --#! /bin/sh -+#! @BUILD_SHEBANG@ - set -e - - # Run GRUB script in a Qemu instance -diff --git a/tests/xfs_test.in b/tests/xfs_test.in -index 3807e2e5c77e244f8b2f0d43ec28b86b3f2f9e9b..03a3513595dc719cd72b4d9b7198f22b338cb588 100644 ---- a/tests/xfs_test.in -+++ b/tests/xfs_test.in -@@ -1,4 +1,4 @@ --#!/bin/sh -+#!@BUILD_SHEBANG@ - - set -e - -diff --git a/tests/xzcompress_test.in b/tests/xzcompress_test.in -index b2bd999ec071c24205533e50cf51f46ec59a2218..03bfb5e951dd8dfb7ccb15fb6a31dd4aea639df9 100644 ---- a/tests/xzcompress_test.in -+++ b/tests/xzcompress_test.in -@@ -1,4 +1,4 @@ --#! /bin/sh -+#! @BUILD_SHEBANG@ - # Copyright (C) 2013 Free Software Foundation, Inc. - # - # GRUB is free software: you can redistribute it and/or modify -diff --git a/tests/zfs_test.in b/tests/zfs_test.in -index 047120e47a0e042f0540d6762666edf4cb0b37fb..eee62c10d704ec42b090eba5ac16b4966ff760ad 100644 ---- a/tests/zfs_test.in -+++ b/tests/zfs_test.in -@@ -1,4 +1,4 @@ --#!/bin/sh -+#!@BUILD_SHEBANG@ - - set -e - -diff --git a/util/grub-mkconfig.in b/util/grub-mkconfig.in -index f8496d28bdf7f4bcbc2413888330834c1e252a64..33332360eecf954fc2952df944fe171006fc4143 100644 ---- a/util/grub-mkconfig.in -+++ b/util/grub-mkconfig.in -@@ -134,6 +134,7 @@ fi - # Device containing our userland. Typically used for root= parameter. - GRUB_DEVICE="`${grub_probe} --target=device /`" - GRUB_DEVICE_UUID="`${grub_probe} --device ${GRUB_DEVICE} --target=fs_uuid 2> /dev/null`" || true -+GRUB_DEVICE_PARTUUID="`${grub_probe} --device ${GRUB_DEVICE} --target=partuuid 2> /dev/null`" || true - - # Device containing our /boot partition. Usually the same as GRUB_DEVICE. - GRUB_DEVICE_BOOT="`${grub_probe} --target=device /boot`" -@@ -147,6 +148,12 @@ if [ x"$GRUB_FS" = xunknown ]; then - GRUB_FS="$(stat -f --printf=%T / || echo unknown)" - fi - -+# Provide a default set of stock linux early initrd images. -+# Define here so the list can be modified in the sourced config file. -+if [ "x${GRUB_EARLY_INITRD_LINUX_STOCK}" = "x" ]; then -+ GRUB_EARLY_INITRD_LINUX_STOCK="intel-uc.img intel-ucode.img amd-uc.img amd-ucode.img early_ucode.cpio microcode.cpio" -+fi -+ - if test -f ${sysconfdir}/default/grub ; then - . ${sysconfdir}/default/grub - fi -@@ -182,6 +189,7 @@ if [ "x${GRUB_ACTUAL_DEFAULT}" = "xsaved" ] ; then GRUB_ACTUAL_DEFAULT="`"${grub - # override them. - export GRUB_DEVICE \ - GRUB_DEVICE_UUID \ -+ GRUB_DEVICE_PARTUUID \ - GRUB_DEVICE_BOOT \ - GRUB_DEVICE_BOOT_UUID \ - GRUB_FS \ -@@ -211,10 +219,13 @@ export GRUB_DEFAULT \ - GRUB_CMDLINE_NETBSD \ - GRUB_CMDLINE_NETBSD_DEFAULT \ - GRUB_CMDLINE_GNUMACH \ -+ GRUB_EARLY_INITRD_LINUX_CUSTOM \ -+ GRUB_EARLY_INITRD_LINUX_STOCK \ - GRUB_TERMINAL_INPUT \ - GRUB_TERMINAL_OUTPUT \ - GRUB_SERIAL_COMMAND \ - GRUB_DISABLE_LINUX_UUID \ -+ GRUB_DISABLE_LINUX_PARTUUID \ - GRUB_DISABLE_RECOVERY \ - GRUB_VIDEO_BACKEND \ - GRUB_GFXMODE \ -diff --git a/util/grub-mkconfig_lib.in b/util/grub-mkconfig_lib.in -index 60b31caddeb42b5db338897dc18acdc156dd2c22..0f801cab3e4d05efface62c7fcb9b787c69995c3 100644 ---- a/util/grub-mkconfig_lib.in -+++ b/util/grub-mkconfig_lib.in -@@ -188,6 +188,7 @@ grub_file_is_not_garbage () - *.dpkg-*) return 1 ;; # debian dpkg - *.rpmsave|*.rpmnew) return 1 ;; - README*|*/README*) return 1 ;; # documentation -+ *.sig) return 1 ;; # signatures - esac - else - return 1 -diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in -index de9044c7f28611d56358f581ac52ca2d2b7fc982..61ebd7dc714e87aedb167345729f574426d69b77 100644 ---- a/util/grub.d/10_linux.in -+++ b/util/grub.d/10_linux.in -@@ -43,12 +43,22 @@ case ${GRUB_DEVICE} in - ;; - esac - -+# Default to disabling partition uuid support to maintian compatibility with -+# older kernels. -+GRUB_DISABLE_LINUX_PARTUUID=${GRUB_DISABLE_LINUX_PARTUUID-true} -+ - # btrfs may reside on multiple devices. We cannot pass them as value of root= parameter - # and mounting btrfs requires user space scanning, so force UUID in this case. --if [ "x${GRUB_DEVICE_UUID}" = "x" ] || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \ -- || ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \ -+if ( [ "x${GRUB_DEVICE_UUID}" = "x" ] && [ "x${GRUB_DEVICE_PARTUUID}" = "x" ] ) \ -+ || ( [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \ -+ && [ "x${GRUB_DISABLE_LINUX_PARTUUID}" = "xtrue" ] ) \ -+ || ( ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \ -+ && ! test -e "/dev/disk/by-partuuid/${GRUB_DEVICE_PARTUUID}" ) \ - || ( test -e "${GRUB_DEVICE}" && uses_abstraction "${GRUB_DEVICE}" lvm ); then - LINUX_ROOT_DEVICE=${GRUB_DEVICE} -+elif [ "x${GRUB_DEVICE_UUID}" = "x" ] \ -+ || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ]; then -+ LINUX_ROOT_DEVICE=PARTUUID=${GRUB_DEVICE_PARTUUID} - else - LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID} - fi -@@ -136,9 +146,13 @@ EOF - if test -n "${initrd}" ; then - # TRANSLATORS: ramdisk isn't identifier. Should be translated. - message="$(gettext_printf "Loading initial ramdisk ...")" -+ initrd_path= -+ for i in ${initrd}; do -+ initrd_path="${initrd_path} ${rel_dirname}/${i}" -+ done - sed "s/^/$submenu_indentation/" << EOF - echo '$(echo "$message" | grub_quote)' -- initrd ${rel_dirname}/${initrd} -+ initrd $(echo $initrd_path) - EOF - fi - sed "s/^/$submenu_indentation/" << EOF -@@ -188,7 +202,15 @@ while [ "x$list" != "x" ] ; do - alt_version=`echo $version | sed -e "s,\.old$,,g"` - linux_root_device_thisversion="${LINUX_ROOT_DEVICE}" - -- initrd= -+ initrd_early= -+ for i in ${GRUB_EARLY_INITRD_LINUX_STOCK} \ -+ ${GRUB_EARLY_INITRD_LINUX_CUSTOM}; do -+ if test -e "${dirname}/${i}" ; then -+ initrd_early="${initrd_early} ${i}" -+ fi -+ done -+ -+ initrd_real= - for i in "initrd.img-${version}" "initrd-${version}.img" "initrd-${version}.gz" \ - "initrd-${version}" "initramfs-${version}.img" \ - "initrd.img-${alt_version}" "initrd-${alt_version}.img" \ -@@ -198,11 +220,22 @@ while [ "x$list" != "x" ] ; do - "initramfs-genkernel-${GENKERNEL_ARCH}-${version}" \ - "initramfs-genkernel-${GENKERNEL_ARCH}-${alt_version}"; do - if test -e "${dirname}/${i}" ; then -- initrd="$i" -+ initrd_real="${i}" - break - fi - done - -+ initrd= -+ if test -n "${initrd_early}" || test -n "${initrd_real}"; then -+ initrd="${initrd_early} ${initrd_real}" -+ -+ initrd_display= -+ for i in ${initrd}; do -+ initrd_display="${initrd_display} ${dirname}/${i}" -+ done -+ gettext_printf "Found initrd image: %s\n" "$(echo $initrd_display)" >&2 -+ fi -+ - config= - for i in "${dirname}/config-${version}" "${dirname}/config-${alt_version}" "/etc/kernels/kernel-config-${version}" ; do - if test -e "${i}" ; then -@@ -216,12 +249,16 @@ while [ "x$list" != "x" ] ; do - initramfs=`grep CONFIG_INITRAMFS_SOURCE= "${config}" | cut -f2 -d= | tr -d \"` - fi - -- if test -n "${initrd}" ; then -- gettext_printf "Found initrd image: %s\n" "${dirname}/${initrd}" >&2 -- elif test -z "${initramfs}" ; then -+ if test -z "${initramfs}" && test -z "${initrd_real}" ; then - # "UUID=" and "ZFS=" magic is parsed by initrd or initramfs. Since there's - # no initrd or builtin initramfs, it can't work here. -- linux_root_device_thisversion=${GRUB_DEVICE} -+ if [ "x${GRUB_DEVICE_PARTUUID}" = "x" ] \ -+ || [ "x${GRUB_DISABLE_LINUX_PARTUUID}" = "xtrue" ]; then -+ -+ linux_root_device_thisversion=${GRUB_DEVICE} -+ else -+ linux_root_device_thisversion=PARTUUID=${GRUB_DEVICE_PARTUUID} -+ fi - fi - - if [ "x$is_top_level" = xtrue ] && [ "x${GRUB_DISABLE_SUBMENU}" != xy ]; then -diff --git a/util/grub.d/20_linux_xen.in b/util/grub.d/20_linux_xen.in -index c48af948d6ecdf672aa341f713912ba15de8f27d..e8143b079dc8bcdf21ec8a763b19a356c863a5e3 100644 ---- a/util/grub.d/20_linux_xen.in -+++ b/util/grub.d/20_linux_xen.in -@@ -43,12 +43,22 @@ case ${GRUB_DEVICE} in - ;; - esac - -+# Default to disabling partition uuid support to maintian compatibility with -+# older kernels. -+GRUB_DISABLE_LINUX_PARTUUID=${GRUB_DISABLE_LINUX_PARTUUID-true} -+ - # btrfs may reside on multiple devices. We cannot pass them as value of root= parameter - # and mounting btrfs requires user space scanning, so force UUID in this case. --if [ "x${GRUB_DEVICE_UUID}" = "x" ] || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \ -- || ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \ -+if ( [ "x${GRUB_DEVICE_UUID}" = "x" ] && [ "x${GRUB_DEVICE_PARTUUID}" = "x" ] ) \ -+ || ( [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \ -+ && [ "x${GRUB_DISABLE_LINUX_PARTUUID}" = "xtrue" ] ) \ -+ || ( ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \ -+ && ! test -e "/dev/disk/by-partuuid/${GRUB_DEVICE_PARTUUID}" ) \ - || ( test -e "${GRUB_DEVICE}" && uses_abstraction "${GRUB_DEVICE}" lvm ); then - LINUX_ROOT_DEVICE=${GRUB_DEVICE} -+elif [ "x${GRUB_DEVICE_UUID}" = "x" ] \ -+ || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ]; then -+ LINUX_ROOT_DEVICE=PARTUUID=${GRUB_DEVICE_PARTUUID} - else - LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID} - fi -@@ -122,16 +132,16 @@ linux_entry () - else - xen_rm_opts="no-real-mode edd=off" - fi -- multiboot ${rel_xen_dirname}/${xen_basename} placeholder ${xen_args} \${xen_rm_opts} -+ ${xen_loader} ${rel_xen_dirname}/${xen_basename} placeholder ${xen_args} \${xen_rm_opts} - echo '$(echo "$lmessage" | grub_quote)' -- module ${rel_dirname}/${basename} placeholder root=${linux_root_device_thisversion} ro ${args} -+ ${module_loader} ${rel_dirname}/${basename} placeholder root=${linux_root_device_thisversion} ro ${args} - EOF - if test -n "${initrd}" ; then - # TRANSLATORS: ramdisk isn't identifier. Should be translated. - message="$(gettext_printf "Loading initial ramdisk ...")" - sed "s/^/$submenu_indentation/" << EOF - echo '$(echo "$message" | grub_quote)' -- module --nounzip ${rel_dirname}/${initrd} -+ ${module_loader} --nounzip ${rel_dirname}/${initrd} - EOF - fi - sed "s/^/$submenu_indentation/" << EOF -@@ -206,6 +216,18 @@ while [ "x${xen_list}" != "x" ] ; do - if [ "x$is_top_level" != xtrue ]; then - echo " submenu '$(gettext_printf "Xen hypervisor, version %s" "${xen_version}" | grub_quote)' \$menuentry_id_option 'xen-hypervisor-$xen_version-$boot_device_id' {" - fi -+ if ($grub_file --is-arm64-efi $current_xen); then -+ xen_loader="xen_hypervisor" -+ module_loader="xen_module" -+ else -+ if ($grub_file --is-x86-multiboot2 $current_xen); then -+ xen_loader="multiboot2" -+ module_loader="module2" -+ else -+ xen_loader="multiboot" -+ module_loader="module" -+ fi -+ fi - while [ "x$list" != "x" ] ; do - linux=`version_find_latest $list` - gettext_printf "Found linux image: %s\n" "$linux" >&2 -@@ -234,7 +256,13 @@ while [ "x${xen_list}" != "x" ] ; do - gettext_printf "Found initrd image: %s\n" "${dirname}/${initrd}" >&2 - else - # "UUID=" magic is parsed by initrds. Since there's no initrd, it can't work here. -- linux_root_device_thisversion=${GRUB_DEVICE} -+ if [ "x${GRUB_DEVICE_PARTUUID}" = "x" ] \ -+ || [ "x${GRUB_DISABLE_LINUX_PARTUUID}" = "xtrue" ]; then -+ -+ linux_root_device_thisversion=${GRUB_DEVICE} -+ else -+ linux_root_device_thisversion=PARTUUID=${GRUB_DEVICE_PARTUUID} -+ fi - fi - - if [ "x$is_top_level" = xtrue ] && [ "x${GRUB_DISABLE_SUBMENU}" != xy ]; then diff --git a/sources b/sources index b00976a..9bd1834 100644 --- a/sources +++ b/sources @@ -1,3 +1,4 @@ -SHA512 (grub-2.02.tar.xz) = cc6eb0a42b5c8df2f671cc128ff725afb3ff1f8832a196022e433cf0d3b75decfca2316d0aa5fabea75747d55e88f3d021dd93508563f8ca80fd7b9e7fe1f088 SHA512 (unifont-5.1.20080820.pcf.gz) = 8939e2bc82ca97b60e6678f3ff079a2be7ba9b702f2e8ee289e853af5823695f7baafbf14b674fc5e41071f2a6de4f2dadd56bf8b4653849dd756d59622f1649 SHA512 (theme.tar.bz2) = 0f6f914d5f801509403094b28b8cfe5169cb56ae9bdd808ae21a6780a8236b434161a068351508dd78729c25ee2fed066c124c1eef9e15102750b409b4576a5c +SHA512 (grub-2.04.tar.xz) = 9c15c42d0cf5d61446b752194e3b628bb04be0fe6ea0240ab62b3d753784712744846e1f7c3651d8e0968d22012e6d713c38c44936d4004ded3ca4d4007babbb +SHA512 (gnulib-fixes.tar.gz) = c45de2126598485bcf2fee81a66e64afa0e253aa04fc796c9201dd50229a93cc086d635a21d4644cb454ad6f71fa342494573aa86478fca19059cf71836b0619