Compare commits

..
595 changed files with 65663 additions and 25897 deletions

No files matched your search

+23 -11
View File
@@ -1,4 +1,3 @@
*~
00_header 00_header
10_* 10_*
20_linux_xen 20_linux_xen
@@ -7,13 +6,11 @@
41_custom 41_custom
*.1 *.1
*.8 *.8
ABOUT-NLS
aclocal.m4 aclocal.m4
ahci_test ahci_test
ascii.bitmaps ascii.bitmaps
ascii.h ascii.h
autom4te.cache autom4te.cache
build-aux
build-grub-gen-asciih build-grub-gen-asciih
build-grub-gen-widthspec build-grub-gen-widthspec
build-grub-mkfont build-grub-mkfont
@@ -45,7 +42,6 @@ gensymlist.sh
gentrigtables gentrigtables
gentrigtables.exe gentrigtables.exe
gettext_strings_test gettext_strings_test
/gnulib
grub-bin2h grub-bin2h
/grub-bios-setup /grub-bios-setup
/grub-bios-setup.exe /grub-bios-setup.exe
@@ -138,7 +134,6 @@ help_test
*.image.exe *.image.exe
include/grub/cpu include/grub/cpu
include/grub/machine include/grub/machine
INSTALL.grub
install-sh install-sh
lib/libgcrypt-grub lib/libgcrypt-grub
libgrub_a_init.c libgrub_a_init.c
@@ -147,7 +142,6 @@ libgrub_a_init.c
lzocompress_test lzocompress_test
*.marker *.marker
Makefile Makefile
/m4
*.mod *.mod
mod-*.c mod-*.c
missing missing
@@ -161,11 +155,7 @@ pata_test
*.pp *.pp
po/*.mo po/*.mo
po/grub.pot po/grub.pot
po/Makefile.in.in
po/Makevars
po/Makevars.template
po/POTFILES po/POTFILES
po/Rules-quot
po/stamp-po po/stamp-po
printf_test printf_test
priority_queue_unit_test priority_queue_unit_test
@@ -212,7 +202,25 @@ grub-core/*.module.exe
grub-core/*.pp grub-core/*.pp
grub-core/kernel.img.bin grub-core/kernel.img.bin
util/bash-completion.d/grub util/bash-completion.d/grub
grub-core/lib/gnulib 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/rs_decoder.h grub-core/rs_decoder.h
widthspec.bin widthspec.bin
widthspec.h widthspec.h
@@ -231,6 +239,10 @@ po/POTFILES-shell.in
/grub-render-label /grub-render-label
/grub-glue-efi.exe /grub-glue-efi.exe
/grub-render-label.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
/garbage-gen.exe /garbage-gen.exe
/grub-fs-tester /grub-fs-tester
-108
View File
@@ -1,108 +0,0 @@
# SPDX-License-Identifier: GPL-3.0+
# Originally Copyright Roger Meier <r.meier@siemens.com>
# Adapted for GRUB by Alexander Graf <agraf@suse.de>
#
# Build GRUB on Travis CI - https://www.travis-ci.org/
#
dist: xenial
language: c
addons:
apt:
packages:
- libsdl1.2-dev
- lzop
- ovmf
- python
- qemu-system
- unifont
env:
global:
# Include all cross toolchain paths, so we can just call them later down.
- PATH=/tmp/qemu-install/bin:/tmp/grub/bin:/usr/bin:/bin:/tmp/cross/gcc-8.1.0-nolibc/aarch64-linux/bin:/tmp/cross/gcc-8.1.0-nolibc/arm-linux-gnueabi/bin:/tmp/cross/gcc-8.1.0-nolibc/ia64-linux/bin:/tmp/cross/gcc-8.1.0-nolibc/mips64-linux/bin:/tmp/cross/gcc-8.1.0-nolibc/powerpc64-linux/bin:/tmp/cross/gcc-8.1.0-nolibc/riscv32-linux/bin:/tmp/cross/gcc-8.1.0-nolibc/riscv64-linux/bin:/tmp/cross/gcc-8.1.0-nolibc/sparc64-linux/bin
before_script:
# Install necessary toolchains based on $CROSS_TARGETS variable.
- mkdir /tmp/cross
# These give us binaries like /tmp/cross/gcc-8.1.0-nolibc/ia64-linux/bin/ia64-linux-gcc
- for i in $CROSS_TARGETS; do
( cd /tmp/cross; wget -t 3 -O - https://mirrors.kernel.org/pub/tools/crosstool/files/bin/x86_64/8.1.0/x86_64-gcc-8.1.0-nolibc-$i.tar.xz | tar xJ );
done
script:
# Comments must be outside the command strings below, or the Travis parser
# will get confused.
- ./autogen.sh
# Build all selected GRUB targets.
- for target in $GRUB_TARGETS; do
plat=${target#*-};
arch=${target%-*};
[ "$arch" = "arm64" ] && arch=aarch64-linux;
[ "$arch" = "arm" ] && arch=arm-linux-gnueabi;
[ "$arch" = "ia64" ] && arch=ia64-linux;
[ "$arch" = "mipsel" ] && arch=mips64-linux;
[ "$arch" = "powerpc" ] && arch=powerpc64-linux;
[ "$arch" = "riscv32" ] && arch=riscv32-linux;
[ "$arch" = "riscv64" ] && arch=riscv64-linux;
[ "$arch" = "sparc64" ] && arch=sparc64-linux;
echo "Building $target";
mkdir obj-$target;
JOBS=`getconf _NPROCESSORS_ONLN 2> /dev/null || echo 1`;
[ "$JOBS" == 1 ] || JOBS=$(($JOBS + 1));
( cd obj-$target && ../configure --target=$arch --with-platform=$plat --prefix=/tmp/grub && make -j$JOBS && make -j$JOBS install ) &> log || ( cat log; false );
done
# Our test canary.
- echo -e "insmod echo\\ninsmod reboot\\necho hello world\\nreboot" > grub.cfg
# Assemble images and possibly run them.
- for target in $GRUB_TARGETS; do grub-mkimage -c grub.cfg -p / -O $target -o grub-$target echo reboot normal; done
# Run images we know how to run.
- if [[ "$GRUB_TARGETS" == *"x86_64-efi"* ]]; then qemu-system-x86_64 -bios /usr/share/ovmf/OVMF.fd -m 512 -no-reboot -nographic -net nic -net user,tftp=.,bootfile=grub-x86_64-efi | tee grub.log && grep "hello world" grub.log; fi
matrix:
include:
# Each env setting here is a dedicated build.
- name: "x86_64"
env:
- GRUB_TARGETS="x86_64-efi x86_64-xen"
- name: "i386"
env:
- GRUB_TARGETS="i386-coreboot i386-efi i386-ieee1275 i386-multiboot i386-pc i386-qemu i386-xen i386-xen_pvh"
- name: "powerpc"
env:
- GRUB_TARGETS="powerpc-ieee1275"
- CROSS_TARGETS="powerpc64-linux"
- name: "sparc64"
env:
- GRUB_TARGETS="sparc64-ieee1275"
- CROSS_TARGETS="sparc64-linux"
- name: "ia64"
env:
- GRUB_TARGETS="ia64-efi"
- CROSS_TARGETS="ia64-linux"
- name: "mips"
env:
- GRUB_TARGETS="mips-arc mipsel-arc mipsel-qemu_mips mips-qemu_mips"
- CROSS_TARGETS="mips64-linux"
- name: "arm"
env:
- GRUB_TARGETS="arm-coreboot arm-efi arm-uboot"
- CROSS_TARGETS="arm-linux-gnueabi"
- name: "arm64"
env:
- GRUB_TARGETS="arm64-efi"
- CROSS_TARGETS="aarch64-linux"
- name: "riscv32"
env:
- GRUB_TARGETS="riscv32-efi"
- CROSS_TARGETS="riscv32-linux"
- name: "riscv64"
env:
- GRUB_TARGETS="riscv64-efi"
- CROSS_TARGETS="riscv64-linux"
+223
View File
@@ -0,0 +1,223 @@
1 Notes on the Free Translation Project
***************************************
Free software is going international! The Free Translation Project is
a way to get maintainers of free software, translators, and users all
together, so that free software will gradually become able to speak many
languages. A few packages already provide translations for their
messages.
If you found this `ABOUT-NLS' file inside a distribution, you may
assume that the distributed package does use GNU `gettext' internally,
itself available at your nearest GNU archive site. But you do _not_
need to install GNU `gettext' prior to configuring, installing or using
this package with messages translated.
Installers will find here some useful hints. These notes also
explain how users should proceed for getting the programs to use the
available translations. They tell how people wanting to contribute and
work on translations can contact the appropriate team.
When reporting bugs in the `intl/' directory or bugs which may be
related to internationalization, you should tell about the version of
`gettext' which is used. The information can be found in the
`intl/VERSION' file, in internationalized packages.
1.1 Quick configuration advice
==============================
If you want to exploit the full power of internationalization, you
should configure it using
./configure --with-included-gettext
to force usage of internationalizing routines provided within this
package, despite the existence of internationalizing capabilities in the
operating system where this package is being installed. So far, only
the `gettext' implementation in the GNU C library version 2 provides as
many features (such as locale alias, message inheritance, automatic
charset conversion or plural form handling) as the implementation here.
It is also not possible to offer this additional functionality on top
of a `catgets' implementation. Future versions of GNU `gettext' will
very likely convey even more functionality. So it might be a good idea
to change to GNU `gettext' as soon as possible.
So you need _not_ provide this option if you are using GNU libc 2 or
you have installed a recent copy of the GNU gettext package with the
included `libintl'.
1.2 INSTALL Matters
===================
Some packages are "localizable" when properly installed; the programs
they contain can be made to speak your own native language. Most such
packages use GNU `gettext'. Other packages have their own ways to
internationalization, predating GNU `gettext'.
By default, this package will be installed to allow translation of
messages. It will automatically detect whether the system already
provides the GNU `gettext' functions. If not, the included GNU
`gettext' library will be used. This library is wholly contained
within this package, usually in the `intl/' subdirectory, so prior
installation of the GNU `gettext' package is _not_ required.
Installers may use special options at configuration time for changing
the default behaviour. The commands:
./configure --with-included-gettext
./configure --disable-nls
will, respectively, bypass any pre-existing `gettext' to use the
internationalizing routines provided within this package, or else,
_totally_ disable translation of messages.
When you already have GNU `gettext' installed on your system and run
configure without an option for your new package, `configure' will
probably detect the previously built and installed `libintl.a' file and
will decide to use this. This might not be desirable. You should use
the more recent version of the GNU `gettext' library. I.e. if the file
`intl/VERSION' shows that the library which comes with this package is
more recent, you should use
./configure --with-included-gettext
to prevent auto-detection.
The configuration process will not test for the `catgets' function
and therefore it will not be used. The reason is that even an
emulation of `gettext' on top of `catgets' could not provide all the
extensions of the GNU `gettext' library.
Internationalized packages usually have many `po/LL.po' files, where
LL gives an ISO 639 two-letter code identifying the language. Unless
translations have been forbidden at `configure' time by using the
`--disable-nls' switch, all available translations are installed
together with the package. However, the environment variable `LINGUAS'
may be set, prior to configuration, to limit the installed set.
`LINGUAS' should then contain a space separated list of two-letter
codes, stating which languages are allowed.
1.3 Using This Package
======================
As a user, if your language has been installed for this package, you
only have to set the `LANG' environment variable to the appropriate
`LL_CC' combination. Here `LL' is an ISO 639 two-letter language code,
and `CC' is an ISO 3166 two-letter country code. For example, let's
suppose that you speak German and live in Germany. At the shell
prompt, merely execute `setenv LANG de_DE' (in `csh'),
`export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash').
This can be done from your `.login' or `.profile' file, once and for
all.
You might think that the country code specification is redundant.
But in fact, some languages have dialects in different countries. For
example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The
country code serves to distinguish the dialects.
The locale naming convention of `LL_CC', with `LL' denoting the
language and `CC' denoting the country, is the one use on systems based
on GNU libc. On other systems, some variations of this scheme are
used, such as `LL' or `LL_CC.ENCODING'. You can get the list of
locales supported by your system for your language by running the
command `locale -a | grep '^LL''.
Not all programs have translations for all languages. By default, an
English message is shown in place of a nonexistent translation. If you
understand other languages, you can set up a priority list of languages.
This is done through a different environment variable, called
`LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG'
for the purpose of message handling, but you still need to have `LANG'
set to the primary language; this is required by other parts of the
system libraries. For example, some Swedish users who would rather
read translations in German than English for when Swedish is not
available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'.
Special advice for Norwegian users: The language code for Norwegian
bokma*l changed from `no' to `nb' recently (in 2003). During the
transition period, while some message catalogs for this language are
installed under `nb' and some older ones under `no', it's recommended
for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and
older translations are used.
In the `LANGUAGE' environment variable, but not in the `LANG'
environment variable, `LL_CC' combinations can be abbreviated as `LL'
to denote the language's main dialect. For example, `de' is equivalent
to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT'
(Portuguese as spoken in Portugal) in this context.
1.4 Translating Teams
=====================
For the Free Translation Project to be a success, we need interested
people who like their own language and write it well, and who are also
able to synergize with other translators speaking the same language.
Each translation team has its own mailing list. The up-to-date list of
teams can be found at the Free Translation Project's homepage,
`http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National teams"
area.
If you'd like to volunteer to _work_ at translating messages, you
should become a member of the translating team for your own language.
The subscribing address is _not_ the same as the list itself, it has
`-request' appended. For example, speakers of Swedish can send a
message to `sv-request@li.org', having this message body:
subscribe
Keep in mind that team members are expected to participate
_actively_ in translations, or at solving translational difficulties,
rather than merely lurking around. If your team does not exist yet and
you want to start one, or if you are unsure about what to do or how to
get started, please write to `translation@iro.umontreal.ca' to reach the
coordinator for all translator teams.
The English team is special. It works at improving and uniformizing
the terminology in use. Proven linguistic skills are praised more than
programming skills, here.
1.5 Available Packages
======================
Languages are not equally supported in all packages. The following
matrix shows the current state of internationalization, as of October
2006. The matrix shows, in regard of each package, for which languages
PO files have been submitted to translation coordination, with a
translation percentage of at least 50%.
# Matrix here is removed!
Some counters in the preceding matrix are higher than the number of
visible blocks let us expect. This is because a few extra PO files are
used for implementing regional variants of languages, or language
dialects.
For a PO file in the matrix above to be effective, the package to
which it applies should also have been internationalized and
distributed as such by its maintainer. There might be an observable
lag between the mere existence a PO file and its wide availability in a
distribution.
If October 2006 seems to be old, you may fetch a more recent copy of
this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date
matrix with full percentage details can be found at
`http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'.
1.6 Using `gettext' in new packages
===================================
If you are writing a freely available program and want to
internationalize it you are welcome to use GNU `gettext' in your
package. Of course you have to respect the GNU Library General Public
License which covers the use of the GNU `gettext' library. This means
in particular that even non-free programs can use `libintl' as a shared
library, whereas only free software can use `libintl' as a static
library or use modified versions of `libintl'.
Once the sources are changed appropriately and the setup can handle
the use of `gettext' the only thing missing are the translations. The
Free Translation Project is also available for packages which are not
developed inside the GNU project. Therefore the information given above
applies also for every other Free Software Project. Contact
`translation@iro.umontreal.ca' to make the `.pot' files available to
the translation teams.
+10 -12
View File
@@ -37,7 +37,6 @@ configuring the GRUB.
* GNU gettext 0.17 or later * GNU gettext 0.17 or later
* GNU binutils 2.9.1.0.23 or later * GNU binutils 2.9.1.0.23 or later
* Flex 2.5.35 or later * Flex 2.5.35 or later
* pkg-config
* Other standard GNU/Unix tools * Other standard GNU/Unix tools
* a libc with large file support (e.g. glibc 2.1 or later) * a libc with large file support (e.g. glibc 2.1 or later)
@@ -53,15 +52,15 @@ For optional grub-emu features, you need:
To build GRUB's graphical terminal (gfxterm), you need: To build GRUB's graphical terminal (gfxterm), you need:
* FreeType 2.1.5 or later * FreeType 2 or later
* GNU Unifont * GNU Unifont
If you use a development snapshot or want to hack on GRUB you may If you use a development snapshot or want to hack on GRUB you may
need the following. need the following.
* Python 2.6 or later * Python 2.6 or later
* Autoconf 2.63 or later * Autoconf 2.60 or later
* Automake 1.11 or later * Automake 1.10.1 or later
Prerequisites for make-check: Prerequisites for make-check:
@@ -102,11 +101,10 @@ The simplest way to compile this package is:
2. Skip this and following step if you use release tarball and proceed to 2. Skip this and following step if you use release tarball and proceed to
step 4. If you want translations type `./linguas.sh'. step 4. If you want translations type `./linguas.sh'.
3. Type `./bootstrap'. 3. Type `./autogen.sh'.
* autogen.sh (called by bootstrap) uses python. By default the * autogen.sh uses python. By default invocation is "python" but can be
invocation is "python", but it can be overridden by setting the overriden by setting variable $PYTHON.
variable $PYTHON.
4. Type `./configure' to configure the package for your system. 4. Type `./configure' to configure the package for your system.
If you're using `csh' on an old version of System V, you might If you're using `csh' on an old version of System V, you might
@@ -160,8 +158,8 @@ For this example the configure line might look like (more details below)
(some options are optional and included here for completeness but some rarely (some options are optional and included here for completeness but some rarely
used options are omitted): used options are omitted):
./configure BUILD_CC=gcc BUILD_PKG_CONFIG=pkg-config --host=amd64-linux-gnu ./configure BUILD_CC=gcc BUILD_FREETYPE=freetype-config --host=amd64-linux-gnu
CC=amd64-linux-gnu-gcc CFLAGS="-g -O2" PKG_CONFIG=amd64-linux-gnu-pkg-config CC=amd64-linux-gnu-gcc CFLAGS="-g -O2" FREETYPE=amd64-linux-gnu-freetype-config
--target=arm --with-platform=uboot TARGET_CC=arm-elf-gcc --target=arm --with-platform=uboot TARGET_CC=arm-elf-gcc
TARGET_CFLAGS="-Os -march=armv6" TARGET_CCASFLAGS="-march=armv6" TARGET_CFLAGS="-Os -march=armv6" TARGET_CCASFLAGS="-march=armv6"
TARGET_OBJCOPY="arm-elf-objcopy" TARGET_STRIP="arm-elf-strip" TARGET_OBJCOPY="arm-elf-objcopy" TARGET_STRIP="arm-elf-strip"
@@ -178,7 +176,7 @@ corresponding platform are not needed for the platform in question.
2. BUILD_CFLAGS= for C options for build. 2. BUILD_CFLAGS= for C options for build.
3. BUILD_CPPFLAGS= for C preprocessor options for build. 3. BUILD_CPPFLAGS= for C preprocessor options for build.
4. BUILD_LDFLAGS= for linker options for build. 4. BUILD_LDFLAGS= for linker options for build.
5. BUILD_PKG_CONFIG= for pkg-config for build (optional). 5. BUILD_FREETYPE= for freetype-config for build (optional).
- For host - For host
1. --host= to autoconf name of host. 1. --host= to autoconf name of host.
@@ -186,7 +184,7 @@ corresponding platform are not needed for the platform in question.
3. HOST_CFLAGS= for C options for host. 3. HOST_CFLAGS= for C options for host.
4. HOST_CPPFLAGS= for C preprocessor options for host. 4. HOST_CPPFLAGS= for C preprocessor options for host.
5. HOST_LDFLAGS= for linker options for host. 5. HOST_LDFLAGS= for linker options for host.
6. PKG_CONFIG= for pkg-config for host (optional). 6. FREETYPE= for freetype-config for host (optional).
7. Libdevmapper if any must be in standard linker folders (-ldevmapper) (optional). 7. Libdevmapper if any must be in standard linker folders (-ldevmapper) (optional).
8. Libfuse if any must be in standard linker folders (-lfuse) (optional). 8. Libfuse if any must be in standard linker folders (-lfuse) (optional).
9. Libzfs if any must be in standard linker folders (-lzfs) (optional). 9. Libzfs if any must be in standard linker folders (-lzfs) (optional).
+6 -12
View File
@@ -1,7 +1,7 @@
AUTOMAKE_OPTIONS = subdir-objects -Wno-portability AUTOMAKE_OPTIONS = subdir-objects -Wno-portability
DEPDIR = .deps-util DEPDIR = .deps-util
SUBDIRS = grub-core/lib/gnulib . SUBDIRS = grub-core/gnulib .
if COND_real_platform if COND_real_platform
SUBDIRS += grub-core SUBDIRS += grub-core
endif endif
@@ -71,7 +71,7 @@ endif
starfield_theme_files = $(srcdir)/themes/starfield/blob_w.png $(srcdir)/themes/starfield/boot_menu_c.png $(srcdir)/themes/starfield/boot_menu_e.png $(srcdir)/themes/starfield/boot_menu_ne.png $(srcdir)/themes/starfield/boot_menu_n.png $(srcdir)/themes/starfield/boot_menu_nw.png $(srcdir)/themes/starfield/boot_menu_se.png $(srcdir)/themes/starfield/boot_menu_s.png $(srcdir)/themes/starfield/boot_menu_sw.png $(srcdir)/themes/starfield/boot_menu_w.png $(srcdir)/themes/starfield/slider_c.png $(srcdir)/themes/starfield/slider_n.png $(srcdir)/themes/starfield/slider_s.png $(srcdir)/themes/starfield/starfield.png $(srcdir)/themes/starfield/terminal_box_c.png $(srcdir)/themes/starfield/terminal_box_e.png $(srcdir)/themes/starfield/terminal_box_ne.png $(srcdir)/themes/starfield/terminal_box_n.png $(srcdir)/themes/starfield/terminal_box_nw.png $(srcdir)/themes/starfield/terminal_box_se.png $(srcdir)/themes/starfield/terminal_box_s.png $(srcdir)/themes/starfield/terminal_box_sw.png $(srcdir)/themes/starfield/terminal_box_w.png $(srcdir)/themes/starfield/theme.txt $(srcdir)/themes/starfield/README $(srcdir)/themes/starfield/COPYING.CC-BY-SA-3.0 starfield_theme_files = $(srcdir)/themes/starfield/blob_w.png $(srcdir)/themes/starfield/boot_menu_c.png $(srcdir)/themes/starfield/boot_menu_e.png $(srcdir)/themes/starfield/boot_menu_ne.png $(srcdir)/themes/starfield/boot_menu_n.png $(srcdir)/themes/starfield/boot_menu_nw.png $(srcdir)/themes/starfield/boot_menu_se.png $(srcdir)/themes/starfield/boot_menu_s.png $(srcdir)/themes/starfield/boot_menu_sw.png $(srcdir)/themes/starfield/boot_menu_w.png $(srcdir)/themes/starfield/slider_c.png $(srcdir)/themes/starfield/slider_n.png $(srcdir)/themes/starfield/slider_s.png $(srcdir)/themes/starfield/starfield.png $(srcdir)/themes/starfield/terminal_box_c.png $(srcdir)/themes/starfield/terminal_box_e.png $(srcdir)/themes/starfield/terminal_box_ne.png $(srcdir)/themes/starfield/terminal_box_n.png $(srcdir)/themes/starfield/terminal_box_nw.png $(srcdir)/themes/starfield/terminal_box_se.png $(srcdir)/themes/starfield/terminal_box_s.png $(srcdir)/themes/starfield/terminal_box_sw.png $(srcdir)/themes/starfield/terminal_box_w.png $(srcdir)/themes/starfield/theme.txt $(srcdir)/themes/starfield/README $(srcdir)/themes/starfield/COPYING.CC-BY-SA-3.0
build-grub-mkfont$(BUILD_EXEEXT): util/grub-mkfont.c grub-core/unidata.c grub-core/kern/emu/misc.c util/misc.c build-grub-mkfont$(BUILD_EXEEXT): util/grub-mkfont.c grub-core/unidata.c grub-core/kern/emu/misc.c util/misc.c
$(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 -DGRUB_BUILD_PROGRAM_NAME=\"build-grub-mkfont\" $^ $(BUILD_FREETYPE_CFLAGS) $(BUILD_FREETYPE_LIBS) $(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 -DGRUB_BUILD_PROGRAM_NAME=\"build-grub-mkfont\" $^ $(build_freetype_cflags) $(build_freetype_libs)
CLEANFILES += build-grub-mkfont$(BUILD_EXEEXT) CLEANFILES += build-grub-mkfont$(BUILD_EXEEXT)
garbage-gen$(BUILD_EXEEXT): util/garbage-gen.c garbage-gen$(BUILD_EXEEXT): util/garbage-gen.c
@@ -80,11 +80,11 @@ CLEANFILES += garbage-gen$(BUILD_EXEEXT)
EXTRA_DIST += util/garbage-gen.c EXTRA_DIST += util/garbage-gen.c
build-grub-gen-asciih$(BUILD_EXEEXT): util/grub-gen-asciih.c build-grub-gen-asciih$(BUILD_EXEEXT): util/grub-gen-asciih.c
$(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 $^ $(BUILD_FREETYPE_CFLAGS) $(BUILD_FREETYPE_LIBS) -Wall -Werror $(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 $^ $(build_freetype_cflags) $(build_freetype_libs) -Wall -Werror
CLEANFILES += build-grub-gen-asciih$(BUILD_EXEEXT) CLEANFILES += build-grub-gen-asciih$(BUILD_EXEEXT)
build-grub-gen-widthspec$(BUILD_EXEEXT): util/grub-gen-widthspec.c build-grub-gen-widthspec$(BUILD_EXEEXT): util/grub-gen-widthspec.c
$(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 $^ $(BUILD_FREETYPE_CFLAGS) $(BUILD_FREETYPE_LIBS) -Wall -Werror $(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 $^ $(build_freetype_cflags) $(build_freetype_libs) -Wall -Werror
CLEANFILES += build-grub-gen-widthspec$(BUILD_EXEEXT) CLEANFILES += build-grub-gen-widthspec$(BUILD_EXEEXT)
if COND_STARFIELD if COND_STARFIELD
@@ -422,10 +422,9 @@ BOOTCHECK_TIMEOUT=180
bootcheck: $(BOOTCHECKS) bootcheck: $(BOOTCHECKS)
if COND_i386_coreboot if COND_i386_coreboot
FS_PAYLOAD_MODULES ?= $(shell cat grub-core/fs.lst)
default_payload.elf: grub-mkstandalone grub-mkimage FORCE default_payload.elf: grub-mkstandalone grub-mkimage FORCE
test -f $@ && rm $@ || true test -f $@ && rm $@ || true
pkgdatadir=. ./grub-mkstandalone --grub-mkimage=./grub-mkimage -O i386-coreboot -o $@ --modules='ahci pata ehci uhci ohci usb_keyboard usbms part_msdos ext2 fat at_keyboard part_gpt usbserial_usbdebug cbfs' --install-modules='ls linux search configfile normal cbtime cbls memrw iorw minicmd lsmmap lspci halt reboot hexdump pcidump regexp setpci lsacpi chain test serial multiboot cbmemc linux16 gzio echo help syslinuxcfg xnu $(FS_PAYLOAD_MODULES) password_pbkdf2 $(EXTRA_PAYLOAD_MODULES)' --fonts= --themes= --locales= -d grub-core/ /boot/grub/grub.cfg=$(srcdir)/coreboot.cfg pkgdatadir=. ./grub-mkstandalone --grub-mkimage=./grub-mkimage -O i386-coreboot -o $@ --modules='ahci pata ehci uhci ohci usb_keyboard usbms part_msdos ext2 fat at_keyboard part_gpt usbserial_usbdebug cbfs' --install-modules='ls linux search configfile normal cbtime cbls memrw iorw minicmd lsmmap lspci halt reboot hexdump pcidump regexp setpci lsacpi chain test serial multiboot cbmemc linux16 gzio echo help syslinuxcfg xnu $(shell cat grub-core/fs.lst) password_pbkdf2 $(EXTRA_PAYLOAD_MODULES)' --fonts= --themes= --locales= -d grub-core/ /boot/grub/grub.cfg=$(srcdir)/coreboot.cfg
endif endif
endif endif
@@ -477,11 +476,6 @@ EXTRA_DIST += ChangeLog ChangeLog-2015
syslinux_test: $(top_builddir)/config.status tests/syslinux/ubuntu10.04_grub.cfg syslinux_test: $(top_builddir)/config.status tests/syslinux/ubuntu10.04_grub.cfg
# Mimic simplify_filename from grub-core/lib/syslinux_parse.c, so that we
# can predict its behaviour in tests. We have to pre-substitute this before
# calling config.status, as config.status offers no reliable way to hook in
# a command between setting ac_abs_top_srcdir and emitting output files.
tests/syslinux/ubuntu10.04_grub.cfg: $(top_builddir)/config.status tests/syslinux/ubuntu10.04_grub.cfg.in tests/syslinux/ubuntu10.04_grub.cfg: $(top_builddir)/config.status tests/syslinux/ubuntu10.04_grub.cfg.in
simplified_abs_top_srcdir=`echo "$(abs_top_srcdir)" | sed 's,//,/,g; s,/\./,/,g; :loop; s,/[^/][^/]*/\.\.\(/\|$$\),\1,; t loop'`; \ (for x in tests/syslinux/ubuntu10.04_grub.cfg.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:-
sed "s,@simplified_abs_top_srcdir@,$$simplified_abs_top_srcdir,g" $(srcdir)/tests/syslinux/ubuntu10.04_grub.cfg.in | $(top_builddir)/config.status --file=$@:-
CLEANFILES += tests/syslinux/ubuntu10.04_grub.cfg CLEANFILES += tests/syslinux/ubuntu10.04_grub.cfg
+31 -47
View File
@@ -54,7 +54,7 @@ library = {
library = { library = {
name = libgrubmods.a; name = libgrubmods.a;
cflags = '-fno-builtin -Wno-undef'; cflags = '-fno-builtin -Wno-undef';
cppflags = '-I$(srcdir)/grub-core/lib/minilzo -I$(srcdir)/grub-core/lib/xzembed -I$(srcdir)/grub-core/lib/zstd -DMINILZO_HAVE_CONFIG_H'; cppflags = '-I$(top_srcdir)/grub-core/lib/minilzo -I$(srcdir)/grub-core/lib/xzembed -DMINILZO_HAVE_CONFIG_H';
common_nodist = grub_script.tab.c; common_nodist = grub_script.tab.c;
common_nodist = grub_script.yy.c; common_nodist = grub_script.yy.c;
@@ -99,7 +99,6 @@ library = {
common = grub-core/fs/ext2.c; common = grub-core/fs/ext2.c;
common = grub-core/fs/fat.c; common = grub-core/fs/fat.c;
common = grub-core/fs/exfat.c; common = grub-core/fs/exfat.c;
common = grub-core/fs/f2fs.c;
common = grub-core/fs/fshelp.c; common = grub-core/fs/fshelp.c;
common = grub-core/fs/hfs.c; common = grub-core/fs/hfs.c;
common = grub-core/fs/hfsplus.c; common = grub-core/fs/hfsplus.c;
@@ -165,15 +164,6 @@ library = {
common = grub-core/lib/xzembed/xz_dec_bcj.c; common = grub-core/lib/xzembed/xz_dec_bcj.c;
common = grub-core/lib/xzembed/xz_dec_lzma2.c; common = grub-core/lib/xzembed/xz_dec_lzma2.c;
common = grub-core/lib/xzembed/xz_dec_stream.c; common = grub-core/lib/xzembed/xz_dec_stream.c;
common = grub-core/lib/zstd/debug.c;
common = grub-core/lib/zstd/entropy_common.c;
common = grub-core/lib/zstd/error_private.c;
common = grub-core/lib/zstd/fse_decompress.c;
common = grub-core/lib/zstd/huf_decompress.c;
common = grub-core/lib/zstd/module.c;
common = grub-core/lib/zstd/xxhash.c;
common = grub-core/lib/zstd/zstd_common.c;
common = grub-core/lib/zstd/zstd_decompress.c;
}; };
program = { program = {
@@ -198,7 +188,7 @@ program = {
ldadd = libgrubmods.a; ldadd = libgrubmods.a;
ldadd = libgrubgcry.a; ldadd = libgrubgcry.a;
ldadd = libgrubkern.a; ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBLZMA)'; ldadd = '$(LIBLZMA)';
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
cppflags = '-DGRUB_PKGLIBDIR=\"$(pkglibdir)\"'; cppflags = '-DGRUB_PKGLIBDIR=\"$(pkglibdir)\"';
@@ -215,7 +205,7 @@ program = {
ldadd = libgrubmods.a; ldadd = libgrubmods.a;
ldadd = libgrubgcry.a; ldadd = libgrubgcry.a;
ldadd = libgrubkern.a; ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
}; };
@@ -230,7 +220,7 @@ program = {
ldadd = libgrubmods.a; ldadd = libgrubmods.a;
ldadd = libgrubgcry.a; ldadd = libgrubgcry.a;
ldadd = libgrubkern.a; ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
}; };
@@ -245,7 +235,7 @@ program = {
ldadd = libgrubmods.a; ldadd = libgrubmods.a;
ldadd = libgrubgcry.a; ldadd = libgrubgcry.a;
ldadd = libgrubkern.a; ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
}; };
@@ -261,7 +251,7 @@ program = {
ldadd = libgrubmods.a; ldadd = libgrubmods.a;
ldadd = libgrubgcry.a; ldadd = libgrubgcry.a;
ldadd = libgrubkern.a; ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
}; };
@@ -284,7 +274,7 @@ program = {
ldadd = libgrubmods.a; ldadd = libgrubmods.a;
ldadd = libgrubgcry.a; ldadd = libgrubgcry.a;
ldadd = libgrubkern.a; ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
}; };
@@ -300,7 +290,7 @@ program = {
ldadd = libgrubmods.a; ldadd = libgrubmods.a;
ldadd = libgrubgcry.a; ldadd = libgrubgcry.a;
ldadd = libgrubkern.a; ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) -lfuse'; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) -lfuse';
condition = COND_GRUB_MOUNT; condition = COND_GRUB_MOUNT;
}; };
@@ -312,14 +302,14 @@ program = {
common = grub-core/kern/emu/argp_common.c; common = grub-core/kern/emu/argp_common.c;
common = grub-core/osdep/init.c; common = grub-core/osdep/init.c;
cflags = '$(FREETYPE_CFLAGS)'; cflags = '$(freetype_cflags)';
cppflags = '-DGRUB_MKFONT=1'; cppflags = '-DGRUB_MKFONT=1';
ldadd = libgrubmods.a; ldadd = libgrubmods.a;
ldadd = libgrubgcry.a; ldadd = libgrubgcry.a;
ldadd = libgrubkern.a; ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(FREETYPE_LIBS)'; ldadd = '$(freetype_libs)';
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
condition = COND_GRUB_MKFONT; condition = COND_GRUB_MKFONT;
}; };
@@ -337,7 +327,7 @@ program = {
ldadd = libgrubmods.a; ldadd = libgrubmods.a;
ldadd = libgrubgcry.a; ldadd = libgrubgcry.a;
ldadd = libgrubkern.a; ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
}; };
@@ -359,7 +349,7 @@ program = {
ldadd = libgrubmods.a; ldadd = libgrubmods.a;
ldadd = libgrubkern.a; ldadd = libgrubkern.a;
ldadd = libgrubgcry.a; ldadd = libgrubgcry.a;
ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
cppflags = '-DGRUB_SETUP_FUNC=grub_util_bios_setup'; cppflags = '-DGRUB_SETUP_FUNC=grub_util_bios_setup';
}; };
@@ -379,7 +369,7 @@ program = {
ldadd = libgrubmods.a; ldadd = libgrubmods.a;
ldadd = libgrubkern.a; ldadd = libgrubkern.a;
ldadd = libgrubgcry.a; ldadd = libgrubgcry.a;
ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
cppflags = '-DGRUB_SETUP_FUNC=grub_util_sparc_setup'; cppflags = '-DGRUB_SETUP_FUNC=grub_util_sparc_setup';
}; };
@@ -395,7 +385,7 @@ program = {
ldadd = libgrubmods.a; ldadd = libgrubmods.a;
ldadd = libgrubgcry.a; ldadd = libgrubgcry.a;
ldadd = libgrubkern.a; ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
}; };
@@ -410,7 +400,7 @@ program = {
ldadd = libgrubmods.a; ldadd = libgrubmods.a;
ldadd = libgrubgcry.a; ldadd = libgrubgcry.a;
ldadd = libgrubkern.a; ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
}; };
@@ -425,7 +415,7 @@ program = {
ldadd = libgrubmods.a; ldadd = libgrubmods.a;
ldadd = libgrubgcry.a; ldadd = libgrubgcry.a;
ldadd = libgrubkern.a; ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
}; };
@@ -552,7 +542,7 @@ program = {
ldadd = libgrubmods.a; ldadd = libgrubmods.a;
ldadd = libgrubgcry.a; ldadd = libgrubgcry.a;
ldadd = libgrubkern.a; ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
condition = COND_HAVE_EXEC; condition = COND_HAVE_EXEC;
@@ -599,7 +589,7 @@ program = {
ldadd = libgrubmods.a; ldadd = libgrubmods.a;
ldadd = libgrubgcry.a; ldadd = libgrubgcry.a;
ldadd = libgrubkern.a; ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
}; };
@@ -638,7 +628,7 @@ program = {
ldadd = libgrubmods.a; ldadd = libgrubmods.a;
ldadd = libgrubgcry.a; ldadd = libgrubgcry.a;
ldadd = libgrubkern.a; ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
}; };
@@ -674,7 +664,7 @@ program = {
ldadd = libgrubmods.a; ldadd = libgrubmods.a;
ldadd = libgrubgcry.a; ldadd = libgrubgcry.a;
ldadd = libgrubkern.a; ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
}; };
@@ -784,12 +774,6 @@ script = {
common = tests/xfs_test.in; common = tests/xfs_test.in;
}; };
script = {
testcase;
name = f2fs_test;
common = tests/f2fs_test.in;
};
script = { script = {
testcase; testcase;
name = nilfs2_test; name = nilfs2_test;
@@ -1204,7 +1188,7 @@ program = {
ldadd = libgrubmods.a; ldadd = libgrubmods.a;
ldadd = libgrubgcry.a; ldadd = libgrubgcry.a;
ldadd = libgrubkern.a; ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; ldadd = '$(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
}; };
@@ -1219,7 +1203,7 @@ program = {
ldadd = libgrubmods.a; ldadd = libgrubmods.a;
ldadd = libgrubgcry.a; ldadd = libgrubgcry.a;
ldadd = libgrubkern.a; ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; ldadd = '$(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
}; };
@@ -1234,7 +1218,7 @@ program = {
ldadd = libgrubmods.a; ldadd = libgrubmods.a;
ldadd = libgrubgcry.a; ldadd = libgrubgcry.a;
ldadd = libgrubkern.a; ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; ldadd = '$(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
}; };
@@ -1250,7 +1234,7 @@ program = {
ldadd = libgrubmods.a; ldadd = libgrubmods.a;
ldadd = libgrubgcry.a; ldadd = libgrubgcry.a;
ldadd = libgrubkern.a; ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; ldadd = '$(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
condition = COND_HAVE_CXX; condition = COND_HAVE_CXX;
}; };
@@ -1266,7 +1250,7 @@ program = {
ldadd = libgrubmods.a; ldadd = libgrubmods.a;
ldadd = libgrubgcry.a; ldadd = libgrubgcry.a;
ldadd = libgrubkern.a; ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; ldadd = '$(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
}; };
@@ -1281,7 +1265,7 @@ program = {
ldadd = libgrubmods.a; ldadd = libgrubmods.a;
ldadd = libgrubgcry.a; ldadd = libgrubgcry.a;
ldadd = libgrubkern.a; ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
}; };
@@ -1299,7 +1283,7 @@ program = {
ldadd = libgrubmods.a; ldadd = libgrubmods.a;
ldadd = libgrubgcry.a; ldadd = libgrubgcry.a;
ldadd = libgrubkern.a; ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
}; };
@@ -1315,7 +1299,7 @@ program = {
ldadd = libgrubmods.a; ldadd = libgrubmods.a;
ldadd = libgrubgcry.a; ldadd = libgrubgcry.a;
ldadd = libgrubkern.a; ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
}; };
@@ -1333,7 +1317,7 @@ program = {
ldadd = libgrubmods.a; ldadd = libgrubmods.a;
ldadd = libgrubgcry.a; ldadd = libgrubgcry.a;
ldadd = libgrubkern.a; ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
}; };
@@ -1362,6 +1346,6 @@ program = {
ldadd = libgrubmods.a; ldadd = libgrubmods.a;
ldadd = libgrubgcry.a; ldadd = libgrubgcry.a;
ldadd = libgrubkern.a; ldadd = libgrubkern.a;
ldadd = grub-core/lib/gnulib/libgnu.a; ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
}; };
+3 -19
View File
@@ -2,18 +2,13 @@
set -e set -e
if [ ! -e grub-core/lib/gnulib/stdlib.in.h ]; then
echo "Gnulib not yet bootstrapped; run ./bootstrap instead." >&2
exit 1
fi
# Set ${PYTHON} to plain 'python' if not set already # Set ${PYTHON} to plain 'python' if not set already
: ${PYTHON:=python} : ${PYTHON:=python}
export LC_COLLATE=C export LC_COLLATE=C
unset LC_ALL 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' |sort > po/POTFILES.in
find util -iname '*.in' ! -name Makefile.in |sort > po/POTFILES-shell.in find util -iname '*.in' ! -name Makefile.in |sort > po/POTFILES-shell.in
echo "Importing unicode..." echo "Importing unicode..."
@@ -87,17 +82,6 @@ done
echo "Saving timestamps..." echo "Saving timestamps..."
echo timestamp > stamp-h.in echo timestamp > stamp-h.in
if [ -z "$FROM_BOOTSTRAP" ]; then echo "Running autoreconf..."
# Unaided autoreconf is likely to install older versions of many files autoreconf -vi
# than the ones provided by Gnulib, but in most cases this won't matter
# very much. This mode is provided so that you can run ./autogen.sh to
# regenerate the GRUB build system in an unpacked release tarball (perhaps
# after patching it), even on systems that don't have access to
# gnulib.git.
echo "Running autoreconf..."
cp -a INSTALL INSTALL.grub
autoreconf -vif
mv INSTALL.grub INSTALL
fi
exit 0 exit 0
-1073
View File
File diff suppressed because it is too large. Load diff
-91
View File
@@ -1,91 +0,0 @@
# 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 <https://www.gnu.org/licenses/>.
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
}
+690
View File
@@ -0,0 +1,690 @@
#! /bin/sh
# Output a system dependent set of variables, describing how to set the
# run time search path of shared libraries in an executable.
#
# Copyright 1996-2013 Free Software Foundation, Inc.
# Taken from GNU libtool, 2001
# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
#
# 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 first argument passed to this file is the canonical host specification,
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
# or
# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld
# should be set by the caller.
#
# The set of defined variables is at the end of this script.
# Known limitations:
# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer
# than 256 bytes, otherwise the compiler driver will dump core. The only
# known workaround is to choose shorter directory names for the build
# directory and/or the installation directory.
# All known linkers require a '.a' archive for static linking (except MSVC,
# which needs '.lib').
libext=a
shrext=.so
host="$1"
host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
# Code taken from libtool.m4's _LT_CC_BASENAME.
for cc_temp in $CC""; do
case $cc_temp in
compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
\-*) ;;
*) break;;
esac
done
cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'`
# Code taken from libtool.m4's _LT_COMPILER_PIC.
wl=
if test "$GCC" = yes; then
wl='-Wl,'
else
case "$host_os" in
aix*)
wl='-Wl,'
;;
mingw* | cygwin* | pw32* | os2* | cegcc*)
;;
hpux9* | hpux10* | hpux11*)
wl='-Wl,'
;;
irix5* | irix6* | nonstopux*)
wl='-Wl,'
;;
linux* | k*bsd*-gnu | kopensolaris*-gnu)
case $cc_basename in
ecc*)
wl='-Wl,'
;;
icc* | ifort*)
wl='-Wl,'
;;
lf95*)
wl='-Wl,'
;;
nagfor*)
wl='-Wl,-Wl,,'
;;
pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
wl='-Wl,'
;;
ccc*)
wl='-Wl,'
;;
xl* | bgxl* | bgf* | mpixl*)
wl='-Wl,'
;;
como)
wl='-lopt='
;;
*)
case `$CC -V 2>&1 | sed 5q` in
*Sun\ F* | *Sun*Fortran*)
wl=
;;
*Sun\ C*)
wl='-Wl,'
;;
esac
;;
esac
;;
newsos6)
;;
*nto* | *qnx*)
;;
osf3* | osf4* | osf5*)
wl='-Wl,'
;;
rdos*)
;;
solaris*)
case $cc_basename in
f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
wl='-Qoption ld '
;;
*)
wl='-Wl,'
;;
esac
;;
sunos4*)
wl='-Qoption ld '
;;
sysv4 | sysv4.2uw2* | sysv4.3*)
wl='-Wl,'
;;
sysv4*MP*)
;;
sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
wl='-Wl,'
;;
unicos*)
wl='-Wl,'
;;
uts4*)
;;
esac
fi
# Code taken from libtool.m4's _LT_LINKER_SHLIBS.
hardcode_libdir_flag_spec=
hardcode_libdir_separator=
hardcode_direct=no
hardcode_minus_L=no
case "$host_os" in
cygwin* | mingw* | pw32* | cegcc*)
# FIXME: the MSVC++ port hasn't been tested in a loooong time
# When not using gcc, we currently assume that we are using
# Microsoft Visual C++.
if test "$GCC" != yes; then
with_gnu_ld=no
fi
;;
interix*)
# we just hope/assume this is gcc and not c89 (= MSVC++)
with_gnu_ld=yes
;;
openbsd*)
with_gnu_ld=no
;;
esac
ld_shlibs=yes
if test "$with_gnu_ld" = yes; then
# Set some defaults for GNU ld with shared library support. These
# are reset later if shared libraries are not supported. Putting them
# here allows them to be overridden if necessary.
# Unlike libtool, we use -rpath here, not --rpath, since the documented
# option of GNU ld is called -rpath, not --rpath.
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
case "$host_os" in
aix[3-9]*)
# On AIX/PPC, the GNU linker is very broken
if test "$host_cpu" != ia64; then
ld_shlibs=no
fi
;;
amigaos*)
case "$host_cpu" in
powerpc)
;;
m68k)
hardcode_libdir_flag_spec='-L$libdir'
hardcode_minus_L=yes
;;
esac
;;
beos*)
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
:
else
ld_shlibs=no
fi
;;
cygwin* | mingw* | pw32* | cegcc*)
# hardcode_libdir_flag_spec is actually meaningless, as there is
# no search path for DLLs.
hardcode_libdir_flag_spec='-L$libdir'
if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
:
else
ld_shlibs=no
fi
;;
haiku*)
;;
interix[3-9]*)
hardcode_direct=no
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
;;
gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
:
else
ld_shlibs=no
fi
;;
netbsd*)
;;
solaris*)
if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
ld_shlibs=no
elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
:
else
ld_shlibs=no
fi
;;
sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
case `$LD -v 2>&1` in
*\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
ld_shlibs=no
;;
*)
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
else
ld_shlibs=no
fi
;;
esac
;;
sunos4*)
hardcode_direct=yes
;;
*)
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
:
else
ld_shlibs=no
fi
;;
esac
if test "$ld_shlibs" = no; then
hardcode_libdir_flag_spec=
fi
else
case "$host_os" in
aix3*)
# Note: this linker hardcodes the directories in LIBPATH if there
# are no directories specified by -L.
hardcode_minus_L=yes
if test "$GCC" = yes; then
# Neither direct hardcoding nor static linking is supported with a
# broken collect2.
hardcode_direct=unsupported
fi
;;
aix[4-9]*)
if test "$host_cpu" = ia64; then
# On IA64, the linker does run time linking by default, so we don't
# have to do anything special.
aix_use_runtimelinking=no
else
aix_use_runtimelinking=no
# Test if we are trying to use run time linking or normal
# AIX style linking. If -brtl is somewhere in LDFLAGS, we
# need to do runtime linking.
case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
for ld_flag in $LDFLAGS; do
if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
aix_use_runtimelinking=yes
break
fi
done
;;
esac
fi
hardcode_direct=yes
hardcode_libdir_separator=':'
if test "$GCC" = yes; then
case $host_os in aix4.[012]|aix4.[012].*)
collect2name=`${CC} -print-prog-name=collect2`
if test -f "$collect2name" && \
strings "$collect2name" | grep resolve_lib_name >/dev/null
then
# We have reworked collect2
:
else
# We have old collect2
hardcode_direct=unsupported
hardcode_minus_L=yes
hardcode_libdir_flag_spec='-L$libdir'
hardcode_libdir_separator=
fi
;;
esac
fi
# Begin _LT_AC_SYS_LIBPATH_AIX.
echo 'int main () { return 0; }' > conftest.c
${CC} ${LDFLAGS} conftest.c -o conftest
aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
}'`
if test -z "$aix_libpath"; then
aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
}'`
fi
if test -z "$aix_libpath"; then
aix_libpath="/usr/lib:/lib"
fi
rm -f conftest.c conftest
# End _LT_AC_SYS_LIBPATH_AIX.
if test "$aix_use_runtimelinking" = yes; then
hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
else
if test "$host_cpu" = ia64; then
hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
else
hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
fi
fi
;;
amigaos*)
case "$host_cpu" in
powerpc)
;;
m68k)
hardcode_libdir_flag_spec='-L$libdir'
hardcode_minus_L=yes
;;
esac
;;
bsdi[45]*)
;;
cygwin* | mingw* | pw32* | cegcc*)
# When not using gcc, we currently assume that we are using
# Microsoft Visual C++.
# hardcode_libdir_flag_spec is actually meaningless, as there is
# no search path for DLLs.
hardcode_libdir_flag_spec=' '
libext=lib
;;
darwin* | rhapsody*)
hardcode_direct=no
if { case $cc_basename in ifort*) true;; *) test "$GCC" = yes;; esac; }; then
:
else
ld_shlibs=no
fi
;;
dgux*)
hardcode_libdir_flag_spec='-L$libdir'
;;
freebsd2.2*)
hardcode_libdir_flag_spec='-R$libdir'
hardcode_direct=yes
;;
freebsd2*)
hardcode_direct=yes
hardcode_minus_L=yes
;;
freebsd* | dragonfly*)
hardcode_libdir_flag_spec='-R$libdir'
hardcode_direct=yes
;;
hpux9*)
hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
hardcode_libdir_separator=:
hardcode_direct=yes
# hardcode_minus_L: Not really in the search PATH,
# but as the default location of the library.
hardcode_minus_L=yes
;;
hpux10*)
if test "$with_gnu_ld" = no; then
hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
hardcode_libdir_separator=:
hardcode_direct=yes
# hardcode_minus_L: Not really in the search PATH,
# but as the default location of the library.
hardcode_minus_L=yes
fi
;;
hpux11*)
if test "$with_gnu_ld" = no; then
hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
hardcode_libdir_separator=:
case $host_cpu in
hppa*64*|ia64*)
hardcode_direct=no
;;
*)
hardcode_direct=yes
# hardcode_minus_L: Not really in the search PATH,
# but as the default location of the library.
hardcode_minus_L=yes
;;
esac
fi
;;
irix5* | irix6* | nonstopux*)
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
hardcode_libdir_separator=:
;;
netbsd*)
hardcode_libdir_flag_spec='-R$libdir'
hardcode_direct=yes
;;
newsos6)
hardcode_direct=yes
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
hardcode_libdir_separator=:
;;
*nto* | *qnx*)
;;
openbsd*)
if test -f /usr/libexec/ld.so; then
hardcode_direct=yes
if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
else
case "$host_os" in
openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
hardcode_libdir_flag_spec='-R$libdir'
;;
*)
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
;;
esac
fi
else
ld_shlibs=no
fi
;;
os2*)
hardcode_libdir_flag_spec='-L$libdir'
hardcode_minus_L=yes
;;
osf3*)
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
hardcode_libdir_separator=:
;;
osf4* | osf5*)
if test "$GCC" = yes; then
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
else
# Both cc and cxx compiler support -rpath directly
hardcode_libdir_flag_spec='-rpath $libdir'
fi
hardcode_libdir_separator=:
;;
solaris*)
hardcode_libdir_flag_spec='-R$libdir'
;;
sunos4*)
hardcode_libdir_flag_spec='-L$libdir'
hardcode_direct=yes
hardcode_minus_L=yes
;;
sysv4)
case $host_vendor in
sni)
hardcode_direct=yes # is this really true???
;;
siemens)
hardcode_direct=no
;;
motorola)
hardcode_direct=no #Motorola manual says yes, but my tests say they lie
;;
esac
;;
sysv4.3*)
;;
sysv4*MP*)
if test -d /usr/nec; then
ld_shlibs=yes
fi
;;
sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
;;
sysv5* | sco3.2v5* | sco5v6*)
hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
hardcode_libdir_separator=':'
;;
uts4*)
hardcode_libdir_flag_spec='-L$libdir'
;;
*)
ld_shlibs=no
;;
esac
fi
# Check dynamic linker characteristics
# Code taken from libtool.m4's _LT_SYS_DYNAMIC_LINKER.
# Unlike libtool.m4, here we don't care about _all_ names of the library, but
# only about the one the linker finds when passed -lNAME. This is the last
# element of library_names_spec in libtool.m4, or possibly two of them if the
# linker has special search rules.
library_names_spec= # the last element of library_names_spec in libtool.m4
libname_spec='lib$name'
case "$host_os" in
aix3*)
library_names_spec='$libname.a'
;;
aix[4-9]*)
library_names_spec='$libname$shrext'
;;
amigaos*)
case "$host_cpu" in
powerpc*)
library_names_spec='$libname$shrext' ;;
m68k)
library_names_spec='$libname.a' ;;
esac
;;
beos*)
library_names_spec='$libname$shrext'
;;
bsdi[45]*)
library_names_spec='$libname$shrext'
;;
cygwin* | mingw* | pw32* | cegcc*)
shrext=.dll
library_names_spec='$libname.dll.a $libname.lib'
;;
darwin* | rhapsody*)
shrext=.dylib
library_names_spec='$libname$shrext'
;;
dgux*)
library_names_spec='$libname$shrext'
;;
freebsd* | dragonfly*)
case "$host_os" in
freebsd[123]*)
library_names_spec='$libname$shrext$versuffix' ;;
*)
library_names_spec='$libname$shrext' ;;
esac
;;
gnu*)
library_names_spec='$libname$shrext'
;;
haiku*)
library_names_spec='$libname$shrext'
;;
hpux9* | hpux10* | hpux11*)
case $host_cpu in
ia64*)
shrext=.so
;;
hppa*64*)
shrext=.sl
;;
*)
shrext=.sl
;;
esac
library_names_spec='$libname$shrext'
;;
interix[3-9]*)
library_names_spec='$libname$shrext'
;;
irix5* | irix6* | nonstopux*)
library_names_spec='$libname$shrext'
case "$host_os" in
irix5* | nonstopux*)
libsuff= shlibsuff=
;;
*)
case $LD in
*-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;;
*-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;;
*-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;;
*) libsuff= shlibsuff= ;;
esac
;;
esac
;;
linux*oldld* | linux*aout* | linux*coff*)
;;
linux* | k*bsd*-gnu | kopensolaris*-gnu)
library_names_spec='$libname$shrext'
;;
knetbsd*-gnu)
library_names_spec='$libname$shrext'
;;
netbsd*)
library_names_spec='$libname$shrext'
;;
newsos6)
library_names_spec='$libname$shrext'
;;
*nto* | *qnx*)
library_names_spec='$libname$shrext'
;;
openbsd*)
library_names_spec='$libname$shrext$versuffix'
;;
os2*)
libname_spec='$name'
shrext=.dll
library_names_spec='$libname.a'
;;
osf3* | osf4* | osf5*)
library_names_spec='$libname$shrext'
;;
rdos*)
;;
solaris*)
library_names_spec='$libname$shrext'
;;
sunos4*)
library_names_spec='$libname$shrext$versuffix'
;;
sysv4 | sysv4.3*)
library_names_spec='$libname$shrext'
;;
sysv4*MP*)
library_names_spec='$libname$shrext'
;;
sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
library_names_spec='$libname$shrext'
;;
tpf*)
library_names_spec='$libname$shrext'
;;
uts4*)
library_names_spec='$libname$shrext'
;;
esac
sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
# How to pass a linker flag through the compiler.
wl="$escaped_wl"
# Static library suffix (normally "a").
libext="$libext"
# Shared library suffix (normally "so").
shlibext="$shlibext"
# Format of library name prefix.
libname_spec="$escaped_libname_spec"
# Library names that the linker finds when passed -lNAME.
library_names_spec="$escaped_library_names_spec"
# Flag to hardcode \$libdir into a binary during linking.
# This must work even if \$libdir does not exist.
hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
# Whether we need a single -rpath flag with a separated argument.
hardcode_libdir_separator="$hardcode_libdir_separator"
# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
# resulting binary.
hardcode_direct="$hardcode_direct"
# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
# resulting binary.
hardcode_minus_L="$hardcode_minus_L"
EOF
+432
View File
@@ -0,0 +1,432 @@
eval '(exit $?0)' && eval 'exec perl -wS "$0" ${1+"$@"}'
& eval 'exec perl -wS "$0" $argv:q'
if 0;
# Convert git log output to ChangeLog format.
my $VERSION = '2012-07-29 06:11'; # UTC
# The definition above must lie within the first 8 lines in order
# for the Emacs time-stamp write hook (at end) to update it.
# If you change this file with Emacs, please let the write hook
# do its job. Otherwise, update this string manually.
# Copyright (C) 2008-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 <http://www.gnu.org/licenses/>.
# Written by Jim Meyering
use strict;
use warnings;
use Getopt::Long;
use POSIX qw(strftime);
(my $ME = $0) =~ s|.*/||;
# use File::Coda; # http://meyering.net/code/Coda/
END {
defined fileno STDOUT or return;
close STDOUT and return;
warn "$ME: failed to close standard output: $!\n";
$? ||= 1;
}
sub usage ($)
{
my ($exit_code) = @_;
my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR);
if ($exit_code != 0)
{
print $STREAM "Try '$ME --help' for more information.\n";
}
else
{
print $STREAM <<EOF;
Usage: $ME [OPTIONS] [ARGS]
Convert git log output to ChangeLog format. If present, any ARGS
are passed to "git log". To avoid ARGS being parsed as options to
$ME, they may be preceded by '--'.
OPTIONS:
--amend=FILE FILE maps from an SHA1 to perl code (i.e., s/old/new/) that
makes a change to SHA1's commit log text or metadata.
--append-dot append a dot to the first line of each commit message if
there is no other punctuation or blank at the end.
--no-cluster never cluster commit messages under the same date/author
header; the default is to cluster adjacent commit messages
if their headers are the same and neither commit message
contains multiple paragraphs.
--srcdir=DIR the root of the source tree, from which the .git/
directory can be derived.
--since=DATE convert only the logs since DATE;
the default is to convert all log entries.
--format=FMT set format string for commit subject and body;
see 'man git-log' for the list of format metacharacters;
the default is '%s%n%b%n'
--strip-tab remove one additional leading TAB from commit message lines.
--strip-cherry-pick remove data inserted by "git cherry-pick";
this includes the "cherry picked from commit ..." line,
and the possible final "Conflicts:" paragraph.
--help display this help and exit
--version output version information and exit
EXAMPLE:
$ME --since=2008-01-01 > ChangeLog
$ME -- -n 5 foo > last-5-commits-to-branch-foo
SPECIAL SYNTAX:
The following types of strings are interpreted specially when they appear
at the beginning of a log message line. They are not copied to the output.
Copyright-paperwork-exempt: Yes
Append the "(tiny change)" notation to the usual "date name email"
ChangeLog header to mark a change that does not require a copyright
assignment.
Co-authored-by: Joe User <user\@example.com>
List the specified name and email address on a second
ChangeLog header, denoting a co-author.
Signed-off-by: Joe User <user\@example.com>
These lines are simply elided.
In a FILE specified via --amend, comment lines (starting with "#") are ignored.
FILE must consist of <SHA,CODE+> pairs where SHA is a 40-byte SHA1 (alone on
a line) referring to a commit in the current project, and CODE refers to one
or more consecutive lines of Perl code. Pairs must be separated by one or
more blank line.
Here is sample input for use with --amend=FILE, from coreutils:
3a169f4c5d9159283548178668d2fae6fced3030
# fix typo in title:
s/all tile types/all file types/
1379ed974f1fa39b12e2ffab18b3f7a607082202
# Due to a bug in vc-dwim, I mis-attributed a patch by Paul to myself.
# Change the author to be Paul. Note the escaped "@":
s,Jim .*>,Paul Eggert <eggert\\\@cs.ucla.edu>,
EOF
}
exit $exit_code;
}
# If the string $S is a well-behaved file name, simply return it.
# If it contains white space, quotes, etc., quote it, and return the new string.
sub shell_quote($)
{
my ($s) = @_;
if ($s =~ m![^\w+/.,-]!)
{
# Convert each single quote to '\''
$s =~ s/\'/\'\\\'\'/g;
# Then single quote the string.
$s = "'$s'";
}
return $s;
}
sub quoted_cmd(@)
{
return join (' ', map {shell_quote $_} @_);
}
# Parse file F.
# Comment lines (starting with "#") are ignored.
# F must consist of <SHA,CODE+> pairs where SHA is a 40-byte SHA1
# (alone on a line) referring to a commit in the current project, and
# CODE refers to one or more consecutive lines of Perl code.
# Pairs must be separated by one or more blank line.
sub parse_amend_file($)
{
my ($f) = @_;
open F, '<', $f
or die "$ME: $f: failed to open for reading: $!\n";
my $fail;
my $h = {};
my $in_code = 0;
my $sha;
while (defined (my $line = <F>))
{
$line =~ /^\#/
and next;
chomp $line;
$line eq ''
and $in_code = 0, next;
if (!$in_code)
{
$line =~ /^([0-9a-fA-F]{40})$/
or (warn "$ME: $f:$.: invalid line; expected an SHA1\n"),
$fail = 1, next;
$sha = lc $1;
$in_code = 1;
exists $h->{$sha}
and (warn "$ME: $f:$.: duplicate SHA1\n"),
$fail = 1, next;
}
else
{
$h->{$sha} ||= '';
$h->{$sha} .= "$line\n";
}
}
close F;
$fail
and exit 1;
return $h;
}
# git_dir_option $SRCDIR
#
# From $SRCDIR, the --git-dir option to pass to git (none if $SRCDIR
# is undef). Return as a list (0 or 1 element).
sub git_dir_option($)
{
my ($srcdir) = @_;
my @res = ();
if (defined $srcdir)
{
my $qdir = shell_quote $srcdir;
my $cmd = "cd $qdir && git rev-parse --show-toplevel";
my $qcmd = shell_quote $cmd;
my $git_dir = qx($cmd);
defined $git_dir
or die "$ME: cannot run $qcmd: $!\n";
$? == 0
or die "$ME: $qcmd had unexpected exit code or signal ($?)\n";
chomp $git_dir;
push @res, "--git-dir=$git_dir/.git";
}
@res;
}
{
my $since_date;
my $format_string = '%s%n%b%n';
my $amend_file;
my $append_dot = 0;
my $cluster = 1;
my $strip_tab = 0;
my $strip_cherry_pick = 0;
my $srcdir;
GetOptions
(
help => sub { usage 0 },
version => sub { print "$ME version $VERSION\n"; exit },
'since=s' => \$since_date,
'format=s' => \$format_string,
'amend=s' => \$amend_file,
'append-dot' => \$append_dot,
'cluster!' => \$cluster,
'strip-tab' => \$strip_tab,
'strip-cherry-pick' => \$strip_cherry_pick,
'srcdir=s' => \$srcdir,
) or usage 1;
defined $since_date
and unshift @ARGV, "--since=$since_date";
# This is a hash that maps an SHA1 to perl code (i.e., s/old/new/)
# that makes a correction in the log or attribution of that commit.
my $amend_code = defined $amend_file ? parse_amend_file $amend_file : {};
my @cmd = ('git',
git_dir_option $srcdir,
qw(log --log-size),
'--pretty=format:%H:%ct %an <%ae>%n%n'.$format_string, @ARGV);
open PIPE, '-|', @cmd
or die ("$ME: failed to run '". quoted_cmd (@cmd) ."': $!\n"
. "(Is your Git too old? Version 1.5.1 or later is required.)\n");
my $prev_multi_paragraph;
my $prev_date_line = '';
my @prev_coauthors = ();
while (1)
{
defined (my $in = <PIPE>)
or last;
$in =~ /^log size (\d+)$/
or die "$ME:$.: Invalid line (expected log size):\n$in";
my $log_nbytes = $1;
my $log;
my $n_read = read PIPE, $log, $log_nbytes;
$n_read == $log_nbytes
or die "$ME:$.: unexpected EOF\n";
# Extract leading hash.
my ($sha, $rest) = split ':', $log, 2;
defined $sha
or die "$ME:$.: malformed log entry\n";
$sha =~ /^[0-9a-fA-F]{40}$/
or die "$ME:$.: invalid SHA1: $sha\n";
# If this commit's log requires any transformation, do it now.
my $code = $amend_code->{$sha};
if (defined $code)
{
eval 'use Safe';
my $s = new Safe;
# Put the unpreprocessed entry into "$_".
$_ = $rest;
# Let $code operate on it, safely.
my $r = $s->reval("$code")
or die "$ME:$.:$sha: failed to eval \"$code\":\n$@\n";
# Note that we've used this entry.
delete $amend_code->{$sha};
# Update $rest upon success.
$rest = $_;
}
# Remove lines inserted by "git cherry-pick".
if ($strip_cherry_pick)
{
$rest =~ s/^\s*Conflicts:\n.*//sm;
$rest =~ s/^\s*\(cherry picked from commit [\da-f]+\)\n//m;
}
my @line = split "\n", $rest;
my $author_line = shift @line;
defined $author_line
or die "$ME:$.: unexpected EOF\n";
$author_line =~ /^(\d+) (.*>)$/
or die "$ME:$.: Invalid line "
. "(expected date/author/email):\n$author_line\n";
# Format 'Copyright-paperwork-exempt: Yes' as a standard ChangeLog
# `(tiny change)' annotation.
my $tiny = (grep (/^Copyright-paperwork-exempt:\s+[Yy]es$/, @line)
? ' (tiny change)' : '');
my $date_line = sprintf "%s %s$tiny\n",
strftime ("%F", localtime ($1)), $2;
my @coauthors = grep /^Co-authored-by:.*$/, @line;
# Omit meta-data lines we've already interpreted.
@line = grep !/^(?:Signed-off-by:[ ].*>$
|Co-authored-by:[ ]
|Copyright-paperwork-exempt:[ ]
)/x, @line;
# Remove leading and trailing blank lines.
if (@line)
{
while ($line[0] =~ /^\s*$/) { shift @line; }
while ($line[$#line] =~ /^\s*$/) { pop @line; }
}
# Record whether there are two or more paragraphs.
my $multi_paragraph = grep /^\s*$/, @line;
# Format 'Co-authored-by: A U Thor <email@example.com>' lines in
# standard multi-author ChangeLog format.
for (@coauthors)
{
s/^Co-authored-by:\s*/\t /;
s/\s*</ </;
/<.*?@.*\..*>/
or warn "$ME: warning: missing email address for "
. substr ($_, 5) . "\n";
}
# If clustering of commit messages has been disabled, if this header
# would be different from the previous date/name/email/coauthors header,
# or if this or the previous entry consists of two or more paragraphs,
# then print the header.
if ( ! $cluster
|| $date_line ne $prev_date_line
|| "@coauthors" ne "@prev_coauthors"
|| $multi_paragraph
|| $prev_multi_paragraph)
{
$prev_date_line eq ''
or print "\n";
print $date_line;
@coauthors
and print join ("\n", @coauthors), "\n";
}
$prev_date_line = $date_line;
@prev_coauthors = @coauthors;
$prev_multi_paragraph = $multi_paragraph;
# If there were any lines
if (@line == 0)
{
warn "$ME: warning: empty commit message:\n $date_line\n";
}
else
{
if ($append_dot)
{
# If the first line of the message has enough room, then
if (length $line[0] < 72)
{
# append a dot if there is no other punctuation or blank
# at the end.
$line[0] =~ /[[:punct:]\s]$/
or $line[0] .= '.';
}
}
# Remove one additional leading TAB from each line.
$strip_tab
and map { s/^\t// } @line;
# Prefix each non-empty line with a TAB.
@line = map { length $_ ? "\t$_" : '' } @line;
print "\n", join ("\n", @line), "\n";
}
defined ($in = <PIPE>)
or last;
$in ne "\n"
and die "$ME:$.: unexpected line:\n$in";
}
close PIPE
or die "$ME: error closing pipe from " . quoted_cmd (@cmd) . "\n";
# FIXME-someday: include $PROCESS_STATUS in the diagnostic
# Complain about any unused entry in the --amend=F specified file.
my $fail = 0;
foreach my $sha (keys %$amend_code)
{
warn "$ME:$amend_file: unused entry: $sha\n";
$fail = 1;
}
exit $fail;
}
# Local Variables:
# mode: perl
# indent-tabs-mode: nil
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "my $VERSION = '"
# time-stamp-format: "%:y-%02m-%02d %02H:%02M"
# time-stamp-time-zone: "UTC"
# time-stamp-end: "'; # UTC"
# End:
+10
View File
@@ -0,0 +1,10 @@
#if !defined _Noreturn && __STDC_VERSION__ < 201112
# if (3 <= __GNUC__ || (__GNUC__ == 2 && 8 <= __GNUC_MINOR__) \
|| 0x5110 <= __SUNPRO_C)
# define _Noreturn __attribute__ ((__noreturn__))
# elif 1200 <= _MSC_VER
# define _Noreturn __declspec (noreturn)
# else
# define _Noreturn
# endif
#endif
+26
View File
@@ -0,0 +1,26 @@
/* A C macro for declaring that specific arguments must not be NULL.
Copyright (C) 2009-2013 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 <http://www.gnu.org/licenses/>. */
/* _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
+271
View File
@@ -0,0 +1,271 @@
/* C++ compatible function declaration macros.
Copyright (C) 2010-2013 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 <http://www.gnu.org/licenses/>. */
#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<rettype(*)parameters>(::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<rettype(*)parameters>(::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<rettype(*)parameters>( \
(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 <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
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 <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
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 */
+109
View File
@@ -0,0 +1,109 @@
/* A C macro for emitting warnings if a function is used.
Copyright (C) 2010-2013 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 <http://www.gnu.org/licenses/>. */
/* _GL_WARN_ON_USE (function, "literal string") issues a declaration
for FUNCTION which will then trigger a compiler warning containing
the text of "literal string" anywhere that function is called, if
supported by the compiler. If the compiler does not support this
feature, the macro expands to an unused extern declaration.
This macro is useful for marking a function as a potential
portability trap, with the intent that "literal string" include
instructions on the replacement function that should be used
instead. However, one of the reasons that a function is a
portability trap is if it has the wrong signature. Declaring
FUNCTION with a different signature in C is a compilation error, so
this macro must use the same type as any existing declaration so
that programs that avoid the problematic FUNCTION do not fail to
compile merely because they included a header that poisoned the
function. But this implies that _GL_WARN_ON_USE is only safe to
use if FUNCTION is known to already have a declaration. Use of
this macro implies that there must not be any other macro hiding
the declaration of FUNCTION; but undefining FUNCTION first is part
of the poisoning process anyway (although for symbols that are
provided only via a macro, the result is a compilation error rather
than a warning containing "literal string"). Also note that in
C++, it is only safe to use if FUNCTION has no overloads.
For an example, it is possible to poison 'getline' by:
- adding a call to gl_WARN_ON_USE_PREPARE([[#include <stdio.h>]],
[getline]) in configure.ac, which potentially defines
HAVE_RAW_DECL_GETLINE
- adding this code to a header that wraps the system <stdio.h>:
#undef getline
#if HAVE_RAW_DECL_GETLINE
_GL_WARN_ON_USE (getline, "getline is required by POSIX 2008, but"
"not universally present; use the gnulib module getline");
#endif
It is not possible to directly poison global variables. But it is
possible to write a wrapper accessor function, and poison that
(less common usage, like &environ, will cause a compilation error
rather than issue the nice warning, but the end result of informing
the developer about their portability problem is still achieved):
#if HAVE_RAW_DECL_ENVIRON
static char ***rpl_environ (void) { return &environ; }
_GL_WARN_ON_USE (rpl_environ, "environ is not always properly declared");
# undef environ
# define environ (*rpl_environ ())
#endif
*/
#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
+4 -4
View File
@@ -66,7 +66,7 @@ platformdir = $(pkglibdir)/$(target_cpu)-$(platform)
starfielddir = $(pkgdatadir)/themes/starfield starfielddir = $(pkgdatadir)/themes/starfield
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-sign-compare -Wno-unused -Wno-unused-parameter -Wno-redundant-decls -Wno-unreachable-code -Wno-conversion
CPPFLAGS_GNULIB = -I$(top_builddir)/grub-core/lib/gnulib -I$(top_srcdir)/grub-core/lib/gnulib CPPFLAGS_GNULIB = -I$(top_builddir)/grub-core/gnulib -I$(top_srcdir)/grub-core/gnulib
CFLAGS_POSIX = -fno-builtin CFLAGS_POSIX = -fno-builtin
CPPFLAGS_POSIX = -I$(top_srcdir)/grub-core/lib/posix_wrap CPPFLAGS_POSIX = -I$(top_srcdir)/grub-core/lib/posix_wrap
@@ -128,11 +128,11 @@ BUILT_SOURCES =
.PRECIOUS: $(top_srcdir)/Makefile.util.am .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 $(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) python $^ > $@.new || (rm -f $@.new; exit 1)
mv $@.new $@ mv $@.new $@
.PRECIOUS: $(top_srcdir)/grub-core/Makefile.core.am .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 $(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 ./bootstrap manually." >&2; exit 1; fi 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) python $^ > $@.new || (rm -f $@.new; exit 1)
mv $@.new $@ mv $@.new $@
+4 -3
View File
@@ -28,9 +28,10 @@ EXTRA_DIST += grub-core/gensymlist.sh
EXTRA_DIST += grub-core/genemuinit.sh EXTRA_DIST += grub-core/genemuinit.sh
EXTRA_DIST += grub-core/genemuinitheader.sh EXTRA_DIST += grub-core/genemuinitheader.sh
EXTRA_DIST += grub-core/lib/gnulib-patches/fix-null-deref.patch EXTRA_DIST += grub-core/gnulib-fix-null-deref.diff
EXTRA_DIST += grub-core/lib/gnulib-patches/fix-width.patch EXTRA_DIST += grub-core/gnulib-fix-width.diff
EXTRA_DIST += grub-core/lib/gnulib-patches/no-abort.patch EXTRA_DIST += grub-core/gnulib-no-abort.diff
EXTRA_DIST += grub-core/gnulib-no-gets.diff
EXTRA_DIST += grub-core/lib/libgcrypt EXTRA_DIST += grub-core/lib/libgcrypt
EXTRA_DIST += grub-core/lib/libgcrypt-grub/mpi/generic EXTRA_DIST += grub-core/lib/libgcrypt-grub/mpi/generic
+54 -72
View File
@@ -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 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. dnl used for the target type. See INSTALL for full list of variables.
AC_INIT([GRUB],[2.04~rc1],[bug-grub@gnu.org]) AC_INIT([GRUB],[2.03],[bug-grub@gnu.org])
AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_AUX_DIR([build-aux])
@@ -45,15 +45,11 @@ save_program_prefix="${program_prefix}"
AC_CANONICAL_TARGET AC_CANONICAL_TARGET
program_prefix="${save_program_prefix}" program_prefix="${save_program_prefix}"
AM_INIT_AUTOMAKE([1.11]) AM_INIT_AUTOMAKE([1.10.1])
AC_PREREQ(2.63) AC_PREREQ(2.60)
AC_CONFIG_SRCDIR([include/grub/dl.h]) AC_CONFIG_SRCDIR([include/grub/dl.h])
AC_CONFIG_HEADER([config-util.h]) AC_CONFIG_HEADER([config-util.h])
# Explicitly check for pkg-config early on, since otherwise conditional
# calls are problematic.
PKG_PROG_PKG_CONFIG
# Program name transformations # Program name transformations
AC_ARG_PROGRAM AC_ARG_PROGRAM
grub_TRANSFORM([grub-bios-setup]) grub_TRANSFORM([grub-bios-setup])
@@ -104,12 +100,6 @@ case "$target_cpu" in
aarch64*) aarch64*)
target_cpu=arm64 target_cpu=arm64
;; ;;
riscv32*)
target_cpu=riscv32
;;
riscv64*)
target_cpu=riscv64
;;
esac esac
# Specify the platform (such as firmware). # Specify the platform (such as firmware).
@@ -133,8 +123,6 @@ if test "x$with_platform" = x; then
ia64-*) platform=efi ;; ia64-*) platform=efi ;;
arm-*) platform=uboot ;; arm-*) platform=uboot ;;
arm64-*) platform=efi ;; arm64-*) platform=efi ;;
riscv32-*) platform=efi ;;
riscv64-*) platform=efi ;;
*) *)
AC_MSG_WARN([unsupported CPU: "$target_cpu" - only building utilities]) AC_MSG_WARN([unsupported CPU: "$target_cpu" - only building utilities])
platform=none platform=none
@@ -159,7 +147,6 @@ case "$target_cpu"-"$platform" in
i386-efi) ;; i386-efi) ;;
x86_64-efi) ;; x86_64-efi) ;;
i386-xen) ;; i386-xen) ;;
i386-xen_pvh) ;;
x86_64-xen) ;; x86_64-xen) ;;
i386-pc) ;; i386-pc) ;;
i386-multiboot) ;; i386-multiboot) ;;
@@ -183,8 +170,6 @@ case "$target_cpu"-"$platform" in
arm-coreboot) ;; arm-coreboot) ;;
arm-efi) ;; arm-efi) ;;
arm64-efi) ;; arm64-efi) ;;
riscv32-efi) ;;
riscv64-efi) ;;
*-emu) ;; *-emu) ;;
*-none) ;; *-none) ;;
*) AC_MSG_ERROR([platform "$platform" is not supported for target CPU "$target_cpu"]) ;; *) AC_MSG_ERROR([platform "$platform" is not supported for target CPU "$target_cpu"]) ;;
@@ -219,8 +204,7 @@ case "$host_os" in
esac esac
case "$host_os" in case "$host_os" in
cygwin) have_exec=y ;; cygwin | windows* | mingw32*) have_exec=n ;;
windows* | mingw32*) have_exec=n ;;
aros*) have_exec=n ;; aros*) have_exec=n ;;
*) have_exec=y;; *) have_exec=y;;
esac esac
@@ -230,7 +214,6 @@ case "$platform" in
multiboot) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MULTIBOOT=1" ;; multiboot) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MULTIBOOT=1" ;;
efi) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_EFI=1" ;; efi) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_EFI=1" ;;
xen) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_XEN=1" ;; xen) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_XEN=1" ;;
xen_pvh) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_XEN_PVH=1" ;;
ieee1275) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_IEEE1275=1" ;; ieee1275) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_IEEE1275=1" ;;
uboot) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_UBOOT=1" ;; uboot) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_UBOOT=1" ;;
qemu) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_QEMU=1" ;; qemu) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_QEMU=1" ;;
@@ -293,7 +276,7 @@ fi
AC_SUBST(bootdirname) AC_SUBST(bootdirname)
AC_DEFINE_UNQUOTED(GRUB_BOOT_DIR_NAME, "$bootdirname", AC_DEFINE_UNQUOTED(GRUB_BOOT_DIR_NAME, "$bootdirname",
[Default boot directory name]) [Default boot directory name]")
AC_ARG_WITH([grubdir], AC_ARG_WITH([grubdir],
AS_HELP_STRING([--with-grubdir=DIR], AS_HELP_STRING([--with-grubdir=DIR],
@@ -353,7 +336,6 @@ gl_EARLY
AC_PROG_CXX AC_PROG_CXX
AM_PROG_CC_C_O AM_PROG_CC_C_O
AM_PROG_AS AM_PROG_AS
AM_PATH_PYTHON([2.6])
# Must be GCC. # Must be GCC.
test "x$GCC" = xyes || AC_MSG_ERROR([GCC is required]) test "x$GCC" = xyes || AC_MSG_ERROR([GCC is required])
@@ -362,7 +344,6 @@ AC_CHECK_PROG(HAVE_CXX, $CXX, yes, no)
AC_GNU_SOURCE AC_GNU_SOURCE
AM_GNU_GETTEXT([external]) AM_GNU_GETTEXT([external])
AM_GNU_GETTEXT_VERSION([0.18.3])
AC_SYS_LARGEFILE AC_SYS_LARGEFILE
# Identify characteristics of the host architecture. # Identify characteristics of the host architecture.
@@ -839,16 +820,6 @@ if test x"$platform" != xemu ; then
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
[grub_cv_target_cc_soft_float="-mgeneral-regs-only"], []) [grub_cv_target_cc_soft_float="-mgeneral-regs-only"], [])
fi fi
if test "x$target_cpu" = xriscv32; then
CFLAGS="$TARGET_CFLAGS -march=rv32imac -mabi=ilp32 -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
[grub_cv_target_cc_soft_float="-march=rv32imac -mabi=ilp32"], [])
fi
if test "x$target_cpu" = xriscv64; then
CFLAGS="$TARGET_CFLAGS -march=rv64imac -mabi=lp64 -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
[grub_cv_target_cc_soft_float="-march=rv64imac -mabi=lp64"], [])
fi
if test "x$target_cpu" = xia64; then if test "x$target_cpu" = xia64; then
CFLAGS="$TARGET_CFLAGS -mno-inline-float-divide -mno-inline-sqrt -Werror" CFLAGS="$TARGET_CFLAGS -mno-inline-float-divide -mno-inline-sqrt -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
@@ -1164,7 +1135,7 @@ AC_SUBST(TARGET_LDFLAGS_OLDMAGIC)
LDFLAGS="$TARGET_LDFLAGS" LDFLAGS="$TARGET_LDFLAGS"
if test "$target_cpu" = x86_64 || test "$target_cpu" = sparc64 || test "$target_cpu" = riscv64 ; then if test "$target_cpu" = x86_64 || test "$target_cpu" = sparc64 ; then
# Use large model to support 4G memory # Use large model to support 4G memory
AC_CACHE_CHECK([whether option -mcmodel=large works], grub_cv_cc_mcmodel, [ AC_CACHE_CHECK([whether option -mcmodel=large works], grub_cv_cc_mcmodel, [
CFLAGS="$TARGET_CFLAGS -mcmodel=large" CFLAGS="$TARGET_CFLAGS -mcmodel=large"
@@ -1174,7 +1145,7 @@ if test "$target_cpu" = x86_64 || test "$target_cpu" = sparc64 || test "$target_
]) ])
if test "x$grub_cv_cc_mcmodel" = xyes; then if test "x$grub_cv_cc_mcmodel" = xyes; then
TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=large" TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=large"
elif test "$target_cpu" = sparc64 || test "$target_cpu" = riscv64; then elif test "$target_cpu" = sparc64; then
TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=medany" TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=medany"
fi fi
fi fi
@@ -1228,12 +1199,12 @@ if test "x$target_cpu" = xarm; then
fi fi
AC_CACHE_CHECK([whether option -Qn works], grub_cv_target_cc_qn, [ AC_CACHE_CHECK([whether option -Qn works], grub_cv_target_cc_qn, [
CFLAGS="$TARGET_CFLAGS -Qn -Qunused-arguments -Werror" CFLAGS="$TARGET_CFLAGS -Qn -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
[grub_cv_target_cc_qn=yes], [grub_cv_target_cc_qn=yes],
[grub_cv_target_cc_qn=no])]) [grub_cv_target_cc_qn=no])])
if test "x$grub_cv_target_cc_qn" = xyes; then if test "x$grub_cv_target_cc_qn" = xyes; then
TARGET_CFLAGS="$TARGET_CFLAGS -Qn -Qunused-arguments" TARGET_CFLAGS="$TARGET_CFLAGS -Qn"
fi fi
# #
@@ -1395,7 +1366,7 @@ AC_SUBST(TARGET_NMFLAGS_DEFINED_ONLY)
if test "$platform" != emu; then if test "$platform" != emu; then
AC_CACHE_CHECK([whether -nostdinc -isystem works], [grub_cv_cc_isystem], [ AC_CACHE_CHECK([whether -nostdinc -isystem works], [grub_cv_cc_isystem], [
SAVED_CPPFLAGS="$CPPFLAGS" SAVED_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$TARGET_CPPFLAGS -nostdlib -nostdinc -isystem `$TARGET_CC -print-file-name=include`" CPPFLAGS="$TARGET_CPPFLAGS -nostdinc -isystem `$TARGET_CC -print-file-name=include`"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdarg.h> AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdarg.h>
#include <stddef.h> #include <stddef.h>
int va_arg_func (int fixed, va_list args);]], [[]])], int va_arg_func (int fixed, va_list args);]], [[]])],
@@ -1536,22 +1507,29 @@ if test x"$enable_grub_mkfont" = xno ; then
grub_mkfont_excuse="explicitly disabled" grub_mkfont_excuse="explicitly disabled"
fi fi
if test x"$grub_mkfont_excuse" = x ; then
# Check for freetype libraries.
AC_CHECK_TOOLS([FREETYPE], [freetype-config])
if test "x$FREETYPE" = x ; then
grub_mkfont_excuse=["need freetype2 library"]
fi
fi
unset ac_cv_header_ft2build_h unset ac_cv_header_ft2build_h
if test x"$grub_mkfont_excuse" = x ; then if test x"$grub_mkfont_excuse" = x ; then
# Check for freetype libraries. # Check for freetype libraries.
PKG_CHECK_MODULES([FREETYPE], [freetype2], [ freetype_cflags=`$FREETYPE --cflags`
SAVED_CPPFLAGS="$CPPFLAGS" freetype_libs=`$FREETYPE --libs`
SAVED_LIBS="$LIBS" SAVED_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $FREETYPE_CFLAGS" SAVED_LIBS="$LIBS"
LIBS="$LIBS $FREETYPE_LIBS" CPPFLAGS="$CPPFLAGS $freetype_cflags"
AC_CHECK_HEADERS([ft2build.h], [], LIBS="$LIBS $freetype_libs"
[grub_mkfont_excuse=["need freetype2 headers"]]) AC_CHECK_HEADERS([ft2build.h], [],
AC_LINK_IFELSE([AC_LANG_CALL([], [FT_Load_Glyph])], [], [grub_mkfont_excuse=["need freetype2 headers"]])
[grub_mkfont_excuse=["freetype2 library unusable"]]) AC_LINK_IFELSE([AC_LANG_CALL([], [FT_Load_Glyph])], [], [grub_mkfont_excuse=["freetype2 library unusable"]])
CPPFLAGS="$SAVED_CPPFLAGS" CPPFLAGS="$SAVED_CPPFLAGS"
LIBS="$SAVED_LIBS" LIBS="$SAVED_LIBS"
], [grub_mkfont_excuse=["need freetype2 library"]])
fi fi
if test x"$enable_grub_mkfont" = xyes && test x"$grub_mkfont_excuse" != x ; then if test x"$enable_grub_mkfont" = xyes && test x"$grub_mkfont_excuse" != x ; then
@@ -1563,6 +1541,8 @@ else
enable_grub_mkfont=no enable_grub_mkfont=no
fi fi
AC_SUBST([enable_grub_mkfont]) AC_SUBST([enable_grub_mkfont])
AC_SUBST([freetype_cflags])
AC_SUBST([freetype_libs])
SAVED_CC="$CC" SAVED_CC="$CC"
SAVED_CPP="$CPP" SAVED_CPP="$CPP"
@@ -1592,21 +1572,25 @@ AC_SUBST([BUILD_WORDS_BIGENDIAN])
if test x"$grub_build_mkfont_excuse" = x ; then if test x"$grub_build_mkfont_excuse" = x ; then
# Check for freetype libraries. # Check for freetype libraries.
SAVED_PKG_CONFIG="$PKG_CONFIG" AC_CHECK_PROGS([BUILD_FREETYPE], [freetype-config])
test -z "$BUILD_PKG_CONFIG" || PKG_CONFIG="$BUILD_PKG_CONFIG" if test "x$BUILD_FREETYPE" = x ; then
PKG_CHECK_MODULES([BUILD_FREETYPE], [freetype2], [ grub_build_mkfont_excuse=["need freetype2 library"]
SAVED_CPPFLAGS_2="$CPPFLAGS" fi
SAVED_LIBS="$LIBS" fi
CPPFLAGS="$CPPFLAGS $BUILD_FREETYPE_CFLAGS"
LIBS="$LIBS $BUILD_FREETYPE_LIBS" if test x"$grub_build_mkfont_excuse" = x ; then
AC_CHECK_HEADERS([ft2build.h], [], # Check for freetype libraries.
[grub_build_mkfont_excuse=["need freetype2 headers"]]) build_freetype_cflags=`$BUILD_FREETYPE --cflags`
AC_LINK_IFELSE([AC_LANG_CALL([], [FT_Load_Glyph])], [], build_freetype_libs=`$BUILD_FREETYPE --libs`
[grub_build_mkfont_excuse=["freetype2 library unusable"]]) SAVED_CPPFLAGS_2="$CPPFLAGS"
LIBS="$SAVED_LIBS" SAVED_LIBS="$LIBS"
CPPFLAGS="$SAVED_CPPFLAGS_2" CPPFLAGS="$CPPFLAGS $build_freetype_cflags"
], [grub_build_mkfont_excuse=["need freetype2 library"]]) LIBS="$LIBS $build_freetype_libs"
PKG_CONFIG="$SAVED_PKG_CONFIG" AC_CHECK_HEADERS([ft2build.h], [],
[grub_build_mkfont_excuse=["need freetype2 headers"]])
AC_LINK_IFELSE([AC_LANG_CALL([], [FT_Load_Glyph])], [], [grub_build_mkfont_excuse=["freetype2 library unusable"]])
LIBS="$SAVED_LIBS"
CPPFLAGS="$SAVED_CPPFLAGS_2"
fi fi
if test x"$enable_build_grub_mkfont" = xyes && test x"$grub_build_mkfont_excuse" != x ; then if test x"$enable_build_grub_mkfont" = xyes && test x"$grub_build_mkfont_excuse" != x ; then
@@ -1625,6 +1609,9 @@ if test x"$enable_build_grub_mkfont" = xno && ( test "x$platform" = xqemu || tes
fi fi
fi fi
AC_SUBST([build_freetype_cflags])
AC_SUBST([build_freetype_libs])
CC="$SAVED_CC" CC="$SAVED_CC"
CPP="$SAVED_CPP" CPP="$SAVED_CPP"
CFLAGS="$SAVED_CFLAGS" CFLAGS="$SAVED_CFLAGS"
@@ -1920,7 +1907,6 @@ AM_CONDITIONAL([COND_i386_coreboot], [test x$target_cpu = xi386 -a x$platform =
AM_CONDITIONAL([COND_i386_multiboot], [test x$target_cpu = xi386 -a x$platform = xmultiboot]) AM_CONDITIONAL([COND_i386_multiboot], [test x$target_cpu = xi386 -a x$platform = xmultiboot])
AM_CONDITIONAL([COND_x86_64_efi], [test x$target_cpu = xx86_64 -a x$platform = xefi]) AM_CONDITIONAL([COND_x86_64_efi], [test x$target_cpu = xx86_64 -a x$platform = xefi])
AM_CONDITIONAL([COND_i386_xen], [test x$target_cpu = xi386 -a x$platform = xxen]) AM_CONDITIONAL([COND_i386_xen], [test x$target_cpu = xi386 -a x$platform = xxen])
AM_CONDITIONAL([COND_i386_xen_pvh], [test x$target_cpu = xi386 -a x$platform = xxen_pvh])
AM_CONDITIONAL([COND_x86_64_xen], [test x$target_cpu = xx86_64 -a x$platform = xxen]) AM_CONDITIONAL([COND_x86_64_xen], [test x$target_cpu = xx86_64 -a x$platform = xxen])
AM_CONDITIONAL([COND_mips_loongson], [test x$target_cpu = xmipsel -a x$platform = xloongson]) AM_CONDITIONAL([COND_mips_loongson], [test x$target_cpu = xmipsel -a x$platform = xloongson])
AM_CONDITIONAL([COND_mips_qemu_mips], [test "(" x$target_cpu = xmips -o x$target_cpu = xmipsel ")" -a x$platform = xqemu_mips]) AM_CONDITIONAL([COND_mips_qemu_mips], [test "(" x$target_cpu = xmips -o x$target_cpu = xmipsel ")" -a x$platform = xqemu_mips])
@@ -1937,10 +1923,6 @@ AM_CONDITIONAL([COND_arm_coreboot], [test x$target_cpu = xarm -a x$platform = xc
AM_CONDITIONAL([COND_arm_efi], [test x$target_cpu = xarm -a x$platform = xefi]) 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], [test x$target_cpu = xarm64 ])
AM_CONDITIONAL([COND_arm64_efi], [test x$target_cpu = xarm64 -a x$platform = xefi]) AM_CONDITIONAL([COND_arm64_efi], [test x$target_cpu = xarm64 -a x$platform = xefi])
AM_CONDITIONAL([COND_riscv32], [test x$target_cpu = xriscv32 ])
AM_CONDITIONAL([COND_riscv64], [test x$target_cpu = xriscv64 ])
AM_CONDITIONAL([COND_riscv32_efi], [test x$target_cpu = xriscv32 -a x$platform = xefi])
AM_CONDITIONAL([COND_riscv64_efi], [test x$target_cpu = xriscv64 -a x$platform = xefi])
AM_CONDITIONAL([COND_HOST_HURD], [test x$host_kernel = xhurd]) AM_CONDITIONAL([COND_HOST_HURD], [test x$host_kernel = xhurd])
AM_CONDITIONAL([COND_HOST_LINUX], [test x$host_kernel = xlinux]) AM_CONDITIONAL([COND_HOST_LINUX], [test x$host_kernel = xlinux])
@@ -2015,7 +1997,7 @@ fi
AC_CONFIG_FILES([Makefile]) AC_CONFIG_FILES([Makefile])
AC_CONFIG_FILES([grub-core/Makefile]) AC_CONFIG_FILES([grub-core/Makefile])
AC_CONFIG_FILES([grub-core/lib/gnulib/Makefile]) AC_CONFIG_FILES([grub-core/gnulib/Makefile])
AC_CONFIG_FILES([po/Makefile.in]) AC_CONFIG_FILES([po/Makefile.in])
AC_CONFIG_FILES([docs/Makefile]) AC_CONFIG_FILES([docs/Makefile])
AC_CONFIG_FILES([util/bash-completion.d/Makefile]) AC_CONFIG_FILES([util/bash-completion.d/Makefile])
+44 -94
View File
@@ -77,7 +77,6 @@ This edition documents version @value{VERSION}.
* Coding style:: * Coding style::
* Finding your way around:: * Finding your way around::
* Contributing Changes:: * Contributing Changes::
* Updating External Code::
* Porting:: * Porting::
* Error Handling:: * Error Handling::
* Stack and heap size:: * Stack and heap size::
@@ -183,44 +182,38 @@ If a macro is global, its name must be prefixed with GRUB_ and must consist of o
@section Comments @section Comments
All comments shall be C-style comments, of the form @samp{/* @dots{} */}. All comments shall be C-style comments, of the form @samp{/* @dots{} */}.
A comment can be placed immediately preceding the entity it describes or it
can be placed together with code, variable declarations, or other non-comment Comments shall be placed only on a line by themselves. They shall not be placed together with code, variable declarations, or other non-comment entities. A comment should be placed immediately preceding the entity it describes.
entities. However, it is recommended to not mix various forms especially in
types/structs descriptions.
Acceptable: Acceptable:
@example @example
/* The page # that is the front buffer. */ /* The page # that is the front buffer. */
int displayed_page; int displayed_page;
/* The page # that is the back buffer. */
int render_page;
@end example @end example
Unacceptable:
@example @example
int render_page; /* The page # that is the back buffer. */ int displayed_page; /* The page # that is the front buffer. */
int render_page; /* The page # that is the back buffer. */
@end example @end example
@node Multi-Line Comments @node Multi-Line Comments
@section Multi-Line Comments @section Multi-Line Comments
Comments spanning multiple lines shall be formatted with all lines after the Comments spanning multiple lines shall be formatted with all lines after the first aligned with the first line.
first aligned with the first line. Asterisk characters should be repeated at
the start of each subsequent line. Asterisk characters should not be repeated a the start of each subsequent line.
Acceptable: Acceptable:
@example @example
/* /* This is a comment
* This is a comment which spans multiple lines.
* which spans multiple lines. It is long. */
* It is long.
*/
@end example @end example
Unacceptable: Unacceptable:
@example
/* This is a comment
which spans multiple lines.
It is long. */
@end example
@example @example
/* /*
* This is a comment * This is a comment
@@ -228,16 +221,7 @@ Unacceptable:
* It is long. */ * It is long. */
@end example @end example
@example The opening @samp{/*} and closing @samp{*/} should be placed together on a line with text.
/* This is a comment
* which spans multiple lines.
* It is long.
*/
@end example
In particular first unacceptable form makes comment difficult to distinguish
from the code itself. Especially if it contains the code snippets and/or is
long. So, its usage is disallowed.
@node Finding your way around @node Finding your way around
@chapter Finding your way around @chapter Finding your way around
@@ -482,35 +466,6 @@ If your intention is to just get started, please do not submit a inclusion
request. Instead, please subscribe to the mailing list, and communicate first request. Instead, please subscribe to the mailing list, and communicate first
(e.g. sending a patch, asking a question, commenting on another message...). (e.g. sending a patch, asking a question, commenting on another message...).
@node Updating External Code
@chapter Updating external code
GRUB includes some code from other projects, and it is sometimes necessary
to update it.
@menu
* Gnulib::
@end menu
@node Gnulib
@section Gnulib
Gnulib is a source code library that provides basic functionality to
programs and libraries. Many software packages make use of Gnulib
to avoid reinventing the portability wheel.
GRUB imports Gnulib using its @command{bootstrap} utility, identifying a
particular Git commit in @file{bootstrap.conf}. To upgrade to a new Gnulib
commit, set @code{GNULIB_REVISION} in @file{bootstrap.conf} to the new commit
ID, then run @kbd{./bootstrap} and whatever else you need to make sure it
works. Check for changes to Gnulib's @file{NEWS} file between the old and new
commits; in some cases it will be necessary to adjust GRUB to match. You may
also need to update the patches in @file{grub-core/lib/gnulib-patches/}.
To add a new Gnulib module or remove one that is no longer needed, change
@code{gnulib_modules} in @file{bootstrap.conf}. Again, run @kbd{./bootstrap}
and whatever else you need to make sure it works.
@node Porting @node Porting
@chapter Porting @chapter Porting
@@ -717,7 +672,7 @@ is already present and you'll need to make it follow the existant code paths
for your platform adding adjustments if necessary. When done compile: for your platform adding adjustments if necessary. When done compile:
@example @example
./bootstrap ./autogen.sh
./configure --target=$cpu --with-platform=$platform TARGET_CC=.. OBJCOPY=... STRIP=... ./configure --target=$cpu --with-platform=$platform TARGET_CC=.. OBJCOPY=... STRIP=...
make > /dev/null make > /dev/null
@end example @end example
@@ -1998,59 +1953,54 @@ might fix some of the problems.
@node Verifiers framework @node Verifiers framework
@chapter Verifiers framework @chapter Verifiers framework
To register your own verifier call @samp{grub_verifier_register} with a structure To register your own verifier call @samp{grub_verifier_register} with a
pointing to your functions. structure pointing to your functions.
The interface is inspired by the hash interface with @samp{init}/@samp{write}/@samp{fini}. The interface is inspired by hash interface with @samp{init}/@samp{write}/@samp{fini}.
There are essentially 2 ways of using it, hashing and whole-file verification. There are eesntially 2 ways of using it: hashing and whole-file verification:
With the hashing approach: With hashing approach:
During @samp{init} you decide whether you want to check the given file and init context. During @samp{init} you decide whether you want to check given file and init context.
In @samp{write} you update your hashing state. In @samp{write} you update you hashing state.
In @samp{fini} you check that the hash matches the expected value/passes some check/... In @samp{fini} you check that hash matches the expected value/passes some check/...
With whole-file verification: With whole-file verification:
During @samp{init} you decide whether you want to check the given file and init context. During @samp{init} you decide whether you want to check given file and init context.
In @samp{write} you verify the file and return an error if it fails. In @samp{write} you verify file and return error if it fails.
You don't have @samp{fini}. You don't have @samp{fini}.
Additional @samp{verify_string} receives various strings like kernel parameters Additional @samp{verify_string} receives various strings like kernel parameters to
to verify. Returning no error means successful verification and an error stops verify. Returning no error means successful verification and an error stops the current
the current action. action.
Detailed description of the API: Detailed description of API:
Every time a file is opened your @samp{init} function is called with file descriptor Every time a file is opened your @samp{init} function is called with file descriptor
and file type. Your function can have the following outcomes: and file type. Your function can have following outcomes:
@itemize @itemize
@item returning no error and setting @samp{*flags} to @samp{GRUB_VERIFY_FLAGS_DEFER_AUTH}.
In this case verification is deferred to other active verifiers. Verification
fails if nobody cares or selected verifier fails.
@item returning no error and setting @samp{*flags} to @samp{GRUB_VERIFY_FLAGS_SKIP_VERIFICATION}. @item returning no error and setting @samp{*flags} to @samp{GRUB_VERIFY_FLAGS_SKIP_VERIFICATION}.
In this case your verifier will not be called anymore and it is assumed to have In this case your verifier will not be called anymore and your verifier is considered
skipped verification. to have skipped verification
@item returning error. Then opening of the fail will fail due to failed verification.
@item returning no error and not setting @samp{*flags} to @samp{GRUB_VERIFY_FLAGS_SKIP_VERIFICATION} @item returning no error and not setting @samp{*flags} to @samp{GRUB_VERIFY_FLAGS_SKIP_VERIFICATION}
In this case verification is done as described in the following section. In this case verification is done as described in following section
@item returning an error. Then opening of the file will fail due to failed verification.
@end itemize @end itemize
In the third case your @samp{write} will be called with chunks of the file. If In the third case your @samp{write} will be called with chunks of file. If you need the whole file in a single
you need the whole file in a single chunk then during @samp{init} set the bit chunk then during @samp{init} set bit @samp{GRUB_VERIFY_FLAGS_SINGLE_CHUNK} in @samp{*flags}.
@samp{GRUB_VERIFY_FLAGS_SINGLE_CHUNK} in @samp{*flags}. During @samp{init} you During @samp{init} you may set @samp{*context} if you need additional context. At every iteration you may return
may set @samp{*context} if you need additional context. At every iteration you an error and the the file will be considered as having failed the verification. If you return no error then
may return an error and the file will be considered as having failed the verification continues.
verification. If you return no error then verification continues.
Optionally at the end of the file @samp{fini}, if it exists, is called with just Optionally at the end of the file @samp{fini} if it exists is called with just the context. If you return
the context. If you return no error during any of @samp{init}, @samp{write} and no error during any of @samp{init}, @samp{write} and @samp{fini} then the file is considered as having
@samp{fini} then the file is considered as having succeded verification. succeded verification.
@node Copying This Manual @node Copying This Manual
@appendix Copying This Manual @appendix Copying This Manual
+33 -196
View File
@@ -360,9 +360,8 @@ blocklist notation. The currently supported filesystem types are @dfn{Amiga
Fast FileSystem (AFFS)}, @dfn{AtheOS fs}, @dfn{BeFS}, Fast FileSystem (AFFS)}, @dfn{AtheOS fs}, @dfn{BeFS},
@dfn{BtrFS} (including raid0, raid1, raid10, gzip and lzo), @dfn{BtrFS} (including raid0, raid1, raid10, gzip and lzo),
@dfn{cpio} (little- and big-endian bin, odc and newc variants), @dfn{cpio} (little- and big-endian bin, odc and newc variants),
@dfn{Linux ext2/ext3/ext4}, @dfn{DOS FAT12/FAT16/FAT32}, @dfn{Linux ext2/ext3/ext4}, @dfn{DOS FAT12/FAT16/FAT32}, @dfn{exFAT}, @dfn{HFS},
@dfn{exFAT}, @dfn{F2FS}, @dfn{HFS}, @dfn{HFS+}, @dfn{HFS+}, @dfn{ISO9660} (including Joliet, Rock-ridge and multi-chunk files),
@dfn{ISO9660} (including Joliet, Rock-ridge and multi-chunk files),
@dfn{JFS}, @dfn{Minix fs} (versions 1, 2 and 3), @dfn{nilfs2}, @dfn{JFS}, @dfn{Minix fs} (versions 1, 2 and 3), @dfn{nilfs2},
@dfn{NTFS} (including compression), @dfn{ReiserFS}, @dfn{ROMFS}, @dfn{NTFS} (including compression), @dfn{ReiserFS}, @dfn{ROMFS},
@dfn{Amiga Smart FileSystem (SFS)}, @dfn{Squash4}, @dfn{tar}, @dfn{UDF}, @dfn{Amiga Smart FileSystem (SFS)}, @dfn{Squash4}, @dfn{tar}, @dfn{UDF},
@@ -1214,11 +1213,10 @@ GRUB is configured using @file{grub.cfg}, usually located under
need to write the whole thing by hand. need to write the whole thing by hand.
@menu @menu
* Simple configuration:: Recommended for most users * 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
* Shell-like scripting:: For power users and developers * Multi-boot manual config:: For non-standard multi-OS scenarios
* Multi-boot manual config:: For non-standard multi-OS scenarios * Embedded configuration:: Embedding a configuration file into GRUB
* Embedded configuration:: Embedding a configuration file into GRUB
@end menu @end menu
@@ -1400,25 +1398,6 @@ for all respectively normal entries.
The values of these options replace the values of @samp{GRUB_CMDLINE_LINUX} 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. 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 @item GRUB_DISABLE_LINUX_UUID
Normally, @command{grub-mkconfig} will generate menu entries that use Normally, @command{grub-mkconfig} will generate menu entries that use
universally-unique identifiers (UUIDs) to identify the root filesystem to universally-unique identifiers (UUIDs) to identify the root filesystem to
@@ -1426,17 +1405,6 @@ 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 usually more reliable, but in some cases it may not be appropriate. To
disable the use of UUIDs, set this option to @samp{true}. 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 @item GRUB_DISABLE_RECOVERY
If this option is set to @samp{true}, disable the generation of recovery If this option is set to @samp{true}, disable the generation of recovery
mode menu entries. mode menu entries.
@@ -1568,53 +1536,6 @@ edit the scripts in @file{/etc/grub.d} directly.
menu entries; simply type the menu entries you want to add at the end of 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. 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 @node Shell-like scripting
@section Writing full configuration files directly @section Writing full configuration files directly
@@ -3931,7 +3852,6 @@ you forget a command, you can run the command @command{help}
* play:: Play a tune * play:: Play a tune
* probe:: Retrieve device info * probe:: Retrieve device info
* pxe_unload:: Unload the PXE environment * pxe_unload:: Unload the PXE environment
* rdmsr:: Read values from model-specific registers
* read:: Read user input * read:: Read user input
* reboot:: Reboot your computer * reboot:: Reboot your computer
* regexp:: Test if regular expression matches string * regexp:: Test if regular expression matches string
@@ -3953,10 +3873,11 @@ you forget a command, you can run the command @command{help}
@comment * vbeinfo:: List available video modes @comment * vbeinfo:: List available video modes
* verify_detached:: Verify detached digital signature * verify_detached:: Verify detached digital signature
* videoinfo:: List available video modes * videoinfo:: List available video modes
@comment * xen_*:: Xen boot commands for AArch64 @comment * xen_*:: Xen boot commands
* wrmsr:: Write values to model-specific registers * xen_hypervisor:: Load xen hypervisor binary
* xen_hypervisor:: Load xen hypervisor binary (only on AArch64) * xen_linux:: Load dom0 kernel for xen hypervisor
* xen_module:: Load xen modules for xen hypervisor (only on AArch64) * xen_initrd:: Load dom0 initrd for dom0 kernel
* xen_xsm:: Load xen security module for xen hypervisor
@end menu @end menu
@@ -4724,7 +4645,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} When enabled, this hides the selected partition by setting the @dfn{hidden}
bit in its partition type code; when disabled, unhides the selected bit in its partition type code; when disabled, unhides the selected
partition by clearing this bit. This is useful only when booting DOS or partition by clearing this bit. This is useful only when booting DOS or
Windows and multiple primary FAT partitions exist in one disk. See also Wwindows and multiple primary FAT partitions exist in one disk. See also
@ref{DOS/Windows}. @ref{DOS/Windows}.
@end table @end table
@end deffn @end deffn
@@ -4787,24 +4708,6 @@ This command is only available on PC BIOS systems.
@end deffn @end deffn
@node rdmsr
@subsection rdmsr
@deffn Command: rdmsr 0xADDR [-v VARNAME]
Read a model-specific register at address 0xADDR. If the parameter
@option{-v} is used and an environment variable @var{VARNAME} is
given, set that environment variable to the value that was read.
Please note that on SMP systems, reading from a MSR that has a
scope per hardware thread, implies that the value that is returned
only applies to the particular cpu/core/thread that runs the command.
Also, if you specify a reserved or unimplemented MSR address, it will
cause a general protection exception (which is not currently being handled)
and the system will reboot.
@end deffn
@node read @node read
@subsection read @subsection read
@@ -5243,21 +5146,6 @@ successfully. If validation fails, it is set to a non-zero value.
List available video modes. If resolution is given, show only matching modes. List available video modes. If resolution is given, show only matching modes.
@end deffn @end deffn
@node wrmsr
@subsection wrmsr
@deffn Command: wrmsr 0xADDR 0xVALUE
Write a 0xVALUE to a model-specific register at address 0xADDR.
Please note that on SMP systems, writing to a MSR that has a scope
per hardware thread, implies that the value that is written
only applies to the particular cpu/core/thread that runs the command.
Also, if you specify a reserved or unimplemented MSR address, it will
cause a general protection exception (which is not currently being handled)
and the system will reboot.
@end deffn
@node xen_hypervisor @node xen_hypervisor
@subsection xen_hypervisor @subsection xen_hypervisor
@@ -5265,22 +5153,32 @@ and the system will reboot.
Load a Xen hypervisor binary from @var{file}. The rest of the line is passed 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 verbatim as the @dfn{kernel command-line}. Any other binaries must be
reloaded after using this command. reloaded after using this command.
This command is only available on AArch64 systems.
@end deffn @end deffn
@node xen_module @node xen_linux
@subsection xen_module @subsection xen_linux
@deffn Command xen_module [--nounzip] file [arguments] @deffn Command xen_linux file [arguments]
Load a module for xen hypervisor at the booting process of xen. Load a dom0 kernel image for xen hypervisor at the booting process of xen.
The rest of the line is passed verbatim as the module command line. 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 @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 @node Networking commands
@section The list of networking commands @section The list of networking commands
@@ -5470,7 +5368,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 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, as UTF-8, again according to specification. BtrFS, cpio, tar, squash4, minix,
minix2, minix3, ROMFS, ReiserFS, XFS, ext2, ext3, ext4, FAT (short names), minix2, minix3, ROMFS, ReiserFS, XFS, ext2, ext3, ext4, FAT (short names),
F2FS, RockRidge part of ISO9660, nilfs2, UFS1, UFS2 and ZFS are assumed 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 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 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 access ASCII-named files. And it's recommended to configure your system to use
@@ -5579,8 +5477,6 @@ environment variables and commands are listed in the same order.
@menu @menu
* Authentication and authorisation:: Users and access control * Authentication and authorisation:: Users and access control
* Using digital signatures:: Booting digitally signed code * Using digital signatures:: Booting digitally signed code
* UEFI secure boot and shim:: Booting digitally signed PE files
* Measured Boot:: Measuring boot components
@end menu @end menu
@node Authentication and authorisation @node Authentication and authorisation
@@ -5743,57 +5639,6 @@ or BIOS) configuration to cause the machine to boot from a different
(attacker-controlled) device. GRUB is at best only one link in a (attacker-controlled) device. GRUB is at best only one link in a
secure boot chain. secure boot chain.
@node UEFI secure boot and shim
@section UEFI secure boot and shim support
The GRUB, except the @command{chainloader} command, works with the UEFI secure
boot and the shim. This functionality is provided by the shim_lock module. It
is recommend to build in this and other required modules into the @file{core.img}.
All modules not stored in the @file{core.img} and the ACPI tables for the
@command{acpi} command have to be signed, e.g. using PGP. Additionally, the
@command{iorw}, the @command{memrw} and the @command{wrmsr} commands are
prohibited if the UEFI secure boot is enabled. This is done due to
security reasons. All above mentioned requirements are enforced by the
shim_lock module. And itself it is a persistent module which means that
it cannot be unloaded if it was loaded into the memory.
@node Measured Boot
@section Measuring boot components
If the tpm module is loaded and the platform has a Trusted Platform Module
installed, GRUB will log each command executed and each file loaded into the
TPM event log and extend the PCR values in the TPM correspondingly. All events
will be logged into the PCR described below with a type of EV_IPL and an
event description as described below.
@multitable @columnfractions 0.3 0.1 0.6
@headitem Event type @tab PCR @tab Description
@item Command
@tab 8
@tab All executed commands (including those from configuration files) will be
logged and measured as entered with a prefix of ``grub_cmd: ``
@item Kernel command line
@tab 8
@tab Any command line passed to a kernel will be logged and measured as entered
with a prefix of ``kernel_cmdline: ''
@item Module command line
@tab 8
@tab Any command line passed to a kernel module will be logged and measured as
entered with a prefix of ``module_cmdline: ``
@item Files
@tab 9
@tab Any file read by GRUB will be logged and measured with a descriptive text
corresponding to the filename.
@end multitable
GRUB will not measure its own @file{core.img} - it is expected that firmware
will carry this out. GRUB will also not perform any measurements until the
tpm module is loaded. As such it is recommended that the tpm module be built
into @file{core.img} in order to avoid a potential gap in measurement between
@file{core.img} being loaded and the tpm module being loaded.
Measured boot is currently only supported on EFI platforms.
@node Platform limitations @node Platform limitations
@chapter Platform limitations @chapter Platform limitations
@@ -5866,8 +5711,6 @@ to install to is specified, UUID is used instead as well.
@item USB @tab yes @tab yes @tab yes @tab yes @item USB @tab yes @tab yes @tab yes @tab yes
@item chainloader @tab local @tab yes @tab yes @tab no @item chainloader @tab local @tab yes @tab yes @tab no
@item cpuid @tab partial @tab partial @tab partial @tab partial @item cpuid @tab partial @tab partial @tab partial @tab partial
@item rdmsr @tab partial @tab partial @tab partial @tab partial
@item wrmsr @tab partial @tab partial @tab partial @tab partial
@item hints @tab guess @tab guess @tab guess @tab guess @item hints @tab guess @tab guess @tab guess @tab guess
@item PCI @tab yes @tab yes @tab yes @tab yes @item PCI @tab yes @tab yes @tab yes @tab yes
@item badram @tab yes @tab yes @tab yes @tab yes @item badram @tab yes @tab yes @tab yes @tab yes
@@ -5887,8 +5730,6 @@ to install to is specified, UUID is used instead as well.
@item USB @tab yes @tab yes @tab yes @tab no @item USB @tab yes @tab yes @tab yes @tab no
@item chainloader @tab local @tab local @tab no @tab local @item chainloader @tab local @tab local @tab no @tab local
@item cpuid @tab partial @tab partial @tab partial @tab no @item cpuid @tab partial @tab partial @tab partial @tab no
@item rdmsr @tab partial @tab partial @tab partial @tab no
@item wrmsr @tab partial @tab partial @tab partial @tab no
@item hints @tab guess @tab guess @tab good @tab guess @item hints @tab guess @tab guess @tab good @tab guess
@item PCI @tab yes @tab yes @tab yes @tab no @item PCI @tab yes @tab yes @tab yes @tab no
@item badram @tab yes @tab yes @tab no @tab yes @item badram @tab yes @tab yes @tab no @tab yes
@@ -5908,8 +5749,6 @@ to install to is specified, UUID is used instead as well.
@item USB @tab yes @tab no @tab no @tab no @item USB @tab yes @tab no @tab no @tab no
@item chainloader @tab yes @tab no @tab no @tab no @item chainloader @tab yes @tab no @tab no @tab no
@item cpuid @tab no @tab no @tab no @tab no @item cpuid @tab no @tab no @tab no @tab no
@item rdmsr @tab no @tab no @tab no @tab no
@item wrmsr @tab no @tab no @tab no @tab no
@item hints @tab good @tab good @tab good @tab no @item hints @tab good @tab good @tab good @tab no
@item PCI @tab yes @tab no @tab no @tab no @item PCI @tab yes @tab no @tab no @tab no
@item badram @tab yes (*) @tab no @tab no @tab no @item badram @tab yes (*) @tab no @tab no @tab no
@@ -5929,8 +5768,6 @@ to install to is specified, UUID is used instead as well.
@item USB @tab N/A @tab yes @tab no @item USB @tab N/A @tab yes @tab no
@item chainloader @tab yes @tab no @tab yes @item chainloader @tab yes @tab no @tab yes
@item cpuid @tab no @tab no @tab yes @item cpuid @tab no @tab no @tab yes
@item rdmsr @tab no @tab no @tab yes
@item wrmsr @tab no @tab no @tab yes
@item hints @tab guess @tab no @tab no @item hints @tab guess @tab no @tab no
@item PCI @tab no @tab no @tab no @item PCI @tab no @tab no @tab no
@item badram @tab yes (*) @tab no @tab no @item badram @tab yes (*) @tab no @tab no
+6 -9
View File
@@ -28,11 +28,11 @@ import re
GRUB_PLATFORMS = [ "emu", "i386_pc", "i386_efi", "i386_qemu", "i386_coreboot", GRUB_PLATFORMS = [ "emu", "i386_pc", "i386_efi", "i386_qemu", "i386_coreboot",
"i386_multiboot", "i386_ieee1275", "x86_64_efi", "i386_multiboot", "i386_ieee1275", "x86_64_efi",
"i386_xen", "x86_64_xen", "i386_xen_pvh", "i386_xen", "x86_64_xen",
"mips_loongson", "sparc64_ieee1275", "mips_loongson", "sparc64_ieee1275",
"powerpc_ieee1275", "mips_arc", "ia64_efi", "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", "riscv32_efi", "riscv64_efi" ] "arm_coreboot"]
GROUPS = {} GROUPS = {}
@@ -47,12 +47,9 @@ GROUPS["sparc64"] = [ "sparc64_ieee1275" ]
GROUPS["powerpc"] = [ "powerpc_ieee1275" ] GROUPS["powerpc"] = [ "powerpc_ieee1275" ]
GROUPS["arm"] = [ "arm_uboot", "arm_efi", "arm_coreboot" ] GROUPS["arm"] = [ "arm_uboot", "arm_efi", "arm_coreboot" ]
GROUPS["arm64"] = [ "arm64_efi" ] GROUPS["arm64"] = [ "arm64_efi" ]
GROUPS["riscv32"] = [ "riscv32_efi" ]
GROUPS["riscv64"] = [ "riscv64_efi" ]
# Groups based on firmware # Groups based on firmware
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["ieee1275"] = [ "i386_ieee1275", "sparc64_ieee1275", "powerpc_ieee1275" ]
GROUPS["uboot"] = [ "arm_uboot" ] GROUPS["uboot"] = [ "arm_uboot" ]
GROUPS["xen"] = [ "i386_xen", "x86_64_xen" ] GROUPS["xen"] = [ "i386_xen", "x86_64_xen" ]
@@ -74,16 +71,16 @@ GROUPS["videomodules"] = GRUB_PLATFORMS[:];
for i in GROUPS["videoinkernel"]: GROUPS["videomodules"].remove(i) for i in GROUPS["videoinkernel"]: GROUPS["videomodules"].remove(i)
# Similar for terminfo # Similar for terminfo
GROUPS["terminfoinkernel"] = [ "emu", "mips_loongson", "mips_arc", "mips_qemu_mips", "i386_xen_pvh" ] + GROUPS["xen"] + GROUPS["ieee1275"] + GROUPS["uboot"]; GROUPS["terminfoinkernel"] = [ "emu", "mips_loongson", "mips_arc", "mips_qemu_mips" ] + GROUPS["xen"] + GROUPS["ieee1275"] + GROUPS["uboot"];
GROUPS["terminfomodule"] = GRUB_PLATFORMS[:]; GROUPS["terminfomodule"] = GRUB_PLATFORMS[:];
for i in GROUPS["terminfoinkernel"]: GROUPS["terminfomodule"].remove(i) for i in GROUPS["terminfoinkernel"]: GROUPS["terminfomodule"].remove(i)
# Flattened Device Trees (FDT) # Flattened Device Trees (FDT)
GROUPS["fdt"] = [ "arm64_efi", "arm_uboot", "arm_efi", "riscv32_efi", "riscv64_efi" ] GROUPS["fdt"] = [ "arm64_efi", "arm_uboot", "arm_efi" ]
# Needs software helpers for division # Needs software helpers for division
# Must match GRUB_DIVISION_IN_SOFTWARE in misc.h # Must match GRUB_DIVISION_IN_SOFTWARE in misc.h
GROUPS["softdiv"] = GROUPS["arm"] + ["ia64_efi"] + GROUPS["riscv32"] GROUPS["softdiv"] = GROUPS["arm"] + ["ia64_efi"]
GROUPS["no_softdiv"] = GRUB_PLATFORMS[:] GROUPS["no_softdiv"] = GRUB_PLATFORMS[:]
for i in GROUPS["softdiv"]: GROUPS["no_softdiv"].remove(i) for i in GROUPS["softdiv"]: GROUPS["no_softdiv"].remove(i)
+1 -30
View File
@@ -101,20 +101,7 @@ KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/int.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
endif endif
if COND_i386_xen_pvh
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/int.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/loader.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/xen.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/xen/hypercall.h
endif
if COND_i386_efi if COND_i386_efi
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.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/efi/disk.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
@@ -124,7 +111,6 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/pmtimer.h
endif endif
if COND_i386_coreboot if COND_i386_coreboot
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/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.h
@@ -136,7 +122,6 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/acpi.h
endif endif
if COND_i386_multiboot if COND_i386_multiboot
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/acpi.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/acpi.h
endif endif
@@ -147,7 +132,6 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
endif endif
if COND_i386_ieee1275 if COND_i386_ieee1275
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/ieee1275/ieee1275.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/ieee1275/ieee1275.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
@@ -156,7 +140,6 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
endif endif
if COND_i386_xen if COND_i386_xen
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/xen.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/xen.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/xen/hypercall.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/xen/hypercall.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h
@@ -175,7 +158,6 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/loader.h
endif endif
if COND_x86_64_efi if COND_x86_64_efi
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.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/efi/disk.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
@@ -272,6 +254,7 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/fdtbus.h
endif endif
if COND_arm_efi 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/efi.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/arm/system.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/arm/system.h
@@ -284,18 +267,6 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/acpi.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/acpi.h
endif endif
if COND_riscv32_efi
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/acpi.h
endif
if COND_riscv64_efi
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/acpi.h
endif
if COND_emu if COND_emu
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/datetime.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/datetime.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/emu/misc.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/emu/misc.h
+28 -135
View File
@@ -65,28 +65,20 @@ kernel = {
arm64_efi_ldflags = '-Wl,-r,-d'; arm64_efi_ldflags = '-Wl,-r,-d';
arm64_efi_stripflags = '--strip-unneeded -K start -R .note -R .comment -R .note.gnu.gold-version -R .eh_frame'; arm64_efi_stripflags = '--strip-unneeded -K start -R .note -R .comment -R .note.gnu.gold-version -R .eh_frame';
riscv32_efi_ldflags = '-Wl,-r,-d';
riscv32_efi_stripflags = '--strip-unneeded -K start -R .note -R .comment -R .note.gnu.gold-version -R .eh_frame';
riscv64_efi_ldflags = '-Wl,-r,-d';
riscv64_efi_stripflags = '--strip-unneeded -K start -R .note -R .comment -R .note.gnu.gold-version -R .eh_frame';
i386_pc_ldflags = '$(TARGET_IMG_LDFLAGS)'; i386_pc_ldflags = '$(TARGET_IMG_LDFLAGS)';
i386_pc_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x9000'; i386_pc_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x9000';
i386_qemu_ldflags = '$(TARGET_IMG_LDFLAGS)'; i386_qemu_ldflags = '$(TARGET_IMG_LDFLAGS)';
i386_qemu_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x9000'; i386_qemu_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x8200';
i386_coreboot_ldflags = '$(TARGET_IMG_LDFLAGS)'; i386_coreboot_ldflags = '$(TARGET_IMG_LDFLAGS)';
i386_coreboot_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x9000'; i386_coreboot_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x8200';
i386_multiboot_ldflags = '$(TARGET_IMG_LDFLAGS)'; i386_multiboot_ldflags = '$(TARGET_IMG_LDFLAGS)';
i386_multiboot_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x9000'; i386_multiboot_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x8200';
i386_ieee1275_ldflags = '$(TARGET_IMG_LDFLAGS)'; i386_ieee1275_ldflags = '$(TARGET_IMG_LDFLAGS)';
i386_ieee1275_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x10000'; i386_ieee1275_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x10000';
i386_xen_ldflags = '$(TARGET_IMG_LDFLAGS)'; i386_xen_ldflags = '$(TARGET_IMG_LDFLAGS)';
i386_xen_ldflags = '$(TARGET_IMG_BASE_LDOPT),0'; i386_xen_ldflags = '$(TARGET_IMG_BASE_LDOPT),0';
x86_64_xen_ldflags = '$(TARGET_IMG_LDFLAGS)'; x86_64_xen_ldflags = '$(TARGET_IMG_LDFLAGS)';
x86_64_xen_ldflags = '$(TARGET_IMG_BASE_LDOPT),0'; x86_64_xen_ldflags = '$(TARGET_IMG_BASE_LDOPT),0';
i386_xen_pvh_ldflags = '$(TARGET_IMG_LDFLAGS)';
i386_xen_pvh_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x100000';
mips_loongson_ldflags = '-Wl,-Ttext,0x80200000'; mips_loongson_ldflags = '-Wl,-Ttext,0x80200000';
powerpc_ieee1275_ldflags = '-Wl,-Ttext,0x200000'; powerpc_ieee1275_ldflags = '-Wl,-Ttext,0x200000';
@@ -108,7 +100,6 @@ kernel = {
x86_64_efi_startup = kern/x86_64/efi/startup.S; x86_64_efi_startup = kern/x86_64/efi/startup.S;
i386_xen_startup = kern/i386/xen/startup.S; i386_xen_startup = kern/i386/xen/startup.S;
x86_64_xen_startup = kern/x86_64/xen/startup.S; x86_64_xen_startup = kern/x86_64/xen/startup.S;
i386_xen_pvh_startup = kern/i386/xen/startup_pvh.S;
i386_qemu_startup = kern/i386/qemu/startup.S; i386_qemu_startup = kern/i386/qemu/startup.S;
i386_ieee1275_startup = kern/i386/ieee1275/startup.S; i386_ieee1275_startup = kern/i386/ieee1275/startup.S;
i386_coreboot_startup = kern/i386/coreboot/startup.S; i386_coreboot_startup = kern/i386/coreboot/startup.S;
@@ -120,8 +111,6 @@ kernel = {
arm_coreboot_startup = kern/arm/startup.S; arm_coreboot_startup = kern/arm/startup.S;
arm_efi_startup = kern/arm/efi/startup.S; arm_efi_startup = kern/arm/efi/startup.S;
arm64_efi_startup = kern/arm64/efi/startup.S; arm64_efi_startup = kern/arm64/efi/startup.S;
riscv32_efi_startup = kern/riscv/efi/startup.S;
riscv64_efi_startup = kern/riscv/efi/startup.S;
common = kern/command.c; common = kern/command.c;
common = kern/corecmd.c; common = kern/corecmd.c;
@@ -188,7 +177,6 @@ kernel = {
i386 = kern/i386/dl.c; i386 = kern/i386/dl.c;
i386_xen = kern/i386/dl.c; i386_xen = kern/i386/dl.c;
i386_xen_pvh = kern/i386/dl.c;
i386_coreboot = kern/i386/coreboot/init.c; i386_coreboot = kern/i386/coreboot/init.c;
i386_multiboot = kern/i386/coreboot/init.c; i386_multiboot = kern/i386/coreboot/init.c;
@@ -234,14 +222,6 @@ kernel = {
xen = disk/xen/xendisk.c; xen = disk/xen/xendisk.c;
xen = commands/boot.c; xen = commands/boot.c;
i386_xen_pvh = commands/boot.c;
i386_xen_pvh = disk/xen/xendisk.c;
i386_xen_pvh = kern/i386/tsc.c;
i386_xen_pvh = kern/i386/xen/tsc.c;
i386_xen_pvh = kern/i386/xen/pvh.c;
i386_xen_pvh = kern/xen/init.c;
i386_xen_pvh = term/xen/console.c;
ia64_efi = kern/ia64/efi/startup.S; ia64_efi = kern/ia64/efi/startup.S;
ia64_efi = kern/ia64/efi/init.c; ia64_efi = kern/ia64/efi/init.c;
ia64_efi = kern/ia64/dl.c; ia64_efi = kern/ia64/dl.c;
@@ -249,17 +229,12 @@ kernel = {
ia64_efi = kern/ia64/cache.c; ia64_efi = kern/ia64/cache.c;
arm_efi = kern/arm/efi/init.c; arm_efi = kern/arm/efi/init.c;
arm_efi = kern/arm/efi/misc.c;
arm_efi = kern/efi/fdt.c; arm_efi = kern/efi/fdt.c;
arm64_efi = kern/arm64/efi/init.c; arm64_efi = kern/arm64/efi/init.c;
arm64_efi = kern/efi/fdt.c; arm64_efi = kern/efi/fdt.c;
riscv32_efi = kern/riscv/efi/init.c;
riscv32_efi = kern/efi/fdt.c;
riscv64_efi = kern/riscv/efi/init.c;
riscv64_efi = kern/efi/fdt.c;
i386_pc = kern/i386/pc/init.c; i386_pc = kern/i386/pc/init.c;
i386_pc = kern/i386/pc/mmap.c; i386_pc = kern/i386/pc/mmap.c;
i386_pc = term/i386/pc/console.c; i386_pc = term/i386/pc/console.c;
@@ -317,7 +292,6 @@ kernel = {
sparc64_ieee1275 = kern/sparc64/cache.S; sparc64_ieee1275 = kern/sparc64/cache.S;
sparc64_ieee1275 = kern/sparc64/dl.c; sparc64_ieee1275 = kern/sparc64/dl.c;
sparc64_ieee1275 = kern/sparc64/ieee1275/ieee1275.c; sparc64_ieee1275 = kern/sparc64/ieee1275/ieee1275.c;
sparc64_ieee1275 = disk/ieee1275/obdisk.c;
arm = kern/arm/dl.c; arm = kern/arm/dl.c;
arm = kern/arm/dl_helper.c; arm = kern/arm/dl_helper.c;
@@ -332,14 +306,6 @@ kernel = {
arm64 = kern/arm64/dl.c; arm64 = kern/arm64/dl.c;
arm64 = kern/arm64/dl_helper.c; arm64 = kern/arm64/dl_helper.c;
riscv32 = kern/riscv/cache.c;
riscv32 = kern/riscv/cache_flush.S;
riscv32 = kern/riscv/dl.c;
riscv64 = kern/riscv/cache.c;
riscv64 = kern/riscv/cache_flush.S;
riscv64 = kern/riscv/dl.c;
emu = disk/host.c; emu = disk/host.c;
emu = kern/emu/cache_s.S; emu = kern/emu/cache_s.S;
emu = kern/emu/hostdisk.c; emu = kern/emu/hostdisk.c;
@@ -395,7 +361,7 @@ program = {
ldadd = 'kernel.exec$(EXEEXT)'; ldadd = 'kernel.exec$(EXEEXT)';
ldadd = '$(MODULE_FILES)'; ldadd = '$(MODULE_FILES)';
ldadd = 'lib/gnulib/libgnu.a $(LIBINTL) $(LIBUTIL) $(LIBSDL) $(LIBUSB) $(LIBPCIACCESS) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; ldadd = 'gnulib/libgnu.a $(LIBINTL) $(LIBUTIL) $(LIBSDL) $(LIBUSB) $(LIBPCIACCESS) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
enable = emu; enable = emu;
}; };
@@ -407,7 +373,7 @@ program = {
emu_nodist = symlist.c; emu_nodist = symlist.c;
ldadd = 'kernel.exec$(EXEEXT)'; ldadd = 'kernel.exec$(EXEEXT)';
ldadd = 'lib/gnulib/libgnu.a $(LIBINTL) $(LIBUTIL) $(LIBSDL) $(LIBUSB) $(LIBPCIACCESS) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)'; ldadd = 'gnulib/libgnu.a $(LIBINTL) $(LIBUTIL) $(LIBSDL) $(LIBUSB) $(LIBPCIACCESS) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
enable = emu; enable = emu;
}; };
@@ -425,14 +391,8 @@ image = {
i386_qemu_ldflags = '$(TARGET_IMG_BASE_LDOPT),$(GRUB_BOOT_MACHINE_LINK_ADDR)'; i386_qemu_ldflags = '$(TARGET_IMG_BASE_LDOPT),$(GRUB_BOOT_MACHINE_LINK_ADDR)';
i386_qemu_ccasflags = '-DGRUB_BOOT_MACHINE_LINK_ADDR=$(GRUB_BOOT_MACHINE_LINK_ADDR)'; i386_qemu_ccasflags = '-DGRUB_BOOT_MACHINE_LINK_ADDR=$(GRUB_BOOT_MACHINE_LINK_ADDR)';
/* The entry point for a.out binaries on sparc64 starts sparc64_ieee1275_objcopyflags = '-O a.out-sunos-big';
at 0x4000. Since we are writing the 32 bytes long a.out sparc64_ieee1275_ldflags = ' -Wl,-Ttext=0x4000';
header in the assembly code ourselves, we need to tell
the linker to adjust the start of the text segment to
0x4000 - 0x20 = 0x3fe0.
*/
sparc64_ieee1275_ldflags = ' -Wl,-Ttext=0x3fe0';
sparc64_ieee1275_objcopyflags = '-O binary';
objcopyflags = '-O binary'; objcopyflags = '-O binary';
enable = i386_pc; enable = i386_pc;
@@ -461,10 +421,8 @@ image = {
i386_pc_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x7C00'; i386_pc_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x7C00';
sparc64_ieee1275 = boot/sparc64/ieee1275/boot.S; sparc64_ieee1275 = boot/sparc64/ieee1275/boot.S;
sparc64_ieee1275_objcopyflags = '-O a.out-sunos-big';
/* See comment for sparc64_ieee1275_ldflags above. */ sparc64_ieee1275_ldflags = ' -Wl,-Ttext=0x4000';
sparc64_ieee1275_ldflags = ' -Wl,-Ttext=0x3fe0';
sparc64_ieee1275_objcopyflags = '-O binary';
sparc64_ieee1275_cppflags = '-DCDBOOT=1'; sparc64_ieee1275_cppflags = '-DCDBOOT=1';
objcopyflags = '-O binary'; objcopyflags = '-O binary';
@@ -739,7 +697,7 @@ module = {
name = regexp; name = regexp;
common = commands/regexp.c; common = commands/regexp.c;
common = commands/wildcard.c; common = commands/wildcard.c;
common = lib/gnulib/regex.c; common = gnulib/regex.c;
cflags = '$(CFLAGS_POSIX) $(CFLAGS_GNULIB)'; cflags = '$(CFLAGS_POSIX) $(CFLAGS_GNULIB)';
cppflags = '$(CPPFLAGS_POSIX) $(CPPFLAGS_GNULIB)'; cppflags = '$(CPPFLAGS_POSIX) $(CPPFLAGS_GNULIB)';
}; };
@@ -823,8 +781,6 @@ module = {
enable = arm64_efi; enable = arm64_efi;
enable = arm_uboot; enable = arm_uboot;
enable = arm_coreboot; enable = arm_coreboot;
enable = riscv32_efi;
enable = riscv64_efi;
}; };
module = { module = {
@@ -846,7 +802,6 @@ module = {
name = cpuid; name = cpuid;
common = commands/i386/cpuid.c; common = commands/i386/cpuid.c;
enable = x86; enable = x86;
enable = i386_xen_pvh;
enable = i386_xen; enable = i386_xen;
enable = x86_64_xen; enable = x86_64_xen;
}; };
@@ -906,7 +861,6 @@ module = {
i386_coreboot = lib/i386/halt.c; i386_coreboot = lib/i386/halt.c;
i386_qemu = lib/i386/halt.c; i386_qemu = lib/i386/halt.c;
xen = lib/xen/halt.c; xen = lib/xen/halt.c;
i386_xen_pvh = lib/xen/halt.c;
efi = lib/efi/halt.c; efi = lib/efi/halt.c;
ieee1275 = lib/ieee1275/halt.c; ieee1275 = lib/ieee1275/halt.c;
emu = lib/emu/halt.c; emu = lib/emu/halt.c;
@@ -918,13 +872,16 @@ module = {
name = reboot; name = reboot;
i386 = lib/i386/reboot.c; i386 = lib/i386/reboot.c;
i386 = lib/i386/reboot_trampoline.S; 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; powerpc_ieee1275 = lib/ieee1275/reboot.c;
sparc64_ieee1275 = lib/ieee1275/reboot.c; sparc64_ieee1275 = lib/ieee1275/reboot.c;
mips_arc = lib/mips/arc/reboot.c; mips_arc = lib/mips/arc/reboot.c;
mips_loongson = lib/mips/loongson/reboot.c; mips_loongson = lib/mips/loongson/reboot.c;
mips_qemu_mips = lib/mips/qemu_mips/reboot.c; mips_qemu_mips = lib/mips/qemu_mips/reboot.c;
xen = lib/xen/reboot.c; xen = lib/xen/reboot.c;
i386_xen_pvh = lib/xen/reboot.c;
uboot = lib/uboot/reboot.c; uboot = lib/uboot/reboot.c;
arm_coreboot = lib/dummy/reboot.c; arm_coreboot = lib/dummy/reboot.c;
common = commands/reboot.c; common = commands/reboot.c;
@@ -936,26 +893,21 @@ module = {
}; };
module = { module = {
name = pgp; name = verify;
common = commands/pgp.c; common = commands/verify.c;
cflags = '$(CFLAGS_POSIX)'; cflags = '$(CFLAGS_POSIX)';
cppflags = '-I$(srcdir)/lib/posix_wrap'; cppflags = '-I$(srcdir)/lib/posix_wrap';
}; };
module = { module = {
name = verifiers; name = verify_helper;
common = commands/verifiers.c; common = commands/verify_helper.c;
};
module = {
name = shim_lock;
common = commands/efi/shim_lock.c;
enable = x86_64_efi;
}; };
module = { module = {
name = hdparm; name = hdparm;
common = commands/hdparm.c; common = commands/hdparm.c;
common = lib/hexdump.c;
enable = pci; enable = pci;
enable = mips_qemu_mips; enable = mips_qemu_mips;
}; };
@@ -1319,27 +1271,12 @@ module = {
common = fs/bfs.c; common = fs/bfs.c;
}; };
module = {
name = zstd;
common = lib/zstd/debug.c;
common = lib/zstd/entropy_common.c;
common = lib/zstd/error_private.c;
common = lib/zstd/fse_decompress.c;
common = lib/zstd/huf_decompress.c;
common = lib/zstd/module.c;
common = lib/zstd/xxhash.c;
common = lib/zstd/zstd_common.c;
common = lib/zstd/zstd_decompress.c;
cflags = '$(CFLAGS_POSIX) -Wno-undef';
cppflags = '-I$(srcdir)/lib/posix_wrap -I$(srcdir)/lib/zstd';
};
module = { module = {
name = btrfs; name = btrfs;
common = fs/btrfs.c; common = fs/btrfs.c;
common = lib/crc.c; common = lib/crc.c;
cflags = '$(CFLAGS_POSIX) -Wno-undef'; cflags = '$(CFLAGS_POSIX) -Wno-undef';
cppflags = '-I$(srcdir)/lib/posix_wrap -I$(srcdir)/lib/minilzo -I$(srcdir)/lib/zstd -DMINILZO_HAVE_CONFIG_H'; cppflags = '-I$(srcdir)/lib/posix_wrap -I$(srcdir)/lib/minilzo -DMINILZO_HAVE_CONFIG_H';
}; };
module = { module = {
@@ -1387,11 +1324,6 @@ module = {
common = fs/exfat.c; common = fs/exfat.c;
}; };
module = {
name = f2fs;
common = fs/f2fs.c;
};
module = { module = {
name = fshelp; name = fshelp;
common = fs/fshelp.c; common = fs/fshelp.c;
@@ -1619,18 +1551,12 @@ module = {
x86 = lib/i386/relocator16.S; x86 = lib/i386/relocator16.S;
x86 = lib/i386/relocator32.S; x86 = lib/i386/relocator32.S;
x86 = lib/i386/relocator64.S; x86 = lib/i386/relocator64.S;
i386_xen_pvh = lib/i386/relocator16.S;
i386_xen_pvh = lib/i386/relocator32.S;
i386_xen_pvh = lib/i386/relocator64.S;
i386 = lib/i386/relocator_asm.S; i386 = lib/i386/relocator_asm.S;
i386_xen_pvh = lib/i386/relocator_asm.S;
x86_64 = lib/x86_64/relocator_asm.S; x86_64 = lib/x86_64/relocator_asm.S;
i386_xen = lib/i386/relocator_asm.S; i386_xen = lib/i386/relocator_asm.S;
x86_64_xen = lib/x86_64/relocator_asm.S; x86_64_xen = lib/x86_64/relocator_asm.S;
x86 = lib/i386/relocator.c; x86 = lib/i386/relocator.c;
x86 = lib/i386/relocator_common_c.c; x86 = lib/i386/relocator_common_c.c;
i386_xen_pvh = lib/i386/relocator.c;
i386_xen_pvh = lib/i386/relocator_common_c.c;
ieee1275 = lib/ieee1275/relocator.c; ieee1275 = lib/ieee1275/relocator.c;
efi = lib/efi/relocator.c; efi = lib/efi/relocator.c;
mips = lib/mips/relocator_asm.S; mips = lib/mips/relocator_asm.S;
@@ -1649,7 +1575,6 @@ module = {
enable = mips; enable = mips;
enable = powerpc; enable = powerpc;
enable = x86; enable = x86;
enable = i386_xen_pvh;
enable = xen; enable = xen;
}; };
@@ -1664,7 +1589,6 @@ module = {
sparc64_ieee1275 = lib/ieee1275/cmos.c; sparc64_ieee1275 = lib/ieee1275/cmos.c;
powerpc_ieee1275 = lib/ieee1275/cmos.c; powerpc_ieee1275 = lib/ieee1275/cmos.c;
xen = lib/xen/datetime.c; xen = lib/xen/datetime.c;
i386_xen_pvh = lib/xen/datetime.c;
mips_arc = lib/arc/datetime.c; mips_arc = lib/arc/datetime.c;
enable = noemu; enable = noemu;
@@ -1682,7 +1606,6 @@ module = {
extra_dist = lib/ia64/longjmp.S; extra_dist = lib/ia64/longjmp.S;
extra_dist = lib/arm/setjmp.S; extra_dist = lib/arm/setjmp.S;
extra_dist = lib/arm64/setjmp.S; extra_dist = lib/arm64/setjmp.S;
extra_dist = lib/riscv/setjmp.S;
}; };
module = { module = {
@@ -1713,6 +1636,8 @@ module = {
module = { module = {
name = linux16; name = linux16;
common = loader/i386/pc/linux.c; common = loader/i386/pc/linux.c;
common = loader/linux.c;
common = lib/cmdline.c;
enable = x86; enable = x86;
}; };
@@ -1747,24 +1672,24 @@ module = {
cppflags = "-DGRUB_USE_MULTIBOOT2"; cppflags = "-DGRUB_USE_MULTIBOOT2";
common = loader/multiboot.c; common = loader/multiboot.c;
common = lib/cmdline.c;
common = loader/multiboot_mbi2.c; common = loader/multiboot_mbi2.c;
enable = x86; enable = x86;
enable = i386_xen_pvh;
enable = mips; enable = mips;
}; };
module = { module = {
name = multiboot; name = multiboot;
common = loader/multiboot.c; common = loader/multiboot.c;
common = lib/cmdline.c;
x86 = loader/i386/multiboot_mbi.c; x86 = loader/i386/multiboot_mbi.c;
i386_xen_pvh = loader/i386/multiboot_mbi.c;
extra_dist = loader/multiboot_elfxx.c; extra_dist = loader/multiboot_elfxx.c;
enable = x86; enable = x86;
enable = i386_xen_pvh;
}; };
module = { module = {
name = xen_boot; name = xen_boot;
common = lib/cmdline.c;
arm64 = loader/arm64/xen_boot.c; arm64 = loader/arm64/xen_boot.c;
enable = arm64; enable = arm64;
}; };
@@ -1772,20 +1697,14 @@ module = {
module = { module = {
name = linux; name = linux;
x86 = loader/i386/linux.c; x86 = loader/i386/linux.c;
i386_xen_pvh = loader/i386/linux.c;
xen = loader/i386/xen.c; xen = loader/i386/xen.c;
i386_pc = lib/i386/pc/vesa_modes_table.c; i386_pc = lib/i386/pc/vesa_modes_table.c;
i386_xen_pvh = lib/i386/pc/vesa_modes_table.c;
mips = loader/mips/linux.c; mips = loader/mips/linux.c;
powerpc_ieee1275 = loader/powerpc/ieee1275/linux.c; powerpc_ieee1275 = loader/powerpc/ieee1275/linux.c;
sparc64_ieee1275 = loader/sparc64/ieee1275/linux.c; sparc64_ieee1275 = loader/sparc64/ieee1275/linux.c;
ia64_efi = loader/ia64/efi/linux.c; ia64_efi = loader/ia64/efi/linux.c;
arm_coreboot = loader/arm/linux.c; arm = loader/arm/linux.c;
arm_efi = loader/arm64/linux.c;
arm_uboot = loader/arm/linux.c;
arm64 = loader/arm64/linux.c; arm64 = loader/arm64/linux.c;
riscv32 = loader/riscv/linux.c;
riscv64 = loader/riscv/linux.c;
common = loader/linux.c; common = loader/linux.c;
common = lib/cmdline.c; common = lib/cmdline.c;
enable = noemu; enable = noemu;
@@ -1793,7 +1712,7 @@ module = {
module = { module = {
name = fdt; name = fdt;
efi = loader/efi/fdt.c; arm64 = loader/arm64/fdt.c;
common = lib/fdt.c; common = lib/fdt.c;
enable = fdt; enable = fdt;
}; };
@@ -1865,8 +1784,6 @@ module = {
common = mmap/mmap.c; common = mmap/mmap.c;
x86 = mmap/i386/uppermem.c; x86 = mmap/i386/uppermem.c;
x86 = mmap/i386/mmap.c; x86 = mmap/i386/mmap.c;
i386_xen_pvh = mmap/i386/uppermem.c;
i386_xen_pvh = mmap/i386/mmap.c;
i386_pc = mmap/i386/pc/mmap.c; i386_pc = mmap/i386/pc/mmap.c;
i386_pc = mmap/i386/pc/mmap_helper.S; i386_pc = mmap/i386/pc/mmap_helper.S;
@@ -1876,12 +1793,9 @@ module = {
mips = mmap/mips/uppermem.c; mips = mmap/mips/uppermem.c;
enable = x86; enable = x86;
enable = i386_xen_pvh;
enable = ia64_efi; enable = ia64_efi;
enable = arm_efi; enable = arm_efi;
enable = arm64_efi; enable = arm64_efi;
enable = riscv32_efi;
enable = riscv64_efi;
enable = mips; enable = mips;
}; };
@@ -2118,7 +2032,6 @@ module = {
name = legacy_password_test; name = legacy_password_test;
common = tests/legacy_password_test.c; common = tests/legacy_password_test.c;
enable = i386_pc; enable = i386_pc;
enable = i386_xen_pvh;
enable = i386_efi; enable = i386_efi;
enable = x86_64_efi; enable = x86_64_efi;
enable = emu; enable = emu;
@@ -2317,7 +2230,6 @@ module = {
xen = lib/i386/pc/vesa_modes_table.c; xen = lib/i386/pc/vesa_modes_table.c;
enable = i386_pc; enable = i386_pc;
enable = i386_xen_pvh;
enable = i386_efi; enable = i386_efi;
enable = x86_64_efi; enable = x86_64_efi;
enable = emu; enable = emu;
@@ -2361,12 +2273,10 @@ module = {
module = { module = {
name = backtrace; name = backtrace;
x86 = lib/i386/backtrace.c; x86 = lib/i386/backtrace.c;
i386_xen_pvh = lib/i386/backtrace.c;
i386_xen = lib/i386/backtrace.c; i386_xen = lib/i386/backtrace.c;
x86_64_xen = lib/i386/backtrace.c; x86_64_xen = lib/i386/backtrace.c;
common = lib/backtrace.c; common = lib/backtrace.c;
enable = x86; enable = x86;
enable = i386_xen_pvh;
enable = i386_xen; enable = i386_xen;
enable = x86_64_xen; enable = x86_64_xen;
}; };
@@ -2465,13 +2375,6 @@ module = {
common = commands/testspeed.c; common = commands/testspeed.c;
}; };
module = {
name = tpm;
common = commands/tpm.c;
efi = commands/efi/tpm.c;
enable = x86_64_efi;
};
module = { module = {
name = tr; name = tr;
common = commands/tr.c; common = commands/tr.c;
@@ -2493,13 +2396,3 @@ module = {
common = loader/i386/xen_file64.c; common = loader/i386/xen_file64.c;
extra_dist = loader/i386/xen_fileXX.c; extra_dist = loader/i386/xen_fileXX.c;
}; };
module = {
name = rdmsr;
common = commands/i386/rdmsr.c;
enable = x86;
};
module = {
name = wrmsr;
common = commands/i386/wrmsr.c;
enable = x86;
};
+2 -2
View File
@@ -37,8 +37,8 @@
start: start:
_start: _start:
/* /*
* _start is loaded at 0x8000 and is jumped to with * _start is loaded at 0x2000 and is jumped to with
* CS:IP 0:0x8000 in kernel. * CS:IP 0:0x2000 in kernel.
*/ */
/* /*
-9
View File
@@ -118,16 +118,7 @@ LOCAL (codestart):
#include "../../../kern/i386/realmode.S" #include "../../../kern/i386/realmode.S"
/*
*
* This is a workaround for clang adding a section containing only .addrsig
* Since clang itself is unable to assemble this pseudo-opcode, just replace
* it with .text
*
*/
#define addrsig text
#include <rs_decoder.h> #include <rs_decoder.h>
#undef addrsig
.text .text
+4 -36
View File
@@ -21,24 +21,6 @@
.text .text
.align 4 .align 4
/*
* We're writing the a.out header ourselves as newer
* upstream versions of binutils no longer support
* the a.out format on sparc64.
*
* The boot loader fits into 512 bytes with 32 bytes
* used for the a.out header, hence the text segment
* size is 512 - 32. There is no data segment and no
* code relocation, thus those fields remain zero.
*/
.word 0x1030107 /* Magic number. */
.word 512 - GRUB_BOOT_AOUT_HEADER_SIZE /* Size of text segment. */
.word 0 /* Size of initialized data. */
.word 0 /* Size of uninitialized data. */
.word 0 /* Size of symbol table || checksum. */
.word _start /* Entry point. */
.word 0 /* Size of text relocation. */
.word 0 /* Size of data relocation. */
.globl _start .globl _start
_start: _start:
/* OF CIF entry point arrives in %o4 */ /* OF CIF entry point arrives in %o4 */
@@ -48,7 +30,7 @@ pic_base:
#ifndef CDBOOT #ifndef CDBOOT
/* The offsets to these locations are defined by the /* The offsets to these locations are defined by the
* GRUB_BOOT_MACHINE_foo macros in include/grub/sparc64/ieee1275/boot.h, * GRUB_BOOT_MACHINE_foo macros in include/grub/sparc/ieee1275/boot.h,
* and grub-setup uses this to patch these next three values as needed. * and grub-setup uses this to patch these next three values as needed.
* *
* The boot_path will be the OF device path of the partition where the * The boot_path will be the OF device path of the partition where the
@@ -58,14 +40,10 @@ pic_base:
* *
* After loading in that block we will execute it by jumping to the * After loading in that block we will execute it by jumping to the
* load address plus the size of the prepended A.OUT header (32 bytes). * load address plus the size of the prepended A.OUT header (32 bytes).
*
* Since this assembly code includes the 32 bytes long a.out header,
* we need to move the actual code entry point forward by the size
* of the a.out header, i.e. += GRUB_BOOT_AOUT_HEADER_SIZE.
*/ */
.org GRUB_BOOT_MACHINE_BOOT_DEVPATH + GRUB_BOOT_AOUT_HEADER_SIZE .org GRUB_BOOT_MACHINE_BOOT_DEVPATH
boot_path: boot_path:
.org GRUB_BOOT_MACHINE_KERNEL_BYTE + GRUB_BOOT_AOUT_HEADER_SIZE .org GRUB_BOOT_MACHINE_KERNEL_BYTE
boot_path_end: boot_path_end:
kernel_byte: .xword (2 << 9) kernel_byte: .xword (2 << 9)
kernel_address: .word GRUB_BOOT_MACHINE_KERNEL_ADDR kernel_address: .word GRUB_BOOT_MACHINE_KERNEL_ADDR
@@ -74,7 +52,7 @@ kernel_address: .word GRUB_BOOT_MACHINE_KERNEL_ADDR
#define boot_path_end (_start + 1024) #define boot_path_end (_start + 1024)
#include <grub/offsets.h> #include <grub/offsets.h>
.org 8 + GRUB_BOOT_AOUT_HEADER_SIZE .org 8
kernel_byte: .xword (2 << 9) kernel_byte: .xword (2 << 9)
kernel_size: .word 512 kernel_size: .word 512
kernel_address: .word GRUB_BOOT_SPARC64_IEEE1275_IMAGE_ADDRESS kernel_address: .word GRUB_BOOT_SPARC64_IEEE1275_IMAGE_ADDRESS
@@ -91,10 +69,6 @@ prom_seek_name: .asciz "seek"
prom_read_name: .asciz "read" prom_read_name: .asciz "read"
prom_exit_name: .asciz "exit" prom_exit_name: .asciz "exit"
grub_name: .asciz "GRUB " grub_name: .asciz "GRUB "
#ifdef CDBOOT
prom_close_name: .asciz "close"
#endif
#define GRUB_NAME_LEN 5 #define GRUB_NAME_LEN 5
.align 4 .align 4
@@ -239,12 +213,6 @@ bootpath_known:
call prom_call_3_1_o1 call prom_call_3_1_o1
#ifdef CDBOOT #ifdef CDBOOT
LDUW_ABS(kernel_size, 0x00, %o3) 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 #else
mov 512, %o3 mov 512, %o3
#endif #endif
+4 -4
View File
@@ -504,8 +504,8 @@ grub_ehci_init_device (volatile void *regs)
#endif #endif
grub_dprintf ("ehci", grub_dprintf ("ehci",
"EHCI grub_ehci_pci_iter: iobase of oper. regs: %08llxx\n", "EHCI grub_ehci_pci_iter: iobase of oper. regs: %08x\n",
(unsigned long long) (grub_addr_t) e->iobase_ehcc + caplen); (grub_addr_t) e->iobase_ehcc + caplen);
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: COMMAND: %08x\n", grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: COMMAND: %08x\n",
grub_ehci_oper_read32 (e, GRUB_EHCI_COMMAND)); grub_ehci_oper_read32 (e, GRUB_EHCI_COMMAND));
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: STATUS: %08x\n", grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: STATUS: %08x\n",
@@ -696,8 +696,8 @@ grub_ehci_init_device (volatile void *regs)
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: OK at all\n"); grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: OK at all\n");
grub_dprintf ("ehci", grub_dprintf ("ehci",
"EHCI grub_ehci_pci_iter: iobase of oper. regs: %08llx\n", "EHCI grub_ehci_pci_iter: iobase of oper. regs: %08x\n",
(unsigned long long) (grub_addr_t) regs); (grub_addr_t) regs);
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: COMMAND: %08x\n", grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: COMMAND: %08x\n",
grub_ehci_oper_read32 (e, GRUB_EHCI_COMMAND)); grub_ehci_oper_read32 (e, GRUB_EHCI_COMMAND));
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: STATUS: %08x\n", grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: STATUS: %08x\n",
+1 -3
View File
@@ -109,10 +109,8 @@ grub_cmd_lsefi (grub_command_t cmd __attribute__ ((unused)),
status = efi_call_3 (grub_efi_system_table->boot_services->protocols_per_handle, status = efi_call_3 (grub_efi_system_table->boot_services->protocols_per_handle,
handle, &protocols, &num_protocols); handle, &protocols, &num_protocols);
if (status != GRUB_EFI_SUCCESS) { if (status != GRUB_EFI_SUCCESS)
grub_printf ("Unable to retrieve protocols\n"); grub_printf ("Unable to retrieve protocols\n");
continue;
}
for (j = 0; j < num_protocols; j++) for (j = 0; j < num_protocols; j++)
{ {
for (k = 0; k < ARRAY_SIZE (known_protocols); k++) for (k = 0; k < ARRAY_SIZE (known_protocols); k++)
-142
View File
@@ -1,142 +0,0 @@
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2017 Free Software Foundation, Inc.
*
* GRUB is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* GRUB is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
*
* EFI shim lock verifier.
*/
#include <grub/dl.h>
#include <grub/efi/efi.h>
#include <grub/err.h>
#include <grub/file.h>
#include <grub/misc.h>
#include <grub/verify.h>
GRUB_MOD_LICENSE ("GPLv3+");
#define GRUB_EFI_SHIM_LOCK_GUID \
{ 0x605dab50, 0xe046, 0x4300, \
{ 0xab, 0xb6, 0x3d, 0xd8, 0x10, 0xdd, 0x8b, 0x23 } \
}
struct grub_efi_shim_lock_protocol
{
grub_efi_status_t
(*verify) (void *buffer, grub_uint32_t size);
};
typedef struct grub_efi_shim_lock_protocol grub_efi_shim_lock_protocol_t;
static grub_efi_guid_t shim_lock_guid = GRUB_EFI_SHIM_LOCK_GUID;
static grub_efi_shim_lock_protocol_t *sl;
/* List of modules which cannot be loaded if UEFI secure boot mode is enabled. */
static const char * const disabled_mods[] = {"iorw", "memrw", "wrmsr", NULL};
static grub_err_t
shim_lock_init (grub_file_t io, enum grub_file_type type,
void **context __attribute__ ((unused)),
enum grub_verify_flags *flags)
{
const char *b, *e;
int i;
*flags = GRUB_VERIFY_FLAGS_SKIP_VERIFICATION;
if (!sl)
return GRUB_ERR_NONE;
switch (type & GRUB_FILE_TYPE_MASK)
{
case GRUB_FILE_TYPE_GRUB_MODULE:
/* Establish GRUB module name. */
b = grub_strrchr (io->name, '/');
e = grub_strrchr (io->name, '.');
b = b ? (b + 1) : io->name;
e = e ? e : io->name + grub_strlen (io->name);
e = (e > b) ? e : io->name + grub_strlen (io->name);
for (i = 0; disabled_mods[i]; i++)
if (!grub_strncmp (b, disabled_mods[i], grub_strlen (b) - grub_strlen (e)))
{
grub_error (GRUB_ERR_ACCESS_DENIED,
N_("module cannot be loaded in UEFI secure boot mode: %s"),
io->name);
return GRUB_ERR_ACCESS_DENIED;
}
/* Fall through. */
case GRUB_FILE_TYPE_ACPI_TABLE:
case GRUB_FILE_TYPE_DEVICE_TREE_IMAGE:
*flags = GRUB_VERIFY_FLAGS_DEFER_AUTH;
return GRUB_ERR_NONE;
case GRUB_FILE_TYPE_LINUX_KERNEL:
case GRUB_FILE_TYPE_MULTIBOOT_KERNEL:
case GRUB_FILE_TYPE_BSD_KERNEL:
case GRUB_FILE_TYPE_XNU_KERNEL:
case GRUB_FILE_TYPE_PLAN9_KERNEL:
for (i = 0; disabled_mods[i]; i++)
if (grub_dl_get (disabled_mods[i]))
{
grub_error (GRUB_ERR_ACCESS_DENIED,
N_("cannot boot due to dangerous module in memory: %s"),
disabled_mods[i]);
return GRUB_ERR_ACCESS_DENIED;
}
*flags = GRUB_VERIFY_FLAGS_SINGLE_CHUNK;
/* Fall through. */
default:
return GRUB_ERR_NONE;
}
}
static grub_err_t
shim_lock_write (void *context __attribute__ ((unused)), void *buf, grub_size_t size)
{
if (sl->verify (buf, size) != GRUB_EFI_SUCCESS)
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad shim signature"));
return GRUB_ERR_NONE;
}
struct grub_file_verifier shim_lock =
{
.name = "shim_lock",
.init = shim_lock_init,
.write = shim_lock_write
};
GRUB_MOD_INIT(shim_lock)
{
sl = grub_efi_locate_protocol (&shim_lock_guid, 0);
grub_verifier_register (&shim_lock);
if (!sl)
return;
grub_dl_set_persistent (mod);
}
GRUB_MOD_FINI(shim_lock)
{
grub_verifier_unregister (&shim_lock);
}
-333
View File
@@ -1,333 +0,0 @@
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2018 Free Software Foundation, Inc.
*
* GRUB is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* GRUB is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
*
* EFI TPM support code.
*/
#include <grub/err.h>
#include <grub/i18n.h>
#include <grub/efi/api.h>
#include <grub/efi/efi.h>
#include <grub/efi/tpm.h>
#include <grub/mm.h>
#include <grub/tpm.h>
#include <grub/term.h>
typedef TCG_PCR_EVENT grub_tpm_event_t;
static grub_efi_guid_t tpm_guid = EFI_TPM_GUID;
static grub_efi_guid_t tpm2_guid = EFI_TPM2_GUID;
static grub_efi_handle_t *grub_tpm_handle;
static grub_uint8_t grub_tpm_version;
static grub_int8_t tpm1_present = -1;
static grub_int8_t tpm2_present = -1;
static grub_efi_boolean_t
grub_tpm1_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;
if (tpm1_present != -1)
return (grub_efi_boolean_t) tpm1_present;
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 tpm1_present = 0;
return tpm1_present = 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);
if (tpm2_present != -1)
return (grub_efi_boolean_t) tpm2_present;
status = efi_call_2 (tpm->get_capability, tpm, &caps);
if (status != GRUB_EFI_SUCCESS || !caps.TPMPresentFlag)
return tpm2_present = 0;
return tpm2_present = 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;
if (grub_tpm_handle != NULL)
{
*tpm_handle = grub_tpm_handle;
*protocol_version = grub_tpm_version;
return 1;
}
handles = grub_efi_locate_handle (GRUB_EFI_BY_PROTOCOL, &tpm_guid, NULL,
&num_handles);
if (handles && num_handles > 0)
{
grub_tpm_handle = handles[0];
*tpm_handle = handles[0];
grub_tpm_version = 1;
*protocol_version = 1;
return 1;
}
handles = grub_efi_locate_handle (GRUB_EFI_BY_PROTOCOL, &tpm2_guid, NULL,
&num_handles);
if (handles && num_handles > 0)
{
grub_tpm_handle = handles[0];
*tpm_handle = handles[0];
grub_tpm_version = 2;
*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_tpm1_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;
/* Absence of a TPM isn't a failure. */
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)
{
grub_tpm_event_t *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_tpm1_present (tpm))
return 0;
event = grub_zalloc (sizeof (*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, (grub_addr_t) 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, (grub_addr_t) 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);
}
+18 -30
View File
@@ -27,8 +27,6 @@
#include <grub/elf.h> #include <grub/elf.h>
#include <grub/xen_file.h> #include <grub/xen_file.h>
#include <grub/efi/pe32.h> #include <grub/efi/pe32.h>
#include <grub/arm/linux.h>
#include <grub/arm64/linux.h>
#include <grub/i386/linux.h> #include <grub/i386/linux.h>
#include <grub/xnu.h> #include <grub/xnu.h>
#include <grub/machoload.h> #include <grub/machoload.h>
@@ -90,10 +88,6 @@ static const struct grub_arg_option options[] = {
N_("Check if FILE is ARM64 EFI file"), 0, 0}, N_("Check if FILE is ARM64 EFI file"), 0, 0},
{"is-arm-efi", 0, 0, {"is-arm-efi", 0, 0,
N_("Check if FILE is ARM EFI file"), 0, 0}, N_("Check if FILE is ARM EFI file"), 0, 0},
{"is-riscv32-efi", 0, 0,
N_("Check if FILE is RISC-V 32bit EFI file"), 0, 0},
{"is-riscv64-efi", 0, 0,
N_("Check if FILE is RISC-V 64bit EFI file"), 0, 0},
{"is-hibernated-hiberfil", 0, 0, {"is-hibernated-hiberfil", 0, 0,
N_("Check if FILE is hiberfil.sys in hibernated state"), 0, 0}, N_("Check if FILE is hiberfil.sys in hibernated state"), 0, 0},
{"is-x86_64-xnu", 0, 0, {"is-x86_64-xnu", 0, 0,
@@ -134,7 +128,6 @@ enum
IS_IA_EFI, IS_IA_EFI,
IS_ARM64_EFI, IS_ARM64_EFI,
IS_ARM_EFI, IS_ARM_EFI,
IS_RISCV_EFI,
IS_HIBERNATED, IS_HIBERNATED,
IS_XNU64, IS_XNU64,
IS_XNU32, IS_XNU32,
@@ -390,19 +383,21 @@ grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char **args)
} }
case IS_ARM_LINUX: case IS_ARM_LINUX:
{ {
struct linux_arm_kernel_header lh; grub_uint32_t sig, sig_pi;
if (grub_file_read (file, &sig_pi, 4) != 4)
if (grub_file_read (file, &lh, sizeof (lh)) != sizeof (lh))
break; break;
/* Short forward branch in A32 state (for Raspberry pi kernels). */ /* Raspberry pi. */
if (lh.code0 == grub_cpu_to_le32_compile_time (0xea000006)) if (sig_pi == grub_cpu_to_le32_compile_time (0xea000006))
{ {
ret = 1; ret = 1;
break; break;
} }
if (lh.magic == if (grub_file_seek (file, 0x24) == (grub_size_t) -1)
grub_cpu_to_le32_compile_time (GRUB_LINUX_ARM_MAGIC_SIGNATURE)) break;
if (grub_file_read (file, &sig, 4) != 4)
break;
if (sig == grub_cpu_to_le32_compile_time (0x016f2818))
{ {
ret = 1; ret = 1;
break; break;
@@ -411,13 +406,13 @@ grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char **args)
} }
case IS_ARM64_LINUX: case IS_ARM64_LINUX:
{ {
struct linux_arm64_kernel_header lh; grub_uint32_t sig;
if (grub_file_read (file, &lh, sizeof (lh)) != sizeof (lh)) if (grub_file_seek (file, 0x38) == (grub_size_t) -1)
break; break;
if (grub_file_read (file, &sig, 4) != 4)
if (lh.magic == break;
grub_cpu_to_le32_compile_time (GRUB_LINUX_ARM64_MAGIC_SIGNATURE)) if (sig == grub_cpu_to_le32_compile_time (0x644d5241))
{ {
ret = 1; ret = 1;
break; break;
@@ -502,7 +497,7 @@ grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char **args)
case IS_X86_LINUX32: case IS_X86_LINUX32:
case IS_X86_LINUX: case IS_X86_LINUX:
{ {
struct linux_i386_kernel_header lh; struct linux_kernel_header lh;
if (grub_file_read (file, &lh, sizeof (lh)) != sizeof (lh)) if (grub_file_read (file, &lh, sizeof (lh)) != sizeof (lh))
break; break;
if (lh.boot_flag != grub_cpu_to_le16_compile_time (0xaa55)) if (lh.boot_flag != grub_cpu_to_le16_compile_time (0xaa55))
@@ -513,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. */ /* FIXME: some really old kernels (< 1.3.73) will fail this. */
if (lh.header != if (lh.header !=
grub_cpu_to_le32_compile_time (GRUB_LINUX_I386_MAGIC_SIGNATURE) grub_cpu_to_le32_compile_time (GRUB_LINUX_MAGIC_SIGNATURE)
|| grub_le_to_cpu16 (lh.version) < 0x0200) || grub_le_to_cpu16 (lh.version) < 0x0200)
break; break;
@@ -526,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 /* FIXME: 2.03 is not always good enough (Linux 2.4 can be 2.03 and
still not support 32-bit boot. */ still not support 32-bit boot. */
if (lh.header != if (lh.header !=
grub_cpu_to_le32_compile_time (GRUB_LINUX_I386_MAGIC_SIGNATURE) grub_cpu_to_le32_compile_time (GRUB_LINUX_MAGIC_SIGNATURE)
|| grub_le_to_cpu16 (lh.version) < 0x0203) || grub_le_to_cpu16 (lh.version) < 0x0203)
break; break;
@@ -576,7 +571,6 @@ grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char **args)
case IS_IA_EFI: case IS_IA_EFI:
case IS_ARM64_EFI: case IS_ARM64_EFI:
case IS_ARM_EFI: case IS_ARM_EFI:
case IS_RISCV_EFI:
{ {
char signature[4]; char signature[4];
grub_uint32_t pe_offset; grub_uint32_t pe_offset;
@@ -622,13 +616,7 @@ grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char **args)
&& coff_head.machine != && coff_head.machine !=
grub_cpu_to_le16_compile_time (GRUB_PE32_MACHINE_ARMTHUMB_MIXED)) grub_cpu_to_le16_compile_time (GRUB_PE32_MACHINE_ARMTHUMB_MIXED))
break; break;
if (type == IS_RISCV_EFI if (type == IS_IA_EFI || type == IS_64_EFI || type == IS_ARM64_EFI)
&& coff_head.machine !=
grub_cpu_to_le16_compile_time (GRUB_PE32_MACHINE_RISCV64))
/* TODO: Determine bitness dynamically */
break;
if (type == IS_IA_EFI || type == IS_64_EFI || type == IS_ARM64_EFI ||
type == IS_RISCV_EFI)
{ {
struct grub_pe64_optional_header o64; struct grub_pe64_optional_header o64;
if (grub_file_read (file, &o64, sizeof (o64)) != sizeof (o64)) if (grub_file_read (file, &o64, sizeof (o64)) != sizeof (o64))
+3 -3
View File
@@ -143,13 +143,13 @@ check_list (const gcry_md_spec_t *hash, const char *hashfilename,
return grub_errno; return grub_errno;
file = grub_file_open (filename, GRUB_FILE_TYPE_TO_HASH file = grub_file_open (filename, GRUB_FILE_TYPE_TO_HASH
| (!uncompress ? GRUB_FILE_TYPE_NO_DECOMPRESS | (!uncompress ? GRUB_FILE_TYPE_NO_DECOMPRESS
: GRUB_FILE_TYPE_NONE)); : 0));
grub_free (filename); grub_free (filename);
} }
else else
file = grub_file_open (p, GRUB_FILE_TYPE_TO_HASH file = grub_file_open (p, GRUB_FILE_TYPE_TO_HASH
| (!uncompress ? GRUB_FILE_TYPE_NO_DECOMPRESS | (!uncompress ? GRUB_FILE_TYPE_NO_DECOMPRESS
: GRUB_FILE_TYPE_NONE)); : 0));
if (!file) if (!file)
{ {
grub_file_close (hashlist); grub_file_close (hashlist);
@@ -242,7 +242,7 @@ grub_cmd_hashsum (struct grub_extcmd_context *ctxt,
unsigned j; unsigned j;
file = grub_file_open (args[i], GRUB_FILE_TYPE_TO_HASH file = grub_file_open (args[i], GRUB_FILE_TYPE_TO_HASH
| (!uncompress ? GRUB_FILE_TYPE_NO_DECOMPRESS | (!uncompress ? GRUB_FILE_TYPE_NO_DECOMPRESS
: GRUB_FILE_TYPE_NONE)); : 0));
if (!file) if (!file)
{ {
if (!keep) if (!keep)
+79
View File
@@ -0,0 +1,79 @@
/* nthibr.c - tests whether an MS Windows system partition is hibernated */
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2013 Peter Lustig
* 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 <http://www.gnu.org/licenses/>.
*/
#include <grub/types.h>
#include <grub/mm.h>
#include <grub/file.h>
#include <grub/misc.h>
#include <grub/dl.h>
#include <grub/command.h>
#include <grub/err.h>
#include <grub/i18n.h>
GRUB_MOD_LICENSE ("GPLv3+");
static grub_err_t
grub_cmd_nthibr (grub_command_t cmd __attribute__ ((unused)),
int argc, char **args)
{
grub_uint8_t hibr_file_magic[4];
grub_file_t hibr_file = 0;
if (argc != 1)
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));
hibr_file = grub_file_open (args[0], GRUB_FILE_TYPE_FILE_ID);
if (!hibr_file)
return grub_errno;
/* Try to read magic number of 'hiberfil.sys' */
if (grub_file_read (hibr_file, hibr_file_magic,
sizeof (hibr_file_magic))
!= (grub_ssize_t) sizeof (hibr_file_magic))
{
if (!grub_errno)
grub_error (GRUB_ERR_TEST_FAILURE, "false");
goto exit;
}
if (!(grub_memcmp ("hibr", hibr_file_magic, sizeof (hibr_file_magic)) == 0
|| grub_memcmp ("HIBR", hibr_file_magic, sizeof (hibr_file_magic)) == 0))
grub_error (GRUB_ERR_TEST_FAILURE, "false");
exit:
grub_file_close (hibr_file);
return grub_errno;
}
static grub_command_t cmd;
GRUB_MOD_INIT (check_nt_hiberfil)
{
cmd = grub_register_command ("check_nt_hiberfil", grub_cmd_nthibr,
N_("FILE"),
N_("Test whether a hiberfil.sys is "
"in hibernated state."));
}
GRUB_MOD_FINI (check_nt_hiberfil)
{
grub_unregister_command (cmd);
}
-102
View File
@@ -1,102 +0,0 @@
/* rdmsr.c - Read CPU model-specific registers. */
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2019 Free Software Foundation, Inc.
* Based on gcc/gcc/config/i386/driver-i386.c
*
* GRUB is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* GRUB is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
*/
#include <grub/dl.h>
#include <grub/misc.h>
#include <grub/mm.h>
#include <grub/env.h>
#include <grub/command.h>
#include <grub/extcmd.h>
#include <grub/i18n.h>
#include <grub/i386/cpuid.h>
#include <grub/i386/rdmsr.h>
GRUB_MOD_LICENSE("GPLv3+");
static grub_extcmd_t cmd_read;
static const struct grub_arg_option options[] =
{
{0, 'v', 0, N_("Save read value into variable VARNAME."),
N_("VARNAME"), ARG_TYPE_STRING},
{0, 0, 0, 0, 0, 0}
};
static grub_err_t
grub_cmd_msr_read (grub_extcmd_context_t ctxt, int argc, char **argv)
{
grub_uint32_t manufacturer[3], max_cpuid, a, b, c, features, addr;
grub_uint64_t value;
char *ptr;
char buf[sizeof("1122334455667788")];
/*
* The CPUID instruction should be used to determine whether MSRs
* are supported. (CPUID.01H:EDX[5] = 1)
*/
if (! grub_cpu_is_cpuid_supported ())
return grub_error (GRUB_ERR_BUG, N_("unsupported instruction"));
grub_cpuid (0, max_cpuid, manufacturer[0], manufacturer[2], manufacturer[1]);
if (max_cpuid < 1)
return grub_error (GRUB_ERR_BUG, N_("unsupported instruction"));
grub_cpuid (1, a, b, c, features);
if (!(features & (1 << 5)))
return grub_error (GRUB_ERR_BUG, N_("unsupported instruction"));
if (argc != 1)
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));
grub_errno = GRUB_ERR_NONE;
ptr = argv[0];
addr = grub_strtoul (ptr, &ptr, 0);
if (grub_errno != GRUB_ERR_NONE)
return grub_errno;
if (*ptr != '\0')
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("invalid argument"));
value = grub_msr_read (addr);
if (ctxt->state[0].set)
{
grub_snprintf (buf, sizeof(buf), "%llx", (unsigned long long) value);
grub_env_set (ctxt->state[0].arg, buf);
}
else
grub_printf ("0x%llx\n", (unsigned long long) value);
return GRUB_ERR_NONE;
}
GRUB_MOD_INIT(rdmsr)
{
cmd_read = grub_register_extcmd ("rdmsr", grub_cmd_msr_read, 0, N_("ADDR"),
N_("Read a CPU model specific register."),
options);
}
GRUB_MOD_FINI(rdmsr)
{
grub_unregister_extcmd (cmd_read);
}
-93
View File
@@ -1,93 +0,0 @@
/* wrmsr.c - Write CPU model-specific registers. */
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2019 Free Software Foundation, Inc.
* Based on gcc/gcc/config/i386/driver-i386.c
*
* GRUB is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* GRUB is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
*/
#include <grub/dl.h>
#include <grub/misc.h>
#include <grub/mm.h>
#include <grub/env.h>
#include <grub/command.h>
#include <grub/extcmd.h>
#include <grub/i18n.h>
#include <grub/i386/cpuid.h>
#include <grub/i386/wrmsr.h>
GRUB_MOD_LICENSE("GPLv3+");
static grub_command_t cmd_write;
static grub_err_t
grub_cmd_msr_write (grub_command_t cmd __attribute__ ((unused)), int argc, char **argv)
{
grub_uint32_t manufacturer[3], max_cpuid, a, b, c, features, addr;
grub_uint64_t value;
char *ptr;
/*
* The CPUID instruction should be used to determine whether MSRs
* are supported. (CPUID.01H:EDX[5] = 1)
*/
if (!grub_cpu_is_cpuid_supported ())
return grub_error (GRUB_ERR_BUG, N_("unsupported instruction"));
grub_cpuid (0, max_cpuid, manufacturer[0], manufacturer[2], manufacturer[1]);
if (max_cpuid < 1)
return grub_error (GRUB_ERR_BUG, N_("unsupported instruction"));
grub_cpuid (1, a, b, c, features);
if (!(features & (1 << 5)))
return grub_error (GRUB_ERR_BUG, N_("unsupported instruction"));
if (argc != 2)
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("two arguments expected"));
grub_errno = GRUB_ERR_NONE;
ptr = argv[0];
addr = grub_strtoul (ptr, &ptr, 0);
if (grub_errno != GRUB_ERR_NONE)
return grub_errno;
if (*ptr != '\0')
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("invalid argument"));
ptr = argv[1];
value = grub_strtoull (ptr, &ptr, 0);
if (grub_errno != GRUB_ERR_NONE)
return grub_errno;
if (*ptr != '\0')
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("invalid argument"));
grub_msr_write (addr, value);
return GRUB_ERR_NONE;
}
GRUB_MOD_INIT(wrmsr)
{
cmd_write = grub_register_command ("wrmsr", grub_cmd_msr_write, N_("ADDR VALUE"),
N_("Write a value to a CPU model specific register."));
}
GRUB_MOD_FINI(wrmsr)
{
grub_unregister_command (cmd_write);
}
+3 -3
View File
@@ -40,7 +40,7 @@ static struct grub_keyboard_layout layout_us = {
/* 0x10 */ 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', /* 0x10 */ 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
/* 0x18 */ 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', /* 0x18 */ 'u', 'v', 'w', 'x', 'y', 'z', '1', '2',
/* 0x20 */ '3', '4', '5', '6', '7', '8', '9', '0', /* 0x20 */ '3', '4', '5', '6', '7', '8', '9', '0',
/* 0x28 */ '\n', GRUB_TERM_ESC, GRUB_TERM_BACKSPACE, GRUB_TERM_TAB, ' ', '-', '=', '[', /* 0x28 */ '\n', '\e', '\b', '\t', ' ', '-', '=', '[',
/* According to usage table 0x31 should be mapped to '/' /* According to usage table 0x31 should be mapped to '/'
but testing with real keyboard shows that 0x32 is remapped to '/'. but testing with real keyboard shows that 0x32 is remapped to '/'.
Map 0x31 to 0. Map 0x31 to 0.
@@ -82,8 +82,8 @@ static struct grub_keyboard_layout layout_us = {
/* 0x10 */ 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', /* 0x10 */ 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
/* 0x18 */ 'U', 'V', 'W', 'X', 'Y', 'Z', '!', '@', /* 0x18 */ 'U', 'V', 'W', 'X', 'Y', 'Z', '!', '@',
/* 0x20 */ '#', '$', '%', '^', '&', '*', '(', ')', /* 0x20 */ '#', '$', '%', '^', '&', '*', '(', ')',
/* 0x28 */ '\n' | GRUB_TERM_SHIFT, GRUB_TERM_ESC | GRUB_TERM_SHIFT, /* 0x28 */ '\n' | GRUB_TERM_SHIFT, '\e' | GRUB_TERM_SHIFT,
/* 0x2a */ GRUB_TERM_BACKSPACE | GRUB_TERM_SHIFT, GRUB_TERM_TAB | GRUB_TERM_SHIFT, /* 0x2a */ '\b' | GRUB_TERM_SHIFT, '\t' | GRUB_TERM_SHIFT,
/* 0x2c */ ' ' | GRUB_TERM_SHIFT, '_', '+', '{', /* 0x2c */ ' ' | GRUB_TERM_SHIFT, '_', '+', '{',
/* According to usage table 0x31 should be mapped to '/' /* According to usage table 0x31 should be mapped to '/'
but testing with real keyboard shows that 0x32 is remapped to '/'. but testing with real keyboard shows that 0x32 is remapped to '/'.
+2 -2
View File
@@ -169,7 +169,7 @@ grub_cmd_load_env (grub_extcmd_context_t ctxt, int argc, char **args)
file = open_envblk_file ((state[0].set) ? state[0].arg : 0, file = open_envblk_file ((state[0].set) ? state[0].arg : 0,
GRUB_FILE_TYPE_LOADENV GRUB_FILE_TYPE_LOADENV
| (state[1].set | (state[1].set
? GRUB_FILE_TYPE_SKIP_SIGNATURE : GRUB_FILE_TYPE_NONE)); ? GRUB_FILE_TYPE_SKIP_SIGNATURE : 0));
if (! file) if (! file)
return grub_errno; return grub_errno;
@@ -207,7 +207,7 @@ grub_cmd_list_env (grub_extcmd_context_t ctxt,
file = open_envblk_file ((state[0].set) ? state[0].arg : 0, file = open_envblk_file ((state[0].set) ? state[0].arg : 0,
GRUB_FILE_TYPE_LOADENV GRUB_FILE_TYPE_LOADENV
| (state[1].set | (state[1].set
? GRUB_FILE_TYPE_SKIP_SIGNATURE : GRUB_FILE_TYPE_NONE)); ? GRUB_FILE_TYPE_SKIP_SIGNATURE : 0));
if (! file) if (! file)
return grub_errno; return grub_errno;
+2 -11
View File
@@ -201,15 +201,6 @@ grub_ls_list_files (char *dirname, int longlist, int all, int human)
if (grub_errno == GRUB_ERR_UNKNOWN_FS) if (grub_errno == GRUB_ERR_UNKNOWN_FS)
grub_errno = GRUB_ERR_NONE; 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); grub_normal_print_device_info (device_name);
} }
else if (fs) else if (fs)
@@ -221,9 +212,9 @@ grub_ls_list_files (char *dirname, int longlist, int all, int human)
}; };
if (longlist) if (longlist)
(fs->fs_dir) (dev, path, print_files_long, &ctx); (fs->dir) (dev, path, print_files_long, &ctx);
else else
(fs->fs_dir) (dev, path, print_files, &ctx); (fs->dir) (dev, path, print_files, &ctx);
if (grub_errno == GRUB_ERR_BAD_FILE_TYPE if (grub_errno == GRUB_ERR_BAD_FILE_TYPE
&& path[grub_strlen (path) - 1] != '/') && path[grub_strlen (path) - 1] != '/')
+2 -2
View File
@@ -159,12 +159,12 @@ grub_mac_bless_file (grub_device_t dev, const char *path_in, int intel)
*tail = 0; *tail = 0;
ctx.dirname = tail + 1; ctx.dirname = tail + 1;
(fs->fs_dir) (dev, *path == 0 ? "/" : path, find_inode, &ctx); (fs->dir) (dev, *path == 0 ? "/" : path, find_inode, &ctx);
} }
else else
{ {
ctx.dirname = path + 1; ctx.dirname = path + 1;
(fs->fs_dir) (dev, "/", find_inode, &ctx); (fs->dir) (dev, "/", find_inode, &ctx);
} }
if (!ctx.found) if (!ctx.found)
{ {
+2 -2
View File
@@ -52,8 +52,8 @@ static struct
int key; int key;
} hotkey_aliases[] = } hotkey_aliases[] =
{ {
{"backspace", GRUB_TERM_BACKSPACE}, {"backspace", '\b'},
{"tab", GRUB_TERM_TAB}, {"tab", '\t'},
{"delete", GRUB_TERM_KEY_DC}, {"delete", GRUB_TERM_KEY_DC},
{"insert", GRUB_TERM_KEY_INSERT}, {"insert", GRUB_TERM_KEY_INSERT},
{"f1", GRUB_TERM_KEY_F1}, {"f1", GRUB_TERM_KEY_F1},
-3
View File
@@ -137,9 +137,6 @@ grub_mini_cmd_rmmod (struct grub_command *cmd __attribute__ ((unused)),
if (! mod) if (! mod)
return grub_error (GRUB_ERR_BAD_ARGUMENT, "no such module"); return grub_error (GRUB_ERR_BAD_ARGUMENT, "no such module");
if (grub_dl_is_persistent (mod))
return grub_error (GRUB_ERR_BAD_ARGUMENT, "cannot unload persistent module");
if (grub_dl_unref (mod) <= 0) if (grub_dl_unref (mod) <= 0)
grub_dl_unload (mod); grub_dl_unload (mod);
+1 -2
View File
@@ -66,7 +66,6 @@ get_uuid (const char *name, char **uuid, int getnative)
/* Firmware disks. */ /* Firmware disks. */
case GRUB_DISK_DEVICE_BIOSDISK_ID: case GRUB_DISK_DEVICE_BIOSDISK_ID:
case GRUB_DISK_DEVICE_OFDISK_ID: case GRUB_DISK_DEVICE_OFDISK_ID:
case GRUB_DISK_DEVICE_OBDISK_ID:
case GRUB_DISK_DEVICE_EFIDISK_ID: case GRUB_DISK_DEVICE_EFIDISK_ID:
case GRUB_DISK_DEVICE_NAND_ID: case GRUB_DISK_DEVICE_NAND_ID:
case GRUB_DISK_DEVICE_ARCDISK_ID: case GRUB_DISK_DEVICE_ARCDISK_ID:
@@ -109,7 +108,7 @@ get_uuid (const char *name, char **uuid, int getnative)
grub_device_close (dev); grub_device_close (dev);
return grub_errno; return grub_errno;
} }
if (!fs->fs_uuid || fs->fs_uuid (dev, uuid) || !*uuid) if (!fs->uuid || fs->uuid (dev, uuid) || !*uuid)
{ {
grub_device_close (dev); grub_device_close (dev);
+4 -4
View File
@@ -113,10 +113,10 @@ grub_cmd_probe (grub_extcmd_context_t ctxt, int argc, char **args)
if (state[4].set) if (state[4].set)
{ {
char *uuid; char *uuid;
if (! fs->fs_uuid) if (! fs->uuid)
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
N_("%s does not support UUIDs"), fs->name); N_("%s does not support UUIDs"), fs->name);
err = fs->fs_uuid (dev, &uuid); err = fs->uuid (dev, &uuid);
if (err) if (err)
return err; return err;
if (! uuid) if (! uuid)
@@ -134,11 +134,11 @@ grub_cmd_probe (grub_extcmd_context_t ctxt, int argc, char **args)
if (state[5].set) if (state[5].set)
{ {
char *label; char *label;
if (! fs->fs_label) if (! fs->label)
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
N_("filesystem `%s' does not support labels"), N_("filesystem `%s' does not support labels"),
fs->name); fs->name);
err = fs->fs_label (dev, &label); err = fs->label (dev, &label);
if (err) if (err)
return err; return err;
if (! label) if (! label)
+2 -2
View File
@@ -103,9 +103,9 @@ iterate_device (const char *name, void *data)
fs = grub_fs_probe (dev); fs = grub_fs_probe (dev);
#ifdef DO_SEARCH_FS_UUID #ifdef DO_SEARCH_FS_UUID
#define read_fn fs_uuid #define read_fn uuid
#else #else
#define read_fn fs_label #define read_fn label
#endif #endif
if (fs && fs->read_fn) if (fs && fs->read_fn)
+3 -3
View File
@@ -133,15 +133,15 @@ get_fileinfo (char *path, struct test_parse_ctx *ctx)
/* Fetch writing time. */ /* Fetch writing time. */
ctx->file_info.mtimeset = 0; ctx->file_info.mtimeset = 0;
if (fs->fs_mtime) if (fs->mtime)
{ {
if (! fs->fs_mtime (dev, &ctx->file_info.mtime)) if (! fs->mtime (dev, &ctx->file_info.mtime))
ctx->file_info.mtimeset = 1; ctx->file_info.mtimeset = 1;
grub_errno = GRUB_ERR_NONE; grub_errno = GRUB_ERR_NONE;
} }
} }
else else
(fs->fs_dir) (dev, path, find_file, ctx); (fs->dir) (dev, path, find_file, ctx);
grub_device_close (dev); grub_device_close (dev);
grub_free (path); grub_free (path);
-102
View File
@@ -1,102 +0,0 @@
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2018 Free Software Foundation, Inc.
*
* GRUB is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* GRUB is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
*
* Core TPM support code.
*/
#include <grub/err.h>
#include <grub/i18n.h>
#include <grub/misc.h>
#include <grub/mm.h>
#include <grub/tpm.h>
#include <grub/term.h>
#include <grub/verify.h>
#include <grub/dl.h>
GRUB_MOD_LICENSE ("GPLv3+");
grub_err_t
grub_tpm_measure (unsigned char *buf, grub_size_t size, grub_uint8_t pcr,
const char *description)
{
return grub_tpm_log_event (buf, size, pcr, description);
}
static grub_err_t
grub_tpm_verify_init (grub_file_t io,
enum grub_file_type type __attribute__ ((unused)),
void **context, enum grub_verify_flags *flags)
{
*context = io->name;
*flags |= GRUB_VERIFY_FLAGS_SINGLE_CHUNK;
return GRUB_ERR_NONE;
}
static grub_err_t
grub_tpm_verify_write (void *context, void *buf, grub_size_t size)
{
return grub_tpm_measure (buf, size, GRUB_BINARY_PCR, context);
}
static grub_err_t
grub_tpm_verify_string (char *str, enum grub_verify_string_type type)
{
const char *prefix = NULL;
char *description;
grub_err_t status;
switch (type)
{
case GRUB_VERIFY_KERNEL_CMDLINE:
prefix = "kernel_cmdline: ";
break;
case GRUB_VERIFY_MODULE_CMDLINE:
prefix = "module_cmdline: ";
break;
case GRUB_VERIFY_COMMAND:
prefix = "grub_cmd: ";
break;
}
description = grub_malloc (grub_strlen (str) + grub_strlen (prefix) + 1);
if (!description)
return grub_errno;
grub_memcpy (description, prefix, grub_strlen (prefix));
grub_memcpy (description + grub_strlen (prefix), str,
grub_strlen (str) + 1);
status =
grub_tpm_measure ((unsigned char *) str, grub_strlen (str),
GRUB_STRING_PCR, description);
grub_free (description);
return status;
}
struct grub_file_verifier grub_tpm_verifier = {
.name = "tpm",
.init = grub_tpm_verify_init,
.write = grub_tpm_verify_write,
.verify_string = grub_tpm_verify_string,
};
GRUB_MOD_INIT (tpm)
{
grub_verifier_register (&grub_tpm_verifier);
}
GRUB_MOD_FINI (tpm)
{
grub_verifier_unregister (&grub_tpm_verifier);
}
@@ -454,9 +454,9 @@ grub_verify_signature_init (struct grub_pubkey_context *ctxt, grub_file_t sig)
grub_size_t len; grub_size_t len;
grub_uint8_t h; grub_uint8_t h;
grub_uint8_t t; grub_uint8_t t;
grub_uint8_t pk;
grub_err_t err; grub_err_t err;
grub_uint8_t type = 0; grub_uint8_t type = 0;
grub_uint8_t pk;
grub_memset (ctxt, 0, sizeof (*ctxt)); grub_memset (ctxt, 0, sizeof (*ctxt));
@@ -495,12 +495,13 @@ grub_verify_signature_init (struct grub_pubkey_context *ctxt, grub_file_t sig)
grub_dprintf ("crypt", "alive\n"); grub_dprintf ("crypt", "alive\n");
ctxt->sig = sig;
ctxt->hash_context = grub_zalloc (ctxt->hash->contextsize); ctxt->hash_context = grub_zalloc (ctxt->hash->contextsize);
if (!ctxt->hash_context) if (!ctxt->hash_context)
return grub_errno; return grub_errno;
ctxt->hash->init (ctxt->hash_context); ctxt->hash->init (ctxt->hash_context);
ctxt->sig = sig;
return GRUB_ERR_NONE; return GRUB_ERR_NONE;
} }
@@ -683,26 +684,15 @@ grub_pubkey_close (void *ctxt)
} }
grub_err_t grub_err_t
grub_verify_signature (grub_file_t f, const char *fsig, grub_verify_signature (grub_file_t f, grub_file_t sig,
struct grub_public_key *pkey) struct grub_public_key *pkey)
{ {
grub_file_t sig;
grub_err_t err; grub_err_t err;
struct grub_pubkey_context ctxt; struct grub_pubkey_context ctxt;
grub_uint8_t *readbuf = NULL; grub_uint8_t *readbuf = NULL;
sig = grub_file_open (fsig,
GRUB_FILE_TYPE_SIGNATURE
| GRUB_FILE_TYPE_NO_DECOMPRESS);
if (!sig)
return grub_errno;
err = grub_verify_signature_init (&ctxt, sig); err = grub_verify_signature_init (&ctxt, sig);
if (err) if (err)
{ return err;
grub_file_close (sig);
return err;
}
readbuf = grub_zalloc (READBUF_SIZE); readbuf = grub_zalloc (READBUF_SIZE);
if (!readbuf) if (!readbuf)
@@ -742,7 +732,7 @@ grub_cmd_trust (grub_extcmd_context_t ctxt,
| GRUB_FILE_TYPE_NO_DECOMPRESS | GRUB_FILE_TYPE_NO_DECOMPRESS
| (ctxt->state[OPTION_SKIP_SIG].set | (ctxt->state[OPTION_SKIP_SIG].set
? GRUB_FILE_TYPE_SKIP_SIGNATURE ? GRUB_FILE_TYPE_SKIP_SIGNATURE
: GRUB_FILE_TYPE_NONE)); : 0));
if (!pkf) if (!pkf)
return grub_errno; return grub_errno;
pk = grub_load_public_key (pkf); pk = grub_load_public_key (pkf);
@@ -816,7 +806,7 @@ static grub_err_t
grub_cmd_verify_signature (grub_extcmd_context_t ctxt, grub_cmd_verify_signature (grub_extcmd_context_t ctxt,
int argc, char **args) int argc, char **args)
{ {
grub_file_t f = NULL; grub_file_t f = NULL, sig = NULL;
grub_err_t err = GRUB_ERR_NONE; grub_err_t err = GRUB_ERR_NONE;
struct grub_public_key *pk = NULL; struct grub_public_key *pk = NULL;
@@ -835,7 +825,7 @@ grub_cmd_verify_signature (grub_extcmd_context_t ctxt,
| GRUB_FILE_TYPE_NO_DECOMPRESS | GRUB_FILE_TYPE_NO_DECOMPRESS
| (ctxt->state[OPTION_SKIP_SIG].set | (ctxt->state[OPTION_SKIP_SIG].set
? GRUB_FILE_TYPE_SKIP_SIGNATURE ? GRUB_FILE_TYPE_SKIP_SIGNATURE
: GRUB_FILE_TYPE_NONE)); : 0));
if (!pkf) if (!pkf)
return grub_errno; return grub_errno;
pk = grub_load_public_key (pkf); pk = grub_load_public_key (pkf);
@@ -854,8 +844,19 @@ grub_cmd_verify_signature (grub_extcmd_context_t ctxt,
goto fail; goto fail;
} }
err = grub_verify_signature (f, args[1], pk); sig = grub_file_open (args[1],
GRUB_FILE_TYPE_SIGNATURE
| GRUB_FILE_TYPE_NO_DECOMPRESS);
if (!sig)
{
err = grub_errno;
goto fail;
}
err = grub_verify_signature (f, sig, pk);
fail: fail:
if (sig)
grub_file_close (sig);
if (f) if (f)
grub_file_close (f); grub_file_close (f);
if (pk) if (pk)
@@ -872,7 +873,6 @@ grub_pubkey_init (grub_file_t io, enum grub_file_type type __attribute__ ((unuse
grub_file_t sig; grub_file_t sig;
char *fsuf, *ptr; char *fsuf, *ptr;
grub_err_t err; grub_err_t err;
struct grub_pubkey_context *ctxt;
if (!sec) if (!sec)
{ {
@@ -891,7 +891,8 @@ grub_pubkey_init (grub_file_t io, enum grub_file_type type __attribute__ ((unuse
if (!sig) if (!sig)
return grub_errno; return grub_errno;
ctxt = grub_malloc (sizeof (*ctxt));
struct grub_pubkey_context *ctxt = grub_malloc (sizeof (*ctxt));
if (!ctxt) if (!ctxt)
{ {
grub_file_close (sig); grub_file_close (sig);
@@ -900,8 +901,7 @@ grub_pubkey_init (grub_file_t io, enum grub_file_type type __attribute__ ((unuse
err = grub_verify_signature_init (ctxt, sig); err = grub_verify_signature_init (ctxt, sig);
if (err) if (err)
{ {
grub_free (ctxt); grub_pubkey_close (ctxt);
grub_file_close (sig);
return err; return err;
} }
*context = ctxt; *context = ctxt;
@@ -934,7 +934,7 @@ pseudo_read (struct grub_file *file, char *buf, grub_size_t len)
struct grub_fs pseudo_fs = struct grub_fs pseudo_fs =
{ {
.name = "pseudo", .name = "pseudo",
.fs_read = pseudo_read .read = pseudo_read
}; };
struct grub_file_verifier grub_pubkey_verifier = struct grub_file_verifier grub_pubkey_verifier =
@@ -949,7 +949,7 @@ struct grub_file_verifier grub_pubkey_verifier =
static grub_extcmd_t cmd, cmd_trust; static grub_extcmd_t cmd, cmd_trust;
static grub_command_t cmd_distrust, cmd_list; static grub_command_t cmd_distrust, cmd_list;
GRUB_MOD_INIT(pgp) GRUB_MOD_INIT(verify)
{ {
const char *val; const char *val;
struct grub_module_header *header; struct grub_module_header *header;
@@ -1008,7 +1008,7 @@ GRUB_MOD_INIT(pgp)
grub_verifier_register (&grub_pubkey_verifier); grub_verifier_register (&grub_pubkey_verifier);
} }
GRUB_MOD_FINI(pgp) GRUB_MOD_FINI(verify)
{ {
grub_verifier_unregister (&grub_pubkey_verifier); grub_verifier_unregister (&grub_pubkey_verifier);
grub_unregister_extcmd (cmd); grub_unregister_extcmd (cmd);
@@ -1,23 +1,3 @@
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2017 Free Software Foundation, Inc.
*
* GRUB is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* GRUB is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
*
* Verifiers helper.
*/
#include <grub/file.h> #include <grub/file.h>
#include <grub/verify.h> #include <grub/verify.h>
#include <grub/dl.h> #include <grub/dl.h>
@@ -61,7 +41,7 @@ verified_close (struct grub_file *file)
verified_free (verified); verified_free (verified);
file->data = 0; file->data = 0;
/* Device and name are freed by parent. */ /* device and name are freed by parent */
file->device = 0; file->device = 0;
file->name = 0; file->name = 0;
@@ -71,28 +51,25 @@ verified_close (struct grub_file *file)
struct grub_fs verified_fs = struct grub_fs verified_fs =
{ {
.name = "verified_read", .name = "verified_read",
.fs_read = verified_read, .read = verified_read,
.fs_close = verified_close .close = verified_close
}; };
static grub_file_t static grub_file_t
grub_verifiers_open (grub_file_t io, enum grub_file_type type) grub_verify_helper_open (grub_file_t io, enum grub_file_type type)
{ {
grub_verified_t verified = NULL; grub_verified_t verified = 0;
struct grub_file_verifier *ver; struct grub_file_verifier *ver;
void *context; void *context;
grub_file_t ret = 0; grub_file_t ret = 0;
grub_err_t err; grub_err_t err;
int defer = 0;
grub_dprintf ("verify", "file: %s type: %d\n", io->name, type);
if ((type & GRUB_FILE_TYPE_MASK) == GRUB_FILE_TYPE_SIGNATURE if ((type & GRUB_FILE_TYPE_MASK) == GRUB_FILE_TYPE_SIGNATURE
|| (type & GRUB_FILE_TYPE_MASK) == GRUB_FILE_TYPE_VERIFY_SIGNATURE || (type & GRUB_FILE_TYPE_MASK) == GRUB_FILE_TYPE_VERIFY_SIGNATURE
|| (type & GRUB_FILE_TYPE_SKIP_SIGNATURE)) || (type & GRUB_FILE_TYPE_SKIP_SIGNATURE))
return io; return io;
if (io->device->disk && if (io->device->disk &&
(io->device->disk->dev->id == GRUB_DISK_DEVICE_MEMDISK_ID (io->device->disk->dev->id == GRUB_DISK_DEVICE_MEMDISK_ID
|| io->device->disk->dev->id == GRUB_DISK_DEVICE_PROCFS_ID)) || io->device->disk->dev->id == GRUB_DISK_DEVICE_PROCFS_ID))
return io; return io;
@@ -103,27 +80,12 @@ grub_verifiers_open (grub_file_t io, enum grub_file_type type)
err = ver->init (io, type, &context, &flags); err = ver->init (io, type, &context, &flags);
if (err) if (err)
goto fail_noclose; goto fail_noclose;
if (flags & GRUB_VERIFY_FLAGS_DEFER_AUTH)
{
defer = 1;
continue;
}
if (!(flags & GRUB_VERIFY_FLAGS_SKIP_VERIFICATION)) if (!(flags & GRUB_VERIFY_FLAGS_SKIP_VERIFICATION))
break; break;
} }
if (!ver) if (!ver)
{ /* No verifiers wanted to verify. Just return underlying file. */
if (defer) return io;
{
grub_error (GRUB_ERR_ACCESS_DENIED,
N_("verification requested but nobody cares: %s"), io->name);
goto fail_noclose;
}
/* No verifiers wanted to verify. Just return underlying file. */
return io;
}
ret = grub_malloc (sizeof (*ret)); ret = grub_malloc (sizeof (*ret));
if (!ret) if (!ret)
@@ -137,7 +99,7 @@ grub_verifiers_open (grub_file_t io, enum grub_file_type type)
if (ret->size >> (sizeof (grub_size_t) * GRUB_CHAR_BIT - 1)) if (ret->size >> (sizeof (grub_size_t) * GRUB_CHAR_BIT - 1))
{ {
grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
N_("big file signature isn't implemented yet")); "big file signature isn't implemented yet");
goto fail; goto fail;
} }
verified = grub_malloc (sizeof (*verified)); verified = grub_malloc (sizeof (*verified));
@@ -157,7 +119,7 @@ grub_verifiers_open (grub_file_t io, enum grub_file_type type)
io->name); io->name);
goto fail; goto fail;
} }
err = ver->write (context, verified->buf, ret->size); err = ver->write (context, verified->buf, ret->size);
if (err) if (err)
goto fail; goto fail;
@@ -166,8 +128,7 @@ grub_verifiers_open (grub_file_t io, enum grub_file_type type)
if (err) if (err)
goto fail; goto fail;
if (ver->close) ver->close (context);
ver->close (context);
FOR_LIST_ELEMENTS_NEXT(ver, grub_file_verifiers) FOR_LIST_ELEMENTS_NEXT(ver, grub_file_verifiers)
{ {
@@ -175,9 +136,7 @@ grub_verifiers_open (grub_file_t io, enum grub_file_type type)
err = ver->init (io, type, &context, &flags); err = ver->init (io, type, &context, &flags);
if (err) if (err)
goto fail_noclose; goto fail_noclose;
if (flags & GRUB_VERIFY_FLAGS_SKIP_VERIFICATION || if (flags & GRUB_VERIFY_FLAGS_SKIP_VERIFICATION)
/* Verification done earlier. So, we are happy here. */
flags & GRUB_VERIFY_FLAGS_DEFER_AUTH)
continue; continue;
err = ver->write (context, verified->buf, ret->size); err = ver->write (context, verified->buf, ret->size);
if (err) if (err)
@@ -187,8 +146,7 @@ grub_verifiers_open (grub_file_t io, enum grub_file_type type)
if (err) if (err)
goto fail; goto fail;
if (ver->close) ver->close (context);
ver->close (context);
} }
verified->file = io; verified->file = io;
@@ -217,12 +175,12 @@ grub_verify_string (char *str, enum grub_verify_string_type type)
return GRUB_ERR_NONE; return GRUB_ERR_NONE;
} }
GRUB_MOD_INIT(verifiers) GRUB_MOD_INIT(verify_helper)
{ {
grub_file_filter_register (GRUB_FILE_FILTER_VERIFY, grub_verifiers_open); grub_file_filter_register (GRUB_FILE_FILTER_VERIFY, grub_verify_helper_open);
} }
GRUB_MOD_FINI(verifiers) GRUB_MOD_FINI(verify_helper)
{ {
grub_file_filter_unregister (GRUB_FILE_FILTER_VERIFY); grub_file_filter_unregister (GRUB_FILE_FILTER_VERIFY);
} }
+2 -2
View File
@@ -370,7 +370,7 @@ match_files (const char *prefix, const char *suffix, const char *end,
else else
path = ctx.dir; path = ctx.dir;
if (fs->fs_dir (dev, path, match_files_iter, &ctx)) if (fs->dir (dev, path, match_files_iter, &ctx))
goto fail; goto fail;
grub_free (ctx.dir); grub_free (ctx.dir);
@@ -452,7 +452,7 @@ check_file (const char *dir, const char *basename)
else else
path = dir; path = dir;
fs->fs_dir (dev, path[0] ? path : "/", check_file_iter, &ctx); fs->dir (dev, path[0] ? path : "/", check_file_iter, &ctx);
if (grub_errno == 0 && basename[0] == 0) if (grub_errno == 0 && basename[0] == 0)
ctx.found = 1; ctx.found = 1;
+3 -21
View File
@@ -82,20 +82,6 @@ enum grub_ahci_hba_port_command
GRUB_AHCI_HBA_PORT_CMD_FR = 0x4000, 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 struct grub_ahci_hba
{ {
grub_uint32_t cap; grub_uint32_t cap;
@@ -576,7 +562,7 @@ grub_ahci_pciinit (grub_pci_device_t dev,
grub_ahci_readwrite_real (dev, &parms2, 1, 1);*/ grub_ahci_readwrite_real (dev, &parms2, 1, 1);*/
} }
endtime = grub_get_time_ms () + 32000; endtime = grub_get_time_ms () + 10000;
while (grub_get_time_ms () < endtime) while (grub_get_time_ms () < endtime)
{ {
@@ -1040,8 +1026,7 @@ grub_ahci_readwrite_real (struct grub_ahci_device *dev,
endtime = grub_get_time_ms () + (spinup ? 20000 : 20000); endtime = grub_get_time_ms () + (spinup ? 20000 : 20000);
while ((dev->hba->ports[dev->port].command_issue & 1)) 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", grub_dprintf ("ahci", "AHCI status <%x %x %x %x>\n",
dev->hba->ports[dev->port].command_issue, dev->hba->ports[dev->port].command_issue,
@@ -1049,10 +1034,7 @@ grub_ahci_readwrite_real (struct grub_ahci_device *dev,
dev->hba->ports[dev->port].intstatus, dev->hba->ports[dev->port].intstatus,
dev->hba->ports[dev->port].task_file_data); dev->hba->ports[dev->port].task_file_data);
dev->hba->ports[dev->port].command_issue = 0; dev->hba->ports[dev->port].command_issue = 0;
if (dev->hba->ports[dev->port].intstatus & GRUB_AHCI_HBA_PORT_IS_FATAL_MASK) err = grub_error (GRUB_ERR_IO, "AHCI transfer timed out");
err = grub_error (GRUB_ERR_IO, "AHCI transfer error");
else
err = grub_error (GRUB_ERR_IO, "AHCI transfer timed out");
if (!reset) if (!reset)
grub_ahci_reset_port (dev, 1); grub_ahci_reset_port (dev, 1);
break; break;
+5 -5
View File
@@ -296,11 +296,11 @@ static struct grub_disk_dev grub_arcdisk_dev =
{ {
.name = "arcdisk", .name = "arcdisk",
.id = GRUB_DISK_DEVICE_ARCDISK_ID, .id = GRUB_DISK_DEVICE_ARCDISK_ID,
.disk_iterate = grub_arcdisk_iterate, .iterate = grub_arcdisk_iterate,
.disk_open = grub_arcdisk_open, .open = grub_arcdisk_open,
.disk_close = grub_arcdisk_close, .close = grub_arcdisk_close,
.disk_read = grub_arcdisk_read, .read = grub_arcdisk_read,
.disk_write = grub_arcdisk_write, .write = grub_arcdisk_write,
.next = 0 .next = 0
}; };
+5 -5
View File
@@ -510,11 +510,11 @@ static struct grub_disk_dev grub_atadisk_dev =
{ {
.name = "ATA", .name = "ATA",
.id = GRUB_DISK_DEVICE_ATA_ID, .id = GRUB_DISK_DEVICE_ATA_ID,
.disk_iterate = grub_ata_iterate, .iterate = grub_ata_iterate,
.disk_open = grub_ata_open, .open = grub_ata_open,
.disk_close = grub_ata_close, .close = grub_ata_close,
.disk_read = grub_ata_read, .read = grub_ata_read,
.disk_write = grub_ata_write, .write = grub_ata_write,
.next = 0 .next = 0
}; };
+6 -6
View File
@@ -1015,13 +1015,13 @@ grub_cmd_cryptomount (grub_extcmd_context_t ctxt, int argc, char **args)
static struct grub_disk_dev grub_cryptodisk_dev = { static struct grub_disk_dev grub_cryptodisk_dev = {
.name = "cryptodisk", .name = "cryptodisk",
.id = GRUB_DISK_DEVICE_CRYPTODISK_ID, .id = GRUB_DISK_DEVICE_CRYPTODISK_ID,
.disk_iterate = grub_cryptodisk_iterate, .iterate = grub_cryptodisk_iterate,
.disk_open = grub_cryptodisk_open, .open = grub_cryptodisk_open,
.disk_close = grub_cryptodisk_close, .close = grub_cryptodisk_close,
.disk_read = grub_cryptodisk_read, .read = grub_cryptodisk_read,
.disk_write = grub_cryptodisk_write, .write = grub_cryptodisk_write,
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
.disk_memberlist = grub_cryptodisk_memberlist, .memberlist = grub_cryptodisk_memberlist,
#endif #endif
.next = 0 .next = 0
}; };
+11 -11
View File
@@ -228,9 +228,9 @@ scan_devices (const char *arname)
for (pull = 0; pull < GRUB_DISK_PULL_MAX; pull++) for (pull = 0; pull < GRUB_DISK_PULL_MAX; pull++)
for (p = grub_disk_dev_list; p; p = p->next) for (p = grub_disk_dev_list; p; p = p->next)
if (p->id != GRUB_DISK_DEVICE_DISKFILTER_ID if (p->id != GRUB_DISK_DEVICE_DISKFILTER_ID
&& p->disk_iterate) && p->iterate)
{ {
if ((p->disk_iterate) (scan_disk_hook, NULL, pull)) if ((p->iterate) (scan_disk_hook, NULL, pull))
return; return;
if (arname && is_lv_readable (find_lv (arname), 1)) if (arname && is_lv_readable (find_lv (arname), 1))
return; return;
@@ -311,9 +311,9 @@ grub_diskfilter_memberlist (grub_disk_t disk)
for (pull = 0; pv && pull < GRUB_DISK_PULL_MAX; pull++) for (pull = 0; pv && pull < GRUB_DISK_PULL_MAX; pull++)
for (p = grub_disk_dev_list; pv && p; p = p->next) for (p = grub_disk_dev_list; pv && p; p = p->next)
if (p->id != GRUB_DISK_DEVICE_DISKFILTER_ID if (p->id != GRUB_DISK_DEVICE_DISKFILTER_ID
&& p->disk_iterate) && p->iterate)
{ {
(p->disk_iterate) (scan_disk_hook, NULL, pull); (p->iterate) (scan_disk_hook, NULL, pull);
while (pv && pv->disk) while (pv && pv->disk)
pv = pv->next; pv = pv->next;
} }
@@ -1325,14 +1325,14 @@ static struct grub_disk_dev grub_diskfilter_dev =
{ {
.name = "diskfilter", .name = "diskfilter",
.id = GRUB_DISK_DEVICE_DISKFILTER_ID, .id = GRUB_DISK_DEVICE_DISKFILTER_ID,
.disk_iterate = grub_diskfilter_iterate, .iterate = grub_diskfilter_iterate,
.disk_open = grub_diskfilter_open, .open = grub_diskfilter_open,
.disk_close = grub_diskfilter_close, .close = grub_diskfilter_close,
.disk_read = grub_diskfilter_read, .read = grub_diskfilter_read,
.disk_write = grub_diskfilter_write, .write = grub_diskfilter_write,
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
.disk_memberlist = grub_diskfilter_memberlist, .memberlist = grub_diskfilter_memberlist,
.disk_raidname = grub_diskfilter_getname, .raidname = grub_diskfilter_getname,
#endif #endif
.next = 0 .next = 0
}; };
+5 -14
View File
@@ -129,9 +129,6 @@ find_parent_device (struct grub_efidisk_data *devices,
return 0; return 0;
ldp = grub_efi_find_last_device_path (dp); ldp = grub_efi_find_last_device_path (dp);
if (! ldp)
return 0;
ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE; ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE;
ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE; ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE;
ldp->length = sizeof (*ldp); ldp->length = sizeof (*ldp);
@@ -162,9 +159,6 @@ is_child (struct grub_efidisk_data *child,
return 0; return 0;
ldp = grub_efi_find_last_device_path (dp); ldp = grub_efi_find_last_device_path (dp);
if (! ldp)
return 0;
ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE; ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE;
ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE; ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE;
ldp->length = sizeof (*ldp); ldp->length = sizeof (*ldp);
@@ -633,11 +627,11 @@ static struct grub_disk_dev grub_efidisk_dev =
{ {
.name = "efidisk", .name = "efidisk",
.id = GRUB_DISK_DEVICE_EFIDISK_ID, .id = GRUB_DISK_DEVICE_EFIDISK_ID,
.disk_iterate = grub_efidisk_iterate, .iterate = grub_efidisk_iterate,
.disk_open = grub_efidisk_open, .open = grub_efidisk_open,
.disk_close = grub_efidisk_close, .close = grub_efidisk_close,
.disk_read = grub_efidisk_read, .read = grub_efidisk_read,
.disk_write = grub_efidisk_write, .write = grub_efidisk_write,
.next = 0 .next = 0
}; };
@@ -836,9 +830,6 @@ grub_efidisk_get_device_name (grub_efi_handle_t *handle)
{ {
grub_efi_device_path_t *dup_ldp; grub_efi_device_path_t *dup_ldp;
dup_ldp = grub_efi_find_last_device_path (dup_dp); dup_ldp = grub_efi_find_last_device_path (dup_dp);
if (! dup_ldp)
break;
if (!(GRUB_EFI_DEVICE_PATH_TYPE (dup_ldp) == GRUB_EFI_MEDIA_DEVICE_PATH_TYPE if (!(GRUB_EFI_DEVICE_PATH_TYPE (dup_ldp) == GRUB_EFI_MEDIA_DEVICE_PATH_TYPE
&& (GRUB_EFI_DEVICE_PATH_SUBTYPE (dup_ldp) == GRUB_EFI_CDROM_DEVICE_PATH_SUBTYPE && (GRUB_EFI_DEVICE_PATH_SUBTYPE (dup_ldp) == GRUB_EFI_CDROM_DEVICE_PATH_SUBTYPE
|| GRUB_EFI_DEVICE_PATH_SUBTYPE (dup_ldp) == GRUB_EFI_HARD_DRIVE_DEVICE_PATH_SUBTYPE))) || GRUB_EFI_DEVICE_PATH_SUBTYPE (dup_ldp) == GRUB_EFI_HARD_DRIVE_DEVICE_PATH_SUBTYPE)))
+5 -5
View File
@@ -84,11 +84,11 @@ static struct grub_disk_dev grub_host_dev =
/* The only important line in this file :-) */ /* The only important line in this file :-) */
.name = "host", .name = "host",
.id = GRUB_DISK_DEVICE_HOST_ID, .id = GRUB_DISK_DEVICE_HOST_ID,
.disk_iterate = grub_host_iterate, .iterate = grub_host_iterate,
.disk_open = grub_host_open, .open = grub_host_open,
.disk_close = grub_host_close, .close = grub_host_close,
.disk_read = grub_host_read, .read = grub_host_read,
.disk_write = grub_host_write, .write = grub_host_write,
.next = 0 .next = 0
}; };
+5 -5
View File
@@ -637,11 +637,11 @@ static struct grub_disk_dev grub_biosdisk_dev =
{ {
.name = "biosdisk", .name = "biosdisk",
.id = GRUB_DISK_DEVICE_BIOSDISK_ID, .id = GRUB_DISK_DEVICE_BIOSDISK_ID,
.disk_iterate = grub_biosdisk_iterate, .iterate = grub_biosdisk_iterate,
.disk_open = grub_biosdisk_open, .open = grub_biosdisk_open,
.disk_close = grub_biosdisk_close, .close = grub_biosdisk_close,
.disk_read = grub_biosdisk_read, .read = grub_biosdisk_read,
.disk_write = grub_biosdisk_write, .write = grub_biosdisk_write,
.next = 0 .next = 0
}; };
+5 -5
View File
@@ -223,11 +223,11 @@ static struct grub_disk_dev grub_nand_dev =
{ {
.name = "nand", .name = "nand",
.id = GRUB_DISK_DEVICE_NAND_ID, .id = GRUB_DISK_DEVICE_NAND_ID,
.disk_iterate = grub_nand_iterate, .iterate = grub_nand_iterate,
.disk_open = grub_nand_open, .open = grub_nand_open,
.disk_close = grub_nand_close, .close = grub_nand_close,
.disk_read = grub_nand_read, .read = grub_nand_read,
.disk_write = grub_nand_write, .write = grub_nand_write,
.next = 0 .next = 0
}; };
File diff suppressed because it is too large. Load diff
+5 -5
View File
@@ -615,11 +615,11 @@ static struct grub_disk_dev grub_ofdisk_dev =
{ {
.name = "ofdisk", .name = "ofdisk",
.id = GRUB_DISK_DEVICE_OFDISK_ID, .id = GRUB_DISK_DEVICE_OFDISK_ID,
.disk_iterate = grub_ofdisk_iterate, .iterate = grub_ofdisk_iterate,
.disk_open = grub_ofdisk_open, .open = grub_ofdisk_open,
.disk_close = grub_ofdisk_close, .close = grub_ofdisk_close,
.disk_read = grub_ofdisk_read, .read = grub_ofdisk_read,
.disk_write = grub_ofdisk_write, .write = grub_ofdisk_write,
.next = 0 .next = 0
}; };
+1 -1
View File
@@ -135,7 +135,7 @@ msdos_has_ldm_partition (grub_disk_t dsk)
return has_ldm; return has_ldm;
} }
static const grub_gpt_part_guid_t ldm_type = GRUB_GPT_PARTITION_TYPE_LDM; static const grub_gpt_part_type_t ldm_type = GRUB_GPT_PARTITION_TYPE_LDM;
/* Helper for gpt_ldm_sector. */ /* Helper for gpt_ldm_sector. */
static int static int
+4 -4
View File
@@ -222,10 +222,10 @@ static struct grub_disk_dev grub_loopback_dev =
{ {
.name = "loopback", .name = "loopback",
.id = GRUB_DISK_DEVICE_LOOPBACK_ID, .id = GRUB_DISK_DEVICE_LOOPBACK_ID,
.disk_iterate = grub_loopback_iterate, .iterate = grub_loopback_iterate,
.disk_open = grub_loopback_open, .open = grub_loopback_open,
.disk_read = grub_loopback_read, .read = grub_loopback_read,
.disk_write = grub_loopback_write, .write = grub_loopback_write,
.next = 0 .next = 0
}; };
+5 -5
View File
@@ -77,11 +77,11 @@ static struct grub_disk_dev grub_memdisk_dev =
{ {
.name = "memdisk", .name = "memdisk",
.id = GRUB_DISK_DEVICE_MEMDISK_ID, .id = GRUB_DISK_DEVICE_MEMDISK_ID,
.disk_iterate = grub_memdisk_iterate, .iterate = grub_memdisk_iterate,
.disk_open = grub_memdisk_open, .open = grub_memdisk_open,
.disk_close = grub_memdisk_close, .close = grub_memdisk_close,
.disk_read = grub_memdisk_read, .read = grub_memdisk_read,
.disk_write = grub_memdisk_write, .write = grub_memdisk_write,
.next = 0 .next = 0
}; };
+18 -34
View File
@@ -74,26 +74,14 @@ mod_255 (unsigned x)
} }
static grub_err_t static grub_err_t
raid6_recover_read_node (void *data, int disknr, grub_raid6_recover (struct grub_diskfilter_segment *array, int disknr, int p,
grub_uint64_t sector, char *buf, grub_disk_addr_t sector, grub_size_t size)
void *buf, grub_size_t size)
{
struct grub_diskfilter_segment *array = data;
return grub_diskfilter_read_node (&array->nodes[disknr],
(grub_disk_addr_t)sector,
size >> GRUB_DISK_SECTOR_BITS, buf);
}
grub_err_t
grub_raid6_recover_gen (void *data, grub_uint64_t nstripes, int disknr, int p,
char *buf, grub_uint64_t sector, grub_size_t size,
int layout, raid_recover_read_t read_func)
{ {
int i, q, pos; int i, q, pos;
int bad1 = -1, bad2 = -1; int bad1 = -1, bad2 = -1;
char *pbuf = 0, *qbuf = 0; char *pbuf = 0, *qbuf = 0;
size <<= GRUB_DISK_SECTOR_BITS;
pbuf = grub_zalloc (size); pbuf = grub_zalloc (size);
if (!pbuf) if (!pbuf)
goto quit; goto quit;
@@ -103,17 +91,17 @@ grub_raid6_recover_gen (void *data, grub_uint64_t nstripes, int disknr, int p,
goto quit; goto quit;
q = p + 1; q = p + 1;
if (q == (int) nstripes) if (q == (int) array->node_count)
q = 0; q = 0;
pos = q + 1; pos = q + 1;
if (pos == (int) nstripes) if (pos == (int) array->node_count)
pos = 0; pos = 0;
for (i = 0; i < (int) nstripes - 2; i++) for (i = 0; i < (int) array->node_count - 2; i++)
{ {
int c; int c;
if (layout & GRUB_RAID_LAYOUT_MUL_FROM_POS) if (array->layout & GRUB_RAID_LAYOUT_MUL_FROM_POS)
c = pos; c = pos;
else else
c = i; c = i;
@@ -121,7 +109,8 @@ grub_raid6_recover_gen (void *data, grub_uint64_t nstripes, int disknr, int p,
bad1 = c; bad1 = c;
else else
{ {
if (!read_func (data, pos, sector, buf, size)) if (! grub_diskfilter_read_node (&array->nodes[pos], sector,
size >> GRUB_DISK_SECTOR_BITS, buf))
{ {
grub_crypto_xor (pbuf, pbuf, buf, size); grub_crypto_xor (pbuf, pbuf, buf, size);
grub_raid_block_mulx (c, buf, size); grub_raid_block_mulx (c, buf, size);
@@ -139,7 +128,7 @@ grub_raid6_recover_gen (void *data, grub_uint64_t nstripes, int disknr, int p,
} }
pos++; pos++;
if (pos == (int) nstripes) if (pos == (int) array->node_count)
pos = 0; pos = 0;
} }
@@ -150,14 +139,16 @@ grub_raid6_recover_gen (void *data, grub_uint64_t nstripes, int disknr, int p,
if (bad2 < 0) if (bad2 < 0)
{ {
/* One bad device */ /* One bad device */
if (!read_func (data, p, sector, buf, size)) if ((! grub_diskfilter_read_node (&array->nodes[p], sector,
size >> GRUB_DISK_SECTOR_BITS, buf)))
{ {
grub_crypto_xor (buf, buf, pbuf, size); grub_crypto_xor (buf, buf, pbuf, size);
goto quit; goto quit;
} }
grub_errno = GRUB_ERR_NONE; grub_errno = GRUB_ERR_NONE;
if (read_func (data, q, sector, buf, size)) if (grub_diskfilter_read_node (&array->nodes[q], sector,
size >> GRUB_DISK_SECTOR_BITS, buf))
goto quit; goto quit;
grub_crypto_xor (buf, buf, qbuf, size); grub_crypto_xor (buf, buf, qbuf, size);
@@ -169,12 +160,14 @@ grub_raid6_recover_gen (void *data, grub_uint64_t nstripes, int disknr, int p,
/* Two bad devices */ /* Two bad devices */
unsigned c; unsigned c;
if (read_func (data, p, sector, buf, size)) if (grub_diskfilter_read_node (&array->nodes[p], sector,
size >> GRUB_DISK_SECTOR_BITS, buf))
goto quit; goto quit;
grub_crypto_xor (pbuf, pbuf, buf, size); grub_crypto_xor (pbuf, pbuf, buf, size);
if (read_func (data, q, sector, buf, size)) if (grub_diskfilter_read_node (&array->nodes[q], sector,
size >> GRUB_DISK_SECTOR_BITS, buf))
goto quit; goto quit;
grub_crypto_xor (qbuf, qbuf, buf, size); grub_crypto_xor (qbuf, qbuf, buf, size);
@@ -197,15 +190,6 @@ quit:
return grub_errno; return grub_errno;
} }
static grub_err_t
grub_raid6_recover (struct grub_diskfilter_segment *array, int disknr, int p,
char *buf, grub_disk_addr_t sector, grub_size_t size)
{
return grub_raid6_recover_gen (array, array->node_count, disknr, p, buf,
sector, size << GRUB_DISK_SECTOR_BITS,
array->layout, raid6_recover_read_node);
}
GRUB_MOD_INIT(raid6rec) GRUB_MOD_INIT(raid6rec)
{ {
grub_raid6_init_table (); grub_raid6_init_table ();
+5 -5
View File
@@ -747,11 +747,11 @@ static struct grub_disk_dev grub_scsi_dev =
{ {
.name = "scsi", .name = "scsi",
.id = GRUB_DISK_DEVICE_SCSI_ID, .id = GRUB_DISK_DEVICE_SCSI_ID,
.disk_iterate = grub_scsi_iterate, .iterate = grub_scsi_iterate,
.disk_open = grub_scsi_open, .open = grub_scsi_open,
.disk_close = grub_scsi_close, .close = grub_scsi_close,
.disk_read = grub_scsi_read, .read = grub_scsi_read,
.disk_write = grub_scsi_write, .write = grub_scsi_write,
.next = 0 .next = 0
}; };
+11 -21
View File
@@ -264,33 +264,23 @@ uboot_disk_read (struct grub_disk *disk,
} }
static grub_err_t static grub_err_t
uboot_disk_write (struct grub_disk *disk, uboot_disk_write (struct grub_disk *disk __attribute__ ((unused)),
grub_disk_addr_t offset, grub_size_t numblocks, const char *buf) grub_disk_addr_t sector __attribute__ ((unused)),
grub_size_t size __attribute__ ((unused)),
const char *buf __attribute__ ((unused)))
{ {
struct ubootdisk_data *d; return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
int retval; "attempt to write (not supported)");
d = disk->data;
retval = grub_uboot_dev_write (d->dev, buf, numblocks, offset);
grub_dprintf ("ubootdisk",
"retval=%d, numblocks=%d, sector=%llu\n",
retval, numblocks, (grub_uint64_t) offset);
if (retval != 0)
return grub_error (GRUB_ERR_IO, "U-Boot disk write error");
return GRUB_ERR_NONE;
} }
static struct grub_disk_dev grub_ubootdisk_dev = { static struct grub_disk_dev grub_ubootdisk_dev = {
.name = "ubootdisk", .name = "ubootdisk",
.id = GRUB_DISK_DEVICE_UBOOTDISK_ID, .id = GRUB_DISK_DEVICE_UBOOTDISK_ID,
.disk_iterate = uboot_disk_iterate, .iterate = uboot_disk_iterate,
.disk_open = uboot_disk_open, .open = uboot_disk_open,
.disk_close = uboot_disk_close, .close = uboot_disk_close,
.disk_read = uboot_disk_read, .read = uboot_disk_read,
.disk_write = uboot_disk_write, .write = uboot_disk_write,
.next = 0 .next = 0
}; };
+5 -5
View File
@@ -249,11 +249,11 @@ grub_virtdisk_write (grub_disk_t disk, grub_disk_addr_t sector,
static struct grub_disk_dev grub_virtdisk_dev = { static struct grub_disk_dev grub_virtdisk_dev = {
.name = "xen", .name = "xen",
.id = GRUB_DISK_DEVICE_XEN, .id = GRUB_DISK_DEVICE_XEN,
.disk_iterate = grub_virtdisk_iterate, .iterate = grub_virtdisk_iterate,
.disk_open = grub_virtdisk_open, .open = grub_virtdisk_open,
.disk_close = grub_virtdisk_close, .close = grub_virtdisk_close,
.disk_read = grub_virtdisk_read, .read = grub_virtdisk_read,
.disk_write = grub_virtdisk_write, .write = grub_virtdisk_write,
.next = 0 .next = 0
}; };
-1
View File
@@ -98,7 +98,6 @@ grub_arch_efiemu_relocate_symbols64 (grub_efiemu_segment_t segs,
break; break;
case R_X86_64_PC32: case R_X86_64_PC32:
case R_X86_64_PLT32:
err = grub_efiemu_write_value (addr, err = grub_efiemu_write_value (addr,
*addr32 + rel->r_addend *addr32 + rel->r_addend
+ sym.off + sym.off
+5 -5
View File
@@ -174,17 +174,17 @@ efiemu_memset (grub_uint8_t *a, grub_uint8_t b, grub_size_t n)
static inline void static inline void
write_cmos (grub_uint8_t addr, grub_uint8_t val) write_cmos (grub_uint8_t addr, grub_uint8_t val)
{ {
asm volatile ("outb %%al,$0x70\n" __asm__ __volatile__ ("outb %%al,$0x70\n"
"mov %%cl, %%al\n" "mov %%cl, %%al\n"
"outb %%al,$0x71": :"a" (addr), "c" (val)); "outb %%al,$0x71": :"a" (addr), "c" (val));
} }
static inline grub_uint8_t static inline grub_uint8_t
read_cmos (grub_uint8_t addr) read_cmos (grub_uint8_t addr)
{ {
grub_uint8_t ret; grub_uint8_t ret;
asm volatile ("outb %%al, $0x70\n" __asm__ __volatile__ ("outb %%al, $0x70\n"
"inb $0x71, %%al": "=a"(ret) :"a" (addr)); "inb $0x71, %%al": "=a"(ret) :"a" (addr));
return ret; return ret;
} }
+6 -6
View File
@@ -685,12 +685,12 @@ grub_affs_mtime (grub_device_t device, grub_int32_t *t)
static struct grub_fs grub_affs_fs = static struct grub_fs grub_affs_fs =
{ {
.name = "affs", .name = "affs",
.fs_dir = grub_affs_dir, .dir = grub_affs_dir,
.fs_open = grub_affs_open, .open = grub_affs_open,
.fs_read = grub_affs_read, .read = grub_affs_read,
.fs_close = grub_affs_close, .close = grub_affs_close,
.fs_label = grub_affs_label, .label = grub_affs_label,
.fs_mtime = grub_affs_mtime, .mtime = grub_affs_mtime,
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
.reserved_first_sector = 0, .reserved_first_sector = 0,
+6 -6
View File
@@ -1082,13 +1082,13 @@ static struct grub_fs grub_bfs_fs = {
#else #else
.name = "bfs", .name = "bfs",
#endif #endif
.fs_dir = grub_bfs_dir, .dir = grub_bfs_dir,
.fs_open = grub_bfs_open, .open = grub_bfs_open,
.fs_read = grub_bfs_read, .read = grub_bfs_read,
.fs_close = grub_bfs_close, .close = grub_bfs_close,
.fs_label = grub_bfs_label, .label = grub_bfs_label,
#ifndef MODE_AFS #ifndef MODE_AFS
.fs_uuid = grub_bfs_uuid, .uuid = grub_bfs_uuid,
#endif #endif
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
.reserved_first_sector = 1, .reserved_first_sector = 1,
+63 -484
View File
@@ -17,14 +17,6 @@
* along with GRUB. If not, see <http://www.gnu.org/licenses/>. * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
*/ */
/*
* Tell zstd to expose functions that aren't part of the stable API, which
* aren't safe to use when linking against a dynamic library. We vendor in a
* specific zstd version, so we know what we're getting. We need these unstable
* functions to provide our own allocator, which uses grub_malloc(), to zstd.
*/
#define ZSTD_STATIC_LINKING_ONLY
#include <grub/err.h> #include <grub/err.h>
#include <grub/file.h> #include <grub/file.h>
#include <grub/mm.h> #include <grub/mm.h>
@@ -35,11 +27,8 @@
#include <grub/lib/crc.h> #include <grub/lib/crc.h>
#include <grub/deflate.h> #include <grub/deflate.h>
#include <minilzo.h> #include <minilzo.h>
#include <zstd.h>
#include <grub/i18n.h> #include <grub/i18n.h>
#include <grub/btrfs.h> #include <grub/btrfs.h>
#include <grub/crypto.h>
#include <grub/diskfilter.h>
GRUB_MOD_LICENSE ("GPLv3+"); GRUB_MOD_LICENSE ("GPLv3+");
@@ -56,9 +45,6 @@ GRUB_MOD_LICENSE ("GPLv3+");
#define GRUB_BTRFS_LZO_BLOCK_MAX_CSIZE (GRUB_BTRFS_LZO_BLOCK_SIZE + \ #define GRUB_BTRFS_LZO_BLOCK_MAX_CSIZE (GRUB_BTRFS_LZO_BLOCK_SIZE + \
(GRUB_BTRFS_LZO_BLOCK_SIZE / 16) + 64 + 3) (GRUB_BTRFS_LZO_BLOCK_SIZE / 16) + 64 + 3)
#define ZSTD_BTRFS_MAX_WINDOWLOG 17
#define ZSTD_BTRFS_MAX_INPUT (1 << ZSTD_BTRFS_MAX_WINDOWLOG)
typedef grub_uint8_t grub_btrfs_checksum_t[0x20]; typedef grub_uint8_t grub_btrfs_checksum_t[0x20];
typedef grub_uint16_t grub_btrfs_uuid_t[8]; typedef grub_uint16_t grub_btrfs_uuid_t[8];
@@ -91,8 +77,7 @@ struct btrfs_header
{ {
grub_btrfs_checksum_t checksum; grub_btrfs_checksum_t checksum;
grub_btrfs_uuid_t uuid; grub_btrfs_uuid_t uuid;
grub_uint64_t bytenr; grub_uint8_t dummy[0x30];
grub_uint8_t dummy[0x28];
grub_uint32_t nitems; grub_uint32_t nitems;
grub_uint8_t level; grub_uint8_t level;
} GRUB_PACKED; } GRUB_PACKED;
@@ -134,8 +119,6 @@ struct grub_btrfs_chunk_item
#define GRUB_BTRFS_CHUNK_TYPE_RAID1 0x10 #define GRUB_BTRFS_CHUNK_TYPE_RAID1 0x10
#define GRUB_BTRFS_CHUNK_TYPE_DUPLICATED 0x20 #define GRUB_BTRFS_CHUNK_TYPE_DUPLICATED 0x20
#define GRUB_BTRFS_CHUNK_TYPE_RAID10 0x40 #define GRUB_BTRFS_CHUNK_TYPE_RAID10 0x40
#define GRUB_BTRFS_CHUNK_TYPE_RAID5 0x80
#define GRUB_BTRFS_CHUNK_TYPE_RAID6 0x100
grub_uint8_t dummy2[0xc]; grub_uint8_t dummy2[0xc];
grub_uint16_t nstripes; grub_uint16_t nstripes;
grub_uint16_t nsubstripes; grub_uint16_t nsubstripes;
@@ -192,7 +175,7 @@ struct grub_btrfs_time
{ {
grub_int64_t sec; grub_int64_t sec;
grub_uint32_t nanosec; grub_uint32_t nanosec;
} GRUB_PACKED; } __attribute__ ((aligned (4)));
struct grub_btrfs_inode struct grub_btrfs_inode
{ {
@@ -229,7 +212,6 @@ struct grub_btrfs_extent_data
#define GRUB_BTRFS_COMPRESSION_NONE 0 #define GRUB_BTRFS_COMPRESSION_NONE 0
#define GRUB_BTRFS_COMPRESSION_ZLIB 1 #define GRUB_BTRFS_COMPRESSION_ZLIB 1
#define GRUB_BTRFS_COMPRESSION_LZO 2 #define GRUB_BTRFS_COMPRESSION_LZO 2
#define GRUB_BTRFS_COMPRESSION_ZSTD 3
#define GRUB_BTRFS_OBJECT_ID_CHUNK 0x100 #define GRUB_BTRFS_OBJECT_ID_CHUNK 0x100
@@ -302,25 +284,6 @@ free_iterator (struct grub_btrfs_leaf_descriptor *desc)
grub_free (desc->data); grub_free (desc->data);
} }
static grub_err_t
check_btrfs_header (struct grub_btrfs_data *data, struct btrfs_header *header,
grub_disk_addr_t addr)
{
if (grub_le_to_cpu64 (header->bytenr) != addr)
{
grub_dprintf ("btrfs", "btrfs_header.bytenr is not equal node addr\n");
return grub_error (GRUB_ERR_BAD_FS,
"header bytenr is not equal node addr");
}
if (grub_memcmp (data->sblock.uuid, header->uuid, sizeof(grub_btrfs_uuid_t)))
{
grub_dprintf ("btrfs", "btrfs_header.uuid doesn't match sblock uuid\n");
return grub_error (GRUB_ERR_BAD_FS,
"header uuid doesn't match sblock uuid");
}
return GRUB_ERR_NONE;
}
static grub_err_t static grub_err_t
save_ref (struct grub_btrfs_leaf_descriptor *desc, save_ref (struct grub_btrfs_leaf_descriptor *desc,
grub_disk_addr_t addr, unsigned i, unsigned m, int l) grub_disk_addr_t addr, unsigned i, unsigned m, int l)
@@ -376,7 +339,6 @@ next (struct grub_btrfs_data *data,
err = grub_btrfs_read_logical (data, grub_le_to_cpu64 (node.addr), err = grub_btrfs_read_logical (data, grub_le_to_cpu64 (node.addr),
&head, sizeof (head), 0); &head, sizeof (head), 0);
check_btrfs_header (data, &head, grub_le_to_cpu64 (node.addr));
if (err) if (err)
return -err; return -err;
@@ -438,7 +400,6 @@ lower_bound (struct grub_btrfs_data *data,
/* FIXME: preread few nodes into buffer. */ /* FIXME: preread few nodes into buffer. */
err = grub_btrfs_read_logical (data, addr, &head, sizeof (head), err = grub_btrfs_read_logical (data, addr, &head, sizeof (head),
recursion_depth + 1); recursion_depth + 1);
check_btrfs_header (data, &head, addr);
if (err) if (err)
return err; return err;
addr += sizeof (head); addr += sizeof (head);
@@ -603,7 +564,7 @@ find_device_iter (const char *name, void *data)
} }
static grub_device_t static grub_device_t
find_device (struct grub_btrfs_data *data, grub_uint64_t id) find_device (struct grub_btrfs_data *data, grub_uint64_t id, int do_rescan)
{ {
struct find_device_ctx ctx = { struct find_device_ctx ctx = {
.data = data, .data = data,
@@ -615,9 +576,15 @@ find_device (struct grub_btrfs_data *data, grub_uint64_t id)
for (i = 0; i < data->n_devices_attached; i++) for (i = 0; i < data->n_devices_attached; i++)
if (id == data->devices_attached[i].id) if (id == data->devices_attached[i].id)
return data->devices_attached[i].dev; return data->devices_attached[i].dev;
if (do_rescan)
grub_device_iterate (find_device_iter, &ctx); grub_device_iterate (find_device_iter, &ctx);
if (!ctx.dev_found)
{
grub_error (GRUB_ERR_BAD_FS,
N_("couldn't find a necessary member device "
"of multi-device filesystem"));
return NULL;
}
data->n_devices_attached++; data->n_devices_attached++;
if (data->n_devices_attached > data->n_devices_allocated) if (data->n_devices_attached > data->n_devices_allocated)
{ {
@@ -629,8 +596,7 @@ find_device (struct grub_btrfs_data *data, grub_uint64_t id)
* sizeof (data->devices_attached[0])); * sizeof (data->devices_attached[0]));
if (!data->devices_attached) if (!data->devices_attached)
{ {
if (ctx.dev_found) grub_device_close (ctx.dev_found);
grub_device_close (ctx.dev_found);
data->devices_attached = tmp; data->devices_attached = tmp;
return NULL; return NULL;
} }
@@ -640,211 +606,6 @@ find_device (struct grub_btrfs_data *data, grub_uint64_t id)
return ctx.dev_found; return ctx.dev_found;
} }
static grub_err_t
btrfs_read_from_chunk (struct grub_btrfs_data *data,
struct grub_btrfs_chunk_item *chunk,
grub_uint64_t stripen, grub_uint64_t stripe_offset,
int redundancy, grub_uint64_t csize,
void *buf)
{
struct grub_btrfs_chunk_stripe *stripe;
grub_disk_addr_t paddr;
grub_device_t dev;
grub_err_t err;
stripe = (struct grub_btrfs_chunk_stripe *) (chunk + 1);
/* Right now the redundancy handling is easy.
With RAID5-like it will be more difficult. */
stripe += stripen + redundancy;
paddr = grub_le_to_cpu64 (stripe->offset) + stripe_offset;
grub_dprintf ("btrfs", "stripe %" PRIxGRUB_UINT64_T
" maps to 0x%" PRIxGRUB_UINT64_T "\n"
"reading paddr 0x%" PRIxGRUB_UINT64_T "\n",
stripen, stripe->offset, paddr);
dev = find_device (data, stripe->device_id);
if (!dev)
{
grub_dprintf ("btrfs",
"couldn't find a necessary member device "
"of multi-device filesystem\n");
grub_errno = GRUB_ERR_NONE;
return GRUB_ERR_READ_ERROR;
}
err = grub_disk_read (dev->disk, paddr >> GRUB_DISK_SECTOR_BITS,
paddr & (GRUB_DISK_SECTOR_SIZE - 1),
csize, buf);
return err;
}
struct raid56_buffer {
void *buf;
int data_is_valid;
};
static void
rebuild_raid5 (char *dest, struct raid56_buffer *buffers,
grub_uint64_t nstripes, grub_uint64_t csize)
{
grub_uint64_t i;
int first;
for(i = 0; buffers[i].data_is_valid && i < nstripes; i++);
if (i == nstripes)
{
grub_dprintf ("btrfs", "called rebuild_raid5(), but all disks are OK\n");
return;
}
grub_dprintf ("btrfs", "rebuilding RAID 5 stripe #%" PRIuGRUB_UINT64_T "\n", i);
for (i = 0, first = 1; i < nstripes; i++)
{
if (!buffers[i].data_is_valid)
continue;
if (first) {
grub_memcpy(dest, buffers[i].buf, csize);
first = 0;
} else
grub_crypto_xor (dest, dest, buffers[i].buf, csize);
}
}
static grub_err_t
raid6_recover_read_buffer (void *data, int disk_nr,
grub_uint64_t addr __attribute__ ((unused)),
void *dest, grub_size_t size)
{
struct raid56_buffer *buffers = data;
if (!buffers[disk_nr].data_is_valid)
return grub_errno = GRUB_ERR_READ_ERROR;
grub_memcpy(dest, buffers[disk_nr].buf, size);
return grub_errno = GRUB_ERR_NONE;
}
static void
rebuild_raid6 (struct raid56_buffer *buffers, grub_uint64_t nstripes,
grub_uint64_t csize, grub_uint64_t parities_pos, void *dest,
grub_uint64_t stripen)
{
grub_raid6_recover_gen (buffers, nstripes, stripen, parities_pos,
dest, 0, csize, 0, raid6_recover_read_buffer);
}
static grub_err_t
raid56_read_retry (struct grub_btrfs_data *data,
struct grub_btrfs_chunk_item *chunk,
grub_uint64_t stripe_offset, grub_uint64_t stripen,
grub_uint64_t csize, void *buf, grub_uint64_t parities_pos)
{
struct raid56_buffer *buffers;
grub_uint64_t nstripes = grub_le_to_cpu16 (chunk->nstripes);
grub_uint64_t chunk_type = grub_le_to_cpu64 (chunk->type);
grub_err_t ret = GRUB_ERR_OUT_OF_MEMORY;
grub_uint64_t i, failed_devices;
buffers = grub_zalloc (sizeof(*buffers) * nstripes);
if (!buffers)
goto cleanup;
for (i = 0; i < nstripes; i++)
{
buffers[i].buf = grub_zalloc (csize);
if (!buffers[i].buf)
goto cleanup;
}
for (failed_devices = 0, i = 0; i < nstripes; i++)
{
struct grub_btrfs_chunk_stripe *stripe;
grub_disk_addr_t paddr;
grub_device_t dev;
grub_err_t err;
/*
* The struct grub_btrfs_chunk_stripe array lives
* behind struct grub_btrfs_chunk_item.
*/
stripe = (struct grub_btrfs_chunk_stripe *) (chunk + 1) + i;
paddr = grub_le_to_cpu64 (stripe->offset) + stripe_offset;
grub_dprintf ("btrfs", "reading paddr %" PRIxGRUB_UINT64_T
" from stripe ID %" PRIxGRUB_UINT64_T "\n",
paddr, stripe->device_id);
dev = find_device (data, stripe->device_id);
if (!dev)
{
grub_dprintf ("btrfs", "stripe %" PRIuGRUB_UINT64_T " FAILED (dev ID %"
PRIxGRUB_UINT64_T ")\n", i, stripe->device_id);
failed_devices++;
continue;
}
err = grub_disk_read (dev->disk, paddr >> GRUB_DISK_SECTOR_BITS,
paddr & (GRUB_DISK_SECTOR_SIZE - 1),
csize, buffers[i].buf);
if (err == GRUB_ERR_NONE)
{
buffers[i].data_is_valid = 1;
grub_dprintf ("btrfs", "stripe %" PRIuGRUB_UINT64_T " OK (dev ID %"
PRIxGRUB_UINT64_T ")\n", i, stripe->device_id);
}
else
{
grub_dprintf ("btrfs", "stripe %" PRIuGRUB_UINT64_T
" READ FAILED (dev ID %" PRIxGRUB_UINT64_T ")\n",
i, stripe->device_id);
failed_devices++;
}
}
if (failed_devices > 1 && (chunk_type & GRUB_BTRFS_CHUNK_TYPE_RAID5))
{
grub_dprintf ("btrfs", "not enough disks for RAID 5: total %" PRIuGRUB_UINT64_T
", missing %" PRIuGRUB_UINT64_T "\n",
nstripes, failed_devices);
ret = GRUB_ERR_READ_ERROR;
goto cleanup;
}
else if (failed_devices > 2 && (chunk_type & GRUB_BTRFS_CHUNK_TYPE_RAID6))
{
grub_dprintf ("btrfs", "not enough disks for RAID 6: total %" PRIuGRUB_UINT64_T
", missing %" PRIuGRUB_UINT64_T "\n",
nstripes, failed_devices);
ret = GRUB_ERR_READ_ERROR;
goto cleanup;
}
else
grub_dprintf ("btrfs", "enough disks for RAID 5: total %"
PRIuGRUB_UINT64_T ", missing %" PRIuGRUB_UINT64_T "\n",
nstripes, failed_devices);
/* We have enough disks. So, rebuild the data. */
if (chunk_type & GRUB_BTRFS_CHUNK_TYPE_RAID5)
rebuild_raid5 (buf, buffers, nstripes, csize);
else
rebuild_raid6 (buffers, nstripes, csize, parities_pos, buf, stripen);
ret = GRUB_ERR_NONE;
cleanup:
if (buffers)
for (i = 0; i < nstripes; i++)
grub_free (buffers[i].buf);
grub_free (buffers);
return ret;
}
static grub_err_t static grub_err_t
grub_btrfs_read_logical (struct grub_btrfs_data *data, grub_disk_addr_t addr, grub_btrfs_read_logical (struct grub_btrfs_data *data, grub_disk_addr_t addr,
void *buf, grub_size_t size, int recursion_depth) void *buf, grub_size_t size, int recursion_depth)
@@ -858,6 +619,7 @@ grub_btrfs_read_logical (struct grub_btrfs_data *data, grub_disk_addr_t addr,
grub_err_t err = 0; grub_err_t err = 0;
struct grub_btrfs_key key_out; struct grub_btrfs_key key_out;
int challoc = 0; int challoc = 0;
grub_device_t dev;
struct grub_btrfs_key key_in; struct grub_btrfs_key key_in;
grub_size_t chsize; grub_size_t chsize;
grub_disk_addr_t chaddr; grub_disk_addr_t chaddr;
@@ -922,12 +684,6 @@ grub_btrfs_read_logical (struct grub_btrfs_data *data, grub_disk_addr_t addr,
grub_uint16_t nstripes; grub_uint16_t nstripes;
unsigned redundancy = 1; unsigned redundancy = 1;
unsigned i, j; unsigned i, j;
int is_raid56;
grub_uint64_t parities_pos = 0;
is_raid56 = !!(grub_le_to_cpu64 (chunk->type) &
(GRUB_BTRFS_CHUNK_TYPE_RAID5 |
GRUB_BTRFS_CHUNK_TYPE_RAID6));
if (grub_le_to_cpu64 (chunk->size) <= off) if (grub_le_to_cpu64 (chunk->size) <= off)
{ {
@@ -1008,86 +764,6 @@ grub_btrfs_read_logical (struct grub_btrfs_data *data, grub_disk_addr_t addr,
stripe_offset = low + chunk_stripe_length stripe_offset = low + chunk_stripe_length
* high; * high;
csize = chunk_stripe_length - low; csize = chunk_stripe_length - low;
break;
}
case GRUB_BTRFS_CHUNK_TYPE_RAID5:
case GRUB_BTRFS_CHUNK_TYPE_RAID6:
{
grub_uint64_t nparities, stripe_nr, high, low;
redundancy = 1; /* no redundancy for now */
if (grub_le_to_cpu64 (chunk->type) & GRUB_BTRFS_CHUNK_TYPE_RAID5)
{
grub_dprintf ("btrfs", "RAID5\n");
nparities = 1;
}
else
{
grub_dprintf ("btrfs", "RAID6\n");
nparities = 2;
}
/*
* RAID 6 layout consists of several stripes spread over
* the disks, e.g.:
*
* Disk_0 Disk_1 Disk_2 Disk_3
* A0 B0 P0 Q0
* Q1 A1 B1 P1
* P2 Q2 A2 B2
*
* Note: placement of the parities depend on row number.
*
* Pay attention that the btrfs terminology may differ from
* terminology used in other RAID implementations, e.g. LVM,
* dm or md. The main difference is that btrfs calls contiguous
* block of data on a given disk, e.g. A0, stripe instead of chunk.
*
* The variables listed below have following meaning:
* - stripe_nr is the stripe number excluding the parities
* (A0 = 0, B0 = 1, A1 = 2, B1 = 3, etc.),
* - high is the row number (0 for A0...Q0, 1 for Q1...P1, etc.),
* - stripen is the disk number in a row (0 for A0, Q1, P2,
* 1 for B0, A1, Q2, etc.),
* - off is the logical address to read,
* - chunk_stripe_length is the size of a stripe (typically 64 KiB),
* - nstripes is the number of disks in a row,
* - low is the offset of the data inside a stripe,
* - stripe_offset is the data offset in an array,
* - csize is the "potential" data to read; it will be reduced
* to size if the latter is smaller,
* - nparities is the number of parities (1 for RAID 5, 2 for
* RAID 6); used only in RAID 5/6 code.
*/
stripe_nr = grub_divmod64 (off, chunk_stripe_length, &low);
/*
* stripen is computed without the parities
* (0 for A0, A1, A2, 1 for B0, B1, B2, etc.).
*/
high = grub_divmod64 (stripe_nr, nstripes - nparities, &stripen);
/*
* The stripes are spread over the disks. Every each row their
* positions are shifted by 1 place. So, the real disks number
* change. Hence, we have to take into account current row number
* modulo nstripes (0 for A0, 1 for A1, 2 for A2, etc.).
*/
grub_divmod64 (high + stripen, nstripes, &stripen);
/*
* parities_pos is equal to ((high - nparities) % nstripes)
* (see the diagram above). However, (high - nparities) can
* be negative, e.g. when high == 0, leading to an incorrect
* results. (high + nstripes - nparities) is always positive and
* modulo nstripes is equal to ((high - nparities) % nstripes).
*/
grub_divmod64 (high + nstripes - nparities, nstripes, &parities_pos);
stripe_offset = chunk_stripe_length * high + low;
csize = chunk_stripe_length - low;
break; break;
} }
default: default:
@@ -1104,41 +780,49 @@ grub_btrfs_read_logical (struct grub_btrfs_data *data, grub_disk_addr_t addr,
for (j = 0; j < 2; j++) for (j = 0; j < 2; j++)
{ {
grub_dprintf ("btrfs", "chunk 0x%" PRIxGRUB_UINT64_T for (i = 0; i < redundancy; i++)
"+0x%" PRIxGRUB_UINT64_T
" (%d stripes (%d substripes) of %"
PRIxGRUB_UINT64_T ")\n",
grub_le_to_cpu64 (key->offset),
grub_le_to_cpu64 (chunk->size),
grub_le_to_cpu16 (chunk->nstripes),
grub_le_to_cpu16 (chunk->nsubstripes),
grub_le_to_cpu64 (chunk->stripe_length));
grub_dprintf ("btrfs", "reading laddr 0x%" PRIxGRUB_UINT64_T "\n",
addr);
if (is_raid56)
{ {
err = btrfs_read_from_chunk (data, chunk, stripen, struct grub_btrfs_chunk_stripe *stripe;
stripe_offset, grub_disk_addr_t paddr;
0, /* no mirror */
csize, buf); stripe = (struct grub_btrfs_chunk_stripe *) (chunk + 1);
/* Right now the redundancy handling is easy.
With RAID5-like it will be more difficult. */
stripe += stripen + i;
paddr = grub_le_to_cpu64 (stripe->offset) + stripe_offset;
grub_dprintf ("btrfs", "chunk 0x%" PRIxGRUB_UINT64_T
"+0x%" PRIxGRUB_UINT64_T
" (%d stripes (%d substripes) of %"
PRIxGRUB_UINT64_T ") stripe %" PRIxGRUB_UINT64_T
" maps to 0x%" PRIxGRUB_UINT64_T "\n",
grub_le_to_cpu64 (key->offset),
grub_le_to_cpu64 (chunk->size),
grub_le_to_cpu16 (chunk->nstripes),
grub_le_to_cpu16 (chunk->nsubstripes),
grub_le_to_cpu64 (chunk->stripe_length),
stripen, stripe->offset);
grub_dprintf ("btrfs", "reading paddr 0x%" PRIxGRUB_UINT64_T
" for laddr 0x%" PRIxGRUB_UINT64_T "\n", paddr,
addr);
dev = find_device (data, stripe->device_id, j);
if (!dev)
{
err = grub_errno;
grub_errno = GRUB_ERR_NONE;
continue;
}
err = grub_disk_read (dev->disk, paddr >> GRUB_DISK_SECTOR_BITS,
paddr & (GRUB_DISK_SECTOR_SIZE - 1),
csize, buf);
if (!err)
break;
grub_errno = GRUB_ERR_NONE; grub_errno = GRUB_ERR_NONE;
if (err)
err = raid56_read_retry (data, chunk, stripe_offset,
stripen, csize, buf, parities_pos);
} }
else if (i != redundancy)
for (i = 0; i < redundancy; i++)
{
err = btrfs_read_from_chunk (data, chunk, stripen,
stripe_offset,
i, /* redundancy */
csize, buf);
if (!err)
break;
grub_errno = GRUB_ERR_NONE;
}
if (!err)
break; break;
} }
if (err) if (err)
@@ -1197,8 +881,7 @@ grub_btrfs_unmount (struct grub_btrfs_data *data)
unsigned i; unsigned i;
/* The device 0 is closed one layer upper. */ /* The device 0 is closed one layer upper. */
for (i = 1; i < data->n_devices_attached; i++) for (i = 1; i < data->n_devices_attached; i++)
if (data->devices_attached[i].dev) grub_device_close (data->devices_attached[i].dev);
grub_device_close (data->devices_attached[i].dev);
grub_free (data->devices_attached); grub_free (data->devices_attached);
grub_free (data->extent); grub_free (data->extent);
grub_free (data); grub_free (data);
@@ -1229,96 +912,6 @@ grub_btrfs_read_inode (struct grub_btrfs_data *data,
return grub_btrfs_read_logical (data, elemaddr, inode, sizeof (*inode), 0); return grub_btrfs_read_logical (data, elemaddr, inode, sizeof (*inode), 0);
} }
static void *grub_zstd_malloc (void *state __attribute__((unused)), size_t size)
{
return grub_malloc (size);
}
static void grub_zstd_free (void *state __attribute__((unused)), void *address)
{
return grub_free (address);
}
static ZSTD_customMem grub_zstd_allocator (void)
{
ZSTD_customMem allocator;
allocator.customAlloc = &grub_zstd_malloc;
allocator.customFree = &grub_zstd_free;
allocator.opaque = NULL;
return allocator;
}
static grub_ssize_t
grub_btrfs_zstd_decompress (char *ibuf, grub_size_t isize, grub_off_t off,
char *obuf, grub_size_t osize)
{
void *allocated = NULL;
char *otmpbuf = obuf;
grub_size_t otmpsize = osize;
ZSTD_DCtx *dctx = NULL;
grub_size_t zstd_ret;
grub_ssize_t ret = -1;
/*
* Zstd will fail if it can't fit the entire output in the destination
* buffer, so if osize isn't large enough, allocate a temporary buffer.
*/
if (otmpsize < ZSTD_BTRFS_MAX_INPUT)
{
allocated = grub_malloc (ZSTD_BTRFS_MAX_INPUT);
if (!allocated)
{
grub_error (GRUB_ERR_OUT_OF_MEMORY, "failed allocate a zstd buffer");
goto err;
}
otmpbuf = (char *) allocated;
otmpsize = ZSTD_BTRFS_MAX_INPUT;
}
/* Create the ZSTD_DCtx. */
dctx = ZSTD_createDCtx_advanced (grub_zstd_allocator ());
if (!dctx)
{
/* ZSTD_createDCtx_advanced() only fails if it is out of memory. */
grub_error (GRUB_ERR_OUT_OF_MEMORY, "failed to create a zstd context");
goto err;
}
/*
* Get the real input size, there may be junk at the
* end of the frame.
*/
isize = ZSTD_findFrameCompressedSize (ibuf, isize);
if (ZSTD_isError (isize))
{
grub_error (GRUB_ERR_BAD_COMPRESSED_DATA, "zstd data corrupted");
goto err;
}
/* Decompress and check for errors. */
zstd_ret = ZSTD_decompressDCtx (dctx, otmpbuf, otmpsize, ibuf, isize);
if (ZSTD_isError (zstd_ret))
{
grub_error (GRUB_ERR_BAD_COMPRESSED_DATA, "zstd data corrupted");
goto err;
}
/*
* Move the requested data into the obuf. obuf may be equal
* to otmpbuf, which is why grub_memmove() is required.
*/
grub_memmove (obuf, otmpbuf + off, osize);
ret = osize;
err:
grub_free (allocated);
ZSTD_freeDCtx (dctx);
return ret;
}
static grub_ssize_t static grub_ssize_t
grub_btrfs_lzo_decompress(char *ibuf, grub_size_t isize, grub_off_t off, grub_btrfs_lzo_decompress(char *ibuf, grub_size_t isize, grub_off_t off,
char *obuf, grub_size_t osize) char *obuf, grub_size_t osize)
@@ -1494,8 +1087,7 @@ grub_btrfs_extent_read (struct grub_btrfs_data *data,
if (data->extent->compression != GRUB_BTRFS_COMPRESSION_NONE if (data->extent->compression != GRUB_BTRFS_COMPRESSION_NONE
&& data->extent->compression != GRUB_BTRFS_COMPRESSION_ZLIB && data->extent->compression != GRUB_BTRFS_COMPRESSION_ZLIB
&& data->extent->compression != GRUB_BTRFS_COMPRESSION_LZO && data->extent->compression != GRUB_BTRFS_COMPRESSION_LZO)
&& data->extent->compression != GRUB_BTRFS_COMPRESSION_ZSTD)
{ {
grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
"compression type 0x%x not supported", "compression type 0x%x not supported",
@@ -1535,15 +1127,6 @@ grub_btrfs_extent_read (struct grub_btrfs_data *data,
!= (grub_ssize_t) csize) != (grub_ssize_t) csize)
return -1; return -1;
} }
else if (data->extent->compression == GRUB_BTRFS_COMPRESSION_ZSTD)
{
if (grub_btrfs_zstd_decompress (data->extent->inl, data->extsize -
((grub_uint8_t *) data->extent->inl
- (grub_uint8_t *) data->extent),
extoff, buf, csize)
!= (grub_ssize_t) csize)
return -1;
}
else else
grub_memcpy (buf, data->extent->inl + extoff, csize); grub_memcpy (buf, data->extent->inl + extoff, csize);
break; break;
@@ -1581,10 +1164,6 @@ grub_btrfs_extent_read (struct grub_btrfs_data *data,
ret = grub_btrfs_lzo_decompress (tmp, zsize, extoff ret = grub_btrfs_lzo_decompress (tmp, zsize, extoff
+ grub_le_to_cpu64 (data->extent->offset), + grub_le_to_cpu64 (data->extent->offset),
buf, csize); buf, csize);
else if (data->extent->compression == GRUB_BTRFS_COMPRESSION_ZSTD)
ret = grub_btrfs_zstd_decompress (tmp, zsize, extoff
+ grub_le_to_cpu64 (data->extent->offset),
buf, csize);
else else
ret = -1; ret = -1;
@@ -2172,14 +1751,14 @@ grub_btrfs_embed (grub_device_t device __attribute__ ((unused)),
static struct grub_fs grub_btrfs_fs = { static struct grub_fs grub_btrfs_fs = {
.name = "btrfs", .name = "btrfs",
.fs_dir = grub_btrfs_dir, .dir = grub_btrfs_dir,
.fs_open = grub_btrfs_open, .open = grub_btrfs_open,
.fs_read = grub_btrfs_read, .read = grub_btrfs_read,
.fs_close = grub_btrfs_close, .close = grub_btrfs_close,
.fs_uuid = grub_btrfs_uuid, .uuid = grub_btrfs_uuid,
.fs_label = grub_btrfs_label, .label = grub_btrfs_label,
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
.fs_embed = grub_btrfs_embed, .embed = grub_btrfs_embed,
.reserved_first_sector = 1, .reserved_first_sector = 1,
.blocklist_install = 0, .blocklist_install = 0,
#endif #endif
+9 -9
View File
@@ -328,11 +328,11 @@ static struct grub_disk_dev grub_cbfsdisk_dev =
{ {
.name = "cbfsdisk", .name = "cbfsdisk",
.id = GRUB_DISK_DEVICE_CBFSDISK_ID, .id = GRUB_DISK_DEVICE_CBFSDISK_ID,
.disk_iterate = grub_cbfsdisk_iterate, .iterate = grub_cbfsdisk_iterate,
.disk_open = grub_cbfsdisk_open, .open = grub_cbfsdisk_open,
.disk_close = grub_cbfsdisk_close, .close = grub_cbfsdisk_close,
.disk_read = grub_cbfsdisk_read, .read = grub_cbfsdisk_read,
.disk_write = grub_cbfsdisk_write, .write = grub_cbfsdisk_write,
.next = 0 .next = 0
}; };
@@ -375,10 +375,10 @@ fini_cbfsdisk (void)
static struct grub_fs grub_cbfs_fs = { static struct grub_fs grub_cbfs_fs = {
.name = "cbfs", .name = "cbfs",
.fs_dir = grub_cbfs_dir, .dir = grub_cbfs_dir,
.fs_open = grub_cbfs_open, .open = grub_cbfs_open,
.fs_read = grub_cbfs_read, .read = grub_cbfs_read,
.fs_close = grub_cbfs_close, .close = grub_cbfs_close,
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
.reserved_first_sector = 0, .reserved_first_sector = 0,
.blocklist_install = 0, .blocklist_install = 0,
+4 -4
View File
@@ -233,10 +233,10 @@ grub_cpio_close (grub_file_t file)
static struct grub_fs grub_cpio_fs = { static struct grub_fs grub_cpio_fs = {
.name = FSNAME, .name = FSNAME,
.fs_dir = grub_cpio_dir, .dir = grub_cpio_dir,
.fs_open = grub_cpio_open, .open = grub_cpio_open,
.fs_read = grub_cpio_read, .read = grub_cpio_read,
.fs_close = grub_cpio_close, .close = grub_cpio_close,
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
.reserved_first_sector = 0, .reserved_first_sector = 0,
.blocklist_install = 0, .blocklist_install = 0,
+8 -29
View File
@@ -102,7 +102,6 @@ GRUB_MOD_LICENSE ("GPLv3+");
#define EXT4_FEATURE_INCOMPAT_64BIT 0x0080 #define EXT4_FEATURE_INCOMPAT_64BIT 0x0080
#define EXT4_FEATURE_INCOMPAT_MMP 0x0100 #define EXT4_FEATURE_INCOMPAT_MMP 0x0100
#define EXT4_FEATURE_INCOMPAT_FLEX_BG 0x0200 #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) /* The set of back-incompatible features this driver DOES support. Add (OR)
* flags here as the related features are implemented into the driver. */ * flags here as the related features are implemented into the driver. */
@@ -110,8 +109,7 @@ GRUB_MOD_LICENSE ("GPLv3+");
| EXT4_FEATURE_INCOMPAT_EXTENTS \ | EXT4_FEATURE_INCOMPAT_EXTENTS \
| EXT4_FEATURE_INCOMPAT_FLEX_BG \ | EXT4_FEATURE_INCOMPAT_FLEX_BG \
| EXT2_FEATURE_INCOMPAT_META_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: /* List of rationales for the ignored "incompatible" features:
* needs_recovery: Not really back-incompatible - was added as such to forbid * needs_recovery: Not really back-incompatible - was added as such to forbid
* ext2 drivers from mounting an ext3 volume with a dirty * ext2 drivers from mounting an ext3 volume with a dirty
@@ -140,7 +138,6 @@ GRUB_MOD_LICENSE ("GPLv3+");
#define EXT3_JOURNAL_FLAG_DELETED 4 #define EXT3_JOURNAL_FLAG_DELETED 4
#define EXT3_JOURNAL_FLAG_LAST_TAG 8 #define EXT3_JOURNAL_FLAG_LAST_TAG 8
#define EXT4_ENCRYPT_FLAG 0x800
#define EXT4_EXTENTS_FLAG 0x80000 #define EXT4_EXTENTS_FLAG 0x80000
/* The ext2 superblock. */ /* The ext2 superblock. */
@@ -709,12 +706,6 @@ grub_ext2_read_symlink (grub_fshelp_node_t node)
grub_ext2_read_inode (diro->data, diro->ino, &diro->inode); grub_ext2_read_inode (diro->data, diro->ino, &diro->inode);
if (grub_errno) if (grub_errno)
return 0; 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); symlink = grub_malloc (grub_le_to_cpu32 (diro->inode.size) + 1);
@@ -758,12 +749,6 @@ grub_ext2_iterate_dir (grub_fshelp_node_t dir,
return 0; 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. */ /* Search the file. */
while (fpos < grub_le_to_cpu32 (diro->inode.size)) while (fpos < grub_le_to_cpu32 (diro->inode.size))
{ {
@@ -874,12 +859,6 @@ grub_ext2_open (struct grub_file *file, const char *name)
goto fail; 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_memcpy (data->inode, &fdiro->inode, sizeof (struct grub_ext2_inode));
grub_free (fdiro); grub_free (fdiro);
@@ -1072,13 +1051,13 @@ grub_ext2_mtime (grub_device_t device, grub_int32_t *tm)
static struct grub_fs grub_ext2_fs = static struct grub_fs grub_ext2_fs =
{ {
.name = "ext2", .name = "ext2",
.fs_dir = grub_ext2_dir, .dir = grub_ext2_dir,
.fs_open = grub_ext2_open, .open = grub_ext2_open,
.fs_read = grub_ext2_read, .read = grub_ext2_read,
.fs_close = grub_ext2_close, .close = grub_ext2_close,
.fs_label = grub_ext2_label, .label = grub_ext2_label,
.fs_uuid = grub_ext2_uuid, .uuid = grub_ext2_uuid,
.fs_mtime = grub_ext2_mtime, .mtime = grub_ext2_mtime,
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
.reserved_first_sector = 1, .reserved_first_sector = 1,
.blocklist_install = 1, .blocklist_install = 1,
-1314
View File
File diff suppressed because it is too large. Load diff
+6 -6
View File
@@ -1229,12 +1229,12 @@ static struct grub_fs grub_fat_fs =
#else #else
.name = "fat", .name = "fat",
#endif #endif
.fs_dir = grub_fat_dir, .dir = grub_fat_dir,
.fs_open = grub_fat_open, .open = grub_fat_open,
.fs_read = grub_fat_read, .read = grub_fat_read,
.fs_close = grub_fat_close, .close = grub_fat_close,
.fs_label = grub_fat_label, .label = grub_fat_label,
.fs_uuid = grub_fat_uuid, .uuid = grub_fat_uuid,
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
#ifdef MODE_EXFAT #ifdef MODE_EXFAT
/* ExFAT BPB is 30 larger than FAT32 one. */ /* ExFAT BPB is 30 larger than FAT32 one. */
+7 -7
View File
@@ -1417,13 +1417,13 @@ grub_hfs_uuid (grub_device_t device, char **uuid)
static struct grub_fs grub_hfs_fs = static struct grub_fs grub_hfs_fs =
{ {
.name = "hfs", .name = "hfs",
.fs_dir = grub_hfs_dir, .dir = grub_hfs_dir,
.fs_open = grub_hfs_open, .open = grub_hfs_open,
.fs_read = grub_hfs_read, .read = grub_hfs_read,
.fs_close = grub_hfs_close, .close = grub_hfs_close,
.fs_label = grub_hfs_label, .label = grub_hfs_label,
.fs_uuid = grub_hfs_uuid, .uuid = grub_hfs_uuid,
.fs_mtime = grub_hfs_mtime, .mtime = grub_hfs_mtime,
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
.reserved_first_sector = 1, .reserved_first_sector = 1,
.blocklist_install = 1, .blocklist_install = 1,
+7 -7
View File
@@ -1078,13 +1078,13 @@ grub_hfsplus_uuid (grub_device_t device, char **uuid)
static struct grub_fs grub_hfsplus_fs = static struct grub_fs grub_hfsplus_fs =
{ {
.name = "hfsplus", .name = "hfsplus",
.fs_dir = grub_hfsplus_dir, .dir = grub_hfsplus_dir,
.fs_open = grub_hfsplus_open, .open = grub_hfsplus_open,
.fs_read = grub_hfsplus_read, .read = grub_hfsplus_read,
.fs_close = grub_hfsplus_close, .close = grub_hfsplus_close,
.fs_label = grub_hfsplus_label, .label = grub_hfsplus_label,
.fs_mtime = grub_hfsplus_mtime, .mtime = grub_hfsplus_mtime,
.fs_uuid = grub_hfsplus_uuid, .uuid = grub_hfsplus_uuid,
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
.reserved_first_sector = 1, .reserved_first_sector = 1,
.blocklist_install = 1, .blocklist_install = 1,
+7 -7
View File
@@ -1099,13 +1099,13 @@ grub_iso9660_mtime (grub_device_t device, grub_int32_t *timebuf)
static struct grub_fs grub_iso9660_fs = static struct grub_fs grub_iso9660_fs =
{ {
.name = "iso9660", .name = "iso9660",
.fs_dir = grub_iso9660_dir, .dir = grub_iso9660_dir,
.fs_open = grub_iso9660_open, .open = grub_iso9660_open,
.fs_read = grub_iso9660_read, .read = grub_iso9660_read,
.fs_close = grub_iso9660_close, .close = grub_iso9660_close,
.fs_label = grub_iso9660_label, .label = grub_iso9660_label,
.fs_uuid = grub_iso9660_uuid, .uuid = grub_iso9660_uuid,
.fs_mtime = grub_iso9660_mtime, .mtime = grub_iso9660_mtime,
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
.reserved_first_sector = 1, .reserved_first_sector = 1,
.blocklist_install = 1, .blocklist_install = 1,
+6 -6
View File
@@ -930,12 +930,12 @@ grub_jfs_label (grub_device_t device, char **label)
static struct grub_fs grub_jfs_fs = static struct grub_fs grub_jfs_fs =
{ {
.name = "jfs", .name = "jfs",
.fs_dir = grub_jfs_dir, .dir = grub_jfs_dir,
.fs_open = grub_jfs_open, .open = grub_jfs_open,
.fs_read = grub_jfs_read, .read = grub_jfs_read,
.fs_close = grub_jfs_close, .close = grub_jfs_close,
.fs_label = grub_jfs_label, .label = grub_jfs_label,
.fs_uuid = grub_jfs_uuid, .uuid = grub_jfs_uuid,
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
.reserved_first_sector = 1, .reserved_first_sector = 1,
.blocklist_install = 1, .blocklist_install = 1,
+4 -4
View File
@@ -687,10 +687,10 @@ static struct grub_fs grub_minix_fs =
.name = "minix", .name = "minix",
#endif #endif
#endif #endif
.fs_dir = grub_minix_dir, .dir = grub_minix_dir,
.fs_open = grub_minix_open, .open = grub_minix_open,
.fs_read = grub_minix_read, .read = grub_minix_read,
.fs_close = grub_minix_close, .close = grub_minix_close,
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
.reserved_first_sector = 1, .reserved_first_sector = 1,
.blocklist_install = 1, .blocklist_install = 1,
+7 -7
View File
@@ -1192,13 +1192,13 @@ grub_nilfs2_mtime (grub_device_t device, grub_int32_t * tm)
static struct grub_fs grub_nilfs2_fs = { static struct grub_fs grub_nilfs2_fs = {
.name = "nilfs2", .name = "nilfs2",
.fs_dir = grub_nilfs2_dir, .dir = grub_nilfs2_dir,
.fs_open = grub_nilfs2_open, .open = grub_nilfs2_open,
.fs_read = grub_nilfs2_read, .read = grub_nilfs2_read,
.fs_close = grub_nilfs2_close, .close = grub_nilfs2_close,
.fs_label = grub_nilfs2_label, .label = grub_nilfs2_label,
.fs_uuid = grub_nilfs2_uuid, .uuid = grub_nilfs2_uuid,
.fs_mtime = grub_nilfs2_mtime, .mtime = grub_nilfs2_mtime,
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
.reserved_first_sector = 1, .reserved_first_sector = 1,
.blocklist_install = 0, .blocklist_install = 0,
+6 -6
View File
@@ -1212,12 +1212,12 @@ grub_ntfs_uuid (grub_device_t device, char **uuid)
static struct grub_fs grub_ntfs_fs = static struct grub_fs grub_ntfs_fs =
{ {
.name = "ntfs", .name = "ntfs",
.fs_dir = grub_ntfs_dir, .dir = grub_ntfs_dir,
.fs_open = grub_ntfs_open, .open = grub_ntfs_open,
.fs_read = grub_ntfs_read, .read = grub_ntfs_read,
.fs_close = grub_ntfs_close, .close = grub_ntfs_close,
.fs_label = grub_ntfs_label, .label = grub_ntfs_label,
.fs_uuid = grub_ntfs_uuid, .uuid = grub_ntfs_uuid,
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
.reserved_first_sector = 1, .reserved_first_sector = 1,
.blocklist_install = 1, .blocklist_install = 1,
+9 -9
View File
@@ -172,21 +172,21 @@ grub_procfs_open (struct grub_file *file, const char *path)
static struct grub_disk_dev grub_procfs_dev = { static struct grub_disk_dev grub_procfs_dev = {
.name = "proc", .name = "proc",
.id = GRUB_DISK_DEVICE_PROCFS_ID, .id = GRUB_DISK_DEVICE_PROCFS_ID,
.disk_iterate = grub_procdev_iterate, .iterate = grub_procdev_iterate,
.disk_open = grub_procdev_open, .open = grub_procdev_open,
.disk_close = grub_procdev_close, .close = grub_procdev_close,
.disk_read = grub_procdev_read, .read = grub_procdev_read,
.disk_write = grub_procdev_write, .write = grub_procdev_write,
.next = 0 .next = 0
}; };
static struct grub_fs grub_procfs_fs = static struct grub_fs grub_procfs_fs =
{ {
.name = "procfs", .name = "procfs",
.fs_dir = grub_procfs_dir, .dir = grub_procfs_dir,
.fs_open = grub_procfs_open, .open = grub_procfs_open,
.fs_read = grub_procfs_read, .read = grub_procfs_read,
.fs_close = grub_procfs_close, .close = grub_procfs_close,
.next = 0 .next = 0
}; };
+6 -6
View File
@@ -1402,12 +1402,12 @@ grub_reiserfs_uuid (grub_device_t device, char **uuid)
static struct grub_fs grub_reiserfs_fs = static struct grub_fs grub_reiserfs_fs =
{ {
.name = "reiserfs", .name = "reiserfs",
.fs_dir = grub_reiserfs_dir, .dir = grub_reiserfs_dir,
.fs_open = grub_reiserfs_open, .open = grub_reiserfs_open,
.fs_read = grub_reiserfs_read, .read = grub_reiserfs_read,
.fs_close = grub_reiserfs_close, .close = grub_reiserfs_close,
.fs_label = grub_reiserfs_label, .label = grub_reiserfs_label,
.fs_uuid = grub_reiserfs_uuid, .uuid = grub_reiserfs_uuid,
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
.reserved_first_sector = 1, .reserved_first_sector = 1,
.blocklist_install = 1, .blocklist_install = 1,
+5 -5
View File
@@ -461,11 +461,11 @@ grub_romfs_label (grub_device_t device, char **label)
static struct grub_fs grub_romfs_fs = static struct grub_fs grub_romfs_fs =
{ {
.name = "romfs", .name = "romfs",
.fs_dir = grub_romfs_dir, .dir = grub_romfs_dir,
.fs_open = grub_romfs_open, .open = grub_romfs_open,
.fs_read = grub_romfs_read, .read = grub_romfs_read,
.fs_close = grub_romfs_close, .close = grub_romfs_close,
.fs_label = grub_romfs_label, .label = grub_romfs_label,
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
.reserved_first_sector = 0, .reserved_first_sector = 0,
.blocklist_install = 0, .blocklist_install = 0,
+5 -5
View File
@@ -741,11 +741,11 @@ grub_sfs_label (grub_device_t device, char **label)
static struct grub_fs grub_sfs_fs = static struct grub_fs grub_sfs_fs =
{ {
.name = "sfs", .name = "sfs",
.fs_dir = grub_sfs_dir, .dir = grub_sfs_dir,
.fs_open = grub_sfs_open, .open = grub_sfs_open,
.fs_read = grub_sfs_read, .read = grub_sfs_read,
.fs_close = grub_sfs_close, .close = grub_sfs_close,
.fs_label = grub_sfs_label, .label = grub_sfs_label,
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
.reserved_first_sector = 0, .reserved_first_sector = 0,
.blocklist_install = 1, .blocklist_install = 1,
+5 -5
View File
@@ -995,11 +995,11 @@ grub_squash_mtime (grub_device_t dev, grub_int32_t *tm)
static struct grub_fs grub_squash_fs = static struct grub_fs grub_squash_fs =
{ {
.name = "squash4", .name = "squash4",
.fs_dir = grub_squash_dir, .dir = grub_squash_dir,
.fs_open = grub_squash_open, .open = grub_squash_open,
.fs_read = grub_squash_read, .read = grub_squash_read,
.fs_close = grub_squash_close, .close = grub_squash_close,
.fs_mtime = grub_squash_mtime, .mtime = grub_squash_mtime,
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
.reserved_first_sector = 0, .reserved_first_sector = 0,
.blocklist_install = 0, .blocklist_install = 0,
+4 -4
View File
@@ -324,10 +324,10 @@ grub_cpio_close (grub_file_t file)
static struct grub_fs grub_cpio_fs = { static struct grub_fs grub_cpio_fs = {
.name = "tarfs", .name = "tarfs",
.fs_dir = grub_cpio_dir, .dir = grub_cpio_dir,
.fs_open = grub_cpio_open, .open = grub_cpio_open,
.fs_read = grub_cpio_read, .read = grub_cpio_read,
.fs_close = grub_cpio_close, .close = grub_cpio_close,
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
.reserved_first_sector = 0, .reserved_first_sector = 0,
.blocklist_install = 0, .blocklist_install = 0,
+7 -145
View File
@@ -321,32 +321,6 @@ struct grub_udf_partmap
}; };
} GRUB_PACKED; } 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_lvd
{ {
struct grub_udf_tag tag; struct grub_udf_tag tag;
@@ -374,7 +348,6 @@ struct grub_udf_aed
struct grub_udf_data struct grub_udf_data
{ {
grub_disk_t disk; grub_disk_t disk;
struct grub_udf_pvd pvd;
struct grub_udf_lvd lvd; struct grub_udf_lvd lvd;
struct grub_udf_pd pds[GRUB_UDF_MAX_PDS]; struct grub_udf_pd pds[GRUB_UDF_MAX_PDS];
struct grub_udf_partmap *pms[GRUB_UDF_MAX_PMS]; struct grub_udf_partmap *pms[GRUB_UDF_MAX_PMS];
@@ -719,17 +692,7 @@ grub_udf_mount (grub_disk_t disk)
} }
tag.tag_ident = U16 (tag.tag_ident); tag.tag_ident = U16 (tag.tag_ident);
if (tag.tag_ident == GRUB_UDF_TAG_IDENT_PVD) if (tag.tag_ident == GRUB_UDF_TAG_IDENT_PD)
{
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) if (data->npd >= GRUB_UDF_MAX_PDS)
{ {
@@ -897,25 +860,6 @@ read_string (const grub_uint8_t *raw, grub_size_t sz, char *outbuf)
return 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 static int
grub_udf_iterate_dir (grub_fshelp_node_t dir, grub_udf_iterate_dir (grub_fshelp_node_t dir,
grub_fshelp_iterate_dir_hook_t hook, void *hook_data) grub_fshelp_iterate_dir_hook_t hook, void *hook_data)
@@ -1253,7 +1197,7 @@ grub_udf_label (grub_device_t device, char **label)
if (data) if (data)
{ {
*label = read_dstring (data->lvd.ident, sizeof (data->lvd.ident)); *label = read_string (data->lvd.ident, sizeof (data->lvd.ident), 0);
grub_free (data); grub_free (data);
} }
else else
@@ -1262,95 +1206,13 @@ grub_udf_label (grub_device_t device, char **label)
return grub_errno; 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 = { static struct grub_fs grub_udf_fs = {
.name = "udf", .name = "udf",
.fs_dir = grub_udf_dir, .dir = grub_udf_dir,
.fs_open = grub_udf_open, .open = grub_udf_open,
.fs_read = grub_udf_read, .read = grub_udf_read,
.fs_close = grub_udf_close, .close = grub_udf_close,
.fs_label = grub_udf_label, .label = grub_udf_label,
.fs_uuid = grub_udf_uuid,
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
.reserved_first_sector = 1, .reserved_first_sector = 1,
.blocklist_install = 1, .blocklist_install = 1,
+7 -7
View File
@@ -875,13 +875,13 @@ static struct grub_fs grub_ufs_fs =
.name = "ufs1", .name = "ufs1",
#endif #endif
#endif #endif
.fs_dir = grub_ufs_dir, .dir = grub_ufs_dir,
.fs_open = grub_ufs_open, .open = grub_ufs_open,
.fs_read = grub_ufs_read, .read = grub_ufs_read,
.fs_close = grub_ufs_close, .close = grub_ufs_close,
.fs_label = grub_ufs_label, .label = grub_ufs_label,
.fs_uuid = grub_ufs_uuid, .uuid = grub_ufs_uuid,
.fs_mtime = grub_ufs_mtime, .mtime = grub_ufs_mtime,
/* FIXME: set reserved_first_sector. */ /* FIXME: set reserved_first_sector. */
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
.blocklist_install = 1, .blocklist_install = 1,
+7 -19
View File
@@ -79,18 +79,9 @@ GRUB_MOD_LICENSE ("GPLv3+");
#define XFS_SB_FEAT_INCOMPAT_SPINODES (1 << 1) /* sparse inode chunks */ #define XFS_SB_FEAT_INCOMPAT_SPINODES (1 << 1) /* sparse inode chunks */
#define XFS_SB_FEAT_INCOMPAT_META_UUID (1 << 2) /* metadata UUID */ #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 \ #define XFS_SB_FEAT_INCOMPAT_SUPPORTED \
(XFS_SB_FEAT_INCOMPAT_FTYPE | \ (XFS_SB_FEAT_INCOMPAT_FTYPE | \
XFS_SB_FEAT_INCOMPAT_SPINODES | \
XFS_SB_FEAT_INCOMPAT_META_UUID) XFS_SB_FEAT_INCOMPAT_META_UUID)
struct grub_xfs_sblock struct grub_xfs_sblock
@@ -837,9 +828,6 @@ grub_xfs_iterate_dir (grub_fshelp_node_t dir,
entries = (grub_be_to_cpu32 (tail->leaf_count) entries = (grub_be_to_cpu32 (tail->leaf_count)
- grub_be_to_cpu32 (tail->leaf_stale)); - grub_be_to_cpu32 (tail->leaf_stale));
if (!entries)
continue;
/* Iterate over all entries within this block. */ /* Iterate over all entries within this block. */
while ((char *)direntry < (char *)tail) while ((char *)direntry < (char *)tail)
{ {
@@ -1137,12 +1125,12 @@ grub_xfs_uuid (grub_device_t device, char **uuid)
static struct grub_fs grub_xfs_fs = static struct grub_fs grub_xfs_fs =
{ {
.name = "xfs", .name = "xfs",
.fs_dir = grub_xfs_dir, .dir = grub_xfs_dir,
.fs_open = grub_xfs_open, .open = grub_xfs_open,
.fs_read = grub_xfs_read, .read = grub_xfs_read,
.fs_close = grub_xfs_close, .close = grub_xfs_close,
.fs_label = grub_xfs_label, .label = grub_xfs_label,
.fs_uuid = grub_xfs_uuid, .uuid = grub_xfs_uuid,
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
.reserved_first_sector = 0, .reserved_first_sector = 0,
.blocklist_install = 1, .blocklist_install = 1,
+8 -8
View File
@@ -4348,15 +4348,15 @@ grub_zfs_embed (grub_device_t device __attribute__ ((unused)),
static struct grub_fs grub_zfs_fs = { static struct grub_fs grub_zfs_fs = {
.name = "zfs", .name = "zfs",
.fs_dir = grub_zfs_dir, .dir = grub_zfs_dir,
.fs_open = grub_zfs_open, .open = grub_zfs_open,
.fs_read = grub_zfs_read, .read = grub_zfs_read,
.fs_close = grub_zfs_close, .close = grub_zfs_close,
.fs_label = zfs_label, .label = zfs_label,
.fs_uuid = zfs_uuid, .uuid = zfs_uuid,
.fs_mtime = zfs_mtime, .mtime = zfs_mtime,
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
.fs_embed = grub_zfs_embed, .embed = grub_zfs_embed,
.reserved_first_sector = 1, .reserved_first_sector = 1,
.blocklist_install = 0, .blocklist_install = 0,
#endif #endif
+6 -5
View File
@@ -73,6 +73,7 @@ static int LZ4_uncompress_unknownOutputSize(const char *source, char *dest,
#define U32 grub_uint32_t #define U32 grub_uint32_t
#define S32 grub_int32_t #define S32 grub_int32_t
#define U64 grub_uint64_t #define U64 grub_uint64_t
typedef grub_size_t size_t;
typedef struct _U16_S { typedef struct _U16_S {
U16 v; U16 v;
@@ -132,10 +133,10 @@ typedef struct _U64_S {
/* Decompression functions */ /* Decompression functions */
grub_err_t grub_err_t
lz4_decompress(void *s_start, void *d_start, grub_size_t s_len, grub_size_t d_len); lz4_decompress(void *s_start, void *d_start, size_t s_len, size_t d_len);
grub_err_t grub_err_t
lz4_decompress(void *s_start, void *d_start, grub_size_t s_len, grub_size_t d_len) lz4_decompress(void *s_start, void *d_start, size_t s_len, size_t d_len)
{ {
const BYTE *src = s_start; const BYTE *src = s_start;
U32 bufsiz = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | U32 bufsiz = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) |
@@ -166,7 +167,7 @@ LZ4_uncompress_unknownOutputSize(const char *source,
BYTE *const oend = op + maxOutputSize; BYTE *const oend = op + maxOutputSize;
BYTE *cpy; BYTE *cpy;
grub_size_t dec[] = { 0, 3, 2, 3, 0, 0, 0, 0 }; size_t dec[] = { 0, 3, 2, 3, 0, 0, 0, 0 };
/* Main Loop */ /* Main Loop */
while (ip < iend) { while (ip < iend) {
@@ -236,8 +237,8 @@ LZ4_uncompress_unknownOutputSize(const char *source,
/* copy repeated sequence */ /* copy repeated sequence */
if unlikely(op - ref < STEPSIZE) { if unlikely(op - ref < STEPSIZE) {
#if LZ4_ARCH64 #if LZ4_ARCH64
grub_size_t dec2table[] = { 0, 0, 0, -1, 0, 1, 2, 3 }; size_t dec2table[] = { 0, 0, 0, -1, 0, 1, 2, 3 };
grub_size_t dec2 = dec2table[op - ref]; size_t dec2 = dec2table[op - ref];
#else #else
const int dec2 = 0; const int dec2 = 0;
#endif #endif
-4
View File
@@ -58,10 +58,6 @@ if test x@TARGET_APPLE_LINKER@ != x1; then
-K grub_mod_init -K grub_mod_fini \ -K grub_mod_init -K grub_mod_fini \
-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 .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 -R .note -R .comment -R .ARM.exidx $tmpfile || exit 1
fi fi
if ! test -z "${TARGET_OBJ2ELF}"; then if ! test -z "${TARGET_OBJ2ELF}"; then
-4
View File
@@ -18,10 +18,6 @@ BEGIN {
{ {
if ($1 == "defined") { 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; symtab[$3] = $2;
modtab[$2] = "" modtab[$2] modtab[$2] = "" modtab[$2]
} else if ($1 == "undefined") { } else if ($1 == "undefined") {
@@ -0,0 +1,14 @@
diff --git grub-core/gnulib/regexec.c grub-core/gnulib/regexec.c
index f632cd4..a7776f0 100644
--- grub-core/gnulib/regexec.c
+++ grub-core/gnulib/regexec.c
@@ -4099,6 +4099,9 @@ check_node_accept (const re_match_context_t *mctx, const re_token_t *node,
case OP_UTF8_PERIOD:
if (ch >= ASCII_CHARS)
return false;
+#if defined __GNUC__ && __GNUC__ >= 7
+ __attribute__ ((fallthrough));
+#endif
/* FALLTHROUGH */
#endif
case OP_PERIOD:
@@ -1,8 +1,7 @@
diff --git a/lib/argp-parse.c b/lib/argp-parse.c === modified file 'grub-core/gnulib/argp-parse.c'
index 6dec57310..900adad54 100644 --- grub-core/gnulib/argp-parse.c 2010-04-02 22:45:01 +0000
--- a/lib/argp-parse.c +++ grub-core/gnulib/argp-parse.c 2011-04-10 13:25:52 +0000
+++ b/lib/argp-parse.c @@ -935,7 +935,7 @@
@@ -940,7 +940,7 @@ weak_alias (__argp_parse, argp_parse)
void * void *
__argp_input (const struct argp *argp, const struct argp_state *state) __argp_input (const struct argp *argp, const struct argp_state *state)
{ {
@@ -11,3 +10,4 @@ index 6dec57310..900adad54 100644
{ {
struct group *group; struct group *group;
struct parser *parser = state->pstate; struct parser *parser = state->pstate;
@@ -1,8 +1,8 @@
diff --git a/lib/argp-fmtstream.c b/lib/argp-fmtstream.c diff --git a/lib/argp-fmtstream.c b/lib/argp-fmtstream.c
index ba6a407f7..d0685b3d4 100644 index 7aa317c..02406ff 100644
--- a/lib/argp-fmtstream.c --- a/lib/argp-fmtstream.c
+++ b/lib/argp-fmtstream.c +++ b/lib/argp-fmtstream.c
@@ -28,9 +28,11 @@ @@ -29,9 +29,11 @@
#include <errno.h> #include <errno.h>
#include <stdarg.h> #include <stdarg.h>
#include <ctype.h> #include <ctype.h>
@@ -14,7 +14,7 @@ index ba6a407f7..d0685b3d4 100644
#ifndef ARGP_FMTSTREAM_USE_LINEWRAP #ifndef ARGP_FMTSTREAM_USE_LINEWRAP
@@ -115,6 +117,51 @@ weak_alias (__argp_fmtstream_free, argp_fmtstream_free) @@ -116,6 +118,51 @@ weak_alias (__argp_fmtstream_free, argp_fmtstream_free)
#endif #endif
#endif #endif
@@ -66,12 +66,12 @@ index ba6a407f7..d0685b3d4 100644
/* Process FS's buffer so that line wrapping is done from POINT_OFFS to the /* 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. */ end of its buffer. This code is mostly from glibc stdio/linewrap.c. */
void void
@@ -168,13 +215,15 @@ __argp_fmtstream_update (argp_fmtstream_t fs) @@ -168,14 +215,15 @@ __argp_fmtstream_update (argp_fmtstream_t fs)
if (!nl) if (!nl)
{ {
+ size_t display_width = mbsnwidth (buf, fs->p - buf, MBSW_STOP_AT_NUL);
/* The buffer ends in a partial line. */ /* 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 + len < fs->rmargin)
+ if (fs->point_col + display_width < fs->rmargin) + if (fs->point_col + display_width < fs->rmargin)
@@ -84,7 +84,7 @@ index ba6a407f7..d0685b3d4 100644
break; break;
} }
else else
@@ -182,14 +231,18 @@ __argp_fmtstream_update (argp_fmtstream_t fs) @@ -183,14 +231,18 @@ __argp_fmtstream_update (argp_fmtstream_t fs)
the end of the buffer. */ the end of the buffer. */
nl = fs->p; nl = fs->p;
} }
@@ -111,16 +111,16 @@ index ba6a407f7..d0685b3d4 100644
/* This line is too long. */ /* This line is too long. */
r = fs->rmargin - 1; r = fs->rmargin - 1;
@@ -225,7 +278,7 @@ __argp_fmtstream_update (argp_fmtstream_t fs) @@ -226,7 +278,7 @@ __argp_fmtstream_update (argp_fmtstream_t fs)
char *p, *nextline; char *p, *nextline;
int i; int i;
- p = buf + (r + 1 - fs->point_col); - p = buf + (r + 1 - fs->point_col);
+ p = buf + add_width (buf, fs->p, (r + 1 - fs->point_col)); + p = buf + add_width (buf, fs->p, (r + 1 - fs->point_col));
while (p >= buf && !isblank ((unsigned char) *p)) while (p >= buf && !isblank ((unsigned char) *p))
--p; --p;
nextline = p + 1; /* This will begin the next line. */ nextline = p + 1; /* This will begin the next line. */
@@ -243,7 +296,7 @@ __argp_fmtstream_update (argp_fmtstream_t fs) @@ -244,7 +296,7 @@ __argp_fmtstream_update (argp_fmtstream_t fs)
{ {
/* A single word that is greater than the maximum line width. /* A single word that is greater than the maximum line width.
Oh well. Put it on an overlong line by itself. */ Oh well. Put it on an overlong line by itself. */
@@ -129,21 +129,21 @@ index ba6a407f7..d0685b3d4 100644
/* Find the end of the long word. */ /* Find the end of the long word. */
if (p < nl) if (p < nl)
do do
@@ -277,7 +330,8 @@ __argp_fmtstream_update (argp_fmtstream_t fs) @@ -278,7 +330,8 @@ __argp_fmtstream_update (argp_fmtstream_t fs)
&& fs->p > nextline) && fs->p > nextline)
{ {
/* The margin needs more blanks than we removed. */ /* The margin needs more blanks than we removed. */
- if (fs->end - fs->p > fs->wmargin + 1) - if (fs->end - fs->p > fs->wmargin + 1)
+ if (mbsnwidth (fs->p, fs->end - fs->p, MBSW_STOP_AT_NUL) + if (mbsnwidth (fs->p, fs->end - fs->p, MBSW_STOP_AT_NUL)
+ > fs->wmargin + 1) + > fs->wmargin + 1)
/* Make some space for them. */ /* Make some space for them. */
{ {
size_t mv = fs->p - nextline; size_t mv = fs->p - nextline;
diff --git a/lib/argp-help.c b/lib/argp-help.c diff --git a/lib/argp-help.c b/lib/argp-help.c
index e5375a0f0..5d8f451ec 100644 index 354f1e2..2914f47 100644
--- a/lib/argp-help.c --- a/lib/argp-help.c
+++ b/lib/argp-help.c +++ b/lib/argp-help.c
@@ -51,6 +51,7 @@ @@ -50,6 +50,7 @@
#include "argp.h" #include "argp.h"
#include "argp-fmtstream.h" #include "argp-fmtstream.h"
#include "argp-namefrob.h" #include "argp-namefrob.h"
@@ -151,7 +151,7 @@ index e5375a0f0..5d8f451ec 100644
#ifndef SIZE_MAX #ifndef SIZE_MAX
# define SIZE_MAX ((size_t) -1) # define SIZE_MAX ((size_t) -1)
@@ -1432,7 +1433,7 @@ argp_args_usage (const struct argp *argp, const struct argp_state *state, @@ -1452,7 +1453,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 /* Manually do line wrapping so that it (probably) won't get wrapped at
any embedded spaces. */ any embedded spaces. */
@@ -161,57 +161,71 @@ index e5375a0f0..5d8f451ec 100644
__argp_fmtstream_write (stream, cp, nl - cp); __argp_fmtstream_write (stream, cp, nl - cp);
} }
diff --git a/lib/mbswidth.c b/lib/mbswidth.c diff --git a/lib/mbswidth.c b/lib/mbswidth.c
index 408a15e34..b3fb7f83a 100644 index 7c2dfce..baa4f27 100644
--- a/lib/mbswidth.c --- a/lib/mbswidth.c
+++ b/lib/mbswidth.c +++ b/lib/mbswidth.c
@@ -38,6 +38,14 @@ @@ -90,6 +90,9 @@ mbsnwidth (const char *string, size_t nbytes, int flags)
/* Get INT_MAX. */
#include <limits.h>
+#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++; p++;
width++; width++;
break; break;
+ case '\0': + case '\0':
+ if (flags & MBSW_STOP_AT_NUL) + if (flags & MBSW_STOP_AT_NUL)
+ return width; + return width;
+ FALLTHROUGH;
default: default:
/* If we have a multibyte sequence, scan it up to its end. */ /* 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) @@ -168,6 +171,9 @@ mbsnwidth (const char *string, size_t nbytes, int flags)
{ {
unsigned char c = (unsigned char) *p++; unsigned char c = (unsigned char) *p++;
+ if (c == 0 && (flags & MBSW_STOP_AT_NUL)) + if (c == 0 && (flags & MBSW_STOP_AT_NUL))
+ return width; + return width;
+ +
if (isprint (c)) if (isprint (c))
{ {
if (width == INT_MAX) if (width == INT_MAX)
diff --git a/lib/mbswidth.h b/lib/mbswidth.h diff --git a/lib/mbswidth.h b/lib/mbswidth.h
index 2b5c53c37..45a123e63 100644 index e9c0b03..d7207c5 100644
--- a/lib/mbswidth.h --- a/lib/mbswidth.h
+++ b/lib/mbswidth.h +++ b/lib/mbswidth.h
@@ -45,6 +45,10 @@ extern "C" { @@ -45,6 +45,9 @@ extern "C" {
control characters and 1 otherwise. */ control characters and 1 otherwise. */
#define MBSW_REJECT_UNPRINTABLE 2 #define MBSW_REJECT_UNPRINTABLE 2
+/* If this bit is set \0 is treated as the end of string. +/* If this bit is set \0 is treated as the end of string.
+ Otherwise it's treated as a normal one column width character. */ + Otherwise it's treated as a normal one column width character. */
+#define MBSW_STOP_AT_NUL 4 +#define MBSW_STOP_AT_NUL 4
+
/* Returns the number of screen columns needed for STRING. */ /* Returns the number of screen columns needed for STRING. */
#define mbswidth gnu_mbswidth /* avoid clash with UnixWare 7.1.1 function */ #define mbswidth gnu_mbswidth /* avoid clash with UnixWare 7.1.1 function */
diff --git a/modules/argp b/modules/argp
index 125046a..6f14d10 100644
--- a/modules/argp
+++ b/modules/argp
@@ -40,6 +40,7 @@ stdalign
strerror
memchr
memmove
+mbswidth
configure.ac:
gl_ARGP
diff --git a/modules/argp-tests b/modules/argp-tests
index 8f92a4d..0463927 100644
--- a/modules/argp-tests
+++ b/modules/argp-tests
@@ -1,11 +1,13 @@
Files:
tests/test-argp.c
tests/test-argp-2.sh
+tests/test-argp-2-utf.sh
Depends-on:
progname
Makefile.am:
TESTS += test-argp test-argp-2.sh
-check_PROGRAMS += test-argp
+TESTS += test-argp test-argp-2.sh test-argp-2-utf.sh
+check_PROGRAMS += test-argp test-argp-utf8
test_argp_LDADD = $(LDADD) @LIBINTL@
Loaded 100 of 595 files, more files were not shown because too many files have changed in this diff. Show more