Merge branch 'master' into next

Conflicts:
	ChangeLog-2015
	grub-core/net/drivers/ieee1275/ofnet.c
	include/grub/ieee1275/ieee1275.h
This commit is contained in:
Vladimir Serbinenko committed 2015-02-27 01:05:08 +01:00
commit c4748ead11
355 files changed
+7323 -2118

No files matched your search

+7
View File
@@ -58,6 +58,8 @@ grub-emu.exe
grub-emu-lite.exe grub-emu-lite.exe
grub_emu_init.c grub_emu_init.c
grub_emu_init.h grub_emu_init.h
/grub-file
/grub-file.exe
grub-fstest grub-fstest
grub-fstest.exe grub-fstest.exe
grub_fstest_init.c grub_fstest_init.c
@@ -66,6 +68,8 @@ grub_func_test
grub-install grub-install
grub-install.exe grub-install.exe
grub-kbdcomp grub-kbdcomp
/grub-macbless
/grub-macbless.exe
grub-macho2img grub-macho2img
/grub-menulst2cfg /grub-menulst2cfg
/grub-menulst2cfg.exe /grub-menulst2cfg.exe
@@ -120,6 +124,8 @@ grub-shell
grub-shell-tester grub-shell-tester
grub-sparc64-setup grub-sparc64-setup
grub-sparc64-setup.exe grub-sparc64-setup.exe
/grub-syslinux2cfg
/grub-syslinux2cfg.exe
gzcompress_test gzcompress_test
hddboot_test hddboot_test
help_test help_test
@@ -194,6 +200,7 @@ grub-core/modinfo.sh
grub-core/*.module grub-core/*.module
grub-core/*.module.exe grub-core/*.module.exe
grub-core/*.pp grub-core/*.pp
grub-core/kernel.img.bin
util/bash-completion.d/grub util/bash-completion.d/grub
grub-core/gnulib/alloca.h grub-core/gnulib/alloca.h
grub-core/gnulib/arg-nonnull.h grub-core/gnulib/arg-nonnull.h
File diff suppressed because it is too large. Load diff
+16 -10
View File
@@ -13,6 +13,9 @@ configuring the GRUB.
* GCC 4.1.3 or later * GCC 4.1.3 or later
Note: older versions may work but support is limited Note: older versions may work but support is limited
Experimental support for clang 3.3 or later (results in much bigger binaries)
for i386, x86_64, arm (except thumb), arm64, mips(el), powerpc, sparc64
Note: clang 3.2 or later works for i386 and x86_64 targets but results in Note: clang 3.2 or later works for i386 and x86_64 targets but results in
much bigger binaries. much bigger binaries.
earlier versions not tested earlier versions not tested
@@ -26,7 +29,8 @@ configuring the GRUB.
fail. fail.
Note: clang 3.2 or later works for powerpc Note: clang 3.2 or later works for powerpc
earlier versions not tested earlier versions not tested
Note: clang doesn't support -mno-app-regs and so can't be used for sparc64 Note: clang 3.5 or later works for sparc64
earlier versions return "error: unable to interface with target machine"
Note: clang has no support for ia64 and hence you can't compile GRUB Note: clang has no support for ia64 and hence you can't compile GRUB
for ia64 with clang for ia64 with clang
* GNU Make * GNU Make
@@ -35,6 +39,7 @@ configuring the GRUB.
* 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
* Other standard GNU/Unix tools * Other standard GNU/Unix tools
* a libc with large file support (e.g. glibc 2.1 or later)
On GNU/Linux, you also need: On GNU/Linux, you also need:
@@ -140,7 +145,7 @@ If build and host are different make check isn't available.
If build and host are different man pages are not generated. If build and host are different man pages are not generated.
As an example imagine you have a build system running on FreeBSD on sparc As an example imagine you have a build system running on FreeBSD on sparc
which prepares packages for developpers running amd64 GNU/Linux laptop and which prepares packages for developers running amd64 GNU/Linux laptop and
they need to make images for ARM board running U-boot. In this case: they need to make images for ARM board running U-boot. In this case:
build=sparc64-freebsd build=sparc64-freebsd
@@ -149,7 +154,7 @@ target=arm-uboot
For this example the configure line might look like (more details below) 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 omited): used options are omitted):
./configure BUILD_CC=gcc BUILD_FREETYPE=freetype-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" FREETYPE=amd64-linux-gnu-freetype-config CC=amd64-linux-gnu-gcc CFLAGS="-g -O2" FREETYPE=amd64-linux-gnu-freetype-config
@@ -168,14 +173,15 @@ corresponding platform are not needed for the platform in question.
generate sin and cos tables. generate sin and cos tables.
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_FREETYPE= for freetype-config for build (optional). 4. BUILD_LDFLAGS= for linker options for build.
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.
2. CC= for gcc able to compile for host 2. CC= for gcc able to compile for host
3. CFLAGS= for C options for host. 3. HOST_CFLAGS= for C options for host.
4. CPPFLAGS= for C preprocessor options for host. 4. HOST_CPPFLAGS= for C preprocessor options for host.
5. LDFLAGS= for linker options for host. 5. HOST_LDFLAGS= for linker options for host.
6. FREETYPE= for freetype-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).
@@ -196,9 +202,9 @@ corresponding platform are not needed for the platform in question.
11. TARGET_RANLIB= for ranlib for target. 11. TARGET_RANLIB= for ranlib for target.
- Additionally for emu, for host and target. - Additionally for emu, for host and target.
1. SDL is looked for in stadard linker directories (-lSDL) (optional) 1. SDL is looked for in standard linker directories (-lSDL) (optional)
2. libpciaccess is looked for in stadard linker directories (-lpciaccess) (optional) 2. libpciaccess is looked for in standard linker directories (-lpciaccess) (optional)
3. libusb is looked for in stadard linker directories (-lusb) (optional) 3. libusb is looked for in standard linker directories (-lusb) (optional)
- Platform-agnostic tools and data. - Platform-agnostic tools and data.
1. make is the tool you execute after ./configure. 1. make is the tool you execute after ./configure.
+49 -18
View File
@@ -1,7 +1,11 @@
AUTOMAKE_OPTIONS = subdir-objects -Wno-portability AUTOMAKE_OPTIONS = subdir-objects -Wno-portability
DEPDIR = .deps-util DEPDIR = .deps-util
SUBDIRS = grub-core/gnulib . grub-core po docs util/bash-completion.d SUBDIRS = grub-core/gnulib .
if COND_real_platform
SUBDIRS += grub-core
endif
SUBDIRS += po docs util/bash-completion.d
include $(top_srcdir)/conf/Makefile.common include $(top_srcdir)/conf/Makefile.common
include $(top_srcdir)/conf/Makefile.extra-dist include $(top_srcdir)/conf/Makefile.extra-dist
@@ -66,22 +70,22 @@ 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: 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) -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 CLEANFILES += build-grub-mkfont$(BUILD_EXEEXT)
garbage-gen: util/garbage-gen.c garbage-gen$(BUILD_EXEEXT): util/garbage-gen.c
$(BUILD_CC) -o $@ $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $^ $(BUILD_CC) -o $@ $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) $^
CLEANFILES += garbage-gen CLEANFILES += garbage-gen$(BUILD_EXEEXT)
EXTRA_DIST += util/garbage-gen.c EXTRA_DIST += util/garbage-gen.c
build-grub-gen-asciih: 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) -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 CLEANFILES += build-grub-gen-asciih$(BUILD_EXEEXT)
build-grub-gen-widthspec: 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) -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 CLEANFILES += build-grub-gen-widthspec$(BUILD_EXEEXT)
if COND_STARFIELD if COND_STARFIELD
starfield_DATA = dejavu_10.pf2 dejavu_12.pf2 dejavu_bold_14.pf2 dejavu_14.pf2 dejavu_16.pf2 $(starfield_theme_files) starfield_DATA = dejavu_10.pf2 dejavu_12.pf2 dejavu_bold_14.pf2 dejavu_14.pf2 dejavu_16.pf2 $(starfield_theme_files)
@@ -127,11 +131,13 @@ widthspec.h: $(FONT_SOURCE) build-grub-gen-widthspec
CLEANFILES += widthspec.h CLEANFILES += widthspec.h
# Install config.h into platformdir # Install config.h into platformdir
platform_HEADERS = config.h nodist_platform_HEADERS = config.h
pkgdata_DATA += grub-mkconfig_lib pkgdata_DATA += grub-mkconfig_lib
if COND_real_platform
if COND_i386_coreboot if COND_i386_coreboot
QEMU32=qemu-system-i386 QEMU32=qemu-system-i386
endif endif
@@ -383,12 +389,10 @@ if COND_powerpc_ieee1275
BOOTCHECKS = bootcheck-linux-ppc BOOTCHECKS = bootcheck-linux-ppc
endif endif
EXTRA_DIST += grub-core/tests/boot/kbsd.init-i386.S grub-core/tests/boot/kbsd.init-x86_64.S grub-core/tests/boot/kbsd.spec.txt grub-core/tests/boot/kernel-8086.S grub-core/tests/boot/kernel-i386.S grub-core/tests/boot/kfreebsd-aout.cfg grub-core/tests/boot/kfreebsd.cfg grub-core/tests/boot/kfreebsd.init-i386.S grub-core/tests/boot/kfreebsd.init-x86_64.S grub-core/tests/boot/knetbsd.cfg grub-core/tests/boot/kopenbsd.cfg grub-core/tests/boot/kopenbsdlabel.txt grub-core/tests/boot/linux16.cfg grub-core/tests/boot/linux.cfg grub-core/tests/boot/linux.init-i386.S grub-core/tests/boot/linux.init-mips.S grub-core/tests/boot/linux.init-ppc.S grub-core/tests/boot/linux.init-x86_64.S grub-core/tests/boot/linux-ppc.cfg grub-core/tests/boot/multiboot2.cfg grub-core/tests/boot/multiboot.cfg grub-core/tests/boot/ntldr.cfg grub-core/tests/boot/pc-chainloader.cfg grub-core/tests/boot/qemu-shutdown-x86.S
.PHONY: bootcheck-linux-i386 bootcheck-linux-x86_64 \ .PHONY: bootcheck-linux-i386 bootcheck-linux-x86_64 \
bootcheck-kfreebsd-i386 bootcheck-kfreebsd-x86_64 \ bootcheck-kfreebsd-i386 bootcheck-kfreebsd-x86_64 \
bootcheck-knetbsd-i386 bootcheck-knetbsd-x86_64 \ bootcheck-knetbsd-i386 bootcheck-knetbsd-x86_64 \
bootcheck-linux-mips bootcheck-linux-mips FORCE
# Randomly generated # Randomly generated
SUCCESSFUL_BOOT_STRING=3e49994fd5d82b7c9298d672d774080d SUCCESSFUL_BOOT_STRING=3e49994fd5d82b7c9298d672d774080d
@@ -399,9 +403,13 @@ bootcheck: $(BOOTCHECKS)
if COND_i386_coreboot if COND_i386_coreboot
default_payload.elf: grub-mkstandalone grub-mkimage default_payload.elf: grub-mkstandalone grub-mkimage
pkgdatadir=. ./grub-mkstandalone --grub-mkimage=./grub-mkimage -O i386-coreboot -o $@ --modules='ahci pata ehci uhci ohci usb_keyboard usbms part_msdos xfs 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' --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 xfs 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' --fonts= --themes= --locales= -d grub-core/ /boot/grub/grub.cfg=$(srcdir)/coreboot.cfg
endif endif
endif
EXTRA_DIST += grub-core/tests/boot/kbsd.init-i386.S grub-core/tests/boot/kbsd.init-x86_64.S grub-core/tests/boot/kbsd.spec.txt grub-core/tests/boot/kernel-8086.S grub-core/tests/boot/kernel-i386.S grub-core/tests/boot/kfreebsd-aout.cfg grub-core/tests/boot/kfreebsd.cfg grub-core/tests/boot/kfreebsd.init-i386.S grub-core/tests/boot/kfreebsd.init-x86_64.S grub-core/tests/boot/knetbsd.cfg grub-core/tests/boot/kopenbsd.cfg grub-core/tests/boot/kopenbsdlabel.txt grub-core/tests/boot/linux16.cfg grub-core/tests/boot/linux.cfg grub-core/tests/boot/linux.init-i386.S grub-core/tests/boot/linux.init-mips.S grub-core/tests/boot/linux.init-ppc.S grub-core/tests/boot/linux.init-x86_64.S grub-core/tests/boot/linux-ppc.cfg grub-core/tests/boot/multiboot2.cfg grub-core/tests/boot/multiboot.cfg grub-core/tests/boot/ntldr.cfg grub-core/tests/boot/pc-chainloader.cfg grub-core/tests/boot/qemu-shutdown-x86.S
windowsdir=$(top_builddir)/$(PACKAGE)-$(VERSION)-for-windows windowsdir=$(top_builddir)/$(PACKAGE)-$(VERSION)-for-windows
windowsdir: $(PROGRAMS) $(starfield_DATA) $(platform_DATA) windowsdir: $(PROGRAMS) $(starfield_DATA) $(platform_DATA)
test -d $(windowsdir) && rm -rf $(windowsdir) || true test -d $(windowsdir) && rm -rf $(windowsdir) || true
@@ -420,10 +428,33 @@ windowsdir: $(PROGRAMS) $(starfield_DATA) $(platform_DATA)
for x in $(starfield_DATA); do \ for x in $(starfield_DATA); do \
cp -fp $$x $(windowsdir)/themes/starfield/$$(basename $$x); \ cp -fp $$x $(windowsdir)/themes/starfield/$$(basename $$x); \
done done
for x in $(GRUB_WINDOWS_EXTRA_DIST); do \
cp -fp $$x $(windowsdir); \
done
windowszip=$(top_builddir)/$(PACKAGE)-$(VERSION)-for-windows.zip windowszip=$(top_builddir)/$(PACKAGE)-$(VERSION)-for-windows.zip
windowszip: windowsdir windowszip: windowsdir
test -f $(windowszip) && rm $(windowszip) || true test -f $(windowszip) && rm $(windowszip) || true
zip -r $(windowszip) $(windowsdir) zip -r $(windowszip) $(windowsdir)
rm -rf $(windowsdir)
EXTRA_DIST += linguas.sh EXTRA_DIST += linguas.sh
changelog_start_date = 2015-01-23
gitlog_to_changelog = $(top_srcdir)/build-aux/gitlog-to-changelog
ChangeLog: FORCE
if test -d $(top_srcdir)/.git; then \
$(gitlog_to_changelog) --srcdir=$(top_srcdir) --since=$(changelog_start_date) > '$@.tmp'; \
rm -f '$@'; mv '$@.tmp' '$@'; \
else \
touch $@; \
fi
EXTRA_DIST += ChangeLog ChangeLog-2015
syslinux_test: $(top_builddir)/config.status tests/syslinux/ubuntu10.04_grub.cfg
tests/syslinux/ubuntu10.04_grub.cfg: $(top_builddir)/config.status tests/syslinux/ubuntu10.04_grub.cfg.in
(for x in tests/syslinux/ubuntu10.04_grub.cfg.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:-
CLEANFILES += tests/syslinux/ubuntu10.04_grub.cfg
+28 -3
View File
@@ -384,7 +384,7 @@ program = {
ldadd = libgrubgcry.a; ldadd = libgrubgcry.a;
ldadd = libgrubkern.a; ldadd = libgrubkern.a;
ldadd = grub-core/gnulib/libgnu.a; ldadd = grub-core/gnulib/libgnu.a;
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBGEOM)'; ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
}; };
program = { program = {
@@ -405,7 +405,7 @@ program = {
program = { program = {
name = grub-macbless; name = grub-macbless;
installdir = sbin; installdir = sbin;
mansection = 1; mansection = 8;
common = util/grub-macbless.c; common = util/grub-macbless.c;
common = grub-core/osdep/init.c; common = grub-core/osdep/init.c;
common = grub-core/kern/emu/argp_common.c; common = grub-core/kern/emu/argp_common.c;
@@ -439,42 +439,49 @@ script = {
name = '10_hurd'; name = '10_hurd';
common = util/grub.d/10_hurd.in; common = util/grub.d/10_hurd.in;
installdir = grubconf; installdir = grubconf;
condition = COND_HOST_HURD;
}; };
script = { script = {
name = '10_kfreebsd'; name = '10_kfreebsd';
common = util/grub.d/10_kfreebsd.in; common = util/grub.d/10_kfreebsd.in;
installdir = grubconf; installdir = grubconf;
condition = COND_HOST_KFREEBSD;
}; };
script = { script = {
name = '10_illumos'; name = '10_illumos';
common = util/grub.d/10_illumos.in; common = util/grub.d/10_illumos.in;
installdir = grubconf; installdir = grubconf;
condition = COND_HOST_ILLUMOS;
}; };
script = { script = {
name = '10_netbsd'; name = '10_netbsd';
common = util/grub.d/10_netbsd.in; common = util/grub.d/10_netbsd.in;
installdir = grubconf; installdir = grubconf;
condition = COND_HOST_NETBSD;
}; };
script = { script = {
name = '10_linux'; name = '10_linux';
common = util/grub.d/10_linux.in; common = util/grub.d/10_linux.in;
installdir = grubconf; installdir = grubconf;
condition = COND_HOST_LINUX;
}; };
script = { script = {
name = '10_xnu'; name = '10_xnu';
common = util/grub.d/10_xnu.in; common = util/grub.d/10_xnu.in;
installdir = grubconf; installdir = grubconf;
condition = COND_HOST_XNU;
}; };
script = { script = {
name = '20_linux_xen'; name = '20_linux_xen';
common = util/grub.d/20_linux_xen.in; common = util/grub.d/20_linux_xen.in;
installdir = grubconf; installdir = grubconf;
condition = COND_HOST_LINUX;
}; };
script = { script = {
@@ -701,7 +708,7 @@ script = {
name = grub-fs-tester; name = grub-fs-tester;
common = tests/util/grub-fs-tester.in; common = tests/util/grub-fs-tester.in;
installdir = noinst; installdir = noinst;
dependencies = garbage-gen; dependencies = 'garbage-gen$(BUILD_EXEEXT)';
}; };
script = { script = {
@@ -1143,6 +1150,24 @@ script = {
common = tests/grub_cmd_tr.in; common = tests/grub_cmd_tr.in;
}; };
script = {
testcase;
name = file_filter_test;
common = tests/file_filter_test.in;
};
script = {
testcase;
name = grub_cmd_test;
common = tests/grub_cmd_test.in;
};
script = {
testcase;
name = syslinux_test;
common = tests/syslinux_test.in;
};
program = { program = {
testcase; testcase;
name = example_unit_test; name = example_unit_test;
+151 -2
View File
@@ -1,3 +1,153 @@
New in 2.02:
* New/improved filesystem and disk support:
* Big-endian UFS1.
* Experimental 64-bit ext2 support.
* Various fixes for non-512-byte sector devices.
* New `proc' filesystem framework, used by LUKS disks.
* Fix DM-RAID partition handling.
* New `nativedisk' command to switch from firmware to native disk drivers.
* Compressed HFS+.
* DragonFly BSD labels.
* CBFS (coreboot).
* Handle partitioned LVM properly.
* Use LVM UUIDs whenever possible.
* GPT PReP.
* New `progress' module that shows progress information while reading
files.
* ZFS features support.
* ZFS LZ4 support.
* New/improved terminal and video support:
* Monochrome text (matching `hercules' in GRUB Legacy).
* Morse code output using system speaker.
* `spkmodem' output (simple data protocol using system speaker).
* Handle Japanese special keys.
* coreboot framebuffer.
* Serial on ARC.
* Native vt100 handling for grub-emu, replacing the use of the curses
library.
* New gfxmenu options for terminal window positioning, theme background
image handling, and scrollbar padding, plus `item_pixmap_style' and
`highlight_overlay'.
* Support several more image types (paletted and greyscale).
* Boot protocol improvements:
* Support Apple FAT binaries on non-Apple platforms.
* Improve FreeDOS direct loading support compatibility.
* Enable `linux16' on all x86 platforms, not just BIOS.
* New TrueCrypt ISO loader.
* multiboot2 boot-services EFI specification.
* multiboot2 EFI memory map specification.
* multiboot2 full-file specfication.
* New/improved network support:
* New variables `net_default_*' containing properties of the default
interface.
* Autoload `http' and `tftp' modules if necessary.
* Improve TFTP robustness.
* Parse `nd' disk names in GRUB Legacy configuration files.
* Issue separate DNS queries for IPv4 and IPv6.
* Coreboot improvements:
* CBFS support both in on-disk images (loopback) and flash.
* Ability to launch another payload from flash or disk
* Coreboot framebuffer
* CBMEMC support (both logging and inspecting logs)
* Command for inspecting coreboot timestamps (`coreboot_boottime').
* Command for inspecting coreboot tables (`lscoreboot').
* New target default_payload.elf.
* Increased maximal core size.
* New/improved platform support:
* New `efifwsetup' and `lsefi' commands on EFI platforms.
* New `cmosdump' and `cmosset' commands on platforms with CMOS support.
* New command `pcidump' for PCI platforms.
* Improve opcode parsing in ACPI halt implementation.
* Use the TSC as a possible time source on i386-ieee1275.
* Merge PowerPC grub-mkrescue implementation with the common one.
* Support grub-mkrescue on i386-ieee1275, sparc64, bootinfo machines such
as pSeries, and mips-arc.
* Make grub-mkrescue better support Apple Intel Macs on CD.
* Enable GRUB Legacy configuration file parsing on EFI.
* Support halt for Loongson 2E.
* ARM U-Boot and EFI ports.
* Reorganise platform-dependent code in utilities to avoid #ifdef mess.
* AROS and Haiku support for userspace utilities.
* Xen PV port.
* Fix EFI stack alignment.
* ARM64 EFI port.
* On Linux, read partition start offsets from sysfs if possible.
* New grub-macbless utility, and better integration with Mac firmware in
grub-install.
* Support Yeeloong 3A.
* Add `cpuid --pae' option to detect Physical Address Extension on x86.
* Support for USB debug dongles.
* Support for *-emu on all platforms (previously only i386/x86_64 worked).
* Support *-emu on Windows.
* New platform `none' which builds only user level utilities. This is now
default if target CPU is not supported.
* Security:
* Add optional facility to enforce that all files read by the core image
from disk have a valid detached digital signature.
* Performance:
* Avoid costly division operations in many places.
* New boot time analysis framework (`./configure --enable-boot-time').
* Initialise USB ports in parallel.
* New `testspeed' command to test file read speed.
* Speed-up gfxterm by storing intermediate results in more compact format.
* Lazy LVM/mdraid scan.
* Disk hints.
* Scripting:
* New `eval' and `tr' commands.
* grub-script-check fails on scripts containing no commands.
* Installation and other utility improvements:
* Add option to compress files on installation or image creation.
* Using grub-reboot no longer requires setting `GRUB_DEFAULT=saved'.
* Support probing EFI System Partition (requires os-prober >= 1.58).
* Fix inconsistent use of `GRUB_CRYPTODISK_ENABLE' and
`GRUB_ENABLE_CRYPTODISK'; the latter is now used consistently.
* grub-mount handles symbolic links to directories.
* Support disabling submenus with `GRUB_DISABLE_SUBMENU' configuration key
for grub-mkconfig.
* grub-install, grub-mknetdir, grub-mkrescue, and grub-mkstandalone
rewritten in C. They should now work in supported non-Unix-like
environments.
* Native mingw support.
* Ability to install on EFI under windows.
* Reorganise timeout handling using new `timeout_style' environment
variable and `GRUB_TIMEOUT_STYLE' configuration key for grub-mkconfig.
Menu hotkeys pressed during a hidden timeout now boot the corresponding
menu entry immediately.
* New `file' command and grub-file utility to check file types.
* New syslinux configuration file parser.
* Build system:
* Remove all uses of nested functions; GRUB no longer requires an
executable stack.
* Fix documentation build with Texinfo >= 5.1.
* More robust and documented cross-compiling support.
* Partial clang support for some platforms (experimental).
* Partial mingw64 x86_64-efi compile support (highly experimental).
* Partial mingw32 i386-* (other than already present i386-pc)
compile support (highly experimental).
* Support for grub-mkpasswd on Windows.
* Eliminate the use of AutoGen. This allowed some performance
improvements to the build system.
* Remove variable length arrays.
* OpenBSD compile and tools support (NetBSD and FreeBSD were already supported).
* Fix build with FreeType >= 2.5.1.
* Make gentpl.py compatible with Python 3. It now requires at least
Python 2.6.
* modinfo.sh contains build information now.
* Added many new tests to improve robustness.
* Revision control moved to git.
New in 2.00: New in 2.00:
* Appearance: * Appearance:
@@ -24,7 +174,6 @@ New in 2.00:
* IEEE1275 serial. * IEEE1275 serial.
* EFI serial. * EFI serial.
* Network stack for BIOS, IEEE1275, EMU and EFI, including TFTP, HTTP and DNS. * Network stack for BIOS, IEEE1275, EMU and EFI, including TFTP, HTTP and DNS.
* VBE on coreboot support.
* New filesystem, filters and disks formats: * New filesystem, filters and disks formats:
* DVH partition map. * DVH partition map.
@@ -48,7 +197,7 @@ New in 2.00:
* multidevice, mirrored and raidz(2,3) ZFS support. * multidevice, mirrored and raidz(2,3) ZFS support.
* RAID LVM (internal RAIDing) support. * RAID LVM (internal RAIDing) support.
* ZFS crypto support. * ZFS crypto support.
* ZLE and GZIP on ZFS support. * ZLE, LZ4 and GZIP on ZFS support.
* Support ZFS up to 33. * Support ZFS up to 33.
* HFS string is now treated like mac-roman and not UTF-8 * HFS string is now treated like mac-roman and not UTF-8
* HFS mtime support. * HFS mtime support.
+3 -77
View File
@@ -210,80 +210,6 @@ fi
]) ])
dnl Mass confusion!
dnl Older versions of GAS interpret `.code16' to mean ``generate 32-bit
dnl instructions, but implicitly insert addr32 and data32 bytes so
dnl that the code works in real mode''.
dnl
dnl Newer versions of GAS interpret `.code16' to mean ``generate 16-bit
dnl instructions,'' which seems right. This requires the programmer
dnl to explicitly insert addr32 and data32 instructions when they want
dnl them.
dnl
dnl We only support the newer versions, because the old versions cause
dnl major pain, by requiring manual assembly to get 16-bit instructions into
dnl asm files.
AC_DEFUN([grub_I386_ASM_ADDR32],
[AC_REQUIRE([AC_PROG_CC])
AC_REQUIRE([grub_I386_ASM_PREFIX_REQUIREMENT])
AC_MSG_CHECKING([for .code16 addr32 assembler support])
AC_CACHE_VAL(grub_cv_i386_asm_addr32,
[cat > conftest.s.in <<\EOF
.code16
l1: @ADDR32@ movb %al, l1
EOF
if test "x$grub_cv_i386_asm_prefix_requirement" = xyes; then
sed -e s/@ADDR32@/addr32/ < conftest.s.in > conftest.s
else
sed -e s/@ADDR32@/addr32\;/ < conftest.s.in > conftest.s
fi
if AC_TRY_COMMAND([${CC-cc} ${TARGET_CCASFLAGS} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
grub_cv_i386_asm_addr32=yes
else
grub_cv_i386_asm_addr32=no
fi
rm -f conftest*])
AC_MSG_RESULT([$grub_cv_i386_asm_addr32])])
dnl Later versions of GAS requires that addr32 and data32 prefixes
dnl appear in the same lines as the instructions they modify, while
dnl earlier versions requires that they appear in separate lines.
AC_DEFUN([grub_I386_ASM_PREFIX_REQUIREMENT],
[AC_REQUIRE([AC_PROG_CC])
AC_MSG_CHECKING(dnl
[whether addr32 must be in the same line as the instruction])
AC_CACHE_VAL(grub_cv_i386_asm_prefix_requirement,
[cat > conftest.s <<\EOF
.code16
l1: addr32 movb %al, l1
EOF
if AC_TRY_COMMAND([${CC-cc} ${TARGET_CCASFLAGS} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
grub_cv_i386_asm_prefix_requirement=yes
else
grub_cv_i386_asm_prefix_requirement=no
fi
rm -f conftest*])
if test "x$grub_cv_i386_asm_prefix_requirement" = xyes; then
grub_tmp_addr32="addr32"
grub_tmp_data32="data32"
else
grub_tmp_addr32="addr32;"
grub_tmp_data32="data32;"
fi
ADDR32=$grub_tmp_addr32
DATA32=$grub_tmp_data32
AC_MSG_RESULT([$grub_cv_i386_asm_prefix_requirement])])
dnl Check what symbol is defined as a bss start symbol. dnl Check what symbol is defined as a bss start symbol.
dnl Written by Michael Hohmoth and Yoshinori K. Okuji. dnl Written by Michael Hohmoth and Yoshinori K. Okuji.
AC_DEFUN([grub_CHECK_BSS_START_SYMBOL], AC_DEFUN([grub_CHECK_BSS_START_SYMBOL],
@@ -418,15 +344,15 @@ else
[fi] [fi]
]) ])
dnl Check if ln can handle directories properly (mingw). dnl Check if ln -s can handle directories properly (mingw).
AC_DEFUN([grub_CHECK_LINK_DIR],[ AC_DEFUN([grub_CHECK_LINK_DIR],[
AC_MSG_CHECKING([whether ln can handle directories properly]) AC_MSG_CHECKING([whether ln -s can handle directories properly])
[mkdir testdir 2>/dev/null [mkdir testdir 2>/dev/null
case $srcdir in case $srcdir in
[\\/$]* | ?:[\\/]* ) reldir=$srcdir/include/grub/util ;; [\\/$]* | ?:[\\/]* ) reldir=$srcdir/include/grub/util ;;
*) reldir=../$srcdir/include/grub/util ;; *) reldir=../$srcdir/include/grub/util ;;
esac esac
if ln -s $reldir testdir/util 2>/dev/null ; then] if ln -s $reldir testdir/util 2>/dev/null && rm -f testdir/util 2>/dev/null ; then]
AC_MSG_RESULT([yes]) AC_MSG_RESULT([yes])
[link_dir=yes [link_dir=yes
else else
+20
View File
@@ -0,0 +1,20 @@
/* on arm clang doesn't support .arch directive */
.text
.syntax unified
#if !defined (__thumb2__)
.arch armv7a
.arm
#else
.arch armv7
.thumb
#endif
mcr p15, 0, r11, c7, c14, 2
/* clang restricts access to dsb/isb despite .arch */
dsb
isb
+10
View File
@@ -0,0 +1,10 @@
/* on x86 old clang doesn't support .code16
newer clang supports it but creates 6-byte jumps instead of 3-byte ones
which makes us go over boot sector size. */
.code16
jmp far
.org 4
.space 300
far:
.byte 0
+4
View File
@@ -0,0 +1,4 @@
/* on x86 old clang doesn't support .code16 */
.code16
movb %al, %bl
+11
View File
@@ -0,0 +1,11 @@
/* on mips clang doesn't support privilegied instructions, doubleword store/load
and crashes with hand-written assembly
*/
.set mips3
sync
ld $t2, 0($t6)
a:
addiu $t7, $s0, (b - a)
b: nop
+8
View File
@@ -0,0 +1,8 @@
/* clang <= 3.3 doesn't handle most of ppc assembly, not even inline assembly
used by gcrypt */
/* Cache invalidation loop is a fair test. */
li 5, 0
1: icbi 5, 3
addi 5, 5, 32
cmpw 5, 4
blt 1b
+9
View File
@@ -0,0 +1,9 @@
.text
1:
/* A small list of examples of what clang doesn't support. */
clr %o0
lduw [%o4 + 4], %o4
and %o6, ~0xff, %o6
stw %o5, [%o3]
bne,pt %icc, 1b
nop
+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:
+8 -14
View File
@@ -7,12 +7,7 @@ unexport LC_ALL
# Platform specific options # Platform specific options
if COND_sparc64_ieee1275 if COND_sparc64_ieee1275
CFLAGS_PLATFORM += -mno-app-regs LDFLAGS_PLATFORM = -Wl,-melf64_sparc
LDFLAGS_PLATFORM = -Wl,-melf64_sparc -Wl,--no-relax
endif
if COND_sparc64_emu
CFLAGS_PLATFORM += -mno-app-regs
LDFLAGS_PLATFORM = -Wl,--no-relax
endif endif
if COND_arm if COND_arm
if !COND_emu if !COND_emu
@@ -35,26 +30,25 @@ CPPFLAGS_DEFAULT += -I$(top_builddir)
CPPFLAGS_DEFAULT += -I$(top_srcdir) CPPFLAGS_DEFAULT += -I$(top_srcdir)
CPPFLAGS_DEFAULT += -I$(top_srcdir)/include CPPFLAGS_DEFAULT += -I$(top_srcdir)/include
CPPFLAGS_DEFAULT += -I$(top_builddir)/include CPPFLAGS_DEFAULT += -I$(top_builddir)/include
CPPFLAGS_DEFAULT += -I$(top_srcdir)/grub-core/lib/libgcrypt-grub/include
CPPFLAGS_DEFAULT += -I$(top_srcdir)/grub-core/lib/libgcrypt-grub/src/ CPPFLAGS_DEFAULT += -I$(top_srcdir)/grub-core/lib/libgcrypt-grub/src/
CCASFLAGS_DEFAULT = $(CPPFLAGS_DEFAULT) -DASM_FILE=1 CCASFLAGS_DEFAULT = $(CPPFLAGS_DEFAULT) -DASM_FILE=1
BUILD_CPPFLAGS += $(CPPFLAGS_DEFAULT) BUILD_CPPFLAGS += $(CPPFLAGS_DEFAULT)
LDADD_KERNEL = $(TARGET_LIBGCC) LDADD_KERNEL = $(TARGET_LIBGCC)
CFLAGS_KERNEL = $(CFLAGS_CPU) $(CFLAGS_PLATFORM) -ffreestanding CFLAGS_KERNEL = $(CFLAGS_PLATFORM) -ffreestanding
LDFLAGS_KERNEL = $(LDFLAGS_CPU) $(LDFLAGS_PLATFORM) -nostdlib $(TARGET_LDFLAGS_OLDMAGIC) $(TARGET_LDFLAGS_STATIC_LIBGCC) LDFLAGS_KERNEL = $(LDFLAGS_PLATFORM) -nostdlib $(TARGET_LDFLAGS_OLDMAGIC) $(TARGET_LDFLAGS_STATIC_LIBGCC)
CPPFLAGS_KERNEL = $(CPPFLAGS_CPU) $(CPPFLAGS_PLATFORM) -DGRUB_KERNEL=1 CPPFLAGS_KERNEL = $(CPPFLAGS_CPU) $(CPPFLAGS_PLATFORM) -DGRUB_KERNEL=1
CCASFLAGS_KERNEL = $(CCASFLAGS_CPU) $(CCASFLAGS_PLATFORM) CCASFLAGS_KERNEL = $(CCASFLAGS_CPU) $(CCASFLAGS_PLATFORM)
STRIPFLAGS_KERNEL = -R .rel.dyn -R .reginfo -R .note -R .comment -R .drectve -R .note.gnu.gold-version STRIPFLAGS_KERNEL = -R .rel.dyn -R .reginfo -R .note -R .comment -R .drectve -R .note.gnu.gold-version -R .MIPS.abiflags
CFLAGS_MODULE = $(CFLAGS_CPU) $(CFLAGS_PLATFORM) -ffreestanding CFLAGS_MODULE = $(CFLAGS_PLATFORM) -ffreestanding
LDFLAGS_MODULE = $(LDFLAGS_CPU) $(LDFLAGS_PLATFORM) -nostdlib $(TARGET_LDFLAGS_OLDMAGIC) -Wl,-r,-d LDFLAGS_MODULE = $(LDFLAGS_PLATFORM) -nostdlib $(TARGET_LDFLAGS_OLDMAGIC) -Wl,-r,-d
CPPFLAGS_MODULE = $(CPPFLAGS_CPU) $(CPPFLAGS_PLATFORM) CPPFLAGS_MODULE = $(CPPFLAGS_CPU) $(CPPFLAGS_PLATFORM)
CCASFLAGS_MODULE = $(CCASFLAGS_CPU) $(CCASFLAGS_PLATFORM) CCASFLAGS_MODULE = $(CCASFLAGS_CPU) $(CCASFLAGS_PLATFORM)
CFLAGS_IMAGE = $(CFLAGS_CPU) $(CFLAGS_PLATFORM) -fno-builtin CFLAGS_IMAGE = $(CFLAGS_PLATFORM) -fno-builtin
LDFLAGS_IMAGE = $(LDFLAGS_CPU) $(LDFLAGS_PLATFORM) -nostdlib $(TARGET_LDFLAGS_OLDMAGIC) -Wl,-S LDFLAGS_IMAGE = $(LDFLAGS_PLATFORM) -nostdlib $(TARGET_LDFLAGS_OLDMAGIC) -Wl,-S
CPPFLAGS_IMAGE = $(CPPFLAGS_CPU) $(CPPFLAGS_PLATFORM) CPPFLAGS_IMAGE = $(CPPFLAGS_CPU) $(CPPFLAGS_PLATFORM)
CCASFLAGS_IMAGE = $(CCASFLAGS_CPU) $(CCASFLAGS_PLATFORM) CCASFLAGS_IMAGE = $(CCASFLAGS_CPU) $(CCASFLAGS_PLATFORM)
+23
View File
@@ -110,3 +110,26 @@ EXTRA_DIST += tests/dfly-mbr-mbexample.mbr.img.gz
EXTRA_DIST += tests/dfly-mbr-mbexample.dfly.img.gz EXTRA_DIST += tests/dfly-mbr-mbexample.dfly.img.gz
EXTRA_DIST += coreboot.cfg EXTRA_DIST += coreboot.cfg
EXTRA_DIST += tests/file_filter/file
EXTRA_DIST += tests/file_filter/file.gz
EXTRA_DIST += tests/file_filter/file.gz.sig
EXTRA_DIST += tests/file_filter/file.lzop
EXTRA_DIST += tests/file_filter/file.lzop.sig
EXTRA_DIST += tests/file_filter/file.xz
EXTRA_DIST += tests/file_filter/file.xz.sig
EXTRA_DIST += tests/file_filter/keys
EXTRA_DIST += tests/file_filter/keys.pub
EXTRA_DIST += tests/file_filter/test.cfg
EXTRA_DIST += tests/syslinux/ubuntu10.04/isolinux/prompt.cfg
EXTRA_DIST += tests/syslinux/ubuntu10.04/isolinux/gfxboot.cfg
EXTRA_DIST += tests/syslinux/ubuntu10.04/isolinux/adtxt.cfg
EXTRA_DIST += tests/syslinux/ubuntu10.04/isolinux/isolinux.cfg
EXTRA_DIST += tests/syslinux/ubuntu10.04/isolinux/exithelp.cfg
EXTRA_DIST += tests/syslinux/ubuntu10.04/isolinux/txt.cfg
EXTRA_DIST += tests/syslinux/ubuntu10.04/isolinux/menu.cfg
EXTRA_DIST += tests/syslinux/ubuntu10.04/isolinux/stdmenu.cfg
EXTRA_DIST += tests/syslinux/ubuntu10.04/isolinux/dtmenu.cfg
EXTRA_DIST += tests/syslinux/ubuntu10.04/isolinux/po4a.cfg
EXTRA_DIST += tests/syslinux/ubuntu10.04/isolinux/rqtxt.cfg
EXTRA_DIST += tests/syslinux/ubuntu10.04_grub.cfg.in
+8 -10
View File
@@ -12,6 +12,14 @@
#define DISK_CACHE_STATS @DISK_CACHE_STATS@ #define DISK_CACHE_STATS @DISK_CACHE_STATS@
#define BOOT_TIME_STATS @BOOT_TIME_STATS@ #define BOOT_TIME_STATS @BOOT_TIME_STATS@
/* We don't need those. */
#define MINILZO_CFG_SKIP_LZO_PTR 1
#define MINILZO_CFG_SKIP_LZO_UTIL 1
#define MINILZO_CFG_SKIP_LZO_STRING 1
#define MINILZO_CFG_SKIP_LZO_INIT 1
#define MINILZO_CFG_SKIP_LZO1X_1_COMPRESS 1
#define MINILZO_CFG_SKIP_LZO1X_DECOMPRESS 1
#if defined (GRUB_BUILD) #if defined (GRUB_BUILD)
#undef ENABLE_NLS #undef ENABLE_NLS
#define BUILD_SIZEOF_LONG @BUILD_SIZEOF_LONG@ #define BUILD_SIZEOF_LONG @BUILD_SIZEOF_LONG@
@@ -31,10 +39,6 @@
#define HAVE_FONT_SOURCE @HAVE_FONT_SOURCE@ #define HAVE_FONT_SOURCE @HAVE_FONT_SOURCE@
/* Define if C symbols get an underscore after compilation. */ /* Define if C symbols get an underscore after compilation. */
#define HAVE_ASM_USCORE @HAVE_ASM_USCORE@ #define HAVE_ASM_USCORE @HAVE_ASM_USCORE@
/* Define it to \"addr32\" or \"addr32;\" to make GAS happy. */
#define ADDR32 @ADDR32@
/* Define it to \"data32\" or \"data32;\" to make GAS happy. */
#define DATA32 @DATA32@
/* Define it to one of __bss_start, edata and _edata. */ /* Define it to one of __bss_start, edata and _edata. */
#define BSS_START_SYMBOL @BSS_START_SYMBOL@ #define BSS_START_SYMBOL @BSS_START_SYMBOL@
/* Define it to either end or _end. */ /* Define it to either end or _end. */
@@ -51,12 +55,6 @@
#define PACKAGE_NAME "@PACKAGE_NAME@" #define PACKAGE_NAME "@PACKAGE_NAME@"
/* Define to the address where bug reports for this package should be sent. */ /* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT "@PACKAGE_BUGREPORT@" #define PACKAGE_BUGREPORT "@PACKAGE_BUGREPORT@"
/* Default boot directory name" */
#define GRUB_BOOT_DIR_NAME "@bootdirname@"
/* Default grub directory name */
#define GRUB_DIR_NAME "@grubdirname@"
/* Define to 1 if GCC generates calls to __register_frame_info(). */
#define NEED_REGISTER_FRAME_INFO @NEED_REGISTER_FRAME_INFO@
#define GRUB_TARGET_CPU "@GRUB_TARGET_CPU@" #define GRUB_TARGET_CPU "@GRUB_TARGET_CPU@"
#define GRUB_PLATFORM "@GRUB_PLATFORM@" #define GRUB_PLATFORM "@GRUB_PLATFORM@"
+275 -99
View File
@@ -26,20 +26,20 @@ dnl This is necessary because the target type in autoconf does not
dnl describe such a system very well. dnl describe such a system very well.
dnl dnl
dnl The current strategy is to use variables with no prefix (such as dnl The current strategy is to use variables with no prefix (such as
dnl CC, CFLAGS, etc.) for the host type as well as the build type, dnl CC, CFLAGS, etc.) for the host type, variables with prefix "BUILD_"
dnl because GRUB does not need to use those variables for the build dnl (such as BUILD_CC, BUILD_CFLAGS, etc.) for the build type and variables
dnl type, so there is no conflict. Variables with the prefix "TARGET_" dnl with the prefix "TARGET_" (such as TARGET_CC, TARGET_CFLAGS, etc.) are
dnl (such as TARGET_CC, TARGET_CFLAGS, etc.) are used for the target dnl used for the target type. See INSTALL for full list of variables.
dnl type.
AC_INIT([GRUB],[2.02~beta1],[bug-grub@gnu.org]) AC_INIT([GRUB],[2.02~beta2],[bug-grub@gnu.org])
AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_AUX_DIR([build-aux])
# We don't want -g -O2 by default in CFLAGS # We don't want -g -O2 by default in CFLAGS
: ${CFLAGS=""} : ${CFLAGS=""}
# Checks for host and target systems. # Checks for build, host and target systems.
AC_CANONICAL_BUILD
AC_CANONICAL_HOST AC_CANONICAL_HOST
save_program_prefix="${program_prefix}" save_program_prefix="${program_prefix}"
AC_CANONICAL_TARGET AC_CANONICAL_TARGET
@@ -78,30 +78,27 @@ fi
# Default HOST_CPPFLAGS # Default HOST_CPPFLAGS
HOST_CPPFLAGS="$HOST_CPPFLAGS -Wall -W" HOST_CPPFLAGS="$HOST_CPPFLAGS -Wall -W"
HOST_CPPFLAGS="$HOST_CPPFLAGS -I\$(top_builddir)/include"
HOST_CPPFLAGS="$HOST_CPPFLAGS -DGRUB_UTIL=1" HOST_CPPFLAGS="$HOST_CPPFLAGS -DGRUB_UTIL=1"
TARGET_CPPFLAGS="$TARGET_CPPFLAGS -Wall -W" TARGET_CPPFLAGS="$TARGET_CPPFLAGS -Wall -W"
TARGET_CPPFLAGS="$TARGET_CPPFLAGS -I\$(top_srcdir)/include"
TARGET_CPPFLAGS="$TARGET_CPPFLAGS -I\$(top_builddir)/include"
case "$target_cpu" in case "$target_cpu" in
i[[3456]]86) target_cpu=i386 ;; i[[3456]]86) target_cpu=i386 ;;
amd64) target_cpu=x86_64 ;; amd64) target_cpu=x86_64 ;;
sparc) target_cpu=sparc64 ;; sparc) target_cpu=sparc64 ;;
mipsel|mips64el) mipsel|mips64el)
target_cpu=mipsel; target_cpu=mipsel
machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_CPU_MIPSEL=1"; machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_CPU_MIPSEL=1"
;; ;;
mips|mips64) mips|mips64)
target_cpu=mips; target_cpu=mips
machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_CPU_MIPS=1"; machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_CPU_MIPS=1"
;; ;;
arm*) arm*)
target_cpu=arm; target_cpu=arm
;; ;;
aarch64*) aarch64*)
target_cpu=arm64; target_cpu=arm64
;; ;;
esac esac
@@ -125,7 +122,10 @@ 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 ;;
*) AC_MSG_ERROR([unsupported CPU: "$target_cpu"]) ;; *)
AC_MSG_WARN([unsupported CPU: "$target_cpu" - only building utilities])
platform=none
;;
esac esac
else else
platform="$with_platform" platform="$with_platform"
@@ -135,6 +135,7 @@ case "$target_cpu"-"$platform" in
x86_64-efi) ;; x86_64-efi) ;;
x86_64-emu) ;; x86_64-emu) ;;
x86_64-xen) ;; x86_64-xen) ;;
x86_64-none) ;;
x86_64-*) target_cpu=i386 ;; x86_64-*) target_cpu=i386 ;;
powerpc64-ieee1275) target_cpu=powerpc ;; powerpc64-ieee1275) target_cpu=powerpc ;;
esac esac
@@ -167,6 +168,7 @@ case "$target_cpu"-"$platform" in
arm-efi) ;; arm-efi) ;;
arm64-efi) ;; arm64-efi) ;;
*-emu) ;; *-emu) ;;
*-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"]) ;;
esac esac
@@ -178,7 +180,7 @@ if test x$platform != xemu ; then
fi fi
if test x"$target_cpu-$platform" = xsparc64-emu ; then if test x"$target_cpu-$platform" = xsparc64-emu ; then
target_m64=1 ; target_m64=1
fi fi
case "$target_os" in case "$target_os" in
@@ -214,20 +216,14 @@ case "$platform" in
qemu) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_QEMU=1" ;; qemu) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_QEMU=1" ;;
pc) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_PCBIOS=1" ;; pc) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_PCBIOS=1" ;;
emu) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_EMU=1" ;; emu) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_EMU=1" ;;
loongson) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MIPS_LOONGSON=1 -DGRUB_MACHINE_MIPS_BONITO=1" ;; loongson) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MIPS_LOONGSON=1" ;;
qemu_mips) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MIPS_QEMU_MIPS=1 -DGRUB_MACHINE_MIPS_BONITO=1" ;; qemu_mips) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MIPS_QEMU_MIPS=1" ;;
arc) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_ARC=1" ;; arc) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_ARC=1" ;;
esac esac
case "$target_cpu" in
arm) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_ARM=1" ;;
arm64) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_ARM64=1" ;;
mips |mipsel) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MIPS=1" ;;
sparc64) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_SPARC64=1" ;;
esac
if test x${target_cpu} = xmipsel ; then if test x${target_cpu} = xmipsel ; then
machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE=`echo mips_$platform | sed y,abcdefghijklmnopqrstuvwxyz,ABCDEFGHIJKLMNOPQRSTUVWXYZ,`" machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE=`echo mips_$platform | sed y,abcdefghijklmnopqrstuvwxyz,ABCDEFGHIJKLMNOPQRSTUVWXYZ,`"
else else
machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE=`echo ${target_cpu}_$platform | sed y,abcdefghijklmnopqrstuvwxyz,ABCDEFGHIJKLMNOPQRSTUVWXYZ,` -DGRUB_TARGET_CPU_`echo ${target_cpu} | sed y,abcdefghijklmnopqrstuvwxyz,ABCDEFGHIJKLMNOPQRSTUVWXYZ,`=1" machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE=`echo ${target_cpu}_$platform | sed y,abcdefghijklmnopqrstuvwxyz,ABCDEFGHIJKLMNOPQRSTUVWXYZ,`"
fi fi
case "${target_cpu}-$platform" in case "${target_cpu}-$platform" in
@@ -355,6 +351,9 @@ if test x"$target_cpu-$platform" = xsparc64-emu ; then
HOST_CFLAGS="$HOST_CFLAGS -m64" HOST_CFLAGS="$HOST_CFLAGS -m64"
fi fi
CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=64"
HOST_CPPFLAGS="$HOST_CPPFLAGS -D_FILE_OFFSET_BITS=64"
AC_C_BIGENDIAN AC_C_BIGENDIAN
AC_CHECK_SIZEOF(void *) AC_CHECK_SIZEOF(void *)
AC_CHECK_SIZEOF(long) AC_CHECK_SIZEOF(long)
@@ -367,6 +366,14 @@ case "$host_os" in
;; ;;
esac esac
case "$host_os" in
cygwin | windows* | mingw32* | aros*)
;;
*)
AC_CHECK_SIZEOF(off_t)
test x"$ac_cv_sizeof_off_t" = x8 || AC_MSG_ERROR([Large file support is required]);;
esac
if test x$USE_NLS = xno; then if test x$USE_NLS = xno; then
HOST_CFLAGS="$HOST_CFLAGS -fno-builtin-gettext" HOST_CFLAGS="$HOST_CFLAGS -fno-builtin-gettext"
fi fi
@@ -429,11 +436,21 @@ case "$build_os" in
haiku*) BUILD_LIBM= ;; haiku*) BUILD_LIBM= ;;
*) BUILD_LIBM=-lm ;; *) BUILD_LIBM=-lm ;;
esac esac
dnl FIXME proper test seems to require too deep dive into Autoconf internals.
dnl For now just list known platforms that we support.
case "$build_os" in
cygwin*|mingw32*|mingw64*) BUILD_EXEEXT=.exe ;;
*) BUILD_EXEEXT= ;;
esac
AC_SUBST(BUILD_EXEEXT)
# For gnulib. # For gnulib.
gl_INIT gl_INIT
WARN_FLAGS="-Wall -W -Wshadow -Wpointer-arith -Wundef -Wchar-subscripts -Wcomment -Wdeprecated-declarations -Wdisabled-optimization -Wdiv-by-zero -Wfloat-equal -Wformat-extra-args -Wformat-security -Wformat-y2k -Wimplicit -Wimplicit-function-declaration -Wimplicit-int -Wmain -Wmissing-braces -Wmissing-format-attribute -Wmultichar -Wparentheses -Wpointer-arith -Wreturn-type -Wsequence-point -Wshadow -Wsign-compare -Wswitch -Wtrigraphs -Wundef -Wunknown-pragmas -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value -Wunused-variable -Wwrite-strings -Wnested-externs -Wstrict-prototypes" WARN_FLAGS="-Wall -W -Wshadow -Wpointer-arith -Wundef -Wchar-subscripts -Wcomment -Wdeprecated-declarations -Wdisabled-optimization -Wdiv-by-zero -Wfloat-equal -Wformat-extra-args -Wformat-security -Wformat-y2k -Wimplicit -Wimplicit-function-declaration -Wimplicit-int -Wmain -Wmissing-braces -Wmissing-format-attribute -Wmultichar -Wparentheses -Wreturn-type -Wsequence-point -Wshadow -Wsign-compare -Wswitch -Wtrigraphs -Wunknown-pragmas -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value -Wunused-variable -Wwrite-strings -Wnested-externs -Wstrict-prototypes"
EXTRA_WARN_FLAGS="-Wextra -Wattributes -Wendif-labels -Winit-self -Wint-to-pointer-cast -Winvalid-pch -Wmissing-field-initializers -Wnonnull -Woverflow -Wvla -Wpointer-to-int-cast -Wstrict-aliasing -Wvariadic-macros -Wvolatile-register-var -Wpointer-sign" EXTRA_WARN_FLAGS="-Wextra -Wattributes -Wendif-labels -Winit-self -Wint-to-pointer-cast -Winvalid-pch -Wmissing-field-initializers -Wnonnull -Woverflow -Wvla -Wpointer-to-int-cast -Wstrict-aliasing -Wvariadic-macros -Wvolatile-register-var -Wpointer-sign -Wmissing-include-dirs -Wmissing-prototypes -Wmissing-declarations -Wformat=2"
HOST_CFLAGS="$HOST_CFLAGS $WARN_FLAGS -Wcast-align" HOST_CFLAGS="$HOST_CFLAGS $WARN_FLAGS -Wcast-align"
@@ -483,6 +500,7 @@ AC_SUBST(HOST_CC)
AC_SUBST(BUILD_CC) AC_SUBST(BUILD_CC)
AC_SUBST(BUILD_CFLAGS) AC_SUBST(BUILD_CFLAGS)
AC_SUBST(BUILD_CPPFLAGS) AC_SUBST(BUILD_CPPFLAGS)
AC_SUBST(BUILD_LDFLAGS)
AC_SUBST(TARGET_CC) AC_SUBST(TARGET_CC)
AC_SUBST(TARGET_NM) AC_SUBST(TARGET_NM)
AC_SUBST(TARGET_RANLIB) AC_SUBST(TARGET_RANLIB)
@@ -509,6 +527,8 @@ if test "x$target_cpu" != xi386 && test "x$target_cpu" != xx86_64; then
TARGET_CFLAGS="$TARGET_CFLAGS -Wcast-align" TARGET_CFLAGS="$TARGET_CFLAGS -Wcast-align"
fi fi
TARGET_CC_VERSION="$(LC_ALL=C $TARGET_CC --version | head -n1)"
AC_CACHE_CHECK([which extra warnings work], [grub_cv_target_cc_w_extra_flags], [ AC_CACHE_CHECK([which extra warnings work], [grub_cv_target_cc_w_extra_flags], [
LDFLAGS="$TARGET_LDFLAGS -nostdlib -static" LDFLAGS="$TARGET_LDFLAGS -nostdlib -static"
@@ -529,7 +549,7 @@ int main (void);
TARGET_CFLAGS="$TARGET_CFLAGS $grub_cv_target_cc_w_extra_flags" TARGET_CFLAGS="$TARGET_CFLAGS $grub_cv_target_cc_w_extra_flags"
AC_CACHE_CHECK([if compiling with clang], [grub_cv_cc_target_clang] AC_CACHE_CHECK([if compiling with clang], [grub_cv_cc_target_clang],
[ [
CFLAGS="$TARGET_CFLAGS" CFLAGS="$TARGET_CFLAGS"
AC_COMPILE_IFELSE( AC_COMPILE_IFELSE(
@@ -540,35 +560,42 @@ AC_COMPILE_IFELSE(
]])], ]])],
[grub_cv_cc_target_clang=no], [grub_cv_cc_target_clang=yes])]) [grub_cv_cc_target_clang=no], [grub_cv_cc_target_clang=yes])])
# on x86 clang doesn't support .code16 AC_CACHE_CHECK([for options to compile assembly], [grub_cv_cc_target_asm_compile], [
# on arm clang doesn't support .arch directive test_program=
# on mips clang doesn't support privilegied instructions, doubleword store/load case "x$target_cpu-$platform" in
# and crashes with hand-written assembly xmips-* | xmipsel-*)
if test "x$grub_cv_cc_target_clang" = xyes && ( test "x$target_cpu" = xi386 \ test_program=mips
|| test "x$target_cpu" = xx86_64 || test "x$target_cpu" = xarm \ ;;
|| test "x$target_cpu" = xmips || test "x$target_cpu" = xmipsel ); then xi386-pc)
TARGET_CCASFLAGS="$TARGET_CCASFLAGS -no-integrated-as" test_program=i386-pc
;;
xi386-* | xx86_64-*)
test_program=i386
;;
xpowerpc-* | xsparc64-* | xarm-*)
test_program=$target_cpu
;;
esac
if test x"$test_program" = x ; then
grub_cv_cc_target_asm_compile=
else
found=no
for arg in "" "-no-integrated-as"; do
cmdline="$TARGET_CC -c -o /dev/null $TARGET_CCASFLAGS $arg $TARGET_CPPFLAGS $srcdir/asm-tests/$test_program.S"
echo "Running $cmdline" >&AS_MESSAGE_LOG_FD
if $cmdline >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD; then
grub_cv_cc_target_asm_compile="$arg"
found=yes
break
fi fi
done
if test x"$found" = xno ; then
AC_MSG_ERROR([could not compile assembly])
fi
fi
])
if test "x$grub_cv_cc_target_clang" = xyes && test "x$target_cpu" = xpowerpc; then TARGET_CCASFLAGS="$TARGET_CCASFLAGS $grub_cv_cc_target_asm_compile"
AC_CACHE_CHECK([if clang can handle ame instruction], [grub_cv_cc_target_clang_ame]
[
CFLAGS="$TARGET_CFLAGS"
AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM([], [[
unsigned int a = 0, b = 0;
asm volatile ("{ame|addme} %0,%1" : "=r" (a) : "r" (b));
if (a)
return 1;
]])],
[grub_cv_cc_target_clang_ame=yes], [grub_cv_cc_target_clang_ame=no])])
# clang <= 3.3 doesn't handle most of ppc assembly, not even inline assembly
# used by gcrypt
if test x$grub_cv_cc_target_clang_ame = xno ; then
TARGET_CCASFLAGS="$TARGET_CCASFLAGS -no-integrated-as"
TARGET_CFLAGS="$TARGET_CFLAGS -no-integrated-as"
fi
fi
if test "x$target_cpu" = xi386 && test "x$platform" != xemu; then if test "x$target_cpu" = xi386 && test "x$platform" != xemu; then
TARGET_CFLAGS="$TARGET_CFLAGS -march=i386" TARGET_CFLAGS="$TARGET_CFLAGS -march=i386"
@@ -651,6 +678,109 @@ if ( test "x$target_cpu" = xi386 || test "x$target_cpu" = xx86_64 ) && test "x$p
TARGET_CFLAGS="$TARGET_CFLAGS -mno-mmx -mno-sse -mno-sse2 -mno-3dnow" TARGET_CFLAGS="$TARGET_CFLAGS -mno-mmx -mno-sse -mno-sse2 -mno-3dnow"
fi fi
# GRUB doesn't use float or doubles at all. Yet some toolchains may decide
# that floats are a good fit to run instead of what's written in the code.
# Given that floating point unit is disabled (if present to begin with)
# when GRUB is running which may result in various hard crashes.
if test x"$platform" != xemu ; then
AC_CACHE_CHECK([for options to get soft-float], grub_cv_target_cc_soft_float, [
grub_cv_target_cc_soft_float=no
if test "x$target_cpu" = xarm64; then
CFLAGS="$TARGET_CFLAGS -march=armv8-a+nofp+nosimd -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
[grub_cv_target_cc_soft_float="-march=armv8-a+nofp+nosimd"], [])
fi
if test "x$target_cpu" = xia64; then
CFLAGS="$TARGET_CFLAGS -mno-inline-float-divide -mno-inline-sqrt -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
[grub_cv_target_cc_soft_float="-mno-inline-float-divide -mno-inline-sqrt"], [])
fi
for cand in "-msoft-float -Xclang -msoft-float -Xclang -no-implicit-float" \
"-Xclang -msoft-float -Xclang -no-implicit-float" \
"-Xclang -msoft-float" "-msoft-float"; do
if test x"$grub_cv_target_cc_soft_float" != xno ; then
break
fi
CFLAGS="$TARGET_CFLAGS $cand -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
[grub_cv_target_cc_soft_float="$cand"], [])
done
])
if test x"$grub_cv_target_cc_soft_float" = xno ; then
AC_MSG_ERROR([could not force soft-float])
fi
case x"$grub_cv_target_cc_soft_float" in
x*"-Xclang"*)
# A trick so that clang doesn't see it on link stаge
TARGET_CPPFLAGS="$TARGET_CPPFLAGS $grub_cv_target_cc_soft_float"
;;
*)
TARGET_CFLAGS="$TARGET_CFLAGS $grub_cv_target_cc_soft_float"
;;
esac
case x"$grub_cv_target_cc_soft_float" in
x"-march=armv8-a+nofp+nosimd")
# +nosimd disables also the cache opcodes that we need in asm.
TARGET_CCASFLAGS="$TARGET_CCASFLAGS -march=armv8-a+nofp"
;;
*)
TARGET_CCASFLAGS="$TARGET_CCASFLAGS $grub_cv_target_cc_soft_float"
;;
esac
fi
if test x"$target_cpu" = xsparc64 ; then
AC_CACHE_CHECK([for options to reserve application registers], grub_cv_target_cc_mno_app_regs, [
grub_cv_target_cc_mno_app_regs=no
for cand in "-mllvm -sparc-reserve-app-registers" \
"-mno-app-regs"; do
if test x"$grub_cv_target_cc_mno_app_regs" != xno ; then
break
fi
CFLAGS="$TARGET_CFLAGS $cand -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
[grub_cv_target_cc_mno_app_regs="$cand"], [])
done
])
if test x"$grub_cv_target_cc_mno_app_regs" = xno ; then
AC_MSG_ERROR([could not reserve application registers])
fi
if test x"$grub_cv_target_cc_mno_app_regs" = x"-mllvm -sparc-reserve-app-registers" ; then
# A trick so that clang doesn't see it on link stаge
TARGET_CPPFLAGS="$TARGET_CPPFLAGS $grub_cv_target_cc_mno_app_regs"
else
TARGET_CFLAGS="$TARGET_CFLAGS $grub_cv_target_cc_mno_app_regs"
fi
AC_CACHE_CHECK([for no-relax options], grub_cv_target_cc_mno_relax, [
grub_cv_target_cc_mno_relax=no
for cand in "-mno-relax" "-Wl,--no-relax"; do
if test x"$grub_cv_target_cc_mno_relax" != xno ; then
break
fi
LDFLAGS="$TARGET_LDFLAGS $cand -nostdlib -static"
CFLAGS="$TARGET_CFLAGS -Werror"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
asm (".globl start; start:");
void __main (void);
void __main (void) {}
int main (void);
]], [[]])], [grub_cv_target_cc_mno_relax="$cand"], [])
done
])
LDFLAGS="$TARGET_LDFLAGS"
CFLAGS="$TARGET_CFLAGS"
if test x"$grub_cv_target_cc_mno_relax" = xno ; then
AC_MSG_ERROR([could not find no-relax options])
fi
TARGET_LDFLAGS="$TARGET_LDFLAGS $grub_cv_target_cc_mno_relax"
fi
# By default, GCC 4.4 generates .eh_frame sections containing unwind # By default, GCC 4.4 generates .eh_frame sections containing unwind
# information in some cases where it previously did not. GRUB doesn't need # information in some cases where it previously did not. GRUB doesn't need
# these and they just use up vital space. Restore the old compiler # these and they just use up vital space. Restore the old compiler
@@ -735,7 +865,7 @@ if test x"$efiemu_excuse" = x ; then
]], [[]])], [flag=1], [flag=0]) ]], [[]])], [flag=1], [flag=0])
if test x"$flag" = x1; then if test x"$flag" = x1; then
grub_cv_target_cc_efiemu64_link_format="$format" grub_cv_target_cc_efiemu64_link_format="$format"
break; break
fi fi
done]) done])
if test x"$grub_cv_target_cc_efiemu64_link_format" = xunknown; then if test x"$grub_cv_target_cc_efiemu64_link_format" = xunknown; then
@@ -745,7 +875,7 @@ if test x"$efiemu_excuse" = x ; then
fi fi
fi fi
if test x"$enable_efiemu" = xyes && test x"$efiemu_excuse" != x ; then if test x"$enable_efiemu" = xyes && test x"$efiemu_excuse" != x ; then
AC_MSG_ERROR([efiemu runtime was explicitly requested but can't be compiled]) AC_MSG_ERROR([efiemu runtime was explicitly requested but can't be compiled ($efiemu_excuse)])
fi fi
if test x"$efiemu_excuse" = x ; then if test x"$efiemu_excuse" = x ; then
enable_efiemu=yes enable_efiemu=yes
@@ -757,14 +887,35 @@ AC_SUBST([EFIEMU64_LINK_FORMAT])
CFLAGS="$TARGET_CFLAGS" CFLAGS="$TARGET_CFLAGS"
if test x"$target_cpu" = xi386 || test x"$target_cpu" = xx86_64; then
if test x"$platform" = xemu ; then
TARGET_OBJ2ELF=
grub_cv_target_cc_link_format=
case "$host_os" in
*darwin* | *mac*)
grub_cv_target_cc_link_format="-arch,${target_cpu}"
TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,$grub_cv_target_cc_link_format"
;;
*windows* | *cygwin* | *mingw*)
if test x${target_cpu} = xi386 ; then
grub_cv_target_cc_link_format=-mi386pe
TARGET_OBJ2ELF='./build-grub-pe2elf$(BUILD_EXEEXT)'
fi
if test x${target_cpu} = xx86_64 ; then
grub_cv_target_cc_link_format=-mi386pep
TARGET_OBJ2ELF='./build-grub-pep2elf$(BUILD_EXEEXT)'
fi
TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,$grub_cv_target_cc_link_format"
;;
esac
elif test x"$target_cpu" = xi386 || test x"$target_cpu" = xx86_64; then
AC_CACHE_CHECK([for target linking format], [grub_cv_target_cc_link_format], [ AC_CACHE_CHECK([for target linking format], [grub_cv_target_cc_link_format], [
grub_cv_target_cc_link_format=unknown grub_cv_target_cc_link_format=unknown
for format in -melf_${target_cpu} -melf_${target_cpu}_fbsd -melf_${target_cpu}_obsd -melf_${target_cpu}_haiku -mi386pe -mi386pep -arch,${target_cpu}; do for format in -melf_${target_cpu} -melf_${target_cpu}_fbsd -melf_${target_cpu}_obsd -melf_${target_cpu}_haiku -mi386pe -mi386pep -arch,${target_cpu}; do
if test x${target_cpu} != xi386 && test x$format = xi386pe; then if test x${target_cpu} != xi386 && test x$format = x-mi386pe; then
continue continue
fi fi
if test x${target_cpu} != xx86_64 && test x$format = xi386pep; then if test x${target_cpu} != xx86_64 && test x$format = x-mi386pep; then
continue continue
fi fi
CFLAGS="$TARGET_CFLAGS" CFLAGS="$TARGET_CFLAGS"
@@ -778,7 +929,7 @@ if test x"$target_cpu" = xi386 || test x"$target_cpu" = xx86_64; then
]], [[]])], [flag=1], [flag=0]) ]], [[]])], [flag=1], [flag=0])
if test x"$flag" = x1; then if test x"$flag" = x1; then
grub_cv_target_cc_link_format="$format" grub_cv_target_cc_link_format="$format"
break; break
fi fi
done]) done])
if test x"$grub_cv_target_cc_link_format" = xunknown; then if test x"$grub_cv_target_cc_link_format" = xunknown; then
@@ -786,10 +937,10 @@ if test x"$target_cpu" = xi386 || test x"$target_cpu" = xx86_64; then
fi fi
TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,$grub_cv_target_cc_link_format" TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,$grub_cv_target_cc_link_format"
if test x"$grub_cv_target_cc_link_format" = x-mi386pe ; then if test x"$grub_cv_target_cc_link_format" = x-mi386pe ; then
TARGET_OBJ2ELF='./build-grub-pe2elf'; TARGET_OBJ2ELF='./build-grub-pe2elf$(BUILD_EXEEXT)'
fi fi
if test x"$grub_cv_target_cc_link_format" = x-mi386pep ; then if test x"$grub_cv_target_cc_link_format" = x-mi386pep ; then
TARGET_OBJ2ELF='./build-grub-pep2elf'; TARGET_OBJ2ELF='./build-grub-pep2elf$(BUILD_EXEEXT)'
fi fi
fi fi
@@ -831,17 +982,17 @@ AC_SUBST(TARGET_LDFLAGS_OLDMAGIC)
LDFLAGS="$TARGET_LDFLAGS" LDFLAGS="$TARGET_LDFLAGS"
if test "$target_cpu" = x86_64 || test "$target_cpu-$platform" = sparc64-emu ; 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 -m64 -mcmodel=large" CFLAGS="$TARGET_CFLAGS -mcmodel=large"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
[grub_cv_cc_mcmodel=yes], [grub_cv_cc_mcmodel=yes],
[grub_cv_cc_mcmodel=no]) [grub_cv_cc_mcmodel=no])
]) ])
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-$platform" = sparc64-emu; then elif test "$target_cpu" = sparc64; then
TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=medany" TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=medany"
fi fi
fi fi
@@ -849,7 +1000,7 @@ fi
if test "$target_cpu"-"$platform" = x86_64-efi; then if test "$target_cpu"-"$platform" = x86_64-efi; then
# EFI writes to stack below %rsp, we must not use the red zone # EFI writes to stack below %rsp, we must not use the red zone
AC_CACHE_CHECK([whether option -mno-red-zone works], grub_cv_cc_no_red_zone, [ AC_CACHE_CHECK([whether option -mno-red-zone works], grub_cv_cc_no_red_zone, [
CFLAGS="$TARGET_CFLAGS -m64 -mno-red-zone" CFLAGS="$TARGET_CFLAGS -mno-red-zone"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
[grub_cv_cc_no_red_zone=yes], [grub_cv_cc_no_red_zone=yes],
[grub_cv_cc_no_red_zone=no]) [grub_cv_cc_no_red_zone=no])
@@ -879,21 +1030,19 @@ if test "x$target_cpu" = xarm; then
]) ])
if test "x$grub_cv_cc_mthumb_interwork" = xyes; then if test "x$grub_cv_cc_mthumb_interwork" = xyes; then
TARGET_CFLAGS="$TARGET_CFLAGS -mthumb-interwork" TARGET_CFLAGS="$TARGET_CFLAGS -mthumb-interwork"
# Clang defaults to thumb interworking
elif test "x$grub_cv_cc_target_clang" = xno ; then elif test "x$grub_cv_cc_target_clang" = xno ; then
AC_MSG_ERROR([your compiler doesn't support -mthumb-interwork]) AC_MSG_ERROR([your compiler doesn't support -mthumb-interwork])
else
CFLAGS="$TARGET_CFLAGS"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
#if defined (__thumb__) && !defined (__thumb2__)
#error thumb without interworking
#endif
]])],
[no_interwork_ok=yes],
[no_interwork_ok=no])
if test x$no_interwork_ok = xno ; then
AC_MSG_ERROR([attempt to compile to thumb with no thumb interwork])
fi fi
fi fi
AC_CACHE_CHECK([whether option -Qn works], grub_cv_target_cc_qn, [
CFLAGS="$TARGET_CFLAGS -Qn -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
[grub_cv_target_cc_qn=yes],
[grub_cv_target_cc_qn=no])])
if test "x$grub_cv_target_cc_qn" = xyes; then
TARGET_CFLAGS="$TARGET_CFLAGS -Qn"
fi fi
# #
@@ -958,7 +1107,7 @@ if test "$target_cpu" = arm; then
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [flag=1], [flag=0]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [flag=1], [flag=0])
if test x"$flag" = x1; then if test x"$flag" = x1; then
grub_cv_target_cc_strict_align="$arg" grub_cv_target_cc_strict_align="$arg"
break; break
fi fi
done]) done])
@@ -1031,8 +1180,6 @@ if test "x$target_cpu" = xi386; then
grub_CHECK_END_SYMBOL grub_CHECK_END_SYMBOL
fi fi
CFLAGS="$TARGET_CFLAGS" CFLAGS="$TARGET_CFLAGS"
grub_I386_ASM_PREFIX_REQUIREMENT
grub_I386_ASM_ADDR32
fi fi
grub_PROG_NM_WORKS grub_PROG_NM_WORKS
@@ -1144,7 +1291,7 @@ AC_CHECK_LIB([usb], [usb_claim_interface], [LIBUSB="-lusb"],
[grub_emu_usb_excuse=["need libusb headers"]]) [grub_emu_usb_excuse=["need libusb headers"]])
[fi] [fi]
if test x"$enable_grub_emu_usb" = xyes && test x"$grub_emu_usb_excuse" != x ; then if test x"$enable_grub_emu_usb" = xyes && test x"$grub_emu_usb_excuse" != x ; then
AC_MSG_ERROR([USB support for grub-emu was explicitly requested but can't be compiled]) AC_MSG_ERROR([USB support for grub-emu was explicitly requested but can't be compiled ($grub_emu_usb_excuse)])
fi fi
if test x"$grub_emu_usb_excuse" = x ; then if test x"$grub_emu_usb_excuse" = x ; then
enable_grub_emu_usb=yes enable_grub_emu_usb=yes
@@ -1153,7 +1300,7 @@ enable_grub_emu_usb=no
fi fi
if test x"$enable_grub_emu_sdl" = xno ; then if test x"$enable_grub_emu_sdl" = xno ; then
grub_emu_sdl_excuse="explicitely disabled" grub_emu_sdl_excuse="explicitly disabled"
fi fi
[if [ x"$grub_emu_sdl_excuse" = x ]; then [if [ x"$grub_emu_sdl_excuse" = x ]; then
# Check for libSDL libraries.] # Check for libSDL libraries.]
@@ -1169,7 +1316,7 @@ AC_CHECK_LIB([SDL], [SDL_Init], [LIBSDL="-lSDL"],
[fi] [fi]
if test x"enable_grub_emu_sdl" = xyes && test x"$grub_emu_sdl_excuse" != x ; then if test x"enable_grub_emu_sdl" = xyes && test x"$grub_emu_sdl_excuse" != x ; then
AC_MSG_ERROR([SDL support for grub-emu was explicitely requested but can't be compiled]) AC_MSG_ERROR([SDL support for grub-emu was explicitly requested but can't be compiled ($grub_emu_sdl_excuse)])
fi fi
if test x"$grub_emu_sdl_excuse" = x ; then if test x"$grub_emu_sdl_excuse" = x ; then
enable_grub_emu_sdl=yes enable_grub_emu_sdl=yes
@@ -1249,7 +1396,7 @@ if test x"$grub_mkfont_excuse" = x ; then
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
AC_MSG_ERROR([grub-mkfont was explicitly requested but can't be compiled]) AC_MSG_ERROR([grub-mkfont was explicitly requested but can't be compiled ($grub_mkfont_excuse)])
fi fi
if test x"$grub_mkfont_excuse" = x ; then if test x"$grub_mkfont_excuse" = x ; then
enable_grub_mkfont=yes enable_grub_mkfont=yes
@@ -1264,10 +1411,12 @@ SAVED_CC="$CC"
SAVED_CPP="$CPP" SAVED_CPP="$CPP"
SAVED_CFLAGS="$CFLAGS" SAVED_CFLAGS="$CFLAGS"
SAVED_CPPFLAGS="$CPPFLAGS" SAVED_CPPFLAGS="$CPPFLAGS"
SAVED_LDFLAGS="$LDFLAGS"
CC="$BUILD_CC" CC="$BUILD_CC"
CPP="$BUILD_CPP" CPP="$BUILD_CPP"
CFLAGS="$BUILD_CFLAGS" CFLAGS="$BUILD_CFLAGS"
CPPFLAGS="$BUILD_CPPFLAGS" CPPFLAGS="$BUILD_CPPFLAGS"
LDFLAGS="$BUILD_LDFAGS"
unset ac_cv_c_bigendian unset ac_cv_c_bigendian
unset ac_cv_header_ft2build_h unset ac_cv_header_ft2build_h
@@ -1308,7 +1457,7 @@ if test x"$grub_build_mkfont_excuse" = x ; then
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
AC_MSG_ERROR([build-grub-mkfont was explicitly requested but can't be compiled]) AC_MSG_ERROR([build-grub-mkfont was explicitly requested but can't be compiled ($grub_build_mkfont_excuse)])
fi fi
if test x"$grub_build_mkfont_excuse" = x ; then if test x"$grub_build_mkfont_excuse" = x ; then
enable_build_grub_mkfont=yes enable_build_grub_mkfont=yes
@@ -1316,7 +1465,11 @@ else
enable_build_grub_mkfont=no enable_build_grub_mkfont=no
fi fi
if test x"$enable_build_grub_mkfont" = xno && ( test "x$platform" = xqemu || test "x$platform" = xloongson || test "x$platform" = xqemu_mips || test "x$target_cpu"-"$platform" = xpowerpc-ieee1275 || test "x$platform" = xcoreboot ); then if test x"$enable_build_grub_mkfont" = xno && ( test "x$platform" = xqemu || test "x$platform" = xloongson || test "x$platform" = xqemu_mips || test "x$target_cpu"-"$platform" = xpowerpc-ieee1275 || test "x$platform" = xcoreboot ); then
if test x"$grub_build_mkfont_excuse" = x ; then
AC_MSG_ERROR([qemu, powerpc-ieee1275, coreboot and loongson ports needs build-time grub-mkfont]) AC_MSG_ERROR([qemu, powerpc-ieee1275, coreboot and loongson ports needs build-time grub-mkfont])
else
AC_MSG_ERROR([qemu, powerpc-ieee1275, coreboot and loongson ports needs build-time grub-mkfont ($grub_build_mkfont_excuse)])
fi
fi fi
AC_SUBST([build_freetype_cflags]) AC_SUBST([build_freetype_cflags])
@@ -1326,6 +1479,7 @@ CC="$SAVED_CC"
CPP="$SAVED_CPP" CPP="$SAVED_CPP"
CFLAGS="$SAVED_CFLAGS" CFLAGS="$SAVED_CFLAGS"
CPPFLAGS="$SAVED_CPPFLAGS" CPPFLAGS="$SAVED_CPPFLAGS"
LDFLAGS="$SAVED_LDFLAGS"
DJVU_FONT_SOURCE= DJVU_FONT_SOURCE=
@@ -1345,7 +1499,7 @@ fi
if test x"$starfield_excuse" = x; then if test x"$starfield_excuse" = x; then
for ext in pcf pcf.gz bdf bdf.gz ttf ttf.gz; do for ext in pcf pcf.gz bdf bdf.gz ttf ttf.gz; do
for dir in . /usr/src /usr/share/fonts/X11/misc /usr/share/fonts/truetype/ttf-dejavu /usr/share/fonts/dejavu; do for dir in . /usr/src /usr/share/fonts/X11/misc /usr/share/fonts/truetype/ttf-dejavu /usr/share/fonts/dejavu /usr/share/fonts/truetype; do
if test -f "$dir/DejaVuSans.$ext"; then if test -f "$dir/DejaVuSans.$ext"; then
DJVU_FONT_SOURCE="$dir/DejaVuSans.$ext" DJVU_FONT_SOURCE="$dir/DejaVuSans.$ext"
break 2 break 2
@@ -1359,7 +1513,7 @@ if test x"$starfield_excuse" = x; then
fi fi
if test x"$enable_grub_themes" = xyes && test x"$starfield_excuse" != x; then if test x"$enable_grub_themes" = xyes && test x"$starfield_excuse" != x; then
AC_MSG_ERROR([themes were explicitly requested but requirements are not satisfied]) AC_MSG_ERROR([themes were explicitly requested but requirements are not satisfied ($starfield_excuse)])
fi fi
AC_SUBST([DJVU_FONT_SOURCE]) AC_SUBST([DJVU_FONT_SOURCE])
@@ -1372,7 +1526,7 @@ for ext in pcf pcf.gz bdf bdf.gz ttf ttf.gz; do
md5="$(md5sum "$dir/unifont.$ext"|awk '{ print $1; }')" md5="$(md5sum "$dir/unifont.$ext"|awk '{ print $1; }')"
# PCF and BDF from version 6.3 isn't hanled properly by libfreetype. # PCF and BDF from version 6.3 isn't hanled properly by libfreetype.
if test "$md5" = 0a54834d2788c83886a3e1785a6a1e61 || test "$md5" = 28f2565c7a41d8d407e2551159385edb || test "$md5" = dae5e588461b3b92b87b6ffee734f936 || test "$md5" = 4a3d687aa5bb329ed05f4263a1016791 ; then if test "$md5" = 0a54834d2788c83886a3e1785a6a1e61 || test "$md5" = 28f2565c7a41d8d407e2551159385edb || test "$md5" = dae5e588461b3b92b87b6ffee734f936 || test "$md5" = 4a3d687aa5bb329ed05f4263a1016791 ; then
continue; continue
fi fi
FONT_SOURCE="$dir/unifont.$ext" FONT_SOURCE="$dir/unifont.$ext"
break 2 break 2
@@ -1385,7 +1539,11 @@ if test x"$enable_build_grub_mkfont" = xno ; then
fi fi
if test "x$FONT_SOURCE" = x && ( test "x$platform" = xqemu || test "x$platform" = xloongson || test "x$platform" = xqemu_mips || test "x$target_cpu"-"$platform" = xpowerpc-ieee1275 || test "x$platform" = xcoreboot ); then if test "x$FONT_SOURCE" = x && ( test "x$platform" = xqemu || test "x$platform" = xloongson || test "x$platform" = xqemu_mips || test "x$target_cpu"-"$platform" = xpowerpc-ieee1275 || test "x$platform" = xcoreboot ); then
if test x"$grub_build_mkfont_excuse" = x ; then
AC_MSG_ERROR([qemu, powerpc-ieee1275, coreboot and loongson ports need unifont]) AC_MSG_ERROR([qemu, powerpc-ieee1275, coreboot and loongson ports need unifont])
else
AC_MSG_ERROR([qemu, powerpc-ieee1275, coreboot and loongson ports need unifont ($grub_build_mkfont_excuse)])
fi
fi fi
AC_SUBST([FONT_SOURCE]) AC_SUBST([FONT_SOURCE])
@@ -1410,14 +1568,14 @@ fi
if test x"$grub_mount_excuse" = x ; then if test x"$grub_mount_excuse" = x ; then
# Check for fuse headers. # Check for fuse headers.
SAVED_CPPFLAGS="$CPPFLAGS" SAVED_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=64 -DFUSE_USE_VERSION=26" CPPFLAGS="$CPPFLAGS -DFUSE_USE_VERSION=26"
AC_CHECK_HEADERS([fuse/fuse.h], [], AC_CHECK_HEADERS([fuse/fuse.h], [],
[grub_mount_excuse=["need FUSE headers"]]) [grub_mount_excuse=["need FUSE headers"]])
CPPFLAGS="$SAVED_CPPFLAGS" CPPFLAGS="$SAVED_CPPFLAGS"
fi fi
if test x"$enable_grub_mount" = xyes && test x"$grub_mount_excuse" != x ; then if test x"$enable_grub_mount" = xyes && test x"$grub_mount_excuse" != x ; then
AC_MSG_ERROR([grub-mount was explicitly requested but can't be compiled]) AC_MSG_ERROR([grub-mount was explicitly requested but can't be compiled ($grub_mount_excuse)])
fi fi
if test x"$grub_mount_excuse" = x ; then if test x"$grub_mount_excuse" = x ; then
enable_grub_mount=yes enable_grub_mount=yes
@@ -1453,7 +1611,7 @@ if test x"$device_mapper_excuse" = x ; then
fi fi
if test x"$device_mapper_excuse" = x ; then if test x"$device_mapper_excuse" = x ; then
LIBDEVMAPPER="-ldevmapper"; LIBDEVMAPPER="-ldevmapper"
AC_DEFINE([HAVE_DEVICE_MAPPER], [1], AC_DEFINE([HAVE_DEVICE_MAPPER], [1],
[Define to 1 if you have the devmapper library.]) [Define to 1 if you have the devmapper library.])
fi fi
@@ -1485,7 +1643,7 @@ AC_CHECK_HEADER([lzma.h], [], [liblzma_excuse="need lzma header"])
fi fi
if test x"$enable_liblzma" = xyes && test x"$liblzma_excuse" != x ; then if test x"$enable_liblzma" = xyes && test x"$liblzma_excuse" != x ; then
AC_MSG_ERROR([liblzma support was explicitly requested but requirements are not satisfied]) AC_MSG_ERROR([liblzma support was explicitly requested but requirements are not satisfied ($liblzma_excuse)])
fi fi
@@ -1522,7 +1680,7 @@ if test x"$libzfs_excuse" = x ; then
fi fi
if test x"$enable_libzfs" = xyes && test x"$libzfs_excuse" != x ; then if test x"$enable_libzfs" = xyes && test x"$libzfs_excuse" != x ; then
AC_MSG_ERROR([libzfs support was explicitly requested but requirements are not satisfied]) AC_MSG_ERROR([libzfs support was explicitly requested but requirements are not satisfied ($libzfs_excuse)])
fi fi
if test x"$libzfs_excuse" = x ; then if test x"$libzfs_excuse" = x ; then
@@ -1545,13 +1703,10 @@ AS_IF([test x$target_cpu = xi386 -a x$platform = xqemu],
[AC_SUBST([GRUB_BOOT_MACHINE_LINK_ADDR], 0xffe00)]) [AC_SUBST([GRUB_BOOT_MACHINE_LINK_ADDR], 0xffe00)])
AC_SUBST(HAVE_ASM_USCORE) AC_SUBST(HAVE_ASM_USCORE)
AC_SUBST(ADDR32)
AC_SUBST(DATA32)
AC_SUBST(BSS_START_SYMBOL) AC_SUBST(BSS_START_SYMBOL)
AC_SUBST(END_SYMBOL) AC_SUBST(END_SYMBOL)
AC_SUBST(PACKAGE) AC_SUBST(PACKAGE)
AC_SUBST(VERSION) AC_SUBST(VERSION)
AC_SUBST(NEED_REGISTER_FRAME_INFO)
AC_ARG_ENABLE([werror], AC_ARG_ENABLE([werror],
[AS_HELP_STRING([--disable-werror], [AS_HELP_STRING([--disable-werror],
@@ -1570,6 +1725,12 @@ fi
TARGET_CPP="$TARGET_CC -E" TARGET_CPP="$TARGET_CC -E"
TARGET_CCAS=$TARGET_CC TARGET_CCAS=$TARGET_CC
# Includes which include make-time substitutions. They must come last
# as to avoid executing top_builddir in shell.
HOST_CPPFLAGS="$HOST_CPPFLAGS -I\$(top_builddir)/include"
TARGET_CPPFLAGS="$TARGET_CPPFLAGS -I\$(top_srcdir)/include"
TARGET_CPPFLAGS="$TARGET_CPPFLAGS -I\$(top_builddir)/include"
GRUB_TARGET_CPU="${target_cpu}" GRUB_TARGET_CPU="${target_cpu}"
GRUB_PLATFORM="${platform}" GRUB_PLATFORM="${platform}"
@@ -1583,6 +1744,7 @@ AC_SUBST(TARGET_CPP)
AC_SUBST(TARGET_CCAS) AC_SUBST(TARGET_CCAS)
AC_SUBST(TARGET_OBJ2ELF) AC_SUBST(TARGET_OBJ2ELF)
AC_SUBST(TARGET_MODULE_FORMAT) AC_SUBST(TARGET_MODULE_FORMAT)
AC_SUBST(TARGET_CC_VERSION)
AC_SUBST(TARGET_CFLAGS) AC_SUBST(TARGET_CFLAGS)
AC_SUBST(TARGET_LDFLAGS) AC_SUBST(TARGET_LDFLAGS)
@@ -1605,6 +1767,7 @@ AC_SUBST(BUILD_LIBM)
# Automake conditionals # Automake conditionals
# #
AM_CONDITIONAL([COND_real_platform], [test x$platform != xnone])
AM_CONDITIONAL([COND_emu], [test x$platform = xemu]) AM_CONDITIONAL([COND_emu], [test x$platform = xemu])
AM_CONDITIONAL([COND_clang], [test x$grub_cv_cc_target_clang = xyes]) AM_CONDITIONAL([COND_clang], [test x$grub_cv_cc_target_clang = xyes])
AM_CONDITIONAL([COND_i386_pc], [test x$target_cpu = xi386 -a x$platform = xpc]) AM_CONDITIONAL([COND_i386_pc], [test x$target_cpu = xi386 -a x$platform = xpc])
@@ -1632,7 +1795,13 @@ 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_HOST_HURD], [test x$host_kernel = xhurd])
AM_CONDITIONAL([COND_HOST_LINUX], [test x$host_kernel = xlinux])
AM_CONDITIONAL([COND_HOST_NETBSD], [test x$host_kernel = xnetbsd])
AM_CONDITIONAL([COND_HOST_WINDOWS], [test x$host_kernel = xwindows]) AM_CONDITIONAL([COND_HOST_WINDOWS], [test x$host_kernel = xwindows])
AM_CONDITIONAL([COND_HOST_KFREEBSD], [test x$host_kernel = xkfreebsd])
AM_CONDITIONAL([COND_HOST_XNU], [test x$host_kernel = xxnu])
AM_CONDITIONAL([COND_HOST_ILLUMOS], [test x$host_kernel = xillumos])
AM_CONDITIONAL([COND_MAN_PAGES], [test x$cross_compiling = xno -a x$HELP2MAN != x]) AM_CONDITIONAL([COND_MAN_PAGES], [test x$cross_compiling = xno -a x$HELP2MAN != x])
AM_CONDITIONAL([COND_GRUB_EMU_USB], [test x$enable_grub_emu_usb = xyes]) AM_CONDITIONAL([COND_GRUB_EMU_USB], [test x$enable_grub_emu_usb = xyes])
@@ -1672,6 +1841,7 @@ AC_DEFINE_UNQUOTED(GRUB_SYSCONFDIR, "$grub_sysconfdir", [Configuration dir])
# Output files. # Output files.
if test "$platform" != none; then
cpudir="${target_cpu}" cpudir="${target_cpu}"
if test x${cpudir} = xmipsel; then if test x${cpudir} = xmipsel; then
cpudir=mips; cpudir=mips;
@@ -1691,6 +1861,11 @@ else
cp -rp $srcdir/include/grub/$cpudir/$platform include/grub/machine 2>/dev/null cp -rp $srcdir/include/grub/$cpudir/$platform include/grub/machine 2>/dev/null
fi fi
fi fi
else
# Just enough to stop the compiler failing with -I$(srcdir)/include.
mkdir -p include 2>/dev/null
rm -rf include/grub/cpu include/grub/machine
fi
AC_CONFIG_FILES([Makefile]) AC_CONFIG_FILES([Makefile])
AC_CONFIG_FILES([grub-core/Makefile]) AC_CONFIG_FILES([grub-core/Makefile])
@@ -1762,6 +1937,7 @@ echo grub-mount: No "($grub_mount_excuse)"
fi fi
if [ x"$starfield_excuse" = x ]; then if [ x"$starfield_excuse" = x ]; then
echo starfield theme: Yes echo starfield theme: Yes
echo With DejaVuSans font from $DJVU_FONT_SOURCE
else else
echo starfield theme: No "($starfield_excuse)" echo starfield theme: No "($starfield_excuse)"
fi fi
+7 -7
View File
@@ -108,16 +108,16 @@ The branches available are:
@table @samp @table @samp
@item master @item master
Main developpement branch. Main development branch.
@item grub-legacy @item grub-legacy
GRUB 0.97 codebase. Kept for reference and legal reasons GRUB 0.97 codebase. Kept for reference and legal reasons
@item multiboot @item multiboot
Multiboot specfication Multiboot specfication
@item multiboot2 @item multiboot2
Multiboot2 specfication Multiboot2 specfication
@item developper branches @item developer branches
Prefixed with developper name. Every developper of a team manages his own branches. Prefixed with developer name. Every developer of a team manages his own branches.
Developper branches do not need changelog entries. Developer branches do not need changelog entries.
@end table @end table
Once you have used @kbd{git clone} to fetch an initial copy of a branch, you Once you have used @kbd{git clone} to fetch an initial copy of a branch, you
@@ -228,12 +228,12 @@ The opening @samp{/*} and closing @samp{*/} should be placed together on a line
Here is a brief map of the GRUB code base. Here is a brief map of the GRUB code base.
GRUB uses Autoconf and Automake, with most of the Automake input generated GRUB uses Autoconf and Automake, with most of the Automake input generated
by AutoGen. The top-level build rules are in @file{configure.ac}, by a Python script. The top-level build rules are in @file{configure.ac},
@file{grub-core/Makefile.core.def}, and @file{Makefile.util.def}. Each @file{grub-core/Makefile.core.def}, and @file{Makefile.util.def}. Each
block in a @file{*.def} file represents a build target, and specifies the block in a @file{*.def} file represents a build target, and specifies the
source files used to build it on various platforms. The @file{*.def} files source files used to build it on various platforms. The @file{*.def} files
are processed into AutoGen input by @file{gentpl.py} (which you only need to are processed into Automake input by @file{gentpl.py} (which you only need
look at if you are extending the build system). If you are adding a new to look at if you are extending the build system). If you are adding a new
module which follows an existing pattern, such as a new command or a new module which follows an existing pattern, such as a new command or a new
filesystem implementation, it is usually easiest to grep filesystem implementation, it is usually easiest to grep
@file{grub-core/Makefile.core.def} and @file{Makefile.util.def} for an @file{grub-core/Makefile.core.def} and @file{Makefile.util.def} for an
+1 -1
View File
@@ -6385,7 +6385,7 @@ just do:
@end group @end group
@end example @end example
Also, the latest version is available using Bazaar. See Also, the latest version is available using Git. See
@uref{http://www.gnu.org/software/grub/grub-download.html} for more @uref{http://www.gnu.org/software/grub/grub-download.html} for more
information. information.
+7 -1
View File
@@ -76,6 +76,12 @@ 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" ] GROUPS["fdt"] = [ "arm64_efi", "arm_uboot", "arm_efi" ]
# Needs software helpers for division
# Must match GRUB_DIVISION_IN_SOFTWARE in misc.h
GROUPS["softdiv"] = GROUPS["arm"] + ["ia64_efi"]
GROUPS["no_softdiv"] = GRUB_PLATFORMS[:]
for i in GROUPS["softdiv"]: GROUPS["no_softdiv"].remove(i)
# Miscelaneous groups schedulded to disappear in future # Miscelaneous groups schedulded to disappear in future
GROUPS["i386_coreboot_multiboot_qemu"] = ["i386_coreboot", "i386_multiboot", "i386_qemu"] GROUPS["i386_coreboot_multiboot_qemu"] = ["i386_coreboot", "i386_multiboot", "i386_qemu"]
GROUPS["nopc"] = GRUB_PLATFORMS[:]; GROUPS["nopc"].remove("i386_pc") GROUPS["nopc"] = GRUB_PLATFORMS[:]; GROUPS["nopc"].remove("i386_pc")
@@ -753,7 +759,7 @@ def image(defn, platform):
if test x$(TARGET_APPLE_LINKER) = x1; then \ if test x$(TARGET_APPLE_LINKER) = x1; then \
$(MACHO2IMG) $< $@; \ $(MACHO2IMG) $< $@; \
else \ else \
$(TARGET_OBJCOPY) $(""" + cname(defn) + """_OBJCOPYFLAGS) --strip-unneeded -R .note -R .comment -R .note.gnu.build-id -R .reginfo -R .rel.dyn -R .note.gnu.gold-version $< $@; \ $(TARGET_OBJCOPY) $(""" + cname(defn) + """_OBJCOPYFLAGS) --strip-unneeded -R .note -R .comment -R .note.gnu.build-id -R .MIPS.abiflags -R .reginfo -R .rel.dyn -R .note.gnu.gold-version $< $@; \
fi fi
""") """)
+17 -13
View File
@@ -26,20 +26,22 @@ CFLAGS_LIBRARY += $(CFLAGS_PLATFORM) -fno-builtin
CPPFLAGS_LIBRARY += $(CPPFLAGS_PLATFORM) CPPFLAGS_LIBRARY += $(CPPFLAGS_PLATFORM)
CCASFLAGS_LIBRARY += $(CCASFLAGS_PLATFORM) CCASFLAGS_LIBRARY += $(CCASFLAGS_PLATFORM)
build-grub-pep2elf: $(top_srcdir)/util/grub-pe2elf.c $(top_srcdir)/grub-core/kern/emu/misc.c $(top_srcdir)/util/misc.c build-grub-pep2elf$(BUILD_EXEEXT): $(top_srcdir)/util/grub-pe2elf.c $(top_srcdir)/grub-core/kern/emu/misc.c $(top_srcdir)/util/misc.c
$(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) -DGRUB_BUILD=1 -DGRUB_TARGET_WORDSIZE=64 -DGRUB_UTIL=1 -DGRUB_BUILD_PROGRAM_NAME=\"build-grub-pep2elf\" $^ $(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -DGRUB_BUILD=1 -DGRUB_TARGET_WORDSIZE=64 -DGRUB_UTIL=1 -DGRUB_BUILD_PROGRAM_NAME=\"build-grub-pep2elf\" $^
CLEANFILES += build-grub-pep2elf$(BUILD_EXEEXT)
build-grub-pe2elf: $(top_srcdir)/util/grub-pe2elf.c $(top_srcdir)/grub-core/kern/emu/misc.c $(top_srcdir)/util/misc.c build-grub-pe2elf$(BUILD_EXEEXT): $(top_srcdir)/util/grub-pe2elf.c $(top_srcdir)/grub-core/kern/emu/misc.c $(top_srcdir)/util/misc.c
$(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) -DGRUB_BUILD=1 -DGRUB_TARGET_WORDSIZE=32 -DGRUB_UTIL=1 -DGRUB_BUILD_PROGRAM_NAME=\"build-grub-pe2elf\" $^ $(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -DGRUB_BUILD=1 -DGRUB_TARGET_WORDSIZE=32 -DGRUB_UTIL=1 -DGRUB_BUILD_PROGRAM_NAME=\"build-grub-pe2elf\" $^
CLEANFILES += build-grub-pe2elf$(BUILD_EXEEXT)
# gentrigtables # gentrigtables
gentrigtables: gentrigtables.c gentrigtables$(BUILD_EXEEXT): gentrigtables.c
$(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $< $(BUILD_LIBM) $(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) $< $(BUILD_LIBM)
CLEANFILES += gentrigtables CLEANFILES += gentrigtables$(BUILD_EXEEXT)
# trigtables.c # trigtables.c
trigtables.c: gentrigtables gentrigtables.c $(top_srcdir)/configure.ac trigtables.c: gentrigtables$(BUILD_EXEEXT) gentrigtables.c $(top_srcdir)/configure.ac
./gentrigtables > $@ ./gentrigtables$(BUILD_EXEEXT) > $@
CLEANFILES += trigtables.c CLEANFILES += trigtables.c
# XXX Use Automake's LEX & YACC support # XXX Use Automake's LEX & YACC support
@@ -221,12 +223,14 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/uboot/uboot.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/uboot/disk.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/uboot/disk.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/arm/system.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/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
endif endif
if COND_arm64_efi if COND_arm64_efi
@@ -290,12 +294,12 @@ grub_emu-grub_emu_init.$(OBJEXT):grub_emu_init.h
kern/emu/grub_emu_dyn-main.$(OBJEXT):grub_emu_init.h kern/emu/grub_emu_dyn-main.$(OBJEXT):grub_emu_init.h
grub_emu_dyn-grub_emu_init.$(OBJEXT):grub_emu_init.h grub_emu_dyn-grub_emu_init.$(OBJEXT):grub_emu_init.h
grub_emu_init.h: genemuinitheader.sh $(MOD_FILES) grub_emu_init.h: genemuinitheader.sh $(MODULE_FILES)
rm -f $@; echo $(MOD_FILES) | sh $(srcdir)/genemuinitheader.sh $(TARGET_NM) > $@ rm -f $@; echo $(MODULE_FILES) | sh $(srcdir)/genemuinitheader.sh $(TARGET_NM) > $@
CLEANFILES += grub_emu_init.h CLEANFILES += grub_emu_init.h
grub_emu_init.c: grub_emu_init.h genemuinit.sh $(MOD_FILES) grub_emu_init.c: grub_emu_init.h genemuinit.sh $(MODULE_FILES)
rm -f $@; echo $(MOD_FILES) | sh $(srcdir)/genemuinit.sh $(TARGET_NM) > $@ rm -f $@; echo $(MODULE_FILES) | sh $(srcdir)/genemuinit.sh $(TARGET_NM) > $@
CLEANFILES += grub_emu_init.c CLEANFILES += grub_emu_init.c
endif endif
+11 -2
View File
@@ -66,7 +66,7 @@ kernel = {
arm_efi_stripflags = '--strip-unneeded -K start -R .note -R .comment -R .note.gnu.gold-version'; arm_efi_stripflags = '--strip-unneeded -K start -R .note -R .comment -R .note.gnu.gold-version';
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'; arm64_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';
@@ -159,6 +159,8 @@ kernel = {
terminfoinkernel = commands/extcmd.c; terminfoinkernel = commands/extcmd.c;
terminfoinkernel = lib/arg.c; terminfoinkernel = lib/arg.c;
softdiv = lib/division.c;
i386 = kern/i386/dl.c; i386 = kern/i386/dl.c;
i386_xen = kern/i386/dl.c; i386_xen = kern/i386/dl.c;
@@ -1672,7 +1674,8 @@ module = {
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 = loader/arm/linux.c; arm = loader/arm/linux.c;
arm = lib/fdt.c; arm64 = loader/arm64/linux.c;
fdt = lib/fdt.c;
common = loader/linux.c; common = loader/linux.c;
common = lib/cmdline.c; common = lib/cmdline.c;
enable = noemu; enable = noemu;
@@ -1968,6 +1971,12 @@ module = {
enable = xen; enable = xen;
}; };
module = {
name = div;
common = lib/division.c;
enable = no_softdiv;
};
module = { module = {
name = div_test; name = div_test;
common = tests/div_test.c; common = tests/div_test.c;
+21 -21
View File
@@ -165,8 +165,8 @@ start:
* this area. * this area.
*/ */
. = _start + GRUB_BOOT_MACHINE_BPB_START .org GRUB_BOOT_MACHINE_BPB_START
. = _start + 4 .org 4
#endif #endif
#ifdef HYBRID_BOOT #ifdef HYBRID_BOOT
floppy floppy
@@ -174,23 +174,23 @@ start:
scratch scratch
#endif #endif
. = _start + GRUB_BOOT_MACHINE_BPB_END .org GRUB_BOOT_MACHINE_BPB_END
/* /*
* End of BIOS parameter block. * End of BIOS parameter block.
*/ */
kernel_address: LOCAL(kernel_address):
.word GRUB_BOOT_MACHINE_KERNEL_ADDR .word GRUB_BOOT_MACHINE_KERNEL_ADDR
#ifndef HYBRID_BOOT #ifndef HYBRID_BOOT
. = _start + GRUB_BOOT_MACHINE_KERNEL_SECTOR .org GRUB_BOOT_MACHINE_KERNEL_SECTOR
kernel_sector: LOCAL(kernel_sector):
.long 1 .long 1
kernel_sector_high: LOCAL(kernel_sector_high):
.long 0 .long 0
#endif #endif
. = _start + GRUB_BOOT_MACHINE_BOOT_DRIVE .org GRUB_BOOT_MACHINE_BOOT_DRIVE
boot_drive: boot_drive:
.byte 0xff /* the disk to load kernel from */ .byte 0xff /* the disk to load kernel from */
/* 0xff means use the boot drive */ /* 0xff means use the boot drive */
@@ -208,7 +208,7 @@ LOCAL(after_BPB):
* possible boot drive. If GRUB is installed into a floppy, * possible boot drive. If GRUB is installed into a floppy,
* this does nothing (only jump). * this does nothing (only jump).
*/ */
. = _start + GRUB_BOOT_MACHINE_DRIVE_CHECK .org GRUB_BOOT_MACHINE_DRIVE_CHECK
boot_drive_check: boot_drive_check:
jmp 3f /* grub-setup may overwrite this jump */ jmp 3f /* grub-setup may overwrite this jump */
testb $0x80, %dl testb $0x80, %dl
@@ -275,7 +275,7 @@ real_start:
andw $1, %cx andw $1, %cx
jz LOCAL(chs_mode) jz LOCAL(chs_mode)
lba_mode: LOCAL(lba_mode):
xorw %ax, %ax xorw %ax, %ax
movw %ax, 4(%si) movw %ax, 4(%si)
@@ -290,9 +290,9 @@ lba_mode:
movw $0x0010, (%si) movw $0x0010, (%si)
/* the absolute address */ /* the absolute address */
movl kernel_sector, %ebx movl LOCAL(kernel_sector), %ebx
movl %ebx, 8(%si) movl %ebx, 8(%si)
movl kernel_sector_high, %ebx movl LOCAL(kernel_sector_high), %ebx
movl %ebx, 12(%si) movl %ebx, 12(%si)
/* the segment of buffer address */ /* the segment of buffer address */
@@ -361,13 +361,13 @@ LOCAL(final_init):
setup_sectors: setup_sectors:
/* load logical sector start (top half) */ /* load logical sector start (top half) */
movl kernel_sector_high, %eax movl LOCAL(kernel_sector_high), %eax
orl %eax, %eax orl %eax, %eax
jnz LOCAL(geometry_error) jnz LOCAL(geometry_error)
/* load logical sector start (bottom half) */ /* load logical sector start (bottom half) */
movl kernel_sector, %eax movl LOCAL(kernel_sector), %eax
/* zero %edx */ /* zero %edx */
xorl %edx, %edx xorl %edx, %edx
@@ -452,7 +452,7 @@ LOCAL(copy_buffer):
popa popa
/* boot kernel */ /* boot kernel */
jmp *(kernel_address) jmp *(LOCAL(kernel_address))
/* END OF MAIN LOOP */ /* END OF MAIN LOOP */
@@ -511,13 +511,13 @@ LOCAL(message):
*/ */
#ifdef HYBRID_BOOT #ifdef HYBRID_BOOT
. = _start + 0x1b0 .org 0x1b0
kernel_sector: LOCAL(kernel_sector):
.long 1 .long 1
kernel_sector_high: LOCAL(kernel_sector_high):
.long 0 .long 0
#endif #endif
. = _start + GRUB_BOOT_MACHINE_WINDOWS_NT_MAGIC .org GRUB_BOOT_MACHINE_WINDOWS_NT_MAGIC
nt_magic: nt_magic:
.long 0 .long 0
.word 0 .word 0
@@ -528,7 +528,7 @@ nt_magic:
* sneaky, huh? * sneaky, huh?
*/ */
. = _start + GRUB_BOOT_MACHINE_PART_START .org GRUB_BOOT_MACHINE_PART_START
#ifndef HYBRID_BOOT #ifndef HYBRID_BOOT
floppy floppy
@@ -536,7 +536,7 @@ nt_magic:
scratch scratch
#endif #endif
. = _start + GRUB_BOOT_MACHINE_PART_END .org GRUB_BOOT_MACHINE_PART_END
/* the last 2 bytes in the sector 0 contain the signature */ /* the last 2 bytes in the sector 0 contain the signature */
.word GRUB_BOOT_MACHINE_SIGNATURE .word GRUB_BOOT_MACHINE_SIGNATURE
+2 -2
View File
@@ -43,7 +43,7 @@ _start:
LOCAL(next): LOCAL(next):
jmp 1f jmp 1f
. = start + 8 .org 8
bi_pvd: bi_pvd:
.long 0 /* LBA of primary volume descriptor. */ .long 0 /* LBA of primary volume descriptor. */
@@ -168,6 +168,6 @@ err_noboot_msg:
err_cdfail_msg: err_cdfail_msg:
.ascii "cdrom read fails\0" .ascii "cdrom read fails\0"
. = start + 0x7FF .org 0x7FF
.byte 0 .byte 0
+1 -1
View File
@@ -362,7 +362,7 @@ LOCAL(message):
.word 0 .word 0
.word 0 .word 0
. = _start + 0x200 - GRUB_BOOT_MACHINE_LIST_SIZE .org 0x200 - GRUB_BOOT_MACHINE_LIST_SIZE
LOCAL(firstlist): /* this label has to be before the first list entry!!! */ LOCAL(firstlist): /* this label has to be before the first list entry!!! */
/* fill the first data listing with the default */ /* fill the first data listing with the default */
blocklist_default_start: blocklist_default_start:
+2 -2
View File
@@ -41,7 +41,7 @@ data_start:
xorl %ebp, %ebp xorl %ebp, %ebp
jmp LOCAL(linux_next) jmp LOCAL(linux_next)
. = data_start + 0x1F1 .org 0x1F1
setup_sects: setup_sects:
.byte CODE_SECTORS .byte CODE_SECTORS
@@ -292,4 +292,4 @@ LOCAL(fail):
err_int15_msg: err_int15_msg:
.ascii "move memory fails\0" .ascii "move memory fails\0"
. = _start + CODE_SECTORS * 512 .org (CODE_SECTORS * 512 + 512)
+1 -1
View File
@@ -38,5 +38,5 @@ start:
/* This region is a junk. Do you say that this is wasteful? /* This region is a junk. Do you say that this is wasteful?
But I like that the memory layout of the body is consistent But I like that the memory layout of the body is consistent
among different kernels rather than scamping just for 1.5KB. */ among different kernels rather than scamping just for 1.5KB. */
. = _start + 0x8200 - 0x7C00 - 0x200 - 1 .org 0x8200 - 0x7C00 - 0x200 - 1
.byte 0 .byte 0
+8 -8
View File
@@ -50,23 +50,23 @@ LOCAL (base):
* This is a special data area. * This is a special data area.
*/ */
. = _start + GRUB_DECOMPRESSOR_MACHINE_COMPRESSED_SIZE .org GRUB_DECOMPRESSOR_MACHINE_COMPRESSED_SIZE
LOCAL(compressed_size): LOCAL(compressed_size):
.long 0 .long 0
. = _start + GRUB_DECOMPRESSOR_MACHINE_UNCOMPRESSED_SIZE .org GRUB_DECOMPRESSOR_MACHINE_UNCOMPRESSED_SIZE
LOCAL(uncompressed_size): LOCAL(uncompressed_size):
.long 0 .long 0
. = _start + GRUB_KERNEL_I386_PC_REED_SOLOMON_REDUNDANCY .org GRUB_KERNEL_I386_PC_REED_SOLOMON_REDUNDANCY
reed_solomon_redundancy: reed_solomon_redundancy:
.long 0 .long 0
. = _start + GRUB_KERNEL_I386_PC_NO_REED_SOLOMON_LENGTH .org GRUB_KERNEL_I386_PC_NO_REED_SOLOMON_LENGTH
.short (LOCAL(reed_solomon_part) - _start) .short (LOCAL(reed_solomon_part) - _start)
/* /*
* This is the area for all of the special variables. * This is the area for all of the special variables.
*/ */
. = _start + GRUB_DECOMPRESSOR_I386_PC_BOOT_DEVICE .org GRUB_DECOMPRESSOR_I386_PC_BOOT_DEVICE
LOCAL(boot_dev): LOCAL(boot_dev):
.byte 0xFF, 0xFF, 0xFF .byte 0xFF, 0xFF, 0xFF
LOCAL(boot_drive): LOCAL(boot_drive):
@@ -89,13 +89,13 @@ LOCAL (codestart):
sti /* we're safe again */ sti /* we're safe again */
/* save the boot drive */ /* save the boot drive */
ADDR32 movb %dl, LOCAL(boot_drive) movb %dl, LOCAL(boot_drive)
/* reset disk system (%ah = 0) */ /* reset disk system (%ah = 0) */
int $0x13 int $0x13
/* transition to protected mode */ /* transition to protected mode */
DATA32 call real_to_prot calll real_to_prot
/* The ".code32" directive takes GAS out of 16-bit mode. */ /* The ".code32" directive takes GAS out of 16-bit mode. */
.code32 .code32
@@ -149,7 +149,7 @@ gate_a20_try_bios:
movw $0x2401, %ax movw $0x2401, %ax
int $0x15 int $0x15
DATA32 call real_to_prot calll real_to_prot
.code32 .code32
popl %ebp popl %ebp
+5 -5
View File
@@ -31,7 +31,7 @@ _start:
jmp 1f jmp 1f
. = _start + GRUB_BOOT_I386_QEMU_CORE_ENTRY_ADDR .org GRUB_BOOT_I386_QEMU_CORE_ENTRY_ADDR
VARIABLE(grub_core_entry_addr) VARIABLE(grub_core_entry_addr)
.long 0 .long 0
1: 1:
@@ -48,8 +48,9 @@ VARIABLE(grub_core_entry_addr)
/* Transition to protected mode. We use pushl to force generation /* Transition to protected mode. We use pushl to force generation
of a flat return address. */ of a flat return address. */
pushl $1f pushl $1f
DATA32 jmp real_to_prot jmp real_to_prot
.code32 .code32
1:
/* Ensure A20 is enabled. We're in qemu, so control port A works /* Ensure A20 is enabled. We're in qemu, so control port A works
and there is no need to wait since there is no real logic, it's and there is no need to wait since there is no real logic, it's
all emulated. */ all emulated. */
@@ -57,7 +58,6 @@ VARIABLE(grub_core_entry_addr)
andb $(~0x03), %al andb $(~0x03), %al
orb $0x02, %al orb $0x02, %al
outb $0x92 outb $0x92
1:
movl EXT_C(grub_core_entry_addr), %edx movl EXT_C(grub_core_entry_addr), %edx
jmp *%edx jmp *%edx
@@ -66,9 +66,9 @@ VARIABLE(grub_core_entry_addr)
/* Intel, in its infinite wisdom, decided to put the i8086 entry point /* Intel, in its infinite wisdom, decided to put the i8086 entry point
*right here* and this is why we need this kludge. */ *right here* and this is why we need this kludge. */
. = GRUB_BOOT_MACHINE_SIZE - 16 .org GRUB_BOOT_MACHINE_SIZE - 16
.code16 .code16
jmp _start jmp _start
. = GRUB_BOOT_MACHINE_SIZE .org GRUB_BOOT_MACHINE_SIZE
+3 -3
View File
@@ -162,7 +162,7 @@ retry_cs5536:
b continue b continue
. = start + GRUB_CPU_LOONGSON_FLASH_TLB_REFILL - GRUB_CPU_LOONGSON_FLASH_START .org GRUB_CPU_LOONGSON_FLASH_TLB_REFILL - GRUB_CPU_LOONGSON_FLASH_START
tlb_refill: tlb_refill:
mfc0 $s1, GRUB_CPU_LOONGSON_COP0_EPC mfc0 $s1, GRUB_CPU_LOONGSON_COP0_EPC
mfc0 $s2, GRUB_CPU_LOONGSON_COP0_BADVADDR mfc0 $s2, GRUB_CPU_LOONGSON_COP0_BADVADDR
@@ -196,13 +196,13 @@ tlb_refill:
b fatal b fatal
addiu $a0, $a0, %lo(unhandled_tlb_refill) addiu $a0, $a0, %lo(unhandled_tlb_refill)
. = start + GRUB_CPU_LOONGSON_FLASH_CACHE_ERROR - GRUB_CPU_LOONGSON_FLASH_START .org GRUB_CPU_LOONGSON_FLASH_CACHE_ERROR - GRUB_CPU_LOONGSON_FLASH_START
cache_error: cache_error:
lui $a0, %hi(unhandled_cache_error) lui $a0, %hi(unhandled_cache_error)
b fatal b fatal
addiu $a0, $a0, %lo(unhandled_cache_error) addiu $a0, $a0, %lo(unhandled_cache_error)
. = start + GRUB_CPU_LOONGSON_FLASH_OTHER_EXCEPTION - GRUB_CPU_LOONGSON_FLASH_START .org GRUB_CPU_LOONGSON_FLASH_OTHER_EXCEPTION - GRUB_CPU_LOONGSON_FLASH_START
other_exception: other_exception:
mfc0 $s0, GRUB_CPU_LOONGSON_COP0_CAUSE mfc0 $s0, GRUB_CPU_LOONGSON_COP0_CAUSE
mfc0 $s1, GRUB_CPU_LOONGSON_COP0_EPC mfc0 $s1, GRUB_CPU_LOONGSON_COP0_EPC
+17 -15
View File
@@ -21,6 +21,7 @@
#include <grub/offsets.h> #include <grub/offsets.h>
#include <grub/machine/memory.h> #include <grub/machine/memory.h>
#include <grub/machine/kernel.h> #include <grub/machine/kernel.h>
#include <grub/cpu/kernel.h>
#include <grub/offsets.h> #include <grub/offsets.h>
#define BASE_ADDR 8 #define BASE_ADDR 8
@@ -32,6 +33,7 @@
.globl __start, _start, start .globl __start, _start, start
.set noreorder .set noreorder
.set nomacro .set nomacro
mips_attributes
__start: __start:
_start: _start:
start: start:
@@ -39,13 +41,13 @@ start:
bal codestart bal codestart
nop nop
base: base:
. = _start + GRUB_DECOMPRESSOR_MACHINE_COMPRESSED_SIZE .org GRUB_DECOMPRESSOR_MACHINE_COMPRESSED_SIZE
compressed_size: compressed_size:
.long 0 .long 0
. = _start + GRUB_DECOMPRESSOR_MACHINE_UNCOMPRESSED_SIZE .org GRUB_DECOMPRESSOR_MACHINE_UNCOMPRESSED_SIZE
uncompressed_size: uncompressed_size:
.long 0 .long 0
. = _start + GRUB_DECOMPRESSOR_MACHINE_UNCOMPRESSED_ADDR .org GRUB_DECOMPRESSOR_MACHINE_UNCOMPRESSED_ADDR
uncompressed_addr: uncompressed_addr:
.long 0 .long 0
codestart: codestart:
@@ -150,18 +152,18 @@ digcont:
1: 1:
jr $ra jr $ra
nop nop
busclockstr: .asciiz "busclock=" busclockstr: .asciz "busclock="
cpuclockstr: .asciiz "cpuclock=" cpuclockstr: .asciz "cpuclock="
memsizestr: .asciiz "memsize=" memsizestr: .asciz "memsize="
highmemsizestr: .asciiz "highmemsize=" highmemsizestr: .asciz "highmemsize="
machtype_yeeloong_str1: .asciiz "machtype=8.9" machtype_yeeloong_str1: .asciz "machtype=8.9"
machtype_yeeloong_str2: .asciiz "machtype=lemote-yeeloong-" machtype_yeeloong_str2: .asciz "machtype=lemote-yeeloong-"
machtype_fuloong2f_str: .asciiz "machtype=lemote-fuloong-2f" machtype_fuloong2f_str: .asciz "machtype=lemote-fuloong-2f"
machtype_fuloong2e_str: .asciiz "machtype=lemote-fuloong-2e" machtype_fuloong2e_str: .asciz "machtype=lemote-fuloong-2e"
pmon_yeeloong_str: .asciiz "PMON_VER=LM8" pmon_yeeloong_str: .asciz "PMON_VER=LM8"
pmon_fuloong2f_str: .asciiz "PMON_VER=LM6" pmon_fuloong2f_str: .asciz "PMON_VER=LM6"
pmon_yeeloong_verstr: .asciiz "Version=LM8" pmon_yeeloong_verstr: .asciz "Version=LM8"
pmon_fuloong2f_verstr: .asciiz "Version=LM6" pmon_fuloong2f_verstr: .asciz "Version=LM6"
.p2align 2 .p2align 2
argdone: argdone:
+4 -4
View File
@@ -41,9 +41,9 @@ 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).
*/ */
. = _start + GRUB_BOOT_MACHINE_BOOT_DEVPATH .org GRUB_BOOT_MACHINE_BOOT_DEVPATH
boot_path: boot_path:
. = _start + GRUB_BOOT_MACHINE_KERNEL_BYTE .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
@@ -52,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>
. = _start + 8 .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
@@ -224,7 +224,7 @@ bootpath_known:
#else #else
nop nop
#endif #endif
. = _start + GRUB_BOOT_MACHINE_CODE_END .org GRUB_BOOT_MACHINE_CODE_END
/* the last 4 bytes in the sector 0 contain the signature */ /* the last 4 bytes in the sector 0 contain the signature */
.word GRUB_BOOT_MACHINE_SIGNATURE .word GRUB_BOOT_MACHINE_SIGNATURE
+1 -1
View File
@@ -136,7 +136,7 @@ lastlist:
.word 0 .word 0
.word 0 .word 0
. = _start + (0x200 - GRUB_BOOT_SPARC64_IEEE1275_LIST_SIZE) .org (0x200 - GRUB_BOOT_SPARC64_IEEE1275_LIST_SIZE)
blocklist_default_start: blocklist_default_start:
.word 0 .word 0
.word 2 .word 2
+22 -22
View File
@@ -670,23 +670,23 @@ grub_ehci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid,
for (i = 0; i < (GRUB_EHCI_N_TD - 1); i++) for (i = 0; i < (GRUB_EHCI_N_TD - 1); i++)
{ {
e->td_virt[i].link_td = e->td_phys + (i + 1) * sizeof (struct grub_ehci_td); e->td_virt[i].link_td = e->td_phys + (i + 1) * sizeof (struct grub_ehci_td);
e->td_virt[i].next_td = grub_cpu_to_le32 (GRUB_EHCI_TERMINATE); e->td_virt[i].next_td = grub_cpu_to_le32_compile_time (GRUB_EHCI_TERMINATE);
e->td_virt[i].alt_next_td = grub_cpu_to_le32 (GRUB_EHCI_TERMINATE); e->td_virt[i].alt_next_td = grub_cpu_to_le32_compile_time (GRUB_EHCI_TERMINATE);
} }
e->td_virt[GRUB_EHCI_N_TD - 1].next_td = e->td_virt[GRUB_EHCI_N_TD - 1].next_td =
grub_cpu_to_le32 (GRUB_EHCI_TERMINATE); grub_cpu_to_le32_compile_time (GRUB_EHCI_TERMINATE);
e->td_virt[GRUB_EHCI_N_TD - 1].alt_next_td = e->td_virt[GRUB_EHCI_N_TD - 1].alt_next_td =
grub_cpu_to_le32 (GRUB_EHCI_TERMINATE); grub_cpu_to_le32_compile_time (GRUB_EHCI_TERMINATE);
e->tdfree_virt = e->td_virt; e->tdfree_virt = e->td_virt;
/* Set Terminate in first QH, which is used in framelist */ /* Set Terminate in first QH, which is used in framelist */
e->qh_virt[0].qh_hptr = grub_cpu_to_le32 (GRUB_EHCI_TERMINATE | GRUB_EHCI_HPTR_TYPE_QH); e->qh_virt[0].qh_hptr = grub_cpu_to_le32_compile_time (GRUB_EHCI_TERMINATE | GRUB_EHCI_HPTR_TYPE_QH);
e->qh_virt[0].td_overlay.next_td = grub_cpu_to_le32 (GRUB_EHCI_TERMINATE); e->qh_virt[0].td_overlay.next_td = grub_cpu_to_le32_compile_time (GRUB_EHCI_TERMINATE);
e->qh_virt[0].td_overlay.alt_next_td = e->qh_virt[0].td_overlay.alt_next_td =
grub_cpu_to_le32 (GRUB_EHCI_TERMINATE); grub_cpu_to_le32_compile_time (GRUB_EHCI_TERMINATE);
/* Also set Halted bit in token */ /* Also set Halted bit in token */
e->qh_virt[0].td_overlay.token = grub_cpu_to_le32 (GRUB_EHCI_STATUS_HALTED); e->qh_virt[0].td_overlay.token = grub_cpu_to_le32_compile_time (GRUB_EHCI_STATUS_HALTED);
/* Set the H bit in first QH used for AL */ /* Set the H bit in first QH used for AL */
e->qh_virt[1].ep_char = grub_cpu_to_le32 (GRUB_EHCI_H); e->qh_virt[1].ep_char = grub_cpu_to_le32_compile_time (GRUB_EHCI_H);
/* Set Terminate into TD in rest of QHs and set horizontal link /* Set Terminate into TD in rest of QHs and set horizontal link
* pointer to itself - these QHs will be used for asynchronous * pointer to itself - these QHs will be used for asynchronous
* schedule and they should have valid value in horiz. link */ * schedule and they should have valid value in horiz. link */
@@ -697,12 +697,12 @@ grub_ehci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid,
e->qh_chunk) & e->qh_chunk) &
GRUB_EHCI_POINTER_MASK) | GRUB_EHCI_HPTR_TYPE_QH); GRUB_EHCI_POINTER_MASK) | GRUB_EHCI_HPTR_TYPE_QH);
e->qh_virt[i].td_overlay.next_td = e->qh_virt[i].td_overlay.next_td =
grub_cpu_to_le32 (GRUB_EHCI_TERMINATE); grub_cpu_to_le32_compile_time (GRUB_EHCI_TERMINATE);
e->qh_virt[i].td_overlay.alt_next_td = e->qh_virt[i].td_overlay.alt_next_td =
grub_cpu_to_le32 (GRUB_EHCI_TERMINATE); grub_cpu_to_le32_compile_time (GRUB_EHCI_TERMINATE);
/* Also set Halted bit in token */ /* Also set Halted bit in token */
e->qh_virt[i].td_overlay.token = e->qh_virt[i].td_overlay.token =
grub_cpu_to_le32 (GRUB_EHCI_STATUS_HALTED); grub_cpu_to_le32_compile_time (GRUB_EHCI_STATUS_HALTED);
} }
/* Note: QH 0 and QH 1 are reserved and must not be used anywhere. /* Note: QH 0 and QH 1 are reserved and must not be used anywhere.
@@ -991,7 +991,7 @@ grub_ehci_find_qh (struct grub_ehci *e, grub_usb_transfer_t transfer)
target = ((transfer->endpoint << GRUB_EHCI_EP_NUM_OFF) | target = ((transfer->endpoint << GRUB_EHCI_EP_NUM_OFF) |
transfer->devaddr) & GRUB_EHCI_TARGET_MASK; transfer->devaddr) & GRUB_EHCI_TARGET_MASK;
target = grub_cpu_to_le32 (target); target = grub_cpu_to_le32 (target);
mask = grub_cpu_to_le32 (GRUB_EHCI_TARGET_MASK); mask = grub_cpu_to_le32_compile_time (GRUB_EHCI_TARGET_MASK);
/* low speed interrupt transfers are linked to the periodic */ /* low speed interrupt transfers are linked to the periodic */
/* schedule, everything else to the asynchronous schedule */ /* schedule, everything else to the asynchronous schedule */
@@ -1200,7 +1200,7 @@ grub_ehci_transaction (struct grub_ehci *e,
grub_memset ((void *) td, 0, sizeof (struct grub_ehci_td)); grub_memset ((void *) td, 0, sizeof (struct grub_ehci_td));
/* Don't point to any TD yet, just terminate. */ /* Don't point to any TD yet, just terminate. */
td->next_td = grub_cpu_to_le32 (GRUB_EHCI_TERMINATE); td->next_td = grub_cpu_to_le32_compile_time (GRUB_EHCI_TERMINATE);
/* Set alternate pointer. When short packet occurs, alternate TD /* Set alternate pointer. When short packet occurs, alternate TD
* will not be really fetched because it is not active. But don't * will not be really fetched because it is not active. But don't
* forget, EHCI will try to fetch alternate TD every scan of AL * forget, EHCI will try to fetch alternate TD every scan of AL
@@ -1325,9 +1325,9 @@ grub_ehci_setup_transfer (grub_usb_controller_t dev,
/* Fill whole alternate TD by zeros (= inactive) and set /* Fill whole alternate TD by zeros (= inactive) and set
* Terminate bits and Halt bit */ * Terminate bits and Halt bit */
grub_memset ((void *) cdata->td_alt_virt, 0, sizeof (struct grub_ehci_td)); grub_memset ((void *) cdata->td_alt_virt, 0, sizeof (struct grub_ehci_td));
cdata->td_alt_virt->next_td = grub_cpu_to_le32 (GRUB_EHCI_TERMINATE); cdata->td_alt_virt->next_td = grub_cpu_to_le32_compile_time (GRUB_EHCI_TERMINATE);
cdata->td_alt_virt->alt_next_td = grub_cpu_to_le32 (GRUB_EHCI_TERMINATE); cdata->td_alt_virt->alt_next_td = grub_cpu_to_le32_compile_time (GRUB_EHCI_TERMINATE);
cdata->td_alt_virt->token = grub_cpu_to_le32 (GRUB_EHCI_STATUS_HALTED); cdata->td_alt_virt->token = grub_cpu_to_le32_compile_time (GRUB_EHCI_STATUS_HALTED);
/* Allocate appropriate number of TDs and set */ /* Allocate appropriate number of TDs and set */
for (i = 0; i < transfer->transcnt; i++) for (i = 0; i < transfer->transcnt; i++)
@@ -1364,7 +1364,7 @@ grub_ehci_setup_transfer (grub_usb_controller_t dev,
cdata->td_last_virt = td; cdata->td_last_virt = td;
cdata->td_last_phys = grub_dma_virt2phys (td, e->td_chunk); cdata->td_last_phys = grub_dma_virt2phys (td, e->td_chunk);
/* Last TD should not have set alternate TD */ /* Last TD should not have set alternate TD */
cdata->td_last_virt->alt_next_td = grub_cpu_to_le32 (GRUB_EHCI_TERMINATE); cdata->td_last_virt->alt_next_td = grub_cpu_to_le32_compile_time (GRUB_EHCI_TERMINATE);
grub_dprintf ("ehci", "setup_transfer: cdata=%p, qh=%p\n", grub_dprintf ("ehci", "setup_transfer: cdata=%p, qh=%p\n",
cdata,cdata->qh_virt); cdata,cdata->qh_virt);
@@ -1377,14 +1377,14 @@ grub_ehci_setup_transfer (grub_usb_controller_t dev,
/* Start transfer: */ /* Start transfer: */
/* Unlink possible alternate pointer in QH */ /* Unlink possible alternate pointer in QH */
cdata->qh_virt->td_overlay.alt_next_td = cdata->qh_virt->td_overlay.alt_next_td =
grub_cpu_to_le32 (GRUB_EHCI_TERMINATE); grub_cpu_to_le32_compile_time (GRUB_EHCI_TERMINATE);
/* Link new TDs with QH via next_td */ /* Link new TDs with QH via next_td */
cdata->qh_virt->td_overlay.next_td = cdata->qh_virt->td_overlay.next_td =
grub_cpu_to_le32 (grub_dma_virt2phys grub_cpu_to_le32 (grub_dma_virt2phys
(cdata->td_first_virt, e->td_chunk)); (cdata->td_first_virt, e->td_chunk));
/* Reset Active and Halted bits in QH to activate Advance Queue, /* Reset Active and Halted bits in QH to activate Advance Queue,
* i.e. reset token */ * i.e. reset token */
cdata->qh_virt->td_overlay.token = grub_cpu_to_le32 (0); cdata->qh_virt->td_overlay.token = grub_cpu_to_le32_compile_time (0);
/* Finito */ /* Finito */
transfer->controller_data = cdata; transfer->controller_data = cdata;
@@ -1408,9 +1408,9 @@ grub_ehci_pre_finish_transfer (grub_usb_transfer_t transfer)
* safely manipulate with QH TD part. */ * safely manipulate with QH TD part. */
cdata->qh_virt->td_overlay.token = (cdata->qh_virt->td_overlay.token cdata->qh_virt->td_overlay.token = (cdata->qh_virt->td_overlay.token
| |
grub_cpu_to_le32 grub_cpu_to_le32_compile_time
(GRUB_EHCI_STATUS_HALTED)) & (GRUB_EHCI_STATUS_HALTED)) &
grub_cpu_to_le32 (~GRUB_EHCI_STATUS_ACTIVE); grub_cpu_to_le32_compile_time (~GRUB_EHCI_STATUS_ACTIVE);
/* Print debug data here if necessary */ /* Print debug data here if necessary */
+4 -4
View File
@@ -314,7 +314,7 @@ grub_ohci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid,
grub_memset ((void *) o->ed_ctrl, 0, sizeof (struct grub_ohci_ed) grub_memset ((void *) o->ed_ctrl, 0, sizeof (struct grub_ohci_ed)
* GRUB_OHCI_CTRL_EDS); * GRUB_OHCI_CTRL_EDS);
for (j=0; j < GRUB_OHCI_CTRL_EDS; j++) for (j=0; j < GRUB_OHCI_CTRL_EDS; j++)
o->ed_ctrl[j].target = grub_cpu_to_le32 (1 << 14); /* skip */ o->ed_ctrl[j].target = grub_cpu_to_le32_compile_time (1 << 14); /* skip */
grub_dprintf ("ohci", "EDs-C: chunk=%p, virt=%p, phys=0x%02x\n", grub_dprintf ("ohci", "EDs-C: chunk=%p, virt=%p, phys=0x%02x\n",
o->ed_ctrl_chunk, o->ed_ctrl, o->ed_ctrl_addr); o->ed_ctrl_chunk, o->ed_ctrl, o->ed_ctrl_addr);
@@ -329,7 +329,7 @@ grub_ohci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid,
/* Preset EDs */ /* Preset EDs */
grub_memset ((void*)o->ed_bulk, 0, sizeof(struct grub_ohci_ed) * GRUB_OHCI_BULK_EDS); grub_memset ((void*)o->ed_bulk, 0, sizeof(struct grub_ohci_ed) * GRUB_OHCI_BULK_EDS);
for (j=0; j < GRUB_OHCI_BULK_EDS; j++) for (j=0; j < GRUB_OHCI_BULK_EDS; j++)
o->ed_bulk[j].target = grub_cpu_to_le32 (1 << 14); /* skip */ o->ed_bulk[j].target = grub_cpu_to_le32_compile_time (1 << 14); /* skip */
grub_dprintf ("ohci", "EDs-B: chunk=%p, virt=%p, phys=0x%02x\n", grub_dprintf ("ohci", "EDs-B: chunk=%p, virt=%p, phys=0x%02x\n",
o->ed_bulk_chunk, o->ed_bulk, o->ed_bulk_addr); o->ed_bulk_chunk, o->ed_bulk, o->ed_bulk_addr);
@@ -1349,10 +1349,10 @@ grub_ohci_fini_hw (int noreturn __attribute__ ((unused)))
/* Set skip in all EDs */ /* Set skip in all EDs */
if (o->ed_bulk) if (o->ed_bulk)
for (i=0; i < GRUB_OHCI_BULK_EDS; i++) for (i=0; i < GRUB_OHCI_BULK_EDS; i++)
o->ed_bulk[i].target |= grub_cpu_to_le32 (1 << 14); /* skip */ o->ed_bulk[i].target |= grub_cpu_to_le32_compile_time (1 << 14); /* skip */
if (o->ed_ctrl) if (o->ed_ctrl)
for (i=0; i < GRUB_OHCI_CTRL_EDS; i++) for (i=0; i < GRUB_OHCI_CTRL_EDS; i++)
o->ed_ctrl[i].target |= grub_cpu_to_le32 (1 << 14); /* skip */ o->ed_ctrl[i].target |= grub_cpu_to_le32_compile_time (1 << 14); /* skip */
/* We should wait for next SOF to be sure that all EDs are /* We should wait for next SOF to be sure that all EDs are
* unaccessed by OHCI. But OHCI can be non-functional, so * unaccessed by OHCI. But OHCI can be non-functional, so
+1 -3
View File
@@ -625,9 +625,7 @@ grub_uhci_check_transfer (grub_usb_controller_t dev,
return GRUB_USB_ERR_NONE; return GRUB_USB_ERR_NONE;
} }
grub_dprintf ("uhci", "t status=0x%02x\n", errtd->ctrl_status); if (errtd && !(errtd->ctrl_status & (1 << 23)))
if (!(errtd->ctrl_status & (1 << 23)))
{ {
grub_usb_err_t err = GRUB_USB_ERR_NONE; grub_usb_err_t err = GRUB_USB_ERR_NONE;
+1 -1
View File
@@ -31,7 +31,7 @@ grub_usb_bulk_maxpacket (grub_usb_device_t dev,
struct grub_usb_desc_endp *endpoint) struct grub_usb_desc_endp *endpoint)
{ {
/* Use the maximum packet size given in the endpoint descriptor. */ /* Use the maximum packet size given in the endpoint descriptor. */
if (dev->initialized && endpoint) if (dev->initialized && endpoint && (unsigned int) endpoint->maxpacket)
return endpoint->maxpacket; return endpoint->maxpacket;
return 64; return 64;
+6 -5
View File
@@ -131,6 +131,8 @@ grub_acpi_get_rsdpv1 (void)
return grub_machine_acpi_get_rsdpv1 (); return grub_machine_acpi_get_rsdpv1 ();
} }
#if defined (__i386__) || defined (__x86_64__)
static inline int static inline int
iszero (grub_uint8_t *reg, int size) iszero (grub_uint8_t *reg, int size)
{ {
@@ -141,7 +143,6 @@ iszero (grub_uint8_t *reg, int size)
return 1; return 1;
} }
#if defined (__i386__) || defined (__x86_64__)
/* Context for grub_acpi_create_ebda. */ /* Context for grub_acpi_create_ebda. */
struct grub_acpi_create_ebda_ctx { struct grub_acpi_create_ebda_ctx {
int ebda_len; int ebda_len;
@@ -227,7 +228,7 @@ grub_acpi_create_ebda (void)
grub_dprintf ("acpi", "Copying rsdpv2 to %p\n", target); grub_dprintf ("acpi", "Copying rsdpv2 to %p\n", target);
v2inebda = target; v2inebda = target;
target += v2->length; target += v2->length;
target = (grub_uint8_t *) ((((grub_addr_t) target - 1) | 0xf) + 1); target = (grub_uint8_t *) ALIGN_UP((grub_addr_t) target, 16);
v2 = 0; v2 = 0;
break; break;
} }
@@ -246,7 +247,7 @@ grub_acpi_create_ebda (void)
grub_dprintf ("acpi", "Copying rsdpv1 to %p\n", target); grub_dprintf ("acpi", "Copying rsdpv1 to %p\n", target);
v1inebda = target; v1inebda = target;
target += sizeof (struct grub_acpi_rsdp_v10); target += sizeof (struct grub_acpi_rsdp_v10);
target = (grub_uint8_t *) ((((grub_addr_t) target - 1) | 0xf) + 1); target = (grub_uint8_t *) ALIGN_UP((grub_addr_t) target, 16);
v1 = 0; v1 = 0;
break; break;
} }
@@ -265,7 +266,7 @@ grub_acpi_create_ebda (void)
grub_memcpy (target, v2, v2->length); grub_memcpy (target, v2, v2->length);
v2inebda = target; v2inebda = target;
target += v2->length; target += v2->length;
target = (grub_uint8_t *) ((((grub_addr_t) target - 1) | 0xf) + 1); target = (grub_uint8_t *) ALIGN_UP((grub_addr_t) target, 16);
v2 = 0; v2 = 0;
break; break;
} }
@@ -282,7 +283,7 @@ grub_acpi_create_ebda (void)
grub_memcpy (target, v1, sizeof (struct grub_acpi_rsdp_v10)); grub_memcpy (target, v1, sizeof (struct grub_acpi_rsdp_v10));
v1inebda = target; v1inebda = target;
target += sizeof (struct grub_acpi_rsdp_v10); target += sizeof (struct grub_acpi_rsdp_v10);
target = (grub_uint8_t *) ((((grub_addr_t) target - 1) | 0xf) + 1); target = (grub_uint8_t *) ALIGN_UP((grub_addr_t) target, 16);
v1 = 0; v1 = 0;
break; break;
} }
+59 -4
View File
@@ -135,6 +135,49 @@ skip_data_ref_object (const grub_uint8_t *ptr, const grub_uint8_t *end)
} }
} }
static inline grub_uint32_t
skip_term (const grub_uint8_t *ptr, const grub_uint8_t *end)
{
grub_uint32_t add;
const grub_uint8_t *ptr0 = ptr;
switch(*ptr)
{
case GRUB_ACPI_OPCODE_ADD:
case GRUB_ACPI_OPCODE_AND:
case GRUB_ACPI_OPCODE_CONCAT:
case GRUB_ACPI_OPCODE_CONCATRES:
case GRUB_ACPI_OPCODE_DIVIDE:
case GRUB_ACPI_OPCODE_INDEX:
case GRUB_ACPI_OPCODE_LSHIFT:
case GRUB_ACPI_OPCODE_MOD:
case GRUB_ACPI_OPCODE_MULTIPLY:
case GRUB_ACPI_OPCODE_NAND:
case GRUB_ACPI_OPCODE_NOR:
case GRUB_ACPI_OPCODE_OR:
case GRUB_ACPI_OPCODE_RSHIFT:
case GRUB_ACPI_OPCODE_SUBTRACT:
case GRUB_ACPI_OPCODE_TOSTRING:
case GRUB_ACPI_OPCODE_XOR:
/*
* Parameters for these opcodes: TermArg, TermArg Target, see ACPI
* spec r5.0, page 828f.
*/
ptr++;
ptr += add = skip_term (ptr, end);
if (!add)
return 0;
ptr += add = skip_term (ptr, end);
if (!add)
return 0;
ptr += skip_name_string (ptr, end);
break;
default:
return skip_data_ref_object (ptr, end);
}
return ptr - ptr0;
}
static inline grub_uint32_t static inline grub_uint32_t
skip_ext_op (const grub_uint8_t *ptr, const grub_uint8_t *end) skip_ext_op (const grub_uint8_t *ptr, const grub_uint8_t *end)
{ {
@@ -156,10 +199,10 @@ skip_ext_op (const grub_uint8_t *ptr, const grub_uint8_t *end)
ptr++; ptr++;
ptr += skip_name_string (ptr, end); ptr += skip_name_string (ptr, end);
ptr++; ptr++;
ptr += add = skip_data_ref_object (ptr, end); ptr += add = skip_term (ptr, end);
if (!add) if (!add)
return 0; return 0;
ptr += add = skip_data_ref_object (ptr, end); ptr += add = skip_term (ptr, end);
if (!add) if (!add)
return 0; return 0;
break; break;
@@ -180,6 +223,7 @@ skip_ext_op (const grub_uint8_t *ptr, const grub_uint8_t *end)
return ptr - ptr0; return ptr - ptr0;
} }
static int static int
get_sleep_type (grub_uint8_t *table, grub_uint8_t *ptr, grub_uint8_t *end, get_sleep_type (grub_uint8_t *table, grub_uint8_t *ptr, grub_uint8_t *end,
grub_uint8_t *scope, int scope_len) grub_uint8_t *scope, int scope_len)
@@ -214,8 +258,8 @@ get_sleep_type (grub_uint8_t *table, grub_uint8_t *ptr, grub_uint8_t *end,
} }
case GRUB_ACPI_OPCODE_NAME: case GRUB_ACPI_OPCODE_NAME:
ptr++; ptr++;
if ((!scope || memcmp (scope, "\\", scope_len) == 0) && if ((!scope || grub_memcmp (scope, "\\", scope_len) == 0) &&
(memcmp (ptr, "_S5_", 4) == 0 || memcmp (ptr, "\\_S5_", 4) == 0)) (grub_memcmp (ptr, "_S5_", 4) == 0 || grub_memcmp (ptr, "\\_S5_", 4) == 0))
{ {
int ll; int ll;
grub_uint8_t *ptr2 = ptr; grub_uint8_t *ptr2 = ptr;
@@ -250,6 +294,17 @@ get_sleep_type (grub_uint8_t *table, grub_uint8_t *ptr, grub_uint8_t *end,
if (!add) if (!add)
return -1; return -1;
break; break;
case GRUB_ACPI_OPCODE_ALIAS:
ptr++;
/* We need to skip two name strings */
ptr += add = skip_name_string (ptr, end);
if (!add)
return -1;
ptr += add = skip_name_string (ptr, end);
if (!add)
return -1;
break;
case GRUB_ACPI_OPCODE_SCOPE: case GRUB_ACPI_OPCODE_SCOPE:
{ {
int scope_sleep_type; int scope_sleep_type;
+1 -1
View File
@@ -56,7 +56,7 @@ GRUB_MOD_INIT(boottime)
{ {
cmd_boottime = cmd_boottime =
grub_register_command ("boottime", grub_cmd_boottime, grub_register_command ("boottime", grub_cmd_boottime,
0, N_("Get boot time statistics.")); 0, N_("Show boot time statistics."));
} }
GRUB_MOD_FINI(boottime) GRUB_MOD_FINI(boottime)
+1
View File
@@ -52,6 +52,7 @@ grub_cmd_lsefisystab (struct grub_command *cmd __attribute__ ((unused)),
grub_efi_configuration_table_t *t; grub_efi_configuration_table_t *t;
unsigned int i; unsigned int i;
grub_printf ("Address: %p\n", st);
grub_printf ("Signature: %016" PRIxGRUB_UINT64_T " revision: %08x\n", grub_printf ("Signature: %016" PRIxGRUB_UINT64_T " revision: %08x\n",
st->hdr.signature, st->hdr.revision); st->hdr.signature, st->hdr.revision);
{ {
+67 -29
View File
@@ -36,62 +36,66 @@ GRUB_MOD_LICENSE ("GPLv3+");
static const struct grub_arg_option options[] = { static const struct grub_arg_option options[] = {
{"is-i386-xen-pae-domu", 0, 0, {"is-i386-xen-pae-domu", 0, 0,
N_("Check if FILE can be booted as i386 PAE xen unprivilegied guest"), N_("Check if FILE can be booted as i386 PAE Xen unprivileged guest kernel"),
0, 0}, 0, 0},
{"is-x86_64-xen-domu", 0, 0, {"is-x86_64-xen-domu", 0, 0,
N_("Check if FILE can be booted as x86_64 xen unprivilegied guest"), 0, 0}, N_("Check if FILE can be booted as x86_64 Xen unprivileged guest kernel"), 0, 0},
{"is-x86-xen-dom0", 0, 0, {"is-x86-xen-dom0", 0, 0,
N_("Check if FILE can be used as xen x86 privilegied guest kernel"), 0, 0}, N_("Check if FILE can be used as Xen x86 privileged guest kernel"), 0, 0},
{"is-x86-multiboot", 0, 0, {"is-x86-multiboot", 0, 0,
N_("Check if FILE can be used as x86 multiboot kernel"), 0, 0}, N_("Check if FILE can be used as x86 multiboot kernel"), 0, 0},
{"is-x86-multiboot2", 0, 0, {"is-x86-multiboot2", 0, 0,
N_("Check if FILE can be used as x86 multiboot2 kernel"), 0, 0}, N_("Check if FILE can be used as x86 multiboot2 kernel"), 0, 0},
{"is-arm-linux", 0, 0, {"is-arm-linux", 0, 0,
N_("Check if FILE is ARM linux"), 0, 0}, N_("Check if FILE is ARM Linux"), 0, 0},
{"is-arm64-linux", 0, 0,
N_("Check if FILE is ARM64 Linux"), 0, 0},
{"is-ia64-linux", 0, 0, {"is-ia64-linux", 0, 0,
N_("Check if FILE is IA64 linux"), 0, 0}, N_("Check if FILE is IA64 Linux"), 0, 0},
{"is-mips-linux", 0, 0, {"is-mips-linux", 0, 0,
N_("Check if FILE is MIPS linux"), 0, 0}, N_("Check if FILE is MIPS Linux"), 0, 0},
{"is-mipsel-linux", 0, 0, {"is-mipsel-linux", 0, 0,
N_("Check if FILE is MIPSEL linux"), 0, 0}, N_("Check if FILE is MIPSEL Linux"), 0, 0},
{"is-sparc64-linux", 0, 0, {"is-sparc64-linux", 0, 0,
N_("Check if FILE is SPARC64 linux"), 0, 0}, N_("Check if FILE is SPARC64 Linux"), 0, 0},
{"is-powerpc-linux", 0, 0, {"is-powerpc-linux", 0, 0,
N_("Check if FILE is POWERPC linux"), 0, 0}, N_("Check if FILE is POWERPC Linux"), 0, 0},
{"is-x86-linux", 0, 0, {"is-x86-linux", 0, 0,
N_("Check if FILE is x86 linux"), 0, 0}, N_("Check if FILE is x86 Linux"), 0, 0},
{"is-x86-linux32", 0, 0, {"is-x86-linux32", 0, 0,
N_("Check if FILE is x86 linux supporting 32-bit protocol"), 0, 0}, N_("Check if FILE is x86 Linux supporting 32-bit protocol"), 0, 0},
{"is-x86-kfreebsd", 0, 0, {"is-x86-kfreebsd", 0, 0,
N_("Check if FILE is x86 kfreebsd"), 0, 0}, N_("Check if FILE is x86 kFreeBSD"), 0, 0},
{"is-i386-kfreebsd", 0, 0, {"is-i386-kfreebsd", 0, 0,
N_("Check if FILE is i386 kfreebsd"), 0, 0}, N_("Check if FILE is i386 kFreeBSD"), 0, 0},
{"is-x86_64-kfreebsd", 0, 0, {"is-x86_64-kfreebsd", 0, 0,
N_("Check if FILE is x86_64 kfreebsd"), 0, 0}, N_("Check if FILE is x86_64 kFreeBSD"), 0, 0},
{"is-x86-knetbsd", 0, 0, {"is-x86-knetbsd", 0, 0,
N_("Check if FILE is x86 knetbsd"), 0, 0}, N_("Check if FILE is x86 kNetBSD"), 0, 0},
{"is-i386-knetbsd", 0, 0, {"is-i386-knetbsd", 0, 0,
N_("Check if FILE is i386 knetbsd"), 0, 0}, N_("Check if FILE is i386 kNetBSD"), 0, 0},
{"is-x86_64-knetbsd", 0, 0, {"is-x86_64-knetbsd", 0, 0,
N_("Check if FILE is x86_64 knetbsd"), 0, 0}, N_("Check if FILE is x86_64 kNetBSD"), 0, 0},
{"is-i386-efi", 0, 0, {"is-i386-efi", 0, 0,
N_("Check if FILE is i386 EFI file"), 0, 0}, N_("Check if FILE is i386 EFI file"), 0, 0},
{"is-x86_64-efi", 0, 0, {"is-x86_64-efi", 0, 0,
N_("Check if FILE is x86-64 EFI file"), 0, 0}, N_("Check if FILE is x86_64 EFI file"), 0, 0},
{"is-ia64-efi", 0, 0, {"is-ia64-efi", 0, 0,
N_("Check if FILE is IA64 EFI file"), 0, 0}, N_("Check if FILE is IA64 EFI file"), 0, 0},
{"is-arm64-efi", 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-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,
N_("Check if FILE is x86_64 xnu (Mac OS X kernel)"), 0, 0}, N_("Check if FILE is x86_64 XNU (Mac OS X kernel)"), 0, 0},
{"is-i386-xnu", 0, 0, {"is-i386-xnu", 0, 0,
N_("Check if FILE is i386 xnu (Mac OS X kernel)"), 0, 0}, N_("Check if FILE is i386 XNU (Mac OS X kernel)"), 0, 0},
{"is-xnu-hibr", 0, 0, {"is-xnu-hibr", 0, 0,
N_("Check if FILE is xnu (Mac OS X kernel) hibernated image"), 0, 0}, N_("Check if FILE is XNU (Mac OS X kernel) hibernated image"), 0, 0},
{"is-x86-bios-bootsector", 0, 0, {"is-x86-bios-bootsector", 0, 0,
N_("Check if FILE is BIOS bootsector"), 0, 0}, N_("Check if FILE is BIOS bootsector"), 0, 0},
{0, 0, 0, 0, 0, 0} {0, 0, 0, 0, 0, 0}
@@ -105,6 +109,7 @@ enum
IS_MULTIBOOT, IS_MULTIBOOT,
IS_MULTIBOOT2, IS_MULTIBOOT2,
IS_ARM_LINUX, IS_ARM_LINUX,
IS_ARM64_LINUX,
IS_IA64_LINUX, IS_IA64_LINUX,
IS_MIPS_LINUX, IS_MIPS_LINUX,
IS_MIPSEL_LINUX, IS_MIPSEL_LINUX,
@@ -121,6 +126,7 @@ enum
IS_32_EFI, IS_32_EFI,
IS_64_EFI, IS_64_EFI,
IS_IA_EFI, IS_IA_EFI,
IS_ARM64_EFI,
IS_ARM_EFI, IS_ARM_EFI,
IS_HIBERNATED, IS_HIBERNATED,
IS_XNU64, IS_XNU64,
@@ -377,16 +383,42 @@ grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char **args)
} }
case IS_ARM_LINUX: case IS_ARM_LINUX:
{ {
grub_uint32_t sig; grub_uint32_t sig, sig_pi;
if (grub_file_read (file, &sig_pi, 4) != 4)
break;
/* Raspberry pi. */
if (sig_pi == grub_cpu_to_le32_compile_time (0xea000006))
{
ret = 1;
break;
}
if (grub_file_seek (file, 0x24) == (grub_size_t) -1) if (grub_file_seek (file, 0x24) == (grub_size_t) -1)
break; break;
if (grub_file_read (file, &sig, 4) != 4) if (grub_file_read (file, &sig, 4) != 4)
break; break;
if (sig != grub_cpu_to_le32_compile_time (0x016f2818)) if (sig == grub_cpu_to_le32_compile_time (0x016f2818))
break; {
ret = 1; ret = 1;
break; break;
} }
break;
}
case IS_ARM64_LINUX:
{
grub_uint32_t sig;
if (grub_file_seek (file, 0x38) == (grub_size_t) -1)
break;
if (grub_file_read (file, &sig, 4) != 4)
break;
if (sig == grub_cpu_to_le32_compile_time (0x644d5241))
{
ret = 1;
break;
}
break;
}
case IS_PAE_DOMU ... IS_DOM0: case IS_PAE_DOMU ... IS_DOM0:
{ {
struct grub_xen_file_info xen_inf; struct grub_xen_file_info xen_inf;
@@ -444,8 +476,8 @@ grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char **args)
be at least 12 bytes and aligned on a 4-byte boundary. */ be at least 12 bytes and aligned on a 4-byte boundary. */
for (header = buffer; for (header = buffer;
((char *) header <= ((char *) header <=
(char *) buffer + len - (type == IS_MULTIBOOT2 ? 16 : 12)) (char *) buffer + len - (type == IS_MULTIBOOT2 ? 16 : 12));
|| (header = 0); header += step) header += step)
{ {
if (header[0] == magic if (header[0] == magic
&& !(grub_le_to_cpu32 (header[0]) && !(grub_le_to_cpu32 (header[0])
@@ -453,11 +485,12 @@ grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char **args)
+ grub_le_to_cpu32 (header[2]) + grub_le_to_cpu32 (header[2])
+ (type == IS_MULTIBOOT2 + (type == IS_MULTIBOOT2
? grub_le_to_cpu32 (header[3]) : 0))) ? grub_le_to_cpu32 (header[3]) : 0)))
{
ret = 1;
break; break;
} }
}
if (header != 0)
ret = 1;
grub_free (buffer); grub_free (buffer);
break; break;
} }
@@ -535,6 +568,7 @@ grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char **args)
case IS_32_EFI: case IS_32_EFI:
case IS_64_EFI: case IS_64_EFI:
case IS_IA_EFI: case IS_IA_EFI:
case IS_ARM64_EFI:
case IS_ARM_EFI: case IS_ARM_EFI:
{ {
char signature[4]; char signature[4];
@@ -573,11 +607,15 @@ 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_IA64)) grub_cpu_to_le16_compile_time (GRUB_PE32_MACHINE_IA64))
break; break;
if (type == IS_ARM64_EFI
&& coff_head.machine !=
grub_cpu_to_le16_compile_time (GRUB_PE32_MACHINE_ARM64))
break;
if (type == IS_ARM_EFI if (type == IS_ARM_EFI
&& 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_64_EFI || type == IS_64_EFI) if (type == IS_IA_EFI || type == IS_64_EFI || type == IS_ARM64_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))
+8 -4
View File
@@ -18,6 +18,7 @@
#include <grub/fileid.h> #include <grub/fileid.h>
#include <grub/elfload.h> #include <grub/elfload.h>
#include <grub/misc.h>
#pragma GCC diagnostic ignored "-Wcast-align" #pragma GCC diagnostic ignored "-Wcast-align"
@@ -39,10 +40,10 @@ grub_file_check_netbsdXX (grub_elf_t elf)
return 0; return 0;
if (grub_file_seek (elf->file, elf->ehdr.ehdrXX.e_shoff) == (grub_off_t) -1) if (grub_file_seek (elf->file, elf->ehdr.ehdrXX.e_shoff) == (grub_off_t) -1)
return 0; goto fail;
if (grub_file_read (elf->file, s0, shsize) != (grub_ssize_t) shsize) if (grub_file_read (elf->file, s0, shsize) != (grub_ssize_t) shsize)
return 0; goto fail;
s = (Elf_Shdr *) ((char *) s0 + elf->ehdr.ehdrXX.e_shstrndx * shentsize); s = (Elf_Shdr *) ((char *) s0 + elf->ehdr.ehdrXX.e_shstrndx * shentsize);
stroff = s->sh_offset; stroff = s->sh_offset;
@@ -53,18 +54,21 @@ grub_file_check_netbsdXX (grub_elf_t elf)
char name[sizeof(".note.netbsd.ident")]; char name[sizeof(".note.netbsd.ident")];
grub_memset (name, 0, sizeof (name)); grub_memset (name, 0, sizeof (name));
if (grub_file_seek (elf->file, stroff + s->sh_name) == (grub_off_t) -1) if (grub_file_seek (elf->file, stroff + s->sh_name) == (grub_off_t) -1)
return grub_errno; goto fail;
if (grub_file_read (elf->file, name, sizeof (name)) != (grub_ssize_t) sizeof (name)) if (grub_file_read (elf->file, name, sizeof (name)) != (grub_ssize_t) sizeof (name))
{ {
if (grub_errno) if (grub_errno)
return grub_errno; goto fail;
continue; continue;
} }
if (grub_memcmp (name, ".note.netbsd.ident", if (grub_memcmp (name, ".note.netbsd.ident",
sizeof(".note.netbsd.ident")) != 0) sizeof(".note.netbsd.ident")) != 0)
continue; continue;
grub_free (s0);
return 1; return 1;
} }
fail:
grub_free (s0);
return 0; return 0;
} }
+5 -3
View File
@@ -101,7 +101,7 @@ grub_cmd_gptsync (grub_command_t cmd __attribute__ ((unused)),
} }
/* Check if it is valid. */ /* Check if it is valid. */
if (mbr.signature != grub_cpu_to_le16 (GRUB_PC_PARTITION_SIGNATURE)) if (mbr.signature != grub_cpu_to_le16_compile_time (GRUB_PC_PARTITION_SIGNATURE))
{ {
grub_device_close (dev); grub_device_close (dev);
return grub_error (GRUB_ERR_BAD_PART_TABLE, "no signature"); return grub_error (GRUB_ERR_BAD_PART_TABLE, "no signature");
@@ -216,7 +216,7 @@ grub_cmd_gptsync (grub_command_t cmd __attribute__ ((unused)),
first_sector--; first_sector--;
mbr.entries[0].flag = 0; mbr.entries[0].flag = 0;
mbr.entries[0].type = GRUB_PC_PARTITION_TYPE_GPT_DISK; mbr.entries[0].type = GRUB_PC_PARTITION_TYPE_GPT_DISK;
mbr.entries[0].start = grub_cpu_to_le32 (1); mbr.entries[0].start = grub_cpu_to_le32_compile_time (1);
lba_to_chs (1, lba_to_chs (1,
&(mbr.entries[0].start_sector), &(mbr.entries[0].start_sector),
&(mbr.entries[0].start_cylinder), &(mbr.entries[0].start_cylinder),
@@ -227,7 +227,7 @@ grub_cmd_gptsync (grub_command_t cmd __attribute__ ((unused)),
&(mbr.entries[0].end_head)); &(mbr.entries[0].end_head));
mbr.entries[0].length = grub_cpu_to_le32 (first_sector); mbr.entries[0].length = grub_cpu_to_le32 (first_sector);
mbr.signature = grub_cpu_to_le16 (GRUB_PC_PARTITION_SIGNATURE); mbr.signature = grub_cpu_to_le16_compile_time (GRUB_PC_PARTITION_SIGNATURE);
if (grub_disk_write (dev->disk, 0, 0, sizeof (mbr), &mbr)) if (grub_disk_write (dev->disk, 0, 0, sizeof (mbr), &mbr))
{ {
@@ -235,6 +235,8 @@ grub_cmd_gptsync (grub_command_t cmd __attribute__ ((unused)),
return grub_errno; return grub_errno;
} }
grub_device_close (dev);
grub_printf_ (N_("New MBR is written to `%s'\n"), args[0]); grub_printf_ (N_("New MBR is written to `%s'\n"), args[0]);
return GRUB_ERR_NONE; return GRUB_ERR_NONE;
+1
View File
@@ -329,6 +329,7 @@ grub_cmd_hdparm (grub_extcmd_context_t ctxt, int argc, char **args)
break; break;
} }
default: default:
grub_disk_close (disk);
return grub_error (GRUB_ERR_IO, "not an ATA device"); return grub_error (GRUB_ERR_IO, "not an ATA device");
} }
+1 -1
View File
@@ -55,7 +55,7 @@ GRUB_MOD_INIT(cmosdump)
{ {
cmd = grub_register_command ("cmosdump", grub_cmd_cmosdump, cmd = grub_register_command ("cmosdump", grub_cmd_cmosdump,
0, 0,
N_("Dump CMOS contents.")); N_("Show raw dump of the CMOS contents."));
} }
GRUB_MOD_FINI(cmosdump) GRUB_MOD_FINI(cmosdump)
+2 -1
View File
@@ -109,9 +109,10 @@ GRUB_MOD_INIT(cmostest)
N_("Test bit at BYTE:BIT in CMOS.")); N_("Test bit at BYTE:BIT in CMOS."));
cmd_clean = grub_register_command ("cmosclean", grub_cmd_cmosclean, cmd_clean = grub_register_command ("cmosclean", grub_cmd_cmosclean,
N_("BYTE:BIT"), N_("BYTE:BIT"),
N_("Clean bit at BYTE:BIT in CMOS.")); N_("Clear bit at BYTE:BIT in CMOS."));
cmd_set = grub_register_command ("cmosset", grub_cmd_cmosset, cmd_set = grub_register_command ("cmosset", grub_cmd_cmosset,
N_("BYTE:BIT"), N_("BYTE:BIT"),
/* TRANSLATORS: A bit may be either set (1) or clear (0). */
N_("Set bit at BYTE:BIT in CMOS.")); N_("Set bit at BYTE:BIT in CMOS."));
} }
@@ -109,7 +109,7 @@ GRUB_MOD_INIT(cbtime)
{ {
cmd_boottime = cmd_boottime =
grub_register_command ("coreboot_boottime", grub_cmd_coreboot_boottime, grub_register_command ("coreboot_boottime", grub_cmd_coreboot_boottime,
0, N_("Get coreboot boot time statistics.")); 0, N_("Show coreboot boot time statistics."));
} }
GRUB_MOD_FINI(cbtime) GRUB_MOD_FINI(cbtime)
+15
View File
@@ -107,6 +107,14 @@ grub_cmd_play (grub_command_t cmd __attribute__ ((unused)),
return grub_errno; return grub_errno;
} }
if (!tempo)
{
grub_file_close (file);
grub_error (GRUB_ERR_BAD_ARGUMENT, N_("Invalid tempo in %s"),
args[0]);
return grub_errno;
}
tempo = grub_le_to_cpu32 (tempo); tempo = grub_le_to_cpu32 (tempo);
grub_dprintf ("play","tempo = %d\n", tempo); grub_dprintf ("play","tempo = %d\n", tempo);
@@ -131,6 +139,13 @@ grub_cmd_play (grub_command_t cmd __attribute__ ((unused)),
tempo = grub_strtoul (args[0], &end, 0); tempo = grub_strtoul (args[0], &end, 0);
if (!tempo)
{
grub_error (GRUB_ERR_BAD_ARGUMENT, N_("Invalid tempo in %s"),
args[0]);
return grub_errno;
}
if (*end) if (*end)
/* Was not a number either, assume it was supposed to be a file name. */ /* Was not a number either, assume it was supposed to be a file name. */
return grub_error (GRUB_ERR_FILE_NOT_FOUND, N_("file `%s' not found"), args[0]); return grub_error (GRUB_ERR_FILE_NOT_FOUND, N_("file `%s' not found"), args[0]);
+4 -6
View File
@@ -292,7 +292,7 @@ find_key_code (char *key)
{ {
unsigned i; unsigned i;
for (i = 0; i < sizeof (keysym_table) / sizeof (keysym_table[0]); i++) for (i = 0; i < ARRAY_SIZE(keysym_table); i++)
{ {
if (keysym_table[i].unshifted_name if (keysym_table[i].unshifted_name
&& grub_strcmp (key, keysym_table[i].unshifted_name) == 0) && grub_strcmp (key, keysym_table[i].unshifted_name) == 0)
@@ -311,7 +311,7 @@ find_ascii_code (char *key)
{ {
unsigned i; unsigned i;
for (i = 0; i < sizeof (keysym_table) / sizeof (keysym_table[0]); i++) for (i = 0; i < ARRAY_SIZE(keysym_table); i++)
{ {
if (keysym_table[i].unshifted_name if (keysym_table[i].unshifted_name
&& grub_strcmp (key, keysym_table[i].unshifted_name) == 0) && grub_strcmp (key, keysym_table[i].unshifted_name) == 0)
@@ -352,15 +352,13 @@ grub_cmd_sendkey (grub_extcmd_context_t ctxt, int argc, char **args)
{ {
unsigned i; unsigned i;
for (i = 0; i < sizeof (simple_flag_offsets) for (i = 0; i < ARRAY_SIZE(simple_flag_offsets); i++)
/ sizeof (simple_flag_offsets[0]); i++)
grub_sendkey_set_simple_flag (simple_flag_offsets[i], grub_sendkey_set_simple_flag (simple_flag_offsets[i],
grub_sendkey_parse_op(state[i])); grub_sendkey_parse_op(state[i]));
} }
/* Set noled. */ /* Set noled. */
noled = (state[sizeof (simple_flag_offsets) noled = (state[ARRAY_SIZE(simple_flag_offsets)].set);
/ sizeof (simple_flag_offsets[0])].set);
return GRUB_ERR_NONE; return GRUB_ERR_NONE;
} }
+3 -1
View File
@@ -173,8 +173,10 @@ grub_term_map_key (grub_keyboard_key_t code, int status)
key = map_key_core (code, status, &alt_gr_consumed); key = map_key_core (code, status, &alt_gr_consumed);
if (key == 0 || key == GRUB_TERM_SHIFT) if (key == 0 || key == GRUB_TERM_SHIFT) {
grub_printf ("Unknown key 0x%x detected\n", code); grub_printf ("Unknown key 0x%x detected\n", code);
return GRUB_TERM_NO_KEY;
}
if (status & GRUB_TERM_STATUS_CAPS) if (status & GRUB_TERM_STATUS_CAPS)
{ {
+13 -2
View File
@@ -57,14 +57,20 @@ legacy_file (const char *filename)
file = grub_file_open (filename); file = grub_file_open (filename);
if (! file) if (! file)
{
grub_free (suffix);
return grub_errno; return grub_errno;
}
menu = grub_env_get_menu (); menu = grub_env_get_menu ();
if (! menu) if (! menu)
{ {
menu = grub_zalloc (sizeof (*menu)); menu = grub_zalloc (sizeof (*menu));
if (! menu) if (! menu)
{
grub_free (suffix);
return grub_errno; return grub_errno;
}
grub_env_set_menu (menu); grub_env_set_menu (menu);
} }
@@ -77,6 +83,7 @@ legacy_file (const char *filename)
if (!buf && grub_errno) if (!buf && grub_errno)
{ {
grub_file_close (file); grub_file_close (file);
grub_free (suffix);
return grub_errno; return grub_errno;
} }
@@ -173,6 +180,8 @@ legacy_file (const char *filename)
if (!args) if (!args)
{ {
grub_file_close (file); grub_file_close (file);
grub_free (suffix);
grub_free (entrysrc);
return grub_errno; return grub_errno;
} }
args[0] = entryname; args[0] = entryname;
@@ -376,6 +385,8 @@ grub_cmd_legacy_kernel (struct grub_command *mycmd __attribute__ ((unused)),
if (part && grub_strcmp (part->partmap->name, "msdos") == 0) if (part && grub_strcmp (part->partmap->name, "msdos") == 0)
bsd_slice = part->number; bsd_slice = part->number;
} }
if (dev)
grub_device_close (dev);
} }
/* k*BSD didn't really work well with grub-legacy. */ /* k*BSD didn't really work well with grub-legacy. */
@@ -580,7 +591,7 @@ check_password_md5_real (const char *entered,
GRUB_MD_MD5->write (ctx, entered, enteredlen); GRUB_MD_MD5->write (ctx, entered, enteredlen);
digest = GRUB_MD_MD5->read (ctx); digest = GRUB_MD_MD5->read (ctx);
GRUB_MD_MD5->final (ctx); GRUB_MD_MD5->final (ctx);
memcpy (alt_result, digest, MD5_HASHLEN); grub_memcpy (alt_result, digest, MD5_HASHLEN);
GRUB_MD_MD5->init (ctx); GRUB_MD_MD5->init (ctx);
GRUB_MD_MD5->write (ctx, entered, enteredlen); GRUB_MD_MD5->write (ctx, entered, enteredlen);
@@ -596,7 +607,7 @@ check_password_md5_real (const char *entered,
for (i = 0; i < 1000; i++) for (i = 0; i < 1000; i++)
{ {
memcpy (alt_result, digest, 16); grub_memcpy (alt_result, digest, 16);
GRUB_MD_MD5->init (ctx); GRUB_MD_MD5->init (ctx);
if ((i & 1) != 0) if ((i & 1) != 0)
+3 -12
View File
@@ -263,7 +263,7 @@ check_blocklists (grub_envblk_t envblk, struct blocklist *blocklists,
for (q = p->next; q; q = q->next) for (q = p->next; q; q = q->next)
{ {
grub_disk_addr_t s1, s2; grub_disk_addr_t s1, s2;
grub_disk_addr_t e1, e2, t; grub_disk_addr_t e1, e2;
s1 = p->sector; s1 = p->sector;
e1 = s1 + ((p->length + GRUB_DISK_SECTOR_SIZE - 1) >> GRUB_DISK_SECTOR_BITS); e1 = s1 + ((p->length + GRUB_DISK_SECTOR_SIZE - 1) >> GRUB_DISK_SECTOR_BITS);
@@ -271,16 +271,7 @@ check_blocklists (grub_envblk_t envblk, struct blocklist *blocklists,
s2 = q->sector; s2 = q->sector;
e2 = s2 + ((q->length + GRUB_DISK_SECTOR_SIZE - 1) >> GRUB_DISK_SECTOR_BITS); e2 = s2 + ((q->length + GRUB_DISK_SECTOR_SIZE - 1) >> GRUB_DISK_SECTOR_BITS);
if (s2 > s1) if (s1 < e2 && s2 < e1)
{
t = s2;
s2 = s1;
s1 = t;
t = e2;
e2 = e1;
e1 = t;
}
if (e1 > s2)
{ {
/* This might be actually valid, but it is unbelievable that /* This might be actually valid, but it is unbelievable that
any filesystem makes such a silly allocation. */ any filesystem makes such a silly allocation. */
@@ -455,7 +446,7 @@ GRUB_MOD_INIT(loadenv)
{ {
cmd_load = cmd_load =
grub_register_extcmd ("load_env", grub_cmd_load_env, 0, grub_register_extcmd ("load_env", grub_cmd_load_env, 0,
N_("[-f FILE] [-s|--skip-sig] [whitelisted_variable_name] [...]"), N_("[-f FILE] [-s|--skip-sig] [variable_name_to_whitelist] [...]"),
N_("Load variables from environment block file."), N_("Load variables from environment block file."),
options); options);
cmd_list = cmd_list =
+8 -9
View File
@@ -37,7 +37,7 @@ struct find_node_context
grub_uint64_t inode_found; grub_uint64_t inode_found;
char *dirname; char *dirname;
enum enum
{ NONE, FILE, DIR } found; { FOUND_NONE, FOUND_FILE, FOUND_DIR } found;
}; };
static int static int
@@ -53,13 +53,13 @@ find_inode (const char *filename,
&& grub_strcasecmp (ctx->dirname, filename) == 0))) && grub_strcasecmp (ctx->dirname, filename) == 0)))
{ {
ctx->inode_found = info->inode; ctx->inode_found = info->inode;
ctx->found = info->dir ? DIR : FILE; ctx->found = info->dir ? FOUND_DIR : FOUND_FILE;
} }
return 0; return 0;
} }
grub_err_t grub_err_t
grub_mac_bless_inode (grub_device_t dev, grub_uint64_t inode, int is_dir, grub_mac_bless_inode (grub_device_t dev, grub_uint32_t inode, int is_dir,
int intel) int intel)
{ {
grub_err_t err; grub_err_t err;
@@ -106,7 +106,7 @@ grub_mac_bless_inode (grub_device_t dev, grub_uint64_t inode, int is_dir,
ablk_size = grub_be_to_cpu32 (volheader.hfs.blksz); ablk_size = grub_be_to_cpu32 (volheader.hfs.blksz);
ablk_start = grub_be_to_cpu16 (volheader.hfs.first_block); ablk_start = grub_be_to_cpu16 (volheader.hfs.first_block);
embedded_offset = (ablk_start embedded_offset = (ablk_start
+ extent_start + ((grub_uint64_t) extent_start)
* (ablk_size >> GRUB_DISK_SECTOR_BITS)); * (ablk_size >> GRUB_DISK_SECTOR_BITS));
err = err =
@@ -174,8 +174,8 @@ grub_mac_bless_file (grub_device_t dev, const char *path_in, int intel)
} }
grub_free (path); grub_free (path);
return grub_mac_bless_inode (dev, ctx.inode_found, (ctx.found == DIR), return grub_mac_bless_inode (dev, (grub_uint32_t) ctx.inode_found,
intel); (ctx.found == FOUND_DIR), intel);
} }
static grub_err_t static grub_err_t
@@ -183,7 +183,7 @@ grub_cmd_macbless (grub_command_t cmd, int argc, char **args)
{ {
char *device_name; char *device_name;
char *path = 0; char *path = 0;
grub_device_t dev; grub_device_t dev = 0;
grub_err_t err; grub_err_t err;
if (argc != 1) if (argc != 1)
@@ -197,13 +197,12 @@ grub_cmd_macbless (grub_command_t cmd, int argc, char **args)
else else
path = path + 1; path = path + 1;
if (!path || *path == 0 || !device_name) if (!path || *path == 0 || !dev)
{ {
if (dev) if (dev)
grub_device_close (dev); grub_device_close (dev);
grub_free (device_name); grub_free (device_name);
grub_free (path);
return grub_error (GRUB_ERR_BAD_ARGUMENT, "invalid argument"); return grub_error (GRUB_ERR_BAD_ARGUMENT, "invalid argument");
} }
+2
View File
@@ -57,6 +57,7 @@ get_uuid (const char *name, char **uuid, int getnative)
if (!dev->disk) if (!dev->disk)
{ {
grub_dprintf ("nativedisk", "Skipping non-disk\n"); grub_dprintf ("nativedisk", "Skipping non-disk\n");
grub_device_close (dev);
return 0; return 0;
} }
@@ -90,6 +91,7 @@ get_uuid (const char *name, char **uuid, int getnative)
case GRUB_DISK_DEVICE_MEMDISK_ID: case GRUB_DISK_DEVICE_MEMDISK_ID:
grub_dprintf ("nativedisk", "Skipping native disk %s\n", grub_dprintf ("nativedisk", "Skipping native disk %s\n",
dev->disk->name); dev->disk->name);
grub_device_close (dev);
return 0; return 0;
/* FIXME: those probably need special handling. */ /* FIXME: those probably need special handling. */
+14 -3
View File
@@ -133,7 +133,7 @@ show_help (grub_device_t dev)
} }
} }
if (! found) if (! found)
grub_printf_ (N_("Sorry no parttool is available for %s\n"), grub_printf_ (N_("Sorry, no parttool is available for %s\n"),
dev->disk->partition->partmap->name); dev->disk->partition->partmap->name);
return GRUB_ERR_NONE; return GRUB_ERR_NONE;
} }
@@ -243,11 +243,19 @@ grub_cmd_parttool (grub_command_t cmd __attribute__ ((unused)),
} }
if (argc == 1) if (argc == 1)
return show_help (dev); {
err = show_help (dev);
grub_device_close (dev);
return err;
}
for (i = 1; i < argc; i++) for (i = 1; i < argc; i++)
if (grub_strcmp (args[i], "help") == 0) if (grub_strcmp (args[i], "help") == 0)
return show_help (dev); {
err = show_help (dev);
grub_device_close (dev);
return err;
}
parsed = (int *) grub_zalloc (argc * sizeof (int)); parsed = (int *) grub_zalloc (argc * sizeof (int));
@@ -274,8 +282,11 @@ grub_cmd_parttool (grub_command_t cmd __attribute__ ((unused)),
break; break;
} }
if (! cur) if (! cur)
{
grub_device_close (dev);
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("unknown argument `%s'"), return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("unknown argument `%s'"),
args[i]); args[i]);
}
ptool = cur; ptool = cur;
pargs = (struct grub_parttool_args *) pargs = (struct grub_parttool_args *)
grub_zalloc (ptool->nargs * sizeof (struct grub_parttool_args)); grub_zalloc (ptool->nargs * sizeof (struct grub_parttool_args));
+1 -1
View File
@@ -166,7 +166,7 @@ GRUB_MOD_INIT(pcidump)
{ {
cmd = grub_register_extcmd ("pcidump", grub_cmd_pcidump, 0, cmd = grub_register_extcmd ("pcidump", grub_cmd_pcidump, 0,
N_("[-s POSITION] [-d DEVICE]"), N_("[-s POSITION] [-d DEVICE]"),
N_("Dump PCI configuration space."), options); N_("Show raw dump of the PCI configuration space."), options);
} }
GRUB_MOD_FINI(pcidump) GRUB_MOD_FINI(pcidump)
+12 -9
View File
@@ -47,14 +47,14 @@ syslinux_file_getline (char **line, int cont __attribute__ ((unused)),
static const struct grub_arg_option options[] = static const struct grub_arg_option options[] =
{ {
{"root", 'r', 0, {"root", 'r', 0,
N_("root directory of the syslinux disk (default /)."), N_("root directory of the syslinux disk [default=/]."),
N_("DIR"), ARG_TYPE_STRING}, N_("DIR"), ARG_TYPE_STRING},
{"cwd", 'c', 0, {"cwd", 'c', 0,
N_("home directory of the syslinux config (default directory of configfile)."), N_("current directory of syslinux [default is parent directory of input file]."),
N_("DIR"), ARG_TYPE_STRING}, N_("DIR"), ARG_TYPE_STRING},
{"isolinux", 'i', 0, N_("assume isolinux."), 0, 0}, {"isolinux", 'i', 0, N_("assume input is an isolinux configuration file."), 0, 0},
{"pxelinux", 'p', 0, N_("assume pxelinux."), 0, 0}, {"pxelinux", 'p', 0, N_("assume input is a pxelinux configuration file."), 0, 0},
{"syslinux", 's', 0, N_("assume syslinux."), 0, 0}, {"syslinux", 's', 0, N_("assume input is a syslinux configuration file."), 0, 0},
{0, 0, 0, 0, 0, 0} {0, 0, 0, 0, 0, 0}
}; };
@@ -119,7 +119,10 @@ syslinux_file (grub_extcmd_context_t ctxt, const char *filename)
{ {
menu = grub_zalloc (sizeof (*menu)); menu = grub_zalloc (sizeof (*menu));
if (! menu) if (! menu)
{
grub_free (result);
return grub_errno; return grub_errno;
}
grub_env_set_menu (menu); grub_env_set_menu (menu);
} }
@@ -183,25 +186,25 @@ GRUB_MOD_INIT(syslinuxcfg)
N_("FILE"), N_("FILE"),
/* TRANSLATORS: "syslinux config" means /* TRANSLATORS: "syslinux config" means
"config as used by syslinux". */ "config as used by syslinux". */
N_("Parse syslinux config in same context"), N_("Execute syslinux config in same context"),
options); options);
cmd_configfile cmd_configfile
= grub_register_extcmd ("syslinux_configfile", = grub_register_extcmd ("syslinux_configfile",
grub_cmd_syslinux_source, 0, grub_cmd_syslinux_source, 0,
N_("FILE"), N_("FILE"),
N_("Parse syslinux config in new context"), N_("Execute syslinux config in new context"),
options); options);
cmd_source_extract cmd_source_extract
= grub_register_extcmd ("extract_syslinux_entries_source", = grub_register_extcmd ("extract_syslinux_entries_source",
grub_cmd_syslinux_source, 0, grub_cmd_syslinux_source, 0,
N_("FILE"), N_("FILE"),
N_("Parse syslinux config in same context taking only menu entries"), N_("Execute syslinux config in same context taking only menu entries"),
options); options);
cmd_configfile_extract cmd_configfile_extract
= grub_register_extcmd ("extract_syslinux_entries_configfile", = grub_register_extcmd ("extract_syslinux_entries_configfile",
grub_cmd_syslinux_source, 0, grub_cmd_syslinux_source, 0,
N_("FILE"), N_("FILE"),
N_("Parse syslinux config in new context taking only menu entries"), N_("Execute syslinux config in new context taking only menu entries"),
options); options);
} }
+4 -4
View File
@@ -332,7 +332,7 @@ test_parse (char **args, int *argn, int argc)
get_fileinfo (args[*argn + 1], &ctx); get_fileinfo (args[*argn + 1], &ctx);
update_val (ctx.file_exists && ctx.file_info.dir, &ctx); update_val (ctx.file_exists && ctx.file_info.dir, &ctx);
(*argn) += 2; (*argn) += 2;
return ctx.or || ctx.and; continue;
} }
if (grub_strcmp (args[*argn], "-e") == 0) if (grub_strcmp (args[*argn], "-e") == 0)
@@ -340,7 +340,7 @@ test_parse (char **args, int *argn, int argc)
get_fileinfo (args[*argn + 1], &ctx); get_fileinfo (args[*argn + 1], &ctx);
update_val (ctx.file_exists, &ctx); update_val (ctx.file_exists, &ctx);
(*argn) += 2; (*argn) += 2;
return ctx.or || ctx.and; continue;
} }
if (grub_strcmp (args[*argn], "-f") == 0) if (grub_strcmp (args[*argn], "-f") == 0)
@@ -349,7 +349,7 @@ test_parse (char **args, int *argn, int argc)
/* FIXME: check for other types. */ /* FIXME: check for other types. */
update_val (ctx.file_exists && ! ctx.file_info.dir, &ctx); update_val (ctx.file_exists && ! ctx.file_info.dir, &ctx);
(*argn) += 2; (*argn) += 2;
return ctx.or || ctx.and; continue;
} }
if (grub_strcmp (args[*argn], "-s") == 0) if (grub_strcmp (args[*argn], "-s") == 0)
@@ -362,7 +362,7 @@ test_parse (char **args, int *argn, int argc)
grub_file_close (file); grub_file_close (file);
grub_errno = GRUB_ERR_NONE; grub_errno = GRUB_ERR_NONE;
(*argn) += 2; (*argn) += 2;
return ctx.or || ctx.and; continue;
} }
/* String tests. */ /* String tests. */
+1 -1
View File
@@ -80,7 +80,7 @@ grub_cmd_tr (grub_extcmd_context_t ctxt, int argc, char **args)
} else if (argc > 3) } else if (argc > 3)
return grub_error (GRUB_ERR_BAD_ARGUMENT, "too many parameters"); return grub_error (GRUB_ERR_BAD_ARGUMENT, "too many parameters");
if (argc <= 0 && (!s1 || !s2 || !input)) if (!s1 || !s2 || !input)
return grub_error (GRUB_ERR_BAD_ARGUMENT, "missing parameters"); return grub_error (GRUB_ERR_BAD_ARGUMENT, "missing parameters");
if (grub_strlen (s1) != grub_strlen (s2)) if (grub_strlen (s1) != grub_strlen (s2))
+69 -19
View File
@@ -33,6 +33,13 @@
GRUB_MOD_LICENSE ("GPLv3+"); GRUB_MOD_LICENSE ("GPLv3+");
struct grub_verified
{
grub_file_t file;
void *buf;
};
typedef struct grub_verified *grub_verified_t;
enum enum
{ {
OPTION_SKIP_SIG = 0 OPTION_SKIP_SIG = 0
@@ -41,7 +48,7 @@ enum
static const struct grub_arg_option options[] = static const struct grub_arg_option options[] =
{ {
{"skip-sig", 's', 0, {"skip-sig", 's', 0,
N_("Skip signature-checking of the signature file."), 0, ARG_TYPE_NONE}, N_("Skip signature-checking of the public key file."), 0, ARG_TYPE_NONE},
{0, 0, 0, 0, 0, 0} {0, 0, 0, 0, 0, 0}
}; };
@@ -301,7 +308,7 @@ grub_load_public_key (grub_file_t f)
if (!sk) if (!sk)
goto fail; goto fail;
grub_memset (fingerprint_context, 0, sizeof (fingerprint_context)); grub_memset (fingerprint_context, 0, GRUB_MD_SHA1->contextsize);
GRUB_MD_SHA1->init (fingerprint_context); GRUB_MD_SHA1->init (fingerprint_context);
GRUB_MD_SHA1->write (fingerprint_context, "\x99", 1); GRUB_MD_SHA1->write (fingerprint_context, "\x99", 1);
len_be = grub_cpu_to_be16 (len); len_be = grub_cpu_to_be16 (len);
@@ -802,19 +809,39 @@ grub_cmd_verify_signature (grub_extcmd_context_t ctxt,
static int sec = 0; static int sec = 0;
static void
verified_free (grub_verified_t verified)
{
if (verified)
{
grub_free (verified->buf);
grub_free (verified);
}
}
static grub_ssize_t static grub_ssize_t
verified_read (struct grub_file *file, char *buf, grub_size_t len) verified_read (struct grub_file *file, char *buf, grub_size_t len)
{ {
grub_memcpy (buf, (char *) file->data + file->offset, len); grub_verified_t verified = file->data;
grub_memcpy (buf, (char *) verified->buf + file->offset, len);
return len; return len;
} }
static grub_err_t static grub_err_t
verified_close (struct grub_file *file) verified_close (struct grub_file *file)
{ {
grub_free (file->data); grub_verified_t verified = file->data;
grub_file_close (verified->file);
verified_free (verified);
file->data = 0; file->data = 0;
return GRUB_ERR_NONE;
/* device and name are freed by parent */
file->device = 0;
file->name = 0;
return grub_errno;
} }
struct grub_fs verified_fs = struct grub_fs verified_fs =
@@ -832,10 +859,13 @@ grub_pubkey_open (grub_file_t io, const char *filename)
grub_err_t err; grub_err_t err;
grub_file_filter_t curfilt[GRUB_FILE_FILTER_MAX]; grub_file_filter_t curfilt[GRUB_FILE_FILTER_MAX];
grub_file_t ret; grub_file_t ret;
grub_verified_t verified;
if (!sec) if (!sec)
return io; return io;
if (io->device->disk && io->device->disk->id == GRUB_DISK_DEVICE_MEMDISK_ID) if (io->device->disk &&
(io->device->disk->dev->id == GRUB_DISK_DEVICE_MEMDISK_ID
|| io->device->disk->dev->id == GRUB_DISK_DEVICE_PROCFS_ID))
return io; return io;
fsuf = grub_malloc (grub_strlen (filename) + sizeof (".sig")); fsuf = grub_malloc (grub_strlen (filename) + sizeof (".sig"));
if (!fsuf) if (!fsuf)
@@ -855,7 +885,10 @@ grub_pubkey_open (grub_file_t io, const char *filename)
ret = grub_malloc (sizeof (*ret)); ret = grub_malloc (sizeof (*ret));
if (!ret) if (!ret)
{
grub_file_close (sig);
return NULL; return NULL;
}
*ret = *io; *ret = *io;
ret->fs = &verified_fs; ret->fs = &verified_fs;
@@ -864,29 +897,46 @@ grub_pubkey_open (grub_file_t io, const char *filename)
{ {
grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
"big file signature isn't implemented yet"); "big file signature isn't implemented yet");
return NULL; grub_file_close (sig);
}
ret->data = grub_malloc (ret->size);
if (!ret->data)
{
grub_free (ret); grub_free (ret);
return NULL; return NULL;
} }
if (grub_file_read (io, ret->data, ret->size) != (grub_ssize_t) ret->size) verified = grub_malloc (sizeof (*verified));
if (!verified)
{
grub_file_close (sig);
grub_free (ret);
return NULL;
}
verified->buf = grub_malloc (ret->size);
if (!verified->buf)
{
grub_file_close (sig);
grub_free (verified);
grub_free (ret);
return NULL;
}
if (grub_file_read (io, verified->buf, ret->size) != (grub_ssize_t) ret->size)
{ {
if (!grub_errno) if (!grub_errno)
grub_error (GRUB_ERR_FILE_READ_ERROR, N_("premature end of file %s"), grub_error (GRUB_ERR_FILE_READ_ERROR, N_("premature end of file %s"),
filename); filename);
grub_file_close (sig);
verified_free (verified);
grub_free (ret);
return NULL; return NULL;
} }
err = grub_verify_signature_real (ret->data, ret->size, 0, sig, NULL); err = grub_verify_signature_real (verified->buf, ret->size, 0, sig, NULL);
grub_file_close (sig); grub_file_close (sig);
if (err) if (err)
{
verified_free (verified);
grub_free (ret);
return NULL; return NULL;
io->device = 0; }
io->name = 0; verified->file = io;
grub_file_close (io); ret->data = verified;
return ret; return ret;
} }
@@ -966,14 +1016,14 @@ GRUB_MOD_INIT(verify)
options); options);
cmd_trust = grub_register_extcmd ("trust", grub_cmd_trust, 0, cmd_trust = grub_register_extcmd ("trust", grub_cmd_trust, 0,
N_("[-s|--skip-sig] PUBKEY_FILE"), N_("[-s|--skip-sig] PUBKEY_FILE"),
N_("Add PKFILE to trusted keys."), N_("Add PUBKEY_FILE to trusted keys."),
options); options);
cmd_list = grub_register_command ("list_trusted", grub_cmd_list, cmd_list = grub_register_command ("list_trusted", grub_cmd_list,
0, 0,
N_("List trusted keys.")); N_("Show the list of trusted keys."));
cmd_distrust = grub_register_command ("distrust", grub_cmd_distrust, cmd_distrust = grub_register_command ("distrust", grub_cmd_distrust,
N_("PUBKEY_ID"), N_("PUBKEY_ID"),
N_("Remove KEYID from trusted keys.")); N_("Remove PUBKEY_ID from trusted keys."));
} }
GRUB_MOD_FINI(verify) GRUB_MOD_FINI(verify)
+5 -1
View File
@@ -245,7 +245,10 @@ match_devices_iter (const char *name, void *data)
t = grub_realloc (ctx->devs, sizeof (char*) * (ctx->ndev + 2)); t = grub_realloc (ctx->devs, sizeof (char*) * (ctx->ndev + 2));
if (! t) if (! t)
{
grub_free (buffer);
return 1; return 1;
}
ctx->devs = t; ctx->devs = t;
ctx->devs[ctx->ndev++] = buffer; ctx->devs[ctx->ndev++] = buffer;
@@ -290,7 +293,8 @@ struct match_files_ctx
/* Helper for match_files. */ /* Helper for match_files. */
static int static int
match_files_iter (const char *name, const struct grub_dirhook_info *info, match_files_iter (const char *name,
const struct grub_dirhook_info *info __attribute__((unused)),
void *data) void *data)
{ {
struct match_files_ctx *ctx = data; struct match_files_ctx *ctx = data;
+2 -2
View File
@@ -78,9 +78,9 @@ static grub_command_t cmd_ls, cmd_cat;
GRUB_MOD_INIT (lsxen) GRUB_MOD_INIT (lsxen)
{ {
cmd_ls = grub_register_command ("xen_ls", grub_cmd_lsxen, N_("[DIR]"), cmd_ls = grub_register_command ("xen_ls", grub_cmd_lsxen, N_("[DIR]"),
N_("List XEN storage.")); N_("List Xen storage."));
cmd_cat = grub_register_command ("xen_cat", grub_cmd_catxen, N_("[DIR]"), cmd_cat = grub_register_command ("xen_cat", grub_cmd_catxen, N_("[DIR]"),
N_("List XEN storage.")); N_("List Xen storage."));
} }
GRUB_MOD_FINI (lsxen) GRUB_MOD_FINI (lsxen)
+3 -3
View File
@@ -72,13 +72,13 @@ AF_merge (const gcry_md_spec_t * hash, grub_uint8_t * src, grub_uint8_t * dst,
grub_size_t i; grub_size_t i;
grub_uint8_t *bufblock; grub_uint8_t *bufblock;
if (hash->mdlen > GRUB_CRYPTO_MAX_MDLEN || hash->mdlen == 0)
return GPG_ERR_INV_ARG;
bufblock = grub_zalloc (blocksize); bufblock = grub_zalloc (blocksize);
if (bufblock == NULL) if (bufblock == NULL)
return GPG_ERR_OUT_OF_MEMORY; return GPG_ERR_OUT_OF_MEMORY;
if (hash->mdlen > GRUB_CRYPTO_MAX_MDLEN)
return GPG_ERR_INV_ARG;
grub_memset (bufblock, 0, blocksize); grub_memset (bufblock, 0, blocksize);
for (i = 0; i < blocknumbers - 1; i++) for (i = 0; i < blocknumbers - 1; i++)
{ {
+30 -9
View File
@@ -194,13 +194,11 @@ grub_ahci_pciinit (grub_pci_device_t dev,
return 0; return 0;
addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND); addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
grub_pci_write_word (addr, grub_pci_read_word (addr) | grub_pci_write_word (addr, grub_pci_read_word (addr)
GRUB_PCI_COMMAND_IO_ENABLED | GRUB_PCI_COMMAND_MEM_ENABLED);
| GRUB_PCI_COMMAND_MEM_ENABLED
| GRUB_PCI_COMMAND_BUS_MASTER);
hba = grub_pci_device_map_range (dev, bar & GRUB_PCI_ADDR_MEM_MASK, hba = grub_pci_device_map_range (dev, bar & GRUB_PCI_ADDR_MEM_MASK,
sizeof (hba)); sizeof (*hba));
grub_dprintf ("ahci", "dev: %x:%x.%x\n", dev.bus, dev.device, dev.function); grub_dprintf ("ahci", "dev: %x:%x.%x\n", dev.bus, dev.device, dev.function);
grub_dprintf ("ahci", "tfd[0]: %x\n", grub_dprintf ("ahci", "tfd[0]: %x\n",
@@ -324,7 +322,7 @@ grub_ahci_pciinit (grub_pci_device_t dev,
grub_dprintf ("ahci", "GLC:%x\n", hba->global_control); grub_dprintf ("ahci", "GLC:%x\n", hba->global_control);
nports = (hba->cap & GRUB_AHCI_HBA_CAP_NPORTS_MASK) + 1; nports = (GRUB_AHCI_HBA_CAP_NPORTS_MASK) + 1;
grub_dprintf ("ahci", "%d AHCI ports, PI = 0x%x\n", nports, grub_dprintf ("ahci", "%d AHCI ports, PI = 0x%x\n", nports,
hba->ports_implemented); hba->ports_implemented);
@@ -360,7 +358,7 @@ grub_ahci_pciinit (grub_pci_device_t dev,
grub_dprintf ("ahci", "err: %x\n", grub_dprintf ("ahci", "err: %x\n",
adevs[i]->hba->ports[adevs[i]->port].sata_error); adevs[i]->hba->ports[adevs[i]->port].sata_error);
adevs[i]->command_list_chunk = grub_memalign_dma32 (1024, sizeof (struct grub_ahci_cmd_head)); adevs[i]->command_list_chunk = grub_memalign_dma32 (1024, sizeof (struct grub_ahci_cmd_head) * 32);
if (!adevs[i]->command_list_chunk) if (!adevs[i]->command_list_chunk)
{ {
adevs[i] = 0; adevs[i] = 0;
@@ -378,6 +376,12 @@ grub_ahci_pciinit (grub_pci_device_t dev,
adevs[i]->command_list = grub_dma_get_virt (adevs[i]->command_list_chunk); adevs[i]->command_list = grub_dma_get_virt (adevs[i]->command_list_chunk);
adevs[i]->command_table = grub_dma_get_virt (adevs[i]->command_table_chunk); adevs[i]->command_table = grub_dma_get_virt (adevs[i]->command_table_chunk);
grub_memset ((void *) adevs[i]->command_list, 0,
sizeof (struct grub_ahci_cmd_table));
grub_memset ((void *) adevs[i]->command_table, 0,
sizeof (struct grub_ahci_cmd_head) * 32);
adevs[i]->command_list->command_table_base adevs[i]->command_list->command_table_base
= grub_dma_get_phys (adevs[i]->command_table_chunk); = grub_dma_get_phys (adevs[i]->command_table_chunk);
@@ -450,6 +454,7 @@ grub_ahci_pciinit (grub_pci_device_t dev,
adevs[i]->hba->ports[adevs[i]->port].fis_base = grub_dma_get_phys (adevs[i]->rfis); adevs[i]->hba->ports[adevs[i]->port].fis_base = grub_dma_get_phys (adevs[i]->rfis);
adevs[i]->hba->ports[adevs[i]->port].command_list_base adevs[i]->hba->ports[adevs[i]->port].command_list_base
= grub_dma_get_phys (adevs[i]->command_list_chunk); = grub_dma_get_phys (adevs[i]->command_list_chunk);
adevs[i]->hba->ports[adevs[i]->port].command_issue = 0;
adevs[i]->hba->ports[adevs[i]->port].command |= GRUB_AHCI_HBA_PORT_CMD_FRE; adevs[i]->hba->ports[adevs[i]->port].command |= GRUB_AHCI_HBA_PORT_CMD_FRE;
} }
@@ -596,6 +601,9 @@ grub_ahci_pciinit (grub_pci_device_t dev,
failed_adevs[i] = adevs[i]; failed_adevs[i] = adevs[i];
adevs[i] = 0; adevs[i] = 0;
} }
grub_dprintf ("ahci", "cleaning up failed devs\n");
for (i = 0; i < nports; i++) for (i = 0; i < nports; i++)
if (failed_adevs[i] && (fr_running & (1 << i))) if (failed_adevs[i] && (fr_running & (1 << i)))
failed_adevs[i]->hba->ports[failed_adevs[i]->port].command &= ~GRUB_AHCI_HBA_PORT_CMD_FRE; failed_adevs[i]->hba->ports[failed_adevs[i]->port].command &= ~GRUB_AHCI_HBA_PORT_CMD_FRE;
@@ -621,6 +629,10 @@ grub_ahci_pciinit (grub_pci_device_t dev,
if (adevs[i] && (adevs[i]->hba->ports[adevs[i]->port].sig >> 16) == 0xeb14) if (adevs[i] && (adevs[i]->hba->ports[adevs[i]->port].sig >> 16) == 0xeb14)
adevs[i]->atapi = 1; adevs[i]->atapi = 1;
addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
grub_pci_write_word (addr, grub_pci_read_word (addr)
| GRUB_PCI_COMMAND_BUS_MASTER);
for (i = 0; i < nports; i++) for (i = 0; i < nports; i++)
if (adevs[i]) if (adevs[i])
{ {
@@ -847,6 +859,12 @@ grub_ahci_reset_port (struct grub_ahci_device *dev, int force)
{ {
struct grub_disk_ata_pass_through_parms parms2; struct grub_disk_ata_pass_through_parms parms2;
dev->hba->ports[dev->port].command &= ~GRUB_AHCI_HBA_PORT_CMD_ST; dev->hba->ports[dev->port].command &= ~GRUB_AHCI_HBA_PORT_CMD_ST;
dev->hba->ports[dev->port].command_issue = 0;
dev->command_list[0].config = 0;
dev->command_table[0].prdt[0].unused = 0;
dev->command_table[0].prdt[0].size = 0;
dev->command_table[0].prdt[0].data_base = 0;
endtime = grub_get_time_ms () + 1000; endtime = grub_get_time_ms () + 1000;
while ((dev->hba->ports[dev->port].command & GRUB_AHCI_HBA_PORT_CMD_CR)) while ((dev->hba->ports[dev->port].command & GRUB_AHCI_HBA_PORT_CMD_CR))
if (grub_get_time_ms () > endtime) if (grub_get_time_ms () > endtime)
@@ -914,7 +932,10 @@ grub_ahci_readwrite_real (struct grub_ahci_device *dev,
if (parms->size > GRUB_AHCI_PRDT_MAX_CHUNK_LENGTH) if (parms->size > GRUB_AHCI_PRDT_MAX_CHUNK_LENGTH)
return grub_error (GRUB_ERR_BUG, "too big data buffer"); return grub_error (GRUB_ERR_BUG, "too big data buffer");
if (parms->size)
bufc = grub_memalign_dma32 (1024, parms->size + (parms->size & 1)); bufc = grub_memalign_dma32 (1024, parms->size + (parms->size & 1));
else
bufc = grub_memalign_dma32 (1024, 512);
grub_dprintf ("ahci", "AHCI tfd = %x, CL=%p\n", grub_dprintf ("ahci", "AHCI tfd = %x, CL=%p\n",
dev->hba->ports[dev->port].task_file_data, dev->hba->ports[dev->port].task_file_data,
@@ -924,7 +945,7 @@ grub_ahci_readwrite_real (struct grub_ahci_device *dev,
= (5 << GRUB_AHCI_CONFIG_CFIS_LENGTH_SHIFT) = (5 << GRUB_AHCI_CONFIG_CFIS_LENGTH_SHIFT)
// | GRUB_AHCI_CONFIG_CLEAR_R_OK // | GRUB_AHCI_CONFIG_CLEAR_R_OK
| (0 << GRUB_AHCI_CONFIG_PMP_SHIFT) | (0 << GRUB_AHCI_CONFIG_PMP_SHIFT)
| (1 << GRUB_AHCI_CONFIG_PRDT_LENGTH_SHIFT) | ((parms->size ? 1 : 0) << GRUB_AHCI_CONFIG_PRDT_LENGTH_SHIFT)
| (parms->cmdsize ? GRUB_AHCI_CONFIG_ATAPI : 0) | (parms->cmdsize ? GRUB_AHCI_CONFIG_ATAPI : 0)
| (parms->write ? GRUB_AHCI_CONFIG_WRITE : GRUB_AHCI_CONFIG_READ) | (parms->write ? GRUB_AHCI_CONFIG_WRITE : GRUB_AHCI_CONFIG_READ)
| (parms->taskfile.cmd == 8 ? (1 << 8) : 0); | (parms->taskfile.cmd == 8 ? (1 << 8) : 0);
@@ -1001,7 +1022,7 @@ grub_ahci_readwrite_real (struct grub_ahci_device *dev,
grub_dprintf ("ahci", "AHCI tfd = %x\n", grub_dprintf ("ahci", "AHCI tfd = %x\n",
dev->hba->ports[dev->port].task_file_data); dev->hba->ports[dev->port].task_file_data);
endtime = grub_get_time_ms () + (spinup ? 10000 : 5000); 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)
{ {
+6
View File
@@ -216,6 +216,12 @@ grub_ata_setaddress (struct grub_ata *dev,
unsigned int head; unsigned int head;
unsigned int sect; unsigned int sect;
if (dev->sectors_per_track == 0
|| dev->heads == 0)
return grub_error (GRUB_ERR_OUT_OF_RANGE,
"sector %d cannot be addressed "
"using CHS addressing", sector);
/* Calculate the sector, cylinder and head to use. */ /* Calculate the sector, cylinder and head to use. */
sect = ((grub_uint32_t) sector % dev->sectors_per_track) + 1; sect = ((grub_uint32_t) sector % dev->sectors_per_track) + 1;
cylinder = (((grub_uint32_t) sector / dev->sectors_per_track) cylinder = (((grub_uint32_t) sector / dev->sectors_per_track)
+35 -26
View File
@@ -110,20 +110,23 @@ grub_crypto_pcbc_decrypt (grub_crypto_cipher_handle_t cipher,
{ {
grub_uint8_t *inptr, *outptr, *end; grub_uint8_t *inptr, *outptr, *end;
grub_uint8_t ivt[GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE]; grub_uint8_t ivt[GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE];
if (cipher->cipher->blocksize > GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE) grub_size_t blocksize;
return GPG_ERR_INV_ARG;
if (!cipher->cipher->decrypt) if (!cipher->cipher->decrypt)
return GPG_ERR_NOT_SUPPORTED; return GPG_ERR_NOT_SUPPORTED;
if (size % cipher->cipher->blocksize != 0) blocksize = cipher->cipher->blocksize;
if (blocksize == 0 || (((blocksize - 1) & blocksize) != 0)
|| ((size & (blocksize - 1)) != 0))
return GPG_ERR_INV_ARG;
if (blocksize > GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE)
return GPG_ERR_INV_ARG; return GPG_ERR_INV_ARG;
end = (grub_uint8_t *) in + size; end = (grub_uint8_t *) in + size;
for (inptr = in, outptr = out; inptr < end; for (inptr = in, outptr = out; inptr < end;
inptr += cipher->cipher->blocksize, outptr += cipher->cipher->blocksize) inptr += blocksize, outptr += blocksize)
{ {
grub_memcpy (ivt, inptr, cipher->cipher->blocksize); grub_memcpy (ivt, inptr, blocksize);
cipher->cipher->decrypt (cipher->ctx, outptr, inptr); cipher->cipher->decrypt (cipher->ctx, outptr, inptr);
grub_crypto_xor (outptr, outptr, iv, cipher->cipher->blocksize); grub_crypto_xor (outptr, outptr, iv, blocksize);
grub_crypto_xor (iv, ivt, outptr, cipher->cipher->blocksize); grub_crypto_xor (iv, ivt, outptr, blocksize);
} }
return GPG_ERR_NO_ERROR; return GPG_ERR_NO_ERROR;
} }
@@ -135,20 +138,23 @@ grub_crypto_pcbc_encrypt (grub_crypto_cipher_handle_t cipher,
{ {
grub_uint8_t *inptr, *outptr, *end; grub_uint8_t *inptr, *outptr, *end;
grub_uint8_t ivt[GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE]; grub_uint8_t ivt[GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE];
if (cipher->cipher->blocksize > GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE) grub_size_t blocksize;
return GPG_ERR_INV_ARG; if (!cipher->cipher->encrypt)
if (!cipher->cipher->decrypt)
return GPG_ERR_NOT_SUPPORTED; return GPG_ERR_NOT_SUPPORTED;
if (size % cipher->cipher->blocksize != 0) blocksize = cipher->cipher->blocksize;
if (blocksize > GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE)
return GPG_ERR_INV_ARG;
if (blocksize == 0 || (((blocksize - 1) & blocksize) != 0)
|| ((size & (blocksize - 1)) != 0))
return GPG_ERR_INV_ARG; return GPG_ERR_INV_ARG;
end = (grub_uint8_t *) in + size; end = (grub_uint8_t *) in + size;
for (inptr = in, outptr = out; inptr < end; for (inptr = in, outptr = out; inptr < end;
inptr += cipher->cipher->blocksize, outptr += cipher->cipher->blocksize) inptr += blocksize, outptr += blocksize)
{ {
grub_memcpy (ivt, inptr, cipher->cipher->blocksize); grub_memcpy (ivt, inptr, blocksize);
grub_crypto_xor (outptr, outptr, iv, cipher->cipher->blocksize); grub_crypto_xor (outptr, outptr, iv, blocksize);
cipher->cipher->encrypt (cipher->ctx, outptr, inptr); cipher->cipher->encrypt (cipher->ctx, outptr, inptr);
grub_crypto_xor (iv, ivt, outptr, cipher->cipher->blocksize); grub_crypto_xor (iv, ivt, outptr, blocksize);
} }
return GPG_ERR_NO_ERROR; return GPG_ERR_NO_ERROR;
} }
@@ -372,11 +378,13 @@ grub_cryptodisk_endecrypt (struct grub_cryptodisk *dev,
break; break;
case GRUB_CRYPTODISK_MODE_ECB: case GRUB_CRYPTODISK_MODE_ECB:
if (do_encrypt) if (do_encrypt)
grub_crypto_ecb_encrypt (dev->cipher, data + i, data + i, err = grub_crypto_ecb_encrypt (dev->cipher, data + i, data + i,
(1U << dev->log_sector_size)); (1U << dev->log_sector_size));
else else
grub_crypto_ecb_decrypt (dev->cipher, data + i, data + i, err = grub_crypto_ecb_decrypt (dev->cipher, data + i, data + i,
(1U << dev->log_sector_size)); (1U << dev->log_sector_size));
if (err)
return err;
break; break;
default: default:
return GPG_ERR_NOT_IMPLEMENTED; return GPG_ERR_NOT_IMPLEMENTED;
@@ -762,25 +770,26 @@ grub_cryptodisk_cheat_insert (grub_cryptodisk_t newdev, const char *name,
void void
grub_util_cryptodisk_get_abstraction (grub_disk_t disk, grub_util_cryptodisk_get_abstraction (grub_disk_t disk,
void (*cb) (const char *val)) void (*cb) (const char *val, void *data),
void *data)
{ {
grub_cryptodisk_t dev = (grub_cryptodisk_t) disk->data; grub_cryptodisk_t dev = (grub_cryptodisk_t) disk->data;
cb ("cryptodisk"); cb ("cryptodisk", data);
cb (dev->modname); cb (dev->modname, data);
if (dev->cipher) if (dev->cipher)
cb (dev->cipher->cipher->modname); cb (dev->cipher->cipher->modname, data);
if (dev->secondary_cipher) if (dev->secondary_cipher)
cb (dev->secondary_cipher->cipher->modname); cb (dev->secondary_cipher->cipher->modname, data);
if (dev->essiv_cipher) if (dev->essiv_cipher)
cb (dev->essiv_cipher->cipher->modname); cb (dev->essiv_cipher->cipher->modname, data);
if (dev->hash) if (dev->hash)
cb (dev->hash->modname); cb (dev->hash->modname, data);
if (dev->essiv_hash) if (dev->essiv_hash)
cb (dev->essiv_hash->modname); cb (dev->essiv_hash->modname, data);
if (dev->iv_hash) if (dev->iv_hash)
cb (dev->iv_hash->modname); cb (dev->iv_hash->modname, data);
} }
const char * const char *
+147 -13
View File
@@ -71,10 +71,12 @@ is_lv_readable (struct grub_diskfilter_lv *lv, int easily)
case GRUB_DISKFILTER_RAID6: case GRUB_DISKFILTER_RAID6:
if (!easily) if (!easily)
need--; need--;
/* Fallthrough. */
case GRUB_DISKFILTER_RAID4: case GRUB_DISKFILTER_RAID4:
case GRUB_DISKFILTER_RAID5: case GRUB_DISKFILTER_RAID5:
if (!easily) if (!easily)
need--; need--;
/* Fallthrough. */
case GRUB_DISKFILTER_STRIPED: case GRUB_DISKFILTER_STRIPED:
break; break;
@@ -354,7 +356,8 @@ grub_diskfilter_memberlist (grub_disk_t disk)
void void
grub_diskfilter_get_partmap (grub_disk_t disk, grub_diskfilter_get_partmap (grub_disk_t disk,
void (*cb) (const char *pm)) void (*cb) (const char *pm, void *data),
void *data)
{ {
struct grub_diskfilter_lv *lv = disk->data; struct grub_diskfilter_lv *lv = disk->data;
struct grub_diskfilter_pv *pv; struct grub_diskfilter_pv *pv;
@@ -376,7 +379,7 @@ grub_diskfilter_get_partmap (grub_disk_t disk,
continue; continue;
} }
for (s = 0; pv->partmaps[s]; s++) for (s = 0; pv->partmaps[s]; s++)
cb (pv->partmaps[s]); cb (pv->partmaps[s], data);
} }
} }
@@ -482,6 +485,96 @@ grub_diskfilter_read_node (const struct grub_diskfilter_node *node,
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "unknown node '%s'", node->name); return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "unknown node '%s'", node->name);
} }
static grub_err_t
validate_segment (struct grub_diskfilter_segment *seg);
static grub_err_t
validate_lv (struct grub_diskfilter_lv *lv)
{
unsigned int i;
if (!lv)
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "unknown volume");
if (!lv->vg || lv->vg->extent_size == 0)
return grub_error (GRUB_ERR_READ_ERROR, "invalid volume");
for (i = 0; i < lv->segment_count; i++)
{
grub_err_t err;
err = validate_segment (&lv->segments[i]);
if (err)
return err;
}
return GRUB_ERR_NONE;
}
static grub_err_t
validate_node (const struct grub_diskfilter_node *node)
{
/* Check whether we actually know the physical volume we want to
read from. */
if (node->pv)
return GRUB_ERR_NONE;
if (node->lv)
return validate_lv (node->lv);
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "unknown node '%s'", node->name);
}
static grub_err_t
validate_segment (struct grub_diskfilter_segment *seg)
{
grub_err_t err;
if (seg->stripe_size == 0 || seg->node_count == 0)
return grub_error(GRUB_ERR_BAD_FS, "invalid segment");
switch (seg->type)
{
case GRUB_DISKFILTER_RAID10:
{
grub_uint8_t near, far;
near = seg->layout & 0xFF;
far = (seg->layout >> 8) & 0xFF;
if ((seg->layout >> 16) == 0 && far == 0)
return grub_error(GRUB_ERR_BAD_FS, "invalid segment");
if (near > seg->node_count)
return grub_error(GRUB_ERR_BAD_FS, "invalid segment");
break;
}
case GRUB_DISKFILTER_STRIPED:
case GRUB_DISKFILTER_MIRROR:
break;
case GRUB_DISKFILTER_RAID4:
case GRUB_DISKFILTER_RAID5:
if (seg->node_count <= 1)
return grub_error(GRUB_ERR_BAD_FS, "invalid segment");
break;
case GRUB_DISKFILTER_RAID6:
if (seg->node_count <= 2)
return grub_error(GRUB_ERR_BAD_FS, "invalid segment");
break;
default:
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
"unsupported RAID level %d", seg->type);
}
unsigned i;
for (i = 0; i < seg->node_count; i++)
{
err = validate_node (&seg->nodes[i]);
if (err)
return err;
}
return GRUB_ERR_NONE;
}
static grub_err_t static grub_err_t
read_segment (struct grub_diskfilter_segment *seg, grub_disk_addr_t sector, read_segment (struct grub_diskfilter_segment *seg, grub_disk_addr_t sector,
grub_size_t size, char *buf) grub_size_t size, char *buf)
@@ -493,6 +586,7 @@ read_segment (struct grub_diskfilter_segment *seg, grub_disk_addr_t sector,
if (seg->node_count == 1) if (seg->node_count == 1)
return grub_diskfilter_read_node (&seg->nodes[0], return grub_diskfilter_read_node (&seg->nodes[0],
sector, size, buf); sector, size, buf);
/* Fallthrough. */
case GRUB_DISKFILTER_MIRROR: case GRUB_DISKFILTER_MIRROR:
case GRUB_DISKFILTER_RAID10: case GRUB_DISKFILTER_RAID10:
{ {
@@ -847,6 +941,23 @@ grub_diskfilter_vg_register (struct grub_diskfilter_vg *vg)
for (lv = vg->lvs; lv; lv = lv->next) for (lv = vg->lvs; lv; lv = lv->next)
{ {
grub_err_t err;
/* RAID 1 and single-disk RAID 0 don't use a chunksize but code
assumes one so set one. */
for (i = 0; i < lv->segment_count; i++)
{
if (lv->segments[i].type == 1)
lv->segments[i].stripe_size = 64;
if (lv->segments[i].type == GRUB_DISKFILTER_STRIPED
&& lv->segments[i].node_count == 1
&& lv->segments[i].stripe_size == 0)
lv->segments[i].stripe_size = 64;
}
err = validate_lv(lv);
if (err)
return err;
lv->number = lv_num++; lv->number = lv_num++;
if (lv->fullname) if (lv->fullname)
@@ -887,12 +998,6 @@ grub_diskfilter_vg_register (struct grub_diskfilter_vg *vg)
lv->fullname = tmp; lv->fullname = tmp;
} }
} }
/* RAID 1 doesn't use a chunksize but code assumes one so set
one. */
for (i = 0; i < lv->segment_count; i++)
if (lv->segments[i].type == 1)
lv->segments[i].stripe_size = 64;
lv->vg = vg;
} }
/* Add our new array to the list. */ /* Add our new array to the list. */
vg->next = array_list; vg->next = array_list;
@@ -925,6 +1030,11 @@ grub_diskfilter_make_raid (grub_size_t uuidlen, char *uuid, int nmemb,
n = layout & 0xFF; n = layout & 0xFF;
if (n == 1) if (n == 1)
n = (layout >> 8) & 0xFF; n = (layout >> 8) & 0xFF;
if (n == 0)
{
grub_free (uuid);
return NULL;
}
totsize = grub_divmod64 (nmemb * disk_size, n, 0); totsize = grub_divmod64 (nmemb * disk_size, n, 0);
} }
@@ -938,6 +1048,7 @@ grub_diskfilter_make_raid (grub_size_t uuidlen, char *uuid, int nmemb,
break; break;
default: default:
grub_free (uuid);
return NULL; return NULL;
} }
@@ -951,7 +1062,7 @@ grub_diskfilter_make_raid (grub_size_t uuidlen, char *uuid, int nmemb,
array->lvs->segments->extent_count = totsize; array->lvs->segments->extent_count = totsize;
} }
if (array->lvs->segments if (array->lvs && array->lvs->segments
&& array->lvs->segments->raid_member_size > disk_size) && array->lvs->segments->raid_member_size > disk_size)
array->lvs->segments->raid_member_size = disk_size; array->lvs->segments->raid_member_size = disk_size;
@@ -960,7 +1071,10 @@ grub_diskfilter_make_raid (grub_size_t uuidlen, char *uuid, int nmemb,
} }
array = grub_zalloc (sizeof (*array)); array = grub_zalloc (sizeof (*array));
if (!array) if (!array)
{
grub_free (uuid);
return NULL; return NULL;
}
array->uuid = uuid; array->uuid = uuid;
array->uuid_len = uuidlen; array->uuid_len = uuidlen;
if (name) if (name)
@@ -982,8 +1096,16 @@ grub_diskfilter_make_raid (grub_size_t uuidlen, char *uuid, int nmemb,
goto fail; goto fail;
array->lvs->segment_count = 1; array->lvs->segment_count = 1;
array->lvs->visible = 1; array->lvs->visible = 1;
array->lvs->name = array->name; if (array->name)
array->lvs->fullname = array->name; {
array->lvs->name = grub_strdup (array->name);
if (!array->lvs->name)
goto fail;
array->lvs->fullname = grub_strdup (array->name);
if (!array->lvs->fullname)
goto fail;
}
array->lvs->vg = array;
array->lvs->idname = grub_malloc (sizeof ("mduuid/") + 2 * uuidlen); array->lvs->idname = grub_malloc (sizeof ("mduuid/") + 2 * uuidlen);
if (!array->lvs->idname) if (!array->lvs->idname)
@@ -1033,13 +1155,26 @@ grub_diskfilter_make_raid (grub_size_t uuidlen, char *uuid, int nmemb,
return array; return array;
fail: fail:
if (array->lvs)
{
grub_free (array->lvs->name);
grub_free (array->lvs->fullname);
grub_free (array->lvs->idname);
if (array->lvs->segments)
{
grub_free (array->lvs->segments->nodes);
grub_free (array->lvs->segments);
}
grub_free (array->lvs); grub_free (array->lvs);
}
while (array->pvs) while (array->pvs)
{ {
pv = array->pvs->next; pv = array->pvs->next;
grub_free (array->pvs); grub_free (array->pvs);
array->pvs = pv; array->pvs = pv;
} }
grub_free (array->name);
grub_free (array->uuid);
grub_free (array); grub_free (array);
return NULL; return NULL;
} }
@@ -1142,10 +1277,9 @@ free_array (void)
{ {
unsigned i; unsigned i;
vg->lvs = lv->next; vg->lvs = lv->next;
if (lv->name != lv->fullname)
grub_free (lv->fullname); grub_free (lv->fullname);
if (lv->name != vg->name)
grub_free (lv->name); grub_free (lv->name);
grub_free (lv->idname);
for (i = 0; i < lv->segment_count; i++) for (i = 0; i < lv->segment_count; i++)
grub_free (lv->segments[i].nodes); grub_free (lv->segments[i].nodes);
grub_free (lv->segments); grub_free (lv->segments);
+13 -2
View File
@@ -99,6 +99,8 @@ grub_dmraid_nv_detect (grub_disk_t disk,
struct grub_nv_super sb; struct grub_nv_super sb;
int level; int level;
grub_uint64_t disk_size; grub_uint64_t disk_size;
grub_uint32_t capacity;
grub_uint8_t total_volumes;
char *uuid; char *uuid;
if (disk->partition) if (disk->partition)
@@ -124,11 +126,17 @@ grub_dmraid_nv_detect (grub_disk_t disk,
return NULL; return NULL;
} }
capacity = grub_le_to_cpu32 (sb.capacity);
total_volumes = sb.array.total_volumes;
switch (sb.array.raid_level) switch (sb.array.raid_level)
{ {
case NV_LEVEL_0: case NV_LEVEL_0:
level = 0; level = 0;
disk_size = sb.capacity / sb.array.total_volumes; if (total_volumes == 0)
/* Not RAID. */
return NULL;
disk_size = capacity / total_volumes;
break; break;
case NV_LEVEL_1: case NV_LEVEL_1:
@@ -138,7 +146,10 @@ grub_dmraid_nv_detect (grub_disk_t disk,
case NV_LEVEL_5: case NV_LEVEL_5:
level = 5; level = 5;
disk_size = sb.capacity / (sb.array.total_volumes - 1); if (total_volumes == 0 || total_volumes == 1)
/* Not RAID. */
return NULL;
disk_size = capacity / (total_volumes - 1);
break; break;
default: default:
+20 -6
View File
@@ -333,6 +333,21 @@ name_devices (struct grub_efidisk_data *devices)
if (! dp) if (! dp)
continue; continue;
/* Ghosts proudly presented by Apple. */
if (GRUB_EFI_DEVICE_PATH_TYPE (dp) == GRUB_EFI_MEDIA_DEVICE_PATH_TYPE
&& GRUB_EFI_DEVICE_PATH_SUBTYPE (dp)
== GRUB_EFI_VENDOR_MEDIA_DEVICE_PATH_SUBTYPE)
{
grub_efi_vendor_device_path_t *vendor = (grub_efi_vendor_device_path_t *) dp;
const struct grub_efi_guid apple = GRUB_EFI_VENDOR_APPLE_GUID;
if (vendor->header.length == sizeof (*vendor)
&& grub_memcmp (&vendor->vendor_guid, &apple,
sizeof (vendor->vendor_guid)) == 0
&& find_parent_device (devices, d))
continue;
}
m = d->block_io->media; m = d->block_io->media;
if (GRUB_EFI_DEVICE_PATH_TYPE (dp) == GRUB_EFI_ACPI_DEVICE_PATH_TYPE if (GRUB_EFI_DEVICE_PATH_TYPE (dp) == GRUB_EFI_ACPI_DEVICE_PATH_TYPE
&& GRUB_EFI_DEVICE_PATH_SUBTYPE (dp) && GRUB_EFI_DEVICE_PATH_SUBTYPE (dp)
@@ -788,7 +803,6 @@ grub_efidisk_get_device_name (grub_efi_handle_t *handle)
&& (GRUB_EFI_DEVICE_PATH_SUBTYPE (ldp) == GRUB_EFI_CDROM_DEVICE_PATH_SUBTYPE && (GRUB_EFI_DEVICE_PATH_SUBTYPE (ldp) == GRUB_EFI_CDROM_DEVICE_PATH_SUBTYPE
|| GRUB_EFI_DEVICE_PATH_SUBTYPE (ldp) == GRUB_EFI_HARD_DRIVE_DEVICE_PATH_SUBTYPE)) || GRUB_EFI_DEVICE_PATH_SUBTYPE (ldp) == GRUB_EFI_HARD_DRIVE_DEVICE_PATH_SUBTYPE))
{ {
int is_cdrom = 0;
struct grub_efidisk_get_device_name_ctx ctx; struct grub_efidisk_get_device_name_ctx ctx;
char *dev_name; char *dev_name;
grub_efi_device_path_t *dup_dp; grub_efi_device_path_t *dup_dp;
@@ -809,9 +823,6 @@ grub_efidisk_get_device_name (grub_efi_handle_t *handle)
|| 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)))
break; break;
if (GRUB_EFI_DEVICE_PATH_SUBTYPE (dup_ldp) == GRUB_EFI_CDROM_DEVICE_PATH_SUBTYPE)
is_cdrom = 1;
dup_ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE; dup_ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE;
dup_ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE; dup_ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE;
dup_ldp->length = sizeof (*dup_ldp); dup_ldp->length = sizeof (*dup_ldp);
@@ -846,10 +857,13 @@ grub_efidisk_get_device_name (grub_efi_handle_t *handle)
if (! ctx.partition_name) if (! ctx.partition_name)
{ {
/* No partition found. In most cases partition is embed in
the root path anyway, so this is not critical.
This happens only if partition is on partmap that GRUB
doesn't need to access root.
*/
grub_disk_close (parent); grub_disk_close (parent);
if (is_cdrom)
return grub_strdup (device_name); return grub_strdup (device_name);
return 0;
} }
dev_name = grub_xasprintf ("%s,%s", parent->name, dev_name = grub_xasprintf ("%s,%s", parent->name,
+35 -7
View File
@@ -212,7 +212,8 @@ grub_util_get_geli_uuid (const char *dev)
s = grub_util_get_fd_size (fd, dev, &log_secsize); s = grub_util_get_fd_size (fd, dev, &log_secsize);
s >>= log_secsize; s >>= log_secsize;
grub_util_fd_seek (fd, (s << log_secsize) - 512); if (grub_util_fd_seek (fd, (s << log_secsize) - 512) < 0)
grub_util_error ("%s", _("couldn't read ELI metadata"));
uuid = xmalloc (GRUB_MD_SHA256->mdlen * 2 + 1); uuid = xmalloc (GRUB_MD_SHA256->mdlen * 2 + 1);
if (grub_util_fd_read (fd, (void *) &hdr, 512) < 0) if (grub_util_fd_read (fd, (void *) &hdr, 512) < 0)
@@ -225,13 +226,16 @@ grub_util_get_geli_uuid (const char *dev)
/* Look for GELI magic sequence. */ /* Look for GELI magic sequence. */
if (grub_memcmp (header->magic, GELI_MAGIC, sizeof (GELI_MAGIC)) if (grub_memcmp (header->magic, GELI_MAGIC, sizeof (GELI_MAGIC))
|| grub_le_to_cpu32 (header->version) > 5 || grub_le_to_cpu32 (header->version) > 7
|| grub_le_to_cpu32 (header->version) < 1) || grub_le_to_cpu32 (header->version) < 1)
grub_util_error ("%s", _("wrong ELI magic or version")); grub_util_error ("%s", _("wrong ELI magic or version"));
err = make_uuid ((void *) &hdr, uuid); err = make_uuid ((void *) &hdr, uuid);
if (err) if (err)
{
grub_free (uuid);
return NULL; return NULL;
}
return uuid; return uuid;
} }
@@ -265,7 +269,7 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid,
/* Look for GELI magic sequence. */ /* Look for GELI magic sequence. */
if (grub_memcmp (header.magic, GELI_MAGIC, sizeof (GELI_MAGIC)) if (grub_memcmp (header.magic, GELI_MAGIC, sizeof (GELI_MAGIC))
|| grub_le_to_cpu32 (header.version) > 5 || grub_le_to_cpu32 (header.version) > 7
|| grub_le_to_cpu32 (header.version) < 1) || grub_le_to_cpu32 (header.version) < 1)
{ {
grub_dprintf ("geli", "wrong magic %02x\n", header.magic[0]); grub_dprintf ("geli", "wrong magic %02x\n", header.magic[0]);
@@ -332,19 +336,29 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid,
{ {
secondary_cipher = grub_crypto_cipher_open (ciph); secondary_cipher = grub_crypto_cipher_open (ciph);
if (!secondary_cipher) if (!secondary_cipher)
{
grub_crypto_cipher_close (cipher);
return NULL; return NULL;
} }
}
if (grub_le_to_cpu16 (header.keylen) > 1024) if (grub_le_to_cpu16 (header.keylen) > 1024)
{ {
grub_error (GRUB_ERR_BAD_ARGUMENT, "invalid keysize %d", grub_error (GRUB_ERR_BAD_ARGUMENT, "invalid keysize %d",
grub_le_to_cpu16 (header.keylen)); grub_le_to_cpu16 (header.keylen));
grub_crypto_cipher_close (cipher);
grub_crypto_cipher_close (secondary_cipher);
return NULL; return NULL;
} }
newdev = grub_zalloc (sizeof (struct grub_cryptodisk)); newdev = grub_zalloc (sizeof (struct grub_cryptodisk));
if (!newdev) if (!newdev)
{
grub_crypto_cipher_close (cipher);
grub_crypto_cipher_close (secondary_cipher);
return NULL; return NULL;
}
newdev->cipher = cipher; newdev->cipher = cipher;
newdev->secondary_cipher = secondary_cipher; newdev->secondary_cipher = secondary_cipher;
newdev->offset = 0; newdev->offset = 0;
@@ -391,6 +405,7 @@ recover_key (grub_disk_t source, grub_cryptodisk_t dev)
grub_uint8_t geomkey[GRUB_CRYPTO_MAX_MDLEN]; grub_uint8_t geomkey[GRUB_CRYPTO_MAX_MDLEN];
grub_uint8_t verify_key[GRUB_CRYPTO_MAX_MDLEN]; grub_uint8_t verify_key[GRUB_CRYPTO_MAX_MDLEN];
grub_uint8_t zero[GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE]; grub_uint8_t zero[GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE];
grub_uint8_t geli_cipher_key[64];
char passphrase[MAX_PASSPHRASE] = ""; char passphrase[MAX_PASSPHRASE] = "";
unsigned i; unsigned i;
gcry_err_code_t gcry_err; gcry_err_code_t gcry_err;
@@ -514,6 +529,19 @@ recover_key (grub_disk_t source, grub_cryptodisk_t dev)
continue; continue;
grub_printf_ (N_("Slot %d opened\n"), i); grub_printf_ (N_("Slot %d opened\n"), i);
if (grub_le_to_cpu32 (header.version) >= 7)
{
/* GELI >=7 uses the cipher_key */
grub_memcpy (geli_cipher_key, candidate_key.cipher_key,
sizeof (candidate_key.cipher_key));
}
else
{
/* GELI <=6 uses the iv_key */
grub_memcpy (geli_cipher_key, candidate_key.iv_key,
sizeof (candidate_key.iv_key));
}
/* Set the master key. */ /* Set the master key. */
if (!dev->rekey) if (!dev->rekey)
{ {
@@ -530,13 +558,13 @@ recover_key (grub_disk_t source, grub_cryptodisk_t dev)
grub_size_t real_keysize = keysize; grub_size_t real_keysize = keysize;
if (grub_le_to_cpu16 (header.alg) == 0x16) if (grub_le_to_cpu16 (header.alg) == 0x16)
real_keysize *= 2; real_keysize *= 2;
/* For a reason I don't know, the IV key is used in rekeying. */
grub_memcpy (dev->rekey_key, candidate_key.iv_key, grub_memcpy (dev->rekey_key, geli_cipher_key,
sizeof (candidate_key.iv_key)); sizeof (geli_cipher_key));
dev->rekey_derived_size = real_keysize; dev->rekey_derived_size = real_keysize;
dev->last_rekey = -1; dev->last_rekey = -1;
COMPILE_TIME_ASSERT (sizeof (dev->rekey_key) COMPILE_TIME_ASSERT (sizeof (dev->rekey_key)
>= sizeof (candidate_key.iv_key)); >= sizeof (geli_cipher_key));
} }
dev->iv_prefix_len = sizeof (candidate_key.iv_key); dev->iv_prefix_len = sizeof (candidate_key.iv_key);
+17 -2
View File
@@ -382,7 +382,8 @@ grub_biosdisk_open (const char *name, grub_disk_t disk)
/* Some buggy BIOSes doesn't return the total sectors /* Some buggy BIOSes doesn't return the total sectors
correctly but returns zero. So if it is zero, compute correctly but returns zero. So if it is zero, compute
it by C/H/S returned by the LBA BIOS call. */ it by C/H/S returned by the LBA BIOS call. */
total_sectors = drp->cylinders * drp->heads * drp->sectors; total_sectors = ((grub_uint64_t) drp->cylinders)
* drp->heads * drp->sectors;
if (drp->bytes_per_sector if (drp->bytes_per_sector
&& !(drp->bytes_per_sector & (drp->bytes_per_sector - 1)) && !(drp->bytes_per_sector & (drp->bytes_per_sector - 1))
&& drp->bytes_per_sector >= 512 && drp->bytes_per_sector >= 512
@@ -419,8 +420,14 @@ grub_biosdisk_open (const char *name, grub_disk_t disk)
} }
} }
if (data->sectors == 0)
data->sectors = 63;
if (data->heads == 0)
data->heads = 255;
if (! total_sectors) if (! total_sectors)
total_sectors = data->cylinders * data->heads * data->sectors; total_sectors = ((grub_uint64_t) data->cylinders)
* data->heads * data->sectors;
} }
disk->total_sectors = total_sectors; disk->total_sectors = total_sectors;
@@ -455,6 +462,14 @@ grub_biosdisk_rw (int cmd, grub_disk_t disk,
{ {
struct grub_biosdisk_data *data = disk->data; struct grub_biosdisk_data *data = disk->data;
/* VirtualBox fails with sectors above 2T on CDs.
Since even BD-ROMS are never that big anyway, return error. */
if ((data->flags & GRUB_BIOSDISK_FLAG_CDROM)
&& (sector >> 32))
return grub_error (GRUB_ERR_OUT_OF_RANGE,
N_("attempt to read or write outside of disk `%s'"),
disk->name);
if (data->flags & GRUB_BIOSDISK_FLAG_LBA) if (data->flags & GRUB_BIOSDISK_FLAG_LBA)
{ {
struct grub_biosdisk_dap *dap; struct grub_biosdisk_dap *dap;
+5
View File
@@ -113,6 +113,11 @@ grub_nand_open (const char *name, grub_disk_t disk)
} }
data->block_size = (args.size1 >> GRUB_DISK_SECTOR_BITS); data->block_size = (args.size1 >> GRUB_DISK_SECTOR_BITS);
if (!data->block_size)
{
grub_error (GRUB_ERR_UNKNOWN_DEVICE, "invalid block size");
goto fail;
}
INIT_IEEE1275_COMMON (&args.common, "call-method", 2, 3); INIT_IEEE1275_COMMON (&args.common, "call-method", 2, 3);
args.method = (grub_ieee1275_cell_t) "size"; args.method = (grub_ieee1275_cell_t) "size";
+8 -8
View File
@@ -34,7 +34,7 @@ struct ofdisk_hash_ent
char *open_path; char *open_path;
char *grub_devpath; char *grub_devpath;
int is_boot; int is_boot;
int is_cdrom; int is_removable;
/* Pointer to shortest available name on nodes representing canonical names, /* Pointer to shortest available name on nodes representing canonical names,
otherwise NULL. */ otherwise NULL. */
const char *shortest; const char *shortest;
@@ -123,7 +123,7 @@ ofdisk_hash_add_real (char *devpath)
} }
static int static int
check_string_cdrom (const char *str) check_string_removable (const char *str)
{ {
const char *ptr = grub_strrchr (str, '/'); const char *ptr = grub_strrchr (str, '/');
@@ -131,7 +131,7 @@ check_string_cdrom (const char *str)
ptr++; ptr++;
else else
ptr = str; ptr = str;
return (grub_strncmp (ptr, "cdrom", 5) == 0); return (grub_strncmp (ptr, "cdrom", 5) == 0 || grub_strncmp (ptr, "fd", 2) == 0);
} }
static struct ofdisk_hash_ent * static struct ofdisk_hash_ent *
@@ -147,8 +147,8 @@ ofdisk_hash_add (char *devpath, char *curcan)
{ {
p->shortest = p->devpath; p->shortest = p->devpath;
p->grub_shortest = p->grub_devpath; p->grub_shortest = p->grub_devpath;
if (check_string_cdrom (devpath)) if (check_string_removable (devpath))
p->is_cdrom = 1; p->is_removable = 1;
return p; return p;
} }
@@ -158,8 +158,8 @@ ofdisk_hash_add (char *devpath, char *curcan)
else else
grub_free (curcan); grub_free (curcan);
if (check_string_cdrom (devpath) || check_string_cdrom (curcan)) if (check_string_removable (devpath) || check_string_removable (curcan))
pcan->is_cdrom = 1; pcan->is_removable = 1;
if (!pcan) if (!pcan)
grub_errno = GRUB_ERR_NONE; grub_errno = GRUB_ERR_NONE;
@@ -330,7 +330,7 @@ grub_ofdisk_iterate (grub_disk_dev_iterate_hook_t hook, void *hook_data,
} }
} }
if (!ent->is_boot && ent->is_cdrom) if (!ent->is_boot && ent->is_removable)
continue; continue;
if (hook (ent->grub_shortest, hook_data)) if (hook (ent->grub_shortest, hook_data))
+1 -1
View File
@@ -1012,7 +1012,7 @@ grub_util_ldm_embed (struct grub_disk *disk, unsigned int *nsectors,
usable for bootloaders (called generically usable for bootloaders (called generically
"embedding zone") and this operation is "embedding zone") and this operation is
called "embedding". */ called "embedding". */
N_("your LDM embedding Partition is too small;" N_("your LDM Embedding Partition is too small;"
" embedding won't be possible")); " embedding won't be possible"));
*nsectors = lv->size; *nsectors = lv->size;
if (*nsectors > max_nsectors) if (*nsectors > max_nsectors)
+15 -2
View File
@@ -143,6 +143,7 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid,
{ {
grub_error (GRUB_ERR_BAD_ARGUMENT, "invalid keysize %d", grub_error (GRUB_ERR_BAD_ARGUMENT, "invalid keysize %d",
grub_be_to_cpu32 (header.keyBytes)); grub_be_to_cpu32 (header.keyBytes));
grub_crypto_cipher_close (cipher);
return NULL; return NULL;
} }
@@ -181,9 +182,10 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid,
} }
if (cipher->cipher->blocksize != GRUB_CRYPTODISK_GF_BYTES) if (cipher->cipher->blocksize != GRUB_CRYPTODISK_GF_BYTES)
{ {
grub_crypto_cipher_close (cipher);
grub_error (GRUB_ERR_BAD_ARGUMENT, "Unsupported XTS block size: %d", grub_error (GRUB_ERR_BAD_ARGUMENT, "Unsupported XTS block size: %d",
cipher->cipher->blocksize); cipher->cipher->blocksize);
grub_crypto_cipher_close (cipher);
grub_crypto_cipher_close (secondary_cipher);
return NULL; return NULL;
} }
if (secondary_cipher->cipher->blocksize != GRUB_CRYPTODISK_GF_BYTES) if (secondary_cipher->cipher->blocksize != GRUB_CRYPTODISK_GF_BYTES)
@@ -191,6 +193,7 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid,
grub_crypto_cipher_close (cipher); grub_crypto_cipher_close (cipher);
grub_error (GRUB_ERR_BAD_ARGUMENT, "Unsupported XTS block size: %d", grub_error (GRUB_ERR_BAD_ARGUMENT, "Unsupported XTS block size: %d",
secondary_cipher->cipher->blocksize); secondary_cipher->cipher->blocksize);
grub_crypto_cipher_close (secondary_cipher);
return NULL; return NULL;
} }
} }
@@ -200,9 +203,9 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid,
cipheriv = ciphermode + sizeof ("lrw-") - 1; cipheriv = ciphermode + sizeof ("lrw-") - 1;
if (cipher->cipher->blocksize != GRUB_CRYPTODISK_GF_BYTES) if (cipher->cipher->blocksize != GRUB_CRYPTODISK_GF_BYTES)
{ {
grub_crypto_cipher_close (cipher);
grub_error (GRUB_ERR_BAD_ARGUMENT, "Unsupported LRW block size: %d", grub_error (GRUB_ERR_BAD_ARGUMENT, "Unsupported LRW block size: %d",
cipher->cipher->blocksize); cipher->cipher->blocksize);
grub_crypto_cipher_close (cipher);
return NULL; return NULL;
} }
} }
@@ -225,6 +228,7 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid,
|| cipher->cipher->blocksize == 0) || cipher->cipher->blocksize == 0)
grub_error (GRUB_ERR_BAD_ARGUMENT, "Unsupported benbi blocksize: %d", grub_error (GRUB_ERR_BAD_ARGUMENT, "Unsupported benbi blocksize: %d",
cipher->cipher->blocksize); cipher->cipher->blocksize);
/* FIXME should we return an error here? */
for (benbi_log = 0; for (benbi_log = 0;
(cipher->cipher->blocksize << benbi_log) < GRUB_DISK_SECTOR_SIZE; (cipher->cipher->blocksize << benbi_log) < GRUB_DISK_SECTOR_SIZE;
benbi_log++); benbi_log++);
@@ -243,6 +247,7 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid,
if (!essiv_hash) if (!essiv_hash)
{ {
grub_crypto_cipher_close (cipher); grub_crypto_cipher_close (cipher);
grub_crypto_cipher_close (secondary_cipher);
grub_error (GRUB_ERR_FILE_NOT_FOUND, grub_error (GRUB_ERR_FILE_NOT_FOUND,
"Couldn't load %s hash", hash_str); "Couldn't load %s hash", hash_str);
return NULL; return NULL;
@@ -251,12 +256,14 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid,
if (!essiv_cipher) if (!essiv_cipher)
{ {
grub_crypto_cipher_close (cipher); grub_crypto_cipher_close (cipher);
grub_crypto_cipher_close (secondary_cipher);
return NULL; return NULL;
} }
} }
else else
{ {
grub_crypto_cipher_close (cipher); grub_crypto_cipher_close (cipher);
grub_crypto_cipher_close (secondary_cipher);
grub_error (GRUB_ERR_BAD_ARGUMENT, "Unknown IV mode: %s", grub_error (GRUB_ERR_BAD_ARGUMENT, "Unknown IV mode: %s",
cipheriv); cipheriv);
return NULL; return NULL;
@@ -276,7 +283,12 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid,
newdev = grub_zalloc (sizeof (struct grub_cryptodisk)); newdev = grub_zalloc (sizeof (struct grub_cryptodisk));
if (!newdev) if (!newdev)
{
grub_crypto_cipher_close (cipher);
grub_crypto_cipher_close (essiv_cipher);
grub_crypto_cipher_close (secondary_cipher);
return NULL; return NULL;
}
newdev->cipher = cipher; newdev->cipher = cipher;
newdev->offset = grub_be_to_cpu32 (header.payloadOffset); newdev->offset = grub_be_to_cpu32 (header.payloadOffset);
newdev->source_disk = NULL; newdev->source_disk = NULL;
@@ -451,6 +463,7 @@ luks_recover_key (grub_disk_t source,
return GRUB_ERR_NONE; return GRUB_ERR_NONE;
} }
grub_free (split_key);
return GRUB_ACCESS_DENIED; return GRUB_ACCESS_DENIED;
} }
+8 -7
View File
@@ -65,7 +65,7 @@ grub_lvm_checkvalue (char **p, char *str, char *tmpl)
static int static int
grub_lvm_check_flag (char *p, const char *str, const char *flag) grub_lvm_check_flag (char *p, const char *str, const char *flag)
{ {
int len_str = grub_strlen (str), len_flag = grub_strlen (flag); grub_size_t len_str = grub_strlen (str), len_flag = grub_strlen (flag);
while (1) while (1)
{ {
char *q; char *q;
@@ -111,7 +111,8 @@ grub_lvm_detect (grub_disk_t disk,
struct grub_lvm_disk_locn *dlocn; struct grub_lvm_disk_locn *dlocn;
struct grub_lvm_mda_header *mdah; struct grub_lvm_mda_header *mdah;
struct grub_lvm_raw_locn *rlocn; struct grub_lvm_raw_locn *rlocn;
unsigned int i, j, vgname_len; unsigned int i, j;
grub_size_t vgname_len;
struct grub_diskfilter_vg *vg; struct grub_diskfilter_vg *vg;
struct grub_diskfilter_pv *pv; struct grub_diskfilter_pv *pv;
@@ -273,7 +274,7 @@ grub_lvm_detect (grub_disk_t disk,
/* Add all the pvs to the volume group. */ /* Add all the pvs to the volume group. */
while (1) while (1)
{ {
int s; grub_ssize_t s;
while (grub_isspace (*p)) while (grub_isspace (*p))
p++; p++;
@@ -332,15 +333,15 @@ grub_lvm_detect (grub_disk_t disk,
} }
} }
p = grub_strstr (p, "logical_volumes"); p = grub_strstr (p, "logical_volumes {");
if (p) if (p)
{ {
p += sizeof ("logical_volumes = ") - 1; p += sizeof ("logical_volumes {") - 1;
/* And add all the lvs to the volume group. */ /* And add all the lvs to the volume group. */
while (1) while (1)
{ {
int s; grub_ssize_t s;
int skip_lv = 0; int skip_lv = 0;
struct grub_diskfilter_lv *lv; struct grub_diskfilter_lv *lv;
struct grub_diskfilter_segment *seg; struct grub_diskfilter_segment *seg;
@@ -425,7 +426,7 @@ grub_lvm_detect (grub_disk_t disk,
#endif #endif
goto lvs_fail; goto lvs_fail;
} }
lv->segments = grub_malloc (sizeof (*seg) * lv->segment_count); lv->segments = grub_zalloc (sizeof (*seg) * lv->segment_count);
seg = lv->segments; seg = lv->segments;
for (i = 0; i < lv->segment_count; i++) for (i = 0; i < lv->segment_count; i++)
+6 -6
View File
@@ -33,16 +33,16 @@ GRUB_MOD_LICENSE ("GPLv3+");
#define grub_md_to_cpu64 grub_be_to_cpu64 #define grub_md_to_cpu64 grub_be_to_cpu64
#define grub_md_to_cpu32 grub_be_to_cpu32 #define grub_md_to_cpu32 grub_be_to_cpu32
#define grub_md_to_cpu16 grub_be_to_cpu16 #define grub_md_to_cpu16 grub_be_to_cpu16
#define grub_cpu_to_md64_compile_time grub_cpu_to_be64 #define grub_cpu_to_md64_compile_time grub_cpu_to_be64_compile_time
#define grub_cpu_to_md32_compile_time grub_cpu_to_be32 #define grub_cpu_to_md32_compile_time grub_cpu_to_be32_compile_time
#define grub_cpu_to_md16_compile_time grub_cpu_to_be16 #define grub_cpu_to_md16_compile_time grub_cpu_to_be16_compile_time
#else #else
#define grub_md_to_cpu64 grub_le_to_cpu64 #define grub_md_to_cpu64 grub_le_to_cpu64
#define grub_md_to_cpu32 grub_le_to_cpu32 #define grub_md_to_cpu32 grub_le_to_cpu32
#define grub_md_to_cpu16 grub_le_to_cpu16 #define grub_md_to_cpu16 grub_le_to_cpu16
#define grub_cpu_to_md64_compile_time grub_cpu_to_le64 #define grub_cpu_to_md64_compile_time grub_cpu_to_le64_compile_time
#define grub_cpu_to_md32_compile_time grub_cpu_to_le32 #define grub_cpu_to_md32_compile_time grub_cpu_to_le32_compile_time
#define grub_cpu_to_md16_compile_time grub_cpu_to_le16 #define grub_cpu_to_md16_compile_time grub_cpu_to_le16_compile_time
#endif #endif
#define RESERVED_BYTES (64 * 1024) #define RESERVED_BYTES (64 * 1024)
+15 -5
View File
@@ -34,9 +34,9 @@ static unsigned powx_inv[256];
static const grub_uint8_t poly = 0x1d; static const grub_uint8_t poly = 0x1d;
static void static void
grub_raid_block_mulx (unsigned mul, char *buf, int size) grub_raid_block_mulx (unsigned mul, char *buf, grub_size_t size)
{ {
int i; grub_size_t i;
grub_uint8_t *p; grub_uint8_t *p;
p = (grub_uint8_t *) buf; p = (grub_uint8_t *) buf;
@@ -63,6 +63,16 @@ grub_raid6_init_table (void)
} }
} }
static unsigned
mod_255 (unsigned x)
{
while (x > 0xff)
x = (x >> 8) + (x & 0xff);
if (x == 0xff)
return 0;
return x;
}
static grub_err_t static grub_err_t
grub_raid6_recover (struct grub_diskfilter_segment *array, int disknr, int p, grub_raid6_recover (struct grub_diskfilter_segment *array, int disknr, int p,
char *buf, grub_disk_addr_t sector, grub_size_t size) char *buf, grub_disk_addr_t sector, grub_size_t size)
@@ -162,11 +172,11 @@ grub_raid6_recover (struct grub_diskfilter_segment *array, int disknr, int p,
grub_crypto_xor (qbuf, qbuf, buf, size); grub_crypto_xor (qbuf, qbuf, buf, size);
c = ((255 ^ bad1) c = mod_255((255 ^ bad1)
+ (255 ^ powx_inv[(powx[bad2 + (bad1 ^ 255)] ^ 1)])) % 255; + (255 ^ powx_inv[(powx[bad2 + (bad1 ^ 255)] ^ 1)]));
grub_raid_block_mulx (c, qbuf, size); grub_raid_block_mulx (c, qbuf, size);
c = ((unsigned) bad2 + c) % 255; c = mod_255((unsigned) bad2 + c);
grub_raid_block_mulx (c, pbuf, size); grub_raid_block_mulx (c, pbuf, size);
grub_crypto_xor (pbuf, pbuf, qbuf, size); grub_crypto_xor (pbuf, pbuf, qbuf, size);
+1 -1
View File
@@ -201,7 +201,7 @@ grub_scsi_read_capacity16 (grub_scsi_t scsi)
rc.opcode = grub_scsi_cmd_read_capacity16; rc.opcode = grub_scsi_cmd_read_capacity16;
rc.lun = (scsi->lun << GRUB_SCSI_LUN_SHIFT) | 0x10; rc.lun = (scsi->lun << GRUB_SCSI_LUN_SHIFT) | 0x10;
rc.logical_block_addr = 0; rc.logical_block_addr = 0;
rc.alloc_len = grub_cpu_to_be32 (sizeof (rcd)); rc.alloc_len = grub_cpu_to_be32_compile_time (sizeof (rcd));
rc.PMI = 0; rc.PMI = 0;
rc.control = 0; rc.control = 0;
+2 -2
View File
@@ -307,7 +307,7 @@ grub_usbms_transfer_bo (struct grub_scsi *scsi, grub_size_t cmdsize, char *cmd,
/* Setup the request. */ /* Setup the request. */
grub_memset (&cbw, 0, sizeof (cbw)); grub_memset (&cbw, 0, sizeof (cbw));
cbw.signature = grub_cpu_to_le32 (0x43425355); cbw.signature = grub_cpu_to_le32_compile_time (0x43425355);
cbw.tag = tag; cbw.tag = tag;
cbw.transfer_length = grub_cpu_to_le32 (size); cbw.transfer_length = grub_cpu_to_le32 (size);
cbw.flags = (!read_write) << GRUB_USBMS_DIRECTION_BIT; cbw.flags = (!read_write) << GRUB_USBMS_DIRECTION_BIT;
@@ -414,7 +414,7 @@ CheckCSW:
/* If phase error or not valid signature, do bulk-only reset device. */ /* If phase error or not valid signature, do bulk-only reset device. */
if ((status.status == 2) || if ((status.status == 2) ||
(status.signature != grub_cpu_to_le32(0x53425355))) (status.signature != grub_cpu_to_le32_compile_time(0x53425355)))
{ /* Bulk-only reset device. */ { /* Bulk-only reset device. */
grub_dprintf ("usb", "Bulk-only reset device - bad status\n"); grub_dprintf ("usb", "Bulk-only reset device - bad status\n");
grub_usbms_reset (dev); grub_usbms_reset (dev);
+36 -9
View File
@@ -40,6 +40,7 @@ struct virtdisk
grub_xen_evtchn_t evtchn; grub_xen_evtchn_t evtchn;
void *dma_page; void *dma_page;
grub_xen_grant_t dma_grant; grub_xen_grant_t dma_grant;
struct virtdisk *compat_next;
}; };
#define xen_wmb() mb() #define xen_wmb() mb()
@@ -47,6 +48,7 @@ struct virtdisk
static struct virtdisk *virtdisks; static struct virtdisk *virtdisks;
static grub_size_t vdiskcnt; static grub_size_t vdiskcnt;
struct virtdisk *compat_head;
static int static int
grub_virtdisk_iterate (grub_disk_dev_iterate_hook_t hook, void *hook_data, grub_virtdisk_iterate (grub_disk_dev_iterate_hook_t hook, void *hook_data,
@@ -66,20 +68,32 @@ grub_virtdisk_iterate (grub_disk_dev_iterate_hook_t hook, void *hook_data,
static grub_err_t static grub_err_t
grub_virtdisk_open (const char *name, grub_disk_t disk) grub_virtdisk_open (const char *name, grub_disk_t disk)
{ {
grub_size_t i; int i;
grub_uint32_t secsize; grub_uint32_t secsize;
char fdir[200]; char fdir[200];
char *buf; char *buf;
int num = -1;
struct virtdisk *vd;
for (i = 0; i < vdiskcnt; i++) /* For compatibility with pv-grub legacy menu.lst accept hdX as disk name */
if (grub_strcmp (name, virtdisks[i].fullname) == 0) if (name[0] == 'h' && name[1] == 'd' && name[2])
{
num = grub_strtoul (name + 2, 0, 10);
if (grub_errno)
{
grub_errno = 0;
num = -1;
}
}
for (i = 0, vd = compat_head; vd; vd = vd->compat_next, i++)
if (i == num || grub_strcmp (name, vd->fullname) == 0)
break; break;
if (i == vdiskcnt) if (!vd)
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "not a virtdisk"); return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "not a virtdisk");
disk->data = &virtdisks[i]; disk->data = vd;
disk->id = i; disk->id = vd - virtdisks;
grub_snprintf (fdir, sizeof (fdir), "%s/sectors", virtdisks[i].backend_dir); grub_snprintf (fdir, sizeof (fdir), "%s/sectors", vd->backend_dir);
buf = grub_xenstore_get_file (fdir, NULL); buf = grub_xenstore_get_file (fdir, NULL);
if (!buf) if (!buf)
return grub_errno; return grub_errno;
@@ -87,8 +101,7 @@ grub_virtdisk_open (const char *name, grub_disk_t disk)
if (grub_errno) if (grub_errno)
return grub_errno; return grub_errno;
grub_snprintf (fdir, sizeof (fdir), "%s/sector-size", grub_snprintf (fdir, sizeof (fdir), "%s/sector-size", vd->backend_dir);
virtdisks[i].backend_dir);
buf = grub_xenstore_get_file (fdir, NULL); buf = grub_xenstore_get_file (fdir, NULL);
if (!buf) if (!buf)
return grub_errno; return grub_errno;
@@ -264,6 +277,7 @@ fill (const char *dir, void *data)
grub_err_t err; grub_err_t err;
void *buf; void *buf;
struct evtchn_alloc_unbound alloc_unbound; struct evtchn_alloc_unbound alloc_unbound;
struct virtdisk **prev = &compat_head, *vd = compat_head;
/* Shouldn't happen unles some hotplug happened. */ /* Shouldn't happen unles some hotplug happened. */
if (vdiskcnt >= *ctr) if (vdiskcnt >= *ctr)
@@ -374,6 +388,19 @@ fill (const char *dir, void *data)
virtdisks[vdiskcnt].frontend_dir = grub_strdup (fdir); virtdisks[vdiskcnt].frontend_dir = grub_strdup (fdir);
/* For compatibility with pv-grub maintain linked list sorted by handle
value in increasing order. This allows mapping of (hdX) disk names
from legacy menu.lst */
while (vd)
{
if (vd->handle > virtdisks[vdiskcnt].handle)
break;
prev = &vd->compat_next;
vd = vd->compat_next;
}
virtdisks[vdiskcnt].compat_next = vd;
*prev = &virtdisks[vdiskcnt];
vdiskcnt++; vdiskcnt++;
return 0; return 0;
+1
View File
@@ -21,6 +21,7 @@
#include <grub/err.h> #include <grub/err.h>
#include <grub/mm.h> #include <grub/mm.h>
#include <grub/types.h> #include <grub/types.h>
#include <grub/misc.h>
#include <grub/efiemu/efiemu.h> #include <grub/efiemu/efiemu.h>
#include <grub/crypto.h> #include <grub/crypto.h>
+3 -1
View File
@@ -777,6 +777,7 @@ grub_font_get_glyph_internal (grub_font_t font, grub_uint32_t code)
if (grub_file_read (font->file, glyph->bitmap, len) != len) if (grub_file_read (font->file, glyph->bitmap, len) != len)
{ {
remove_font (font); remove_font (font);
grub_free (glyph);
return 0; return 0;
} }
} }
@@ -1285,7 +1286,7 @@ blit_comb (const struct grub_unicode_glyph *glyph_id,
- grub_font_get_xheight (combining_glyphs[i]->font) - 1; - grub_font_get_xheight (combining_glyphs[i]->font) - 1;
if (space <= 0) if (space <= 0)
space = 1 + (grub_font_get_xheight (main_glyph->font)) / 8; space = 1 + (grub_font_get_xheight (main_glyph->font)) / 8;
/* Fallthrough. */
case GRUB_UNICODE_STACK_ATTACHED_ABOVE: case GRUB_UNICODE_STACK_ATTACHED_ABOVE:
do_blit (combining_glyphs[i], targetx, do_blit (combining_glyphs[i], targetx,
-(ctx.bounds.height + ctx.bounds.y + space -(ctx.bounds.height + ctx.bounds.y + space
@@ -1326,6 +1327,7 @@ blit_comb (const struct grub_unicode_glyph *glyph_id,
+ combining_glyphs[i]->height); + combining_glyphs[i]->height);
if (space <= 0) if (space <= 0)
space = 1 + (grub_font_get_xheight (main_glyph->font)) / 8; space = 1 + (grub_font_get_xheight (main_glyph->font)) / 8;
/* Fallthrough. */
case GRUB_UNICODE_STACK_ATTACHED_BELOW: case GRUB_UNICODE_STACK_ATTACHED_BELOW:
do_blit (combining_glyphs[i], targetx, -(ctx.bounds.y - space), do_blit (combining_glyphs[i], targetx, -(ctx.bounds.y - space),
+23 -16
View File
@@ -680,6 +680,8 @@ grub_btrfs_read_logical (struct grub_btrfs_data *data, grub_disk_addr_t addr,
grub_uint64_t stripen; grub_uint64_t stripen;
grub_uint64_t stripe_offset; grub_uint64_t stripe_offset;
grub_uint64_t off = addr - grub_le_to_cpu64 (key->offset); grub_uint64_t off = addr - grub_le_to_cpu64 (key->offset);
grub_uint64_t chunk_stripe_length;
grub_uint16_t nstripes;
unsigned redundancy = 1; unsigned redundancy = 1;
unsigned i, j; unsigned i, j;
@@ -690,15 +692,17 @@ grub_btrfs_read_logical (struct grub_btrfs_data *data, grub_disk_addr_t addr,
"couldn't find the chunk descriptor"); "couldn't find the chunk descriptor");
} }
nstripes = grub_le_to_cpu16 (chunk->nstripes) ? : 1;
chunk_stripe_length = grub_le_to_cpu64 (chunk->stripe_length) ? : 512;
grub_dprintf ("btrfs", "chunk 0x%" PRIxGRUB_UINT64_T grub_dprintf ("btrfs", "chunk 0x%" PRIxGRUB_UINT64_T
"+0x%" PRIxGRUB_UINT64_T "+0x%" PRIxGRUB_UINT64_T
" (%d stripes (%d substripes) of %" " (%d stripes (%d substripes) of %"
PRIxGRUB_UINT64_T ")\n", PRIxGRUB_UINT64_T ")\n",
grub_le_to_cpu64 (key->offset), grub_le_to_cpu64 (key->offset),
grub_le_to_cpu64 (chunk->size), grub_le_to_cpu64 (chunk->size),
grub_le_to_cpu16 (chunk->nstripes), nstripes,
grub_le_to_cpu16 (chunk->nsubstripes), grub_le_to_cpu16 (chunk->nsubstripes),
grub_le_to_cpu64 (chunk->stripe_length)); chunk_stripe_length);
switch (grub_le_to_cpu64 (chunk->type) switch (grub_le_to_cpu64 (chunk->type)
& ~GRUB_BTRFS_CHUNK_TYPE_BITS_DONTCARE) & ~GRUB_BTRFS_CHUNK_TYPE_BITS_DONTCARE)
@@ -708,8 +712,10 @@ grub_btrfs_read_logical (struct grub_btrfs_data *data, grub_disk_addr_t addr,
grub_uint64_t stripe_length; grub_uint64_t stripe_length;
grub_dprintf ("btrfs", "single\n"); grub_dprintf ("btrfs", "single\n");
stripe_length = grub_divmod64 (grub_le_to_cpu64 (chunk->size), stripe_length = grub_divmod64 (grub_le_to_cpu64 (chunk->size),
grub_le_to_cpu16 (chunk->nstripes), nstripes,
NULL); NULL);
if (stripe_length == 0)
stripe_length = 512;
stripen = grub_divmod64 (off, stripe_length, &stripe_offset); stripen = grub_divmod64 (off, stripe_length, &stripe_offset);
csize = (stripen + 1) * stripe_length - off; csize = (stripen + 1) * stripe_length - off;
break; break;
@@ -730,33 +736,34 @@ grub_btrfs_read_logical (struct grub_btrfs_data *data, grub_disk_addr_t addr,
grub_uint64_t low; grub_uint64_t low;
grub_dprintf ("btrfs", "RAID0\n"); grub_dprintf ("btrfs", "RAID0\n");
middle = grub_divmod64 (off, middle = grub_divmod64 (off,
grub_le_to_cpu64 (chunk->stripe_length), chunk_stripe_length,
&low); &low);
high = grub_divmod64 (middle, grub_le_to_cpu16 (chunk->nstripes), high = grub_divmod64 (middle, nstripes,
&stripen); &stripen);
stripe_offset = stripe_offset =
low + grub_le_to_cpu64 (chunk->stripe_length) * high; low + chunk_stripe_length * high;
csize = grub_le_to_cpu64 (chunk->stripe_length) - low; csize = chunk_stripe_length - low;
break; break;
} }
case GRUB_BTRFS_CHUNK_TYPE_RAID10: case GRUB_BTRFS_CHUNK_TYPE_RAID10:
{ {
grub_uint64_t middle, high; grub_uint64_t middle, high;
grub_uint64_t low; grub_uint64_t low;
grub_uint16_t nsubstripes;
nsubstripes = grub_le_to_cpu16 (chunk->nsubstripes) ? : 1;
middle = grub_divmod64 (off, middle = grub_divmod64 (off,
grub_le_to_cpu64 (chunk->stripe_length), chunk_stripe_length,
&low); &low);
high = grub_divmod64 (middle, high = grub_divmod64 (middle,
grub_le_to_cpu16 (chunk->nstripes) nstripes / nsubstripes ? : 1,
/ grub_le_to_cpu16 (chunk->nsubstripes),
&stripen); &stripen);
stripen *= grub_le_to_cpu16 (chunk->nsubstripes); stripen *= nsubstripes;
redundancy = grub_le_to_cpu16 (chunk->nsubstripes); redundancy = nsubstripes;
stripe_offset = low + grub_le_to_cpu64 (chunk->stripe_length) stripe_offset = low + chunk_stripe_length
* high; * high;
csize = grub_le_to_cpu64 (chunk->stripe_length) - low; csize = chunk_stripe_length - low;
break; break;
} }
default: default:
@@ -1051,7 +1058,7 @@ grub_btrfs_extent_read (struct grub_btrfs_data *data,
data->extend = data->extstart + grub_le_to_cpu64 (data->extent->size); data->extend = data->extstart + grub_le_to_cpu64 (data->extent->size);
if (data->extent->type == GRUB_BTRFS_EXTENT_REGULAR if (data->extent->type == GRUB_BTRFS_EXTENT_REGULAR
&& (char *) &data->extent + elemsize && (char *) data->extent + elemsize
>= (char *) &data->extent->filled + sizeof (data->extent->filled)) >= (char *) &data->extent->filled + sizeof (data->extent->filled))
data->extend = data->extend =
data->extstart + grub_le_to_cpu64 (data->extent->filled); data->extstart + grub_le_to_cpu64 (data->extent->filled);
@@ -1201,7 +1208,7 @@ get_root (struct grub_btrfs_data *data, struct grub_btrfs_key *key,
struct grub_btrfs_key key_out, key_in; struct grub_btrfs_key key_out, key_in;
struct grub_btrfs_root_item ri; struct grub_btrfs_root_item ri;
key_in.object_id = GRUB_BTRFS_ROOT_VOL_OBJECTID; key_in.object_id = grub_cpu_to_le64_compile_time (GRUB_BTRFS_ROOT_VOL_OBJECTID);
key_in.offset = 0; key_in.offset = 0;
key_in.type = GRUB_BTRFS_ITEM_TYPE_ROOT_ITEM; key_in.type = GRUB_BTRFS_ITEM_TYPE_ROOT_ITEM;
err = lower_bound (data, &key_in, &key_out, err = lower_bound (data, &key_in, &key_out,
+5 -2
View File
@@ -74,7 +74,6 @@ grub_cbfs_find_file (struct grub_archelp_data *data, char **name,
(void) mtime; (void) mtime;
offset = grub_be_to_cpu32 (hd.offset); offset = grub_be_to_cpu32 (hd.offset);
if (mode)
*mode = GRUB_ARCHELP_ATTR_FILE | GRUB_ARCHELP_ATTR_NOTIME; *mode = GRUB_ARCHELP_ATTR_FILE | GRUB_ARCHELP_ATTR_NOTIME;
namesize = offset; namesize = offset;
@@ -144,11 +143,14 @@ static struct grub_archelp_data *
grub_cbfs_mount (grub_disk_t disk) grub_cbfs_mount (grub_disk_t disk)
{ {
struct cbfs_file hd; struct cbfs_file hd;
struct grub_archelp_data *data; struct grub_archelp_data *data = NULL;
grub_uint32_t ptr; grub_uint32_t ptr;
grub_off_t header_off; grub_off_t header_off;
struct cbfs_header head; struct cbfs_header head;
if (grub_disk_get_size (disk) == GRUB_DISK_SIZE_UNKNOWN)
goto fail;
if (grub_disk_read (disk, grub_disk_get_size (disk) - 1, if (grub_disk_read (disk, grub_disk_get_size (disk) - 1,
GRUB_DISK_SECTOR_SIZE - sizeof (ptr), GRUB_DISK_SECTOR_SIZE - sizeof (ptr),
sizeof (ptr), &ptr)) sizeof (ptr), &ptr))
@@ -193,6 +195,7 @@ grub_cbfs_mount (grub_disk_t disk)
return data; return data;
fail: fail:
grub_free (data);
grub_error (GRUB_ERR_BAD_FS, "not a cbfs filesystem"); grub_error (GRUB_ERR_BAD_FS, "not a cbfs filesystem");
return 0; return 0;
} }
+8 -1
View File
@@ -61,7 +61,14 @@ grub_cpio_find_file (struct grub_archelp_data *data, char **name,
modeval = read_number (hd.mode, ARRAY_SIZE (hd.mode)); modeval = read_number (hd.mode, ARRAY_SIZE (hd.mode));
namesize = read_number (hd.namesize, ARRAY_SIZE (hd.namesize)); namesize = read_number (hd.namesize, ARRAY_SIZE (hd.namesize));
if (mode) /* Don't allow negative numbers. */
if (namesize >= 0x80000000)
{
/* Probably a corruption, don't attempt to recover. */
*mode = GRUB_ARCHELP_ATTR_END;
return GRUB_ERR_NONE;
}
*mode = modeval; *mode = modeval;
*name = grub_malloc (namesize + 1); *name = grub_malloc (namesize + 1);
+75 -7
View File
@@ -100,6 +100,7 @@ GRUB_MOD_LICENSE ("GPLv3+");
#define EXT2_FEATURE_INCOMPAT_META_BG 0x0010 #define EXT2_FEATURE_INCOMPAT_META_BG 0x0010
#define EXT4_FEATURE_INCOMPAT_EXTENTS 0x0040 /* Extents used */ #define EXT4_FEATURE_INCOMPAT_EXTENTS 0x0040 /* Extents used */
#define EXT4_FEATURE_INCOMPAT_64BIT 0x0080 #define EXT4_FEATURE_INCOMPAT_64BIT 0x0080
#define EXT4_FEATURE_INCOMPAT_MMP 0x0100
#define EXT4_FEATURE_INCOMPAT_FLEX_BG 0x0200 #define EXT4_FEATURE_INCOMPAT_FLEX_BG 0x0200
/* The set of back-incompatible features this driver DOES support. Add (OR) /* The set of back-incompatible features this driver DOES support. Add (OR)
@@ -107,6 +108,7 @@ GRUB_MOD_LICENSE ("GPLv3+");
#define EXT2_DRIVER_SUPPORTED_INCOMPAT ( EXT2_FEATURE_INCOMPAT_FILETYPE \ #define EXT2_DRIVER_SUPPORTED_INCOMPAT ( EXT2_FEATURE_INCOMPAT_FILETYPE \
| EXT4_FEATURE_INCOMPAT_EXTENTS \ | EXT4_FEATURE_INCOMPAT_EXTENTS \
| EXT4_FEATURE_INCOMPAT_FLEX_BG \ | EXT4_FEATURE_INCOMPAT_FLEX_BG \
| EXT2_FEATURE_INCOMPAT_META_BG \
| EXT4_FEATURE_INCOMPAT_64BIT) | EXT4_FEATURE_INCOMPAT_64BIT)
/* 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
@@ -114,8 +116,13 @@ GRUB_MOD_LICENSE ("GPLv3+");
* journal because they will ignore the journal, but the next * journal because they will ignore the journal, but the next
* ext3 driver to mount the volume will find the journal and * ext3 driver to mount the volume will find the journal and
* replay it, potentially corrupting the metadata written by * replay it, potentially corrupting the metadata written by
* the ext2 drivers. Safe to ignore for this RO driver. */ * the ext2 drivers. Safe to ignore for this RO driver.
#define EXT2_DRIVER_IGNORED_INCOMPAT ( EXT3_FEATURE_INCOMPAT_RECOVER ) * mmp: Not really back-incompatible - was added as such to
* avoid multiple read-write mounts. Safe to ignore for this
* RO driver.
*/
#define EXT2_DRIVER_IGNORED_INCOMPAT ( EXT3_FEATURE_INCOMPAT_RECOVER \
| EXT4_FEATURE_INCOMPAT_MMP)
#define EXT3_JOURNAL_MAGIC_NUMBER 0xc03b3998U #define EXT3_JOURNAL_MAGIC_NUMBER 0xc03b3998U
@@ -331,16 +338,68 @@ static grub_dl_t my_mod;
/* Check is a = b^x for some x. */
static inline int
is_power_of (grub_uint64_t a, grub_uint32_t b)
{
grub_uint64_t c;
/* Prevent overflow assuming b < 8. */
if (a >= (1LL << 60))
return 0;
for (c = 1; c <= a; c *= b);
return (c == a);
}
static inline int
group_has_super_block (struct grub_ext2_data *data, grub_uint64_t group)
{
if (!(data->sblock.feature_ro_compat
& grub_cpu_to_le32_compile_time(EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER)))
return 1;
/* Algorithm looked up in Linux source. */
if (group <= 1)
return 1;
/* Even number is never a power of odd number. */
if (!(group & 1))
return 0;
return (is_power_of(group, 7) || is_power_of(group, 5) ||
is_power_of(group, 3));
}
/* Read into BLKGRP the blockgroup descriptor of blockgroup GROUP of /* Read into BLKGRP the blockgroup descriptor of blockgroup GROUP of
the mounted filesystem DATA. */ the mounted filesystem DATA. */
inline static grub_err_t inline static grub_err_t
grub_ext2_blockgroup (struct grub_ext2_data *data, int group, grub_ext2_blockgroup (struct grub_ext2_data *data, grub_uint64_t group,
struct grub_ext2_block_group *blkgrp) struct grub_ext2_block_group *blkgrp)
{ {
grub_uint64_t full_offset = (group << data->log_group_desc_size);
grub_uint64_t block, offset;
block = (full_offset >> LOG2_BLOCK_SIZE (data));
offset = (full_offset & ((1 << LOG2_BLOCK_SIZE (data)) - 1));
if ((data->sblock.feature_incompat
& grub_cpu_to_le32_compile_time (EXT2_FEATURE_INCOMPAT_META_BG))
&& block >= grub_le_to_cpu32(data->sblock.first_meta_bg))
{
grub_uint64_t first_block_group;
/* Find the first block group for which a descriptor
is stored in given block. */
first_block_group = (block << (LOG2_BLOCK_SIZE (data)
- data->log_group_desc_size));
block = (first_block_group
* grub_le_to_cpu32(data->sblock.blocks_per_group));
if (group_has_super_block (data, first_block_group))
block++;
}
else
/* Superblock. */
block++;
return grub_disk_read (data->disk, return grub_disk_read (data->disk,
((grub_le_to_cpu32 (data->sblock.first_data_block) + 1) ((grub_le_to_cpu32 (data->sblock.first_data_block)
<< LOG2_EXT2_BLOCK_SIZE (data)), + block)
group << data->log_group_desc_size, << LOG2_EXT2_BLOCK_SIZE (data)), offset,
sizeof (struct grub_ext2_block_group), blkgrp); sizeof (struct grub_ext2_block_group), blkgrp);
} }
@@ -484,6 +543,10 @@ grub_ext2_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock)
indirect: indirect:
do { do {
/* If the indirect block is zero, all child blocks are absent
(i.e. filled with zeros.) */
if (indir == 0)
return 0;
if (grub_disk_read (data->disk, if (grub_disk_read (data->disk,
((grub_disk_addr_t) grub_le_to_cpu32 (indir)) ((grub_disk_addr_t) grub_le_to_cpu32 (indir))
<< log2_blksz, << log2_blksz,
@@ -573,7 +636,12 @@ grub_ext2_mount (grub_disk_t disk)
/* Make sure this is an ext2 filesystem. */ /* Make sure this is an ext2 filesystem. */
if (data->sblock.magic != grub_cpu_to_le16_compile_time (EXT2_MAGIC) if (data->sblock.magic != grub_cpu_to_le16_compile_time (EXT2_MAGIC)
|| grub_le_to_cpu32 (data->sblock.log2_block_size) >= 16) || grub_le_to_cpu32 (data->sblock.log2_block_size) >= 16
|| data->sblock.inodes_per_group == 0
/* 20 already means 1GiB blocks. We don't want to deal with blocks overflowing int32. */
|| grub_le_to_cpu32 (data->sblock.log2_block_size) > 20
|| EXT2_INODE_SIZE (data) == 0
|| EXT2_BLOCK_SIZE (data) / EXT2_INODE_SIZE (data) == 0)
{ {
grub_error (GRUB_ERR_BAD_FS, "not an ext2 filesystem"); grub_error (GRUB_ERR_BAD_FS, "not an ext2 filesystem");
goto fail; goto fail;
+1 -1
View File
@@ -1136,7 +1136,7 @@ grub_fat_label (grub_device_t device, char **label)
if (! (data->attr & GRUB_FAT_ATTR_DIRECTORY)) if (! (data->attr & GRUB_FAT_ATTR_DIRECTORY))
{ {
grub_error (GRUB_ERR_BAD_FILE_TYPE, N_("not a directory")); grub_error (GRUB_ERR_BAD_FILE_TYPE, N_("not a directory"));
return 0; goto fail;
} }
err = grub_fat_iterate_init (&ctxt); err = grub_fat_iterate_init (&ctxt);
+7
View File
@@ -252,6 +252,13 @@ grub_fshelp_read_file (grub_disk_t disk, grub_fshelp_node_t node,
grub_disk_addr_t i, blockcnt; grub_disk_addr_t i, blockcnt;
int blocksize = 1 << (log2blocksize + GRUB_DISK_SECTOR_BITS); int blocksize = 1 << (log2blocksize + GRUB_DISK_SECTOR_BITS);
if (pos > filesize)
{
grub_error (GRUB_ERR_OUT_OF_RANGE,
N_("attempt to read past the end of file"));
return -1;
}
/* Adjust LEN so it we can't read past the end of the file. */ /* Adjust LEN so it we can't read past the end of the file. */
if (pos + len > filesize) if (pos + len > filesize)
len = filesize - pos; len = filesize - pos;
+26 -6
View File
@@ -330,6 +330,7 @@ grub_hfs_mount (grub_disk_t disk)
/* Check if this is a HFS filesystem. */ /* Check if this is a HFS filesystem. */
if (grub_be_to_cpu16 (data->sblock.magic) != GRUB_HFS_MAGIC if (grub_be_to_cpu16 (data->sblock.magic) != GRUB_HFS_MAGIC
|| data->sblock.blksz == 0
|| (data->sblock.blksz & grub_cpu_to_be32_compile_time (0xc00001ff))) || (data->sblock.blksz & grub_cpu_to_be32_compile_time (0xc00001ff)))
{ {
grub_error (GRUB_ERR_BAD_FS, "not an HFS filesystem"); grub_error (GRUB_ERR_BAD_FS, "not an HFS filesystem");
@@ -367,9 +368,14 @@ grub_hfs_mount (grub_disk_t disk)
data->cat_root = grub_be_to_cpu32 (treehead.head.root_node); data->cat_root = grub_be_to_cpu32 (treehead.head.root_node);
data->cat_size = grub_be_to_cpu16 (treehead.head.node_size); data->cat_size = grub_be_to_cpu16 (treehead.head.node_size);
if (data->cat_size == 0
|| data->blksz < data->cat_size
|| data->blksz < data->ext_size)
goto fail;
/* Lookup the root directory node in the catalog tree using the /* Lookup the root directory node in the catalog tree using the
volume name. */ volume name. */
key.parent_dir = grub_cpu_to_be32 (1); key.parent_dir = grub_cpu_to_be32_compile_time (1);
key.strlen = data->sblock.volname[0]; key.strlen = data->sblock.volname[0];
grub_strcpy ((char *) key.str, (char *) (data->sblock.volname + 1)); grub_strcpy ((char *) key.str, (char *) (data->sblock.volname + 1));
@@ -686,6 +692,7 @@ grub_hfs_iterate_records (struct grub_hfs_data *data, int type, int idx,
int i; int i;
struct grub_hfs_extent *dat; struct grub_hfs_extent *dat;
int blk; int blk;
grub_uint16_t reccnt;
dat = (struct grub_hfs_extent *) (type == 0 dat = (struct grub_hfs_extent *) (type == 0
? (&data->sblock.catalog_recs) ? (&data->sblock.catalog_recs)
@@ -704,8 +711,12 @@ grub_hfs_iterate_records (struct grub_hfs_data *data, int type, int idx,
return grub_errno; return grub_errno;
} }
reccnt = grub_be_to_cpu16 (node->node.reccnt);
if (reccnt > (nodesize >> 1))
reccnt = (nodesize >> 1);
/* Iterate over all records in this node. */ /* Iterate over all records in this node. */
for (i = 0; i < grub_be_to_cpu16 (node->node.reccnt); i++) for (i = 0; i < reccnt; i++)
{ {
int pos = (nodesize >> 1) - 1 - i; int pos = (nodesize >> 1) - 1 - i;
struct pointer struct pointer
@@ -713,16 +724,19 @@ grub_hfs_iterate_records (struct grub_hfs_data *data, int type, int idx,
grub_uint8_t keylen; grub_uint8_t keylen;
grub_uint8_t key; grub_uint8_t key;
} GRUB_PACKED *pnt; } GRUB_PACKED *pnt;
pnt = (struct pointer *) (grub_be_to_cpu16 (node->offsets[pos]) grub_uint16_t off = grub_be_to_cpu16 (node->offsets[pos]);
+ node->rawnode); if (off > nodesize - sizeof(*pnt))
continue;
pnt = (struct pointer *) (off + node->rawnode);
if (nodesize < (grub_size_t) off + pnt->keylen + 1)
continue;
struct grub_hfs_record rec = struct grub_hfs_record rec =
{ {
&pnt->key, &pnt->key,
pnt->keylen, pnt->keylen,
&pnt->key + pnt->keylen +(pnt->keylen + 1) % 2, &pnt->key + pnt->keylen +(pnt->keylen + 1) % 2,
nodesize - grub_be_to_cpu16 (node->offsets[pos]) nodesize - off - pnt->keylen - 1
- pnt->keylen - 1
}; };
if (node_hook (&node->node, &rec, hook_arg)) if (node_hook (&node->node, &rec, hook_arg))
@@ -1300,6 +1314,12 @@ grub_hfs_open (struct grub_file *file, const char *name)
data = grub_hfs_mount (file->device->disk); data = grub_hfs_mount (file->device->disk);
if (!data)
{
grub_dl_unref (my_mod);
return grub_errno;
}
if (grub_hfs_find_dir (data, name, &frec, 0)) if (grub_hfs_find_dir (data, name, &frec, 0))
{ {
grub_free (data); grub_free (data);
+6
View File
@@ -723,8 +723,11 @@ list_nodes (void *record, void *hook_arg)
/* If the name is obviously invalid, skip this node. */ /* If the name is obviously invalid, skip this node. */
if (catkey->name[i] == 0) if (catkey->name[i] == 0)
{
grub_free (filename);
return 0; return 0;
} }
}
*grub_utf16_to_utf8 ((grub_uint8_t *) filename, catkey->name, *grub_utf16_to_utf8 ((grub_uint8_t *) filename, catkey->name,
grub_be_to_cpu16 (catkey->namelen)) = '\0'; grub_be_to_cpu16 (catkey->namelen)) = '\0';
@@ -745,7 +748,10 @@ list_nodes (void *record, void *hook_arg)
callback function. */ callback function. */
node = grub_malloc (sizeof (*node)); node = grub_malloc (sizeof (*node));
if (!node) if (!node)
{
grub_free (filename);
return 1; return 1;
}
node->data = ctx->dir->data; node->data = ctx->dir->data;
node->compressed = 0; node->compressed = 0;
node->cbuf = 0; node->cbuf = 0;
+3 -2
View File
@@ -959,14 +959,15 @@ grub_iso9660_read (grub_file_t file, char *buf, grub_size_t len)
{ {
struct grub_iso9660_data *data = struct grub_iso9660_data *data =
(struct grub_iso9660_data *) file->data; (struct grub_iso9660_data *) file->data;
grub_err_t err;
/* XXX: The file is stored in as a single extent. */ /* XXX: The file is stored in as a single extent. */
data->disk->read_hook = file->read_hook; data->disk->read_hook = file->read_hook;
data->disk->read_hook_data = file->read_hook_data; data->disk->read_hook_data = file->read_hook_data;
read_node (data->node, file->offset, len, buf); err = read_node (data->node, file->offset, len, buf);
data->disk->read_hook = NULL; data->disk->read_hook = NULL;
if (grub_errno) if (err || grub_errno)
return -1; return -1;
return len; return len;
+47 -31
View File
@@ -65,7 +65,6 @@ typedef grub_uint16_t grub_minix_uintn_t;
#define grub_minix_to_cpu_n grub_minix_to_cpu16 #define grub_minix_to_cpu_n grub_minix_to_cpu16
#endif #endif
#define GRUB_MINIX_INODE_BLKSZ(data) sizeof (grub_minix_uintn_t)
#ifdef MODE_MINIX3 #ifdef MODE_MINIX3
typedef grub_uint32_t grub_minix_ino_t; typedef grub_uint32_t grub_minix_ino_t;
#define grub_minix_to_cpu_ino grub_minix_to_cpu32 #define grub_minix_to_cpu_ino grub_minix_to_cpu32
@@ -83,19 +82,6 @@ typedef grub_uint16_t grub_minix_ino_t;
#define GRUB_MINIX_INODE_DINDIR_ZONE(data) (grub_minix_to_cpu_n \ #define GRUB_MINIX_INODE_DINDIR_ZONE(data) (grub_minix_to_cpu_n \
(data->inode.double_indir_zone)) (data->inode.double_indir_zone))
#ifndef MODE_MINIX3
#define GRUB_MINIX_LOG2_ZONESZ (GRUB_MINIX_LOG2_BSIZE \
+ grub_minix_to_cpu16 (data->sblock.log2_zone_size))
#endif
#define GRUB_MINIX_ZONESZ ((grub_uint64_t) data->block_size << \
(GRUB_DISK_SECTOR_BITS + grub_minix_to_cpu16 (data->sblock.log2_zone_size)))
#ifdef MODE_MINIX3
#define GRUB_MINIX_ZONE2SECT(zone) ((zone) * data->block_size)
#else
#define GRUB_MINIX_ZONE2SECT(zone) ((zone) << GRUB_MINIX_LOG2_ZONESZ)
#endif
#ifdef MODE_MINIX3 #ifdef MODE_MINIX3
struct grub_minix_sblock struct grub_minix_sblock
@@ -172,6 +158,7 @@ struct grub_minix_data
{ {
struct grub_minix_sblock sblock; struct grub_minix_sblock sblock;
struct grub_minix_inode inode; struct grub_minix_inode inode;
grub_uint32_t block_per_zone;
grub_minix_ino_t ino; grub_minix_ino_t ino;
int linknest; int linknest;
grub_disk_t disk; grub_disk_t disk;
@@ -184,6 +171,23 @@ static grub_dl_t my_mod;
static grub_err_t grub_minix_find_file (struct grub_minix_data *data, static grub_err_t grub_minix_find_file (struct grub_minix_data *data,
const char *path); const char *path);
#ifdef MODE_MINIX3
static inline grub_disk_addr_t
grub_minix_zone2sect (struct grub_minix_data *data, grub_minix_uintn_t zone)
{
return ((grub_disk_addr_t) zone) * data->block_size;
}
#else
static inline grub_disk_addr_t
grub_minix_zone2sect (struct grub_minix_data *data, grub_minix_uintn_t zone)
{
int log2_zonesz = (GRUB_MINIX_LOG2_BSIZE
+ grub_minix_to_cpu16 (data->sblock.log2_zone_size));
return (((grub_disk_addr_t) zone) << log2_zonesz);
}
#endif
/* Read the block pointer in ZONE, on the offset NUM. */ /* Read the block pointer in ZONE, on the offset NUM. */
static grub_minix_uintn_t static grub_minix_uintn_t
grub_get_indir (struct grub_minix_data *data, grub_get_indir (struct grub_minix_data *data,
@@ -192,7 +196,7 @@ grub_get_indir (struct grub_minix_data *data,
{ {
grub_minix_uintn_t indirn; grub_minix_uintn_t indirn;
grub_disk_read (data->disk, grub_disk_read (data->disk,
GRUB_MINIX_ZONE2SECT(zone), grub_minix_zone2sect(data, zone),
sizeof (grub_minix_uintn_t) * num, sizeof (grub_minix_uintn_t) * num,
sizeof (grub_minix_uintn_t), (char *) &indirn); sizeof (grub_minix_uintn_t), (char *) &indirn);
return grub_minix_to_cpu_n (indirn); return grub_minix_to_cpu_n (indirn);
@@ -202,8 +206,6 @@ static grub_minix_uintn_t
grub_minix_get_file_block (struct grub_minix_data *data, unsigned int blk) grub_minix_get_file_block (struct grub_minix_data *data, unsigned int blk)
{ {
grub_minix_uintn_t indir; grub_minix_uintn_t indir;
const grub_uint32_t block_per_zone = (GRUB_MINIX_ZONESZ
/ GRUB_MINIX_INODE_BLKSZ (data));
/* Direct block. */ /* Direct block. */
if (blk < GRUB_MINIX_INODE_DIR_BLOCKS) if (blk < GRUB_MINIX_INODE_DIR_BLOCKS)
@@ -211,33 +213,33 @@ grub_minix_get_file_block (struct grub_minix_data *data, unsigned int blk)
/* Indirect block. */ /* Indirect block. */
blk -= GRUB_MINIX_INODE_DIR_BLOCKS; blk -= GRUB_MINIX_INODE_DIR_BLOCKS;
if (blk < block_per_zone) if (blk < data->block_per_zone)
{ {
indir = grub_get_indir (data, GRUB_MINIX_INODE_INDIR_ZONE (data), blk); indir = grub_get_indir (data, GRUB_MINIX_INODE_INDIR_ZONE (data), blk);
return indir; return indir;
} }
/* Double indirect block. */ /* Double indirect block. */
blk -= block_per_zone; blk -= data->block_per_zone;
if (blk < block_per_zone * block_per_zone) if (blk < (grub_uint64_t) data->block_per_zone * (grub_uint64_t) data->block_per_zone)
{ {
indir = grub_get_indir (data, GRUB_MINIX_INODE_DINDIR_ZONE (data), indir = grub_get_indir (data, GRUB_MINIX_INODE_DINDIR_ZONE (data),
blk / block_per_zone); blk / data->block_per_zone);
indir = grub_get_indir (data, indir, blk % block_per_zone); indir = grub_get_indir (data, indir, blk % data->block_per_zone);
return indir; return indir;
} }
#if defined (MODE_MINIX3) || defined (MODE_MINIX2) #if defined (MODE_MINIX3) || defined (MODE_MINIX2)
blk -= block_per_zone * block_per_zone; blk -= data->block_per_zone * data->block_per_zone;
if (blk < ((grub_uint64_t) block_per_zone * (grub_uint64_t) block_per_zone if (blk < ((grub_uint64_t) data->block_per_zone * (grub_uint64_t) data->block_per_zone
* (grub_uint64_t) block_per_zone)) * (grub_uint64_t) data->block_per_zone))
{ {
indir = grub_get_indir (data, grub_minix_to_cpu_n (data->inode.triple_indir_zone), indir = grub_get_indir (data, grub_minix_to_cpu_n (data->inode.triple_indir_zone),
(blk / block_per_zone) / block_per_zone); (blk / data->block_per_zone) / data->block_per_zone);
indir = grub_get_indir (data, indir, (blk / block_per_zone) % block_per_zone); indir = grub_get_indir (data, indir, (blk / data->block_per_zone) % data->block_per_zone);
indir = grub_get_indir (data, indir, blk % block_per_zone); indir = grub_get_indir (data, indir, blk % data->block_per_zone);
return indir; return indir;
} }
@@ -262,6 +264,13 @@ grub_minix_read_file (struct grub_minix_data *data,
grub_uint32_t posblock; grub_uint32_t posblock;
grub_uint32_t blockoff; grub_uint32_t blockoff;
if (pos > GRUB_MINIX_INODE_SIZE (data))
{
grub_error (GRUB_ERR_OUT_OF_RANGE,
N_("attempt to read past the end of file"));
return -1;
}
/* Adjust len so it we can't read past the end of the file. */ /* Adjust len so it we can't read past the end of the file. */
if (len + pos > GRUB_MINIX_INODE_SIZE (data)) if (len + pos > GRUB_MINIX_INODE_SIZE (data))
len = GRUB_MINIX_INODE_SIZE (data) - pos; len = GRUB_MINIX_INODE_SIZE (data) - pos;
@@ -278,7 +287,7 @@ grub_minix_read_file (struct grub_minix_data *data,
for (i = posblock; i < blockcnt; i++) for (i = posblock; i < blockcnt; i++)
{ {
grub_disk_addr_t blknr; grub_minix_uintn_t blknr;
grub_uint64_t blockend = data->block_size << GRUB_DISK_SECTOR_BITS; grub_uint64_t blockend = data->block_size << GRUB_DISK_SECTOR_BITS;
grub_off_t skipfirst = 0; grub_off_t skipfirst = 0;
@@ -307,7 +316,7 @@ grub_minix_read_file (struct grub_minix_data *data,
data->disk->read_hook = read_hook; data->disk->read_hook = read_hook;
data->disk->read_hook_data = read_hook_data; data->disk->read_hook_data = read_hook_data;
grub_disk_read (data->disk, grub_disk_read (data->disk,
GRUB_MINIX_ZONE2SECT(blknr), grub_minix_zone2sect(data, blknr),
skipfirst, blockend, buf); skipfirst, blockend, buf);
data->disk->read_hook = 0; data->disk->read_hook = 0;
if (grub_errno) if (grub_errno)
@@ -333,7 +342,8 @@ grub_minix_read_inode (struct grub_minix_data *data, grub_minix_ino_t ino)
/* The first inode in minix is inode 1. */ /* The first inode in minix is inode 1. */
ino--; ino--;
block = GRUB_MINIX_ZONE2SECT (2 + grub_minix_to_cpu16 (sblock->inode_bmap_size) block = grub_minix_zone2sect (data,
2 + grub_minix_to_cpu16 (sblock->inode_bmap_size)
+ grub_minix_to_cpu16 (sblock->zone_bmap_size)); + grub_minix_to_cpu16 (sblock->zone_bmap_size));
block += ino / (GRUB_DISK_SECTOR_SIZE / sizeof (struct grub_minix_inode)); block += ino / (GRUB_DISK_SECTOR_SIZE / sizeof (struct grub_minix_inode));
int offs = (ino % (GRUB_DISK_SECTOR_SIZE int offs = (ino % (GRUB_DISK_SECTOR_SIZE
@@ -508,6 +518,12 @@ grub_minix_mount (grub_disk_t disk)
data->block_size = 2; data->block_size = 2;
#endif #endif
data->block_per_zone = (((grub_uint64_t) data->block_size << \
(GRUB_DISK_SECTOR_BITS + grub_minix_to_cpu16 (data->sblock.log2_zone_size)))
/ sizeof (grub_minix_uintn_t));
if (!data->block_per_zone)
goto fail;
return data; return data;
fail: fail:
+4
View File
@@ -724,6 +724,10 @@ grub_nilfs2_valid_sb (struct grub_nilfs2_super_block *sbp)
if (grub_le_to_cpu32 (sbp->s_rev_level) != NILFS_SUPORT_REV) if (grub_le_to_cpu32 (sbp->s_rev_level) != NILFS_SUPORT_REV)
return 0; return 0;
/* 20 already means 1GiB blocks. We don't want to deal with blocks overflowing int32. */
if (grub_le_to_cpu32 (sbp->s_log_block_size) > 20)
return 0;
return 1; return 1;
} }
+7
View File
@@ -618,7 +618,10 @@ list_file (struct grub_ntfs_file *diro, grub_uint8_t *pos,
ustr = get_utf8 (np, ns); ustr = get_utf8 (np, ns);
if (ustr == NULL) if (ustr == NULL)
{
grub_free (fdiro);
return 0; return 0;
}
if (namespace) if (namespace)
type |= GRUB_FSHELP_CASE_INSENSITIVE; type |= GRUB_FSHELP_CASE_INSENSITIVE;
@@ -917,12 +920,16 @@ grub_ntfs_mount (grub_disk_t disk)
if (bpb.clusters_per_mft > 0) if (bpb.clusters_per_mft > 0)
data->mft_size = ((grub_disk_addr_t) bpb.clusters_per_mft) << data->log_spc; data->mft_size = ((grub_disk_addr_t) bpb.clusters_per_mft) << data->log_spc;
else if (-bpb.clusters_per_mft < GRUB_NTFS_BLK_SHR || -bpb.clusters_per_mft >= 31)
goto fail;
else else
data->mft_size = 1ULL << (-bpb.clusters_per_mft - GRUB_NTFS_BLK_SHR); data->mft_size = 1ULL << (-bpb.clusters_per_mft - GRUB_NTFS_BLK_SHR);
if (bpb.clusters_per_index > 0) if (bpb.clusters_per_index > 0)
data->idx_size = (((grub_disk_addr_t) bpb.clusters_per_index) data->idx_size = (((grub_disk_addr_t) bpb.clusters_per_index)
<< data->log_spc); << data->log_spc);
else if (-bpb.clusters_per_index < GRUB_NTFS_BLK_SHR || -bpb.clusters_per_index >= 31)
goto fail;
else else
data->idx_size = 1ULL << (-bpb.clusters_per_index - GRUB_NTFS_BLK_SHR); data->idx_size = 1ULL << (-bpb.clusters_per_index - GRUB_NTFS_BLK_SHR);
+7 -7
View File
@@ -365,7 +365,7 @@ grub_reiserfs_set_key_offset (struct grub_reiserfs_key *key,
key->u.v1.offset = grub_cpu_to_le32 (value); key->u.v1.offset = grub_cpu_to_le32 (value);
else else
key->u.v2.offset_type \ key->u.v2.offset_type \
= ((key->u.v2.offset_type & grub_cpu_to_le64 (15ULL << 60)) = ((key->u.v2.offset_type & grub_cpu_to_le64_compile_time (15ULL << 60))
| grub_cpu_to_le64 (value & (~0ULL >> 4))); | grub_cpu_to_le64 (value & (~0ULL >> 4)));
} }
@@ -412,7 +412,7 @@ grub_reiserfs_set_key_type (struct grub_reiserfs_key *key,
key->u.v1.type = grub_cpu_to_le32 (type); key->u.v1.type = grub_cpu_to_le32 (type);
else else
key->u.v2.offset_type key->u.v2.offset_type
= ((key->u.v2.offset_type & grub_cpu_to_le64 (~0ULL >> 4)) = ((key->u.v2.offset_type & grub_cpu_to_le64_compile_time (~0ULL >> 4))
| grub_cpu_to_le64 ((grub_uint64_t) type << 60)); | grub_cpu_to_le64 ((grub_uint64_t) type << 60));
assert (grub_reiserfs_get_key_type (key) == grub_type); assert (grub_reiserfs_get_key_type (key) == grub_type);
@@ -997,8 +997,8 @@ grub_reiserfs_open (struct grub_file *file, const char *name)
data = grub_reiserfs_mount (file->device->disk); data = grub_reiserfs_mount (file->device->disk);
if (! data) if (! data)
goto fail; goto fail;
key.directory_id = grub_cpu_to_le32 (1); key.directory_id = grub_cpu_to_le32_compile_time (1);
key.object_id = grub_cpu_to_le32 (2); key.object_id = grub_cpu_to_le32_compile_time (2);
key.u.v2.offset_type = 0; key.u.v2.offset_type = 0;
grub_reiserfs_set_key_type (&key, GRUB_REISERFS_DIRECTORY, 2); grub_reiserfs_set_key_type (&key, GRUB_REISERFS_DIRECTORY, 2);
grub_reiserfs_set_key_offset (&key, 1); grub_reiserfs_set_key_offset (&key, 1);
@@ -1090,7 +1090,7 @@ grub_reiserfs_read_real (struct grub_fshelp_node *node,
switch (found.type) switch (found.type)
{ {
case GRUB_REISERFS_DIRECT: case GRUB_REISERFS_DIRECT:
block = found.block_number * (block_size >> GRUB_DISK_SECTOR_BITS); block = ((grub_disk_addr_t) found.block_number) * (block_size >> GRUB_DISK_SECTOR_BITS);
grub_dprintf ("reiserfs_blocktype", "D: %u\n", (unsigned) block); grub_dprintf ("reiserfs_blocktype", "D: %u\n", (unsigned) block);
if (initial_position < current_position + item_size) if (initial_position < current_position + item_size)
{ {
@@ -1289,8 +1289,8 @@ grub_reiserfs_dir (grub_device_t device, const char *path,
data = grub_reiserfs_mount (device->disk); data = grub_reiserfs_mount (device->disk);
if (! data) if (! data)
goto fail; goto fail;
root_key.directory_id = grub_cpu_to_le32 (1); root_key.directory_id = grub_cpu_to_le32_compile_time (1);
root_key.object_id = grub_cpu_to_le32 (2); root_key.object_id = grub_cpu_to_le32_compile_time (2);
root_key.u.v2.offset_type = 0; root_key.u.v2.offset_type = 0;
grub_reiserfs_set_key_type (&root_key, GRUB_REISERFS_DIRECTORY, 2); grub_reiserfs_set_key_type (&root_key, GRUB_REISERFS_DIRECTORY, 2);
grub_reiserfs_set_key_offset (&root_key, 1); grub_reiserfs_set_key_offset (&root_key, 1);
+11 -6
View File
@@ -173,10 +173,11 @@ grub_sfs_read_extent (struct grub_sfs_data *data, unsigned int block,
struct grub_sfs_btree *tree; struct grub_sfs_btree *tree;
int i; int i;
grub_uint32_t next; grub_uint32_t next;
grub_size_t blocksize = GRUB_DISK_SECTOR_SIZE << data->log_blocksize;
treeblock = grub_malloc (GRUB_DISK_SECTOR_SIZE << data->log_blocksize); treeblock = grub_malloc (blocksize);
if (!block) if (!treeblock)
return 0; return grub_errno;
next = grub_be_to_cpu32 (data->rblock.btree); next = grub_be_to_cpu32 (data->rblock.btree);
tree = (struct grub_sfs_btree *) treeblock; tree = (struct grub_sfs_btree *) treeblock;
@@ -184,17 +185,21 @@ grub_sfs_read_extent (struct grub_sfs_data *data, unsigned int block,
/* Handle this level in the btree. */ /* Handle this level in the btree. */
do do
{ {
grub_uint16_t nnodes;
grub_disk_read (data->disk, grub_disk_read (data->disk,
((grub_disk_addr_t) next) << data->log_blocksize, ((grub_disk_addr_t) next) << data->log_blocksize,
0, GRUB_DISK_SECTOR_SIZE << data->log_blocksize, 0, blocksize, treeblock);
treeblock);
if (grub_errno) if (grub_errno)
{ {
grub_free (treeblock); grub_free (treeblock);
return grub_errno; return grub_errno;
} }
for (i = grub_be_to_cpu16 (tree->nodes) - 1; i >= 0; i--) nnodes = grub_be_to_cpu16 (tree->nodes);
if (nnodes * (grub_uint32_t) (tree)->nodesize > blocksize)
break;
for (i = (int) nnodes - 1; i >= 0; i--)
{ {
#define EXTNODE(tree, index) \ #define EXTNODE(tree, index) \
+1
View File
@@ -986,6 +986,7 @@ grub_udf_read_symlink (grub_fshelp_node_t node)
case 1: case 1:
if (ptr[1]) if (ptr[1])
goto fail; goto fail;
/* Fallthrough. */
case 2: case 2:
/* in 4 bytes. out: 1 byte. */ /* in 4 bytes. out: 1 byte. */
optr = out; optr = out;
Loaded 100 of 355 files, more files were not shown because too many files have changed in this diff. Show more