Compare commits

..
Author SHA1 Message Date
Paulo Flabiano Smorigo b14d85db89 Suport for bi-endianess in elf file
* grub-core/kern/elf.c: check and switch endianess with grub_{be,le}_to
cpu functions.
* grub-core/kern/elfXX.c: Likewise.

Also-by: Tomohiro B Berry <tbberry@us.ibm.com>
2015-01-23 08:03:30 -02:00
Paulo Flabiano Smorigo 21143c3fde Skip libgcc dependency for powerpc
* configure.ac: Add conditions to avoid libgcc dependency.
* Makefile.am: Likewise.
* Makefile.core.def: Include compiler-rt.S and compiler-rt.c.
* compiler-rt.c: New file.
* compiler-rt.S: Likewise.
* compiler-rt.h: Likewise.

Also-By: Brent Baude <bbaude@redhat.com>
Also-By: Vladimir 'phcoder' Serbinenko <phcoder@gmail.com>
2015-01-23 08:01:48 -02:00
Paulo Flabiano Smorigo 872dec5684 Add powerpc little-endian (ppc64le) flags
libgcc dependency was removed *just* for this target because
the distros that use ppc64el doesn't have 32-bit support on it.

* configure.ac: Add targets for powerpc64el and skip libgcc.
* Makefile.am: Likewise.
2015-01-23 08:00:13 -02:00
346 changed files with 3886 additions and 13890 deletions

No files matched your search

-9
View File
@@ -1,12 +1,3 @@
2015-01-23 Vladimir Serbinenko <phcoder@gmail.com>
* tests/file_filter/file: Really add missing file.
2015-01-23 Andrei Borzenkov <arvidjaar@gmail.com>
* grub-core/disk/xen/xendisk.c: Accept hdX as disk names on Xen to
allow legacy menu.lst processing.
2015-01-22 Felix Janda <felix.janda@posteo.de> 2015-01-22 Felix Janda <felix.janda@posteo.de>
Remove direct _llseek code and require long filesystem libc. Remove direct _llseek code and require long filesystem libc.
+4 -11
View File
@@ -13,9 +13,6 @@ 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
@@ -29,8 +26,7 @@ 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 3.5 or later works for sparc64 Note: clang doesn't support -mno-app-regs and so can't be used 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
@@ -104,9 +100,6 @@ The simplest way to compile this package is:
3. Type `./autogen.sh'. 3. Type `./autogen.sh'.
* autogen.sh uses python. By default invocation is "python" but can be
overriden by setting variable $PYTHON.
4. Type `./configure' to configure the package for your system. 4. Type `./configure' to configure the package for your system.
If you're using `csh' on an old version of System V, you might If you're using `csh' on an old version of System V, you might
need to type `sh ./configure' instead to prevent `csh' from trying need to type `sh ./configure' instead to prevent `csh' from trying
@@ -182,9 +175,9 @@ corresponding platform are not needed for the platform in question.
- 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. HOST_CFLAGS= for C options for host. 3. CFLAGS= for C options for host.
4. HOST_CPPFLAGS= for C preprocessor options for host. 4. CPPFLAGS= for C preprocessor options for host.
5. HOST_LDFLAGS= for linker options for host. 5. 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).
+34 -60
View File
@@ -89,21 +89,16 @@ 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)
dejavu_10.pf2: $(DJVU_FONT_SOURCE) build-grub-mkfont$(BUILD_EXEEXT) dejavu_10.pf2: $(DJVU_FONT_SOURCE) build-grub-mkfont
./build-grub-mkfont$(BUILD_EXEEXT) -s 10 -o $@ $(DJVU_FONT_SOURCE) ./build-grub-mkfont -s 10 -o $@ $(DJVU_FONT_SOURCE)
CLEANFILES += dejavu_10.pf2 dejavu_12.pf2: $(DJVU_FONT_SOURCE) build-grub-mkfont
dejavu_12.pf2: $(DJVU_FONT_SOURCE) build-grub-mkfont$(BUILD_EXEEXT) ./build-grub-mkfont -s 12 -o $@ $(DJVU_FONT_SOURCE)
./build-grub-mkfont$(BUILD_EXEEXT) -s 12 -o $@ $(DJVU_FONT_SOURCE) dejavu_14.pf2: $(DJVU_FONT_SOURCE) build-grub-mkfont
CLEANFILES += dejavu_12.pf2 ./build-grub-mkfont -s 14 -o $@ $(DJVU_FONT_SOURCE)
dejavu_14.pf2: $(DJVU_FONT_SOURCE) build-grub-mkfont$(BUILD_EXEEXT) dejavu_bold_14.pf2: $(DJVU_FONT_SOURCE) build-grub-mkfont
./build-grub-mkfont$(BUILD_EXEEXT) -s 14 -o $@ $(DJVU_FONT_SOURCE) ./build-grub-mkfont -b -s 14 -o $@ $(DJVU_FONT_SOURCE)
CLEANFILES += dejavu_14.pf2 dejavu_16.pf2: $(DJVU_FONT_SOURCE) build-grub-mkfont
dejavu_bold_14.pf2: $(DJVU_FONT_SOURCE) build-grub-mkfont$(BUILD_EXEEXT) ./build-grub-mkfont -s 16 -o $@ $(DJVU_FONT_SOURCE)
./build-grub-mkfont$(BUILD_EXEEXT) -b -s 14 -o $@ $(DJVU_FONT_SOURCE)
CLEANFILES += dejavu_bold_14.pf2
dejavu_16.pf2: $(DJVU_FONT_SOURCE) build-grub-mkfont$(BUILD_EXEEXT)
./build-grub-mkfont$(BUILD_EXEEXT) -s 16 -o $@ $(DJVU_FONT_SOURCE)
CLEANFILES += dejavu_16.pf2
else else
starfield_DATA = starfield_DATA =
endif endif
@@ -111,28 +106,28 @@ endif
EXTRA_DIST += $(starfield_theme_files) EXTRA_DIST += $(starfield_theme_files)
EXTRA_DIST += $(srcdir)/themes/starfield/src/slider_s.xcf $(srcdir)/themes/starfield/src/slider_n.xcf $(srcdir)/themes/starfield/src/slider_c.xcf $(srcdir)/themes/starfield/src/blob_nw.xcf $(srcdir)/themes/starfield/src/bootmenu/center.xcf $(srcdir)/themes/starfield/src/bootmenu/corner.xcf $(srcdir)/themes/starfield/src/bootmenu/side.xcf $(srcdir)/themes/starfield/src/terminalbox/side.xcf $(srcdir)/themes/starfield/src/terminalbox/corner.xcf $(srcdir)/themes/starfield/src/terminalbox/center.xcf EXTRA_DIST += $(srcdir)/themes/starfield/src/slider_s.xcf $(srcdir)/themes/starfield/src/slider_n.xcf $(srcdir)/themes/starfield/src/slider_c.xcf $(srcdir)/themes/starfield/src/blob_nw.xcf $(srcdir)/themes/starfield/src/bootmenu/center.xcf $(srcdir)/themes/starfield/src/bootmenu/corner.xcf $(srcdir)/themes/starfield/src/bootmenu/side.xcf $(srcdir)/themes/starfield/src/terminalbox/side.xcf $(srcdir)/themes/starfield/src/terminalbox/corner.xcf $(srcdir)/themes/starfield/src/terminalbox/center.xcf
unicode.pf2: $(FONT_SOURCE) build-grub-mkfont$(BUILD_EXEEXT) unicode.pf2: $(FONT_SOURCE) build-grub-mkfont
./build-grub-mkfont$(BUILD_EXEEXT) -o $@ $(FONT_SOURCE) || (rm -f $@; exit 1) ./build-grub-mkfont -o $@ $(FONT_SOURCE) || (rm -f $@; exit 1)
CLEANFILES += unicode.pf2 CLEANFILES += unicode.pf2
# Arrows and lines are needed to draw the menu, so always include them # Arrows and lines are needed to draw the menu, so always include them
UNICODE_ARROWS=0x2190-0x2193 UNICODE_ARROWS=0x2190-0x2193
UNICODE_LINES=0x2501-0x251B UNICODE_LINES=0x2501-0x251B
ascii.pf2: $(FONT_SOURCE) build-grub-mkfont$(BUILD_EXEEXT) ascii.pf2: $(FONT_SOURCE) build-grub-mkfont
./build-grub-mkfont$(BUILD_EXEEXT) -o $@ $(FONT_SOURCE) -r 0x0-0x7f,$(UNICODE_ARROWS),$(UNICODE_LINES) || (rm -f $@; exit 1) ./build-grub-mkfont -o $@ $(FONT_SOURCE) -r 0x0-0x7f,$(UNICODE_ARROWS),$(UNICODE_LINES) || (rm -f $@; exit 1)
CLEANFILES += ascii.pf2 CLEANFILES += ascii.pf2
euro.pf2: $(FONT_SOURCE) build-grub-mkfont$(BUILD_EXEEXT) euro.pf2: $(FONT_SOURCE) build-grub-mkfont
./build-grub-mkfont$(BUILD_EXEEXT) -o $@ $(FONT_SOURCE) -r 0x0-0x4ff,0x1e00-0x1fff,$(UNICODE_ARROWS),$(UNICODE_LINES) || (rm -f $@; exit 1) ./build-grub-mkfont -o $@ $(FONT_SOURCE) -r 0x0-0x4ff,0x1e00-0x1fff,$(UNICODE_ARROWS),$(UNICODE_LINES) || (rm -f $@; exit 1)
CLEANFILES += euro.pf2 CLEANFILES += euro.pf2
ascii.h: $(FONT_SOURCE) build-grub-gen-asciih$(BUILD_EXEEXT) ascii.h: $(FONT_SOURCE) build-grub-gen-asciih
./build-grub-gen-asciih$(BUILD_EXEEXT) $(FONT_SOURCE) $@ || (rm -f $@; exit 1) ./build-grub-gen-asciih $(FONT_SOURCE) $@ || (rm -f $@; exit 1)
CLEANFILES += ascii.h CLEANFILES += ascii.h
widthspec.h: $(FONT_SOURCE) build-grub-gen-widthspec$(BUILD_EXEEXT) widthspec.h: $(FONT_SOURCE) build-grub-gen-widthspec
./build-grub-gen-widthspec$(BUILD_EXEEXT) $(FONT_SOURCE) $@ || (rm -f $@; exit 1) ./build-grub-gen-widthspec $(FONT_SOURCE) $@ || (rm -f $@; exit 1)
CLEANFILES += widthspec.h CLEANFILES += widthspec.h
# Install config.h into platformdir # Install config.h into platformdir
@@ -345,35 +340,33 @@ bootcheck-ntldr: ntldr.bin $(srcdir)/grub-core/tests/boot/ntldr.cfg grub-shell
./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=$(QEMU32) --files=/ntldr.bin=ntldr.bin $(srcdir)/grub-core/tests/boot/ntldr.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null ./grub-shell --timeout=$(BOOTCHECK_TIMEOUT) --qemu=$(QEMU32) --files=/ntldr.bin=ntldr.bin $(srcdir)/grub-core/tests/boot/ntldr.cfg | grep $(SUCCESSFUL_BOOT_STRING) > /dev/null
if COND_i386_efi if COND_i386_efi
# NetBSD has no support for finding ACPI on EFI BOOTCHECKS = bootcheck-kfreebsd-aout bootcheck-kopenbsd-i386 bootcheck-kopenbsd-x86_64 bootcheck-multiboot bootcheck-multiboot2 bootcheck-linux-i386 bootcheck-linux-x86_64 bootcheck-knetbsd-x86_64 bootcheck-kfreebsd-x86_64 bootcheck-kfreebsd-i386
BOOTCHECKS = bootcheck-kfreebsd-aout bootcheck-kopenbsd-i386 bootcheck-kopenbsd-x86_64 bootcheck-multiboot bootcheck-multiboot2 bootcheck-linux-i386 bootcheck-linux-x86_64 bootcheck-kfreebsd-x86_64 bootcheck-kfreebsd-i386
endif endif
if COND_x86_64_efi if COND_x86_64_efi
# NetBSD has no support for finding ACPI on EFI BOOTCHECKS = bootcheck-kfreebsd-aout bootcheck-kopenbsd-i386 bootcheck-kopenbsd-x86_64 bootcheck-multiboot bootcheck-multiboot2 bootcheck-linux-i386 bootcheck-linux-x86_64 bootcheck-knetbsd-x86_64 bootcheck-kfreebsd-x86_64 bootcheck-kfreebsd-i386
BOOTCHECKS = bootcheck-kfreebsd-aout bootcheck-kopenbsd-i386 bootcheck-kopenbsd-x86_64 bootcheck-multiboot bootcheck-multiboot2 bootcheck-linux-i386 bootcheck-linux-x86_64 bootcheck-kfreebsd-x86_64 bootcheck-kfreebsd-i386
endif endif
if COND_i386_multiboot if COND_i386_multiboot
# *BSD requires ACPI # FreeBSD requires ACPI
BOOTCHECKS = bootcheck-kfreebsd-aout bootcheck-multiboot bootcheck-multiboot2 bootcheck-linux-i386 bootcheck-linux-x86_64 BOOTCHECKS = bootcheck-kfreebsd-aout bootcheck-kopenbsd-i386 bootcheck-kopenbsd-x86_64 bootcheck-multiboot bootcheck-multiboot2 bootcheck-linux-i386 bootcheck-linux-x86_64 bootcheck-knetbsd-x86_64
endif
if COND_i386_qemu
# *BSD requires ACPI
BOOTCHECKS = bootcheck-kfreebsd-aout bootcheck-multiboot bootcheck-multiboot2 bootcheck-linux-i386 bootcheck-linux-x86_64
endif endif
if COND_i386_coreboot if COND_i386_coreboot
BOOTCHECKS = bootcheck-kfreebsd-aout bootcheck-kopenbsd-i386 bootcheck-kopenbsd-x86_64 bootcheck-multiboot bootcheck-multiboot2 bootcheck-linux-i386 bootcheck-linux-x86_64 bootcheck-knetbsd-x86_64 bootcheck-kfreebsd-x86_64 bootcheck-kfreebsd-i386 # Freebsd requires ACPI
BOOTCHECKS = bootcheck-kfreebsd-aout bootcheck-kopenbsd-i386 bootcheck-kopenbsd-x86_64 bootcheck-multiboot bootcheck-multiboot2 bootcheck-linux-i386 bootcheck-linux-x86_64 bootcheck-knetbsd-x86_64
endif
if COND_i386_qemu
# FreeBSD requires ACPI
BOOTCHECKS = bootcheck-kfreebsd-aout bootcheck-kopenbsd-i386 bootcheck-kopenbsd-x86_64 bootcheck-multiboot bootcheck-multiboot2 bootcheck-linux-i386 bootcheck-linux-x86_64 bootcheck-knetbsd-x86_64
endif endif
if COND_i386_pc if COND_i386_pc
#pc chainloader by definition is only for i386-pc #pc chainloader by definition is only for i386-pc
#ntldr and bootmgr require BIOS. #ntldr and bootmgr require BIOS.
#legacy protocol (linux16) makes early BIOS calls. #legacy protocol makes early BIOS calls.
# 32-bit NetBSD crashes early on non-BIOS # NetBSD crashes early on non-BIOS
BOOTCHECKS = bootcheck-kfreebsd-aout bootcheck-kopenbsd-i386 bootcheck-kopenbsd-x86_64 bootcheck-multiboot bootcheck-multiboot2 bootcheck-linux-i386 bootcheck-linux-x86_64 bootcheck-knetbsd-x86_64 bootcheck-kfreebsd-x86_64 bootcheck-kfreebsd-i386 bootcheck-pc-chainloader bootcheck-ntldr bootcheck-linux16-i386 bootcheck-linux16-x86_64 bootcheck-knetbsd-i386 BOOTCHECKS = bootcheck-kfreebsd-aout bootcheck-kopenbsd-i386 bootcheck-kopenbsd-x86_64 bootcheck-multiboot bootcheck-multiboot2 bootcheck-linux-i386 bootcheck-linux-x86_64 bootcheck-knetbsd-x86_64 bootcheck-kfreebsd-x86_64 bootcheck-kfreebsd-i386 bootcheck-pc-chainloader bootcheck-ntldr bootcheck-linux16-i386 bootcheck-linux16-x86_64 bootcheck-knetbsd-i386
endif endif
@@ -399,7 +392,7 @@ endif
.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 FORCE bootcheck-linux-mips
# Randomly generated # Randomly generated
SUCCESSFUL_BOOT_STRING=3e49994fd5d82b7c9298d672d774080d SUCCESSFUL_BOOT_STRING=3e49994fd5d82b7c9298d672d774080d
@@ -446,22 +439,3 @@ windowszip: windowsdir
rm -rf $(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
+2 -13
View File
@@ -48,7 +48,6 @@ library = {
common = grub-core/partmap/gpt.c; common = grub-core/partmap/gpt.c;
common = grub-core/partmap/msdos.c; common = grub-core/partmap/msdos.c;
common = grub-core/fs/proc.c; common = grub-core/fs/proc.c;
common = grub-core/fs/archelp.c;
}; };
library = { library = {
@@ -92,6 +91,7 @@ library = {
common = grub-core/fs/bfs.c; common = grub-core/fs/bfs.c;
common = grub-core/fs/btrfs.c; common = grub-core/fs/btrfs.c;
common = grub-core/fs/cbfs.c; common = grub-core/fs/cbfs.c;
common = grub-core/fs/archelp.c;
common = grub-core/fs/cpio.c; common = grub-core/fs/cpio.c;
common = grub-core/fs/cpio_be.c; common = grub-core/fs/cpio_be.c;
common = grub-core/fs/odc.c; common = grub-core/fs/odc.c;
@@ -613,6 +613,7 @@ program = {
common = grub-core/disk/host.c; common = grub-core/disk/host.c;
common = util/resolve.c; common = util/resolve.c;
enable = noemu;
common = grub-core/kern/emu/argp_common.c; common = grub-core/kern/emu/argp_common.c;
common = grub-core/osdep/init.c; common = grub-core/osdep/init.c;
@@ -1155,18 +1156,6 @@ script = {
common = tests/file_filter_test.in; 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;
-17
View File
@@ -17,7 +17,6 @@ New in 2.02:
files. files.
* ZFS features support. * ZFS features support.
* ZFS LZ4 support. * ZFS LZ4 support.
* XFS V5 format support.
* New/improved terminal and video support: * New/improved terminal and video support:
* Monochrome text (matching `hercules' in GRUB Legacy). * Monochrome text (matching `hercules' in GRUB Legacy).
@@ -59,7 +58,6 @@ New in 2.02:
* Command for inspecting coreboot tables (`lscoreboot'). * Command for inspecting coreboot tables (`lscoreboot').
* New target default_payload.elf. * New target default_payload.elf.
* Increased maximal core size. * Increased maximal core size.
* Prefer pmtimer for TSC calibration.
* New/improved platform support: * New/improved platform support:
* New `efifwsetup' and `lsefi' commands on EFI platforms. * New `efifwsetup' and `lsefi' commands on EFI platforms.
@@ -87,15 +85,6 @@ New in 2.02:
* Support for USB debug dongles. * Support for USB debug dongles.
* Support for *-emu on all platforms (previously only i386/x86_64 worked). * Support for *-emu on all platforms (previously only i386/x86_64 worked).
* Support *-emu on Windows. * Support *-emu on Windows.
* New platform `none' which builds only user level utilities. This is now
default if target CPU is not supported.
* Support for booting little-endian Linux kernel on powerpc.
* Support network boot with Oracle sun4v vnet devices.
* Added SAS disks to the IEEE 1275 Open Firmware device list.
* Try multiple methods for TSC (timestamp counter) calibration - PIT, pmtimer,
EFI Stall. If everything fails, use hardcoded frequency 800MHz.
* Support Hyper-V Gen2 platforms which lack PIT for TSC calibration.
* Map UEFI Persistent Memory to E820 persistent memory.
* Security: * Security:
* Add optional facility to enforce that all files read by the core image * Add optional facility to enforce that all files read by the core image
@@ -154,12 +143,6 @@ New in 2.02:
Python 2.6. Python 2.6.
* modinfo.sh contains build information now. * modinfo.sh contains build information now.
* Added many new tests to improve robustness. * Added many new tests to improve robustness.
* Target is built without libgcc now. Necessary builtins are reimplemented
directly. This removes requirement for target-specific runtime on build
system.
* emu libusb support removed (was broken and unmaintained).
* powerpc64le compile support.
* Use fixed timestamp when generating GRUB image for reproducible builds.
* Revision control moved to git. * Revision control moved to git.
+2
View File
@@ -12,6 +12,8 @@ The URL is <http://www.gnu.org/software/grub/grub.html>.
More extensive documentation is available in the Info manual, More extensive documentation is available in the Info manual,
accessible using 'info grub' after building and installing GRUB 2. accessible using 'info grub' after building and installing GRUB 2.
Please look at the GRUB Wiki <http://grub.enbug.org> for testing
procedures.
There are a number of important user-visible differences from the There are a number of important user-visible differences from the
first version of GRUB, now known as GRUB Legacy. For a summary, please first version of GRUB, now known as GRUB Legacy. For a summary, please
+75 -1
View File
@@ -93,7 +93,7 @@ else
fi fi
grub_cv_prog_objcopy_absolute=yes grub_cv_prog_objcopy_absolute=yes
for link_addr in 0x2000 0x8000 0x7C00; do for link_addr in 0x2000 0x8000 0x7C00; do
if AC_TRY_COMMAND([${CC-cc} ${TARGET_CFLAGS} ${TARGET_LDFLAGS} -nostdlib ${TARGET_IMG_LDFLAGS_AC} ${TARGET_IMG_BASE_LDOPT},$link_addr conftest.o -o conftest.exec]); then : if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -nostdlib ${TARGET_IMG_LDFLAGS_AC} ${TARGET_IMG_BASE_LDOPT},$link_addr conftest.o -o conftest.exec]); then :
else else
AC_MSG_ERROR([${CC-cc} cannot link at address $link_addr]) AC_MSG_ERROR([${CC-cc} cannot link at address $link_addr])
fi fi
@@ -210,6 +210,80 @@ 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],
-20
View File
@@ -1,20 +0,0 @@
/* 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
-14
View File
@@ -1,14 +0,0 @@
/* 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
jmp nearer
.org 6
.space 100
nearer:
.space 200
far:
.byte 0
-4
View File
@@ -1,4 +0,0 @@
/* on x86 old clang doesn't support .code16 */
.code16
movb %al, %bl
-11
View File
@@ -1,11 +0,0 @@
/* on mips clang doesn't support privilegied instructions, doubleword store/load
and crashes with hand-written assembly
*/
.set mips3
sync
ld $t2, 0($t1)
a:
addiu $t1, $s0, (b - a)
b: nop
-8
View File
@@ -1,8 +0,0 @@
/* 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
@@ -1,9 +0,0 @@
.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
+6 -9
View File
@@ -2,9 +2,6 @@
set -e set -e
# Set ${PYTHON} to plain 'python' if not set already
: ${PYTHON:=python}
export LC_COLLATE=C export LC_COLLATE=C
unset LC_ALL unset LC_ALL
@@ -12,10 +9,10 @@ find . -iname '*.[ch]' ! -ipath './grub-core/lib/libgcrypt-grub/*' ! -ipath './b
find util -iname '*.in' ! -name Makefile.in |sort > po/POTFILES-shell.in find util -iname '*.in' ! -name Makefile.in |sort > po/POTFILES-shell.in
echo "Importing unicode..." echo "Importing unicode..."
${PYTHON} util/import_unicode.py unicode/UnicodeData.txt unicode/BidiMirroring.txt unicode/ArabicShaping.txt grub-core/unidata.c python util/import_unicode.py unicode/UnicodeData.txt unicode/BidiMirroring.txt unicode/ArabicShaping.txt grub-core/unidata.c
echo "Importing libgcrypt..." echo "Importing libgcrypt..."
${PYTHON} util/import_gcry.py grub-core/lib/libgcrypt/ grub-core python util/import_gcry.py grub-core/lib/libgcrypt/ grub-core
sed -n -f util/import_gcrypth.sed < grub-core/lib/libgcrypt/src/gcrypt.h.in > include/grub/gcrypt/gcrypt.h sed -n -f util/import_gcrypth.sed < grub-core/lib/libgcrypt/src/gcrypt.h.in > include/grub/gcrypt/gcrypt.h
if [ -f include/grub/gcrypt/g10lib.h ]; then if [ -f include/grub/gcrypt/g10lib.h ]; then
rm include/grub/gcrypt/g10lib.h rm include/grub/gcrypt/g10lib.h
@@ -23,14 +20,14 @@ fi
if [ -d grub-core/lib/libgcrypt-grub/mpi/generic ]; then if [ -d grub-core/lib/libgcrypt-grub/mpi/generic ]; then
rm -rf grub-core/lib/libgcrypt-grub/mpi/generic rm -rf grub-core/lib/libgcrypt-grub/mpi/generic
fi fi
cp grub-core/lib/libgcrypt-grub/src/g10lib.h include/grub/gcrypt/g10lib.h ln -s ../../../grub-core/lib/libgcrypt-grub/src/g10lib.h include/grub/gcrypt/g10lib.h
cp -R grub-core/lib/libgcrypt/mpi/generic grub-core/lib/libgcrypt-grub/mpi/generic cp -R grub-core/lib/libgcrypt/mpi/generic grub-core/lib/libgcrypt-grub/mpi/generic
for x in mpi-asm-defs.h mpih-add1.c mpih-sub1.c mpih-mul1.c mpih-mul2.c mpih-mul3.c mpih-lshift.c mpih-rshift.c; do for x in mpi-asm-defs.h mpih-add1.c mpih-sub1.c mpih-mul1.c mpih-mul2.c mpih-mul3.c mpih-lshift.c mpih-rshift.c; do
if [ -h grub-core/lib/libgcrypt-grub/mpi/"$x" ] || [ -f grub-core/lib/libgcrypt-grub/mpi/"$x" ]; then if [ -h grub-core/lib/libgcrypt-grub/mpi/"$x" ] || [ -f grub-core/lib/libgcrypt-grub/mpi/"$x" ]; then
rm grub-core/lib/libgcrypt-grub/mpi/"$x" rm grub-core/lib/libgcrypt-grub/mpi/"$x"
fi fi
cp grub-core/lib/libgcrypt-grub/mpi/generic/"$x" grub-core/lib/libgcrypt-grub/mpi/"$x" ln -s generic/"$x" grub-core/lib/libgcrypt-grub/mpi/"$x"
done done
echo "Generating Automake input..." echo "Generating Automake input..."
@@ -57,8 +54,8 @@ for extra in contrib/*/Makefile.core.def; do
fi fi
done done
${PYTHON} gentpl.py $UTIL_DEFS > Makefile.util.am python gentpl.py $UTIL_DEFS > Makefile.util.am
${PYTHON} gentpl.py $CORE_DEFS > grub-core/Makefile.core.am python gentpl.py $CORE_DEFS > grub-core/Makefile.core.am
for extra in contrib/*/Makefile.common; do for extra in contrib/*/Makefile.common; do
if test -e "$extra"; then if test -e "$extra"; then
-432
View File
@@ -1,432 +0,0 @@
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:
+18 -11
View File
@@ -7,7 +7,12 @@ unexport LC_ALL
# Platform specific options # Platform specific options
if COND_sparc64_ieee1275 if COND_sparc64_ieee1275
LDFLAGS_PLATFORM = -Wl,-melf64_sparc CFLAGS_PLATFORM += -mno-app-regs
LDFLAGS_PLATFORM = -Wl,-melf64_sparc -mno-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
@@ -17,9 +22,9 @@ endif
if COND_arm64 if COND_arm64
CFLAGS_PLATFORM += -mcmodel=large CFLAGS_PLATFORM += -mcmodel=large
endif endif
if COND_powerpc_ieee1275
CFLAGS_PLATFORM += -mcpu=powerpc #FIXME: discover and check XEN headers
endif CPPFLAGS_XEN = -I/usr/include
# Other options # Other options
@@ -34,19 +39,21 @@ 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)
CFLAGS_KERNEL = $(CFLAGS_PLATFORM) -ffreestanding LDADD_KERNEL = $(TARGET_LIBGCC)
LDFLAGS_KERNEL = $(LDFLAGS_PLATFORM) -nostdlib $(TARGET_LDFLAGS_OLDMAGIC)
CFLAGS_KERNEL = $(CFLAGS_CPU) $(CFLAGS_PLATFORM) -ffreestanding
LDFLAGS_KERNEL = $(LDFLAGS_CPU) $(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 -R .MIPS.abiflags -R .ARM.exidx STRIPFLAGS_KERNEL = -R .rel.dyn -R .reginfo -R .note -R .comment -R .drectve -R .note.gnu.gold-version
CFLAGS_MODULE = $(CFLAGS_PLATFORM) -ffreestanding CFLAGS_MODULE = $(CFLAGS_CPU) $(CFLAGS_PLATFORM) -ffreestanding
LDFLAGS_MODULE = $(LDFLAGS_PLATFORM) -nostdlib $(TARGET_LDFLAGS_OLDMAGIC) -Wl,-r,-d LDFLAGS_MODULE = $(LDFLAGS_CPU) $(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_PLATFORM) -fno-builtin CFLAGS_IMAGE = $(CFLAGS_CPU) $(CFLAGS_PLATFORM) -fno-builtin
LDFLAGS_IMAGE = $(LDFLAGS_PLATFORM) -nostdlib $(TARGET_LDFLAGS_OLDMAGIC) -Wl,-S LDFLAGS_IMAGE = $(LDFLAGS_CPU) $(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)
+1 -18
View File
@@ -5,7 +5,6 @@ EXTRA_DIST += gentpl.py
EXTRA_DIST += Makefile.util.def EXTRA_DIST += Makefile.util.def
EXTRA_DIST += Makefile.utilgcry.def EXTRA_DIST += Makefile.utilgcry.def
EXTRA_DIST += asm-tests
EXTRA_DIST += unicode EXTRA_DIST += unicode
EXTRA_DIST += util/import_gcry.py EXTRA_DIST += util/import_gcry.py
@@ -37,6 +36,7 @@ EXTRA_DIST += grub-core/lib/libgcrypt
EXTRA_DIST += grub-core/lib/libgcrypt-grub/mpi/generic EXTRA_DIST += grub-core/lib/libgcrypt-grub/mpi/generic
EXTRA_DIST += $(shell find $(top_srcdir)/include -name '*.h') EXTRA_DIST += $(shell find $(top_srcdir)/include -name '*.h')
EXTRA_DIST += $(shell find $(top_srcdir)/grub-core/lib -name '*.h') EXTRA_DIST += $(shell find $(top_srcdir)/grub-core/lib -name '*.h')
EXTRA_DIST += $(shell find $(top_srcdir)/grub-core/gnulib -name '*.h')
EXTRA_DIST += grub-core/efiemu/runtime/config.h EXTRA_DIST += grub-core/efiemu/runtime/config.h
EXTRA_DIST += grub-core/lib/LzmaDec.c EXTRA_DIST += grub-core/lib/LzmaDec.c
@@ -50,13 +50,8 @@ EXTRA_DIST += util/import_gcrypth.sed
EXTRA_DIST += util/bin2h.c EXTRA_DIST += util/bin2h.c
EXTRA_DIST += util/grub-gen-asciih.c EXTRA_DIST += util/grub-gen-asciih.c
EXTRA_DIST += util/grub-gen-widthspec.c EXTRA_DIST += util/grub-gen-widthspec.c
EXTRA_DIST += util/grub-module-verifier.c
EXTRA_DIST += util/grub-module-verifier32.c
EXTRA_DIST += util/grub-module-verifier64.c
EXTRA_DIST += util/grub-module-verifierXX.c
EXTRA_DIST += util/grub-pe2elf.c EXTRA_DIST += util/grub-pe2elf.c
EXTRA_DIST += m4/gnulib-cache.m4 EXTRA_DIST += m4/gnulib-cache.m4
EXTRA_DIST += m4/glibc2.m4 EXTRA_DIST += m4/glibc2.m4
EXTRA_DIST += m4/gnulib-tool.m4 EXTRA_DIST += m4/gnulib-tool.m4
@@ -126,15 +121,3 @@ EXTRA_DIST += tests/file_filter/file.xz.sig
EXTRA_DIST += tests/file_filter/keys EXTRA_DIST += tests/file_filter/keys
EXTRA_DIST += tests/file_filter/keys.pub EXTRA_DIST += tests/file_filter/keys.pub
EXTRA_DIST += tests/file_filter/test.cfg 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
+4 -9
View File
@@ -7,20 +7,11 @@
#endif #endif
#define GCRYPT_NO_DEPRECATED 1 #define GCRYPT_NO_DEPRECATED 1
#define HAVE_MEMMOVE 1
/* Define to 1 to enable disk cache statistics. */ /* Define to 1 to enable disk cache statistics. */
#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@
@@ -40,6 +31,10 @@
#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. */
+182 -348
View File
@@ -78,9 +78,12 @@ 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 ;;
@@ -315,7 +318,7 @@ AC_PROG_LN_S
if test "x$LEX" = "x:"; then if test "x$LEX" = "x:"; then
AC_MSG_ERROR([flex is not found]) AC_MSG_ERROR([flex is not found])
else else
version=`$LEX --version | $AWK '{ split($2,x,"."); print x[[1]]*10000+x[[2]]*100+x[[3]]; }'` version=`$LEX --version | $AWK '{ split($NF,x,"."); print x[[1]]*10000+x[[2]]*100+x[[3]]; }'`
if test -n "$version" -a "$version" -ge 20535; then if test -n "$version" -a "$version" -ge 20535; then
: :
else else
@@ -353,9 +356,6 @@ 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)
@@ -551,7 +551,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(
@@ -562,153 +562,46 @@ 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])])
if test x$target_cpu = xpowerpc -o x$target_cpu = xmips; then # on x86 clang doesn't support .code16
AC_CACHE_CHECK([for options to get big-endian compilation], grub_cv_target_cc_big_endian, [ # on arm clang doesn't support .arch directive
grub_cv_target_cc_big_endian=no # on mips clang doesn't support privilegied instructions, doubleword store/load
for cand in "-target $target_cpu -Wl,-EB" "-target $target_cpu" \ # and crashes with hand-written assembly
"-target $target_cpu-linux-gnu -Wl,-EB" "-target $target_cpu-linux-gnu" \ if test "x$grub_cv_cc_target_clang" = xyes && ( test "x$target_cpu" = xi386 \
"-EB" "-mbig-endian"; do || test "x$target_cpu" = xx86_64 || test "x$target_cpu" = xarm \
if test x"$grub_cv_target_cc_big_endian" != xno ; then || test "x$target_cpu" = xmips || test "x$target_cpu" = xmipsel ); then
break TARGET_CCASFLAGS="$TARGET_CCASFLAGS -no-integrated-as"
fi
CFLAGS="$TARGET_CFLAGS $cand -Werror"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#if defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && (__ORDER_BIG_ENDIAN__ != __BYTE_ORDER__)
#error still little endian
#endif
asm (".globl start; start:");
asm (".globl _start; _start:");
asm (".globl __start; __start:");
void __main (void);
void __main (void) {}
int main (void);
]], [[]])],
[grub_cv_target_cc_big_endian="$cand"], [])
done
])
if test x"$grub_cv_target_cc_big_endian" = xno ; then
AC_MSG_ERROR([could not force big-endian])
fi
skip_linkflags="$(echo "$grub_cv_target_cc_big_endian"|sed 's@-Wl,-EB@@')"
TARGET_CFLAGS="$TARGET_CFLAGS $skip_linkflags"
TARGET_CPPFLAGS="$TARGET_CPPFLAGS $skip_linkflags"
TARGET_CCASFLAGS="$TARGET_CCASFLAGS $skip_linkflags"
TARGET_LDFLAGS="$TARGET_LDFLAGS $grub_cv_target_cc_big_endian"
elif test x$target_cpu = xmipsel; then
AC_CACHE_CHECK([for options to get little-endian compilation], grub_cv_target_cc_little_endian, [
grub_cv_target_cc_little_endian=no
for cand in "-target $target_cpu -Wl,-EL" "-target $target_cpu" \
"-target $target_cpu-linux-gnu -Wl,-EL" "-target $target_cpu-linux-gnu" \
"-EL"; do
if test x"$grub_cv_target_cc_little_endian" != xno ; then
break
fi
CFLAGS="$TARGET_CFLAGS $cand -Werror"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#if defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && (__ORDER_BIG_ENDIAN__ == __BYTE_ORDER__)
#error still big endian
#endif
asm (".globl start; start:");
asm (".globl _start; _start:");
asm (".globl __start; __start:");
void __main (void);
void __main (void) {}
int main (void);
]], [[]])],
[grub_cv_target_cc_little_endian="$cand"], [])
done
])
if test x"$grub_cv_target_cc_little_endian" = xno ; then
AC_MSG_ERROR([could not force little-endian])
fi
skip_linkflags="$(echo "$grub_cv_target_cc_little_endian"|sed 's@-Wl,-EL@@')"
TARGET_CFLAGS="$TARGET_CFLAGS $skip_linkflags"
TARGET_CPPFLAGS="$TARGET_CPPFLAGS $skip_linkflags"
TARGET_CCASFLAGS="$TARGET_CCASFLAGS $skip_linkflags"
TARGET_LDFLAGS="$TARGET_LDFLAGS $grub_cv_target_cc_little_endian"
fi fi
# GRUB code is N32-compliant but it's experimental and we would prefer to if test "x$grub_cv_cc_target_clang" = xyes && test "x$target_cpu" = xpowerpc; then
# avoid having too much variety when it doesn't result in any real improvement. AC_CACHE_CHECK([if clang can handle ame instruction], [grub_cv_cc_target_clang_ame]
# Moreover N64 isn't supported. [
if test "x$target_cpu" = xmips || test "x$target_cpu" = xmipsel ; then CFLAGS="$TARGET_CFLAGS"
AC_CACHE_CHECK([for options to force MIPS o32 ABI], grub_cv_target_cc_mips_o32_abi, [ AC_COMPILE_IFELSE(
grub_cv_target_cc_mips_o32_abi=no [AC_LANG_PROGRAM([], [[
for arg in "" "-mabi=32" "-target $target_cpu -mabi=32" ; do unsigned int a = 0, b = 0;
if test x"$grub_cv_target_cc_mips_o32_abi" != xno ; then asm volatile ("{ame|addme} %0,%1" : "=r" (a) : "r" (b));
break if (a)
fi return 1;
CFLAGS="$TARGET_CFLAGS $arg -Werror" ]])],
AC_LINK_IFELSE([AC_LANG_PROGRAM([[ [grub_cv_cc_target_clang_ame=yes], [grub_cv_cc_target_clang_ame=no])])
#if !defined(_ABIO32) || !defined(_MIPS_SIM) || (_MIPS_SIM != _ABIO32) # clang <= 3.3 doesn't handle most of ppc assembly, not even inline assembly
#error not o32 ABI # used by gcrypt
#endif if test x$grub_cv_cc_target_clang_ame = xno ; then
asm (".globl start; start:"); TARGET_CCASFLAGS="$TARGET_CCASFLAGS -no-integrated-as"
asm (".globl _start; _start:"); TARGET_CFLAGS="$TARGET_CFLAGS -no-integrated-as"
asm (".globl __start; __start:");
void __main (void);
void __main (void) {}
int main (void);
]], [[]])],
[grub_cv_target_cc_mips_o32_abi="$arg"], [])
done
])
if test x"$grub_cv_target_cc_mips_o32_abi" = xno ; then
AC_MSG_ERROR([could not force MIPS o32 ABI])
fi
TARGET_CFLAGS="$TARGET_CFLAGS $grub_cv_target_cc_mips_o32_abi"
TARGET_CCASFLAGS="$TARGET_CCASFLAGS $grub_cv_target_cc_mips_o32_abi"
fi
AC_CACHE_CHECK([for options to compile assembly], [grub_cv_cc_target_asm_compile], [
test_program=
case "x$target_cpu-$platform" in
xmips-* | xmipsel-*)
test_program=mips
;;
xi386-pc)
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
done
if test x"$found" = xno ; then
AC_MSG_ERROR([could not compile assembly])
fi fi
fi fi
])
TARGET_CCASFLAGS="$TARGET_CCASFLAGS $grub_cv_cc_target_asm_compile"
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"
fi fi
if test x$target_cpu = xpowerpc && test x$ac_cv_c_bigendian = xno; then
TARGET_CFLAGS="$TARGET_CFLAGS -mbig-endian"
TARGET_CCASFLAGS="$TARGET_CCASFLAGS -mbig-endian"
TARGET_LDFLAGS="$TARGET_LDFLAGS -static -mbig-endian"
fi
if test "x$target_m32" = x1; then if test "x$target_m32" = x1; then
# Force 32-bit mode. # Force 32-bit mode.
TARGET_CFLAGS="$TARGET_CFLAGS -m32" TARGET_CFLAGS="$TARGET_CFLAGS -m32"
@@ -783,103 +676,7 @@ fi
if ( test "x$target_cpu" = xi386 || test "x$target_cpu" = xx86_64 ) && test "x$platform" != xemu; then if ( test "x$target_cpu" = xi386 || test "x$target_cpu" = xx86_64 ) && test "x$platform" != xemu; then
# Some toolchains enable these features by default, but they need # Some toolchains enable these features by default, but they need
# registers that aren't set up properly in GRUB. # registers that aren't set up properly in GRUB.
TARGET_CFLAGS="$TARGET_CFLAGS -mno-mmx -mno-sse -mno-sse2 -mno-sse3 -mno-3dnow" TARGET_CFLAGS="$TARGET_CFLAGS -mno-mmx -mno-sse -mno-sse2 -mno-3dnow"
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 -mgeneral-regs-only -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
[grub_cv_target_cc_soft_float="-mgeneral-regs-only"], [])
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
TARGET_CCASFLAGS="$TARGET_CCASFLAGS $grub_cv_target_cc_soft_float"
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"
CPPFLAGS="$TARGET_CPPFLAGS"
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 fi
# By default, GCC 4.4 generates .eh_frame sections containing unwind # By default, GCC 4.4 generates .eh_frame sections containing unwind
@@ -910,24 +707,12 @@ if test x"$target_os" = xcygwin && test "x$grub_cv_cc_no_reorder_functions" = xy
TARGET_CFLAGS="$TARGET_CFLAGS -fno-reorder-functions" TARGET_CFLAGS="$TARGET_CFLAGS -fno-reorder-functions"
fi fi
AC_CACHE_CHECK([whether -mno-stack-arg-probe works], [grub_cv_cc_mno_stack_arg_probe], [
CFLAGS="$TARGET_CFLAGS -mno-stack-arg-probe"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
[grub_cv_cc_mno_stack_arg_probe=yes],
[grub_cv_cc_mno_stack_arg_probe=no])
])
if test "x$grub_cv_cc_mno_stack_arg_probe" = xyes; then
TARGET_CFLAGS="$TARGET_CFLAGS -mno-stack-arg-probe"
fi
# By default, GCC 4.6 generates .eh_frame sections containing unwind # By default, GCC 4.6 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
# behaviour. # behaviour.
AC_CACHE_CHECK([whether -fno-asynchronous-unwind-tables works], [grub_cv_cc_fno_asynchronous_unwind_tables], [ AC_CACHE_CHECK([whether -fno-asynchronous-unwind-tables works], [grub_cv_cc_fno_asynchronous_unwind_tables], [
CFLAGS="$TARGET_CFLAGS -fno-asynchronous-unwind-tables" CFLAGS="$TARGET_CFLAGS -fno-dwarf2-cfi-asm"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
[grub_cv_cc_fno_asynchronous_unwind_tables=yes], [grub_cv_cc_fno_asynchronous_unwind_tables=yes],
[grub_cv_cc_fno_asynchronous_unwind_tables=no]) [grub_cv_cc_fno_asynchronous_unwind_tables=no])
@@ -937,17 +722,66 @@ if test "x$grub_cv_cc_fno_asynchronous_unwind_tables" = xyes; then
TARGET_CFLAGS="$TARGET_CFLAGS -fno-asynchronous-unwind-tables" TARGET_CFLAGS="$TARGET_CFLAGS -fno-asynchronous-unwind-tables"
fi fi
AC_CACHE_CHECK([whether -fno-unwind-tables works], [grub_cv_cc_fno_unwind_tables], [ AC_ARG_ENABLE([efiemu],
CFLAGS="$TARGET_CFLAGS -fno-unwind-tables" [AS_HELP_STRING([--enable-efiemu],
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [build and install the efiemu runtimes (default=guessed)])])
[grub_cv_cc_fno_unwind_tables=yes], if test x"$enable_efiemu" = xno ; then
[grub_cv_cc_fno_unwind_tables=no]) efiemu_excuse="explicitly disabled"
])
if test "x$grub_cv_cc_fno_unwind_tables" = xyes; then
TARGET_CFLAGS="$TARGET_CFLAGS -fno-unwind-tables"
fi fi
if test x"$grub_cv_target_cc_link_format" = x-mi386pe || test x"$grub_cv_target_cc_link_format" = x-mi386pep ; then
efiemu_excuse="not available on cygwin"
fi
if test x"$target_cpu" != xi386 ; then
efiemu_excuse="only available on i386"
fi
if test x"$platform" = xefi ; then
efiemu_excuse="not available on efi"
fi
if test x"$efiemu_excuse" = x ; then
AC_CACHE_CHECK([whether options required for efiemu work], grub_cv_cc_efiemu, [
CFLAGS="-m64 -nostdlib -O2 -mcmodel=large -mno-red-zone"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
[grub_cv_cc_efiemu=yes],
[grub_cv_cc_efiemu=no])
])
if test x$grub_cv_cc_efiemu = xno; then
efiemu_excuse="cannot compile with -m64 -mcmodel=large -mno-red-zone -nostdlib"
fi
fi
if test x"$efiemu_excuse" = x ; then
AC_CACHE_CHECK([for efiemu64 linking format], [grub_cv_target_cc_efiemu64_link_format], [
grub_cv_target_cc_efiemu64_link_format=unknown
for format in -melf_x86_64 -melf_x86_64_fbsd -melf_x86_64_obsd -melf_x86_64_haiku -arch,x86_64; do
CFLAGS="-m64 -nostdlib -O2 -mcmodel=large -mno-red-zone"
LDFLAGS="-m64 -Wl,$format -nostdlib -static"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
asm (".globl start; start:");
asm (".globl _start; _start:");
asm (".globl __start; __start:");
void __main (void);
void __main (void) {}
]], [[]])], [flag=1], [flag=0])
if test x"$flag" = x1; then
grub_cv_target_cc_efiemu64_link_format="$format"
break
fi
done])
if test x"$grub_cv_target_cc_efiemu64_link_format" = xunknown; then
efiemu_excuse="no suitable link format for efiemu64 found"
else
EFIEMU64_LINK_FORMAT="-Wl,$grub_cv_target_cc_efiemu64_link_format"
fi
fi
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 ($efiemu_excuse)])
fi
if test x"$efiemu_excuse" = x ; then
enable_efiemu=yes
else
enable_efiemu=no
fi
AC_SUBST([enable_efiemu])
AC_SUBST([EFIEMU64_LINK_FORMAT])
CFLAGS="$TARGET_CFLAGS" CFLAGS="$TARGET_CFLAGS"
@@ -1041,79 +875,12 @@ else
TARGET_IMG_CFLAGS= TARGET_IMG_CFLAGS=
fi fi
CFLAGS="$TARGET_CFLAGS"
AC_ARG_ENABLE([efiemu],
[AS_HELP_STRING([--enable-efiemu],
[build and install the efiemu runtimes (default=guessed)])])
if test x"$enable_efiemu" = xno ; then
efiemu_excuse="explicitly disabled"
fi
if test x"$grub_cv_target_cc_link_format" = x-mi386pe || test x"$grub_cv_target_cc_link_format" = x-mi386pep ; then
efiemu_excuse="not available on cygwin"
fi
if test x"$target_cpu" != xi386 ; then
efiemu_excuse="only available on i386"
fi
if test x"$platform" = xefi ; then
efiemu_excuse="not available on efi"
fi
if test x"$efiemu_excuse" = x ; then
AC_CACHE_CHECK([whether options required for efiemu work], grub_cv_cc_efiemu, [
CFLAGS="-m64 -nostdlib -O2 -mcmodel=large -mno-red-zone"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
[grub_cv_cc_efiemu=yes],
[grub_cv_cc_efiemu=no])
])
if test x$grub_cv_cc_efiemu = xno; then
efiemu_excuse="cannot compile with -m64 -mcmodel=large -mno-red-zone -nostdlib"
fi
fi
if test x"$efiemu_excuse" = x ; then
AC_CACHE_CHECK([for efiemu64 linking format], [grub_cv_target_cc_efiemu64_link_format], [
grub_cv_target_cc_efiemu64_link_format=unknown
for format in -melf_x86_64 -melf_x86_64_fbsd -melf_x86_64_obsd -melf_x86_64_haiku -arch,x86_64; do
CFLAGS="-m64 -nostdlib -O2 -mcmodel=large -mno-red-zone"
LDFLAGS="-m64 -Wl,$format -nostdlib -static"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
asm (".globl start; start:");
asm (".globl _start; _start:");
asm (".globl __start; __start:");
void __main (void);
void __main (void) {}
]], [[]])], [flag=1], [flag=0])
if test x"$flag" = x1; then
grub_cv_target_cc_efiemu64_link_format="$format"
break
fi
done])
if test x"$grub_cv_target_cc_efiemu64_link_format" = xunknown; then
efiemu_excuse="no suitable link format for efiemu64 found"
else
EFIEMU64_LINK_FORMAT="-Wl,$grub_cv_target_cc_efiemu64_link_format"
fi
fi
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 ($efiemu_excuse)])
fi
if test x"$efiemu_excuse" = x ; then
enable_efiemu=yes
else
enable_efiemu=no
fi
AC_SUBST([enable_efiemu])
AC_SUBST([EFIEMU64_LINK_FORMAT])
CFLAGS="$TARGET_CFLAGS"
AC_SUBST(TARGET_LDFLAGS_OLDMAGIC) AC_SUBST(TARGET_LDFLAGS_OLDMAGIC)
LDFLAGS="$TARGET_LDFLAGS" LDFLAGS="$TARGET_LDFLAGS"
if test "$target_cpu" = x86_64 || test "$target_cpu" = sparc64 ; then if test "$target_cpu" = x86_64 || test "$target_cpu-$platform" = sparc64-emu ; then
# Use large model to support 4G memory # Use large model to support 4G memory
AC_CACHE_CHECK([whether option -mcmodel=large works], grub_cv_cc_mcmodel, [ AC_CACHE_CHECK([whether option -mcmodel=large works], grub_cv_cc_mcmodel, [
CFLAGS="$TARGET_CFLAGS -mcmodel=large" CFLAGS="$TARGET_CFLAGS -mcmodel=large"
@@ -1123,7 +890,7 @@ if test "$target_cpu" = x86_64 || test "$target_cpu" = sparc64 ; then
]) ])
if test "x$grub_cv_cc_mcmodel" = xyes; then if test "x$grub_cv_cc_mcmodel" = xyes; then
TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=large" TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=large"
elif test "$target_cpu" = sparc64; then elif test "$target_cpu-$platform" = sparc64-emu; then
TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=medany" TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=medany"
fi fi
fi fi
@@ -1161,9 +928,20 @@ 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 fi
@@ -1261,17 +1039,22 @@ fi
# Set them to their new values for the tests below. # Set them to their new values for the tests below.
CC="$TARGET_CC" CC="$TARGET_CC"
if test x"$platform" = xemu ; then if test "x$TARGET_APPLE_LINKER" = x1 ; then
CFLAGS="$TARGET_CFLAGS -Wno-error"
elif test "x$TARGET_APPLE_LINKER" = x1 ; then
CFLAGS="$TARGET_CFLAGS -nostdlib -static -Wno-error" CFLAGS="$TARGET_CFLAGS -nostdlib -static -Wno-error"
else else
CFLAGS="$TARGET_CFLAGS -nostdlib -Wno-error" CFLAGS="$TARGET_CFLAGS -nostdlib -Wno-error"
fi fi
CPPFLAGS="$TARGET_CPPFLAGS" CPPFLAGS="$TARGET_CPPFLAGS"
if test x$target_cpu = xi386 || test x$target_cpu = xx86_64 || test x$target_cpu = xpowerpc || test "x$grub_cv_cc_target_clang" = xyes; then
TARGET_LIBGCC=
else
TARGET_LIBGCC=-lgcc
fi
LIBS="$TARGET_LIBGCC"
grub_ASM_USCORE grub_ASM_USCORE
if test "x$TARGET_APPLE_LINKER" = x0 && test x"$platform" != xemu; then if test "x$TARGET_APPLE_LINKER" = x0 ; then
if test x$grub_cv_asm_uscore = xyes; then if test x$grub_cv_asm_uscore = xyes; then
DEFSYM="-Wl,--defsym,_abort=_main -Wl,--defsym,__main=_main" DEFSYM="-Wl,--defsym,_abort=_main -Wl,--defsym,__main=_main"
else else
@@ -1280,9 +1063,9 @@ fi
CFLAGS="$TARGET_CFLAGS -nostdlib $DEFSYM" CFLAGS="$TARGET_CFLAGS -nostdlib $DEFSYM"
fi fi
# Check for libgcc symbols if ! test x$target_cpu = xpowerpc; then
if test x"$platform" = xemu; then # Check for libgcc symbols
AC_CHECK_FUNCS(__udivsi3 __umodsi3 __divsi3 __modsi3 __divdi3 __moddi3 __udivdi3 __umoddi3 __ctzdi2 __ctzsi2 __aeabi_uidiv __aeabi_uidivmod __aeabi_idiv __aeabi_idivmod __aeabi_ulcmp __muldi3 __aeabi_lmul __aeabi_memcpy __aeabi_memcpy4 __aeabi_memcpy8 __aeabi_memclr __aeabi_memclr4 __aeabi_memclr8 __aeabi_memset __aeabi_lasr __aeabi_llsl __aeabi_llsr _restgpr_14_x __ucmpdi2 __ashldi3 __ashrdi3 __lshrdi3 __bswapsi2 __bswapdi2 __bzero __register_frame_info __deregister_frame_info ___chkstk_ms __chkstk_ms) AC_CHECK_FUNCS(__bswapsi2 __bswapdi2 __ashldi3 __ashrdi3 __lshrdi3 __ucmpdi2 _restgpr_14_x)
fi fi
if test "x$TARGET_APPLE_LINKER" = x1 ; then if test "x$TARGET_APPLE_LINKER" = x1 ; then
@@ -1308,6 +1091,8 @@ 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
@@ -1385,6 +1170,10 @@ else
fi fi
AC_SUBST([BOOT_TIME_STATS]) AC_SUBST([BOOT_TIME_STATS])
AC_ARG_ENABLE([grub-emu-usb],
[AS_HELP_STRING([--enable-grub-emu-usb],
[build and install the `grub-emu' debugging utility with USB support (default=guessed)])])
AC_ARG_ENABLE([grub-emu-sdl], AC_ARG_ENABLE([grub-emu-sdl],
[AS_HELP_STRING([--enable-grub-emu-sdl], [AS_HELP_STRING([--enable-grub-emu-sdl],
[build and install the `grub-emu' debugging utility with SDL support (default=guessed)])]) [build and install the `grub-emu' debugging utility with SDL support (default=guessed)])])
@@ -1395,6 +1184,34 @@ AC_ARG_ENABLE([grub-emu-pci],
if test "$platform" = emu; then if test "$platform" = emu; then
if test x"$enable_grub_emu_usb" != xyes ; then
grub_emu_usb_excuse="not enabled"
fi
if test x"$enable_grub_emu_pci" = xyes ; then
grub_emu_usb_excuse="conflicts with PCI support"
fi
[if [ x"$grub_emu_usb_excuse" = x ]; then
# Check for libusb libraries.]
AC_CHECK_LIB([usb], [usb_claim_interface], [LIBUSB="-lusb"],
[grub_emu_usb_excuse=["need libusb library"]])
AC_SUBST([LIBUSB])
[fi]
[if [ x"$grub_emu_usb_excuse" = x ]; then
# Check for headers.]
AC_CHECK_HEADERS([usb.h], [],
[grub_emu_usb_excuse=["need libusb headers"]])
[fi]
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 ($grub_emu_usb_excuse)])
fi
if test x"$grub_emu_usb_excuse" = x ; then
enable_grub_emu_usb=yes
else
enable_grub_emu_usb=no
fi
if test x"$enable_grub_emu_sdl" = xno ; then if test x"$enable_grub_emu_sdl" = xno ; then
grub_emu_sdl_excuse="explicitly disabled" grub_emu_sdl_excuse="explicitly disabled"
fi fi
@@ -1424,6 +1241,10 @@ if test x"$enable_grub_emu_pci" != xyes ; then
grub_emu_pci_excuse="not enabled" grub_emu_pci_excuse="not enabled"
fi fi
if test x"$enable_grub_emu_usb" = xyes ; then
grub_emu_pci_excuse="conflicts with USB support"
fi
[if [ x"$grub_emu_pci_excuse" = x ]; then [if [ x"$grub_emu_pci_excuse" = x ]; then
# Check for libpci libraries.] # Check for libpci libraries.]
AC_CHECK_LIB([pciaccess], [pci_system_init], [LIBPCIACCESS="-lpciaccess"], AC_CHECK_LIB([pciaccess], [pci_system_init], [LIBPCIACCESS="-lpciaccess"],
@@ -1432,7 +1253,7 @@ fi
[fi] [fi]
[if [ x"$grub_emu_pci_excuse" = x ]; then [if [ x"$grub_emu_pci_excuse" = x ]; then
# Check for headers.] # Check for headers.]
AC_CHECK_HEADERS([pciaccess.h], [], AC_CHECK_HEADERS([pci/pci.h], [],
[grub_emu_pci_excuse=["need libpciaccess headers"]]) [grub_emu_pci_excuse=["need libpciaccess headers"]])
[fi] [fi]
@@ -1444,12 +1265,14 @@ enable_grub_emu_pci=no
fi fi
AC_SUBST([enable_grub_emu_sdl]) AC_SUBST([enable_grub_emu_sdl])
AC_SUBST([enable_grub_emu_usb])
AC_SUBST([enable_grub_emu_pci]) AC_SUBST([enable_grub_emu_pci])
else else
# Ignore --enable-emu-* if platform is not emu # Ignore --enable-emu-* if platform is not emu
enable_grub_emu_sdl=no enable_grub_emu_sdl=no
enable_grub_emu_usb=no
enable_grub_emu_pci=no enable_grub_emu_pci=no
fi fi
@@ -1658,7 +1481,7 @@ 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 -DFUSE_USE_VERSION=26" CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=64 -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"
@@ -1793,6 +1616,8 @@ 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)
@@ -1806,15 +1631,15 @@ if test x"$enable_werror" != xno ; then
HOST_CFLAGS="$HOST_CFLAGS -Werror" HOST_CFLAGS="$HOST_CFLAGS -Werror"
fi fi
if test "x$grub_cv_cc_target_clang" = xno && test x$target_cpu != xpowerpc; then
TARGET_LDFLAGS_STATIC_LIBGCC="-static-libgcc"
else
TARGET_LDFLAGS_STATIC_LIBGCC=
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}"
@@ -1822,6 +1647,8 @@ AC_SUBST(GRUB_TARGET_CPU)
AC_SUBST(GRUB_PLATFORM) AC_SUBST(GRUB_PLATFORM)
AC_SUBST(TARGET_OBJCONV) AC_SUBST(TARGET_OBJCONV)
AC_SUBST(TARGET_LIBGCC)
AC_SUBST(TARGET_LDFLAGS_STATIC_LIBGCC)
AC_SUBST(TARGET_CPP) AC_SUBST(TARGET_CPP)
AC_SUBST(TARGET_CCAS) AC_SUBST(TARGET_CCAS)
AC_SUBST(TARGET_OBJ2ELF) AC_SUBST(TARGET_OBJ2ELF)
@@ -1851,6 +1678,7 @@ AC_SUBST(BUILD_LIBM)
AM_CONDITIONAL([COND_real_platform], [test x$platform != xnone]) 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_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])
AM_CONDITIONAL([COND_i386_efi], [test x$target_cpu = xi386 -a x$platform = xefi]) AM_CONDITIONAL([COND_i386_efi], [test x$target_cpu = xi386 -a x$platform = xefi])
AM_CONDITIONAL([COND_ia64_efi], [test x$target_cpu = xia64 -a x$platform = xefi]) AM_CONDITIONAL([COND_ia64_efi], [test x$target_cpu = xia64 -a x$platform = xefi])
@@ -1885,6 +1713,7 @@ AM_CONDITIONAL([COND_HOST_XNU], [test x$host_kernel = xxnu])
AM_CONDITIONAL([COND_HOST_ILLUMOS], [test x$host_kernel = xillumos]) 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_SDL], [test x$enable_grub_emu_sdl = xyes]) AM_CONDITIONAL([COND_GRUB_EMU_SDL], [test x$enable_grub_emu_sdl = xyes])
AM_CONDITIONAL([COND_GRUB_EMU_PCI], [test x$enable_grub_emu_pci = xyes]) AM_CONDITIONAL([COND_GRUB_EMU_PCI], [test x$enable_grub_emu_pci = xyes])
AM_CONDITIONAL([COND_GRUB_MKFONT], [test x$enable_grub_mkfont = xyes]) AM_CONDITIONAL([COND_GRUB_MKFONT], [test x$enable_grub_mkfont = xyes])
@@ -1962,6 +1791,11 @@ echo "*******************************************************"
echo GRUB2 will be compiled with following components: echo GRUB2 will be compiled with following components:
echo Platform: "$target_cpu"-"$platform" echo Platform: "$target_cpu"-"$platform"
if [ x"$platform" = xemu ]; then if [ x"$platform" = xemu ]; then
if [ x"$grub_emu_usb_excuse" = x ]; then
echo USB support for grub-emu: Yes
else
echo USB support for grub-emu: No "($grub_emu_usb_excuse)"
fi
if [ x"$grub_emu_sdl_excuse" = x ]; then if [ x"$grub_emu_sdl_excuse" = x ]; then
echo SDL support for grub-emu: Yes echo SDL support for grub-emu: Yes
else else
+21 -95
View File
@@ -3038,8 +3038,6 @@ These variables have special meaning to GRUB.
* cmdpath:: * cmdpath::
* color_highlight:: * color_highlight::
* color_normal:: * color_normal::
* config_directory::
* config_file::
* debug:: * debug::
* default:: * default::
* fallback:: * fallback::
@@ -3182,22 +3180,6 @@ matching colors of first half.
to support whole rgb24 palette but currently there is no compelling reason to support whole rgb24 palette but currently there is no compelling reason
to go beyond the current 16 colors. to go beyond the current 16 colors.
@node config_directory
@subsection config_directory
This variable is automatically set by GRUB to the directory part of
current configuration file name (@pxref{config_file}).
@node config_file
@subsection config_file
This variable is automatically set by GRUB to the name of configuration file that is being
processed by commands @command{configfile} (@pxref{configfile}) or @command{normal}
(@pxref{normal}). It is restored to the previous value when command completes.
@node debug @node debug
@subsection debug @subsection debug
@@ -3857,11 +3839,6 @@ you forget a command, you can run the command @command{help}
@comment * vbeinfo:: List available video modes @comment * vbeinfo:: List available video modes
* verify_detached:: Verify detached digital signature * verify_detached:: Verify detached digital signature
* videoinfo:: List available video modes * videoinfo:: List available video modes
@comment * xen_*:: Xen boot commands
* xen_hypervisor:: Load xen hypervisor binary
* xen_linux:: Load dom0 kernel for xen hypervisor
* xen_initrd:: Load dom0 initrd for dom0 kernel
* xen_xsm:: Load xen security module for xen hypervisor
@end menu @end menu
@@ -5125,39 +5102,6 @@ successfully. If validation fails, it is set to a non-zero value.
List available video modes. If resolution is given, show only matching modes. List available video modes. If resolution is given, show only matching modes.
@end deffn @end deffn
@node xen_hypervisor
@subsection xen_hypervisor
@deffn Command xen_hypervisor file [arguments] @dots{}
Load a Xen hypervisor binary from @var{file}. The rest of the line is passed
verbatim as the @dfn{kernel command-line}. Any other binaries must be
reloaded after using this command.
@end deffn
@node xen_linux
@subsection xen_linux
@deffn Command xen_linux file [arguments]
Load a dom0 kernel image for xen hypervisor at the booting process of xen.
The rest of the line is passed verbatim as the module command line.
@end deffn
@node xen_initrd
@subsection xen_initrd
@deffn Command xen_initrd file
Load a initrd image for dom0 kernel at the booting process of xen.
@end deffn
@node xen_xsm
@subsection xen_xsm
@deffn Command xen_xsm file
Load a xen security module for xen hypervisor at the booting process of xen.
See @uref{http://wiki.xen.org/wiki/XSM} for more detail.
@end deffn
@node Networking commands @node Networking commands
@section The list of networking commands @section The list of networking commands
@@ -5218,10 +5162,8 @@ by @var{shortname} which can be used to remove it (@pxref{net_del_route}).
Perform configuration of @var{card} using DHCP protocol. If no card name Perform configuration of @var{card} using DHCP protocol. If no card name
is specified, try to configure all existing cards. If configuration was is specified, try to configure all existing cards. If configuration was
successful, interface with name @var{card}@samp{:dhcp} and configured successful, interface with name @var{card}@samp{:dhcp} and configured
address is added to @var{card}. address is added to @var{card}. If server provided gateway information in
@comment If server provided gateway information in DHCP ACK packet, it is added as route entry with the name @var{card}@samp{:dhcp:gw}. Additionally the following DHCP options are recognized and processed:
@comment DHCP ACK packet, it is added as route entry with the name @var{card}@samp{:dhcp:gw}.
Additionally the following DHCP options are recognized and processed:
@table @samp @table @samp
@item 1 (Subnet Mask) @item 1 (Subnet Mask)
@@ -5484,12 +5426,10 @@ In order to enable authentication support, the @samp{superusers} environment
variable must be set to a list of usernames, separated by any of spaces, variable must be set to a list of usernames, separated by any of spaces,
commas, semicolons, pipes, or ampersands. Superusers are permitted to use commas, semicolons, pipes, or ampersands. Superusers are permitted to use
the GRUB command line, edit menu entries, and execute any menu entry. If the GRUB command line, edit menu entries, and execute any menu entry. If
@samp{superusers} is set, then use of the command line and editing of menu @samp{superusers} is set, then use of the command line is automatically
entries are automatically restricted to superusers. Setting @samp{superusers} restricted to superusers.
to empty string effectively disables both access to CLI and editing of menu
entries.
Other users may be allowed to execute specific menu entries by giving a list of Other users may be given access to specific menu entries by giving a list of
usernames (as above) using the @option{--users} option to the usernames (as above) using the @option{--users} option to the
@samp{menuentry} command (@pxref{menuentry}). If the @option{--unrestricted} @samp{menuentry} command (@pxref{menuentry}). If the @option{--unrestricted}
option is used for a menu entry, then that entry is unrestricted. option is used for a menu entry, then that entry is unrestricted.
@@ -5669,16 +5609,6 @@ BadRAM is the ability to mark some of the RAM as ``bad''. Note: due to protocol
limitations mips-loongson (with Linux protocol) limitations mips-loongson (with Linux protocol)
and mips-qemu_mips can use only memory up to first hole. and mips-qemu_mips can use only memory up to first hole.
Bootlocation is ability of GRUB to automatically detect where it boots from.
``disk'' means the detection is limited to detecting the disk with partition
being discovered on install time. ``partition'' means that disk and partiton
can be automatically discovered. ``file'' means that boot image file name as
well as disk and partition can be discovered. For consistency default install ignores
partition and relies solely on disk detection. If no bootlocation discovery is available
or boot and grub-root disks are different, UUID is used instead. On ARC if no device
to install to is specified, UUID is used instead as well.
@multitable @columnfractions .20 .20 .20 .20 .20 @multitable @columnfractions .20 .20 .20 .20 .20
@item @tab BIOS @tab Coreboot @tab Multiboot @tab Qemu @item @tab BIOS @tab Coreboot @tab Multiboot @tab Qemu
@item video @tab yes @tab yes @tab yes @tab yes @item video @tab yes @tab yes @tab yes @tab yes
@@ -5695,7 +5625,6 @@ to install to is specified, UUID is used instead as well.
@item badram @tab yes @tab yes @tab yes @tab yes @item badram @tab yes @tab yes @tab yes @tab yes
@item compression @tab always @tab pointless @tab no @tab no @item compression @tab always @tab pointless @tab no @tab no
@item exit @tab yes @tab no @tab no @tab no @item exit @tab yes @tab no @tab no @tab no
@item bootlocation @tab disk @tab no @tab no @tab no
@end multitable @end multitable
@multitable @columnfractions .20 .20 .20 .20 .20 @multitable @columnfractions .20 .20 .20 .20 .20
@@ -5714,7 +5643,6 @@ to install to is specified, UUID is used instead as well.
@item badram @tab yes @tab yes @tab no @tab yes @item badram @tab yes @tab yes @tab no @tab yes
@item compression @tab no @tab no @tab no @tab no @item compression @tab no @tab no @tab no @tab no
@item exit @tab yes @tab yes @tab yes @tab yes @item exit @tab yes @tab yes @tab yes @tab yes
@item bootlocation @tab file @tab file @tab file, ignored @tab file
@end multitable @end multitable
@multitable @columnfractions .20 .20 .20 .20 .20 @multitable @columnfractions .20 .20 .20 .20 .20
@@ -5733,26 +5661,24 @@ to install to is specified, UUID is used instead as well.
@item badram @tab yes (*) @tab no @tab no @tab no @item badram @tab yes (*) @tab no @tab no @tab no
@item compression @tab configurable @tab no @tab no @tab configurable @item compression @tab configurable @tab no @tab no @tab configurable
@item exit @tab no @tab yes @tab yes @tab yes @item exit @tab no @tab yes @tab yes @tab yes
@item bootlocation @tab no @tab partition @tab file @tab file (*)
@end multitable @end multitable
@multitable @columnfractions .20 .20 .20 .20 .20 @multitable @columnfractions .20 .20 .20 .20 .20
@item @tab MIPS qemu @tab emu @tab xen @item @tab MIPS qemu @tab emu
@item video @tab no @tab yes @tab no @item video @tab no @tab yes
@item console charset @tab CP437 @tab Unicode (*) @tab ASCII @item console charset @tab CP437 @tab Unicode (*)
@item network @tab no @tab yes @tab no @item network @tab no @tab yes
@item ATA/AHCI @tab yes @tab no @tab no @item ATA/AHCI @tab yes @tab no
@item AT keyboard @tab yes @tab no @tab no @item AT keyboard @tab yes @tab no
@item Speaker @tab no @tab no @tab no @item Speaker @tab no @tab no
@item USB @tab N/A @tab yes @tab no @item USB @tab N/A @tab yes
@item chainloader @tab yes @tab no @tab yes @item chainloader @tab yes @tab no
@item cpuid @tab no @tab no @tab yes @item cpuid @tab no @tab no
@item hints @tab guess @tab no @tab no @item hints @tab guess @tab no
@item PCI @tab no @tab no @tab no @item PCI @tab no @tab no
@item badram @tab yes (*) @tab no @tab no @item badram @tab yes (*) @tab no
@item compression @tab configurable @tab no @tab no @item compression @tab configurable @tab no
@item exit @tab no @tab yes @tab no @item exit @tab no @tab yes
@item bootlocation @tab no @tab file @tab no
@end multitable @end multitable
@node Platform-specific operations @node Platform-specific operations
@@ -5922,7 +5848,7 @@ Following variables must be defined:
@multitable @columnfractions .30 .65 @multitable @columnfractions .30 .65
@item GRUB_PAYLOADS_DIR @tab directory containing the required kernels @item GRUB_PAYLOADS_DIR @tab directory containing the required kernels
@item GRUB_CBFSTOOL @tab cbfstool from Coreboot package (for coreboot platform only) @item GRUB_CBFSTOOL @tab cbfstoll from Coreboot package (for coreboot platform only)
@item GRUB_COREBOOT_ROM @tab empty Coreboot ROM @item GRUB_COREBOOT_ROM @tab empty Coreboot ROM
@item GRUB_QEMU_OPTS @tab additional options to be supplied to QEMU @item GRUB_QEMU_OPTS @tab additional options to be supplied to QEMU
@end multitable @end multitable
+3 -26
View File
@@ -76,13 +76,7 @@ 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 # Miscelaneous groups schedulded to disappear in future
# 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)
# Miscellaneous groups scheduled 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")
@@ -606,7 +600,7 @@ def foreach_enabled_platform(defn, closure):
# enable = emu; # enable = emu;
# enable = i386; # enable = i386;
# enable = mips_loongson; # enable = mips_loongson;
# emu_condition = COND_GRUB_EMU_SDL; # emu_condition = COND_GRUB_EMU_USB;
# }; # };
# #
def under_platform_specific_conditionals(defn, platform, closure): def under_platform_specific_conditionals(defn, platform, closure):
@@ -729,11 +723,9 @@ def kernel(defn, platform):
"""if test x$(TARGET_APPLE_LINKER) = x1; then \ """if test x$(TARGET_APPLE_LINKER) = x1; then \
$(TARGET_STRIP) -S -x $(""" + cname(defn) + """) -o $@.bin $<; \ $(TARGET_STRIP) -S -x $(""" + cname(defn) + """) -o $@.bin $<; \
$(TARGET_OBJCONV) -f$(TARGET_MODULE_FORMAT) -nr:_grub_mod_init:grub_mod_init -nr:_grub_mod_fini:grub_mod_fini -ed2022 -ed2016 -wd1106 -nu -nd $@.bin $@; \ $(TARGET_OBJCONV) -f$(TARGET_MODULE_FORMAT) -nr:_grub_mod_init:grub_mod_init -nr:_grub_mod_fini:grub_mod_fini -ed2022 -ed2016 -wd1106 -nu -nd $@.bin $@; \
rm -f $@.bin; \
elif test ! -z '$(TARGET_OBJ2ELF)'; then \ elif test ! -z '$(TARGET_OBJ2ELF)'; then \
""" + "$(TARGET_STRIP) $(" + cname(defn) + "_STRIPFLAGS) -o $@.bin $< && \ """ + "$(TARGET_STRIP) $(" + cname(defn) + "_STRIPFLAGS) -o $@.bin $< && \
$(TARGET_OBJ2ELF) $@.bin $@ || (rm -f $@; rm -f $@.bin; exit 1); \ $(TARGET_OBJ2ELF) $@.bin $@ || (rm -f $@; rm -f $@.bin; exit 1); \
rm -f $@.bin; \
else """ + "$(TARGET_STRIP) $(" + cname(defn) + "_STRIPFLAGS) -o $@ $<; \ else """ + "$(TARGET_STRIP) $(" + cname(defn) + "_STRIPFLAGS) -o $@ $<; \
fi""")) fi"""))
@@ -761,7 +753,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 .MIPS.abiflags -R .reginfo -R .rel.dyn -R .note.gnu.gold-version -R .ARM.exidx $< $@; \ $(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 $< $@; \
fi fi
""") """)
@@ -836,20 +828,6 @@ def data(defn, platform):
var_add("dist_" + installdir(defn) + "_DATA", platform_sources(defn, platform)) var_add("dist_" + installdir(defn) + "_DATA", platform_sources(defn, platform))
gvar_add("dist_noinst_DATA", extra_dist(defn)) gvar_add("dist_noinst_DATA", extra_dist(defn))
def transform_data(defn, platform):
name = defn['name']
var_add(installdir(defn) + "_DATA", name)
rule(name, "$(top_builddir)/config.status " + platform_sources(defn, platform) + platform_dependencies(defn, platform), """
(for x in """ + platform_sources(defn, platform) + """; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:-
chmod a+x """ + name + """
""")
gvar_add("CLEANFILES", name)
gvar_add("EXTRA_DIST", extra_dist(defn))
gvar_add("dist_noinst_DATA", platform_sources(defn, platform))
def script(defn, platform): def script(defn, platform):
name = defn['name'] name = defn['name']
@@ -897,7 +875,6 @@ rules("library", library)
rules("program", program) rules("program", program)
rules("script", script) rules("script", script)
rules("data", data) rules("data", data)
rules("transform_data", transform_data)
write_output(section='decl') write_output(section='decl')
write_output() write_output()
+7 -16
View File
@@ -39,10 +39,6 @@ gentrigtables$(BUILD_EXEEXT): gentrigtables.c
$(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) $< $(BUILD_LIBM) $(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) $< $(BUILD_LIBM)
CLEANFILES += gentrigtables$(BUILD_EXEEXT) CLEANFILES += gentrigtables$(BUILD_EXEEXT)
build-grub-module-verifier$(BUILD_EXEEXT): $(top_srcdir)/util/grub-module-verifier.c $(top_srcdir)/util/grub-module-verifier32.c $(top_srcdir)/util/grub-module-verifier64.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) $(BUILD_LDFLAGS) -DGRUB_BUILD=1 -DGRUB_UTIL=1 -DGRUB_BUILD_PROGRAM_NAME=\"build-grub-module-verifier\" $^
CLEANFILES += build-grub-module-verifier$(BUILD_EXEEXT)
# trigtables.c # trigtables.c
trigtables.c: gentrigtables$(BUILD_EXEEXT) gentrigtables.c $(top_srcdir)/configure.ac trigtables.c: gentrigtables$(BUILD_EXEEXT) gentrigtables.c $(top_srcdir)/configure.ac
./gentrigtables$(BUILD_EXEEXT) > $@ ./gentrigtables$(BUILD_EXEEXT) > $@
@@ -80,11 +76,7 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i18n.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/kernel.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/kernel.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/list.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/list.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/misc.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/misc.h
if COND_emu
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/compiler-rt-emu.h
else
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/compiler-rt.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/compiler-rt.h
endif
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/mm.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/mm.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/parser.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/parser.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/partition.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/partition.h
@@ -92,6 +84,9 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/term.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/time.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/time.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/mm_private.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/mm_private.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/net.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/net.h
if !COND_clang
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/libgcc.h
endif
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/memory.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/memory.h
if COND_i386_pc if COND_i386_pc
@@ -105,7 +100,6 @@ if COND_i386_efi
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/acpi.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/pci.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/pci.h
endif endif
@@ -117,12 +111,10 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/video_fb.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/gfxterm.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/gfxterm.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/font.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/font.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/bufio.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/bufio.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/acpi.h
endif endif
if COND_i386_multiboot if COND_i386_multiboot
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/acpi.h
endif endif
if COND_i386_qemu if COND_i386_qemu
@@ -161,13 +153,11 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/pci.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/pci.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/acpi.h
endif endif
if COND_ia64_efi if COND_ia64_efi
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/acpi.h
endif endif
if COND_mips if COND_mips
@@ -242,13 +232,11 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/arm/efi/loader.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/arm/system.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/arm/system.h
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/acpi.h
endif endif
if COND_arm64_efi if COND_arm64_efi
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/acpi.h
endif endif
if COND_emu if COND_emu
@@ -261,6 +249,9 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
if COND_GRUB_EMU_SDL if COND_GRUB_EMU_SDL
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/sdl.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/sdl.h
endif endif
if COND_GRUB_EMU_USB
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/libusb.h
endif
if COND_GRUB_EMU_PCI if COND_GRUB_EMU_PCI
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/libpciaccess.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/libpciaccess.h
endif endif
@@ -394,7 +385,7 @@ moddep.lst: syminfo.lst genmoddep.awk video.lst
platform_DATA += moddep.lst platform_DATA += moddep.lst
CLEANFILES += config.log syminfo.lst moddep.lst CLEANFILES += config.log syminfo.lst moddep.lst
$(MOD_FILES): %.mod : genmod.sh moddep.lst %.module$(EXEEXT) build-grub-module-verifier$(BUILD_EXEEXT) $(MOD_FILES): %.mod : genmod.sh moddep.lst %.module$(EXEEXT)
TARGET_OBJ2ELF=@TARGET_OBJ2ELF@ sh $^ $@ TARGET_OBJ2ELF=@TARGET_OBJ2ELF@ sh $^ $@
platform_DATA += $(MOD_FILES) platform_DATA += $(MOD_FILES)
platform_DATA += modinfo.sh platform_DATA += modinfo.sh
+47 -76
View File
@@ -1,43 +1,43 @@
AutoGen definitions Makefile.tpl; AutoGen definitions Makefile.tpl;
transform_data = { script = {
installdir = noinst; installdir = noinst;
name = gensyminfo.sh; name = gensyminfo.sh;
common = gensyminfo.sh.in; common = gensyminfo.sh.in;
}; };
transform_data = { script = {
installdir = noinst; installdir = noinst;
name = genmod.sh; name = genmod.sh;
common = genmod.sh.in; common = genmod.sh.in;
}; };
transform_data = { script = {
installdir = noinst; installdir = noinst;
name = modinfo.sh; name = modinfo.sh;
common = modinfo.sh.in; common = modinfo.sh.in;
}; };
transform_data = { script = {
installdir = platform; installdir = platform;
name = gmodule.pl; name = gmodule.pl;
common = gmodule.pl.in; common = gmodule.pl.in;
}; };
transform_data = { script = {
installdir = platform; installdir = platform;
name = gdb_grub; name = gdb_grub;
common = gdb_grub.in; common = gdb_grub.in;
}; };
transform_data = { script = {
installdir = platform; installdir = platform;
name = grub.chrp; name = grub.chrp;
common = boot/powerpc/grub.chrp.in; common = boot/powerpc/grub.chrp.in;
enable = powerpc_ieee1275; enable = powerpc_ieee1275;
}; };
transform_data = { script = {
installdir = platform; installdir = platform;
name = bootinfo.txt; name = bootinfo.txt;
common = boot/powerpc/bootinfo.txt.in; common = boot/powerpc/bootinfo.txt.in;
@@ -59,6 +59,9 @@ kernel = {
ia64_efi_ldflags = '-Wl,-r,-d'; ia64_efi_ldflags = '-Wl,-r,-d';
ia64_efi_stripflags = '--strip-unneeded -K start -R .note -R .comment -R .note.gnu.gold-version'; ia64_efi_stripflags = '--strip-unneeded -K start -R .note -R .comment -R .note.gnu.gold-version';
x86_64_xen_cppflags = '$(CPPFLAGS_XEN)';
i386_xen_cppflags = '$(CPPFLAGS_XEN)';
arm_efi_ldflags = '-Wl,-r,-d'; arm_efi_ldflags = '-Wl,-r,-d';
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';
@@ -80,6 +83,8 @@ kernel = {
x86_64_xen_ldflags = '$(TARGET_IMG_LDFLAGS)'; x86_64_xen_ldflags = '$(TARGET_IMG_LDFLAGS)';
x86_64_xen_ldflags = '$(TARGET_IMG_BASE_LDOPT),0'; x86_64_xen_ldflags = '$(TARGET_IMG_BASE_LDOPT),0';
ldadd = '$(LDADD_KERNEL)';
mips_loongson_ldflags = '-Wl,-Ttext,0x80200000'; mips_loongson_ldflags = '-Wl,-Ttext,0x80200000';
powerpc_ieee1275_ldflags = '-Wl,-Ttext,0x200000'; powerpc_ieee1275_ldflags = '-Wl,-Ttext,0x200000';
sparc64_ieee1275_ldflags = '-Wl,-Ttext,0x4400'; sparc64_ieee1275_ldflags = '-Wl,-Ttext,0x4400';
@@ -155,8 +160,6 @@ 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;
@@ -171,20 +174,8 @@ kernel = {
efi = kern/efi/init.c; efi = kern/efi/init.c;
efi = kern/efi/mm.c; efi = kern/efi/mm.c;
efi = term/efi/console.c; efi = term/efi/console.c;
efi = kern/acpi.c;
efi = kern/efi/acpi.c;
i386_coreboot = kern/i386/pc/acpi.c;
i386_multiboot = kern/i386/pc/acpi.c;
i386_coreboot = kern/acpi.c;
i386_multiboot = kern/acpi.c;
x86 = kern/i386/tsc.c; x86 = kern/i386/tsc.c;
x86 = kern/i386/tsc_pit.c;
i386_efi = kern/i386/efi/tsc.c;
x86_64_efi = kern/i386/efi/tsc.c;
i386_efi = kern/i386/tsc_pmtimer.c;
i386_coreboot = kern/i386/tsc_pmtimer.c;
x86_64_efi = kern/i386/tsc_pmtimer.c;
i386_efi = kern/i386/efi/init.c; i386_efi = kern/i386/efi/init.c;
i386_efi = bus/pci.c; i386_efi = bus/pci.c;
@@ -196,7 +187,6 @@ kernel = {
x86_64_efi = bus/pci.c; x86_64_efi = bus/pci.c;
xen = kern/i386/tsc.c; xen = kern/i386/tsc.c;
xen = kern/i386/xen/tsc.c;
x86_64_xen = kern/x86_64/xen/hypercall.S; x86_64_xen = kern/x86_64/xen/hypercall.S;
i386_xen = kern/i386/xen/hypercall.S; i386_xen = kern/i386/xen/hypercall.S;
xen = kern/xen/init.c; xen = kern/xen/init.c;
@@ -275,7 +265,7 @@ kernel = {
arm = kern/arm/cache_armv7.S; arm = kern/arm/cache_armv7.S;
extra_dist = kern/arm/cache.S; extra_dist = kern/arm/cache.S;
arm = kern/arm/cache.c; arm = kern/arm/cache.c;
arm = kern/arm/compiler-rt.S; arm = kern/arm/misc.S;
arm64 = kern/arm64/cache.c; arm64 = kern/arm64/cache.c;
arm64 = kern/arm64/cache_flush.S; arm64 = kern/arm64/cache_flush.S;
@@ -453,13 +443,13 @@ image = {
common = lib/xzembed/xz_dec_bcj.c; common = lib/xzembed/xz_dec_bcj.c;
common = lib/xzembed/xz_dec_lzma2.c; common = lib/xzembed/xz_dec_lzma2.c;
common = lib/xzembed/xz_dec_stream.c; common = lib/xzembed/xz_dec_stream.c;
common = kern/compiler-rt.c;
cppflags = '-I$(srcdir)/lib/posix_wrap -I$(srcdir)/lib/xzembed -DGRUB_EMBED_DECOMPRESSOR=1'; cppflags = '-I$(srcdir)/lib/posix_wrap -I$(srcdir)/lib/xzembed -DGRUB_EMBED_DECOMPRESSOR=1';
objcopyflags = '-O binary'; objcopyflags = '-O binary';
mips_ldflags = '-Wl,-Ttext,$(TARGET_DECOMPRESSOR_LINK_ADDR)'; mips_ldflags = '$(TARGET_LDFLAGS_STATIC_LIBGCC) -Wl,-Ttext,$(TARGET_DECOMPRESSOR_LINK_ADDR)';
cflags = '-Wno-unreachable-code'; ldadd = '$(TARGET_LIBGCC)';
cflags = '-Wno-unreachable-code $(TARGET_LDFLAGS_STATIC_LIBGCC)';
enable = mips; enable = mips;
}; };
@@ -471,7 +461,9 @@ image = {
cppflags = '-DGRUB_EMBED_DECOMPRESSOR=1'; cppflags = '-DGRUB_EMBED_DECOMPRESSOR=1';
objcopyflags = '-O binary'; objcopyflags = '-O binary';
mips_ldflags = '-Wl,-Ttext,$(TARGET_DECOMPRESSOR_LINK_ADDR)'; mips_ldflags = '$(TARGET_LDFLAGS_STATIC_LIBGCC) -Wl,-Ttext,$(TARGET_DECOMPRESSOR_LINK_ADDR)';
ldadd = '$(TARGET_LIBGCC)';
cflags = '$(TARGET_LDFLAGS_STATIC_LIBGCC)';
enable = mips; enable = mips;
}; };
@@ -489,7 +481,7 @@ image = {
name = fwstart; name = fwstart;
mips_loongson = boot/mips/loongson/fwstart.S; mips_loongson = boot/mips/loongson/fwstart.S;
objcopyflags = '-O binary'; objcopyflags = '-O binary';
ldflags = '-Wl,-N,-S,-Ttext,0xbfc00000,-Bstatic'; ldflags = '$(TARGET_LDFLAGS_STATIC_LIBGCC) $(TARGET_LIBGCC) -Wl,-N,-S,-Ttext,0xbfc00000,-Bstatic';
enable = mips_loongson; enable = mips_loongson;
}; };
@@ -497,7 +489,7 @@ image = {
name = fwstart_fuloong2f; name = fwstart_fuloong2f;
mips_loongson = boot/mips/loongson/fuloong2f.S; mips_loongson = boot/mips/loongson/fuloong2f.S;
objcopyflags = '-O binary'; objcopyflags = '-O binary';
ldflags = '-Wl,-N,-S,-Ttext,0xbfc00000,-Bstatic'; ldflags = '$(TARGET_LDFLAGS_STATIC_LIBGCC) $(TARGET_LIBGCC) -Wl,-N,-S,-Ttext,0xbfc00000,-Bstatic';
enable = mips_loongson; enable = mips_loongson;
}; };
@@ -519,6 +511,13 @@ module = {
enable = x86; enable = x86;
}; };
module = {
name = libusb;
emu = bus/usb/emu/usb.c;
enable = emu;
condition = COND_GRUB_EMU_USB;
};
module = { module = {
name = lsspd; name = lsspd;
mips_loongson = commands/mips/loongson/lsspd.c; mips_loongson = commands/mips/loongson/lsspd.c;
@@ -533,6 +532,13 @@ module = {
enable = usb; enable = usb;
}; };
module = {
name = emuusb;
common = bus/usb/usb.c;
enable = emu;
condition = COND_GRUB_EMU_USB;
};
module = { module = {
name = usbserial_common; name = usbserial_common;
common = bus/usb/serial/common.c; common = bus/usb/serial/common.c;
@@ -614,6 +620,7 @@ module = {
module = { module = {
name = lsxen; name = lsxen;
common = commands/xen/lsxen.c; common = commands/xen/lsxen.c;
cppflags = '$(CPPFLAGS_XEN)';
enable = xen; enable = xen;
}; };
@@ -678,8 +685,10 @@ module = {
name = acpi; name = acpi;
common = commands/acpi.c; common = commands/acpi.c;
i386_pc = kern/acpi.c; efi = commands/efi/acpi.c;
i386_pc = kern/i386/pc/acpi.c; i386_pc = commands/i386/pc/acpi.c;
i386_coreboot = commands/i386/pc/acpi.c;
i386_multiboot = commands/i386/pc/acpi.c;
enable = efi; enable = efi;
enable = i386_pc; enable = i386_pc;
@@ -832,6 +841,7 @@ module = {
i386_coreboot = lib/i386/halt.c; i386_coreboot = lib/i386/halt.c;
i386_qemu = lib/i386/halt.c; i386_qemu = lib/i386/halt.c;
xen = lib/xen/halt.c; xen = lib/xen/halt.c;
xen_cppflags = '$(CPPFLAGS_XEN)';
efi = lib/efi/halt.c; efi = lib/efi/halt.c;
ieee1275 = lib/ieee1275/halt.c; ieee1275 = lib/ieee1275/halt.c;
emu = lib/emu/halt.c; emu = lib/emu/halt.c;
@@ -852,6 +862,7 @@ module = {
mips_loongson = lib/mips/loongson/reboot.c; mips_loongson = lib/mips/loongson/reboot.c;
mips_qemu_mips = lib/mips/qemu_mips/reboot.c; mips_qemu_mips = lib/mips/qemu_mips/reboot.c;
xen = lib/xen/reboot.c; xen = lib/xen/reboot.c;
xen_cppflags = '$(CPPFLAGS_XEN)';
uboot = lib/uboot/reboot.c; uboot = lib/uboot/reboot.c;
common = commands/reboot.c; common = commands/reboot.c;
}; };
@@ -1453,6 +1464,7 @@ module = {
module = { module = {
name = gfxmenu; name = gfxmenu;
common = gfxmenu/gfxmenu.c; common = gfxmenu/gfxmenu.c;
common = gfxmenu/model.c;
common = gfxmenu/view.c; common = gfxmenu/view.c;
common = gfxmenu/font.c; common = gfxmenu/font.c;
common = gfxmenu/icon_manager.c; common = gfxmenu/icon_manager.c;
@@ -1531,6 +1543,7 @@ module = {
i386_xen = lib/i386/xen/relocator.S; i386_xen = lib/i386/xen/relocator.S;
x86_64_xen = lib/x86_64/xen/relocator.S; x86_64_xen = lib/x86_64/xen/relocator.S;
xen = lib/i386/relocator_common_c.c; xen = lib/i386/relocator_common_c.c;
xen_cppflags = '$(CPPFLAGS_XEN)';
extra_dist = lib/i386/relocator_common.S; extra_dist = lib/i386/relocator_common.S;
extra_dist = kern/powerpc/cache_flush.S; extra_dist = kern/powerpc/cache_flush.S;
@@ -1551,6 +1564,7 @@ module = {
sparc64_ieee1275 = lib/ieee1275/cmos.c; sparc64_ieee1275 = lib/ieee1275/cmos.c;
powerpc_ieee1275 = lib/ieee1275/cmos.c; powerpc_ieee1275 = lib/ieee1275/cmos.c;
xen = lib/xen/datetime.c; xen = lib/xen/datetime.c;
xen_cppflags = '$(CPPFLAGS_XEN)';
mips_arc = lib/arc/datetime.c; mips_arc = lib/arc/datetime.c;
enable = noemu; enable = noemu;
@@ -1649,17 +1663,11 @@ module = {
enable = x86; enable = x86;
}; };
module = {
name = xen_boot;
common = lib/cmdline.c;
arm64 = loader/arm64/xen_boot.c;
enable = arm64;
};
module = { module = {
name = linux; name = linux;
x86 = loader/i386/linux.c; x86 = loader/i386/linux.c;
xen = loader/i386/xen.c; xen = loader/i386/xen.c;
xen_cppflags = '$(CPPFLAGS_XEN)';
i386_pc = lib/i386/pc/vesa_modes_table.c; i386_pc = lib/i386/pc/vesa_modes_table.c;
mips = loader/mips/linux.c; mips = loader/mips/linux.c;
powerpc_ieee1275 = loader/powerpc/ieee1275/linux.c; powerpc_ieee1275 = loader/powerpc/ieee1275/linux.c;
@@ -1667,18 +1675,12 @@ module = {
ia64_efi = loader/ia64/efi/linux.c; ia64_efi = loader/ia64/efi/linux.c;
arm = loader/arm/linux.c; arm = loader/arm/linux.c;
arm64 = loader/arm64/linux.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;
}; };
module = {
name = fdt;
arm64 = loader/arm64/fdt.c;
common = lib/fdt.c;
enable = fdt;
};
module = { module = {
name = xnu; name = xnu;
x86 = loader/xnu_resume.c; x86 = loader/xnu_resume.c;
@@ -1969,42 +1971,11 @@ 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;
}; };
module = {
name = mul_test;
common = tests/mul_test.c;
};
module = {
name = shift_test;
common = tests/shift_test.c;
};
module = {
name = cmp_test;
common = tests/cmp_test.c;
};
module = {
name = ctz_test;
common = tests/ctz_test.c;
};
module = {
name = bswap_test;
common = tests/bswap_test.c;
};
module = { module = {
name = videotest_checksum; name = videotest_checksum;
common = tests/videotest_checksum.c; common = tests/videotest_checksum.c;
+10 -1
View File
@@ -21,7 +21,7 @@
#include <grub/decompressor.h> #include <grub/decompressor.h>
void * void *
grub_memset (void *s, int c, grub_size_t len) memset (void *s, int c, grub_size_t len)
{ {
grub_uint8_t *ptr; grub_uint8_t *ptr;
for (ptr = s; len; ptr++, len--) for (ptr = s; len; ptr++, len--)
@@ -68,6 +68,15 @@ grub_memcmp (const void *s1, const void *s2, grub_size_t n)
return 0; return 0;
} }
int memcmp (const void *s1, const void *s2, grub_size_t n)
__attribute__ ((alias ("grub_memcmp")));
void *memmove (void *dest, const void *src, grub_size_t n)
__attribute__ ((alias ("grub_memmove")));
void *memcpy (void *dest, const void *src, grub_size_t n)
__attribute__ ((alias ("grub_memmove")));
void *grub_decompressor_scratch; void *grub_decompressor_scratch;
void void
+21 -21
View File
@@ -165,8 +165,8 @@ start:
* this area. * this area.
*/ */
.org GRUB_BOOT_MACHINE_BPB_START . = _start + GRUB_BOOT_MACHINE_BPB_START
.org 4 . = _start + 4
#endif #endif
#ifdef HYBRID_BOOT #ifdef HYBRID_BOOT
floppy floppy
@@ -174,23 +174,23 @@ start:
scratch scratch
#endif #endif
.org GRUB_BOOT_MACHINE_BPB_END . = _start + GRUB_BOOT_MACHINE_BPB_END
/* /*
* End of BIOS parameter block. * End of BIOS parameter block.
*/ */
LOCAL(kernel_address): kernel_address:
.word GRUB_BOOT_MACHINE_KERNEL_ADDR .word GRUB_BOOT_MACHINE_KERNEL_ADDR
#ifndef HYBRID_BOOT #ifndef HYBRID_BOOT
.org GRUB_BOOT_MACHINE_KERNEL_SECTOR . = _start + GRUB_BOOT_MACHINE_KERNEL_SECTOR
LOCAL(kernel_sector): kernel_sector:
.long 1 .long 1
LOCAL(kernel_sector_high): kernel_sector_high:
.long 0 .long 0
#endif #endif
.org GRUB_BOOT_MACHINE_BOOT_DRIVE . = _start + 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).
*/ */
.org GRUB_BOOT_MACHINE_DRIVE_CHECK . = _start + 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)
LOCAL(lba_mode): lba_mode:
xorw %ax, %ax xorw %ax, %ax
movw %ax, 4(%si) movw %ax, 4(%si)
@@ -290,9 +290,9 @@ LOCAL(lba_mode):
movw $0x0010, (%si) movw $0x0010, (%si)
/* the absolute address */ /* the absolute address */
movl LOCAL(kernel_sector), %ebx movl kernel_sector, %ebx
movl %ebx, 8(%si) movl %ebx, 8(%si)
movl LOCAL(kernel_sector_high), %ebx movl 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 LOCAL(kernel_sector_high), %eax movl 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 LOCAL(kernel_sector), %eax movl 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 *(LOCAL(kernel_address)) jmp *(kernel_address)
/* END OF MAIN LOOP */ /* END OF MAIN LOOP */
@@ -511,13 +511,13 @@ LOCAL(message):
*/ */
#ifdef HYBRID_BOOT #ifdef HYBRID_BOOT
.org 0x1b0 . = _start + 0x1b0
LOCAL(kernel_sector): kernel_sector:
.long 1 .long 1
LOCAL(kernel_sector_high): kernel_sector_high:
.long 0 .long 0
#endif #endif
.org GRUB_BOOT_MACHINE_WINDOWS_NT_MAGIC . = _start + 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?
*/ */
.org GRUB_BOOT_MACHINE_PART_START . = _start + GRUB_BOOT_MACHINE_PART_START
#ifndef HYBRID_BOOT #ifndef HYBRID_BOOT
floppy floppy
@@ -536,7 +536,7 @@ nt_magic:
scratch scratch
#endif #endif
.org GRUB_BOOT_MACHINE_PART_END . = _start + 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
.org 8 . = start + 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"
.org 0x7FF . = start + 0x7FF
.byte 0 .byte 0
+1 -1
View File
@@ -362,7 +362,7 @@ LOCAL(message):
.word 0 .word 0
.word 0 .word 0
.org 0x200 - GRUB_BOOT_MACHINE_LIST_SIZE . = _start + 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)
.org 0x1F1 . = data_start + 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"
.org (CODE_SECTORS * 512 + 512) . = _start + CODE_SECTORS * 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. */
.org 0x8200 - 0x7C00 - 0x200 - 1 . = _start + 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.
*/ */
.org GRUB_DECOMPRESSOR_MACHINE_COMPRESSED_SIZE . = _start + GRUB_DECOMPRESSOR_MACHINE_COMPRESSED_SIZE
LOCAL(compressed_size): LOCAL(compressed_size):
.long 0 .long 0
.org GRUB_DECOMPRESSOR_MACHINE_UNCOMPRESSED_SIZE . = _start + GRUB_DECOMPRESSOR_MACHINE_UNCOMPRESSED_SIZE
LOCAL(uncompressed_size): LOCAL(uncompressed_size):
.long 0 .long 0
.org GRUB_KERNEL_I386_PC_REED_SOLOMON_REDUNDANCY . = _start + GRUB_KERNEL_I386_PC_REED_SOLOMON_REDUNDANCY
reed_solomon_redundancy: reed_solomon_redundancy:
.long 0 .long 0
.org GRUB_KERNEL_I386_PC_NO_REED_SOLOMON_LENGTH . = _start + 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.
*/ */
.org GRUB_DECOMPRESSOR_I386_PC_BOOT_DEVICE . = _start + 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 */
movb %dl, LOCAL(boot_drive) ADDR32 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 */
calll real_to_prot DATA32 call 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
calll real_to_prot DATA32 call real_to_prot
.code32 .code32
popl %ebp popl %ebp
+5 -5
View File
@@ -31,7 +31,7 @@ _start:
jmp 1f jmp 1f
.org GRUB_BOOT_I386_QEMU_CORE_ENTRY_ADDR . = _start + GRUB_BOOT_I386_QEMU_CORE_ENTRY_ADDR
VARIABLE(grub_core_entry_addr) VARIABLE(grub_core_entry_addr)
.long 0 .long 0
1: 1:
@@ -48,9 +48,8 @@ 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
jmp real_to_prot DATA32 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. */
@@ -58,6 +57,7 @@ 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. */
.org GRUB_BOOT_MACHINE_SIZE - 16 . = GRUB_BOOT_MACHINE_SIZE - 16
.code16 .code16
jmp _start jmp _start
.org GRUB_BOOT_MACHINE_SIZE . = GRUB_BOOT_MACHINE_SIZE
+6 -6
View File
@@ -162,7 +162,7 @@ retry_cs5536:
b continue b continue
.org GRUB_CPU_LOONGSON_FLASH_TLB_REFILL - GRUB_CPU_LOONGSON_FLASH_START . = start + 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)
.org GRUB_CPU_LOONGSON_FLASH_CACHE_ERROR - GRUB_CPU_LOONGSON_FLASH_START . = start + 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)
.org GRUB_CPU_LOONGSON_FLASH_OTHER_EXCEPTION - GRUB_CPU_LOONGSON_FLASH_START . = start + 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
@@ -344,7 +344,7 @@ printhex:
nop nop
srl $t1, $a0, 28 srl $t1, $a0, 28
addiu $t1, $t1, -10 addiu $t1, $t1, -10
bltz $t1, 2f blt $t1, $zero, 2f
sll $a0, $a0, 4 sll $a0, $a0, 4
addiu $t1, $t1, 'A'-10-'0' addiu $t1, $t1, 'A'-10-'0'
2: addiu $t1, $t1, '0'+10 2: addiu $t1, $t1, '0'+10
@@ -398,7 +398,7 @@ read_spd:
move $t2, $a0 move $t2, $a0
move $t3, $ra move $t3, $ra
lui $a0, %hi(read_spd_fail) lui $a0, %hi(read_spd_fail)
addiu $a0, $a0, %lo(read_spd_fail) addiu $a0, $a0, %hi(read_spd_fail)
/* Send START. */ /* Send START. */
lui $t0, %hi(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL1 + GRUB_MACHINE_PCI_IO_BASE_2F) lui $t0, %hi(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL1 + GRUB_MACHINE_PCI_IO_BASE_2F)
@@ -547,7 +547,7 @@ gpio_dump:
#endif #endif
gpio_dump_end: gpio_dump_end:
.p2align 3 .p2align
write_dumpreg: write_dumpreg:
ld $t2, 0($t6) ld $t2, 0($t6)
+33 -34
View File
@@ -22,7 +22,6 @@
#include <grub/machine/memory.h> #include <grub/machine/memory.h>
#include <grub/machine/kernel.h> #include <grub/machine/kernel.h>
#include <grub/offsets.h> #include <grub/offsets.h>
#include <grub/mips/asm.h>
#define BASE_ADDR 8 #define BASE_ADDR 8
@@ -40,13 +39,13 @@ start:
bal codestart bal codestart
nop nop
base: base:
.org GRUB_DECOMPRESSOR_MACHINE_COMPRESSED_SIZE . = _start + GRUB_DECOMPRESSOR_MACHINE_COMPRESSED_SIZE
compressed_size: compressed_size:
.long 0 .long 0
.org GRUB_DECOMPRESSOR_MACHINE_UNCOMPRESSED_SIZE . = _start + GRUB_DECOMPRESSOR_MACHINE_UNCOMPRESSED_SIZE
uncompressed_size: uncompressed_size:
.long 0 .long 0
.org GRUB_DECOMPRESSOR_MACHINE_UNCOMPRESSED_ADDR . = _start + GRUB_DECOMPRESSOR_MACHINE_UNCOMPRESSED_ADDR
uncompressed_addr: uncompressed_addr:
.long 0 .long 0
codestart: codestart:
@@ -119,50 +118,50 @@ parsestr:
move $v0, $zero move $v0, $zero
move $t3, $t1 move $t3, $t1
3: 3:
lb GRUB_ASM_T4, 0($t2) lb $t4, 0($t2)
lb GRUB_ASM_T5, 0($t3) lb $t5, 0($t3)
addiu $t2, $t2, 1 addiu $t2, $t2, 1
addiu $t3, $t3, 1 addiu $t3, $t3, 1
beq GRUB_ASM_T5, $zero, 1f beq $t5, $zero, 1f
nop nop
beq GRUB_ASM_T5, GRUB_ASM_T4, 3b beq $t5, $t4, 3b
nop nop
bne GRUB_ASM_T4, $zero, 1f bne $t4, $zero, 1f
nop nop
addiu $t3, $t3, 0xffff addiu $t3, $t3, 0xffff
digcont: digcont:
lb GRUB_ASM_T5, 0($t3) lb $t5, 0($t3)
/* Substract '0' from digit. */ /* Substract '0' from digit. */
addiu GRUB_ASM_T5, GRUB_ASM_T5, 0xffd0 addiu $t5, $t5, 0xffd0
bltz GRUB_ASM_T5, 1f bltz $t5, 1f
nop nop
addiu GRUB_ASM_T4, GRUB_ASM_T5, 0xfff7 addiu $t4, $t5, 0xfff7
bgtz GRUB_ASM_T4, 1f bgtz $t4, 1f
nop nop
/* Multiply $v0 by 10 with bitshifts. */ /* Multiply $v0 by 10 with bitshifts. */
sll $v0, $v0, 1 sll $v0, $v0, 1
sll GRUB_ASM_T4, $v0, 2 sll $t4, $v0, 2
addu $v0, $v0, GRUB_ASM_T4 addu $v0, $v0, $t4
addu $v0, $v0, GRUB_ASM_T5 addu $v0, $v0, $t5
addiu $t3, $t3, 1 addiu $t3, $t3, 1
b digcont b digcont
nop nop
1: 1:
jr $ra jr $ra
nop nop
busclockstr: .asciz "busclock=" busclockstr: .asciiz "busclock="
cpuclockstr: .asciz "cpuclock=" cpuclockstr: .asciiz "cpuclock="
memsizestr: .asciz "memsize=" memsizestr: .asciiz "memsize="
highmemsizestr: .asciz "highmemsize=" highmemsizestr: .asciiz "highmemsize="
machtype_yeeloong_str1: .asciz "machtype=8.9" machtype_yeeloong_str1: .asciiz "machtype=8.9"
machtype_yeeloong_str2: .asciz "machtype=lemote-yeeloong-" machtype_yeeloong_str2: .asciiz "machtype=lemote-yeeloong-"
machtype_fuloong2f_str: .asciz "machtype=lemote-fuloong-2f" machtype_fuloong2f_str: .asciiz "machtype=lemote-fuloong-2f"
machtype_fuloong2e_str: .asciz "machtype=lemote-fuloong-2e" machtype_fuloong2e_str: .asciiz "machtype=lemote-fuloong-2e"
pmon_yeeloong_str: .asciz "PMON_VER=LM8" pmon_yeeloong_str: .asciiz "PMON_VER=LM8"
pmon_fuloong2f_str: .asciz "PMON_VER=LM6" pmon_fuloong2f_str: .asciiz "PMON_VER=LM6"
pmon_yeeloong_verstr: .asciz "Version=LM8" pmon_yeeloong_verstr: .asciiz "Version=LM8"
pmon_fuloong2f_verstr: .asciz "Version=LM6" pmon_fuloong2f_verstr: .asciiz "Version=LM6"
.p2align 2 .p2align 2
argdone: argdone:
@@ -183,10 +182,10 @@ argdone:
b argdone b argdone
addiu $a1, $a1, 4 addiu $a1, $a1, 4
do_check: do_check:
lb GRUB_ASM_T4, 0($t7) lb $t4, 0($t7)
beq GRUB_ASM_T4, $zero, 1f beq $t4, $zero, 1f
lb $t3, 0($t6) lb $t3, 0($t6)
bne $t3, GRUB_ASM_T4, 2f bne $t3, $t4, 2f
addiu $t6, $t6, 1 addiu $t6, $t6, 1
b do_check b do_check
addiu $t7, $t7, 1 addiu $t7, $t7, 1
@@ -223,8 +222,8 @@ cmdlinedone:
1: 1:
beq $t1, $t3, 2f beq $t1, $t3, 2f
lb GRUB_ASM_T4, 0($t2) lb $t4, 0($t2)
sb GRUB_ASM_T4, 0($t1) sb $t4, 0($t1)
addiu $t1, $t1, 1 addiu $t1, $t1, 1
b 1b b 1b
addiu $t2, $t2, 1 addiu $t2, $t2, 1
+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).
*/ */
.org GRUB_BOOT_MACHINE_BOOT_DEVPATH . = _start + GRUB_BOOT_MACHINE_BOOT_DEVPATH
boot_path: boot_path:
.org GRUB_BOOT_MACHINE_KERNEL_BYTE . = _start + 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>
.org 8 . = _start + 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
.org GRUB_BOOT_MACHINE_CODE_END . = _start + GRUB_BOOT_MACHINE_CODE_END
/* the last 4 bytes in the sector 0 contain the signature */ /* the last 4 bytes in the sector 0 contain the signature */
.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
.org (0x200 - GRUB_BOOT_SPARC64_IEEE1275_LIST_SIZE) . = _start + (0x200 - GRUB_BOOT_SPARC64_IEEE1275_LIST_SIZE)
blocklist_default_start: blocklist_default_start:
.word 0 .word 0
.word 2 .word 2
+3 -4
View File
@@ -55,8 +55,7 @@ grub_pci_device_map_range (grub_pci_device_t dev, grub_addr_t base,
int err; int err;
err = pci_device_map_range (dev, base, size, PCI_DEV_MAP_FLAG_WRITABLE, &addr); err = pci_device_map_range (dev, base, size, PCI_DEV_MAP_FLAG_WRITABLE, &addr);
if (err) if (err)
grub_util_error ("mapping 0x%llx failed (error %d)", grub_util_error ("mapping 0x%x failed (error %d)\n", base, err);
(unsigned long long) base, err);
return addr; return addr;
} }
@@ -67,12 +66,12 @@ grub_pci_device_unmap_range (grub_pci_device_t dev, void *mem,
pci_device_unmap_range (dev, mem, size); pci_device_unmap_range (dev, mem, size);
} }
GRUB_MOD_INIT (emupci) GRUB_MOD_INIT (pci)
{ {
pci_system_init (); pci_system_init ();
} }
GRUB_MOD_FINI (emupci) GRUB_MOD_FINI (pci)
{ {
pci_system_cleanup (); pci_system_cleanup ();
} }
+203
View File
@@ -0,0 +1,203 @@
/* usb.c -- libusb USB support for GRUB. */
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2008 Free Software Foundation, Inc.
*
* GRUB is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* GRUB is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
*/
#include <config.h>
#include <grub/misc.h>
#include <grub/mm.h>
#include <usb.h>
#include <grub/usb.h>
#include <grub/dl.h>
GRUB_MOD_LICENSE ("GPLv3+");
static struct grub_usb_controller_dev usb_controller =
{
.name = "libusb"
};
static struct grub_usb_device *grub_usb_devs[128];
struct usb_bus *busses;
static grub_err_t
grub_libusb_devices (void)
{
struct usb_bus *bus;
int last = 0;
busses = usb_get_busses();
for (bus = busses; bus; bus = bus->next)
{
struct usb_device *usbdev;
struct grub_usb_device *dev;
for (usbdev = bus->devices; usbdev; usbdev = usbdev->next)
{
struct usb_device_descriptor *desc = &usbdev->descriptor;
grub_err_t err;
if (! desc->bcdUSB)
continue;
dev = grub_malloc (sizeof (*dev));
if (! dev)
return grub_errno;
dev->data = usbdev;
/* Fill in all descriptors. */
err = grub_usb_device_initialize (dev);
if (err)
{
grub_errno = GRUB_ERR_NONE;
continue;
}
/* Register the device. */
grub_usb_devs[last++] = dev;
}
}
return GRUB_USB_ERR_NONE;
}
void
grub_usb_poll_devices (void)
{
/* TODO: recheck grub_usb_devs */
}
int
grub_usb_iterate (grub_usb_iterate_hook_t hook, void *hook_data)
{
int i;
for (i = 0; i < 128; i++)
{
if (grub_usb_devs[i])
{
if (hook (grub_usb_devs[i], hook_data))
return 1;
}
}
return 0;
}
grub_usb_err_t
grub_usb_root_hub (grub_usb_controller_t controller __attribute__((unused)))
{
return GRUB_USB_ERR_NONE;
}
grub_usb_err_t
grub_usb_control_msg (grub_usb_device_t dev, grub_uint8_t reqtype,
grub_uint8_t request, grub_uint16_t value,
grub_uint16_t idx, grub_size_t size, char *data)
{
usb_dev_handle *devh;
struct usb_device *d = dev->data;
devh = usb_open (d);
if (usb_control_msg (devh, reqtype, request,
value, idx, data, size, 20) < 0)
{
usb_close (devh);
return GRUB_USB_ERR_STALL;
}
usb_close (devh);
return GRUB_USB_ERR_NONE;
}
grub_usb_err_t
grub_usb_bulk_read (grub_usb_device_t dev,
int endpoint, grub_size_t size, char *data)
{
usb_dev_handle *devh;
struct usb_device *d = dev->data;
devh = usb_open (d);
if (usb_claim_interface (devh, 0) < 1)
{
usb_close (devh);
return GRUB_USB_ERR_STALL;
}
if (usb_bulk_read (devh, endpoint, data, size, 20) < 1)
{
usb_close (devh);
return GRUB_USB_ERR_STALL;
}
usb_release_interface (devh, 0);
usb_close (devh);
return GRUB_USB_ERR_NONE;
}
grub_usb_err_t
grub_usb_bulk_write (grub_usb_device_t dev,
int endpoint, grub_size_t size, char *data)
{
usb_dev_handle *devh;
struct usb_device *d = dev->data;
devh = usb_open (d);
if (usb_claim_interface (devh, 0) < 0)
goto fail;
if (usb_bulk_write (devh, endpoint, data, size, 20) < 0)
goto fail;
if (usb_release_interface (devh, 0) < 0)
goto fail;
usb_close (devh);
return GRUB_USB_ERR_NONE;
fail:
usb_close (devh);
return GRUB_USB_ERR_STALL;
}
GRUB_MOD_INIT (libusb)
{
usb_init();
usb_find_busses();
usb_find_devices();
if (grub_libusb_devices ())
return;
grub_usb_controller_dev_register (&usb_controller);
return;
}
GRUB_MOD_FINI (libusb)
{
return;
}
-3
View File
@@ -750,10 +750,7 @@ grub_ohci_setup_transfer (grub_usb_controller_t dev,
{ {
cdata->td_head_virt = grub_ohci_alloc_td (o); cdata->td_head_virt = grub_ohci_alloc_td (o);
if (!cdata->td_head_virt) if (!cdata->td_head_virt)
{
grub_free (cdata);
return GRUB_USB_ERR_INTERNAL; /* We don't need de-allocate ED */ return GRUB_USB_ERR_INTERNAL; /* We don't need de-allocate ED */
}
/* We can set td_head only when ED is not active, i.e. /* We can set td_head only when ED is not active, i.e.
* when it is newly allocated. */ * when it is newly allocated. */
cdata->ed_virt->td_head cdata->ed_virt->td_head
+3 -1
View File
@@ -625,7 +625,9 @@ grub_uhci_check_transfer (grub_usb_controller_t dev,
return GRUB_USB_ERR_NONE; return GRUB_USB_ERR_NONE;
} }
if (errtd && !(errtd->ctrl_status & (1 << 23))) grub_dprintf ("uhci", "t status=0x%02x\n", errtd->ctrl_status);
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
@@ -311,8 +311,8 @@ grub_usb_bulk_finish_readwrite (grub_usb_transfer_t transfer)
transfer->size + 1); transfer->size + 1);
grub_free (transfer->transactions); grub_free (transfer->transactions);
grub_dma_free (transfer->data_chunk);
grub_free (transfer); grub_free (transfer);
grub_dma_free (transfer->data_chunk);
} }
static grub_usb_err_t static grub_usb_err_t
+17 -10
View File
@@ -61,6 +61,18 @@ static const struct grub_arg_option options[] = {
{0, 0, 0, 0, 0, 0} {0, 0, 0, 0, 0, 0}
}; };
/* Simple checksum by summing all bytes. Used by ACPI and SMBIOS. */
grub_uint8_t
grub_byte_checksum (void *base, grub_size_t size)
{
grub_uint8_t *ptr;
grub_uint8_t ret = 0;
for (ptr = (grub_uint8_t *) base; ptr < ((grub_uint8_t *) base) + size;
ptr++)
ret += *ptr;
return ret;
}
/* rev1 is 1 if ACPIv1 is to be generated, 0 otherwise. /* rev1 is 1 if ACPIv1 is to be generated, 0 otherwise.
rev2 contains the revision of ACPIv2+ to generate or 0 if none. */ rev2 contains the revision of ACPIv2+ to generate or 0 if none. */
static int rev1, rev2; static int rev1, rev2;
@@ -119,8 +131,6 @@ 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)
{ {
@@ -131,6 +141,7 @@ 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;
@@ -168,10 +179,8 @@ grub_acpi_create_ebda (void)
struct grub_acpi_rsdp_v20 *v2; struct grub_acpi_rsdp_v20 *v2;
ebda = (grub_uint8_t *) (grub_addr_t) ((*((grub_uint16_t *)0x40e)) << 4); ebda = (grub_uint8_t *) (grub_addr_t) ((*((grub_uint16_t *)0x40e)) << 4);
grub_dprintf ("acpi", "EBDA @%p\n", ebda);
if (ebda) if (ebda)
ebda_kb_len = *(grub_uint16_t *) ebda; ebda_kb_len = *(grub_uint16_t *) ebda;
grub_dprintf ("acpi", "EBDA length 0x%x\n", ebda_kb_len);
if (ebda_kb_len > 16) if (ebda_kb_len > 16)
ebda_kb_len = 0; ebda_kb_len = 0;
ctx.ebda_len = (ebda_kb_len + 1) << 10; ctx.ebda_len = (ebda_kb_len + 1) << 10;
@@ -218,7 +227,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 *) ALIGN_UP((grub_addr_t) target, 16); target = (grub_uint8_t *) ((((grub_addr_t) target - 1) | 0xf) + 1);
v2 = 0; v2 = 0;
break; break;
} }
@@ -237,7 +246,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 *) ALIGN_UP((grub_addr_t) target, 16); target = (grub_uint8_t *) ((((grub_addr_t) target - 1) | 0xf) + 1);
v1 = 0; v1 = 0;
break; break;
} }
@@ -256,7 +265,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 *) ALIGN_UP((grub_addr_t) target, 16); target = (grub_uint8_t *) ((((grub_addr_t) target - 1) | 0xf) + 1);
v2 = 0; v2 = 0;
break; break;
} }
@@ -273,7 +282,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 *) ALIGN_UP((grub_addr_t) target, 16); target = (grub_uint8_t *) ((((grub_addr_t) target - 1) | 0xf) + 1);
v1 = 0; v1 = 0;
break; break;
} }
@@ -485,8 +494,6 @@ grub_cmd_acpi (struct grub_extcmd_context *ctxt, int argc, char **args)
if (! rsdp) if (! rsdp)
rsdp = grub_machine_acpi_get_rsdpv1 (); rsdp = grub_machine_acpi_get_rsdpv1 ();
grub_dprintf ("acpi", "RSDP @%p\n", rsdp);
if (rsdp) if (rsdp)
{ {
grub_uint32_t *entry_ptr; grub_uint32_t *entry_ptr;
-3
View File
@@ -26,8 +26,6 @@
#define grub_dprintf(cond, args...) printf ( args ) #define grub_dprintf(cond, args...) printf ( args )
#define grub_printf printf #define grub_printf printf
#define grub_util_fopen fopen
#define grub_memcmp memcmp
typedef uint64_t grub_uint64_t; typedef uint64_t grub_uint64_t;
typedef uint32_t grub_uint32_t; typedef uint32_t grub_uint32_t;
typedef uint16_t grub_uint16_t; typedef uint16_t grub_uint16_t;
@@ -248,7 +246,6 @@ 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_CREATE_DWORD_FIELD:
case GRUB_ACPI_OPCODE_CREATE_WORD_FIELD: case GRUB_ACPI_OPCODE_CREATE_WORD_FIELD:
case GRUB_ACPI_OPCODE_CREATE_BYTE_FIELD: case GRUB_ACPI_OPCODE_CREATE_BYTE_FIELD:
{ {
-2
View File
@@ -23,8 +23,6 @@
#include <grub/i18n.h> #include <grub/i18n.h>
#include <grub/disk.h> #include <grub/disk.h>
GRUB_MOD_LICENSE ("GPLv3+");
static grub_err_t static grub_err_t
grub_rescue_cmd_info (struct grub_command *cmd __attribute__ ((unused)), grub_rescue_cmd_info (struct grub_command *cmd __attribute__ ((unused)),
int argc __attribute__ ((unused)), int argc __attribute__ ((unused)),
File renamed without changes.
+15 -30
View File
@@ -74,8 +74,7 @@ grub_cmd_lsefimmap (grub_command_t cmd __attribute__ ((unused)),
"ACPI-nvs", "ACPI-nvs",
"MMIO ", "MMIO ",
"IO-ports", "IO-ports",
"PAL-code", "PAL-code"
"persist ",
}; };
if (desc->type < ARRAY_SIZE (types_str)) if (desc->type < ARRAY_SIZE (types_str))
grub_printf ("%s ", types_str[desc->type]); grub_printf ("%s ", types_str[desc->type]);
@@ -88,29 +87,21 @@ grub_cmd_lsefimmap (grub_command_t cmd __attribute__ ((unused)),
desc->physical_start + (desc->num_pages << 12) - 1, desc->physical_start + (desc->num_pages << 12) - 1,
desc->num_pages); desc->num_pages);
size = desc->num_pages << 12; /* 4 KiB page size */ size = desc->num_pages;
/* size <<= (12 - 10);
* Since size is a multiple of 4 KiB, no need to handle units if (size < 1024)
* of just Bytes (which would use a mask of 0x3ff). grub_printf (" %4" PRIuGRUB_UINT64_T "KB", size);
*
* 14 characters would support the largest possible number of 4 KiB
* pages that are not a multiple of larger units (e.g., MiB):
* 17592186044415 (0xffffff_fffff000), but that uses a lot of
* whitespace for a rare case. 6 characters usually suffices;
* columns will be off if not, but this is preferable to rounding.
*/
if (size & 0xfffff)
grub_printf (" %6" PRIuGRUB_UINT64_T "KiB", size >> 10);
else if (size & 0x3fffffff)
grub_printf (" %6" PRIuGRUB_UINT64_T "MiB", size >> 20);
else if (size & 0xffffffffff)
grub_printf (" %6" PRIuGRUB_UINT64_T "GiB", size >> 30);
else if (size & 0x3ffffffffffff)
grub_printf (" %6" PRIuGRUB_UINT64_T "TiB", size >> 40);
else if (size & 0xfffffffffffffff)
grub_printf (" %6" PRIuGRUB_UINT64_T "PiB", size >> 50);
else else
grub_printf (" %6" PRIuGRUB_UINT64_T "EiB", size >> 60); {
size /= 1024;
if (size < 1024)
grub_printf (" %4" PRIuGRUB_UINT64_T "MB", size);
else
{
size /= 1024;
grub_printf (" %4" PRIuGRUB_UINT64_T "GB", size);
}
}
attr = desc->attribute; attr = desc->attribute;
if (attr & GRUB_EFI_MEMORY_RUNTIME) if (attr & GRUB_EFI_MEMORY_RUNTIME)
@@ -131,12 +122,6 @@ grub_cmd_lsefimmap (grub_command_t cmd __attribute__ ((unused)),
grub_printf (" RP"); grub_printf (" RP");
if (attr & GRUB_EFI_MEMORY_XP) if (attr & GRUB_EFI_MEMORY_XP)
grub_printf (" XP"); grub_printf (" XP");
if (attr & GRUB_EFI_MEMORY_NV)
grub_printf (" NV");
if (attr & GRUB_EFI_MEMORY_MORE_RELIABLE)
grub_printf (" MR");
if (attr & GRUB_EFI_MEMORY_RO)
grub_printf (" RO");
grub_printf ("\n"); grub_printf ("\n");
} }
+2 -12
View File
@@ -37,20 +37,10 @@ static const struct guid_mapping guid_mappings[] =
{ {
{ GRUB_EFI_ACPI_20_TABLE_GUID, "ACPI-2.0"}, { GRUB_EFI_ACPI_20_TABLE_GUID, "ACPI-2.0"},
{ GRUB_EFI_ACPI_TABLE_GUID, "ACPI-1.0"}, { GRUB_EFI_ACPI_TABLE_GUID, "ACPI-1.0"},
{ GRUB_EFI_CRC32_GUIDED_SECTION_EXTRACTION_GUID,
"CRC32 GUIDED SECTION EXTRACTION"},
{ GRUB_EFI_DEBUG_IMAGE_INFO_TABLE_GUID, "DEBUG IMAGE INFO"},
{ GRUB_EFI_DXE_SERVICES_TABLE_GUID, "DXE SERVICES"},
{ GRUB_EFI_HCDP_TABLE_GUID, "HCDP"},
{ GRUB_EFI_HOB_LIST_GUID, "HOB LIST"},
{ GRUB_EFI_LZMA_CUSTOM_DECOMPRESS_GUID, "LZMA CUSTOM DECOMPRESS"},
{ GRUB_EFI_MEMORY_TYPE_INFORMATION_GUID, "MEMORY TYPE INFO"},
{ GRUB_EFI_MPS_TABLE_GUID, "MPS"},
{ GRUB_EFI_SAL_TABLE_GUID, "SAL"}, { GRUB_EFI_SAL_TABLE_GUID, "SAL"},
{ GRUB_EFI_SMBIOS_TABLE_GUID, "SMBIOS"}, { GRUB_EFI_SMBIOS_TABLE_GUID, "SMBIOS"},
{ GRUB_EFI_SYSTEM_RESOURCE_TABLE_GUID, "SYSTEM RESOURCE TABLE"}, { GRUB_EFI_MPS_TABLE_GUID, "MPS"},
{ GRUB_EFI_TIANO_CUSTOM_DECOMPRESS_GUID, "TIANO CUSTOM DECOMPRESS"}, { GRUB_EFI_HCDP_TABLE_GUID, "HCDP"}
{ GRUB_EFI_TSC_FREQUENCY_GUID, "TSC FREQUENCY"},
}; };
static grub_err_t static grub_err_t
+4 -5
View File
@@ -476,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 += step) || (header = 0); header += step)
{ {
if (header[0] == magic if (header[0] == magic
&& !(grub_le_to_cpu32 (header[0]) && !(grub_le_to_cpu32 (header[0])
@@ -485,12 +485,11 @@ 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;
} }
+4 -7
View File
@@ -40,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)
goto fail; return 0;
if (grub_file_read (elf->file, s0, shsize) != (grub_ssize_t) shsize) if (grub_file_read (elf->file, s0, shsize) != (grub_ssize_t) shsize)
goto fail; return 0;
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;
@@ -54,21 +54,18 @@ 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)
goto fail; return grub_errno;
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)
goto fail; return grub_errno;
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;
} }
-2
View File
@@ -235,8 +235,6 @@ 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,7 +329,6 @@ 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");
} }
@@ -39,17 +39,9 @@ static const char *descs[] = {
[2] = "before RAM init", [2] = "before RAM init",
[3] = "after RAM init", [3] = "after RAM init",
[4] = "end of romstage", [4] = "end of romstage",
[5] = "start of verified boot",
[6] = "end of verified boot",
[8] = "start of RAM copy", [8] = "start of RAM copy",
[9] = "end of RAM copy", [9] = "end of RAM copy",
[10] = "start of ramstage", [10] = "start of ramstage",
[11] = "start of bootblock",
[12] = "end of bootblock",
[13] = "starting to load romstage",
[14] = "finished loading romstage",
[15] = "starting LZMA decompress (ignore for x86)",
[16] = "finished LZMA decompress (ignore for x86)",
[30] = "device enumerate", [30] = "device enumerate",
[40] = "device configure", [40] = "device configure",
[50] = "device enable", [50] = "device enable",
@@ -29,15 +29,14 @@ grub_machine_acpi_get_rsdpv1 (void)
grub_dprintf ("acpi", "Looking for RSDP. Scanning EBDA\n"); grub_dprintf ("acpi", "Looking for RSDP. Scanning EBDA\n");
ebda = (grub_uint8_t *) ((* ((grub_uint16_t *) 0x40e)) << 4); ebda = (grub_uint8_t *) ((* ((grub_uint16_t *) 0x40e)) << 4);
ebda_len = * (grub_uint16_t *) ebda; ebda_len = * (grub_uint16_t *) ebda;
if (! ebda_len) /* FIXME do we really need this check? */ if (! ebda_len)
goto scan_bios; return 0;
for (ptr = ebda; ptr < ebda + 0x400; ptr += 16) for (ptr = ebda; ptr < ebda + 0x400; ptr += 16)
if (grub_memcmp (ptr, GRUB_RSDP_SIGNATURE, GRUB_RSDP_SIGNATURE_SIZE) == 0 if (grub_memcmp (ptr, GRUB_RSDP_SIGNATURE, GRUB_RSDP_SIGNATURE_SIZE) == 0
&& grub_byte_checksum (ptr, sizeof (struct grub_acpi_rsdp_v10)) == 0 && grub_byte_checksum (ptr, sizeof (struct grub_acpi_rsdp_v10)) == 0
&& ((struct grub_acpi_rsdp_v10 *) ptr)->revision == 0) && ((struct grub_acpi_rsdp_v10 *) ptr)->revision == 0)
return (struct grub_acpi_rsdp_v10 *) ptr; return (struct grub_acpi_rsdp_v10 *) ptr;
scan_bios:
grub_dprintf ("acpi", "Looking for RSDP. Scanning BIOS\n"); grub_dprintf ("acpi", "Looking for RSDP. Scanning BIOS\n");
for (ptr = (grub_uint8_t *) 0xe0000; ptr < (grub_uint8_t *) 0x100000; for (ptr = (grub_uint8_t *) 0xe0000; ptr < (grub_uint8_t *) 0x100000;
ptr += 16) ptr += 16)
@@ -57,8 +56,8 @@ grub_machine_acpi_get_rsdpv2 (void)
grub_dprintf ("acpi", "Looking for RSDP. Scanning EBDA\n"); grub_dprintf ("acpi", "Looking for RSDP. Scanning EBDA\n");
ebda = (grub_uint8_t *) ((* ((grub_uint16_t *) 0x40e)) << 4); ebda = (grub_uint8_t *) ((* ((grub_uint16_t *) 0x40e)) << 4);
ebda_len = * (grub_uint16_t *) ebda; ebda_len = * (grub_uint16_t *) ebda;
if (! ebda_len) /* FIXME do we really need this check? */ if (! ebda_len)
goto scan_bios; return 0;
for (ptr = ebda; ptr < ebda + 0x400; ptr += 16) for (ptr = ebda; ptr < ebda + 0x400; ptr += 16)
if (grub_memcmp (ptr, GRUB_RSDP_SIGNATURE, GRUB_RSDP_SIGNATURE_SIZE) == 0 if (grub_memcmp (ptr, GRUB_RSDP_SIGNATURE, GRUB_RSDP_SIGNATURE_SIZE) == 0
&& grub_byte_checksum (ptr, sizeof (struct grub_acpi_rsdp_v10)) == 0 && grub_byte_checksum (ptr, sizeof (struct grub_acpi_rsdp_v10)) == 0
@@ -68,7 +67,6 @@ grub_machine_acpi_get_rsdpv2 (void)
== 0) == 0)
return (struct grub_acpi_rsdp_v20 *) ptr; return (struct grub_acpi_rsdp_v20 *) ptr;
scan_bios:
grub_dprintf ("acpi", "Looking for RSDP. Scanning BIOS\n"); grub_dprintf ("acpi", "Looking for RSDP. Scanning BIOS\n");
for (ptr = (grub_uint8_t *) 0xe0000; ptr < (grub_uint8_t *) 0x100000; for (ptr = (grub_uint8_t *) 0xe0000; ptr < (grub_uint8_t *) 0x100000;
ptr += 16) ptr += 16)
-11
View File
@@ -57,20 +57,14 @@ 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);
} }
@@ -83,7 +77,6 @@ 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;
} }
@@ -180,8 +173,6 @@ 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;
@@ -385,8 +376,6 @@ 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. */
-2
View File
@@ -37,8 +37,6 @@ static const char *names[] =
is required to save accross hibernations. */ is required to save accross hibernations. */
[GRUB_MEMORY_NVS] = N_("ACPI non-volatile storage RAM"), [GRUB_MEMORY_NVS] = N_("ACPI non-volatile storage RAM"),
[GRUB_MEMORY_BADRAM] = N_("faulty RAM (BadRAM)"), [GRUB_MEMORY_BADRAM] = N_("faulty RAM (BadRAM)"),
[GRUB_MEMORY_PERSISTENT] = N_("persistent RAM"),
[GRUB_MEMORY_PERSISTENT_LEGACY] = N_("persistent RAM (legacy)"),
[GRUB_MEMORY_COREBOOT_TABLES] = N_("RAM holding coreboot tables"), [GRUB_MEMORY_COREBOOT_TABLES] = N_("RAM holding coreboot tables"),
[GRUB_MEMORY_CODE] = N_("RAM holding firmware code") [GRUB_MEMORY_CODE] = N_("RAM holding firmware code")
}; };
+4 -3
View File
@@ -106,7 +106,7 @@ grub_mac_bless_inode (grub_device_t dev, grub_uint32_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
+ ((grub_uint64_t) extent_start) + extent_start
* (ablk_size >> GRUB_DISK_SECTOR_BITS)); * (ablk_size >> GRUB_DISK_SECTOR_BITS));
err = err =
@@ -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 = 0; grub_device_t dev;
grub_err_t err; grub_err_t err;
if (argc != 1) if (argc != 1)
@@ -197,12 +197,13 @@ grub_cmd_macbless (grub_command_t cmd, int argc, char **args)
else else
path = path + 1; path = path + 1;
if (!path || *path == 0 || !dev) if (!path || *path == 0 || !device_name)
{ {
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,7 +57,6 @@ 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;
} }
@@ -91,7 +90,6 @@ 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. */
+2 -13
View File
@@ -243,19 +243,11 @@ 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));
@@ -282,11 +274,8 @@ 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));
-3
View File
@@ -104,10 +104,7 @@ grub_cmd_password (grub_command_t cmd __attribute__ ((unused)),
pass->c = grub_strtoul (ptr, &ptr, 0); pass->c = grub_strtoul (ptr, &ptr, 0);
if (grub_errno) if (grub_errno)
{
grub_free (pass);
return grub_errno; return grub_errno;
}
if (*ptr != '.') if (*ptr != '.')
{ {
grub_free (pass); grub_free (pass);
+1 -1
View File
@@ -210,10 +210,10 @@ try (struct search_ctx *ctx)
/* Cache entry was outdated. Remove it. */ /* Cache entry was outdated. Remove it. */
if (!ctx->count) if (!ctx->count)
{ {
*prev = cache_ent->next;
grub_free (cache_ent->key); grub_free (cache_ent->key);
grub_free (cache_ent->value); grub_free (cache_ent->value);
grub_free (cache_ent); grub_free (cache_ent);
*prev = cache_ent->next;
} }
} }
+2 -7
View File
@@ -175,10 +175,7 @@ grub_cmd_search (grub_extcmd_context_t ctxt, int argc, char **args)
var = "root"; var = "root";
} }
else else
{ return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));
grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));
goto out;
}
if (state[SEARCH_LABEL].set) if (state[SEARCH_LABEL].set)
grub_search_label (id, var, state[SEARCH_NO_FLOPPY].set, grub_search_label (id, var, state[SEARCH_NO_FLOPPY].set,
@@ -190,10 +187,8 @@ grub_cmd_search (grub_extcmd_context_t ctxt, int argc, char **args)
grub_search_fs_file (id, var, state[SEARCH_NO_FLOPPY].set, grub_search_fs_file (id, var, state[SEARCH_NO_FLOPPY].set,
hints, nhints); hints, nhints);
else else
grub_error (GRUB_ERR_INVALID_COMMAND, "unspecified search type"); return grub_error (GRUB_ERR_INVALID_COMMAND, "unspecified search type");
out:
grub_free (hints);
return grub_errno; return grub_errno;
} }
-3
View File
@@ -119,10 +119,7 @@ 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);
} }
+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;
continue; return ctx.or || ctx.and;
} }
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;
continue; return ctx.or || ctx.and;
} }
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;
continue; return ctx.or || ctx.and;
} }
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;
continue; return ctx.or || ctx.and;
} }
/* 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 (!s1 || !s2 || !input) if (argc <= 0 && (!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))
+2 -2
View File
@@ -308,7 +308,7 @@ grub_load_public_key (grub_file_t f)
if (!sk) if (!sk)
goto fail; goto fail;
grub_memset (fingerprint_context, 0, GRUB_MD_SHA1->contextsize); grub_memset (fingerprint_context, 0, sizeof (fingerprint_context));
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);
@@ -454,7 +454,7 @@ grub_verify_signature_real (char *buf, grub_size_t size,
grub_err_t err; grub_err_t err;
grub_size_t i; grub_size_t i;
gcry_mpi_t mpis[10]; gcry_mpi_t mpis[10];
grub_uint8_t type = 0; grub_uint8_t type;
err = read_packet_header (sig, &type, &len); err = read_packet_header (sig, &type, &len);
if (err) if (err)
+1 -5
View File
@@ -245,10 +245,7 @@ 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;
@@ -293,8 +290,7 @@ struct match_files_ctx
/* Helper for match_files. */ /* Helper for match_files. */
static int static int
match_files_iter (const char *name, match_files_iter (const char *name, const struct grub_dirhook_info *info,
const struct grub_dirhook_info *info __attribute__((unused)),
void *data) void *data)
{ {
struct match_files_ctx *ctx = data; struct match_files_ctx *ctx = data;
+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 || hash->mdlen == 0)
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++)
{ {
+17 -19
View File
@@ -195,10 +195,10 @@ grub_ahci_pciinit (grub_pci_device_t dev,
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_MEM_ENABLED | GRUB_PCI_COMMAND_BUS_MASTER); | GRUB_PCI_COMMAND_MEM_ENABLED);
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",
@@ -355,7 +355,7 @@ grub_ahci_pciinit (grub_pci_device_t dev,
if (adevs[i]) if (adevs[i])
{ {
adevs[i]->hba->ports[adevs[i]->port].sata_error = adevs[i]->hba->ports[adevs[i]->port].sata_error; adevs[i]->hba->ports[adevs[i]->port].sata_error = adevs[i]->hba->ports[adevs[i]->port].sata_error;
grub_dprintf ("ahci", "port: %d, err: %x\n", adevs[i]->port, 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) * 32); adevs[i]->command_list_chunk = grub_memalign_dma32 (1024, sizeof (struct grub_ahci_cmd_head) * 32);
@@ -440,7 +440,7 @@ grub_ahci_pciinit (grub_pci_device_t dev,
adevs[i]->hba->ports[adevs[i]->port].intstatus = ~0; adevs[i]->hba->ports[adevs[i]->port].intstatus = ~0;
// adevs[i]->hba->ports[adevs[i]->port].fbs = 0; // adevs[i]->hba->ports[adevs[i]->port].fbs = 0;
grub_dprintf ("ahci", "port: %d, err: %x\n", adevs[i]->port, 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]->rfis = grub_memalign_dma32 (4096, adevs[i]->rfis = grub_memalign_dma32 (4096,
@@ -480,7 +480,7 @@ grub_ahci_pciinit (grub_pci_device_t dev,
for (i = 0; i < nports; i++) for (i = 0; i < nports; i++)
if (adevs[i]) if (adevs[i])
{ {
grub_dprintf ("ahci", "port: %d, err: %x\n", adevs[i]->port, grub_dprintf ("ahci", "err: %x\n",
adevs[i]->hba->ports[adevs[i]->port].sata_error); adevs[i]->hba->ports[adevs[i]->port].sata_error);
fr_running |= (1 << i); fr_running |= (1 << i);
@@ -488,7 +488,7 @@ grub_ahci_pciinit (grub_pci_device_t dev,
adevs[i]->hba->ports[adevs[i]->port].command |= GRUB_AHCI_HBA_PORT_CMD_POWER_ON; adevs[i]->hba->ports[adevs[i]->port].command |= GRUB_AHCI_HBA_PORT_CMD_POWER_ON;
adevs[i]->hba->ports[adevs[i]->port].command |= 1 << 28; adevs[i]->hba->ports[adevs[i]->port].command |= 1 << 28;
grub_dprintf ("ahci", "port: %d, err: %x\n", adevs[i]->port, grub_dprintf ("ahci", "err: %x\n",
adevs[i]->hba->ports[adevs[i]->port].sata_error); adevs[i]->hba->ports[adevs[i]->port].sata_error);
} }
@@ -515,26 +515,26 @@ grub_ahci_pciinit (grub_pci_device_t dev,
for (i = 0; i < nports; i++) for (i = 0; i < nports; i++)
if (adevs[i]) if (adevs[i])
{ {
grub_dprintf ("ahci", "port %d, err: %x\n", adevs[i]->port, 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]->hba->ports[adevs[i]->port].command |= GRUB_AHCI_HBA_PORT_CMD_POWER_ON; adevs[i]->hba->ports[adevs[i]->port].command |= GRUB_AHCI_HBA_PORT_CMD_POWER_ON;
adevs[i]->hba->ports[adevs[i]->port].command |= GRUB_AHCI_HBA_PORT_CMD_SPIN_UP; adevs[i]->hba->ports[adevs[i]->port].command |= GRUB_AHCI_HBA_PORT_CMD_SPIN_UP;
grub_dprintf ("ahci", "port %d, err: %x\n", adevs[i]->port, 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]->hba->ports[adevs[i]->port].sata_error = ~0; adevs[i]->hba->ports[adevs[i]->port].sata_error = ~0;
grub_dprintf ("ahci", "port %d, err: %x\n", adevs[i]->port, grub_dprintf ("ahci", "err: %x\n",
adevs[i]->hba->ports[adevs[i]->port].sata_error); adevs[i]->hba->ports[adevs[i]->port].sata_error);
grub_dprintf ("ahci", "port %d, offset: %x, tfd:%x, CMD: %x\n", adevs[i]->port, grub_dprintf ("ahci", "offset: %x, tfd:%x, CMD: %x\n",
(int) ((char *) &adevs[i]->hba->ports[adevs[i]->port].task_file_data - (int) ((char *) &adevs[i]->hba->ports[adevs[i]->port].task_file_data -
(char *) adevs[i]->hba), (char *) adevs[i]->hba),
adevs[i]->hba->ports[adevs[i]->port].task_file_data, adevs[i]->hba->ports[adevs[i]->port].task_file_data,
adevs[i]->hba->ports[adevs[i]->port].command); adevs[i]->hba->ports[adevs[i]->port].command);
grub_dprintf ("ahci", "port %d, err: %x\n", adevs[i]->port, grub_dprintf ("ahci", "err: %x\n",
adevs[i]->hba->ports[adevs[i]->port].sata_error); adevs[i]->hba->ports[adevs[i]->port].sata_error);
} }
@@ -542,19 +542,17 @@ grub_ahci_pciinit (grub_pci_device_t dev,
for (i = 0; i < nports; i++) for (i = 0; i < nports; i++)
if (adevs[i]) if (adevs[i])
{ {
grub_dprintf ("ahci", "port %d, offset: %x, tfd:%x, CMD: %x\n", adevs[i]->port, grub_dprintf ("ahci", "offset: %x, tfd:%x, CMD: %x\n",
(int) ((char *) &adevs[i]->hba->ports[adevs[i]->port].task_file_data - (int) ((char *) &adevs[i]->hba->ports[adevs[i]->port].task_file_data -
(char *) adevs[i]->hba), (char *) adevs[i]->hba),
adevs[i]->hba->ports[adevs[i]->port].task_file_data, adevs[i]->hba->ports[adevs[i]->port].task_file_data,
adevs[i]->hba->ports[adevs[i]->port].command); adevs[i]->hba->ports[adevs[i]->port].command);
grub_dprintf ("ahci", "port: %d, err: %x\n", adevs[i]->port, 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]->hba->ports[adevs[i]->port].command adevs[i]->hba->ports[adevs[i]->port].command
= (adevs[i]->hba->ports[adevs[i]->port].command & 0x0fffffff) | (1 << 28) = (adevs[i]->hba->ports[adevs[i]->port].command & 0x0fffffff) | (1 << 28) | 2 | 4;
| GRUB_AHCI_HBA_PORT_CMD_SPIN_UP
| GRUB_AHCI_HBA_PORT_CMD_POWER_ON;
/* struct grub_disk_ata_pass_through_parms parms2; /* struct grub_disk_ata_pass_through_parms parms2;
grub_memset (&parms2, 0, sizeof (parms2)); grub_memset (&parms2, 0, sizeof (parms2));
@@ -567,14 +565,14 @@ grub_ahci_pciinit (grub_pci_device_t dev,
while (grub_get_time_ms () < endtime) while (grub_get_time_ms () < endtime)
{ {
for (i = 0; i < nports; i++) for (i = 0; i < nports; i++)
if (adevs[i] && (adevs[i]->hba->ports[adevs[i]->port].task_file_data & (GRUB_ATA_STATUS_BUSY | GRUB_ATA_STATUS_DRQ))) if (adevs[i] && (adevs[i]->hba->ports[adevs[i]->port].task_file_data & 0x88))
break; break;
if (i == nports) if (i == nports)
break; break;
} }
for (i = 0; i < nports; i++) for (i = 0; i < nports; i++)
if (adevs[i] && (adevs[i]->hba->ports[adevs[i]->port].task_file_data & (GRUB_ATA_STATUS_BUSY | GRUB_ATA_STATUS_DRQ))) if (adevs[i] && (adevs[i]->hba->ports[adevs[i]->port].task_file_data & 0x88))
{ {
grub_dprintf ("ahci", "port %d is busy\n", i); grub_dprintf ("ahci", "port %d is busy\n", i);
failed_adevs[i] = adevs[i]; failed_adevs[i] = adevs[i];
@@ -1004,7 +1002,7 @@ grub_ahci_readwrite_real (struct grub_ahci_device *dev,
if (parms->write) if (parms->write)
grub_memcpy ((char *) grub_dma_get_virt (bufc), parms->buffer, parms->size); grub_memcpy ((char *) grub_dma_get_virt (bufc), parms->buffer, parms->size);
grub_dprintf ("ahci", "AHCI command scheduled\n"); grub_dprintf ("ahci", "AHCI command schedulded\n");
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);
grub_dprintf ("ahci", "AHCI inten = %x\n", grub_dprintf ("ahci", "AHCI inten = %x\n",
+23 -46
View File
@@ -25,7 +25,6 @@
#include <grub/fs.h> #include <grub/fs.h>
#include <grub/file.h> #include <grub/file.h>
#include <grub/procfs.h> #include <grub/procfs.h>
#include <grub/partition.h>
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
#include <grub/emu/hostdisk.h> #include <grub/emu/hostdisk.h>
@@ -111,23 +110,20 @@ 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];
grub_size_t blocksize; if (cipher->cipher->blocksize > GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE)
return GPG_ERR_INV_ARG;
if (!cipher->cipher->decrypt) if (!cipher->cipher->decrypt)
return GPG_ERR_NOT_SUPPORTED; return GPG_ERR_NOT_SUPPORTED;
blocksize = cipher->cipher->blocksize; if (size % cipher->cipher->blocksize != 0)
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 += blocksize, outptr += blocksize) inptr += cipher->cipher->blocksize, outptr += cipher->cipher->blocksize)
{ {
grub_memcpy (ivt, inptr, blocksize); grub_memcpy (ivt, inptr, cipher->cipher->blocksize);
cipher->cipher->decrypt (cipher->ctx, outptr, inptr); cipher->cipher->decrypt (cipher->ctx, outptr, inptr);
grub_crypto_xor (outptr, outptr, iv, blocksize); grub_crypto_xor (outptr, outptr, iv, cipher->cipher->blocksize);
grub_crypto_xor (iv, ivt, outptr, blocksize); grub_crypto_xor (iv, ivt, outptr, cipher->cipher->blocksize);
} }
return GPG_ERR_NO_ERROR; return GPG_ERR_NO_ERROR;
} }
@@ -139,23 +135,20 @@ 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];
grub_size_t blocksize; if (cipher->cipher->blocksize > GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE)
if (!cipher->cipher->encrypt)
return GPG_ERR_NOT_SUPPORTED;
blocksize = cipher->cipher->blocksize;
if (blocksize > GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE)
return GPG_ERR_INV_ARG; return GPG_ERR_INV_ARG;
if (blocksize == 0 || (((blocksize - 1) & blocksize) != 0) if (!cipher->cipher->decrypt)
|| ((size & (blocksize - 1)) != 0)) return GPG_ERR_NOT_SUPPORTED;
if (size % cipher->cipher->blocksize != 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 += blocksize, outptr += blocksize) inptr += cipher->cipher->blocksize, outptr += cipher->cipher->blocksize)
{ {
grub_memcpy (ivt, inptr, blocksize); grub_memcpy (ivt, inptr, cipher->cipher->blocksize);
grub_crypto_xor (outptr, outptr, iv, blocksize); grub_crypto_xor (outptr, outptr, iv, cipher->cipher->blocksize);
cipher->cipher->encrypt (cipher->ctx, outptr, inptr); cipher->cipher->encrypt (cipher->ctx, outptr, inptr);
grub_crypto_xor (iv, ivt, outptr, blocksize); grub_crypto_xor (iv, ivt, outptr, cipher->cipher->blocksize);
} }
return GPG_ERR_NO_ERROR; return GPG_ERR_NO_ERROR;
} }
@@ -379,13 +372,11 @@ 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)
err = grub_crypto_ecb_encrypt (dev->cipher, data + i, data + i, grub_crypto_ecb_encrypt (dev->cipher, data + i, data + i,
(1U << dev->log_sector_size)); (1U << dev->log_sector_size));
else else
err = grub_crypto_ecb_decrypt (dev->cipher, data + i, data + i, 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;
@@ -719,7 +710,6 @@ grub_cryptodisk_insert (grub_cryptodisk_t newdev, const char *name,
newdev->id = last_cryptodisk_id++; newdev->id = last_cryptodisk_id++;
newdev->source_id = source->id; newdev->source_id = source->id;
newdev->source_dev_id = source->dev->id; newdev->source_dev_id = source->dev->id;
newdev->partition_start = grub_partition_get_start (source->partition);
newdev->next = cryptodisk_list; newdev->next = cryptodisk_list;
cryptodisk_list = newdev; cryptodisk_list = newdev;
@@ -742,8 +732,6 @@ grub_cryptodisk_get_by_source_disk (grub_disk_t disk)
grub_cryptodisk_t dev; grub_cryptodisk_t dev;
for (dev = cryptodisk_list; dev != NULL; dev = dev->next) for (dev = cryptodisk_list; dev != NULL; dev = dev->next)
if (dev->source_id == disk->id && dev->source_dev_id == disk->dev->id) if (dev->source_id == disk->id && dev->source_dev_id == disk->dev->id)
if ((disk->partition && grub_partition_get_start (disk->partition) == dev->partition_start) ||
(!disk->partition && dev->partition_start == 0))
return dev; return dev;
return NULL; return NULL;
} }
@@ -765,7 +753,6 @@ grub_cryptodisk_cheat_insert (grub_cryptodisk_t newdev, const char *name,
newdev->cheat_fd = GRUB_UTIL_FD_INVALID; newdev->cheat_fd = GRUB_UTIL_FD_INVALID;
newdev->source_id = source->id; newdev->source_id = source->id;
newdev->source_dev_id = source->dev->id; newdev->source_dev_id = source->dev->id;
newdev->partition_start = grub_partition_get_start (source->partition);
newdev->id = last_cryptodisk_id++; newdev->id = last_cryptodisk_id++;
newdev->next = cryptodisk_list; newdev->next = cryptodisk_list;
cryptodisk_list = newdev; cryptodisk_list = newdev;
@@ -969,43 +956,33 @@ grub_cmd_cryptomount (grub_extcmd_context_t ctxt, int argc, char **args)
grub_disk_t disk; grub_disk_t disk;
grub_cryptodisk_t dev; grub_cryptodisk_t dev;
char *diskname; char *diskname;
char *disklast = NULL; char *disklast;
grub_size_t len;
search_uuid = NULL; search_uuid = NULL;
check_boot = state[2].set; check_boot = state[2].set;
diskname = args[0]; diskname = args[0];
len = grub_strlen (diskname); if (diskname[0] == '(' && *(disklast = &diskname[grub_strlen (diskname) - 1]) == ')')
if (len && diskname[0] == '(' && diskname[len - 1] == ')')
{ {
disklast = &diskname[len - 1];
*disklast = '\0'; *disklast = '\0';
diskname++; disk = grub_disk_open (diskname + 1);
*disklast = ')';
} }
else
disk = grub_disk_open (diskname); disk = grub_disk_open (diskname);
if (!disk) if (!disk)
{
if (disklast)
*disklast = ')';
return grub_errno; return grub_errno;
}
dev = grub_cryptodisk_get_by_source_disk (disk); dev = grub_cryptodisk_get_by_source_disk (disk);
if (dev) if (dev)
{ {
grub_dprintf ("cryptodisk", "already mounted as crypto%lu\n", dev->id); grub_dprintf ("cryptodisk", "already mounted as crypto%lu\n", dev->id);
grub_disk_close (disk); grub_disk_close (disk);
if (disklast)
*disklast = ')';
return GRUB_ERR_NONE; return GRUB_ERR_NONE;
} }
err = grub_cryptodisk_scan_device_real (diskname, disk); err = grub_cryptodisk_scan_device_real (args[0], disk);
grub_disk_close (disk); grub_disk_close (disk);
if (disklast)
*disklast = ')';
return err; return err;
} }
+22 -42
View File
@@ -71,12 +71,10 @@ 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;
@@ -496,13 +494,13 @@ validate_lv (struct grub_diskfilter_lv *lv)
if (!lv) if (!lv)
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "unknown volume"); return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "unknown volume");
if (!lv->vg || lv->vg->extent_size == 0) if (lv->vg->extent_size == 0)
return grub_error (GRUB_ERR_READ_ERROR, "invalid volume"); return grub_error (GRUB_ERR_READ_ERROR, "invalid volume");
for (i = 0; i < lv->segment_count; i++) for (i = 0; i < lv->segment_count; i++)
{ {
grub_err_t err; grub_err_t err;
err = validate_segment (&lv->segments[i]); err = validate_segment (&lv->segments[1]);
if (err) if (err)
return err; return err;
} }
@@ -586,7 +584,6 @@ 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:
{ {
@@ -941,10 +938,8 @@ 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. */
/* 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++) for (i = 0; i < lv->segment_count; i++)
{ {
if (lv->segments[i].type == 1) if (lv->segments[i].type == 1)
@@ -954,6 +949,17 @@ grub_diskfilter_vg_register (struct grub_diskfilter_vg *vg)
&& lv->segments[i].stripe_size == 0) && lv->segments[i].stripe_size == 0)
lv->segments[i].stripe_size = 64; lv->segments[i].stripe_size = 64;
} }
}
for (lv = vg->lvs; lv; lv = lv->next)
{
grub_err_t err;
/* 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;
err = validate_lv(lv); err = validate_lv(lv);
if (err) if (err)
@@ -998,6 +1004,7 @@ grub_diskfilter_vg_register (struct grub_diskfilter_vg *vg)
lv->fullname = tmp; lv->fullname = tmp;
} }
} }
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;
@@ -1007,7 +1014,7 @@ grub_diskfilter_vg_register (struct grub_diskfilter_vg *vg)
struct grub_diskfilter_vg * struct grub_diskfilter_vg *
grub_diskfilter_make_raid (grub_size_t uuidlen, char *uuid, int nmemb, grub_diskfilter_make_raid (grub_size_t uuidlen, char *uuid, int nmemb,
const char *name, grub_uint64_t disk_size, char *name, grub_uint64_t disk_size,
grub_uint64_t stripe_size, grub_uint64_t stripe_size,
int layout, int level) int layout, int level)
{ {
@@ -1031,10 +1038,7 @@ grub_diskfilter_make_raid (grub_size_t uuidlen, char *uuid, int nmemb,
if (n == 1) if (n == 1)
n = (layout >> 8) & 0xFF; n = (layout >> 8) & 0xFF;
if (n == 0) if (n == 0)
{
grub_free (uuid);
return NULL; return NULL;
}
totsize = grub_divmod64 (nmemb * disk_size, n, 0); totsize = grub_divmod64 (nmemb * disk_size, n, 0);
} }
@@ -1048,7 +1052,6 @@ grub_diskfilter_make_raid (grub_size_t uuidlen, char *uuid, int nmemb,
break; break;
default: default:
grub_free (uuid);
return NULL; return NULL;
} }
@@ -1062,7 +1065,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 && array->lvs->segments if (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;
@@ -1071,10 +1074,7 @@ 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)
@@ -1096,16 +1096,8 @@ 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;
if (array->name) array->lvs->name = 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)
@@ -1155,26 +1147,13 @@ 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;
} }
@@ -1277,9 +1256,10 @@ 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);
+5 -10
View File
@@ -99,8 +99,6 @@ 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)
@@ -126,17 +124,14 @@ 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;
if (total_volumes == 0) disk_size = sb.capacity / sb.array.total_volumes;
if (sb.array.total_volumes == 0)
/* Not RAID. */ /* Not RAID. */
return NULL; return NULL;
disk_size = capacity / total_volumes;
break; break;
case NV_LEVEL_1: case NV_LEVEL_1:
@@ -146,10 +141,10 @@ grub_dmraid_nv_detect (grub_disk_t disk,
case NV_LEVEL_5: case NV_LEVEL_5:
level = 5; level = 5;
if (total_volumes == 0 || total_volumes == 1) disk_size = sb.capacity / (sb.array.total_volumes - 1);
if (sb.array.total_volumes == 0 || sb.array.total_volumes == 1)
/* Not RAID. */ /* Not RAID. */
return NULL; return NULL;
disk_size = capacity / (total_volumes - 1);
break; break;
default: default:
@@ -172,7 +167,7 @@ grub_dmraid_nv_detect (grub_disk_t disk,
return grub_diskfilter_make_raid (sizeof (sb.array.signature), return grub_diskfilter_make_raid (sizeof (sb.array.signature),
uuid, sb.array.total_volumes, uuid, sb.array.total_volumes,
"nv", disk_size, NULL, disk_size,
sb.array.stripe_block_size, sb.array.stripe_block_size,
GRUB_RAID_LAYOUT_LEFT_ASYMMETRIC, GRUB_RAID_LAYOUT_LEFT_ASYMMETRIC,
level); level);
+57 -15
View File
@@ -43,6 +43,47 @@ static struct grub_efidisk_data *fd_devices;
static struct grub_efidisk_data *hd_devices; static struct grub_efidisk_data *hd_devices;
static struct grub_efidisk_data *cd_devices; static struct grub_efidisk_data *cd_devices;
/* Duplicate a device path. */
static grub_efi_device_path_t *
duplicate_device_path (const grub_efi_device_path_t *dp)
{
grub_efi_device_path_t *p;
grub_size_t total_size = 0;
for (p = (grub_efi_device_path_t *) dp;
;
p = GRUB_EFI_NEXT_DEVICE_PATH (p))
{
total_size += GRUB_EFI_DEVICE_PATH_LENGTH (p);
if (GRUB_EFI_END_ENTIRE_DEVICE_PATH (p))
break;
}
p = grub_malloc (total_size);
if (! p)
return 0;
grub_memcpy (p, dp, total_size);
return p;
}
/* Return the device path node right before the end node. */
static grub_efi_device_path_t *
find_last_device_path (const grub_efi_device_path_t *dp)
{
grub_efi_device_path_t *next, *p;
if (GRUB_EFI_END_ENTIRE_DEVICE_PATH (dp))
return 0;
for (p = (grub_efi_device_path_t *) dp, next = GRUB_EFI_NEXT_DEVICE_PATH (p);
! GRUB_EFI_END_ENTIRE_DEVICE_PATH (next);
p = next, next = GRUB_EFI_NEXT_DEVICE_PATH (next))
;
return p;
}
static struct grub_efidisk_data * static struct grub_efidisk_data *
make_devices (void) make_devices (void)
{ {
@@ -69,7 +110,7 @@ make_devices (void)
if (! dp) if (! dp)
continue; continue;
ldp = grub_efi_find_last_device_path (dp); ldp = find_last_device_path (dp);
if (! ldp) if (! ldp)
/* This is empty. Why? */ /* This is empty. Why? */
continue; continue;
@@ -109,11 +150,11 @@ find_parent_device (struct grub_efidisk_data *devices,
grub_efi_device_path_t *dp, *ldp; grub_efi_device_path_t *dp, *ldp;
struct grub_efidisk_data *parent; struct grub_efidisk_data *parent;
dp = grub_efi_duplicate_device_path (d->device_path); dp = duplicate_device_path (d->device_path);
if (! dp) if (! dp)
return 0; return 0;
ldp = grub_efi_find_last_device_path (dp); ldp = find_last_device_path (dp);
ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE; ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE;
ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE; ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE;
ldp->length = sizeof (*ldp); ldp->length = sizeof (*ldp);
@@ -139,11 +180,11 @@ is_child (struct grub_efidisk_data *child,
grub_efi_device_path_t *dp, *ldp; grub_efi_device_path_t *dp, *ldp;
int ret; int ret;
dp = grub_efi_duplicate_device_path (child->device_path); dp = duplicate_device_path (child->device_path);
if (! dp) if (! dp)
return 0; return 0;
ldp = grub_efi_find_last_device_path (dp); ldp = find_last_device_path (dp);
ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE; ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE;
ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE; ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE;
ldp->length = sizeof (*ldp); ldp->length = sizeof (*ldp);
@@ -166,8 +207,8 @@ add_device (struct grub_efidisk_data **devices, struct grub_efidisk_data *d)
{ {
int ret; int ret;
ret = grub_efi_compare_device_paths (grub_efi_find_last_device_path ((*p)->device_path), ret = grub_efi_compare_device_paths (find_last_device_path ((*p)->device_path),
grub_efi_find_last_device_path (d->device_path)); find_last_device_path (d->device_path));
if (ret == 0) if (ret == 0)
ret = grub_efi_compare_device_paths ((*p)->device_path, ret = grub_efi_compare_device_paths ((*p)->device_path,
d->device_path); d->device_path);
@@ -754,7 +795,7 @@ grub_efidisk_get_device_name (grub_efi_handle_t *handle)
if (! dp) if (! dp)
return 0; return 0;
ldp = grub_efi_find_last_device_path (dp); ldp = find_last_device_path (dp);
if (! ldp) if (! ldp)
return 0; return 0;
@@ -762,6 +803,7 @@ 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;
@@ -769,19 +811,22 @@ grub_efidisk_get_device_name (grub_efi_handle_t *handle)
/* It is necessary to duplicate the device path so that GRUB /* It is necessary to duplicate the device path so that GRUB
can overwrite it. */ can overwrite it. */
dup_dp = grub_efi_duplicate_device_path (dp); dup_dp = duplicate_device_path (dp);
if (! dup_dp) if (! dup_dp)
return 0; return 0;
while (1) while (1)
{ {
grub_efi_device_path_t *dup_ldp; grub_efi_device_path_t *dup_ldp;
dup_ldp = grub_efi_find_last_device_path (dup_dp); dup_ldp = find_last_device_path (dup_dp);
if (!(GRUB_EFI_DEVICE_PATH_TYPE (dup_ldp) == GRUB_EFI_MEDIA_DEVICE_PATH_TYPE if (!(GRUB_EFI_DEVICE_PATH_TYPE (dup_ldp) == GRUB_EFI_MEDIA_DEVICE_PATH_TYPE
&& (GRUB_EFI_DEVICE_PATH_SUBTYPE (dup_ldp) == GRUB_EFI_CDROM_DEVICE_PATH_SUBTYPE && (GRUB_EFI_DEVICE_PATH_SUBTYPE (dup_ldp) == GRUB_EFI_CDROM_DEVICE_PATH_SUBTYPE
|| GRUB_EFI_DEVICE_PATH_SUBTYPE (dup_ldp) == GRUB_EFI_HARD_DRIVE_DEVICE_PATH_SUBTYPE))) || GRUB_EFI_DEVICE_PATH_SUBTYPE (dup_ldp) == GRUB_EFI_HARD_DRIVE_DEVICE_PATH_SUBTYPE)))
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);
@@ -816,13 +861,10 @@ 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,
+1 -5
View File
@@ -212,8 +212,7 @@ 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;
if (grub_util_fd_seek (fd, (s << log_secsize) - 512) < 0) grub_util_fd_seek (fd, (s << log_secsize) - 512);
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)
@@ -232,10 +231,7 @@ grub_util_get_geli_uuid (const char *dev)
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;
} }
+2 -4
View File
@@ -382,8 +382,7 @@ 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 = ((grub_uint64_t) drp->cylinders) total_sectors = drp->cylinders * drp->heads * drp->sectors;
* 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
@@ -426,8 +425,7 @@ grub_biosdisk_open (const char *name, grub_disk_t disk)
data->heads = 255; data->heads = 255;
if (! total_sectors) if (! total_sectors)
total_sectors = ((grub_uint64_t) data->cylinders) total_sectors = data->cylinders * data->heads * data->sectors;
* data->heads * data->sectors;
} }
disk->total_sectors = total_sectors; disk->total_sectors = total_sectors;
+26 -136
View File
@@ -34,8 +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_removable; int is_cdrom;
int block_size_fails;
/* 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;
@@ -43,10 +42,6 @@ struct ofdisk_hash_ent
struct ofdisk_hash_ent *next; struct ofdisk_hash_ent *next;
}; };
static grub_err_t
grub_ofdisk_get_block_size (const char *device, grub_uint32_t *block_size,
struct ofdisk_hash_ent *op);
#define OFDISK_HASH_SZ 8 #define OFDISK_HASH_SZ 8
static struct ofdisk_hash_ent *ofdisk_hash[OFDISK_HASH_SZ]; static struct ofdisk_hash_ent *ofdisk_hash[OFDISK_HASH_SZ];
@@ -128,7 +123,7 @@ ofdisk_hash_add_real (char *devpath)
} }
static int static int
check_string_removable (const char *str) check_string_cdrom (const char *str)
{ {
const char *ptr = grub_strrchr (str, '/'); const char *ptr = grub_strrchr (str, '/');
@@ -136,7 +131,7 @@ check_string_removable (const char *str)
ptr++; ptr++;
else else
ptr = str; ptr = str;
return (grub_strncmp (ptr, "cdrom", 5) == 0 || grub_strncmp (ptr, "fd", 2) == 0); return (grub_strncmp (ptr, "cdrom", 5) == 0);
} }
static struct ofdisk_hash_ent * static struct ofdisk_hash_ent *
@@ -152,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_removable (devpath)) if (check_string_cdrom (devpath))
p->is_removable = 1; p->is_cdrom = 1;
return p; return p;
} }
@@ -163,8 +158,8 @@ ofdisk_hash_add (char *devpath, char *curcan)
else else
grub_free (curcan); grub_free (curcan);
if (check_string_removable (devpath) || check_string_removable (curcan)) if (check_string_cdrom (devpath) || check_string_cdrom (curcan))
pcan->is_removable = 1; pcan->is_cdrom = 1;
if (!pcan) if (!pcan)
grub_errno = GRUB_ERR_NONE; grub_errno = GRUB_ERR_NONE;
@@ -228,9 +223,6 @@ dev_iterate (const struct grub_ieee1275_devalias *alias)
if (grub_ieee1275_open (alias->path, &ihandle)) if (grub_ieee1275_open (alias->path, &ihandle))
return; return;
/* This method doesn't need memory allocation for the table. Open
firmware takes care of all memory management and the result table
stays in memory and is never freed. */
INIT_IEEE1275_COMMON (&args.common, "call-method", 2, 3); INIT_IEEE1275_COMMON (&args.common, "call-method", 2, 3);
args.method = (grub_ieee1275_cell_t) "vscsi-report-luns"; args.method = (grub_ieee1275_cell_t) "vscsi-report-luns";
args.ihandle = ihandle; args.ihandle = ihandle;
@@ -263,82 +255,6 @@ dev_iterate (const struct grub_ieee1275_devalias *alias)
grub_free (buf); grub_free (buf);
return; return;
} }
else if (grub_strcmp (alias->type, "sas_ioa") == 0)
{
/* The method returns the number of disks and a table where
* each ID is 64-bit long. Example of sas paths:
* /pci@80000002000001f/pci1014,034A@0/sas/disk@c05db70800
* /pci@80000002000001f/pci1014,034A@0/sas/disk@a05db70800
* /pci@80000002000001f/pci1014,034A@0/sas/disk@805db70800 */
struct sas_children
{
struct grub_ieee1275_common_hdr common;
grub_ieee1275_cell_t method;
grub_ieee1275_cell_t ihandle;
grub_ieee1275_cell_t max;
grub_ieee1275_cell_t table;
grub_ieee1275_cell_t catch_result;
grub_ieee1275_cell_t nentries;
}
args;
char *buf, *bufptr;
unsigned i;
grub_uint64_t *table;
grub_uint16_t table_size;
grub_ieee1275_ihandle_t ihandle;
buf = grub_malloc (grub_strlen (alias->path) +
sizeof ("/disk@7766554433221100"));
if (!buf)
return;
bufptr = grub_stpcpy (buf, alias->path);
/* Power machines documentation specify 672 as maximum SAS disks in
one system. Using a slightly larger value to be safe. */
table_size = 768;
table = grub_malloc (table_size * sizeof (grub_uint64_t));
if (!table)
{
grub_free (buf);
return;
}
if (grub_ieee1275_open (alias->path, &ihandle))
{
grub_free (buf);
grub_free (table);
return;
}
INIT_IEEE1275_COMMON (&args.common, "call-method", 4, 2);
args.method = (grub_ieee1275_cell_t) "get-sas-children";
args.ihandle = ihandle;
args.max = table_size;
args.table = (grub_ieee1275_cell_t) table;
args.catch_result = 0;
args.nentries = 0;
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
{
grub_ieee1275_close (ihandle);
grub_free (table);
grub_free (buf);
return;
}
for (i = 0; i < args.nentries; i++)
{
grub_snprintf (bufptr, sizeof ("/disk@7766554433221100"),
"/disk@%" PRIxGRUB_UINT64_T, table[i]);
dev_iterate_real (buf, buf);
}
grub_ieee1275_close (ihandle);
grub_free (table);
grub_free (buf);
}
if (!grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_NO_TREE_SCANNING_FOR_DISKS) if (!grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_NO_TREE_SCANNING_FOR_DISKS)
&& grub_strcmp (alias->type, "block") == 0) && grub_strcmp (alias->type, "block") == 0)
@@ -414,7 +330,7 @@ grub_ofdisk_iterate (grub_disk_dev_iterate_hook_t hook, void *hook_data,
} }
} }
if (!ent->is_boot && ent->is_removable) if (!ent->is_boot && ent->is_cdrom)
continue; continue;
if (hook (ent->grub_shortest, hook_data)) if (hook (ent->grub_shortest, hook_data))
@@ -459,8 +375,6 @@ grub_ofdisk_open (const char *name, grub_disk_t disk)
/* XXX: This should be large enough for any possible case. */ /* XXX: This should be large enough for any possible case. */
char prop[64]; char prop[64];
grub_ssize_t actual; grub_ssize_t actual;
grub_uint32_t block_size = 0;
grub_err_t err;
if (grub_strncmp (name, "ieee1275/", sizeof ("ieee1275/") - 1) != 0) if (grub_strncmp (name, "ieee1275/", sizeof ("ieee1275/") - 1) != 0)
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, return grub_error (GRUB_ERR_UNKNOWN_DEVICE,
@@ -491,6 +405,14 @@ grub_ofdisk_open (const char *name, grub_disk_t disk)
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "not a block device"); return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "not a block device");
} }
grub_uint32_t block_size = 0;
if (grub_ofdisk_get_block_size (devpath, &block_size) == 0)
{
for (disk->log_sector_size = 0;
(1U << disk->log_sector_size) < block_size;
disk->log_sector_size++);
}
/* XXX: There is no property to read the number of blocks. There /* XXX: There is no property to read the number of blocks. There
should be a property `#blocks', but it is not there. Perhaps it should be a property `#blocks', but it is not there. Perhaps it
is possible to use seek for this. */ is possible to use seek for this. */
@@ -501,31 +423,14 @@ grub_ofdisk_open (const char *name, grub_disk_t disk)
op = ofdisk_hash_find (devpath); op = ofdisk_hash_find (devpath);
if (!op) if (!op)
op = ofdisk_hash_add (devpath, NULL); op = ofdisk_hash_add (devpath, NULL);
if (!op) else
{
grub_free (devpath); grub_free (devpath);
if (!op)
return grub_errno; return grub_errno;
}
disk->id = (unsigned long) op; disk->id = (unsigned long) op;
disk->data = op->open_path; disk->data = op->open_path;
err = grub_ofdisk_get_block_size (devpath, &block_size, op);
if (err)
{
grub_free (devpath);
return err;
}
if (block_size != 0)
{
for (disk->log_sector_size = 0;
(1U << disk->log_sector_size) < block_size;
disk->log_sector_size++);
}
else
disk->log_sector_size = 9;
} }
grub_free (devpath);
return 0; return 0;
} }
@@ -684,9 +589,8 @@ grub_ofdisk_init (void)
grub_disk_dev_register (&grub_ofdisk_dev); grub_disk_dev_register (&grub_ofdisk_dev);
} }
static grub_err_t grub_err_t
grub_ofdisk_get_block_size (const char *device, grub_uint32_t *block_size, grub_ofdisk_get_block_size (const char *device, grub_uint32_t *block_size)
struct ofdisk_hash_ent *op)
{ {
struct size_args_ieee1275 struct size_args_ieee1275
{ {
@@ -708,34 +612,20 @@ grub_ofdisk_get_block_size (const char *device, grub_uint32_t *block_size,
if (! last_ihandle) if (! last_ihandle)
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "can't open device"); return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "can't open device");
*block_size = 0;
if (op->block_size_fails >= 2)
return GRUB_ERR_NONE;
INIT_IEEE1275_COMMON (&args_ieee1275.common, "call-method", 2, 2); INIT_IEEE1275_COMMON (&args_ieee1275.common, "call-method", 2, 2);
args_ieee1275.method = (grub_ieee1275_cell_t) "block-size"; args_ieee1275.method = (grub_ieee1275_cell_t) "block-size";
args_ieee1275.ihandle = last_ihandle; args_ieee1275.ihandle = last_ihandle;
args_ieee1275.result = 1; args_ieee1275.result = 1;
if (IEEE1275_CALL_ENTRY_FN (&args_ieee1275) == -1) *block_size = GRUB_DISK_SECTOR_SIZE;
{
grub_dprintf ("disk", "can't get block size: failed call-method\n"); if ((IEEE1275_CALL_ENTRY_FN (&args_ieee1275) == -1) || (args_ieee1275.result))
op->block_size_fails++; grub_dprintf ("disk", "can't get block size\n");
} else
else if (args_ieee1275.result) if (args_ieee1275.size1
{
grub_dprintf ("disk", "can't get block size: %lld\n",
(long long) args_ieee1275.result);
op->block_size_fails++;
}
else if (args_ieee1275.size1
&& !(args_ieee1275.size1 & (args_ieee1275.size1 - 1)) && !(args_ieee1275.size1 & (args_ieee1275.size1 - 1))
&& args_ieee1275.size1 >= 512 && args_ieee1275.size1 <= 16384) && args_ieee1275.size1 >= 512 && args_ieee1275.size1 <= 16384)
{
op->block_size_fails = 0;
*block_size = args_ieee1275.size1; *block_size = args_ieee1275.size1;
}
return 0; return 0;
} }
+1 -1
View File
@@ -963,7 +963,7 @@ grub_util_ldm_embed (struct grub_disk *disk, unsigned int *nsectors,
if (embed_type != GRUB_EMBED_PCBIOS) if (embed_type != GRUB_EMBED_PCBIOS)
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
"LDM currently supports only PC-BIOS embedding"); "LDM curently supports only PC-BIOS embedding");
if (disk->partition) if (disk->partition)
return grub_error (GRUB_ERR_BUG, "disk isn't LDM"); return grub_error (GRUB_ERR_BUG, "disk isn't LDM");
pv = grub_diskfilter_get_pv_from_disk (disk, &vg); pv = grub_diskfilter_get_pv_from_disk (disk, &vg);
+24 -30
View File
@@ -160,7 +160,7 @@ grub_lvm_detect (grub_disk_t disk,
"we don't support multiple LVM data areas"); "we don't support multiple LVM data areas");
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
grub_util_info ("we don't support multiple LVM data areas"); grub_util_info ("we don't support multiple LVM data areas\n");
#endif #endif
goto fail; goto fail;
} }
@@ -189,7 +189,7 @@ grub_lvm_detect (grub_disk_t disk,
grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
"unknown LVM metadata header"); "unknown LVM metadata header");
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
grub_util_info ("unknown LVM metadata header"); grub_util_info ("unknown LVM metadata header\n");
#endif #endif
goto fail2; goto fail2;
} }
@@ -213,7 +213,7 @@ grub_lvm_detect (grub_disk_t disk,
if (q == metadatabuf + mda_size) if (q == metadatabuf + mda_size)
{ {
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
grub_util_info ("error parsing metadata"); grub_util_info ("error parsing metadata\n");
#endif #endif
goto fail2; goto fail2;
} }
@@ -230,7 +230,7 @@ grub_lvm_detect (grub_disk_t disk,
if (p == NULL) if (p == NULL)
{ {
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
grub_util_info ("couldn't find ID"); grub_util_info ("couldn't find ID\n");
#endif #endif
goto fail3; goto fail3;
} }
@@ -258,7 +258,7 @@ grub_lvm_detect (grub_disk_t disk,
if (p == NULL) if (p == NULL)
{ {
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
grub_util_info ("unknown extent size"); grub_util_info ("unknown extent size\n");
#endif #endif
goto fail4; goto fail4;
} }
@@ -306,7 +306,7 @@ grub_lvm_detect (grub_disk_t disk,
if (p == NULL) if (p == NULL)
{ {
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
grub_util_info ("unknown pe_start"); grub_util_info ("unknown pe_start\n");
#endif #endif
goto pvs_fail; goto pvs_fail;
} }
@@ -315,7 +315,7 @@ grub_lvm_detect (grub_disk_t disk,
if (p == NULL) if (p == NULL)
{ {
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
grub_util_info ("error parsing pe_start"); grub_util_info ("error parsing pe_start\n");
#endif #endif
goto pvs_fail; goto pvs_fail;
} }
@@ -402,7 +402,7 @@ grub_lvm_detect (grub_disk_t disk,
if (p == NULL) if (p == NULL)
{ {
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
grub_util_info ("couldn't find ID"); grub_util_info ("couldn't find ID\n");
#endif #endif
goto lvs_fail; goto lvs_fail;
} }
@@ -422,11 +422,11 @@ grub_lvm_detect (grub_disk_t disk,
if (p == NULL) if (p == NULL)
{ {
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
grub_util_info ("unknown segment_count"); grub_util_info ("unknown segment_count\n");
#endif #endif
goto lvs_fail; goto lvs_fail;
} }
lv->segments = grub_zalloc (sizeof (*seg) * lv->segment_count); lv->segments = grub_malloc (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++)
@@ -436,7 +436,7 @@ grub_lvm_detect (grub_disk_t disk,
if (p == NULL) if (p == NULL)
{ {
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
grub_util_info ("unknown segment"); grub_util_info ("unknown segment\n");
#endif #endif
goto lvs_segment_fail; goto lvs_segment_fail;
} }
@@ -445,7 +445,7 @@ grub_lvm_detect (grub_disk_t disk,
if (p == NULL) if (p == NULL)
{ {
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
grub_util_info ("unknown start_extent"); grub_util_info ("unknown start_extent\n");
#endif #endif
goto lvs_segment_fail; goto lvs_segment_fail;
} }
@@ -453,7 +453,7 @@ grub_lvm_detect (grub_disk_t disk,
if (p == NULL) if (p == NULL)
{ {
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
grub_util_info ("unknown extent_count"); grub_util_info ("unknown extent_count\n");
#endif #endif
goto lvs_segment_fail; goto lvs_segment_fail;
} }
@@ -475,7 +475,7 @@ grub_lvm_detect (grub_disk_t disk,
if (p == NULL) if (p == NULL)
{ {
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
grub_util_info ("unknown stripe_count"); grub_util_info ("unknown stripe_count\n");
#endif #endif
goto lvs_segment_fail; goto lvs_segment_fail;
} }
@@ -491,7 +491,7 @@ grub_lvm_detect (grub_disk_t disk,
if (p == NULL) if (p == NULL)
{ {
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
grub_util_info ("unknown stripes"); grub_util_info ("unknown stripes\n");
#endif #endif
goto lvs_segment_fail2; goto lvs_segment_fail2;
} }
@@ -533,7 +533,7 @@ grub_lvm_detect (grub_disk_t disk,
if (p == NULL) if (p == NULL)
{ {
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
grub_util_info ("unknown mirror_count"); grub_util_info ("unknown mirror_count\n");
#endif #endif
goto lvs_segment_fail; goto lvs_segment_fail;
} }
@@ -545,7 +545,7 @@ grub_lvm_detect (grub_disk_t disk,
if (p == NULL) if (p == NULL)
{ {
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
grub_util_info ("unknown mirrors"); grub_util_info ("unknown mirrors\n");
#endif #endif
goto lvs_segment_fail2; goto lvs_segment_fail2;
} }
@@ -577,17 +577,13 @@ grub_lvm_detect (grub_disk_t disk,
if (is_pvmove) if (is_pvmove)
seg->node_count = 1; seg->node_count = 1;
} }
else if (grub_memcmp (p, "raid", sizeof ("raid") - 1) == 0 else if (grub_memcmp (p, "raid", sizeof ("raid") - 1)
&& ((p[sizeof ("raid") - 1] >= '4' == 0 && (p[sizeof ("raid") - 1] >= '4'
&& p[sizeof ("raid") - 1] <= '6') && p[sizeof ("raid") - 1] <= '6')
|| p[sizeof ("raid") - 1] == '1')
&& p[sizeof ("raidX") - 1] == '"') && p[sizeof ("raidX") - 1] == '"')
{ {
switch (p[sizeof ("raid") - 1]) switch (p[sizeof ("raid") - 1])
{ {
case '1':
seg->type = GRUB_DISKFILTER_MIRROR;
break;
case '4': case '4':
seg->type = GRUB_DISKFILTER_RAID4; seg->type = GRUB_DISKFILTER_RAID4;
seg->layout = GRUB_RAID_LAYOUT_LEFT_ASYMMETRIC; seg->layout = GRUB_RAID_LAYOUT_LEFT_ASYMMETRIC;
@@ -607,22 +603,20 @@ grub_lvm_detect (grub_disk_t disk,
if (p == NULL) if (p == NULL)
{ {
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
grub_util_info ("unknown device_count"); grub_util_info ("unknown device_count\n");
#endif #endif
goto lvs_segment_fail; goto lvs_segment_fail;
} }
if (seg->type != GRUB_DISKFILTER_MIRROR)
{
seg->stripe_size = grub_lvm_getvalue (&p, "stripe_size = "); seg->stripe_size = grub_lvm_getvalue (&p, "stripe_size = ");
if (p == NULL) if (p == NULL)
{ {
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
grub_util_info ("unknown stripe_size"); grub_util_info ("unknown stripe_size\n");
#endif #endif
goto lvs_segment_fail; goto lvs_segment_fail;
} }
}
seg->nodes = grub_zalloc (sizeof (seg->nodes[0]) seg->nodes = grub_zalloc (sizeof (seg->nodes[0])
* seg->node_count); * seg->node_count);
@@ -631,7 +625,7 @@ grub_lvm_detect (grub_disk_t disk,
if (p == NULL) if (p == NULL)
{ {
#ifdef GRUB_UTIL #ifdef GRUB_UTIL
grub_util_info ("unknown raids"); grub_util_info ("unknown mirrors\n");
#endif #endif
goto lvs_segment_fail2; goto lvs_segment_fail2;
} }
@@ -678,7 +672,7 @@ grub_lvm_detect (grub_disk_t disk,
p2 = grub_strchr (p, '"'); p2 = grub_strchr (p, '"');
if (p2) if (p2)
*p2 = 0; *p2 = 0;
grub_util_info ("unknown LVM type %s", p); grub_util_info ("unknown LVM type %s\n", p);
if (p2) if (p2)
*p2 ='"'; *p2 ='"';
#endif #endif
+3 -13
View File
@@ -63,16 +63,6 @@ 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)
@@ -172,11 +162,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 = mod_255((255 ^ bad1) c = ((255 ^ bad1)
+ (255 ^ powx_inv[(powx[bad2 + (bad1 ^ 255)] ^ 1)])); + (255 ^ powx_inv[(powx[bad2 + (bad1 ^ 255)] ^ 1)])) % 255;
grub_raid_block_mulx (c, qbuf, size); grub_raid_block_mulx (c, qbuf, size);
c = mod_255((unsigned) bad2 + c); c = ((unsigned) bad2 + c) % 255;
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);
+2 -3
View File
@@ -615,10 +615,9 @@ grub_scsi_open (const char *name, grub_disk_t disk)
if (scsi->blocksize & (scsi->blocksize - 1) || !scsi->blocksize) if (scsi->blocksize & (scsi->blocksize - 1) || !scsi->blocksize)
{ {
grub_error (GRUB_ERR_IO, "invalid sector size %d",
scsi->blocksize);
grub_free (scsi); grub_free (scsi);
return grub_errno; return grub_error (GRUB_ERR_IO, "invalid sector size %d",
scsi->blocksize);
} }
for (disk->log_sector_size = 0; for (disk->log_sector_size = 0;
(1U << disk->log_sector_size) < scsi->blocksize; (1U << disk->log_sector_size) < scsi->blocksize;
+9 -36
View File
@@ -40,7 +40,6 @@ 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()
@@ -48,7 +47,6 @@ 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,
@@ -68,32 +66,20 @@ 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)
{ {
int i; grub_size_t 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 compatibility with pv-grub legacy menu.lst accept hdX as disk name */ for (i = 0; i < vdiskcnt; i++)
if (name[0] == 'h' && name[1] == 'd' && name[2]) if (grub_strcmp (name, virtdisks[i].fullname) == 0)
{
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 (!vd) if (i == vdiskcnt)
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "not a virtdisk"); return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "not a virtdisk");
disk->data = vd; disk->data = &virtdisks[i];
disk->id = vd - virtdisks; disk->id = i;
grub_snprintf (fdir, sizeof (fdir), "%s/sectors", vd->backend_dir); grub_snprintf (fdir, sizeof (fdir), "%s/sectors", 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;
@@ -101,7 +87,8 @@ 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", vd->backend_dir); grub_snprintf (fdir, sizeof (fdir), "%s/sector-size",
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;
@@ -277,7 +264,6 @@ 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)
@@ -388,19 +374,6 @@ 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 -3
View File
@@ -777,7 +777,6 @@ 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;
} }
} }
@@ -1286,7 +1285,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
@@ -1327,7 +1326,6 @@ 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),
+3 -4
View File
@@ -34,12 +34,12 @@ canonicalize (char *name)
iptr++; iptr++;
if (iptr[0] == '.' && (iptr[1] == '/' || iptr[1] == 0)) if (iptr[0] == '.' && (iptr[1] == '/' || iptr[1] == 0))
{ {
iptr++; iptr += 2;
continue; continue;
} }
if (iptr[0] == '.' && iptr[1] == '.' && (iptr[2] == '/' || iptr[2] == 0)) if (iptr[0] == '.' && iptr[1] == '.' && (iptr[2] == '/' || iptr[2] == 0))
{ {
iptr += 2; iptr += 3;
if (optr == name) if (optr == name)
continue; continue;
for (optr -= 2; optr >= name && *optr != '/'; optr--); for (optr -= 2; optr >= name && *optr != '/'; optr--);
@@ -249,10 +249,9 @@ grub_archelp_open (struct grub_archelp_data *data,
while (1) while (1)
{ {
grub_uint32_t mode; grub_uint32_t mode;
grub_int32_t mtime;
int restart; int restart;
if (arcops->find_file (data, &fn, &mtime, &mode)) if (arcops->find_file (data, &fn, NULL, &mode))
goto fail; goto fail;
if (mode == GRUB_ARCHELP_ATTR_END) if (mode == GRUB_ARCHELP_ATTR_END)
+115 -102
View File
@@ -29,7 +29,6 @@
#include <grub/dl.h> #include <grub/dl.h>
#include <grub/types.h> #include <grub/types.h>
#include <grub/i18n.h> #include <grub/i18n.h>
#include <grub/fshelp.h>
GRUB_MOD_LICENSE ("GPLv3+"); GRUB_MOD_LICENSE ("GPLv3+");
@@ -562,10 +561,10 @@ iterate_in_b_tree (grub_disk_t disk,
} }
static int static int
bfs_strcmp (const char *a, const char *b, grub_size_t alen) bfs_strcmp (const char *a, const char *b, grub_size_t alen, grub_size_t blen)
{ {
char ac, bc; char ac, bc;
while (*b && alen) while (blen && alen)
{ {
if (*a != *b) if (*a != *b)
break; break;
@@ -573,10 +572,11 @@ bfs_strcmp (const char *a, const char *b, grub_size_t alen)
a++; a++;
b++; b++;
alen--; alen--;
blen--;
} }
ac = alen ? *a : 0; ac = alen ? *a : 0;
bc = *b; bc = blen ? *b : 0;
#ifdef MODE_AFS #ifdef MODE_AFS
return (int) (grub_int8_t) ac - (int) (grub_int8_t) bc; return (int) (grub_int8_t) ac - (int) (grub_int8_t) bc;
@@ -589,6 +589,7 @@ static grub_err_t
find_in_b_tree (grub_disk_t disk, find_in_b_tree (grub_disk_t disk,
const struct grub_bfs_superblock *sb, const struct grub_bfs_superblock *sb,
const struct grub_bfs_inode *ino, const char *name, const struct grub_bfs_inode *ino, const char *name,
grub_size_t name_len,
grub_uint64_t * res) grub_uint64_t * res)
{ {
struct grub_bfs_btree_header head; struct grub_bfs_btree_header head;
@@ -636,7 +637,7 @@ find_in_b_tree (grub_disk_t disk,
end = grub_bfs_to_cpu16 (keylen_idx[(i | (1 << j))]); end = grub_bfs_to_cpu16 (keylen_idx[(i | (1 << j))]);
if (grub_bfs_to_cpu_treehead (node->total_key_len) <= end) if (grub_bfs_to_cpu_treehead (node->total_key_len) <= end)
end = grub_bfs_to_cpu_treehead (node->total_key_len); end = grub_bfs_to_cpu_treehead (node->total_key_len);
cmp = bfs_strcmp (key_data + start, name, end - start); cmp = bfs_strcmp (key_data + start, name, end - start, name_len);
if (cmp == 0 && level == 0) if (cmp == 0 && level == 0)
{ {
*res = grub_bfs_to_cpu64 (key_values[i | (1 << j)].val); *res = grub_bfs_to_cpu64 (key_values[i | (1 << j)].val);
@@ -657,7 +658,7 @@ find_in_b_tree (grub_disk_t disk,
end = grub_bfs_to_cpu16 (keylen_idx[0]); end = grub_bfs_to_cpu16 (keylen_idx[0]);
if (grub_bfs_to_cpu_treehead (node->total_key_len) <= end) if (grub_bfs_to_cpu_treehead (node->total_key_len) <= end)
end = grub_bfs_to_cpu_treehead (node->total_key_len); end = grub_bfs_to_cpu_treehead (node->total_key_len);
cmp = bfs_strcmp (key_data, name, end); cmp = bfs_strcmp (key_data, name, end, name_len);
if (cmp == 0 && level == 0) if (cmp == 0 && level == 0)
{ {
*res = grub_bfs_to_cpu64 (key_values[0].val); *res = grub_bfs_to_cpu64 (key_values[0].val);
@@ -706,119 +707,127 @@ find_in_b_tree (grub_disk_t disk,
} }
} }
struct grub_fshelp_node
{
grub_disk_t disk;
const struct grub_bfs_superblock *sb;
struct grub_bfs_inode ino;
};
static grub_err_t static grub_err_t
lookup_file (grub_fshelp_node_t dir, hop_level (grub_disk_t disk,
const char *name, const struct grub_bfs_superblock *sb,
grub_fshelp_node_t *foundnode, struct grub_bfs_inode *ino, const char *name,
enum grub_fshelp_filetype *foundtype) const char *name_end)
{ {
grub_err_t err; grub_err_t err;
struct grub_bfs_inode *new_ino;
grub_uint64_t res = 0; grub_uint64_t res = 0;
err = find_in_b_tree (dir->disk, dir->sb, &dir->ino, name, &res); if (((grub_bfs_to_cpu32 (ino->mode) & ATTR_TYPE) != ATTR_DIR))
return grub_error (GRUB_ERR_BAD_FILE_TYPE, N_("not a directory"));
err = find_in_b_tree (disk, sb, ino, name, name_end - name, &res);
if (err) if (err)
return err; return err;
*foundnode = grub_malloc (sizeof (struct grub_fshelp_node)); return grub_disk_read (disk, res
if (!*foundnode) << (grub_bfs_to_cpu32 (sb->log2_bsize)
return grub_errno;
(*foundnode)->disk = dir->disk;
(*foundnode)->sb = dir->sb;
new_ino = &(*foundnode)->ino;
if (grub_disk_read (dir->disk, res
<< (grub_bfs_to_cpu32 (dir->sb->log2_bsize)
- GRUB_DISK_SECTOR_BITS), 0, - GRUB_DISK_SECTOR_BITS), 0,
sizeof (*new_ino), (char *) new_ino)) sizeof (*ino), (char *) ino);
{
grub_free (*foundnode);
return grub_errno;
}
switch (grub_bfs_to_cpu32 (new_ino->mode) & ATTR_TYPE)
{
default:
case ATTR_REG:
*foundtype = GRUB_FSHELP_REG;
break;
case ATTR_DIR:
*foundtype = GRUB_FSHELP_DIR;
break;
case ATTR_LNK:
*foundtype = GRUB_FSHELP_SYMLINK;
break;
}
return GRUB_ERR_NONE;
}
static char *
read_symlink (grub_fshelp_node_t node)
{
char *alloc = NULL;
grub_err_t err;
#ifndef MODE_AFS
if (!(grub_bfs_to_cpu32 (node->ino.flags) & LONG_SYMLINK))
{
alloc = grub_malloc (sizeof (node->ino.inplace_link) + 1);
if (!alloc)
{
return NULL;
}
grub_memcpy (alloc, node->ino.inplace_link,
sizeof (node->ino.inplace_link));
alloc[sizeof (node->ino.inplace_link)] = 0;
}
else
#endif
{
grub_size_t symsize = grub_bfs_to_cpu64 (node->ino.size);
alloc = grub_malloc (symsize + 1);
if (!alloc)
return NULL;
err = read_bfs_file (node->disk, node->sb, &node->ino, 0, alloc, symsize, 0, 0);
if (err)
{
grub_free (alloc);
return NULL;
}
alloc[symsize] = 0;
}
return alloc;
} }
static grub_err_t static grub_err_t
find_file (const char *path, grub_disk_t disk, find_file (const char *path, grub_disk_t disk,
const struct grub_bfs_superblock *sb, struct grub_bfs_inode *ino, const struct grub_bfs_superblock *sb, struct grub_bfs_inode *ino)
enum grub_fshelp_filetype exptype)
{ {
const char *ptr, *next = path;
char *alloc = NULL;
char *wptr;
grub_err_t err; grub_err_t err;
struct grub_fshelp_node root = { struct grub_bfs_inode old_ino;
.disk = disk, unsigned symlinks_max = 32;
.sb = sb,
};
struct grub_fshelp_node *found;
err = read_extent (disk, sb, &sb->root_dir, 0, 0, &root.ino, err = read_extent (disk, sb, &sb->root_dir, 0, 0, ino,
sizeof (root.ino)); sizeof (*ino));
if (err) if (err)
return err; return err;
err = grub_fshelp_find_file_lookup (path, &root, &found, lookup_file, read_symlink, exptype);
if (!err)
grub_memcpy (ino, &found->ino, sizeof (*ino));
if (&root != found) while (1)
grub_free (found); {
ptr = next;
while (*ptr == '/')
ptr++;
if (*ptr == 0)
{
grub_free (alloc);
return GRUB_ERR_NONE;
}
for (next = ptr; *next && *next != '/'; next++);
grub_memcpy (&old_ino, ino, sizeof (old_ino));
err = hop_level (disk, sb, ino, ptr, next);
if (err)
return err; return err;
if (((grub_bfs_to_cpu32 (ino->mode) & ATTR_TYPE) == ATTR_LNK))
{
char *old_alloc = alloc;
if (--symlinks_max == 0)
{
grub_free (alloc);
return grub_error (GRUB_ERR_SYMLINK_LOOP,
N_("too deep nesting of symlinks"));
}
#ifndef MODE_AFS
if (grub_bfs_to_cpu32 (ino->flags) & LONG_SYMLINK)
#endif
{
grub_size_t symsize = grub_bfs_to_cpu64 (ino->size);
alloc = grub_malloc (grub_strlen (next)
+ symsize + 1);
if (!alloc)
{
grub_free (alloc);
return grub_errno;
}
grub_free (old_alloc);
err = read_bfs_file (disk, sb, ino, 0, alloc, symsize, 0, 0);
if (err)
{
grub_free (alloc);
return err;
}
alloc[symsize] = 0;
}
#ifndef MODE_AFS
else
{
alloc = grub_malloc (grub_strlen (next)
+ sizeof (ino->inplace_link) + 1);
if (!alloc)
{
grub_free (alloc);
return grub_errno;
}
grub_free (old_alloc);
grub_memcpy (alloc, ino->inplace_link,
sizeof (ino->inplace_link));
alloc[sizeof (ino->inplace_link)] = 0;
}
#endif
if (alloc[0] == '/')
{
err = read_extent (disk, sb, &sb->root_dir, 0, 0, ino,
sizeof (*ino));
if (err)
{
grub_free (alloc);
return err;
}
}
else
grub_memcpy (ino, &old_ino, sizeof (old_ino));
wptr = alloc + grub_strlen (alloc);
if (next)
wptr = grub_stpcpy (wptr, next);
*wptr = 0;
next = alloc;
continue;
}
}
} }
static grub_err_t static grub_err_t
@@ -900,9 +909,11 @@ grub_bfs_dir (grub_device_t device, const char *path,
{ {
struct grub_bfs_inode ino; struct grub_bfs_inode ino;
err = find_file (path, device->disk, &ctx.sb, &ino, GRUB_FSHELP_DIR); err = find_file (path, device->disk, &ctx.sb, &ino);
if (err) if (err)
return err; return err;
if (((grub_bfs_to_cpu32 (ino.mode) & ATTR_TYPE) != ATTR_DIR))
return grub_error (GRUB_ERR_BAD_FILE_TYPE, N_("not a directory"));
iterate_in_b_tree (device->disk, &ctx.sb, &ino, grub_bfs_dir_iter, iterate_in_b_tree (device->disk, &ctx.sb, &ino, grub_bfs_dir_iter,
&ctx); &ctx);
} }
@@ -923,9 +934,11 @@ grub_bfs_open (struct grub_file *file, const char *name)
{ {
struct grub_bfs_inode ino; struct grub_bfs_inode ino;
struct grub_bfs_data *data; struct grub_bfs_data *data;
err = find_file (name, file->device->disk, &sb, &ino, GRUB_FSHELP_REG); err = find_file (name, file->device->disk, &sb, &ino);
if (err) if (err)
return err; return err;
if (((grub_bfs_to_cpu32 (ino.mode) & ATTR_TYPE) != ATTR_REG))
return grub_error (GRUB_ERR_BAD_FILE_TYPE, N_("not a regular file"));
data = grub_zalloc (sizeof (struct grub_bfs_data)); data = grub_zalloc (sizeof (struct grub_bfs_data));
if (!data) if (!data)
@@ -1021,7 +1034,7 @@ read_bfs_attr (grub_disk_t disk,
if (err) if (err)
return -1; return -1;
err = find_in_b_tree (disk, sb, ino, name, &res); err = find_in_b_tree (disk, sb, ino, name, grub_strlen (name), &res);
if (err) if (err)
return -1; return -1;
grub_disk_read (disk, res grub_disk_read (disk, res
+3 -11
View File
@@ -74,6 +74,7 @@ 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;
@@ -143,7 +144,7 @@ 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 = NULL; struct grub_archelp_data *data;
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;
@@ -195,7 +196,6 @@ 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;
} }
@@ -344,16 +344,8 @@ init_cbfsdisk (void)
ptr = *(grub_uint32_t *) 0xfffffffc; ptr = *(grub_uint32_t *) 0xfffffffc;
head = (struct cbfs_header *) (grub_addr_t) ptr; head = (struct cbfs_header *) (grub_addr_t) ptr;
grub_dprintf ("cbfs", "head=%p\n", head);
/* coreboot current supports only ROMs <= 16 MiB. Bigger ROMs will if (!validate_head (head))
have problems as RCBA is 18 MiB below end of 32-bit typically,
so either memory map would have to be rearranged or we'd need to support
reading ROMs through controller directly.
*/
if (ptr < 0xff000000
|| 0xffffffff - ptr < (grub_uint32_t) sizeof (*head) + 0xf
|| !validate_head (head))
return; return;
cbfsdisk_size = ALIGN_UP (grub_be_to_cpu32 (head->romsize), cbfsdisk_size = ALIGN_UP (grub_be_to_cpu32 (head->romsize),
+1 -8
View File
@@ -61,14 +61,7 @@ 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));
/* Don't allow negative numbers. */ if (mode)
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);
+8 -68
View File
@@ -100,7 +100,6 @@ 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)
@@ -108,7 +107,6 @@ 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
@@ -116,13 +114,8 @@ 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. */
* mmp: Not really back-incompatible - was added as such to #define EXT2_DRIVER_IGNORED_INCOMPAT ( EXT3_FEATURE_INCOMPAT_RECOVER )
* 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
@@ -338,68 +331,16 @@ 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, grub_uint64_t group, grub_ext2_blockgroup (struct grub_ext2_data *data, int 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) ((grub_le_to_cpu32 (data->sblock.first_data_block) + 1)
+ block) << LOG2_EXT2_BLOCK_SIZE (data)),
<< LOG2_EXT2_BLOCK_SIZE (data)), offset, group << data->log_group_desc_size,
sizeof (struct grub_ext2_block_group), blkgrp); sizeof (struct grub_ext2_block_group), blkgrp);
} }
@@ -538,9 +479,8 @@ grub_ext2_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock)
shift = 2; shift = 2;
goto indirect; goto indirect;
} }
grub_error (GRUB_ERR_BAD_FS, return grub_error (GRUB_ERR_BAD_FS,
"ext2fs doesn't support quadruple indirect blocks"); "ext2fs doesn't support quadruple indirect blocks");
return -1;
indirect: indirect:
do { do {
@@ -555,7 +495,7 @@ indirect:
& ((1 << log_perblock) - 1)) & ((1 << log_perblock) - 1))
* sizeof (indir), * sizeof (indir),
sizeof (indir), &indir)) sizeof (indir), &indir))
return -1; return grub_errno;
} while (shift--); } while (shift--);
return grub_le_to_cpu32 (indir); return grub_le_to_cpu32 (indir);
+171 -175
View File
@@ -31,7 +31,6 @@
#else #else
#include <grub/exfat.h> #include <grub/exfat.h>
#endif #endif
#include <grub/fshelp.h>
#include <grub/i18n.h> #include <grub/i18n.h>
GRUB_MOD_LICENSE ("GPLv3+"); GRUB_MOD_LICENSE ("GPLv3+");
@@ -174,6 +173,8 @@ struct grub_fat_data
#ifndef MODE_EXFAT #ifndef MODE_EXFAT
grub_uint32_t root_sector; grub_uint32_t root_sector;
grub_uint32_t num_root_sectors; grub_uint32_t num_root_sectors;
#else
int is_contiguous;
#endif #endif
int cluster_bits; int cluster_bits;
@@ -181,22 +182,13 @@ struct grub_fat_data
grub_uint32_t cluster_sector; grub_uint32_t cluster_sector;
grub_uint32_t num_clusters; grub_uint32_t num_clusters;
grub_uint32_t uuid;
};
struct grub_fshelp_node {
grub_disk_t disk;
struct grub_fat_data *data;
grub_uint8_t attr; grub_uint8_t attr;
grub_ssize_t file_size; grub_ssize_t file_size;
grub_uint32_t file_cluster; grub_uint32_t file_cluster;
grub_uint32_t cur_cluster_num; grub_uint32_t cur_cluster_num;
grub_uint32_t cur_cluster; grub_uint32_t cur_cluster;
#ifdef MODE_EXFAT grub_uint32_t uuid;
int is_contiguous;
#endif
}; };
static grub_dl_t my_mod; static grub_dl_t my_mod;
@@ -435,6 +427,13 @@ grub_fat_mount (grub_disk_t disk)
(void) magic; (void) magic;
#endif #endif
/* Start from the root directory. */
data->file_cluster = data->root_cluster;
data->cur_cluster_num = ~0U;
data->attr = GRUB_FAT_ATTR_DIRECTORY;
#ifdef MODE_EXFAT
data->is_contiguous = 0;
#endif
return data; return data;
fail: fail:
@@ -445,7 +444,7 @@ grub_fat_mount (grub_disk_t disk)
} }
static grub_ssize_t static grub_ssize_t
grub_fat_read_data (grub_disk_t disk, grub_fshelp_node_t node, grub_fat_read_data (grub_disk_t disk, struct grub_fat_data *data,
grub_disk_read_hook_t read_hook, void *read_hook_data, grub_disk_read_hook_t read_hook, void *read_hook_data,
grub_off_t offset, grub_size_t len, char *buf) grub_off_t offset, grub_size_t len, char *buf)
{ {
@@ -458,13 +457,13 @@ grub_fat_read_data (grub_disk_t disk, grub_fshelp_node_t node,
#ifndef MODE_EXFAT #ifndef MODE_EXFAT
/* This is a special case. FAT12 and FAT16 doesn't have the root directory /* This is a special case. FAT12 and FAT16 doesn't have the root directory
in clusters. */ in clusters. */
if (node->file_cluster == ~0U) if (data->file_cluster == ~0U)
{ {
size = (node->data->num_root_sectors << GRUB_DISK_SECTOR_BITS) - offset; size = (data->num_root_sectors << GRUB_DISK_SECTOR_BITS) - offset;
if (size > len) if (size > len)
size = len; size = len;
if (grub_disk_read (disk, node->data->root_sector, offset, size, buf)) if (grub_disk_read (disk, data->root_sector, offset, size, buf))
return -1; return -1;
return size; return size;
@@ -472,12 +471,12 @@ grub_fat_read_data (grub_disk_t disk, grub_fshelp_node_t node,
#endif #endif
#ifdef MODE_EXFAT #ifdef MODE_EXFAT
if (node->is_contiguous) if (data->is_contiguous)
{ {
/* Read the data here. */ /* Read the data here. */
sector = (node->data->cluster_sector sector = (data->cluster_sector
+ ((node->file_cluster - 2) + ((data->file_cluster - 2)
<< node->data->cluster_bits)); << data->cluster_bits));
disk->read_hook = read_hook; disk->read_hook = read_hook;
disk->read_hook_data = read_hook_data; disk->read_hook_data = read_hook_data;
@@ -492,53 +491,53 @@ grub_fat_read_data (grub_disk_t disk, grub_fshelp_node_t node,
#endif #endif
/* Calculate the logical cluster number and offset. */ /* Calculate the logical cluster number and offset. */
logical_cluster_bits = (node->data->cluster_bits logical_cluster_bits = (data->cluster_bits
+ GRUB_DISK_SECTOR_BITS); + GRUB_DISK_SECTOR_BITS);
logical_cluster = offset >> logical_cluster_bits; logical_cluster = offset >> logical_cluster_bits;
offset &= (1ULL << logical_cluster_bits) - 1; offset &= (1ULL << logical_cluster_bits) - 1;
if (logical_cluster < node->cur_cluster_num) if (logical_cluster < data->cur_cluster_num)
{ {
node->cur_cluster_num = 0; data->cur_cluster_num = 0;
node->cur_cluster = node->file_cluster; data->cur_cluster = data->file_cluster;
} }
while (len) while (len)
{ {
while (logical_cluster > node->cur_cluster_num) while (logical_cluster > data->cur_cluster_num)
{ {
/* Find next cluster. */ /* Find next cluster. */
grub_uint32_t next_cluster; grub_uint32_t next_cluster;
grub_uint32_t fat_offset; grub_uint32_t fat_offset;
switch (node->data->fat_size) switch (data->fat_size)
{ {
case 32: case 32:
fat_offset = node->cur_cluster << 2; fat_offset = data->cur_cluster << 2;
break; break;
case 16: case 16:
fat_offset = node->cur_cluster << 1; fat_offset = data->cur_cluster << 1;
break; break;
default: default:
/* case 12: */ /* case 12: */
fat_offset = node->cur_cluster + (node->cur_cluster >> 1); fat_offset = data->cur_cluster + (data->cur_cluster >> 1);
break; break;
} }
/* Read the FAT. */ /* Read the FAT. */
if (grub_disk_read (disk, node->data->fat_sector, fat_offset, if (grub_disk_read (disk, data->fat_sector, fat_offset,
(node->data->fat_size + 7) >> 3, (data->fat_size + 7) >> 3,
(char *) &next_cluster)) (char *) &next_cluster))
return -1; return -1;
next_cluster = grub_le_to_cpu32 (next_cluster); next_cluster = grub_le_to_cpu32 (next_cluster);
switch (node->data->fat_size) switch (data->fat_size)
{ {
case 16: case 16:
next_cluster &= 0xFFFF; next_cluster &= 0xFFFF;
break; break;
case 12: case 12:
if (node->cur_cluster & 1) if (data->cur_cluster & 1)
next_cluster >>= 4; next_cluster >>= 4;
next_cluster &= 0x0FFF; next_cluster &= 0x0FFF;
@@ -546,27 +545,27 @@ grub_fat_read_data (grub_disk_t disk, grub_fshelp_node_t node,
} }
grub_dprintf ("fat", "fat_size=%d, next_cluster=%u\n", grub_dprintf ("fat", "fat_size=%d, next_cluster=%u\n",
node->data->fat_size, next_cluster); data->fat_size, next_cluster);
/* Check the end. */ /* Check the end. */
if (next_cluster >= node->data->cluster_eof_mark) if (next_cluster >= data->cluster_eof_mark)
return ret; return ret;
if (next_cluster < 2 || next_cluster >= node->data->num_clusters) if (next_cluster < 2 || next_cluster >= data->num_clusters)
{ {
grub_error (GRUB_ERR_BAD_FS, "invalid cluster %u", grub_error (GRUB_ERR_BAD_FS, "invalid cluster %u",
next_cluster); next_cluster);
return -1; return -1;
} }
node->cur_cluster = next_cluster; data->cur_cluster = next_cluster;
node->cur_cluster_num++; data->cur_cluster_num++;
} }
/* Read the data here. */ /* Read the data here. */
sector = (node->data->cluster_sector sector = (data->cluster_sector
+ ((node->cur_cluster - 2) + ((data->cur_cluster - 2)
<< node->data->cluster_bits)); << data->cluster_bits));
size = (1 << logical_cluster_bits) - offset; size = (1 << logical_cluster_bits) - offset;
if (size > len) if (size > len)
size = len; size = len;
@@ -632,7 +631,7 @@ grub_fat_iterate_fini (struct grub_fat_iterate_context *ctxt)
#ifdef MODE_EXFAT #ifdef MODE_EXFAT
static grub_err_t static grub_err_t
grub_fat_iterate_dir_next (grub_fshelp_node_t node, grub_fat_iterate_dir_next (grub_disk_t disk, struct grub_fat_data *data,
struct grub_fat_iterate_context *ctxt) struct grub_fat_iterate_context *ctxt)
{ {
grub_memset (&ctxt->dir, 0, sizeof (ctxt->dir)); grub_memset (&ctxt->dir, 0, sizeof (ctxt->dir));
@@ -642,7 +641,7 @@ grub_fat_iterate_dir_next (grub_fshelp_node_t node,
ctxt->offset += sizeof (dir); ctxt->offset += sizeof (dir);
if (grub_fat_read_data (node->disk, node, 0, 0, ctxt->offset, sizeof (dir), if (grub_fat_read_data (disk, data, 0, 0, ctxt->offset, sizeof (dir),
(char *) &dir) (char *) &dir)
!= sizeof (dir)) != sizeof (dir))
break; break;
@@ -664,7 +663,7 @@ grub_fat_iterate_dir_next (grub_fshelp_node_t node,
{ {
struct grub_fat_dir_entry sec; struct grub_fat_dir_entry sec;
ctxt->offset += sizeof (sec); ctxt->offset += sizeof (sec);
if (grub_fat_read_data (node->disk, node, 0, 0, if (grub_fat_read_data (disk, data, 0, 0,
ctxt->offset, sizeof (sec), (char *) &sec) ctxt->offset, sizeof (sec), (char *) &sec)
!= sizeof (sec)) != sizeof (sec))
break; break;
@@ -681,7 +680,7 @@ grub_fat_iterate_dir_next (grub_fshelp_node_t node,
ctxt->dir.file_size ctxt->dir.file_size
= grub_cpu_to_le64 (sec.type_specific.stream_extension.file_size); = grub_cpu_to_le64 (sec.type_specific.stream_extension.file_size);
ctxt->dir.have_stream = 1; ctxt->dir.have_stream = 1;
ctxt->dir.is_contiguous = !!(sec.type_specific.stream_extension.flags ctxt->dir.is_contiguous = !!(dir.type_specific.stream_extension.flags
& grub_cpu_to_le16_compile_time (FLAG_CONTIGUOUS)); & grub_cpu_to_le16_compile_time (FLAG_CONTIGUOUS));
break; break;
case 0xc1: case 0xc1:
@@ -728,7 +727,7 @@ grub_fat_iterate_dir_next (grub_fshelp_node_t node,
#else #else
static grub_err_t static grub_err_t
grub_fat_iterate_dir_next (grub_fshelp_node_t node, grub_fat_iterate_dir_next (grub_disk_t disk, struct grub_fat_data *data,
struct grub_fat_iterate_context *ctxt) struct grub_fat_iterate_context *ctxt)
{ {
char *filep = 0; char *filep = 0;
@@ -743,7 +742,7 @@ grub_fat_iterate_dir_next (grub_fshelp_node_t node,
ctxt->offset += sizeof (ctxt->dir); ctxt->offset += sizeof (ctxt->dir);
/* Read a directory entry. */ /* Read a directory entry. */
if (grub_fat_read_data (node->disk, node, 0, 0, if (grub_fat_read_data (disk, data, 0, 0,
ctxt->offset, sizeof (ctxt->dir), ctxt->offset, sizeof (ctxt->dir),
(char *) &ctxt->dir) (char *) &ctxt->dir)
!= sizeof (ctxt->dir) || ctxt->dir.name[0] == 0) != sizeof (ctxt->dir) || ctxt->dir.name[0] == 0)
@@ -830,8 +829,6 @@ grub_fat_iterate_dir_next (grub_fshelp_node_t node,
i--; i--;
} }
/* XXX should we check that dir position is 0 or 1? */
if (i > 2 || filep[0] != '.' || (i == 2 && filep[1] != '.'))
*filep++ = '.'; *filep++ = '.';
for (i = 8; i < 11 && ctxt->dir.name[i]; i++) for (i = 8; i < 11 && ctxt->dir.name[i]; i++)
@@ -854,20 +851,62 @@ grub_fat_iterate_dir_next (grub_fshelp_node_t node,
#endif #endif
static grub_err_t lookup_file (grub_fshelp_node_t node, /* Find the underlying directory or file in PATH and return the
const char *name, next path. If there is no next path or an error occurs, return NULL.
grub_fshelp_node_t *foundnode, If HOOK is specified, call it with each file name. */
enum grub_fshelp_filetype *foundtype) static char *
grub_fat_find_dir (grub_disk_t disk, struct grub_fat_data *data,
const char *path, const char *origpath,
grub_fs_dir_hook_t hook, void *hook_data)
{ {
grub_err_t err; char *dirname, *dirp;
int call_hook;
int found = 0;
struct grub_fat_iterate_context ctxt; struct grub_fat_iterate_context ctxt;
grub_err_t err;
if (! (data->attr & GRUB_FAT_ATTR_DIRECTORY))
{
grub_error (GRUB_ERR_BAD_FILE_TYPE, N_("not a directory"));
return 0;
}
/* Extract a directory name. */
while (*path == '/')
path++;
dirp = grub_strchr (path, '/');
if (dirp)
{
unsigned len = dirp - path;
dirname = grub_malloc (len + 1);
if (! dirname)
goto fail;
grub_memcpy (dirname, path, len);
dirname[len] = '\0';
}
else
/* This is actually a file. */
dirname = grub_strdup (path);
call_hook = (! dirp && hook);
err = grub_fat_iterate_init (&ctxt); err = grub_fat_iterate_init (&ctxt);
if (err) if (err)
return err;
while (!(err = grub_fat_iterate_dir_next (node, &ctxt)))
{ {
grub_free (dirname);
return 0;
}
while (!(err = grub_fat_iterate_dir_next (disk, data, &ctxt)))
{
struct grub_dirhook_info info;
grub_memset (&info, 0, sizeof (info));
info.dir = !! (ctxt.dir.attr & GRUB_FAT_ATTR_DIRECTORY);
info.case_insensitive = 1;
#ifdef MODE_EXFAT #ifdef MODE_EXFAT
if (!ctxt.dir.have_stream) if (!ctxt.dir.have_stream)
@@ -876,33 +915,33 @@ static grub_err_t lookup_file (grub_fshelp_node_t node,
if (ctxt.dir.attr & GRUB_FAT_ATTR_VOLUME_ID) if (ctxt.dir.attr & GRUB_FAT_ATTR_VOLUME_ID)
continue; continue;
#endif #endif
if (*dirname == '\0' && call_hook)
if (grub_strcasecmp (name, ctxt.filename) == 0)
{ {
*foundnode = grub_malloc (sizeof (struct grub_fshelp_node)); if (hook (ctxt.filename, &info, hook_data))
if (!*foundnode) break;
return grub_errno; else
(*foundnode)->attr = ctxt.dir.attr; continue;
}
if (grub_strcasecmp (dirname, ctxt.filename) == 0)
{
found = 1;
data->attr = ctxt.dir.attr;
#ifdef MODE_EXFAT #ifdef MODE_EXFAT
(*foundnode)->file_size = ctxt.dir.file_size; data->file_size = ctxt.dir.file_size;
(*foundnode)->file_cluster = ctxt.dir.first_cluster; data->file_cluster = ctxt.dir.first_cluster;
(*foundnode)->is_contiguous = ctxt.dir.is_contiguous; data->is_contiguous = ctxt.dir.is_contiguous;
#else #else
(*foundnode)->file_size = grub_le_to_cpu32 (ctxt.dir.file_size); data->file_size = grub_le_to_cpu32 (ctxt.dir.file_size);
(*foundnode)->file_cluster = ((grub_le_to_cpu16 (ctxt.dir.first_cluster_high) << 16) data->file_cluster = ((grub_le_to_cpu16 (ctxt.dir.first_cluster_high) << 16)
| grub_le_to_cpu16 (ctxt.dir.first_cluster_low)); | grub_le_to_cpu16 (ctxt.dir.first_cluster_low));
/* If directory points to root, starting cluster is 0 */
if (!(*foundnode)->file_cluster)
(*foundnode)->file_cluster = node->data->root_cluster;
#endif #endif
(*foundnode)->cur_cluster_num = ~0U; data->cur_cluster_num = ~0U;
(*foundnode)->data = node->data;
(*foundnode)->disk = node->disk;
*foundtype = ((*foundnode)->attr & GRUB_FAT_ATTR_DIRECTORY) ? GRUB_FSHELP_DIR : GRUB_FSHELP_REG; if (call_hook)
hook (ctxt.filename, &info, hook_data);
grub_fat_iterate_fini (&ctxt); break;
return GRUB_ERR_NONE;
} }
} }
@@ -910,8 +949,13 @@ static grub_err_t lookup_file (grub_fshelp_node_t node,
if (err == GRUB_ERR_EOF) if (err == GRUB_ERR_EOF)
err = 0; err = 0;
return err; if (grub_errno == GRUB_ERR_NONE && ! found && !call_hook)
grub_error (GRUB_ERR_FILE_NOT_FOUND, N_("file `%s' not found"), origpath);
fail:
grub_free (dirname);
return found ? dirp : 0;
} }
static grub_err_t static grub_err_t
@@ -920,9 +964,9 @@ grub_fat_dir (grub_device_t device, const char *path, grub_fs_dir_hook_t hook,
{ {
struct grub_fat_data *data = 0; struct grub_fat_data *data = 0;
grub_disk_t disk = device->disk; grub_disk_t disk = device->disk;
grub_fshelp_node_t found = NULL; grub_size_t len;
grub_err_t err; char *dirname = 0;
struct grub_fat_iterate_context ctxt; char *p;
grub_dl_ref (my_mod); grub_dl_ref (my_mod);
@@ -930,53 +974,27 @@ grub_fat_dir (grub_device_t device, const char *path, grub_fs_dir_hook_t hook,
if (! data) if (! data)
goto fail; goto fail;
struct grub_fshelp_node root = { /* Make sure that DIRNAME terminates with '/'. */
.data = data, len = grub_strlen (path);
.disk = disk, dirname = grub_malloc (len + 1 + 1);
.attr = GRUB_FAT_ATTR_DIRECTORY, if (! dirname)
.file_size = 0,
.file_cluster = data->root_cluster,
.cur_cluster_num = ~0U,
.cur_cluster = 0,
#ifdef MODE_EXFAT
.is_contiguous = 0,
#endif
};
err = grub_fshelp_find_file_lookup (path, &root, &found, lookup_file, NULL, GRUB_FSHELP_DIR);
if (err)
goto fail; goto fail;
grub_memcpy (dirname, path, len);
p = dirname + len;
if (path[len - 1] != '/')
*p++ = '/';
*p = '\0';
p = dirname;
err = grub_fat_iterate_init (&ctxt); do
if (err)
goto fail;
while (!(err = grub_fat_iterate_dir_next (found, &ctxt)))
{ {
struct grub_dirhook_info info; p = grub_fat_find_dir (disk, data, p, path, hook, hook_data);
grub_memset (&info, 0, sizeof (info));
info.dir = !! (ctxt.dir.attr & GRUB_FAT_ATTR_DIRECTORY);
info.case_insensitive = 1;
#ifdef MODE_EXFAT
if (!ctxt.dir.have_stream)
continue;
#else
if (ctxt.dir.attr & GRUB_FAT_ATTR_VOLUME_ID)
continue;
#endif
if (hook (ctxt.filename, &info, hook_data))
break;
} }
grub_fat_iterate_fini (&ctxt); while (p && grub_errno == GRUB_ERR_NONE);
if (err == GRUB_ERR_EOF)
err = 0;
fail: fail:
if (found != &root)
grub_free (found);
grub_free (dirname);
grub_free (data); grub_free (data);
grub_dl_unref (my_mod); grub_dl_unref (my_mod);
@@ -988,43 +1006,35 @@ static grub_err_t
grub_fat_open (grub_file_t file, const char *name) grub_fat_open (grub_file_t file, const char *name)
{ {
struct grub_fat_data *data = 0; struct grub_fat_data *data = 0;
grub_fshelp_node_t found = NULL; char *p = (char *) name;
grub_err_t err;
grub_disk_t disk = file->device->disk;
grub_dl_ref (my_mod); grub_dl_ref (my_mod);
data = grub_fat_mount (disk); data = grub_fat_mount (file->device->disk);
if (! data) if (! data)
goto fail; goto fail;
struct grub_fshelp_node root = { do
.data = data, {
.disk = disk, p = grub_fat_find_dir (file->device->disk, data, p, name, 0, 0);
.attr = GRUB_FAT_ATTR_DIRECTORY, if (grub_errno != GRUB_ERR_NONE)
.file_size = 0,
.file_cluster = data->root_cluster,
.cur_cluster_num = ~0U,
.cur_cluster = 0,
#ifdef MODE_EXFAT
.is_contiguous = 0,
#endif
};
err = grub_fshelp_find_file_lookup (name, &root, &found, lookup_file, NULL, GRUB_FSHELP_REG);
if (err)
goto fail; goto fail;
}
while (p);
file->data = found; if (data->attr & GRUB_FAT_ATTR_DIRECTORY)
file->size = found->file_size; {
grub_error (GRUB_ERR_BAD_FILE_TYPE, N_("not a regular file"));
goto fail;
}
file->data = data;
file->size = data->file_size;
return GRUB_ERR_NONE; return GRUB_ERR_NONE;
fail: fail:
if (found != &root)
grub_free (found);
grub_free (data); grub_free (data);
grub_dl_unref (my_mod); grub_dl_unref (my_mod);
@@ -1043,10 +1053,7 @@ grub_fat_read (grub_file_t file, char *buf, grub_size_t len)
static grub_err_t static grub_err_t
grub_fat_close (grub_file_t file) grub_fat_close (grub_file_t file)
{ {
grub_fshelp_node_t node = file->data; grub_free (file->data);
grub_free (node->data);
grub_free (node);
grub_dl_unref (my_mod); grub_dl_unref (my_mod);
@@ -1059,29 +1066,20 @@ grub_fat_label (grub_device_t device, char **label)
{ {
struct grub_fat_dir_entry dir; struct grub_fat_dir_entry dir;
grub_ssize_t offset = -sizeof(dir); grub_ssize_t offset = -sizeof(dir);
struct grub_fat_data *data;
grub_disk_t disk = device->disk; grub_disk_t disk = device->disk;
struct grub_fshelp_node root = {
.disk = disk,
.attr = GRUB_FAT_ATTR_DIRECTORY,
.file_size = 0,
.cur_cluster_num = ~0U,
.cur_cluster = 0,
.is_contiguous = 0,
};
root.data = grub_fat_mount (disk); data = grub_fat_mount (disk);
if (! root.data) if (! data)
return grub_errno; return grub_errno;
root.file_cluster = root.data->root_cluster;
*label = NULL; *label = NULL;
while (1) while (1)
{ {
offset += sizeof (dir); offset += sizeof (dir);
if (grub_fat_read_data (disk, &root, 0, 0, if (grub_fat_read_data (disk, data, 0, 0,
offset, sizeof (dir), (char *) &dir) offset, sizeof (dir), (char *) &dir)
!= sizeof (dir)) != sizeof (dir))
break; break;
@@ -1101,7 +1099,7 @@ grub_fat_label (grub_device_t device, char **label)
* GRUB_MAX_UTF8_PER_UTF16 + 1); * GRUB_MAX_UTF8_PER_UTF16 + 1);
if (!*label) if (!*label)
{ {
grub_free (root.data); grub_free (data);
return grub_errno; return grub_errno;
} }
chc = dir.type_specific.volume_label.character_count; chc = dir.type_specific.volume_label.character_count;
@@ -1113,7 +1111,7 @@ grub_fat_label (grub_device_t device, char **label)
} }
} }
grub_free (root.data); grub_free (data);
return grub_errno; return grub_errno;
} }
@@ -1122,32 +1120,30 @@ grub_fat_label (grub_device_t device, char **label)
static grub_err_t static grub_err_t
grub_fat_label (grub_device_t device, char **label) grub_fat_label (grub_device_t device, char **label)
{ {
struct grub_fat_data *data;
grub_disk_t disk = device->disk; grub_disk_t disk = device->disk;
grub_err_t err; grub_err_t err;
struct grub_fat_iterate_context ctxt; struct grub_fat_iterate_context ctxt;
struct grub_fshelp_node root = {
.disk = disk,
.attr = GRUB_FAT_ATTR_DIRECTORY,
.file_size = 0,
.cur_cluster_num = ~0U,
.cur_cluster = 0,
};
*label = 0; *label = 0;
grub_dl_ref (my_mod); grub_dl_ref (my_mod);
root.data = grub_fat_mount (disk); data = grub_fat_mount (disk);
if (! root.data) if (! data)
goto fail; goto fail;
root.file_cluster = root.data->root_cluster; if (! (data->attr & GRUB_FAT_ATTR_DIRECTORY))
{
grub_error (GRUB_ERR_BAD_FILE_TYPE, N_("not a directory"));
return 0;
}
err = grub_fat_iterate_init (&ctxt); err = grub_fat_iterate_init (&ctxt);
if (err) if (err)
goto fail; goto fail;
while (!(err = grub_fat_iterate_dir_next (&root, &ctxt))) while (!(err = grub_fat_iterate_dir_next (disk, data, &ctxt)))
if ((ctxt.dir.attr & ~GRUB_FAT_ATTR_ARCHIVE) == GRUB_FAT_ATTR_VOLUME_ID) if ((ctxt.dir.attr & ~GRUB_FAT_ATTR_ARCHIVE) == GRUB_FAT_ATTR_VOLUME_ID)
{ {
*label = grub_strdup (ctxt.filename); *label = grub_strdup (ctxt.filename);
@@ -1160,7 +1156,7 @@ grub_fat_label (grub_device_t device, char **label)
grub_dl_unref (my_mod); grub_dl_unref (my_mod);
grub_free (root.data); grub_free (data);
return grub_errno; return grub_errno;
} }
+101 -211
View File
@@ -30,287 +30,169 @@ GRUB_MOD_LICENSE ("GPLv3+");
typedef int (*iterate_dir_func) (grub_fshelp_node_t dir, typedef int (*iterate_dir_func) (grub_fshelp_node_t dir,
grub_fshelp_iterate_dir_hook_t hook, grub_fshelp_iterate_dir_hook_t hook,
void *data); void *data);
typedef grub_err_t (*lookup_file_func) (grub_fshelp_node_t dir,
const char *name,
grub_fshelp_node_t *foundnode,
enum grub_fshelp_filetype *foundtype);
typedef char *(*read_symlink_func) (grub_fshelp_node_t node); typedef char *(*read_symlink_func) (grub_fshelp_node_t node);
struct stack_element {
struct stack_element *parent;
grub_fshelp_node_t node;
enum grub_fshelp_filetype type;
};
/* Context for grub_fshelp_find_file. */ /* Context for grub_fshelp_find_file. */
struct grub_fshelp_find_file_ctx struct grub_fshelp_find_file_ctx
{ {
/* Inputs. */
const char *path; const char *path;
grub_fshelp_node_t rootnode; grub_fshelp_node_t rootnode, currroot, currnode, oldnode;
enum grub_fshelp_filetype foundtype;
/* Global options. */
int symlinknest; int symlinknest;
const char *name;
/* Current file being traversed and its parents. */ const char *next;
struct stack_element *currnode; enum grub_fshelp_filetype type;
}; };
/* Helper for find_file_iter. */ /* Helper for find_file_iter. */
static void static void
free_node (grub_fshelp_node_t node, struct grub_fshelp_find_file_ctx *ctx) free_node (grub_fshelp_node_t node, struct grub_fshelp_find_file_ctx *ctx)
{ {
if (node != ctx->rootnode) if (node != ctx->rootnode && node != ctx->currroot)
grub_free (node); grub_free (node);
} }
static void
pop_element (struct grub_fshelp_find_file_ctx *ctx)
{
struct stack_element *el;
el = ctx->currnode;
ctx->currnode = el->parent;
free_node (el->node, ctx);
grub_free (el);
}
static void
free_stack (struct grub_fshelp_find_file_ctx *ctx)
{
while (ctx->currnode)
pop_element (ctx);
}
static void
go_up_a_level (struct grub_fshelp_find_file_ctx *ctx)
{
if (!ctx->currnode->parent)
return;
pop_element (ctx);
}
static grub_err_t
push_node (struct grub_fshelp_find_file_ctx *ctx, grub_fshelp_node_t node, enum grub_fshelp_filetype filetype)
{
struct stack_element *nst;
nst = grub_malloc (sizeof (*nst));
if (!nst)
return grub_errno;
nst->node = node;
nst->type = filetype & ~GRUB_FSHELP_CASE_INSENSITIVE;
nst->parent = ctx->currnode;
ctx->currnode = nst;
return GRUB_ERR_NONE;
}
static grub_err_t
go_to_root (struct grub_fshelp_find_file_ctx *ctx)
{
free_stack (ctx);
return push_node (ctx, ctx->rootnode, GRUB_FSHELP_DIR);
}
struct grub_fshelp_find_file_iter_ctx
{
const char *name;
grub_fshelp_node_t *foundnode;
enum grub_fshelp_filetype *foundtype;
};
/* Helper for grub_fshelp_find_file. */ /* Helper for grub_fshelp_find_file. */
static int static int
find_file_iter (const char *filename, enum grub_fshelp_filetype filetype, find_file_iter (const char *filename, enum grub_fshelp_filetype filetype,
grub_fshelp_node_t node, void *data) grub_fshelp_node_t node, void *data)
{ {
struct grub_fshelp_find_file_iter_ctx *ctx = data; struct grub_fshelp_find_file_ctx *ctx = data;
if (filetype == GRUB_FSHELP_UNKNOWN || if (filetype == GRUB_FSHELP_UNKNOWN ||
((filetype & GRUB_FSHELP_CASE_INSENSITIVE) ((filetype & GRUB_FSHELP_CASE_INSENSITIVE)
? grub_strcasecmp (ctx->name, filename) ? grub_strncasecmp (ctx->name, filename, ctx->next - ctx->name)
: grub_strcmp (ctx->name, filename))) : grub_strncmp (ctx->name, filename, ctx->next - ctx->name))
|| filename[ctx->next - ctx->name])
{ {
grub_free (node); grub_free (node);
return 0; return 0;
} }
/* The node is found, stop iterating over the nodes. */ /* The node is found, stop iterating over the nodes. */
*ctx->foundnode = node; ctx->type = filetype & ~GRUB_FSHELP_CASE_INSENSITIVE;
*ctx->foundtype = filetype; ctx->oldnode = ctx->currnode;
ctx->currnode = node;
return 1; return 1;
} }
static grub_err_t static grub_err_t
directory_find_file (grub_fshelp_node_t node, const char *name, grub_fshelp_node_t *foundnode, find_file (const char *currpath, grub_fshelp_node_t currroot,
enum grub_fshelp_filetype *foundtype, iterate_dir_func iterate_dir) grub_fshelp_node_t *currfound,
{ iterate_dir_func iterate_dir, read_symlink_func read_symlink,
int found;
struct grub_fshelp_find_file_iter_ctx ctx = {
.foundnode = foundnode,
.foundtype = foundtype,
.name = name
};
found = iterate_dir (node, find_file_iter, &ctx);
if (! found)
{
if (grub_errno)
return grub_errno;
}
return GRUB_ERR_NONE;
}
static grub_err_t
find_file (char *currpath,
iterate_dir_func iterate_dir, lookup_file_func lookup_file,
read_symlink_func read_symlink,
struct grub_fshelp_find_file_ctx *ctx) struct grub_fshelp_find_file_ctx *ctx)
{ {
char *name, *next; ctx->currroot = currroot;
grub_err_t err; ctx->name = currpath;
for (name = currpath; ; name = next) ctx->type = GRUB_FSHELP_DIR;
ctx->currnode = currroot;
ctx->oldnode = currroot;
for (;;)
{ {
char c; int found;
grub_fshelp_node_t foundnode = NULL;
enum grub_fshelp_filetype foundtype = 0;
/* Remove all leading slashes. */ /* Remove all leading slashes. */
while (*name == '/') while (*ctx->name == '/')
name++; ctx->name++;
/* Found the node! */ /* Found the node! */
if (! *name) if (! *ctx->name)
{
*currfound = ctx->currnode;
ctx->foundtype = ctx->type;
return 0; return 0;
}
/* Extract the actual part from the pathname. */ /* Extract the actual part from the pathname. */
for (next = name; *next && *next != '/'; next++); for (ctx->next = ctx->name; *ctx->next && *ctx->next != '/'; ctx->next++);
/* At this point it is expected that the current node is a /* At this point it is expected that the current node is a
directory, check if this is true. */ directory, check if this is true. */
if (ctx->currnode->type != GRUB_FSHELP_DIR) if (ctx->type != GRUB_FSHELP_DIR)
return grub_error (GRUB_ERR_BAD_FILE_TYPE, N_("not a directory"));
/* Don't rely on fs providing actual . in the listing. */
if (next - name == 1 && name[0] == '.')
continue;
/* Don't rely on fs providing actual .. in the listing. */
if (next - name == 2 && name[0] == '.' && name[1] == '.')
{ {
go_up_a_level (ctx); free_node (ctx->currnode, ctx);
continue; ctx->currnode = 0;
return grub_error (GRUB_ERR_BAD_FILE_TYPE, N_("not a directory"));
} }
/* Iterate over the directory. */ /* Iterate over the directory. */
c = *next; found = iterate_dir (ctx->currnode, find_file_iter, ctx);
*next = '\0'; if (! found)
if (lookup_file) {
err = lookup_file (ctx->currnode->node, name, &foundnode, &foundtype); free_node (ctx->currnode, ctx);
else ctx->currnode = 0;
err = directory_find_file (ctx->currnode->node, name, &foundnode, &foundtype, iterate_dir); if (grub_errno)
*next = c; return grub_errno;
if (err)
return err;
if (!foundnode)
break; break;
}
push_node (ctx, foundnode, foundtype);
/* Read in the symlink and follow it. */ /* Read in the symlink and follow it. */
if (ctx->currnode->type == GRUB_FSHELP_SYMLINK) if (ctx->type == GRUB_FSHELP_SYMLINK)
{ {
char *symlink; char *symlink;
const char *next;
/* Test if the symlink does not loop. */ /* Test if the symlink does not loop. */
if (++ctx->symlinknest == 8) if (++ctx->symlinknest == 8)
{
free_node (ctx->currnode, ctx);
free_node (ctx->oldnode, ctx);
ctx->currnode = 0;
ctx->oldnode = 0;
return grub_error (GRUB_ERR_SYMLINK_LOOP, return grub_error (GRUB_ERR_SYMLINK_LOOP,
N_("too deep nesting of symlinks")); N_("too deep nesting of symlinks"));
}
symlink = read_symlink (ctx->currnode->node); symlink = read_symlink (ctx->currnode);
free_node (ctx->currnode, ctx);
ctx->currnode = 0;
if (!symlink) if (!symlink)
{
free_node (ctx->oldnode, ctx);
ctx->oldnode = 0;
return grub_errno; return grub_errno;
}
/* The symlink is an absolute path, go back to the root inode. */ /* The symlink is an absolute path, go back to the root inode. */
if (symlink[0] == '/') if (symlink[0] == '/')
{ {
err = go_to_root (ctx); free_node (ctx->oldnode, ctx);
if (err) ctx->oldnode = ctx->rootnode;
return err;
} }
else
{
/* Get from symlink to containing directory. */
go_up_a_level (ctx);
}
/* Lookup the node the symlink points to. */ /* Lookup the node the symlink points to. */
find_file (symlink, iterate_dir, lookup_file, read_symlink, ctx); next = ctx->next;
find_file (symlink, ctx->oldnode, &ctx->currnode,
iterate_dir, read_symlink, ctx);
ctx->next = next;
ctx->type = ctx->foundtype;
grub_free (symlink); grub_free (symlink);
if (grub_errno) if (grub_errno)
{
free_node (ctx->oldnode, ctx);
ctx->oldnode = 0;
return grub_errno; return grub_errno;
} }
} }
if (ctx->oldnode != ctx->currnode)
{
free_node (ctx->oldnode, ctx);
ctx->oldnode = 0;
}
ctx->name = ctx->next;
}
return grub_error (GRUB_ERR_FILE_NOT_FOUND, N_("file `%s' not found"), return grub_error (GRUB_ERR_FILE_NOT_FOUND, N_("file `%s' not found"),
ctx->path); ctx->path);
} }
static grub_err_t
grub_fshelp_find_file_real (const char *path, grub_fshelp_node_t rootnode,
grub_fshelp_node_t *foundnode,
iterate_dir_func iterate_dir,
lookup_file_func lookup_file,
read_symlink_func read_symlink,
enum grub_fshelp_filetype expecttype)
{
struct grub_fshelp_find_file_ctx ctx = {
.path = path,
.rootnode = rootnode,
.symlinknest = 0,
.currnode = 0
};
grub_err_t err;
enum grub_fshelp_filetype foundtype;
char *duppath;
if (!path || path[0] != '/')
{
return grub_error (GRUB_ERR_BAD_FILENAME, N_("invalid file name `%s'"), path);
}
err = go_to_root (&ctx);
if (err)
return err;
duppath = grub_strdup (path);
if (!duppath)
return grub_errno;
err = find_file (duppath, iterate_dir, lookup_file, read_symlink, &ctx);
grub_free (duppath);
if (err)
{
free_stack (&ctx);
return err;
}
*foundnode = ctx.currnode->node;
foundtype = ctx.currnode->type;
/* Avoid the node being freed. */
ctx.currnode->node = 0;
free_stack (&ctx);
/* Check if the node that was found was of the expected type. */
if (expecttype == GRUB_FSHELP_REG && foundtype != expecttype)
return grub_error (GRUB_ERR_BAD_FILE_TYPE, N_("not a regular file"));
else if (expecttype == GRUB_FSHELP_DIR && foundtype != expecttype)
return grub_error (GRUB_ERR_BAD_FILE_TYPE, N_("not a directory"));
return 0;
}
/* Lookup the node PATH. The node ROOTNODE describes the root of the /* Lookup the node PATH. The node ROOTNODE describes the root of the
directory tree. The node found is returned in FOUNDNODE, which is directory tree. The node found is returned in FOUNDNODE, which is
either a ROOTNODE or a new malloc'ed node. ITERATE_DIR is used to either a ROOTNODE or a new malloc'ed node. ITERATE_DIR is used to
@@ -325,23 +207,31 @@ grub_fshelp_find_file (const char *path, grub_fshelp_node_t rootnode,
read_symlink_func read_symlink, read_symlink_func read_symlink,
enum grub_fshelp_filetype expecttype) enum grub_fshelp_filetype expecttype)
{ {
return grub_fshelp_find_file_real (path, rootnode, foundnode, struct grub_fshelp_find_file_ctx ctx = {
iterate_dir, NULL, .path = path,
read_symlink, expecttype); .rootnode = rootnode,
.foundtype = GRUB_FSHELP_DIR,
.symlinknest = 0
};
grub_err_t err;
} if (!path || path[0] != '/')
{
grub_error (GRUB_ERR_BAD_FILENAME, N_("invalid file name `%s'"), path);
return grub_errno;
}
grub_err_t err = find_file (path, rootnode, foundnode, iterate_dir, read_symlink, &ctx);
grub_fshelp_find_file_lookup (const char *path, grub_fshelp_node_t rootnode, if (err)
grub_fshelp_node_t *foundnode, return err;
lookup_file_func lookup_file,
read_symlink_func read_symlink,
enum grub_fshelp_filetype expecttype)
{
return grub_fshelp_find_file_real (path, rootnode, foundnode,
NULL, lookup_file,
read_symlink, expecttype);
/* Check if the node that was found was of the expected type. */
if (expecttype == GRUB_FSHELP_REG && ctx.foundtype != expecttype)
return grub_error (GRUB_ERR_BAD_FILE_TYPE, N_("not a regular file"));
else if (expecttype == GRUB_FSHELP_DIR && ctx.foundtype != expecttype)
return grub_error (GRUB_ERR_BAD_FILE_TYPE, N_("not a directory"));
return 0;
} }
/* Read LEN bytes from the file NODE on disk DISK into the buffer BUF, /* Read LEN bytes from the file NODE on disk DISK into the buffer BUF,
+103 -96
View File
@@ -29,7 +29,6 @@
#include <grub/types.h> #include <grub/types.h>
#include <grub/hfs.h> #include <grub/hfs.h>
#include <grub/i18n.h> #include <grub/i18n.h>
#include <grub/fshelp.h>
GRUB_MOD_LICENSE ("GPLv3+"); GRUB_MOD_LICENSE ("GPLv3+");
@@ -693,7 +692,6 @@ 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)
@@ -712,12 +710,8 @@ 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 < reccnt; i++) for (i = 0; i < grub_be_to_cpu16 (node->node.reccnt); i++)
{ {
int pos = (nodesize >> 1) - 1 - i; int pos = (nodesize >> 1) - 1 - i;
struct pointer struct pointer
@@ -725,19 +719,16 @@ 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;
grub_uint16_t off = grub_be_to_cpu16 (node->offsets[pos]); pnt = (struct pointer *) (grub_be_to_cpu16 (node->offsets[pos])
if (off > nodesize - sizeof(*pnt)) + node->rawnode);
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 - off - pnt->keylen - 1 nodesize - grub_be_to_cpu16 (node->offsets[pos])
- pnt->keylen - 1
}; };
if (node_hook (&node->node, &rec, hook_arg)) if (node_hook (&node->node, &rec, hook_arg))
@@ -1126,81 +1117,90 @@ utf8_to_macroman (grub_uint8_t *to, const char *from)
return optr - to; return optr - to;
} }
union grub_hfs_anyrec {
struct grub_hfs_filerec frec;
struct grub_hfs_dirrec dir;
};
struct grub_fshelp_node
{
struct grub_hfs_data *data;
union grub_hfs_anyrec fdrec;
grub_uint32_t inode;
};
static grub_err_t
lookup_file (grub_fshelp_node_t dir,
const char *name,
grub_fshelp_node_t *foundnode,
enum grub_fshelp_filetype *foundtype)
{
struct grub_hfs_catalog_key key;
grub_ssize_t slen;
union grub_hfs_anyrec fdrec;
key.parent_dir = grub_cpu_to_be32 (dir->inode);
slen = utf8_to_macroman (key.str, name);
if (slen < 0)
/* Not found */
return GRUB_ERR_NONE;
key.strlen = slen;
/* Lookup this node. */
if (! grub_hfs_find_node (dir->data, (char *) &key, dir->data->cat_root,
0, (char *) &fdrec.frec, sizeof (fdrec.frec)))
/* Not found */
return GRUB_ERR_NONE;
*foundnode = grub_malloc (sizeof (struct grub_fshelp_node));
if (!*foundnode)
return grub_errno;
(*foundnode)->inode = grub_be_to_cpu32 (fdrec.dir.dirid);
(*foundnode)->fdrec = fdrec;
(*foundnode)->data = dir->data;
*foundtype = (fdrec.frec.type == GRUB_HFS_FILETYPE_DIR) ? GRUB_FSHELP_DIR : GRUB_FSHELP_REG;
return GRUB_ERR_NONE;
}
/* Find a file or directory with the pathname PATH in the filesystem /* Find a file or directory with the pathname PATH in the filesystem
DATA. Return the file record in RETDATA when it is non-zero. DATA. Return the file record in RETDATA when it is non-zero.
Return the directory number in RETINODE when it is non-zero. */ Return the directory number in RETINODE when it is non-zero. */
static grub_err_t static grub_err_t
grub_hfs_find_dir (struct grub_hfs_data *data, const char *path, grub_hfs_find_dir (struct grub_hfs_data *data, const char *path,
grub_fshelp_node_t *found, struct grub_hfs_filerec *retdata, int *retinode)
enum grub_fshelp_filetype exptype)
{ {
struct grub_fshelp_node root = { int inode = data->rootdir;
.data = data, char *next;
.inode = data->rootdir, char *origpath;
.fdrec = { union {
.frec = { struct grub_hfs_filerec frec;
.type = GRUB_HFS_FILETYPE_DIR struct grub_hfs_dirrec dir;
} } fdrec;
}
};
grub_err_t err;
err = grub_fshelp_find_file_lookup (path, &root, found, lookup_file, NULL, exptype); fdrec.frec.type = GRUB_HFS_FILETYPE_DIR;
if (&root == *found) if (path[0] != '/')
{ {
*found = grub_malloc (sizeof (root)); grub_error (GRUB_ERR_BAD_FILENAME, N_("invalid file name `%s'"), path);
if (!*found) return 0;
return grub_errno;
grub_memcpy (*found, &root, sizeof (root));
} }
return err;
origpath = grub_strdup (path);
if (!origpath)
return grub_errno;
path = origpath;
while (*path == '/')
path++;
while (path && grub_strlen (path))
{
grub_ssize_t slen;
if (fdrec.frec.type != GRUB_HFS_FILETYPE_DIR)
{
grub_error (GRUB_ERR_BAD_FILE_TYPE, N_("not a directory"));
goto fail;
}
/* Isolate a part of the path. */
next = grub_strchr (path, '/');
if (next)
{
while (*next == '/')
*(next++) = '\0';
}
struct grub_hfs_catalog_key key;
key.parent_dir = grub_cpu_to_be32 (inode);
slen = utf8_to_macroman (key.str, path);
if (slen < 0)
{
grub_error (GRUB_ERR_FILE_NOT_FOUND, N_("file `%s' not found"), path);
goto fail;
}
key.strlen = slen;
/* Lookup this node. */
if (! grub_hfs_find_node (data, (char *) &key, data->cat_root,
0, (char *) &fdrec.frec, sizeof (fdrec.frec)))
{
grub_error (GRUB_ERR_FILE_NOT_FOUND, N_("file `%s' not found"), origpath);
goto fail;
}
if (grub_errno)
goto fail;
inode = grub_be_to_cpu32 (fdrec.dir.dirid);
path = next;
}
if (retdata)
grub_memcpy (retdata, &fdrec.frec, sizeof (fdrec.frec));
if (retinode)
*retinode = inode;
fail:
grub_free (origpath);
return grub_errno;
} }
struct grub_hfs_dir_hook_ctx struct grub_hfs_dir_hook_ctx
@@ -1258,13 +1258,15 @@ static grub_err_t
grub_hfs_dir (grub_device_t device, const char *path, grub_fs_dir_hook_t hook, grub_hfs_dir (grub_device_t device, const char *path, grub_fs_dir_hook_t hook,
void *hook_data) void *hook_data)
{ {
int inode;
struct grub_hfs_data *data; struct grub_hfs_data *data;
struct grub_hfs_filerec frec;
struct grub_hfs_dir_hook_ctx ctx = struct grub_hfs_dir_hook_ctx ctx =
{ {
.hook = hook, .hook = hook,
.hook_data = hook_data .hook_data = hook_data
}; };
grub_fshelp_node_t found = NULL;
grub_dl_ref (my_mod); grub_dl_ref (my_mod);
@@ -1273,13 +1275,18 @@ grub_hfs_dir (grub_device_t device, const char *path, grub_fs_dir_hook_t hook,
goto fail; goto fail;
/* First the directory ID for the directory. */ /* First the directory ID for the directory. */
if (grub_hfs_find_dir (data, path, &found, GRUB_FSHELP_DIR)) if (grub_hfs_find_dir (data, path, &frec, &inode))
goto fail; goto fail;
grub_hfs_iterate_dir (data, data->cat_root, found->inode, grub_hfs_dir_hook, &ctx); if (frec.type != GRUB_HFS_FILETYPE_DIR)
{
grub_error (GRUB_ERR_BAD_FILE_TYPE, N_("not a directory"));
goto fail;
}
grub_hfs_iterate_dir (data, data->cat_root, inode, grub_hfs_dir_hook, &ctx);
fail: fail:
grub_free (found);
grub_free (data); grub_free (data);
grub_dl_unref (my_mod); grub_dl_unref (my_mod);
@@ -1293,35 +1300,35 @@ static grub_err_t
grub_hfs_open (struct grub_file *file, const char *name) grub_hfs_open (struct grub_file *file, const char *name)
{ {
struct grub_hfs_data *data; struct grub_hfs_data *data;
grub_fshelp_node_t found = NULL; struct grub_hfs_filerec frec;
grub_dl_ref (my_mod); grub_dl_ref (my_mod);
data = grub_hfs_mount (file->device->disk); data = grub_hfs_mount (file->device->disk);
if (!data) if (grub_hfs_find_dir (data, name, &frec, 0))
{
grub_dl_unref (my_mod);
return grub_errno;
}
if (grub_hfs_find_dir (data, name, &found, GRUB_FSHELP_REG))
{ {
grub_free (data); grub_free (data);
grub_dl_unref (my_mod); grub_dl_unref (my_mod);
return grub_errno; return grub_errno;
} }
grub_memcpy (data->extents, found->fdrec.frec.extents, sizeof (grub_hfs_datarecord_t)); if (frec.type != GRUB_HFS_FILETYPE_FILE)
file->size = grub_be_to_cpu32 (found->fdrec.frec.size); {
data->size = grub_be_to_cpu32 (found->fdrec.frec.size); grub_free (data);
data->fileid = grub_be_to_cpu32 (found->fdrec.frec.fileid); grub_error (GRUB_ERR_BAD_FILE_TYPE, N_("not a regular file"));
grub_dl_unref (my_mod);
return grub_errno;
}
grub_memcpy (data->extents, frec.extents, sizeof (grub_hfs_datarecord_t));
file->size = grub_be_to_cpu32 (frec.size);
data->size = grub_be_to_cpu32 (frec.size);
data->fileid = grub_be_to_cpu32 (frec.fileid);
file->offset = 0; file->offset = 0;
file->data = data; file->data = data;
grub_free (found);
return 0; return 0;
} }
+4 -16
View File
@@ -336,9 +336,6 @@ grub_hfsplus_mount (grub_disk_t disk)
data->case_sensitive = ((magic == GRUB_HFSPLUSX_MAGIC) && data->case_sensitive = ((magic == GRUB_HFSPLUSX_MAGIC) &&
(header.key_compare == GRUB_HFSPLUSX_BINARYCOMPARE)); (header.key_compare == GRUB_HFSPLUSX_BINARYCOMPARE));
if (data->catalog_tree.nodesize < 2)
goto fail;
if (grub_hfsplus_read_file (&data->extoverflow_tree.file, 0, 0, if (grub_hfsplus_read_file (&data->extoverflow_tree.file, 0, 0,
sizeof (struct grub_hfsplus_btnode), sizeof (struct grub_hfsplus_btnode),
sizeof (header), (char *) &header) <= 0) sizeof (header), (char *) &header) <= 0)
@@ -353,9 +350,6 @@ grub_hfsplus_mount (grub_disk_t disk)
data->extoverflow_tree.root = grub_be_to_cpu32 (header.root); data->extoverflow_tree.root = grub_be_to_cpu32 (header.root);
data->extoverflow_tree.nodesize = grub_be_to_cpu16 (header.nodesize); data->extoverflow_tree.nodesize = grub_be_to_cpu16 (header.nodesize);
if (data->extoverflow_tree.nodesize < 2)
goto fail;
if (grub_hfsplus_read_file (&data->attr_tree.file, 0, 0, if (grub_hfsplus_read_file (&data->attr_tree.file, 0, 0,
sizeof (struct grub_hfsplus_btnode), sizeof (struct grub_hfsplus_btnode),
sizeof (header), (char *) &header) <= 0) sizeof (header), (char *) &header) <= 0)
@@ -729,11 +723,8 @@ 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';
@@ -754,10 +745,7 @@ 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;
@@ -792,8 +780,8 @@ grub_hfsplus_iterate_dir (grub_fshelp_node_t dir,
}; };
struct grub_hfsplus_key_internal intern; struct grub_hfsplus_key_internal intern;
struct grub_hfsplus_btnode *node = NULL; struct grub_hfsplus_btnode *node;
grub_disk_addr_t ptr = 0; grub_disk_addr_t ptr;
{ {
struct grub_fshelp_node *fsnode; struct grub_fshelp_node *fsnode;
@@ -976,8 +964,8 @@ grub_hfsplus_label (grub_device_t device, char **label)
struct grub_hfsplus_catkey *catkey; struct grub_hfsplus_catkey *catkey;
int i, label_len; int i, label_len;
struct grub_hfsplus_key_internal intern; struct grub_hfsplus_key_internal intern;
struct grub_hfsplus_btnode *node = NULL; struct grub_hfsplus_btnode *node;
grub_disk_addr_t ptr = 0; grub_disk_addr_t ptr;
*label = 0; *label = 0;
+2 -3
View File
@@ -959,15 +959,14 @@ 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;
err = read_node (data->node, file->offset, len, buf); read_node (data->node, file->offset, len, buf);
data->disk->read_hook = NULL; data->disk->read_hook = NULL;
if (err || grub_errno) if (grub_errno)
return -1; return -1;
return len; return len;
+15 -22
View File
@@ -82,6 +82,17 @@ 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
#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
@@ -171,23 +182,6 @@ 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,
@@ -196,7 +190,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(data, zone), GRUB_MINIX_ZONE2SECT(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);
@@ -287,7 +281,7 @@ grub_minix_read_file (struct grub_minix_data *data,
for (i = posblock; i < blockcnt; i++) for (i = posblock; i < blockcnt; i++)
{ {
grub_minix_uintn_t blknr; grub_disk_addr_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;
@@ -316,7 +310,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(data, blknr), GRUB_MINIX_ZONE2SECT(blknr),
skipfirst, blockend, buf); skipfirst, blockend, buf);
data->disk->read_hook = 0; data->disk->read_hook = 0;
if (grub_errno) if (grub_errno)
@@ -342,8 +336,7 @@ 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 (data, block = GRUB_MINIX_ZONE2SECT (2 + grub_minix_to_cpu16 (sblock->inode_bmap_size)
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
-7
View File
@@ -618,10 +618,7 @@ 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;
@@ -920,16 +917,12 @@ 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);
+24 -54
View File
@@ -22,7 +22,6 @@
#include <grub/file.h> #include <grub/file.h>
#include <grub/mm.h> #include <grub/mm.h>
#include <grub/dl.h> #include <grub/dl.h>
#include <grub/archelp.h>
GRUB_MOD_LICENSE ("GPLv3+"); GRUB_MOD_LICENSE ("GPLv3+");
@@ -75,44 +74,6 @@ grub_procdev_write (grub_disk_t disk __attribute ((unused)),
return GRUB_ERR_OUT_OF_RANGE; return GRUB_ERR_OUT_OF_RANGE;
} }
struct grub_archelp_data
{
struct grub_procfs_entry *entry, *next_entry;
};
static void
grub_procfs_rewind (struct grub_archelp_data *data)
{
data->entry = NULL;
data->next_entry = grub_procfs_entries;
}
static grub_err_t
grub_procfs_find_file (struct grub_archelp_data *data, char **name,
grub_int32_t *mtime,
grub_uint32_t *mode)
{
data->entry = data->next_entry;
if (!data->entry)
{
*mode = GRUB_ARCHELP_ATTR_END;
return GRUB_ERR_NONE;
}
data->next_entry = data->entry->next;
*mode = GRUB_ARCHELP_ATTR_FILE | GRUB_ARCHELP_ATTR_NOTIME;
*name = grub_strdup (data->entry->name);
*mtime = 0;
if (!*name)
return grub_errno;
return GRUB_ERR_NONE;
}
static struct grub_archelp_ops arcops =
{
.find_file = grub_procfs_find_file,
.rewind = grub_procfs_rewind
};
static grub_ssize_t static grub_ssize_t
grub_procfs_read (grub_file_t file, char *buf, grub_size_t len) grub_procfs_read (grub_file_t file, char *buf, grub_size_t len)
{ {
@@ -138,35 +99,44 @@ static grub_err_t
grub_procfs_dir (grub_device_t device, const char *path, grub_procfs_dir (grub_device_t device, const char *path,
grub_fs_dir_hook_t hook, void *hook_data) grub_fs_dir_hook_t hook, void *hook_data)
{ {
struct grub_archelp_data data; const char *ptr;
struct grub_dirhook_info info;
struct grub_procfs_entry *entry;
grub_memset (&info, 0, sizeof (info));
/* Check if the disk is our dummy disk. */ /* Check if the disk is our dummy disk. */
if (grub_strcmp (device->disk->name, "proc")) if (grub_strcmp (device->disk->name, "proc"))
return grub_error (GRUB_ERR_BAD_FS, "not a procfs"); return grub_error (GRUB_ERR_BAD_FS, "not a procfs");
for (ptr = path; *ptr == '/'; ptr++);
grub_procfs_rewind (&data); if (*ptr)
return 0;
return grub_archelp_dir (&data, &arcops, FOR_LIST_ELEMENTS((entry), (grub_procfs_entries))
path, hook, hook_data); if (hook (entry->name, &info, hook_data))
return 0;
return 0;
} }
static grub_err_t static grub_err_t
grub_procfs_open (struct grub_file *file, const char *path) grub_procfs_open (struct grub_file *file, const char *path)
{ {
grub_err_t err; const char *pathptr;
struct grub_archelp_data data; struct grub_procfs_entry *entry;
for (pathptr = path; *pathptr == '/'; pathptr++);
FOR_LIST_ELEMENTS((entry), (grub_procfs_entries))
if (grub_strcmp (pathptr, entry->name) == 0)
{
grub_size_t sz; grub_size_t sz;
file->data = entry->get_contents (&sz);
grub_procfs_rewind (&data);
err = grub_archelp_open (&data, &arcops, path);
if (err)
return err;
file->data = data.entry->get_contents (&sz);
if (!file->data) if (!file->data)
return grub_errno; return grub_errno;
file->size = sz; file->size = sz;
return GRUB_ERR_NONE; return GRUB_ERR_NONE;
}
return grub_error (GRUB_ERR_FILE_NOT_FOUND, N_("file `%s' not found"), path);
} }
static struct grub_disk_dev grub_procfs_dev = { static struct grub_disk_dev grub_procfs_dev = {
+5 -26
View File
@@ -783,30 +783,12 @@ grub_reiserfs_iterate_dir (grub_fshelp_node_t item,
struct grub_reiserfs_key entry_key; struct grub_reiserfs_key entry_key;
enum grub_fshelp_filetype entry_type; enum grub_fshelp_filetype entry_type;
char *entry_name; char *entry_name;
char *entry_name_end = 0;
char c;
if (!(entry_state & GRUB_REISERFS_VISIBLE_MASK)) if (!(entry_state & GRUB_REISERFS_VISIBLE_MASK))
continue; continue;
entry_name = (((char *) directory_headers) entry_name = (((char *) directory_headers)
+ grub_le_to_cpu16 (directory_header->location)); + grub_le_to_cpu16 (directory_header->location));
if (entry_number == 0)
{
entry_name_end = (char *) block_header
+ grub_le_to_cpu16 (item_headers[block_position].item_location)
+ grub_le_to_cpu16 (item_headers[block_position].item_size);
}
else
{
entry_name_end = (((char *) directory_headers)
+ grub_le_to_cpu16 (directory_headers[entry_number - 1].location));
}
if (entry_name_end < entry_name || entry_name_end > (char *) block_header + block_size)
{
entry_name_end = (char *) block_header + block_size;
}
entry_key.directory_id = directory_header->directory_id; entry_key.directory_id = directory_header->directory_id;
entry_key.object_id = directory_header->object_id; entry_key.object_id = directory_header->object_id;
entry_key.u.v2.offset_type = 0; entry_key.u.v2.offset_type = 0;
@@ -953,7 +935,7 @@ grub_reiserfs_iterate_dir (grub_fshelp_node_t item,
else else
{ {
/* Pseudo file ".." never has stat block. */ /* Pseudo file ".." never has stat block. */
if (entry_name_end == entry_name + 2 && grub_memcmp (entry_name, "..", 2) != 0) if (grub_strcmp (entry_name, ".."))
grub_dprintf ("reiserfs", grub_dprintf ("reiserfs",
"Warning : %s has no stat block !\n", "Warning : %s has no stat block !\n",
entry_name); entry_name);
@@ -961,21 +943,18 @@ grub_reiserfs_iterate_dir (grub_fshelp_node_t item,
goto next; goto next;
} }
} }
c = *entry_name_end;
*entry_name_end = 0;
if (hook (entry_name, entry_type, entry_item, hook_data)) if (hook (entry_name, entry_type, entry_item, hook_data))
{ {
*entry_name_end = c;
grub_dprintf ("reiserfs", "Found : %s, type=%d\n", grub_dprintf ("reiserfs", "Found : %s, type=%d\n",
entry_name, entry_type); entry_name, entry_type);
ret = 1; ret = 1;
goto found; goto found;
} }
*entry_name_end = c;
next: next:
; *entry_name = 0; /* Make sure next entry name (which is just
before this one in disk order) stops before
the current one. */
} }
if (next_offset == 0) if (next_offset == 0)
@@ -1111,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 = ((grub_disk_addr_t) found.block_number) * (block_size >> GRUB_DISK_SECTOR_BITS); block = 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)
{ {
+6 -11
View File
@@ -173,11 +173,10 @@ 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 (blocksize); treeblock = grub_malloc (GRUB_DISK_SECTOR_SIZE << data->log_blocksize);
if (!treeblock) if (!block)
return grub_errno; return 0;
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;
@@ -185,21 +184,17 @@ 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, blocksize, treeblock); 0, GRUB_DISK_SECTOR_SIZE << data->log_blocksize,
treeblock);
if (grub_errno) if (grub_errno)
{ {
grub_free (treeblock); grub_free (treeblock);
return grub_errno; return grub_errno;
} }
nnodes = grub_be_to_cpu16 (tree->nodes); for (i = grub_be_to_cpu16 (tree->nodes) - 1; i >= 0; i--)
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,7 +986,6 @@ 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;
+2 -8
View File
@@ -394,7 +394,7 @@ grub_ufs_read_file (struct grub_ufs_data *data,
return -1; return -1;
} }
else else
grub_memset (buf, 0, blockend); grub_memset (buf, UFS_BLKSZ (sblock) - skipfirst, 0);
buf += UFS_BLKSZ (sblock) - skipfirst; buf += UFS_BLKSZ (sblock) - skipfirst;
} }
@@ -465,13 +465,7 @@ grub_ufs_lookup_symlink (struct grub_ufs_data *data, int ino)
&& INODE_SIZE (data) <= sizeof (data->inode.symlink)) && INODE_SIZE (data) <= sizeof (data->inode.symlink))
grub_strcpy (symlink, (char *) data->inode.symlink); grub_strcpy (symlink, (char *) data->inode.symlink);
else else
{ grub_ufs_read_file (data, 0, 0, 0, sz, symlink);
if (grub_ufs_read_file (data, 0, 0, 0, sz, symlink) < 0)
{
grub_free(symlink);
return grub_errno;
}
}
symlink[sz] = '\0'; symlink[sz] = '\0';
/* The symlink is an absolute path, go back to the root inode. */ /* The symlink is an absolute path, go back to the root inode. */
+117 -330
View File
@@ -34,50 +34,6 @@ GRUB_MOD_LICENSE ("GPLv3+");
#define XFS_INODE_FORMAT_EXT 2 #define XFS_INODE_FORMAT_EXT 2
#define XFS_INODE_FORMAT_BTREE 3 #define XFS_INODE_FORMAT_BTREE 3
/* Superblock version field flags */
#define XFS_SB_VERSION_NUMBITS 0x000f
#define XFS_SB_VERSION_ATTRBIT 0x0010
#define XFS_SB_VERSION_NLINKBIT 0x0020
#define XFS_SB_VERSION_QUOTABIT 0x0040
#define XFS_SB_VERSION_ALIGNBIT 0x0080
#define XFS_SB_VERSION_DALIGNBIT 0x0100
#define XFS_SB_VERSION_LOGV2BIT 0x0400
#define XFS_SB_VERSION_SECTORBIT 0x0800
#define XFS_SB_VERSION_EXTFLGBIT 0x1000
#define XFS_SB_VERSION_DIRV2BIT 0x2000
#define XFS_SB_VERSION_MOREBITSBIT 0x8000
#define XFS_SB_VERSION_BITS_SUPPORTED \
(XFS_SB_VERSION_NUMBITS | \
XFS_SB_VERSION_ATTRBIT | \
XFS_SB_VERSION_NLINKBIT | \
XFS_SB_VERSION_QUOTABIT | \
XFS_SB_VERSION_ALIGNBIT | \
XFS_SB_VERSION_DALIGNBIT | \
XFS_SB_VERSION_LOGV2BIT | \
XFS_SB_VERSION_SECTORBIT | \
XFS_SB_VERSION_EXTFLGBIT | \
XFS_SB_VERSION_DIRV2BIT | \
XFS_SB_VERSION_MOREBITSBIT)
/* Recognized xfs format versions */
#define XFS_SB_VERSION_4 4 /* Good old XFS filesystem */
#define XFS_SB_VERSION_5 5 /* CRC enabled filesystem */
/* features2 field flags */
#define XFS_SB_VERSION2_LAZYSBCOUNTBIT 0x00000002 /* Superblk counters */
#define XFS_SB_VERSION2_ATTR2BIT 0x00000008 /* Inline attr rework */
#define XFS_SB_VERSION2_PROJID32BIT 0x00000080 /* 32-bit project ids */
#define XFS_SB_VERSION2_FTYPE 0x00000200 /* inode type in dir */
#define XFS_SB_VERSION2_BITS_SUPPORTED \
(XFS_SB_VERSION2_LAZYSBCOUNTBIT | \
XFS_SB_VERSION2_ATTR2BIT | \
XFS_SB_VERSION2_PROJID32BIT | \
XFS_SB_VERSION2_FTYPE)
/* incompat feature flags */
#define XFS_SB_FEAT_INCOMPAT_FTYPE (1 << 0) /* filetype in dirent */
#define XFS_SB_FEAT_INCOMPAT_SUPPORTED \
(XFS_SB_FEAT_INCOMPAT_FTYPE)
struct grub_xfs_sblock struct grub_xfs_sblock
{ {
@@ -89,9 +45,7 @@ struct grub_xfs_sblock
grub_uint64_t rootino; grub_uint64_t rootino;
grub_uint8_t unused3[20]; grub_uint8_t unused3[20];
grub_uint32_t agsize; grub_uint32_t agsize;
grub_uint8_t unused4[12]; grub_uint8_t unused4[20];
grub_uint16_t version;
grub_uint8_t unused5[6];
grub_uint8_t label[12]; grub_uint8_t label[12];
grub_uint8_t log2_bsize; grub_uint8_t log2_bsize;
grub_uint8_t log2_sect; grub_uint8_t log2_sect;
@@ -100,19 +54,12 @@ struct grub_xfs_sblock
grub_uint8_t log2_agblk; grub_uint8_t log2_agblk;
grub_uint8_t unused6[67]; grub_uint8_t unused6[67];
grub_uint8_t log2_dirblk; grub_uint8_t log2_dirblk;
grub_uint8_t unused7[7];
grub_uint32_t features2;
grub_uint8_t unused8[4];
grub_uint32_t sb_features_compat;
grub_uint32_t sb_features_ro_compat;
grub_uint32_t sb_features_incompat;
grub_uint32_t sb_features_log_incompat;
} GRUB_PACKED; } GRUB_PACKED;
struct grub_xfs_dir_header struct grub_xfs_dir_header
{ {
grub_uint8_t count; grub_uint8_t count;
grub_uint8_t largeino; grub_uint8_t smallino;
union union
{ {
grub_uint32_t i4; grub_uint32_t i4;
@@ -120,29 +67,21 @@ struct grub_xfs_dir_header
} GRUB_PACKED parent; } GRUB_PACKED parent;
} GRUB_PACKED; } GRUB_PACKED;
/* Structure for directory entry inlined in the inode */
struct grub_xfs_dir_entry struct grub_xfs_dir_entry
{ {
grub_uint8_t len; grub_uint8_t len;
grub_uint16_t offset; grub_uint16_t offset;
char name[1]; char name[1];
/* Inode number follows, 32 / 64 bits. */ /* Inode number follows, 32 bits. */
} GRUB_PACKED; } GRUB_PACKED;
/* Structure for directory entry in a block */
struct grub_xfs_dir2_entry struct grub_xfs_dir2_entry
{ {
grub_uint64_t inode; grub_uint64_t inode;
grub_uint8_t len; grub_uint8_t len;
} GRUB_PACKED; } GRUB_PACKED;
struct grub_xfs_extent typedef grub_uint32_t grub_xfs_extent[4];
{
/* This should be a bitfield but bietfields are unportable, so just have
a raw array and functions extracting useful info from it.
*/
grub_uint32_t raw[4];
} GRUB_PACKED;
struct grub_xfs_btree_node struct grub_xfs_btree_node
{ {
@@ -151,8 +90,7 @@ struct grub_xfs_btree_node
grub_uint16_t numrecs; grub_uint16_t numrecs;
grub_uint64_t left; grub_uint64_t left;
grub_uint64_t right; grub_uint64_t right;
/* In V5 here follow crc, uuid, etc. */ grub_uint64_t keys[1];
/* Then follow keys and block pointers */
} GRUB_PACKED; } GRUB_PACKED;
struct grub_xfs_btree_root struct grub_xfs_btree_root
@@ -185,11 +123,19 @@ struct grub_xfs_inode
grub_uint16_t unused3; grub_uint16_t unused3;
grub_uint8_t fork_offset; grub_uint8_t fork_offset;
grub_uint8_t unused4[17]; grub_uint8_t unused4[17];
union
{
char raw[156];
struct dir
{
struct grub_xfs_dir_header dirhead;
struct grub_xfs_dir_entry direntry[1];
} dir;
grub_xfs_extent extents[XFS_INODE_EXTENTS];
struct grub_xfs_btree_root btree;
} GRUB_PACKED data;
} GRUB_PACKED; } GRUB_PACKED;
#define XFS_V2_INODE_SIZE sizeof(struct grub_xfs_inode)
#define XFS_V3_INODE_SIZE (XFS_V2_INODE_SIZE + 76)
struct grub_xfs_dirblock_tail struct grub_xfs_dirblock_tail
{ {
grub_uint32_t leaf_count; grub_uint32_t leaf_count;
@@ -211,8 +157,6 @@ struct grub_xfs_data
int pos; int pos;
int bsize; int bsize;
grub_uint32_t agsize; grub_uint32_t agsize;
unsigned int hasftype:1;
unsigned int hascrc:1;
struct grub_fshelp_node diropen; struct grub_fshelp_node diropen;
}; };
@@ -220,71 +164,6 @@ static grub_dl_t my_mod;
static int grub_xfs_sb_hascrc(struct grub_xfs_data *data)
{
return (data->sblock.version & grub_cpu_to_be16_compile_time(XFS_SB_VERSION_NUMBITS)) ==
grub_cpu_to_be16_compile_time(XFS_SB_VERSION_5);
}
static int grub_xfs_sb_hasftype(struct grub_xfs_data *data)
{
if ((data->sblock.version & grub_cpu_to_be16_compile_time(XFS_SB_VERSION_NUMBITS)) ==
grub_cpu_to_be16_compile_time(XFS_SB_VERSION_5) &&
data->sblock.sb_features_incompat & grub_cpu_to_be32_compile_time(XFS_SB_FEAT_INCOMPAT_FTYPE))
return 1;
if (data->sblock.version & grub_cpu_to_be16_compile_time(XFS_SB_VERSION_MOREBITSBIT) &&
data->sblock.features2 & grub_cpu_to_be32_compile_time(XFS_SB_VERSION2_FTYPE))
return 1;
return 0;
}
static int grub_xfs_sb_valid(struct grub_xfs_data *data)
{
grub_dprintf("xfs", "Validating superblock\n");
if (grub_strncmp ((char *) (data->sblock.magic), "XFSB", 4)
|| data->sblock.log2_bsize < GRUB_DISK_SECTOR_BITS
|| ((int) data->sblock.log2_bsize
+ (int) data->sblock.log2_dirblk) >= 27)
{
grub_error (GRUB_ERR_BAD_FS, "not a XFS filesystem");
return 0;
}
if ((data->sblock.version & grub_cpu_to_be16_compile_time(XFS_SB_VERSION_NUMBITS)) ==
grub_cpu_to_be16_compile_time(XFS_SB_VERSION_5))
{
grub_dprintf("xfs", "XFS v5 superblock detected\n");
if (data->sblock.sb_features_incompat &
grub_cpu_to_be32_compile_time(~XFS_SB_FEAT_INCOMPAT_SUPPORTED))
{
grub_error (GRUB_ERR_BAD_FS, "XFS filesystem has unsupported "
"incompatible features");
return 0;
}
return 1;
}
else if ((data->sblock.version & grub_cpu_to_be16_compile_time(XFS_SB_VERSION_NUMBITS)) ==
grub_cpu_to_be16_compile_time(XFS_SB_VERSION_4))
{
grub_dprintf("xfs", "XFS v4 superblock detected\n");
if (!(data->sblock.version & grub_cpu_to_be16_compile_time(XFS_SB_VERSION_DIRV2BIT)))
{
grub_error (GRUB_ERR_BAD_FS, "XFS filesystem without V2 directories "
"is unsupported");
return 0;
}
if (data->sblock.version & grub_cpu_to_be16_compile_time(~XFS_SB_VERSION_BITS_SUPPORTED) ||
(data->sblock.version & grub_cpu_to_be16_compile_time(XFS_SB_VERSION_MOREBITSBIT) &&
data->sblock.features2 & grub_cpu_to_be16_compile_time(~XFS_SB_VERSION2_BITS_SUPPORTED)))
{
grub_error (GRUB_ERR_BAD_FS, "XFS filesystem has unsupported version "
"bits");
return 0;
}
return 1;
}
return 0;
}
/* Filetype information as used in inodes. */ /* Filetype information as used in inodes. */
#define FILETYPE_INO_MASK 0170000 #define FILETYPE_INO_MASK 0170000
#define FILETYPE_INO_REG 0100000 #define FILETYPE_INO_REG 0100000
@@ -301,14 +180,14 @@ static inline grub_uint64_t
GRUB_XFS_INO_INOINAG (struct grub_xfs_data *data, GRUB_XFS_INO_INOINAG (struct grub_xfs_data *data,
grub_uint64_t ino) grub_uint64_t ino)
{ {
return (ino & ((1LL << GRUB_XFS_INO_AGBITS (data)) - 1)); return (grub_be_to_cpu64 (ino) & ((1LL << GRUB_XFS_INO_AGBITS (data)) - 1));
} }
static inline grub_uint64_t static inline grub_uint64_t
GRUB_XFS_INO_AG (struct grub_xfs_data *data, GRUB_XFS_INO_AG (struct grub_xfs_data *data,
grub_uint64_t ino) grub_uint64_t ino)
{ {
return (ino >> GRUB_XFS_INO_AGBITS (data)); return (grub_be_to_cpu64 (ino) >> GRUB_XFS_INO_AGBITS (data));
} }
static inline grub_disk_addr_t static inline grub_disk_addr_t
@@ -319,25 +198,37 @@ GRUB_XFS_FSB_TO_BLOCK (struct grub_xfs_data *data, grub_disk_addr_t fsb)
} }
static inline grub_uint64_t static inline grub_uint64_t
GRUB_XFS_EXTENT_OFFSET (struct grub_xfs_extent *exts, int ex) GRUB_XFS_EXTENT_OFFSET (grub_xfs_extent *exts, int ex)
{ {
return ((grub_be_to_cpu32 (exts[ex].raw[0]) & ~(1 << 31)) << 23 return ((grub_be_to_cpu32 (exts[ex][0]) & ~(1 << 31)) << 23
| grub_be_to_cpu32 (exts[ex].raw[1]) >> 9); | grub_be_to_cpu32 (exts[ex][1]) >> 9);
} }
static inline grub_uint64_t static inline grub_uint64_t
GRUB_XFS_EXTENT_BLOCK (struct grub_xfs_extent *exts, int ex) GRUB_XFS_EXTENT_BLOCK (grub_xfs_extent *exts, int ex)
{ {
return ((grub_uint64_t) (grub_be_to_cpu32 (exts[ex].raw[1]) return ((grub_uint64_t) (grub_be_to_cpu32 (exts[ex][1])
& (0x1ff)) << 43 & (0x1ff)) << 43
| (grub_uint64_t) grub_be_to_cpu32 (exts[ex].raw[2]) << 11 | (grub_uint64_t) grub_be_to_cpu32 (exts[ex][2]) << 11
| grub_be_to_cpu32 (exts[ex].raw[3]) >> 21); | grub_be_to_cpu32 (exts[ex][3]) >> 21);
} }
static inline grub_uint64_t static inline grub_uint64_t
GRUB_XFS_EXTENT_SIZE (struct grub_xfs_extent *exts, int ex) GRUB_XFS_EXTENT_SIZE (grub_xfs_extent *exts, int ex)
{ {
return (grub_be_to_cpu32 (exts[ex].raw[3]) & ((1 << 21) - 1)); return (grub_be_to_cpu32 (exts[ex][3]) & ((1 << 21) - 1));
}
static inline int
GRUB_XFS_ROUND_TO_DIRENT (int pos)
{
return ((((pos) + 8 - 1) / 8) * 8);
}
static inline int
GRUB_XFS_NEXT_DIRENT (int pos, int len)
{
return (pos) + GRUB_XFS_ROUND_TO_DIRENT (8 + 1 + len + 2);
} }
@@ -364,109 +255,6 @@ grub_xfs_inode_offset (struct grub_xfs_data *data,
data->sblock.log2_inode); data->sblock.log2_inode);
} }
static inline grub_size_t
grub_xfs_inode_size(struct grub_xfs_data *data)
{
return (grub_size_t)1 << data->sblock.log2_inode;
}
/*
* Returns size occupied by XFS inode stored in memory - we store struct
* grub_fshelp_node there but on disk inode size may be actually larger than
* struct grub_xfs_inode so we need to account for that so that we can read
* from disk directly into in-memory structure.
*/
static inline grub_size_t
grub_xfs_fshelp_size(struct grub_xfs_data *data)
{
return sizeof (struct grub_fshelp_node) - sizeof (struct grub_xfs_inode)
+ grub_xfs_inode_size(data);
}
/* This should return void * but XFS code is error-prone with alignment, so
return char to retain cast-align.
*/
static char *
grub_xfs_inode_data(struct grub_xfs_inode *inode)
{
if (inode->version <= 2)
return ((char *)inode) + XFS_V2_INODE_SIZE;
return ((char *)inode) + XFS_V3_INODE_SIZE;
}
static struct grub_xfs_dir_entry *
grub_xfs_inline_de(struct grub_xfs_dir_header *head)
{
/*
With small inode numbers the header is 4 bytes smaller because of
smaller parent pointer
*/
return (struct grub_xfs_dir_entry *)
(((char *) head) + sizeof(struct grub_xfs_dir_header) -
(head->largeino ? 0 : sizeof(grub_uint32_t)));
}
static grub_uint8_t *
grub_xfs_inline_de_inopos(struct grub_xfs_data *data,
struct grub_xfs_dir_entry *de)
{
return ((grub_uint8_t *)(de + 1)) + de->len - 1 + (data->hasftype ? 1 : 0);
}
static struct grub_xfs_dir_entry *
grub_xfs_inline_next_de(struct grub_xfs_data *data,
struct grub_xfs_dir_header *head,
struct grub_xfs_dir_entry *de)
{
char *p = (char *)de + sizeof(struct grub_xfs_dir_entry) - 1 + de->len;
p += head->largeino ? sizeof(grub_uint64_t) : sizeof(grub_uint32_t);
if (data->hasftype)
p++;
return (struct grub_xfs_dir_entry *)p;
}
static struct grub_xfs_dirblock_tail *
grub_xfs_dir_tail(struct grub_xfs_data *data, void *dirblock)
{
int dirblksize = 1 << (data->sblock.log2_bsize + data->sblock.log2_dirblk);
return (struct grub_xfs_dirblock_tail *)
((char *)dirblock + dirblksize - sizeof (struct grub_xfs_dirblock_tail));
}
static struct grub_xfs_dir2_entry *
grub_xfs_first_de(struct grub_xfs_data *data, void *dirblock)
{
if (data->hascrc)
return (struct grub_xfs_dir2_entry *)((char *)dirblock + 64);
return (struct grub_xfs_dir2_entry *)((char *)dirblock + 16);
}
static struct grub_xfs_dir2_entry *
grub_xfs_next_de(struct grub_xfs_data *data, struct grub_xfs_dir2_entry *de)
{
int size = sizeof (struct grub_xfs_dir2_entry) + de->len + 2 /* Tag */;
if (data->hasftype)
size++; /* File type */
return (struct grub_xfs_dir2_entry *)(((char *)de) + ALIGN_UP(size, 8));
}
/* This should return void * but XFS code is error-prone with alignment, so
return char to retain cast-align.
*/
static char *
grub_xfs_btree_keys(struct grub_xfs_data *data,
struct grub_xfs_btree_node *leaf)
{
char *keys = (char *)(leaf + 1);
if (data->hascrc)
keys += 48; /* skip crc, uuid, ... */
return keys;
}
static grub_err_t static grub_err_t
grub_xfs_read_inode (struct grub_xfs_data *data, grub_uint64_t ino, grub_xfs_read_inode (struct grub_xfs_data *data, grub_uint64_t ino,
@@ -475,11 +263,9 @@ grub_xfs_read_inode (struct grub_xfs_data *data, grub_uint64_t ino,
grub_uint64_t block = grub_xfs_inode_block (data, ino); grub_uint64_t block = grub_xfs_inode_block (data, ino);
int offset = grub_xfs_inode_offset (data, ino); int offset = grub_xfs_inode_offset (data, ino);
grub_dprintf("xfs", "Reading inode (%"PRIuGRUB_UINT64_T") - %"PRIuGRUB_UINT64_T", %d\n",
ino, block, offset);
/* Read the inode. */ /* Read the inode. */
if (grub_disk_read (data->disk, block, offset, grub_xfs_inode_size(data), if (grub_disk_read (data->disk, block, offset,
inode)) 1 << data->sblock.log2_inode, inode))
return grub_errno; return grub_errno;
if (grub_strncmp ((char *) inode->magic, "IN", 2)) if (grub_strncmp ((char *) inode->magic, "IN", 2))
@@ -488,39 +274,32 @@ grub_xfs_read_inode (struct grub_xfs_data *data, grub_uint64_t ino,
return 0; return 0;
} }
static grub_uint64_t
get_fsb (const void *keys, int idx)
{
const char *p = (const char *) keys + sizeof(grub_uint64_t) * idx;
return grub_be_to_cpu64 (grub_get_unaligned64 (p));
}
static grub_disk_addr_t static grub_disk_addr_t
grub_xfs_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock) grub_xfs_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock)
{ {
struct grub_xfs_btree_node *leaf = 0; struct grub_xfs_btree_node *leaf = 0;
int ex, nrec; int ex, nrec;
struct grub_xfs_extent *exts; grub_xfs_extent *exts;
grub_uint64_t ret = 0; grub_uint64_t ret = 0;
if (node->inode.format == XFS_INODE_FORMAT_BTREE) if (node->inode.format == XFS_INODE_FORMAT_BTREE)
{ {
struct grub_xfs_btree_root *root; const grub_uint64_t *keys;
const char *keys;
int recoffset; int recoffset;
leaf = grub_malloc (node->data->bsize); leaf = grub_malloc (node->data->bsize);
if (leaf == 0) if (leaf == 0)
return 0; return 0;
root = (struct grub_xfs_btree_root *) grub_xfs_inode_data(&node->inode); nrec = grub_be_to_cpu16 (node->inode.data.btree.numrecs);
nrec = grub_be_to_cpu16 (root->numrecs); keys = &node->inode.data.btree.keys[0];
keys = (char *) &root->keys[0];
if (node->inode.fork_offset) if (node->inode.fork_offset)
recoffset = (node->inode.fork_offset - 1) / 2; recoffset = (node->inode.fork_offset - 1) / 2;
else else
recoffset = (grub_xfs_inode_size(node->data) recoffset = ((1 << node->data->sblock.log2_inode)
- ((char *) keys - (char *) &node->inode)) - ((char *) &node->inode.data.btree.keys
- (char *) &node->inode))
/ (2 * sizeof (grub_uint64_t)); / (2 * sizeof (grub_uint64_t));
do do
{ {
@@ -528,7 +307,7 @@ grub_xfs_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock)
for (i = 0; i < nrec; i++) for (i = 0; i < nrec; i++)
{ {
if (fileblock < get_fsb(keys, i)) if (fileblock < grub_be_to_cpu64 (keys[i]))
break; break;
} }
@@ -538,16 +317,12 @@ grub_xfs_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock)
grub_free (leaf); grub_free (leaf);
return 0; return 0;
} }
if (grub_disk_read (node->data->disk, if (grub_disk_read (node->data->disk,
GRUB_XFS_FSB_TO_BLOCK (node->data, get_fsb (keys, i - 1 + recoffset)) << (node->data->sblock.log2_bsize - GRUB_DISK_SECTOR_BITS), GRUB_XFS_FSB_TO_BLOCK (node->data, grub_be_to_cpu64 (keys[i - 1 + recoffset])) << (node->data->sblock.log2_bsize - GRUB_DISK_SECTOR_BITS),
0, node->data->bsize, leaf)) 0, node->data->bsize, leaf))
return 0; return 0;
if ((!node->data->hascrc && if (grub_strncmp ((char *) leaf->magic, "BMAP", 4))
grub_strncmp ((char *) leaf->magic, "BMAP", 4)) ||
(node->data->hascrc &&
grub_strncmp ((char *) leaf->magic, "BMA3", 4)))
{ {
grub_free (leaf); grub_free (leaf);
grub_error (GRUB_ERR_BAD_FS, "not a correct XFS BMAP node"); grub_error (GRUB_ERR_BAD_FS, "not a correct XFS BMAP node");
@@ -555,18 +330,18 @@ grub_xfs_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock)
} }
nrec = grub_be_to_cpu16 (leaf->numrecs); nrec = grub_be_to_cpu16 (leaf->numrecs);
keys = grub_xfs_btree_keys(node->data, leaf); keys = &leaf->keys[0];
recoffset = ((node->data->bsize - ((char *) keys recoffset = ((node->data->bsize - ((char *) &leaf->keys
- (char *) leaf)) - (char *) leaf))
/ (2 * sizeof (grub_uint64_t))); / (2 * sizeof (grub_uint64_t)));
} }
while (leaf->level); while (leaf->level);
exts = (struct grub_xfs_extent *) keys; exts = (grub_xfs_extent *) keys;
} }
else if (node->inode.format == XFS_INODE_FORMAT_EXT) else if (node->inode.format == XFS_INODE_FORMAT_EXT)
{ {
nrec = grub_be_to_cpu32 (node->inode.nextents); nrec = grub_be_to_cpu32 (node->inode.nextents);
exts = (struct grub_xfs_extent *) grub_xfs_inode_data(&node->inode); exts = &node->inode.data.extents[0];
} }
else else
{ {
@@ -605,12 +380,12 @@ grub_xfs_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock)
static grub_ssize_t static grub_ssize_t
grub_xfs_read_file (grub_fshelp_node_t node, grub_xfs_read_file (grub_fshelp_node_t node,
grub_disk_read_hook_t read_hook, void *read_hook_data, grub_disk_read_hook_t read_hook, void *read_hook_data,
grub_off_t pos, grub_size_t len, char *buf, grub_uint32_t header_size) grub_off_t pos, grub_size_t len, char *buf)
{ {
return grub_fshelp_read_file (node->data->disk, node, return grub_fshelp_read_file (node->data->disk, node,
read_hook, read_hook_data, read_hook, read_hook_data,
pos, len, buf, grub_xfs_read_block, pos, len, buf, grub_xfs_read_block,
grub_be_to_cpu64 (node->inode.size) + header_size, grub_be_to_cpu64 (node->inode.size),
node->data->sblock.log2_bsize node->data->sblock.log2_bsize
- GRUB_DISK_SECTOR_BITS, 0); - GRUB_DISK_SECTOR_BITS, 0);
} }
@@ -619,34 +394,23 @@ grub_xfs_read_file (grub_fshelp_node_t node,
static char * static char *
grub_xfs_read_symlink (grub_fshelp_node_t node) grub_xfs_read_symlink (grub_fshelp_node_t node)
{ {
grub_ssize_t size = grub_be_to_cpu64 (node->inode.size); int size = grub_be_to_cpu64 (node->inode.size);
if (size < 0)
{
grub_error (GRUB_ERR_BAD_FS, "invalid symlink");
return 0;
}
switch (node->inode.format) switch (node->inode.format)
{ {
case XFS_INODE_FORMAT_INO: case XFS_INODE_FORMAT_INO:
return grub_strndup (grub_xfs_inode_data(&node->inode), size); return grub_strndup (node->inode.data.raw, size);
case XFS_INODE_FORMAT_EXT: case XFS_INODE_FORMAT_EXT:
{ {
char *symlink; char *symlink;
grub_ssize_t numread; grub_ssize_t numread;
int off = 0;
if (node->data->hascrc)
off = 56;
symlink = grub_malloc (size + 1); symlink = grub_malloc (size + 1);
if (!symlink) if (!symlink)
return 0; return 0;
node->inode.size = grub_be_to_cpu64 (size + off); numread = grub_xfs_read_file (node, 0, 0, 0, size, symlink);
numread = grub_xfs_read_file (node, 0, 0, off, size, symlink, off);
if (numread != size) if (numread != size)
{ {
grub_free (symlink); grub_free (symlink);
@@ -692,7 +456,9 @@ static int iterate_dir_call_hook (grub_uint64_t ino, const char *filename,
struct grub_fshelp_node *fdiro; struct grub_fshelp_node *fdiro;
grub_err_t err; grub_err_t err;
fdiro = grub_malloc (grub_xfs_fshelp_size(ctx->diro->data) + 1); fdiro = grub_malloc (sizeof (struct grub_fshelp_node)
- sizeof (struct grub_xfs_inode)
+ (1 << ctx->diro->data->sblock.log2_inode) + 1);
if (!fdiro) if (!fdiro)
{ {
grub_print_error (); grub_print_error ();
@@ -730,18 +496,24 @@ grub_xfs_iterate_dir (grub_fshelp_node_t dir,
{ {
case XFS_INODE_FORMAT_INO: case XFS_INODE_FORMAT_INO:
{ {
struct grub_xfs_dir_header *head = (struct grub_xfs_dir_header *) grub_xfs_inode_data(&diro->inode); struct grub_xfs_dir_entry *de = &diro->inode.data.dir.direntry[0];
struct grub_xfs_dir_entry *de = grub_xfs_inline_de(head); int smallino = !diro->inode.data.dir.dirhead.smallino;
int smallino = !head->largeino;
int i; int i;
grub_uint64_t parent; grub_uint64_t parent;
/* If small inode numbers are used to pack the direntry, the /* If small inode numbers are used to pack the direntry, the
parent inode number is small too. */ parent inode number is small too. */
if (smallino) if (smallino)
parent = grub_be_to_cpu32 (head->parent.i4); {
parent = grub_be_to_cpu32 (diro->inode.data.dir.dirhead.parent.i4);
parent = grub_cpu_to_be64 (parent);
/* The header is a bit smaller than usual. */
de = (struct grub_xfs_dir_entry *) ((char *) de - 4);
}
else else
parent = grub_be_to_cpu64 (head->parent.i8); {
parent = diro->inode.data.dir.dirhead.parent.i8;
}
/* Synthesize the direntries for `.' and `..'. */ /* Synthesize the direntries for `.' and `..'. */
if (iterate_dir_call_hook (diro->ino, ".", &ctx)) if (iterate_dir_call_hook (diro->ino, ".", &ctx))
@@ -750,10 +522,12 @@ grub_xfs_iterate_dir (grub_fshelp_node_t dir,
if (iterate_dir_call_hook (parent, "..", &ctx)) if (iterate_dir_call_hook (parent, "..", &ctx))
return 1; return 1;
for (i = 0; i < head->count; i++) for (i = 0; i < diro->inode.data.dir.dirhead.count; i++)
{ {
grub_uint64_t ino; grub_uint64_t ino;
grub_uint8_t *inopos = grub_xfs_inline_de_inopos(dir->data, de); grub_uint8_t *inopos = (((grub_uint8_t *) de)
+ sizeof (struct grub_xfs_dir_entry)
+ de->len - 1);
grub_uint8_t c; grub_uint8_t c;
/* inopos might be unaligned. */ /* inopos might be unaligned. */
@@ -771,6 +545,7 @@ grub_xfs_iterate_dir (grub_fshelp_node_t dir,
| (((grub_uint64_t) inopos[5]) << 16) | (((grub_uint64_t) inopos[5]) << 16)
| (((grub_uint64_t) inopos[6]) << 8) | (((grub_uint64_t) inopos[6]) << 8)
| (((grub_uint64_t) inopos[7]) << 0); | (((grub_uint64_t) inopos[7]) << 0);
ino = grub_cpu_to_be64 (ino);
c = de->name[de->len]; c = de->name[de->len];
de->name[de->len] = '\0'; de->name[de->len] = '\0';
@@ -778,7 +553,10 @@ grub_xfs_iterate_dir (grub_fshelp_node_t dir,
return 1; return 1;
de->name[de->len] = c; de->name[de->len] = c;
de = grub_xfs_inline_next_de(dir->data, head, de); de = ((struct grub_xfs_dir_entry *)
(((char *) de)+ sizeof (struct grub_xfs_dir_entry) + de->len
+ ((smallino ? sizeof (grub_uint32_t)
: sizeof (grub_uint64_t))) - 1));
} }
break; break;
} }
@@ -805,15 +583,19 @@ grub_xfs_iterate_dir (grub_fshelp_node_t dir,
>> dirblk_log2); >> dirblk_log2);
blk++) blk++)
{ {
struct grub_xfs_dir2_entry *direntry = /* The header is skipped, the first direntry is stored
grub_xfs_first_de(dir->data, dirblock); from byte 16. */
int pos = 16;
int entries; int entries;
struct grub_xfs_dirblock_tail *tail = int tail_start = (dirblk_size
grub_xfs_dir_tail(dir->data, dirblock); - sizeof (struct grub_xfs_dirblock_tail));
struct grub_xfs_dirblock_tail *tail;
tail = (struct grub_xfs_dirblock_tail *) &dirblock[tail_start];
numread = grub_xfs_read_file (dir, 0, 0, numread = grub_xfs_read_file (dir, 0, 0,
blk << dirblk_log2, blk << dirblk_log2,
dirblk_size, dirblock, 0); dirblk_size, dirblock);
if (numread != dirblk_size) if (numread != dirblk_size)
return 0; return 0;
@@ -821,11 +603,14 @@ grub_xfs_iterate_dir (grub_fshelp_node_t dir,
- grub_be_to_cpu32 (tail->leaf_stale)); - grub_be_to_cpu32 (tail->leaf_stale));
/* Iterate over all entries within this block. */ /* Iterate over all entries within this block. */
while ((char *)direntry < (char *)tail) while (pos < (dirblk_size
- (int) sizeof (struct grub_xfs_dir2_entry)))
{ {
struct grub_xfs_dir2_entry *direntry;
grub_uint8_t *freetag; grub_uint8_t *freetag;
char *filename; char *filename;
direntry = (struct grub_xfs_dir2_entry *) &dirblock[pos];
freetag = (grub_uint8_t *) direntry; freetag = (grub_uint8_t *) direntry;
if (grub_get_unaligned16 (freetag) == 0XFFFF) if (grub_get_unaligned16 (freetag) == 0XFFFF)
@@ -833,20 +618,17 @@ grub_xfs_iterate_dir (grub_fshelp_node_t dir,
grub_uint8_t *skip = (freetag + sizeof (grub_uint16_t)); grub_uint8_t *skip = (freetag + sizeof (grub_uint16_t));
/* This entry is not used, go to the next one. */ /* This entry is not used, go to the next one. */
direntry = (struct grub_xfs_dir2_entry *) pos += grub_be_to_cpu16 (grub_get_unaligned16 (skip));
(((char *)direntry) +
grub_be_to_cpu16 (grub_get_unaligned16 (skip)));
continue; continue;
} }
filename = (char *)(direntry + 1); filename = &dirblock[pos + sizeof (*direntry)];
/* The byte after the filename is for the filetype, padding, or /* The byte after the filename is for the tag, which
tag, which is not used by GRUB. So it can be overwritten. */ is not used by GRUB. So it can be overwritten. */
filename[direntry->len] = '\0'; filename[direntry->len] = '\0';
if (iterate_dir_call_hook (grub_be_to_cpu64(direntry->inode), if (iterate_dir_call_hook (direntry->inode, filename, &ctx))
filename, &ctx))
{ {
grub_free (dirblock); grub_free (dirblock);
return 1; return 1;
@@ -859,7 +641,8 @@ grub_xfs_iterate_dir (grub_fshelp_node_t dir,
break; break;
/* Select the next directory entry. */ /* Select the next directory entry. */
direntry = grub_xfs_next_de(dir->data, direntry); pos = GRUB_XFS_NEXT_DIRENT (pos, direntry->len);
pos = GRUB_XFS_ROUND_TO_DIRENT (pos);
} }
} }
grub_free (dirblock); grub_free (dirblock);
@@ -884,35 +667,36 @@ grub_xfs_mount (grub_disk_t disk)
if (!data) if (!data)
return 0; return 0;
grub_dprintf("xfs", "Reading sb\n");
/* Read the superblock. */ /* Read the superblock. */
if (grub_disk_read (disk, 0, 0, if (grub_disk_read (disk, 0, 0,
sizeof (struct grub_xfs_sblock), &data->sblock)) sizeof (struct grub_xfs_sblock), &data->sblock))
goto fail; goto fail;
if (!grub_xfs_sb_valid(data)) if (grub_strncmp ((char *) (data->sblock.magic), "XFSB", 4)
|| data->sblock.log2_bsize < GRUB_DISK_SECTOR_BITS
|| ((int) data->sblock.log2_bsize
+ (int) data->sblock.log2_dirblk) >= 27)
{
grub_error (GRUB_ERR_BAD_FS, "not a XFS filesystem");
goto fail; goto fail;
}
data = grub_realloc (data, data = grub_realloc (data,
sizeof (struct grub_xfs_data) sizeof (struct grub_xfs_data)
- sizeof (struct grub_xfs_inode) - sizeof (struct grub_xfs_inode)
+ grub_xfs_inode_size(data) + 1); + (1 << data->sblock.log2_inode) + 1);
if (! data) if (! data)
goto fail; goto fail;
data->diropen.data = data; data->diropen.data = data;
data->diropen.ino = grub_be_to_cpu64(data->sblock.rootino); data->diropen.ino = data->sblock.rootino;
data->diropen.inode_read = 1; data->diropen.inode_read = 1;
data->bsize = grub_be_to_cpu32 (data->sblock.bsize); data->bsize = grub_be_to_cpu32 (data->sblock.bsize);
data->agsize = grub_be_to_cpu32 (data->sblock.agsize); data->agsize = grub_be_to_cpu32 (data->sblock.agsize);
data->hasftype = grub_xfs_sb_hasftype(data);
data->hascrc = grub_xfs_sb_hascrc(data);
data->disk = disk; data->disk = disk;
data->pos = 0; data->pos = 0;
grub_dprintf("xfs", "Reading root ino %"PRIuGRUB_UINT64_T"\n",
grub_cpu_to_be64(data->sblock.rootino));
grub_xfs_read_inode (data, data->diropen.ino, &data->diropen.inode); grub_xfs_read_inode (data, data->diropen.ino, &data->diropen.inode);
@@ -1015,7 +799,10 @@ grub_xfs_open (struct grub_file *file, const char *name)
if (fdiro != &data->diropen) if (fdiro != &data->diropen)
{ {
grub_memcpy (&data->diropen, fdiro, grub_xfs_fshelp_size(data)); grub_memcpy (&data->diropen, fdiro,
sizeof (struct grub_fshelp_node)
- sizeof (struct grub_xfs_inode)
+ (1 << data->sblock.log2_inode));
grub_free (fdiro); grub_free (fdiro);
} }
@@ -1045,7 +832,7 @@ grub_xfs_read (grub_file_t file, char *buf, grub_size_t len)
return grub_xfs_read_file (&data->diropen, return grub_xfs_read_file (&data->diropen,
file->read_hook, file->read_hook_data, file->read_hook, file->read_hook_data,
file->offset, len, buf, 0); file->offset, len, buf);
} }
+30 -104
View File
@@ -252,6 +252,7 @@ struct grub_zfs_data
uberblock_t current_uberblock; uberblock_t current_uberblock;
int mounted;
grub_uint64_t guid; grub_uint64_t guid;
}; };
@@ -280,17 +281,12 @@ grub_crypto_cipher_handle_t (*grub_zfs_load_key) (const struct grub_zfs_key *key
*/ */
#define MAX_SUPPORTED_FEATURE_STRLEN 50 #define MAX_SUPPORTED_FEATURE_STRLEN 50
static const char *spa_feature_names[] = { static const char *spa_feature_names[] = {
"org.illumos:lz4_compress", "org.illumos:lz4_compress",NULL
"com.delphix:hole_birth",
"com.delphix:embedded_data",
"com.delphix:extensible_dataset",
"org.open-zfs:large_blocks",
NULL
}; };
static int static int
check_feature(const char *name, grub_uint64_t val, struct grub_zfs_dir_ctx *ctx); check_feature(const char *name, grub_uint64_t val, struct grub_zfs_dir_ctx *ctx);
static grub_err_t static int
check_mos_features(dnode_phys_t *mosmdn_phys,grub_zfs_endian_t endian,struct grub_zfs_data* data ); check_mos_features(dnode_phys_t *mosmdn_phys,grub_zfs_endian_t endian,struct grub_zfs_data* data );
static grub_err_t static grub_err_t
@@ -961,7 +957,7 @@ nvpair_value (const char *nvp,char **val,
static grub_err_t static grub_err_t
check_pool_label (struct grub_zfs_data *data, check_pool_label (struct grub_zfs_data *data,
struct grub_zfs_device_desc *diskdesc, struct grub_zfs_device_desc *diskdesc,
int *inserted, int original) int *inserted)
{ {
grub_uint64_t pool_state, txg = 0; grub_uint64_t pool_state, txg = 0;
char *nvlist,*features; char *nvlist,*features;
@@ -1085,11 +1081,10 @@ check_pool_label (struct grub_zfs_data *data,
grub_dprintf ("zfs", "check 11 passed\n"); grub_dprintf ("zfs", "check 11 passed\n");
if (original) if (data->mounted && data->guid != poolguid)
data->guid = poolguid;
if (data->guid != poolguid)
return grub_error (GRUB_ERR_BAD_FS, "another zpool"); return grub_error (GRUB_ERR_BAD_FS, "another zpool");
else
data->guid = poolguid;
{ {
char *nv; char *nv;
@@ -1191,7 +1186,7 @@ scan_disk (grub_device_t dev, struct grub_zfs_data *data,
} }
grub_dprintf ("zfs", "label ok %d\n", label); grub_dprintf ("zfs", "label ok %d\n", label);
err = check_pool_label (data, &desc, inserted, original); err = check_pool_label (data, &desc, inserted);
if (err || !*inserted) if (err || !*inserted)
{ {
grub_errno = GRUB_ERR_NONE; grub_errno = GRUB_ERR_NONE;
@@ -1756,7 +1751,7 @@ zio_read_gang (blkptr_t * bp, grub_zfs_endian_t endian, dva_t * dva, void *buf,
for (i = 0; i < SPA_GBH_NBLKPTRS; i++) for (i = 0; i < SPA_GBH_NBLKPTRS; i++)
{ {
if (BP_IS_HOLE(&zio_gb->zg_blkptr[i])) if (zio_gb->zg_blkptr[i].blk_birth == 0)
continue; continue;
err = zio_read_data (&zio_gb->zg_blkptr[i], endian, buf, data); err = zio_read_data (&zio_gb->zg_blkptr[i], endian, buf, data);
@@ -1805,39 +1800,6 @@ zio_read_data (blkptr_t * bp, grub_zfs_endian_t endian, void *buf,
return err; return err;
} }
/*
* buf must be at least BPE_GET_PSIZE(bp) bytes long (which will never be
* more than BPE_PAYLOAD_SIZE bytes).
*/
static grub_err_t
decode_embedded_bp_compressed(const blkptr_t *bp, void *buf)
{
grub_size_t psize, i;
grub_uint8_t *buf8 = buf;
grub_uint64_t w = 0;
const grub_uint64_t *bp64 = (const grub_uint64_t *)bp;
psize = BPE_GET_PSIZE(bp);
/*
* Decode the words of the block pointer into the byte array.
* Low bits of first word are the first byte (little endian).
*/
for (i = 0; i < psize; i++)
{
if (i % sizeof (w) == 0)
{
/* beginning of a word */
w = *bp64;
bp64++;
if (!BPE_IS_PAYLOADWORD(bp, bp64))
bp64++;
}
buf8[i] = BF64_GET(w, (i % sizeof (w)) * 8, 8);
}
return GRUB_ERR_NONE;
}
/* /*
* Read in a block of data, verify its checksum, decompress if needed, * Read in a block of data, verify its checksum, decompress if needed,
* and put the uncompressed data in buf. * and put the uncompressed data in buf.
@@ -1856,26 +1818,12 @@ zio_read (blkptr_t *bp, grub_zfs_endian_t endian, void **buf,
*buf = NULL; *buf = NULL;
checksum = (grub_zfs_to_cpu64((bp)->blk_prop, endian) >> 40) & 0xff; checksum = (grub_zfs_to_cpu64((bp)->blk_prop, endian) >> 40) & 0xff;
comp = (grub_zfs_to_cpu64((bp)->blk_prop, endian)>>32) & 0x7f; comp = (grub_zfs_to_cpu64((bp)->blk_prop, endian)>>32) & 0xff;
encrypted = ((grub_zfs_to_cpu64((bp)->blk_prop, endian) >> 60) & 3); encrypted = ((grub_zfs_to_cpu64((bp)->blk_prop, endian) >> 60) & 3);
if (BP_IS_EMBEDDED(bp))
{
if (BPE_GET_ETYPE(bp) != BP_EMBEDDED_TYPE_DATA)
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
"unsupported embedded BP (type=%u)\n",
BPE_GET_ETYPE(bp));
lsize = BPE_GET_LSIZE(bp);
psize = BF64_GET_SB(grub_zfs_to_cpu64 ((bp)->blk_prop, endian), 25, 7, 0, 1);
}
else
{
lsize = (BP_IS_HOLE(bp) ? 0 : lsize = (BP_IS_HOLE(bp) ? 0 :
(((grub_zfs_to_cpu64 ((bp)->blk_prop, endian) & 0xffff) + 1) (((grub_zfs_to_cpu64 ((bp)->blk_prop, endian) & 0xffff) + 1)
<< SPA_MINBLOCKSHIFT)); << SPA_MINBLOCKSHIFT));
psize = get_psize (bp, endian); psize = get_psize (bp, endian);
}
grub_dprintf("zfs", "zio_read: E %d: size %" PRIdGRUB_SSIZE "/%"
PRIdGRUB_SSIZE "\n", (int)BP_IS_EMBEDDED(bp), lsize, psize);
if (size) if (size)
*size = lsize; *size = lsize;
@@ -1889,32 +1837,25 @@ zio_read (blkptr_t *bp, grub_zfs_endian_t endian, void **buf,
"compression algorithm %s not supported\n", decomp_table[comp].name); "compression algorithm %s not supported\n", decomp_table[comp].name);
if (comp != ZIO_COMPRESS_OFF) if (comp != ZIO_COMPRESS_OFF)
{
/* It's not really necessary to align to 16, just for safety. */ /* It's not really necessary to align to 16, just for safety. */
compbuf = grub_malloc (ALIGN_UP (psize, 16)); compbuf = grub_malloc (ALIGN_UP (psize, 16));
else
compbuf = *buf = grub_malloc (lsize);
if (! compbuf) if (! compbuf)
return grub_errno; return grub_errno;
}
else
compbuf = *buf = grub_malloc (lsize);
grub_dprintf ("zfs", "endian = %d\n", endian); grub_dprintf ("zfs", "endian = %d\n", endian);
if (BP_IS_EMBEDDED(bp))
err = decode_embedded_bp_compressed(bp, compbuf);
else
{
err = zio_read_data (bp, endian, compbuf, data); err = zio_read_data (bp, endian, compbuf, data);
/* FIXME is it really necessary? */
if (comp != ZIO_COMPRESS_OFF)
grub_memset (compbuf + psize, 0, ALIGN_UP (psize, 16) - psize);
}
if (err) if (err)
{ {
grub_free (compbuf); grub_free (compbuf);
*buf = NULL; *buf = NULL;
return err; return err;
} }
grub_memset (compbuf, 0, ALIGN_UP (psize, 16) - psize);
if (!BP_IS_EMBEDDED(bp))
{
err = zio_checksum_verify (zc, checksum, endian, err = zio_checksum_verify (zc, checksum, endian,
compbuf, psize); compbuf, psize);
if (err) if (err)
@@ -1924,7 +1865,6 @@ zio_read (blkptr_t *bp, grub_zfs_endian_t endian, void **buf,
*buf = NULL; *buf = NULL;
return err; return err;
} }
}
if (encrypted) if (encrypted)
{ {
@@ -2035,7 +1975,7 @@ dmu_read (dnode_end_t * dn, grub_uint64_t blkid, void **buf,
dn->endian) dn->endian)
<< SPA_MINBLOCKSHIFT; << SPA_MINBLOCKSHIFT;
*buf = grub_malloc (size); *buf = grub_malloc (size);
if (!*buf) if (*buf)
{ {
err = grub_errno; err = grub_errno;
break; break;
@@ -2073,14 +2013,12 @@ dmu_read (dnode_end_t * dn, grub_uint64_t blkid, void **buf,
*/ */
static grub_err_t static grub_err_t
mzap_lookup (mzap_phys_t * zapobj, grub_zfs_endian_t endian, mzap_lookup (mzap_phys_t * zapobj, grub_zfs_endian_t endian,
grub_uint32_t objsize, const char *name, grub_uint64_t * value, int objsize, const char *name, grub_uint64_t * value,
int case_insensitive) int case_insensitive)
{ {
grub_uint32_t i, chunks; int i, chunks;
mzap_ent_phys_t *mzap_ent = zapobj->mz_chunk; mzap_ent_phys_t *mzap_ent = zapobj->mz_chunk;
if (objsize < MZAP_ENT_LEN)
return grub_error (GRUB_ERR_FILE_NOT_FOUND, N_("file `%s' not found"), name);
chunks = objsize / MZAP_ENT_LEN - 1; chunks = objsize / MZAP_ENT_LEN - 1;
for (i = 0; i < chunks; i++) for (i = 0; i < chunks; i++)
{ {
@@ -2488,7 +2426,7 @@ zap_lookup (dnode_end_t * zap_dnode, const char *name, grub_uint64_t *val,
struct grub_zfs_data *data, int case_insensitive) struct grub_zfs_data *data, int case_insensitive)
{ {
grub_uint64_t block_type; grub_uint64_t block_type;
grub_uint32_t size; int size;
void *zapbuf; void *zapbuf;
grub_err_t err; grub_err_t err;
grub_zfs_endian_t endian; grub_zfs_endian_t endian;
@@ -2496,7 +2434,7 @@ zap_lookup (dnode_end_t * zap_dnode, const char *name, grub_uint64_t *val,
grub_dprintf ("zfs", "looking for '%s'\n", name); grub_dprintf ("zfs", "looking for '%s'\n", name);
/* Read in the first block of the zap object data. */ /* Read in the first block of the zap object data. */
size = (grub_uint32_t) grub_zfs_to_cpu16 (zap_dnode->dn.dn_datablkszsec, size = grub_zfs_to_cpu16 (zap_dnode->dn.dn_datablkszsec,
zap_dnode->endian) << SPA_MINBLOCKSHIFT; zap_dnode->endian) << SPA_MINBLOCKSHIFT;
err = dmu_read (zap_dnode, 0, &zapbuf, &endian, data); err = dmu_read (zap_dnode, 0, &zapbuf, &endian, data);
if (err) if (err)
@@ -2882,10 +2820,7 @@ dnode_get_path (struct subvolume *subvol, const char *path_in, dnode_end_t *dn,
err = dmu_read (&(dnode_path->dn), block, &t, 0, data); err = dmu_read (&(dnode_path->dn), block, &t, 0, data);
if (err) if (err)
{
grub_free (sym_value);
return err; return err;
}
movesize = sym_sz - block * blksz; movesize = sym_sz - block * blksz;
if (movesize > blksz) if (movesize > blksz)
@@ -2900,8 +2835,6 @@ dnode_get_path (struct subvolume *subvol, const char *path_in, dnode_end_t *dn,
if (!path_buf) if (!path_buf)
{ {
grub_free (oldpathbuf); grub_free (oldpathbuf);
if (free_symval)
grub_free (sym_value);
return grub_errno; return grub_errno;
} }
grub_memcpy (path, sym_value, sym_sz); grub_memcpy (path, sym_value, sym_sz);
@@ -3085,7 +3018,7 @@ get_filesystem_dnode (dnode_end_t * mosmdn, char *fsname,
grub_dprintf ("zfs", "alive\n"); grub_dprintf ("zfs", "alive\n");
err = dnode_get (mosmdn, objnum, 0, mdn, data); err = dnode_get (mosmdn, objnum, DMU_OT_DSL_DIR, mdn, data);
if (err) if (err)
return err; return err;
@@ -3118,7 +3051,7 @@ get_filesystem_dnode (dnode_end_t * mosmdn, char *fsname,
if (err) if (err)
return err; return err;
err = dnode_get (mosmdn, objnum, 0, mdn, data); err = dnode_get (mosmdn, objnum, DMU_OT_DSL_DIR, mdn, data);
if (err) if (err)
return err; return err;
@@ -3273,7 +3206,8 @@ dnode_get_fullpath (const char *fullpath, struct subvolume *subvol,
grub_dprintf ("zfs", "endian = %d\n", subvol->mdn.endian); grub_dprintf ("zfs", "endian = %d\n", subvol->mdn.endian);
err = dnode_get (&(data->mos), headobj, 0, &subvol->mdn, data); err = dnode_get (&(data->mos), headobj, DMU_OT_DSL_DATASET, &subvol->mdn,
data);
if (err) if (err)
{ {
grub_free (fsname); grub_free (fsname);
@@ -3669,12 +3603,7 @@ zfs_mount (grub_device_t dev)
if (ub->ub_version >= SPA_VERSION_FEATURES && if (ub->ub_version >= SPA_VERSION_FEATURES &&
check_mos_features(&((objset_phys_t *) osp)->os_meta_dnode,ub_endian, check_mos_features(&((objset_phys_t *) osp)->os_meta_dnode,ub_endian,
data) != 0) data) != 0)
{
grub_error (GRUB_ERR_BAD_FS, "Unsupported features in pool");
grub_free (osp);
zfs_unmount (data);
return NULL; return NULL;
}
/* Got the MOS. Save it at the memory addr MOS. */ /* Got the MOS. Save it at the memory addr MOS. */
grub_memmove (&(data->mos.dn), &((objset_phys_t *) osp)->os_meta_dnode, grub_memmove (&(data->mos.dn), &((objset_phys_t *) osp)->os_meta_dnode,
@@ -3683,6 +3612,8 @@ zfs_mount (grub_device_t dev)
ub_endian) >> 63) & 1; ub_endian) >> 63) & 1;
grub_free (osp); grub_free (osp);
data->mounted = 1;
return data; return data;
} }
@@ -3972,7 +3903,7 @@ fill_fs_info (struct grub_dirhook_info *info,
{ {
headobj = grub_zfs_to_cpu64 (((dsl_dir_phys_t *) DN_BONUS (&mdn.dn))->dd_head_dataset_obj, mdn.endian); headobj = grub_zfs_to_cpu64 (((dsl_dir_phys_t *) DN_BONUS (&mdn.dn))->dd_head_dataset_obj, mdn.endian);
err = dnode_get (&(data->mos), headobj, 0, &mdn, data); err = dnode_get (&(data->mos), headobj, DMU_OT_DSL_DATASET, &mdn, data);
if (err) if (err)
{ {
grub_dprintf ("zfs", "failed here\n"); grub_dprintf ("zfs", "failed here\n");
@@ -4050,12 +3981,7 @@ iterate_zap (const char *name, grub_uint64_t val, struct grub_zfs_dir_ctx *ctx)
dnode_end_t dn; dnode_end_t dn;
grub_memset (&info, 0, sizeof (info)); grub_memset (&info, 0, sizeof (info));
err = dnode_get (&(ctx->data->subvol.mdn), val, 0, &dn, ctx->data); dnode_get (&(ctx->data->subvol.mdn), val, 0, &dn, ctx->data);
if (err)
{
grub_print_error ();
return 0;
}
if (dn.dn.dn_bonustype == DMU_OT_SA) if (dn.dn.dn_bonustype == DMU_OT_SA)
{ {
@@ -4276,11 +4202,11 @@ check_feature (const char *name, grub_uint64_t val,
* errnum: Failure. * errnum: Failure.
*/ */
static grub_err_t static int
check_mos_features(dnode_phys_t *mosmdn_phys,grub_zfs_endian_t endian,struct grub_zfs_data* data ) check_mos_features(dnode_phys_t *mosmdn_phys,grub_zfs_endian_t endian,struct grub_zfs_data* data )
{ {
grub_uint64_t objnum; grub_uint64_t objnum;
grub_err_t errnum = 0; grub_uint8_t errnum = 0;
dnode_end_t dn,mosmdn; dnode_end_t dn,mosmdn;
mzap_phys_t* mzp; mzap_phys_t* mzp;
grub_zfs_endian_t endianzap; grub_zfs_endian_t endianzap;
+1 -8
View File
@@ -238,7 +238,7 @@ grub_gcm_decrypt (grub_crypto_cipher_handle_t cipher,
grub_crypto_xor (out + 16 * i, in + 16 * i, mul, csize); grub_crypto_xor (out + 16 * i, in + 16 * i, mul, csize);
} }
for (j = 0; j < 8; j++) for (j = 0; j < 8; j++)
mac[15 - j] ^= ((((grub_uint64_t) psize) * 8) >> (8 * j)); mac[15 - j] ^= ((psize * 8) >> (8 * j));
grub_gcm_mul (mac, h); grub_gcm_mul (mac, h);
if (mac_out) if (mac_out)
@@ -354,7 +354,6 @@ grub_zfs_load_key_real (const struct grub_zfs_key *key,
if (err) if (err)
{ {
grub_errno = GRUB_ERR_NONE; grub_errno = GRUB_ERR_NONE;
grub_crypto_cipher_close (cipher);
continue; continue;
} }
@@ -363,7 +362,6 @@ grub_zfs_load_key_real (const struct grub_zfs_key *key,
if (err) if (err)
{ {
grub_errno = GRUB_ERR_NONE; grub_errno = GRUB_ERR_NONE;
grub_crypto_cipher_close (cipher);
continue; continue;
} }
@@ -374,7 +372,6 @@ grub_zfs_load_key_real (const struct grub_zfs_key *key,
{ {
grub_dprintf ("zfs", "key loading failed\n"); grub_dprintf ("zfs", "key loading failed\n");
grub_errno = GRUB_ERR_NONE; grub_errno = GRUB_ERR_NONE;
grub_crypto_cipher_close (cipher);
continue; continue;
} }
@@ -384,14 +381,12 @@ grub_zfs_load_key_real (const struct grub_zfs_key *key,
{ {
grub_dprintf ("zfs", "key loading failed\n"); grub_dprintf ("zfs", "key loading failed\n");
grub_errno = GRUB_ERR_NONE; grub_errno = GRUB_ERR_NONE;
grub_crypto_cipher_close (cipher);
continue; continue;
} }
ret = grub_crypto_cipher_open (GRUB_CIPHER_AES); ret = grub_crypto_cipher_open (GRUB_CIPHER_AES);
if (!ret) if (!ret)
{ {
grub_errno = GRUB_ERR_NONE; grub_errno = GRUB_ERR_NONE;
grub_crypto_cipher_close (cipher);
continue; continue;
} }
err = grub_crypto_cipher_set_key (ret, decrypted, keylen); err = grub_crypto_cipher_set_key (ret, decrypted, keylen);
@@ -399,10 +394,8 @@ grub_zfs_load_key_real (const struct grub_zfs_key *key,
{ {
grub_errno = GRUB_ERR_NONE; grub_errno = GRUB_ERR_NONE;
grub_crypto_cipher_close (ret); grub_crypto_cipher_close (ret);
grub_crypto_cipher_close (cipher);
continue; continue;
} }
grub_crypto_cipher_close (cipher);
return ret; return ret;
} }
return NULL; return NULL;
Loaded 100 of 346 files, more files were not shown because too many files have changed in this diff. Show more