mirror of
http://cgit.git.savannah.gnu.org/git/grub.git
synced 2026-04-28 14:33:34 +00:00
Compare commits
1 Commits
phcoder/fi
...
peter/devm
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e7f405abb3 |
16
.gitignore
vendored
16
.gitignore
vendored
@@ -12,9 +12,7 @@ ascii.bitmaps
|
||||
ascii.h
|
||||
autom4te.cache
|
||||
build_env.mk
|
||||
build-grub-gen-asciih
|
||||
build-grub-gen-widthspec
|
||||
build-grub-mkfont
|
||||
.bzrignore
|
||||
cdboot_test
|
||||
cmp_test
|
||||
config.cache
|
||||
@@ -51,7 +49,6 @@ grub_cmd_set_date
|
||||
grub_cmd_sleep
|
||||
grub-editenv
|
||||
grub-emu
|
||||
grub-emu-lite
|
||||
grub_emu_init.c
|
||||
grub_emu_init.h
|
||||
grub-fstest
|
||||
@@ -62,7 +59,7 @@ grub-install
|
||||
grub-kbdcomp
|
||||
grub-macho2img
|
||||
grub-menulst2cfg
|
||||
/grub-mk*
|
||||
grub-mk*
|
||||
grub-mount
|
||||
grub-ofpathname
|
||||
grub-pe2elf
|
||||
@@ -130,7 +127,6 @@ mod-*.c
|
||||
missing
|
||||
netboot_test
|
||||
*.o
|
||||
*.a
|
||||
ohci_test
|
||||
partmap_test
|
||||
pata_test
|
||||
@@ -165,10 +161,10 @@ depcomp
|
||||
mdate-sh
|
||||
texinfo.tex
|
||||
grub-core/lib/libgcrypt-grub
|
||||
.deps
|
||||
.deps-util
|
||||
.deps-core
|
||||
.dirstamp
|
||||
**/.deps
|
||||
**/.deps-util
|
||||
**/.deps-core
|
||||
**/.dirstamp
|
||||
Makefile.util.am
|
||||
contrib
|
||||
grub-core/bootinfo.txt
|
||||
|
||||
5
INSTALL
5
INSTALL
@@ -12,11 +12,6 @@ you don't have any of them, please obtain and install them before
|
||||
configuring the GRUB.
|
||||
|
||||
* GCC 4.1.3 or later
|
||||
Note: older versions may work but support is limited
|
||||
Note: clang 3.2 or later works for i386 and x86_64 targets but results in
|
||||
much bigger binaries.
|
||||
Note: clang 3.2 or later works for arm
|
||||
Note: clang 3.4 or later works for powerpc
|
||||
* GNU Make
|
||||
* GNU Bison 2.3 or later
|
||||
* GNU gettext 0.17 or later
|
||||
|
||||
42
Makefile.am
42
Makefile.am
@@ -68,19 +68,12 @@ starfield_theme_files = $(srcdir)/themes/starfield/blob_w.png $(srcdir)/themes/s
|
||||
|
||||
build-grub-mkfont: util/grub-mkfont.c grub-core/unidata.c grub-core/kern/emu/misc.c util/misc.c
|
||||
$(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 -DGRUB_BUILD_PROGRAM_NAME=\"build-grub-mkfont\" $^ $(build_freetype_cflags) $(build_freetype_libs)
|
||||
CLEANFILES += build-grub-mkfont
|
||||
|
||||
garbage-gen: util/garbage-gen.c
|
||||
$(BUILD_CC) -o $@ $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $^
|
||||
CLEANFILES += garbage-gen
|
||||
|
||||
build-grub-gen-asciih: util/grub-gen-asciih.c
|
||||
$(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 $^ $(build_freetype_cflags) $(build_freetype_libs) -Wall -Werror
|
||||
CLEANFILES += build-grub-gen-asciih
|
||||
|
||||
build-grub-gen-widthspec: util/grub-gen-widthspec.c
|
||||
$(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 $^ $(build_freetype_cflags) $(build_freetype_libs) -Wall -Werror
|
||||
CLEANFILES += build-grub-gen-widthspec
|
||||
|
||||
if COND_STARFIELD
|
||||
starfield_DATA = dejavu_10.pf2 dejavu_12.pf2 dejavu_bold_14.pf2 dejavu_14.pf2 dejavu_16.pf2 $(starfield_theme_files)
|
||||
@@ -95,7 +88,7 @@ dejavu_bold_14.pf2: $(DJVU_FONT_SOURCE) build-grub-mkfont
|
||||
dejavu_16.pf2: $(DJVU_FONT_SOURCE) build-grub-mkfont
|
||||
./build-grub-mkfont -s 16 -o $@ $(DJVU_FONT_SOURCE)
|
||||
else
|
||||
starfield_DATA =
|
||||
starfield_DATA =
|
||||
endif
|
||||
|
||||
EXTRA_DIST += $(starfield_theme_files)
|
||||
@@ -118,11 +111,11 @@ euro.pf2: $(FONT_SOURCE) build-grub-mkfont
|
||||
CLEANFILES += euro.pf2
|
||||
|
||||
ascii.h: $(FONT_SOURCE) build-grub-gen-asciih
|
||||
./build-grub-gen-asciih $(FONT_SOURCE) $@
|
||||
./build-grub-gen-asciih $(FONT_SOURCE) $@
|
||||
CLEANFILES += ascii.h
|
||||
|
||||
widthspec.h: $(FONT_SOURCE) build-grub-gen-widthspec
|
||||
./build-grub-gen-widthspec $(FONT_SOURCE) $@
|
||||
./build-grub-gen-widthspec $(FONT_SOURCE) $@
|
||||
CLEANFILES += widthspec.h
|
||||
|
||||
# Install config.h into platformdir
|
||||
@@ -396,33 +389,4 @@ BOOTCHECK_TIMEOUT=180
|
||||
|
||||
bootcheck: $(BOOTCHECKS)
|
||||
|
||||
if COND_i386_coreboot
|
||||
default_payload.elf: grub-mkstandalone grub-mkimage
|
||||
pkgdatadir=. ./grub-mkstandalone --grub-mkimage=./grub-mkimage -O i386-coreboot -o $@ --modules='ahci pata ehci uhci ohci usb_keyboard usbms part_msdos xfs ext2 fat at_keyboard part_gpt usbserial_usbdebug cbfs' --install-modules='ls linux search configfile normal cbtime cbls memrw iorw minicmd lsmmap lspci halt reboot hexdump pcidump regexp setpci lsacpi chain test' --fonts= --themes= --locales= -d grub-core/ /boot/grub/grub.cfg=$(srcdir)/coreboot.cfg
|
||||
endif
|
||||
|
||||
windowsdir=$(top_builddir)/$(PACKAGE)-$(VERSION)-for-windows
|
||||
windowsdir: $(PROGRAMS) $(starfield_DATA) $(platform_DATA)
|
||||
test -d $(windowsdir) && rm -rf $(windowsdir) || true
|
||||
test -d $(windowsdir) || mkdir $(windowsdir)
|
||||
$(MAKE) -C po $(AM_MAKEFLAGS) windowsdir
|
||||
$(MAKE) -C grub-core $(AM_MAKEFLAGS) windowsdir
|
||||
test -d $(windowsdir)/themes || mkdir $(windowsdir)/themes
|
||||
test -d $(windowsdir)/themes/starfield || mkdir $(windowsdir)/themes/starfield
|
||||
for x in $(PROGRAMS); do \
|
||||
if [ x$(STRIP) != x ]; then $(STRIP) $$x -o $(windowsdir)/$$x; \
|
||||
else cp -fp $$x $(windowsdir)/$$x; fi; \
|
||||
done
|
||||
for x in $(pkgdata_DATA); do \
|
||||
cp -fp $$x $(windowsdir)/$$x; \
|
||||
done
|
||||
for x in $(starfield_DATA); do \
|
||||
cp -fp $$x $(windowsdir)/themes/starfield/$$(basename $$x); \
|
||||
done
|
||||
|
||||
windowszip=$(top_builddir)/$(PACKAGE)-$(VERSION)-for-windows.zip
|
||||
windowszip: windowsdir
|
||||
test -f $(windowszip) && rm $(windowszip) || true
|
||||
zip -r $(windowszip) $(windowsdir)
|
||||
|
||||
EXTRA_DIST += linguas.sh
|
||||
|
||||
@@ -9,13 +9,11 @@ library = {
|
||||
common = grub-core/kern/command.c;
|
||||
common = grub-core/kern/device.c;
|
||||
common = grub-core/kern/disk.c;
|
||||
common = grub-core/lib/disk.c;
|
||||
common = util/getroot.c;
|
||||
common = grub-core/osdep/unix/getroot.c;
|
||||
common = grub-core/osdep/getroot.c;
|
||||
common = grub-core/osdep/devmapper/getroot.c;
|
||||
common = grub-core/osdep/relpath.c;
|
||||
extra_dist = grub-core/kern/disk_common.c;
|
||||
extra_dist = grub-core/osdep/unix/relpath.c;
|
||||
extra_dist = grub-core/osdep/aros/relpath.c;
|
||||
extra_dist = grub-core/osdep/windows/relpath.c;
|
||||
@@ -171,11 +169,6 @@ program = {
|
||||
common = util/resolve.c;
|
||||
common = grub-core/kern/emu/argp_common.c;
|
||||
common = grub-core/osdep/init.c;
|
||||
common = grub-core/osdep/config.c;
|
||||
extra_dist = grub-core/osdep/aros/config.c;
|
||||
extra_dist = grub-core/osdep/windows/config.c;
|
||||
extra_dist = grub-core/osdep/unix/config.c;
|
||||
common = util/config.c;
|
||||
|
||||
common = grub-core/kern/arm/dl_helper.c;
|
||||
|
||||
@@ -255,7 +248,7 @@ program = {
|
||||
name = grub-macho2img;
|
||||
mansection = 1;
|
||||
common = util/grub-macho2img.c;
|
||||
condition = COND_APPLE_LINKER;
|
||||
condition = COND_APPLE_CC;
|
||||
};
|
||||
|
||||
program = {
|
||||
@@ -315,7 +308,6 @@ program = {
|
||||
installdir = sbin;
|
||||
mansection = 8;
|
||||
common = util/grub-probe.c;
|
||||
common = util/probe.c;
|
||||
common = grub-core/osdep/ofpath.c;
|
||||
common = grub-core/kern/emu/argp_common.c;
|
||||
common = grub-core/osdep/init.c;
|
||||
@@ -485,165 +477,38 @@ script = {
|
||||
installdir = grubconf;
|
||||
};
|
||||
|
||||
program = {
|
||||
script = {
|
||||
mansection = 1;
|
||||
name = grub-mkrescue;
|
||||
|
||||
common = util/grub-mkrescue.c;
|
||||
common = util/render-label.c;
|
||||
common = util/glue-efi.c;
|
||||
common = util/mkimage.c;
|
||||
common = util/grub-install-common.c;
|
||||
common = util/setup_bios.c;
|
||||
common = util/setup_sparc.c;
|
||||
common = grub-core/lib/reed_solomon.c;
|
||||
common = grub-core/osdep/random.c;
|
||||
common = grub-core/osdep/ofpath.c;
|
||||
common = grub-core/osdep/platform.c;
|
||||
common = grub-core/osdep/platform_unix.c;
|
||||
common = grub-core/osdep/compress.c;
|
||||
extra_dist = grub-core/osdep/unix/compress.c;
|
||||
extra_dist = grub-core/osdep/basic/compress.c;
|
||||
common = util/editenv.c;
|
||||
common = grub-core/osdep/blocklist.c;
|
||||
common = grub-core/osdep/config.c;
|
||||
common = util/config.c;
|
||||
|
||||
common = grub-core/kern/emu/hostfs.c;
|
||||
common = grub-core/disk/host.c;
|
||||
|
||||
common = grub-core/kern/arm/dl_helper.c;
|
||||
|
||||
common = util/resolve.c;
|
||||
|
||||
common = grub-core/kern/emu/argp_common.c;
|
||||
common = grub-core/osdep/init.c;
|
||||
|
||||
ldadd = '$(LIBLZMA)';
|
||||
ldadd = libgrubmods.a;
|
||||
ldadd = libgrubgcry.a;
|
||||
ldadd = libgrubkern.a;
|
||||
ldadd = grub-core/gnulib/libgnu.a;
|
||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||
|
||||
condition = COND_HAVE_EXEC;
|
||||
common = util/grub-install_header;
|
||||
common = util/grub-mkrescue.in;
|
||||
enable = noemu;
|
||||
};
|
||||
|
||||
program = {
|
||||
script = {
|
||||
mansection = 1;
|
||||
name = grub-mkstandalone;
|
||||
common = util/grub-mkstandalone.c;
|
||||
|
||||
common = util/render-label.c;
|
||||
common = util/glue-efi.c;
|
||||
common = util/mkimage.c;
|
||||
common = util/grub-install-common.c;
|
||||
common = util/setup_bios.c;
|
||||
common = util/setup_sparc.c;
|
||||
common = grub-core/lib/reed_solomon.c;
|
||||
common = grub-core/osdep/random.c;
|
||||
common = grub-core/osdep/ofpath.c;
|
||||
common = grub-core/osdep/platform.c;
|
||||
common = grub-core/osdep/platform_unix.c;
|
||||
extra_dist = grub-core/osdep/linux/platform.c;
|
||||
extra_dist = grub-core/osdep/basic/platform.c;
|
||||
extra_dist = grub-core/osdep/basic/no_platform.c;
|
||||
extra_dist = grub-core/osdep/unix/platform.c;
|
||||
common = grub-core/osdep/compress.c;
|
||||
common = util/editenv.c;
|
||||
common = grub-core/osdep/blocklist.c;
|
||||
common = grub-core/osdep/config.c;
|
||||
common = util/config.c;
|
||||
|
||||
common = grub-core/kern/emu/hostfs.c;
|
||||
common = grub-core/disk/host.c;
|
||||
|
||||
common = grub-core/kern/arm/dl_helper.c;
|
||||
|
||||
common = util/resolve.c;
|
||||
|
||||
common = grub-core/kern/emu/argp_common.c;
|
||||
common = grub-core/osdep/init.c;
|
||||
|
||||
ldadd = '$(LIBLZMA)';
|
||||
ldadd = libgrubmods.a;
|
||||
ldadd = libgrubgcry.a;
|
||||
ldadd = libgrubkern.a;
|
||||
ldadd = grub-core/gnulib/libgnu.a;
|
||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||
common = util/grub-install_header;
|
||||
common = util/grub-mkstandalone.in;
|
||||
};
|
||||
|
||||
program = {
|
||||
script = {
|
||||
mansection = 8;
|
||||
installdir = sbin;
|
||||
name = grub-install;
|
||||
|
||||
common = util/grub-install.c;
|
||||
common = util/probe.c;
|
||||
common = util/mkimage.c;
|
||||
common = util/grub-install-common.c;
|
||||
common = util/setup_bios.c;
|
||||
common = util/setup_sparc.c;
|
||||
common = grub-core/lib/reed_solomon.c;
|
||||
common = grub-core/osdep/random.c;
|
||||
common = grub-core/osdep/ofpath.c;
|
||||
common = grub-core/osdep/platform.c;
|
||||
common = grub-core/osdep/platform_unix.c;
|
||||
common = grub-core/osdep/compress.c;
|
||||
common = util/editenv.c;
|
||||
common = grub-core/osdep/blocklist.c;
|
||||
common = grub-core/osdep/config.c;
|
||||
common = util/config.c;
|
||||
|
||||
common = grub-core/kern/arm/dl_helper.c;
|
||||
|
||||
common = util/resolve.c;
|
||||
common = util/grub-install_header;
|
||||
common = util/grub-install.in;
|
||||
enable = noemu;
|
||||
common = grub-core/kern/emu/argp_common.c;
|
||||
common = grub-core/osdep/init.c;
|
||||
|
||||
ldadd = '$(LIBLZMA)';
|
||||
ldadd = libgrubmods.a;
|
||||
ldadd = libgrubgcry.a;
|
||||
ldadd = libgrubkern.a;
|
||||
ldadd = grub-core/gnulib/libgnu.a;
|
||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||
};
|
||||
|
||||
program = {
|
||||
script = {
|
||||
mansection = 1;
|
||||
installdir = bin;
|
||||
name = grub-mknetdir;
|
||||
|
||||
common = util/grub-mknetdir.c;
|
||||
|
||||
common = util/mkimage.c;
|
||||
common = util/grub-install-common.c;
|
||||
common = util/setup_bios.c;
|
||||
common = util/setup_sparc.c;
|
||||
common = grub-core/lib/reed_solomon.c;
|
||||
common = grub-core/osdep/random.c;
|
||||
common = grub-core/osdep/ofpath.c;
|
||||
common = grub-core/osdep/platform.c;
|
||||
common = grub-core/osdep/platform_unix.c;
|
||||
common = grub-core/osdep/compress.c;
|
||||
common = util/editenv.c;
|
||||
common = grub-core/osdep/blocklist.c;
|
||||
common = grub-core/osdep/config.c;
|
||||
common = util/config.c;
|
||||
|
||||
common = grub-core/kern/arm/dl_helper.c;
|
||||
|
||||
common = util/resolve.c;
|
||||
common = grub-core/kern/emu/argp_common.c;
|
||||
common = grub-core/osdep/init.c;
|
||||
|
||||
ldadd = '$(LIBLZMA)';
|
||||
ldadd = libgrubmods.a;
|
||||
ldadd = libgrubgcry.a;
|
||||
ldadd = libgrubkern.a;
|
||||
ldadd = grub-core/gnulib/libgnu.a;
|
||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||
common = util/grub-install_header;
|
||||
common = util/grub-mknetdir.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
@@ -691,127 +556,6 @@ script = {
|
||||
installdir = noinst;
|
||||
};
|
||||
|
||||
script = {
|
||||
name = grub-fs-tester;
|
||||
common = tests/util/grub-fs-tester.in;
|
||||
installdir = noinst;
|
||||
dependencies = garbage-gen;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = ext234_test;
|
||||
common = tests/ext234_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = squashfs_test;
|
||||
common = tests/squashfs_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = iso9660_test;
|
||||
common = tests/iso9660_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = hfsplus_test;
|
||||
common = tests/hfsplus_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = ntfs_test;
|
||||
common = tests/ntfs_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = reiserfs_test;
|
||||
common = tests/reiserfs_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = fat_test;
|
||||
common = tests/fat_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = minixfs_test;
|
||||
common = tests/minixfs_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = xfs_test;
|
||||
common = tests/xfs_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = nilfs2_test;
|
||||
common = tests/nilfs2_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = romfs_test;
|
||||
common = tests/romfs_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = exfat_test;
|
||||
common = tests/exfat_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = tar_test;
|
||||
common = tests/tar_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = udf_test;
|
||||
common = tests/udf_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = hfs_test;
|
||||
common = tests/hfs_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = jfs_test;
|
||||
common = tests/jfs_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = btrfs_test;
|
||||
common = tests/btrfs_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = zfs_test;
|
||||
common = tests/zfs_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = cpio_test;
|
||||
common = tests/cpio_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = example_scripted_test;
|
||||
|
||||
66
acinclude.m4
66
acinclude.m4
@@ -134,29 +134,6 @@ if test "x$grub_cv_prog_ld_build_id_none" = xyes; then
|
||||
fi
|
||||
])
|
||||
|
||||
dnl Check nm
|
||||
AC_DEFUN([grub_PROG_NM_WORKS],
|
||||
[AC_MSG_CHECKING([whether nm works])
|
||||
AC_CACHE_VAL(grub_cv_prog_nm_works,
|
||||
[
|
||||
nm_works_tmp_dir="$(mktemp -d "./confXXXXXX")"
|
||||
AC_LANG_CONFTEST([AC_LANG_PROGRAM([[]], [[]])])
|
||||
$TARGET_CC $TARGET_CFLAGS -c conftest.c -o "$nm_works_tmp_dir/ef"
|
||||
if $TARGET_NM "$nm_works_tmp_dir/ef" > /dev/null; then
|
||||
grub_cv_prog_nm_works=yes
|
||||
else
|
||||
grub_cv_prog_nm_minus_p=no
|
||||
fi
|
||||
rm "$nm_works_tmp_dir/ef"
|
||||
rmdir "$nm_works_tmp_dir"
|
||||
])
|
||||
AC_MSG_RESULT([$grub_cv_prog_nm_works])
|
||||
|
||||
if test "x$grub_cv_prog_nm_works" != xyes; then
|
||||
AC_MSG_ERROR([nm does not work])
|
||||
fi
|
||||
])
|
||||
|
||||
dnl Supply -P to nm
|
||||
AC_DEFUN([grub_PROG_NM_MINUS_P],
|
||||
[AC_MSG_CHECKING([whether nm accepts -P])
|
||||
@@ -164,14 +141,13 @@ AC_CACHE_VAL(grub_cv_prog_nm_minus_p,
|
||||
[
|
||||
nm_minus_p_tmp_dir="$(mktemp -d "./confXXXXXX")"
|
||||
AC_LANG_CONFTEST([AC_LANG_PROGRAM([[]], [[]])])
|
||||
$TARGET_CC $TARGET_CFLAGS -c conftest.c -o "$nm_minus_p_tmp_dir/ef"
|
||||
$TARGET_CC conftest.c -o "$nm_minus_p_tmp_dir/ef"
|
||||
if $TARGET_NM -P "$nm_minus_p_tmp_dir/ef" 2>&1 > /dev/null; then
|
||||
grub_cv_prog_nm_minus_p=yes
|
||||
else
|
||||
grub_cv_prog_nm_minus_p=no
|
||||
fi
|
||||
rm "$nm_minus_p_tmp_dir/ef"
|
||||
rmdir "$nm_minus_p_tmp_dir"
|
||||
])
|
||||
AC_MSG_RESULT([$grub_cv_prog_nm_minus_p])
|
||||
|
||||
@@ -189,14 +165,13 @@ AC_CACHE_VAL(grub_cv_prog_nm_defined_only,
|
||||
[
|
||||
nm_defined_only_tmp_dir="$(mktemp -d "./confXXXXXX")"
|
||||
AC_LANG_CONFTEST([AC_LANG_PROGRAM([[]], [[]])])
|
||||
$TARGET_CC $TARGET_CFLAGS -c conftest.c -o "$nm_defined_only_tmp_dir/ef"
|
||||
$TARGET_CC conftest.c -o "$nm_defined_only_tmp_dir/ef"
|
||||
if $TARGET_NM --defined-only "$nm_defined_only_tmp_dir/ef" 2>&1 > /dev/null; then
|
||||
grub_cv_prog_nm_defined_only=yes
|
||||
else
|
||||
grub_cv_prog_nm_defined_only=no
|
||||
fi
|
||||
rm "$nm_defined_only_tmp_dir/ef"
|
||||
rmdir "$nm_defined_only_tmp_dir"
|
||||
])
|
||||
AC_MSG_RESULT([$grub_cv_prog_nm_defined_only])
|
||||
|
||||
@@ -237,7 +212,7 @@ 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
|
||||
if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
|
||||
grub_cv_i386_asm_addr32=yes
|
||||
else
|
||||
grub_cv_i386_asm_addr32=no
|
||||
@@ -247,6 +222,37 @@ rm -f conftest*])
|
||||
|
||||
AC_MSG_RESULT([$grub_cv_i386_asm_addr32])])
|
||||
|
||||
dnl check if our compiler is apple cc
|
||||
dnl because it requires numerous workarounds
|
||||
AC_DEFUN([grub_apple_cc],
|
||||
[AC_REQUIRE([AC_PROG_CC])
|
||||
AC_MSG_CHECKING([whether our compiler is apple cc])
|
||||
AC_CACHE_VAL(grub_cv_apple_cc,
|
||||
[if $CC -v 2>&1 | grep "Apple Inc." > /dev/null; then
|
||||
grub_cv_apple_cc=yes
|
||||
else
|
||||
grub_cv_apple_cc=no
|
||||
fi
|
||||
])
|
||||
|
||||
AC_MSG_RESULT([$grub_cv_apple_cc])])
|
||||
|
||||
dnl check if our target compiler is apple cc
|
||||
dnl because it requires numerous workarounds
|
||||
AC_DEFUN([grub_apple_target_cc],
|
||||
[AC_REQUIRE([AC_PROG_CC])
|
||||
AC_MSG_CHECKING([whether our target compiler is apple cc])
|
||||
AC_CACHE_VAL(grub_cv_apple_target_cc,
|
||||
[if $CC -v 2>&1 | grep "Apple Inc." > /dev/null; then
|
||||
grub_cv_apple_target_cc=yes
|
||||
else
|
||||
grub_cv_apple_target_cc=no
|
||||
fi
|
||||
])
|
||||
|
||||
AC_MSG_RESULT([$grub_cv_apple_target_cc])])
|
||||
|
||||
|
||||
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.
|
||||
@@ -260,7 +266,7 @@ AC_CACHE_VAL(grub_cv_i386_asm_prefix_requirement,
|
||||
l1: addr32 movb %al, l1
|
||||
EOF
|
||||
|
||||
if AC_TRY_COMMAND([${CC-cc} ${TARGET_CCASFLAGS} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
|
||||
if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
|
||||
grub_cv_i386_asm_prefix_requirement=yes
|
||||
else
|
||||
grub_cv_i386_asm_prefix_requirement=no
|
||||
@@ -385,7 +391,7 @@ AC_MSG_CHECKING([whether `$CC' accepts `-mstack-arg-probe'])
|
||||
AC_LANG_CONFTEST([AC_LANG_SOURCE([[
|
||||
void foo (void) { volatile char a[8]; a[3]; }
|
||||
]])])
|
||||
[if eval "$ac_compile -S -mstack-arg-probe -Werror -o conftest.s" 2> /dev/null; then]
|
||||
[if eval "$ac_compile -S -mstack-arg-probe -o conftest.s" 2> /dev/null; then]
|
||||
AC_MSG_RESULT([yes])
|
||||
[# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
|
||||
rm -f conftest.s
|
||||
|
||||
@@ -6,6 +6,18 @@ export LC_COLLATE := C
|
||||
unexport LC_ALL
|
||||
|
||||
# Platform specific options
|
||||
if COND_i386_pc
|
||||
CFLAGS_PLATFORM += -mrtd -mregparm=3 -freg-struct-return
|
||||
endif
|
||||
if COND_i386_qemu
|
||||
CFLAGS_PLATFORM += -mrtd -mregparm=3 -freg-struct-return
|
||||
endif
|
||||
if COND_i386_coreboot
|
||||
CFLAGS_PLATFORM += -mrtd -mregparm=3 -freg-struct-return
|
||||
endif
|
||||
if COND_i386_ieee1275
|
||||
CFLAGS_PLATFORM += -mrtd -mregparm=3 -freg-struct-return
|
||||
endif
|
||||
if COND_mips_loongson
|
||||
CFLAGS_PLATFORM += -mexplicit-relocs
|
||||
CPPFLAGS_PLATFORM = -DUSE_ASCII_FALLBACK
|
||||
@@ -20,15 +32,16 @@ if COND_sparc64_ieee1275
|
||||
endif
|
||||
if COND_arm
|
||||
CFLAGS_PLATFORM += -mthumb-interwork -mlong-calls
|
||||
CCASFLAGS_PLATFORM = -mthumb-interwork
|
||||
LDFLAGS_PLATFORM = -Wl,--wrap=__clear_cache
|
||||
endif
|
||||
|
||||
#FIXME: discover and check XEN headers
|
||||
CPPFLAGS_XEN = -I/usr/include
|
||||
|
||||
# Other options
|
||||
|
||||
if ! COND_emu
|
||||
CFLAGS_PLATFORM += -Dfloat=__grub_poison
|
||||
CFLAGS_PLATFORM += -Ddouble=__grub_poison
|
||||
endif
|
||||
|
||||
CPPFLAGS_DEFAULT = -DGRUB_FILE=\"$(subst $(srcdir)/,,$<)\"
|
||||
CPPFLAGS_DEFAULT += -I$(builddir)
|
||||
CPPFLAGS_DEFAULT += -I$(srcdir)
|
||||
@@ -41,10 +54,26 @@ CPPFLAGS_DEFAULT += -I$(top_srcdir)/grub-core/lib/libgcrypt-grub/src/
|
||||
CCASFLAGS_DEFAULT = $(CPPFLAGS_DEFAULT) -DASM_FILE=1
|
||||
BUILD_CPPFLAGS += $(CPPFLAGS_DEFAULT)
|
||||
|
||||
LDADD_KERNEL = $(TARGET_LIBGCC)
|
||||
LDADD_KERNEL =
|
||||
|
||||
if ! COND_i386_pc
|
||||
if ! COND_i386_efi
|
||||
if ! COND_i386_qemu
|
||||
if ! COND_i386_coreboot
|
||||
if ! COND_i386_multiboot
|
||||
if ! COND_i386_ieee1275
|
||||
if ! COND_x86_64_efi
|
||||
LDADD_KERNEL += -lgcc
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
CFLAGS_KERNEL = $(CFLAGS_CPU) $(CFLAGS_PLATFORM) -ffreestanding
|
||||
LDFLAGS_KERNEL = $(LDFLAGS_CPU) $(LDFLAGS_PLATFORM) -nostdlib $(TARGET_LDFLAGS_OLDMAGIC) $(TARGET_LDFLAGS_STATIC_LIBGCC)
|
||||
LDFLAGS_KERNEL = $(LDFLAGS_CPU) $(LDFLAGS_PLATFORM) -nostdlib $(TARGET_LDFLAGS_OLDMAGIC) -static-libgcc
|
||||
CPPFLAGS_KERNEL = $(CPPFLAGS_CPU) $(CPPFLAGS_PLATFORM) -DGRUB_KERNEL=1
|
||||
CCASFLAGS_KERNEL = $(CCASFLAGS_CPU) $(CCASFLAGS_PLATFORM)
|
||||
if COND_CYGWIN
|
||||
@@ -78,13 +107,13 @@ grubconfdir = $(sysconfdir)/grub.d
|
||||
platformdir = $(pkglibdir)/$(target_cpu)-$(platform)
|
||||
starfielddir = $(pkgdatadir)/themes/starfield
|
||||
|
||||
CFLAGS_GNULIB = -Wno-undef -Wno-sign-compare -Wno-unused -Wno-unused-parameter -Wno-redundant-decls -Wno-unreachable-code -Wno-conversion -Wno-old-style-definition
|
||||
CFLAGS_GNULIB = -Wno-undef -Wno-sign-compare -Wno-unused -Wno-unused-parameter -Wno-redundant-decls -Wno-unreachable-code -Wno-conversion -Wno-old-style-definition -Wno-unsafe-loop-optimizations
|
||||
CPPFLAGS_GNULIB = -I$(top_builddir)/grub-core/gnulib -I$(top_srcdir)/grub-core/gnulib
|
||||
|
||||
CFLAGS_POSIX = -fno-builtin
|
||||
CPPFLAGS_POSIX = -I$(top_srcdir)/grub-core/lib/posix_wrap
|
||||
|
||||
CFLAGS_GCRY = -Wno-error -Wno-missing-field-initializers -Wno-redundant-decls -Wno-undef $(CFLAGS_POSIX)
|
||||
CFLAGS_GCRY = -Wno-error -Wno-missing-field-initializers -Wno-redundant-decls $(CFLAGS_POSIX)
|
||||
CPPFLAGS_GCRY = -I$(top_srcdir)/grub-core/lib/libgcrypt_wrap $(CPPFLAGS_POSIX) -D_GCRYPT_IN_LIBGCRYPT=1 -I$(top_srcdir)/include/grub/gcrypt
|
||||
|
||||
CPPFLAGS_EFIEMU = -I$(top_srcdir)/grub-core/efiemu/runtime
|
||||
|
||||
@@ -12,9 +12,7 @@ EXTRA_DIST += util/import_gcry.py
|
||||
EXTRA_DIST += util/import_unicode.py
|
||||
|
||||
EXTRA_DIST += docs/man
|
||||
EXTRA_DIST += docs/autoiso.cfg
|
||||
EXTRA_DIST += docs/grub.cfg
|
||||
EXTRA_DIST += docs/osdetect.cfg
|
||||
|
||||
EXTRA_DIST += conf/i386-pc-cygwin-img-ld.sc
|
||||
|
||||
@@ -28,11 +26,6 @@ EXTRA_DIST += grub-core/gensymlist.sh
|
||||
EXTRA_DIST += grub-core/genemuinit.sh
|
||||
EXTRA_DIST += grub-core/genemuinitheader.sh
|
||||
|
||||
EXTRA_DIST += grub-core/gnulib-fix-null-deref.diff
|
||||
EXTRA_DIST += grub-core/gnulib-fix-width.diff
|
||||
EXTRA_DIST += grub-core/gnulib-no-abort.diff
|
||||
EXTRA_DIST += grub-core/gnulib-no-gets.diff
|
||||
|
||||
EXTRA_DIST += grub-core/lib/libgcrypt
|
||||
EXTRA_DIST += grub-core/lib/libgcrypt-grub/mpi/generic
|
||||
EXTRA_DIST += $(shell find $(top_srcdir)/include -name '*.h')
|
||||
@@ -110,4 +103,3 @@ EXTRA_DIST += grub-core/osdep/windows/sleep.c
|
||||
EXTRA_DIST += tests/dfly-mbr-mbexample.mbr.img.gz
|
||||
EXTRA_DIST += tests/dfly-mbr-mbexample.dfly.img.gz
|
||||
|
||||
EXTRA_DIST += coreboot.cfg
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
#define __powerpc__ 1
|
||||
#endif
|
||||
|
||||
#define GCRYPT_NO_DEPRECATED 1
|
||||
|
||||
/* Define to 1 to enable disk cache statistics. */
|
||||
#define DISK_CACHE_STATS @DISK_CACHE_STATS@
|
||||
#define BOOT_TIME_STATS @BOOT_TIME_STATS@
|
||||
|
||||
501
configure.ac
501
configure.ac
@@ -41,11 +41,9 @@ AC_CONFIG_AUX_DIR([build-aux])
|
||||
|
||||
# Checks for host and target systems.
|
||||
AC_CANONICAL_HOST
|
||||
save_program_prefix="${program_prefix}"
|
||||
AC_CANONICAL_TARGET
|
||||
program_prefix="${save_program_prefix}"
|
||||
|
||||
AM_INIT_AUTOMAKE([1.10.1])
|
||||
AM_INIT_AUTOMAKE()
|
||||
AC_PREREQ(2.60)
|
||||
AC_CONFIG_SRCDIR([include/grub/dl.h])
|
||||
AC_CONFIG_HEADER([config-util.h])
|
||||
@@ -75,10 +73,14 @@ if test "x$TARGET_CFLAGS" = x; then
|
||||
TARGET_CFLAGS="$TARGET_CFLAGS -Os"
|
||||
fi
|
||||
|
||||
BUILD_CPPFLAGS="$BUILD_CPPFLAGS -DLOCALEDIR=\\\"\$(localedir)\\\""
|
||||
|
||||
# Default HOST_CPPFLAGS
|
||||
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_LIBDIR=\\\"\$(pkglibdir)\\\""
|
||||
HOST_CPPFLAGS="$HOST_CPPFLAGS -DLOCALEDIR=\\\"\$(localedir)\\\""
|
||||
|
||||
TARGET_CPPFLAGS="$TARGET_CPPFLAGS -Wall -W"
|
||||
TARGET_CPPFLAGS="$TARGET_CPPFLAGS -I\$(top_srcdir)/include"
|
||||
@@ -129,7 +131,6 @@ fi
|
||||
case "$target_cpu"-"$platform" in
|
||||
x86_64-efi) ;;
|
||||
x86_64-emu) ;;
|
||||
x86_64-xen) ;;
|
||||
x86_64-*) target_cpu=i386 ;;
|
||||
powerpc64-ieee1275) target_cpu=powerpc ;;
|
||||
esac
|
||||
@@ -138,8 +139,6 @@ esac
|
||||
case "$target_cpu"-"$platform" in
|
||||
i386-efi) ;;
|
||||
x86_64-efi) ;;
|
||||
i386-xen) ;;
|
||||
x86_64-xen) ;;
|
||||
i386-pc) ;;
|
||||
i386-multiboot) ;;
|
||||
i386-coreboot) ;;
|
||||
@@ -164,12 +163,10 @@ case "$target_cpu"-"$platform" in
|
||||
*) AC_MSG_ERROR([platform "$platform" is not supported for target CPU "$target_cpu"]) ;;
|
||||
esac
|
||||
|
||||
if test x$platform != xemu ; then
|
||||
case "$target_cpu" in
|
||||
i386 | powerpc) target_m32=1 ;;
|
||||
x86_64 | sparc64) target_m64=1 ;;
|
||||
esac
|
||||
fi
|
||||
case "$target_cpu" in
|
||||
i386 | powerpc) target_m32=1 ;;
|
||||
x86_64 | sparc64) target_m64=1 ;;
|
||||
esac
|
||||
|
||||
case "$target_os" in
|
||||
windows* | mingw32*) target_os=cygwin ;;
|
||||
@@ -188,17 +185,10 @@ case "$host_os" in
|
||||
cygwin | windows* | mingw32*) host_kernel=windows ;;
|
||||
esac
|
||||
|
||||
case "$host_os" in
|
||||
cygwin | windows* | mingw32*) have_exec=n ;;
|
||||
aros*) have_exec=n ;;
|
||||
*) have_exec=y;;
|
||||
esac
|
||||
|
||||
case "$platform" in
|
||||
coreboot) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_COREBOOT=1" ;;
|
||||
multiboot) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MULTIBOOT=1" ;;
|
||||
efi) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_EFI=1" ;;
|
||||
xen) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_XEN=1" ;;
|
||||
ieee1275) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_IEEE1275=1" ;;
|
||||
uboot) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_UBOOT=1" ;;
|
||||
qemu) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_QEMU=1" ;;
|
||||
@@ -351,6 +341,12 @@ case "$host_os" in
|
||||
;;
|
||||
esac
|
||||
|
||||
grub_apple_cc
|
||||
if test x$grub_cv_apple_cc = xyes ; then
|
||||
HOST_CPPFLAGS="$HOST_CPPFLAGS -fnested-functions"
|
||||
HOST_LDFLAGS="$HOST_LDFLAGS -Wl,-allow_stack_execute"
|
||||
fi
|
||||
|
||||
if test x$USE_NLS = xno; then
|
||||
HOST_CFLAGS="$HOST_CFLAGS -fno-builtin-gettext"
|
||||
fi
|
||||
@@ -389,7 +385,7 @@ AC_SUBST([LIBUTIL])
|
||||
|
||||
AC_CACHE_CHECK([whether -Wtrampolines work], [grub_cv_host_cc_wtrampolines], [
|
||||
SAVED_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$HOST_CFLAGS -Wtrampolines -Werror"
|
||||
CFLAGS="$HOST_CFLAGS -Wtrampolines"
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdarg.h>
|
||||
int va_arg_func (int fixed, va_list args);]], [[]])],
|
||||
[grub_cv_host_cc_wtrampolines=yes],
|
||||
@@ -465,91 +461,33 @@ CPPFLAGS="$TARGET_CPPFLAGS"
|
||||
LDFLAGS="$TARGET_LDFLAGS"
|
||||
LIBS=""
|
||||
|
||||
grub_PROG_NM_MINUS_P
|
||||
grub_PROG_NM_DEFINED_ONLY
|
||||
AC_SUBST(TARGET_NMFLAGS_MINUS_P)
|
||||
AC_SUBST(TARGET_NMFLAGS_DEFINED_ONLY)
|
||||
|
||||
# debug flags.
|
||||
WARN_FLAGS="-Wall -W -Wshadow -Wold-style-definition -Wpointer-arith -Wundef -Wextra -Wattributes -Wchar-subscripts -Wcomment -Wdeprecated-declarations -Wdisabled-optimization -Wdiv-by-zero -Wendif-labels -Wfloat-equal -Wformat-extra-args -Wformat-security -Wformat-y2k -Wimplicit -Wimplicit-function-declaration -Wimplicit-int -Winit-self -Wint-to-pointer-cast -Winvalid-pch -Wmain -Wmissing-braces -Wmissing-field-initializers -Wmissing-format-attribute -Wmultichar -Wnonnull -Woverflow -Wparentheses -Wpointer-arith -Wpointer-to-int-cast -Wreturn-type -Wsequence-point -Wshadow -Wsign-compare -Wstrict-aliasing -Wswitch -Wtrigraphs -Wundef -Wunknown-pragmas -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value -Wunused-variable -Wvariadic-macros -Wvolatile-register-var -Wwrite-strings -Wnested-externs -Wstrict-prototypes -Wpointer-sign"
|
||||
HOST_CFLAGS="$HOST_CFLAGS $WARN_FLAGS -Wcast-align"
|
||||
WARN_FLAGS="-Wall -W -Wshadow -Wold-style-definition -Wpointer-arith -Wundef -Wextra -Wattributes -Wcast-align -Wchar-subscripts -Wcomment -Wdeprecated-declarations -Wdisabled-optimization -Wdiv-by-zero -Wendif-labels -Wfloat-equal -Wformat-extra-args -Wformat-security -Wformat-y2k -Wimplicit -Wimplicit-function-declaration -Wimplicit-int -Winit-self -Wint-to-pointer-cast -Winvalid-pch -Wmain -Wmissing-braces -Wmissing-field-initializers -Wmissing-format-attribute -Wmultichar -Wnonnull -Woverflow -Wparentheses -Wpointer-arith -Wpointer-to-int-cast -Wreturn-type -Wsequence-point -Wshadow -Wsign-compare -Wstrict-aliasing -Wswitch -Wtrigraphs -Wundef -Wunknown-pragmas -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value -Wunused-variable -Wvariadic-macros -Wvolatile-register-var -Wwrite-strings -Wnested-externs -Wstrict-prototypes -Wpointer-sign"
|
||||
HOST_CFLAGS="$HOST_CFLAGS $WARN_FLAGS"
|
||||
TARGET_CFLAGS="$TARGET_CFLAGS $WARN_FLAGS -g -Wredundant-decls -Wmissing-prototypes -Wmissing-declarations"
|
||||
TARGET_CCASFLAGS="$TARGET_CCASFLAGS -g"
|
||||
|
||||
if test "x$target_cpu" != xi386 && test "x$target_cpu" != xx86_64; then
|
||||
TARGET_CFLAGS="$TARGET_CFLAGS -Wcast-align"
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK([if compiling with clang], [grub_cv_cc_target_clang]
|
||||
[AC_COMPILE_IFELSE(
|
||||
[AC_LANG_PROGRAM([], [[
|
||||
#ifdef __clang__
|
||||
#error "is clang"
|
||||
#endif
|
||||
]])],
|
||||
[grub_cv_cc_target_clang=no], [grub_cv_cc_target_clang=yes])])
|
||||
|
||||
# on x86 clang doesn't support .code16
|
||||
# on arm clang doesn't support .arch directive
|
||||
if test "x$grub_cv_cc_target_clang" = xyes && ( test "x$target_cpu" = xi386 || test "x$target_cpu" = xx86_64 || test "x$target_cpu" = xarm ); then
|
||||
TARGET_CCASFLAGS="$TARGET_CCASFLAGS -no-integrated-as"
|
||||
fi
|
||||
|
||||
if test "x$target_cpu" = xi386 && test "x$platform" != xemu; then
|
||||
TARGET_CFLAGS="$TARGET_CFLAGS -march=i386"
|
||||
fi
|
||||
|
||||
if test "x$target_m32" = x1; then
|
||||
# Force 32-bit mode.
|
||||
TARGET_CFLAGS="$TARGET_CFLAGS -m32"
|
||||
TARGET_CCASFLAGS="$TARGET_CCASFLAGS -m32"
|
||||
TARGET_CPPFLAGS="$TARGET_CPPFLAGS -m32"
|
||||
TARGET_LDFLAGS="$TARGET_LDFLAGS -m32"
|
||||
TARGET_MODULE_FORMAT="elf32"
|
||||
fi
|
||||
|
||||
if test "x$target_m64" = x1; then
|
||||
# Force 64-bit mode.
|
||||
TARGET_CFLAGS="$TARGET_CFLAGS -m64"
|
||||
TARGET_CCASFLAGS="$TARGET_CCASFLAGS -m64"
|
||||
TARGET_CPPFLAGS="$TARGET_CPPFLAGS -m64"
|
||||
TARGET_LDFLAGS="$TARGET_LDFLAGS -m64"
|
||||
TARGET_MODULE_FORMAT="elf64"
|
||||
fi
|
||||
|
||||
if test "x$grub_cv_cc_target_clang" = xno && test "x$target_cpu" = xi386 && test "x$platform" != xemu && test "x$platform" != xefi; then
|
||||
TARGET_CFLAGS="$TARGET_CFLAGS -mrtd -mregparm=3"
|
||||
fi
|
||||
|
||||
# Force no alignment to save space on i386.
|
||||
if test "x$target_cpu" = xi386; then
|
||||
AC_CACHE_CHECK([whether -falign-loops works], [grub_cv_cc_falign_loop], [
|
||||
CFLAGS="$TARGET_CFLAGS -falign-loops=1 -Werror"
|
||||
CFLAGS="$CFLAGS -falign-loops=1"
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
|
||||
[grub_cv_cc_falign_loop=yes],
|
||||
[grub_cv_cc_falign_loop=no])
|
||||
])
|
||||
|
||||
AC_CACHE_CHECK([whether -malign-loops works], [grub_cv_cc_malign_loop], [
|
||||
CFLAGS="$TARGET_CFLAGS -malign-loops=1 -Werror"
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
|
||||
[grub_cv_cc_malign_loop=yes],
|
||||
[grub_cv_cc_malign_loop=no])
|
||||
])
|
||||
|
||||
if test "x$grub_cv_cc_falign_loop" = xyes; then
|
||||
TARGET_CFLAGS="$TARGET_CFLAGS -falign-jumps=1 -falign-loops=1 -falign-functions=1"
|
||||
elif test "x$grub_cv_cc_malign_loop" = xyes; then
|
||||
else
|
||||
TARGET_CFLAGS="$TARGET_CFLAGS -malign-jumps=1 -malign-loops=1 -malign-functions=1"
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK([whether -freg-struct-return works], [grub_cv_cc_freg_struct_return], [
|
||||
CFLAGS="$TARGET_CFLAGS -freg-struct-return -Werror"
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
|
||||
[grub_cv_cc_freg_struct_return=yes],
|
||||
[grub_cv_cc_freg_struct_return=no])
|
||||
])
|
||||
|
||||
if test "x$grub_cv_cc_freg_struct_return" = xyes; then
|
||||
TARGET_CFLAGS="$TARGET_CFLAGS -freg-struct-return"
|
||||
fi
|
||||
|
||||
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
|
||||
# registers that aren't set up properly in GRUB.
|
||||
@@ -561,10 +499,12 @@ fi
|
||||
# these and they just use up vital space. Restore the old compiler
|
||||
# behaviour.
|
||||
AC_CACHE_CHECK([whether -fno-dwarf2-cfi-asm works], [grub_cv_cc_fno_dwarf2_cfi_asm], [
|
||||
CFLAGS="$TARGET_CFLAGS -fno-dwarf2-cfi-asm"
|
||||
SAVE_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS -fno-dwarf2-cfi-asm"
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
|
||||
[grub_cv_cc_fno_dwarf2_cfi_asm=yes],
|
||||
[grub_cv_cc_fno_dwarf2_cfi_asm=no])
|
||||
CFLAGS="$SAVE_CFLAGS"
|
||||
])
|
||||
|
||||
if test "x$grub_cv_cc_fno_dwarf2_cfi_asm" = xyes; then
|
||||
@@ -573,7 +513,7 @@ fi
|
||||
|
||||
if test x"$target_os" = xcygwin; then
|
||||
AC_CACHE_CHECK([whether option -fno-reorder-functions works], grub_cv_cc_no_reorder_functions, [
|
||||
CFLAGS="$TARGET_CFLAGS -fno-reorder-functions"
|
||||
CFLAGS="$CFLAGS -fno-reorder-functions"
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
|
||||
[grub_cv_cc_no_reorder_functions=yes],
|
||||
[grub_cv_cc_no_reorder_functions=no])
|
||||
@@ -589,24 +529,67 @@ fi
|
||||
# these and they just use up vital space. Restore the old compiler
|
||||
# behaviour.
|
||||
AC_CACHE_CHECK([whether -fno-asynchronous-unwind-tables works], [grub_cv_cc_fno_asynchronous_unwind_tables], [
|
||||
CFLAGS="$TARGET_CFLAGS -fno-dwarf2-cfi-asm"
|
||||
SAVE_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS -fno-dwarf2-cfi-asm"
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
|
||||
[grub_cv_cc_fno_asynchronous_unwind_tables=yes],
|
||||
[grub_cv_cc_fno_asynchronous_unwind_tables=no])
|
||||
CFLAGS="$SAVE_CFLAGS"
|
||||
])
|
||||
|
||||
if test "x$grub_cv_cc_fno_asynchronous_unwind_tables" = xyes; then
|
||||
TARGET_CFLAGS="$TARGET_CFLAGS -fno-asynchronous-unwind-tables"
|
||||
fi
|
||||
|
||||
grub_apple_target_cc
|
||||
if test x$grub_cv_apple_target_cc = xyes ; then
|
||||
TARGET_CPPFLAGS="$TARGET_CPPFLAGS -fnested-functions"
|
||||
|
||||
CFLAGS="$CFLAGS -fnested-functions"
|
||||
TARGET_APPLE_CC=1
|
||||
AC_CHECK_PROG([TARGET_OBJCONV], [objconv], [objconv], [])
|
||||
if test "x$TARGET_OBJCONV" = x ; then
|
||||
AC_CHECK_PROG([TARGET_OBJCONV], [objconv], [./objconv], [], [.])
|
||||
fi
|
||||
if test "x$TARGET_OBJCONV" = x ; then
|
||||
AC_MSG_ERROR([objconv not found which is required when building with apple compiler])
|
||||
fi
|
||||
TARGET_IMG_LDSCRIPT=
|
||||
TARGET_IMG_CFLAGS="-static"
|
||||
TARGET_IMG_LDFLAGS='-nostdlib -static -Wl,-preload -Wl,-segalign,20'
|
||||
TARGET_IMG_LDFLAGS_AC='-nostdlib -static -Wl,-preload -Wl,-segalign,20'
|
||||
TARGET_IMG_BASE_LDOPT="-Wl,-image_base"
|
||||
TARGET_LDFLAGS_OLDMAGIC=""
|
||||
else
|
||||
TARGET_APPLE_CC=0
|
||||
TARGET_LDFLAGS_OLDMAGIC="-Wl,-N"
|
||||
# Use linker script if present, otherwise use builtin -N script.
|
||||
if test -f "${srcdir}/${grub_coredir}/conf/${target_cpu}-${platform}-${target_os}-img-ld.sc"; then
|
||||
TARGET_IMG_LDSCRIPT='$(top_srcdir)'"/${grub_coredir}/conf/${target_cpu}-${platform}-${target_os}-img-ld.sc"
|
||||
TARGET_IMG_LDFLAGS="-Wl,-T${TARGET_IMG_LDSCRIPT}"
|
||||
TARGET_IMG_LDFLAGS_AC="-Wl,-T${srcdir}/${grub_coredir}/conf/${target_cpu}-${platform}-${target_os}-img-ld.sc"
|
||||
TARGET_IMG_BASE_LDOPT="-Wl,-Ttext"
|
||||
else
|
||||
TARGET_IMG_LDSCRIPT=
|
||||
TARGET_IMG_LDFLAGS='-Wl,-N'
|
||||
TARGET_IMG_LDFLAGS_AC='-Wl,-N'
|
||||
TARGET_IMG_BASE_LDOPT="-Wl,-Ttext"
|
||||
fi
|
||||
TARGET_IMG_CFLAGS=
|
||||
fi
|
||||
|
||||
AC_SUBST(TARGET_LDFLAGS_OLDMAGIC)
|
||||
|
||||
# For platforms where ELF is not the default link format.
|
||||
AC_MSG_CHECKING([for command to convert module to ELF format])
|
||||
case "${target_os}" in
|
||||
cygwin)
|
||||
cygwin) TARGET_OBJ2ELF='./build-grub-pe2elf';
|
||||
# FIXME: put proper test here
|
||||
NEED_REGISTER_FRAME_INFO=1
|
||||
;;
|
||||
*) NEED_REGISTER_FRAME_INFO=0 ;;
|
||||
esac
|
||||
AC_MSG_RESULT([$TARGET_OBJ2ELF])
|
||||
|
||||
|
||||
AC_ARG_ENABLE([efiemu],
|
||||
@@ -626,10 +609,12 @@ if test x"$platform" = xefi ; then
|
||||
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"
|
||||
SAVED_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS -m64 -mcmodel=large -mno-red-zone -nostdlib"
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
|
||||
[grub_cv_cc_efiemu=yes],
|
||||
[grub_cv_cc_efiemu=no])
|
||||
CFLAGS="$SAVED_CFLAGS"
|
||||
])
|
||||
if test x$grub_cv_cc_efiemu = xno; then
|
||||
efiemu_excuse="cannot compile with -m64 -mcmodel=large -mno-red-zone -nostdlib"
|
||||
@@ -645,80 +630,66 @@ enable_efiemu=no
|
||||
fi
|
||||
AC_SUBST([enable_efiemu])
|
||||
|
||||
CFLAGS="$TARGET_CFLAGS"
|
||||
|
||||
if test x"$target_cpu" = xi386 || test x"$target_cpu" = xx86_64; then
|
||||
AC_CACHE_CHECK([for linking format], [grub_cv_target_cc_link_format], [
|
||||
grub_cv_target_cc_link_format=unknown
|
||||
for format in -melf_${target_cpu} -melf_${target_cpu}_fbsd -melf_${target_cpu}_obsd -melf_${target_cpu}_haiku -m${target_cpu}pe -arch,${target_cpu}; do
|
||||
if test x${target_cpu} != xi386 && test x$format = x${target_cpu}pe; then
|
||||
continue
|
||||
fi
|
||||
CFLAGS="$TARGET_CFLAGS -static"
|
||||
LDFLAGS="$TARGET_LDFLAGS -Wl,$format -nostdlib"
|
||||
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], [])
|
||||
if test x"$flag" = x1; then
|
||||
grub_cv_target_cc_link_format="$format"
|
||||
break;
|
||||
fi
|
||||
done])
|
||||
if test x"$grub_cv_target_cc_link_format" = xunknown; then
|
||||
AC_MSG_ERROR([no suitable link format found])
|
||||
fi
|
||||
TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,$grub_cv_target_cc_link_format"
|
||||
if test x"$grub_cv_target_cc_link_format" = x-mi386pe; then
|
||||
TARGET_OBJ2ELF='./build-grub-pe2elf';
|
||||
fi
|
||||
if test "x$target_m32" = x1; then
|
||||
# Force 32-bit mode.
|
||||
TARGET_CFLAGS="$TARGET_CFLAGS -m32"
|
||||
TARGET_CCASFLAGS="$TARGET_CCASFLAGS -m32"
|
||||
TARGET_CPPFLAGS="$TARGET_CPPFLAGS -m32"
|
||||
TARGET_LDFLAGS="$TARGET_LDFLAGS -m32"
|
||||
TARGET_MODULE_FORMAT="elf32"
|
||||
fi
|
||||
|
||||
if test x$grub_cv_target_cc_link_format = x-arch,i386 || test x$grub_cv_target_cc_link_format = x-arch,x86_64; then
|
||||
TARGET_APPLE_LINKER=1
|
||||
AC_CHECK_PROG([TARGET_OBJCONV], [objconv], [objconv], [])
|
||||
if test "x$TARGET_OBJCONV" = x ; then
|
||||
AC_CHECK_PROG([TARGET_OBJCONV], [objconv], [./objconv], [], [.])
|
||||
fi
|
||||
if test "x$TARGET_OBJCONV" = x ; then
|
||||
AC_MSG_ERROR([objconv not found which is required when building with apple compiler])
|
||||
fi
|
||||
TARGET_IMG_LDSCRIPT=
|
||||
TARGET_IMG_CFLAGS="-static"
|
||||
TARGET_IMG_LDFLAGS='-nostdlib -static -Wl,-preload -Wl,-segalign,20'
|
||||
TARGET_IMG_LDFLAGS_AC='-nostdlib -static -Wl,-preload -Wl,-segalign,20'
|
||||
TARGET_IMG_BASE_LDOPT="-Wl,-image_base"
|
||||
TARGET_LDFLAGS_OLDMAGIC=""
|
||||
elif test x$grub_cv_target_cc_link_format = x-mi386pe && test x$platform = xpc; then
|
||||
TARGET_APPLE_LINKER=0
|
||||
TARGET_LDFLAGS_OLDMAGIC="-Wl,-N"
|
||||
TARGET_IMG_LDSCRIPT='$(top_srcdir)'"/${grub_coredir}/conf/i386-pc-cygwin-img-ld.sc"
|
||||
TARGET_IMG_LDFLAGS="-Wl,-T${TARGET_IMG_LDSCRIPT}"
|
||||
TARGET_IMG_LDFLAGS_AC="-Wl,-T${srcdir}/${grub_coredir}/conf/i386-pc-cygwin-img-ld.sc"
|
||||
TARGET_IMG_BASE_LDOPT="-Wl,-Ttext"
|
||||
TARGET_IMG_CFLAGS=
|
||||
else
|
||||
TARGET_APPLE_LINKER=0
|
||||
TARGET_LDFLAGS_OLDMAGIC="-Wl,-N"
|
||||
TARGET_IMG_LDSCRIPT=
|
||||
TARGET_IMG_LDFLAGS='-Wl,-N'
|
||||
TARGET_IMG_LDFLAGS_AC='-Wl,-N'
|
||||
TARGET_IMG_BASE_LDOPT="-Wl,-Ttext"
|
||||
TARGET_IMG_CFLAGS=
|
||||
if test "x$target_m64" = x1; then
|
||||
# Force 64-bit mode.
|
||||
TARGET_CFLAGS="$TARGET_CFLAGS -m64"
|
||||
TARGET_CCASFLAGS="$TARGET_CCASFLAGS -m64"
|
||||
TARGET_CPPFLAGS="$TARGET_CPPFLAGS -m64"
|
||||
TARGET_LDFLAGS="$TARGET_LDFLAGS -m64"
|
||||
TARGET_MODULE_FORMAT="elf64"
|
||||
fi
|
||||
|
||||
AC_SUBST(TARGET_LDFLAGS_OLDMAGIC)
|
||||
|
||||
|
||||
LDFLAGS="$TARGET_LDFLAGS"
|
||||
case "$target_os" in
|
||||
cygwin)
|
||||
;;
|
||||
freebsd)
|
||||
if test x"$target_cpu" = xi386; then
|
||||
TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,-melf_i386_fbsd"
|
||||
fi
|
||||
if test x"$target_cpu" = xx86_64; then
|
||||
TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,-melf_x86_64_fbsd"
|
||||
fi
|
||||
;;
|
||||
openbsd*)
|
||||
if test x"$target_cpu" = xi386; then
|
||||
TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,-melf_i386_obsd"
|
||||
fi
|
||||
if test x"$target_cpu" = xx86_64; then
|
||||
TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,-melf_x86_64_obsd"
|
||||
fi
|
||||
;;
|
||||
haiku*)
|
||||
if test x"$target_cpu" = xi386; then
|
||||
TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,-melf_i386_haiku"
|
||||
fi
|
||||
if test x"$target_cpu" = xx86_64; then
|
||||
TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,-melf_x86_64_haiku"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
if test x"$target_cpu" = xi386; then
|
||||
TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,-melf_i386"
|
||||
fi
|
||||
if test x"$target_cpu" = xx86_64; then
|
||||
TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,-melf_x86_64"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
if test "$target_cpu" = x86_64; then
|
||||
# Use large model to support 4G memory
|
||||
AC_CACHE_CHECK([whether option -mcmodel=large works], grub_cv_cc_mcmodel, [
|
||||
CFLAGS="$TARGET_CFLAGS -m64 -mcmodel=large"
|
||||
SAVED_CFLAGS=$CFLAGS
|
||||
CFLAGS="$CFLAGS -m64 -mcmodel=large"
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
|
||||
[grub_cv_cc_mcmodel=yes],
|
||||
[grub_cv_cc_mcmodel=no])
|
||||
@@ -733,7 +704,7 @@ fi
|
||||
if test "$target_cpu"-"$platform" = x86_64-efi; then
|
||||
# EFI writes to stack below %rsp, we must not use the red zone
|
||||
AC_CACHE_CHECK([whether option -mno-red-zone works], grub_cv_cc_no_red_zone, [
|
||||
CFLAGS="$TARGET_CFLAGS -m64 -mno-red-zone"
|
||||
CFLAGS="$CFLAGS -m64 -mno-red-zone"
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
|
||||
[grub_cv_cc_no_red_zone=yes],
|
||||
[grub_cv_cc_no_red_zone=no])
|
||||
@@ -749,8 +720,6 @@ fi
|
||||
# Compiler features.
|
||||
#
|
||||
|
||||
CFLAGS="$TARGET_CFLAGS"
|
||||
|
||||
# Position independent executable.
|
||||
grub_CHECK_PIE
|
||||
[# Need that, because some distributions ship compilers that include
|
||||
@@ -759,8 +728,6 @@ if [ x"$pie_possible" = xyes ]; then
|
||||
TARGET_CFLAGS="$TARGET_CFLAGS -fno-PIE"
|
||||
fi]
|
||||
|
||||
CFLAGS="$TARGET_CFLAGS"
|
||||
|
||||
# Position independent executable.
|
||||
grub_CHECK_PIC
|
||||
[# Need that, because some distributions ship compilers that include
|
||||
@@ -769,8 +736,6 @@ if [ x"$pic_possible" = xyes ]; then
|
||||
TARGET_CFLAGS="$TARGET_CFLAGS -fno-PIC"
|
||||
fi]
|
||||
|
||||
CFLAGS="$TARGET_CFLAGS"
|
||||
|
||||
# Smashing stack protector.
|
||||
grub_CHECK_STACK_PROTECTOR
|
||||
# Need that, because some distributions ship compilers that include
|
||||
@@ -778,9 +743,6 @@ grub_CHECK_STACK_PROTECTOR
|
||||
if test "x$ssp_possible" = xyes; then
|
||||
TARGET_CFLAGS="$TARGET_CFLAGS -fno-stack-protector"
|
||||
fi
|
||||
|
||||
CFLAGS="$TARGET_CFLAGS"
|
||||
|
||||
grub_CHECK_STACK_ARG_PROBE
|
||||
# Cygwin's GCC uses alloca() to probe the stackframe on static
|
||||
# stack allocations above some threshold.
|
||||
@@ -788,8 +750,6 @@ if test x"$sap_possible" = xyes; then
|
||||
TARGET_CFLAGS="$TARGET_CFLAGS -mno-stack-arg-probe"
|
||||
fi
|
||||
|
||||
CFLAGS="$TARGET_CFLAGS"
|
||||
|
||||
# -mno-unaligned-access
|
||||
if test "$target_cpu" = arm; then
|
||||
grub_CHECK_NO_UNALIGNED_ACCESS
|
||||
@@ -798,35 +758,72 @@ if test "$target_cpu" = arm; then
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE([werror],
|
||||
[AS_HELP_STRING([--disable-werror],
|
||||
[do not use -Werror when building GRUB])])
|
||||
if test x"$enable_werror" != xno ; then
|
||||
TARGET_CFLAGS="$TARGET_CFLAGS -Werror"
|
||||
HOST_CFLAGS="$HOST_CFLAGS -Werror"
|
||||
fi
|
||||
|
||||
TARGET_CPP="$TARGET_CC -E"
|
||||
TARGET_CCAS=$TARGET_CC
|
||||
|
||||
GRUB_TARGET_CPU="${target_cpu}"
|
||||
GRUB_PLATFORM="${platform}"
|
||||
|
||||
AC_SUBST(GRUB_TARGET_CPU)
|
||||
AC_SUBST(GRUB_PLATFORM)
|
||||
|
||||
AC_SUBST(TARGET_OBJCONV)
|
||||
AC_SUBST(TARGET_CPP)
|
||||
AC_SUBST(TARGET_CCAS)
|
||||
AC_SUBST(TARGET_OBJ2ELF)
|
||||
AC_SUBST(TARGET_APPLE_CC)
|
||||
AC_SUBST(TARGET_MODULE_FORMAT)
|
||||
|
||||
AC_SUBST(TARGET_CFLAGS)
|
||||
AC_SUBST(TARGET_LDFLAGS)
|
||||
AC_SUBST(TARGET_CPPFLAGS)
|
||||
AC_SUBST(TARGET_CCASFLAGS)
|
||||
|
||||
AC_SUBST(TARGET_IMG_LDSCRIPT)
|
||||
AC_SUBST(TARGET_IMG_LDFLAGS)
|
||||
AC_SUBST(TARGET_IMG_CFLAGS)
|
||||
AC_SUBST(TARGET_IMG_BASE_LDOPT)
|
||||
|
||||
AC_SUBST(HOST_CFLAGS)
|
||||
AC_SUBST(HOST_LDFLAGS)
|
||||
AC_SUBST(HOST_CPPFLAGS)
|
||||
AC_SUBST(HOST_CCASFLAGS)
|
||||
|
||||
AC_SUBST(BUILD_LIBM)
|
||||
|
||||
# Set them to their new values for the tests below.
|
||||
CC="$TARGET_CC"
|
||||
if test "x$TARGET_APPLE_LINKER" = x1 ; then
|
||||
if test "x$TARGET_APPLE_CC" = x1 ; then
|
||||
CFLAGS="$TARGET_CFLAGS -nostdlib -Wno-error"
|
||||
else
|
||||
CFLAGS="$TARGET_CFLAGS -nostdlib -Wl,--defsym,___main=0x8100 -Wno-error"
|
||||
fi
|
||||
CPPFLAGS="$TARGET_CPPFLAGS"
|
||||
if test x$target_cpu = xi386 || test x$target_cpu = xx86_64 || test "x$grub_cv_cc_target_clang" = xyes ; then
|
||||
TARGET_LIBGCC=
|
||||
if test x$target_cpu = xi386 || test x$target_cpu = xx86_64 ; then
|
||||
LIBS=
|
||||
else
|
||||
TARGET_LIBGCC=-lgcc
|
||||
LIBS=-lgcc
|
||||
fi
|
||||
|
||||
LIBS="$TARGET_LIBGCC"
|
||||
|
||||
grub_ASM_USCORE
|
||||
if test "x$TARGET_APPLE_LINKER" = x0 ; then
|
||||
if test x$grub_cv_asm_uscore = xyes; then
|
||||
CFLAGS="$TARGET_CFLAGS -nostdlib -Wl,--defsym,_abort=_main"
|
||||
CFLAGS="$CFLAGS -Wl,--defsym,_abort=_main"
|
||||
else
|
||||
CFLAGS="$TARGET_CFLAGS -nostdlib -Wl,--defsym,abort=main"
|
||||
fi
|
||||
CFLAGS="$CFLAGS -Wl,--defsym,abort=main"
|
||||
fi
|
||||
|
||||
# Check for libgcc symbols
|
||||
AC_CHECK_FUNCS(__bswapsi2 __bswapdi2 __ashldi3 __ashrdi3 __lshrdi3 __ucmpdi2 _restgpr_14_x)
|
||||
AC_CHECK_FUNCS(__bswapsi2 __bswapdi2 __ashldi3 __ashrdi3 __lshrdi3 __ucmpdi2 _restgpr_14_x __udivsi3 __umoddi3 __udivdi3 __divsi3 __modsi3 __umodsi3 __moddi3 __divdi3 __ctzdi2 __ctzsi2)
|
||||
|
||||
if test "x$TARGET_APPLE_LINKER" = x1 ; then
|
||||
if test "x$TARGET_APPLE_CC" = x1 ; then
|
||||
CFLAGS="$TARGET_CFLAGS -nostdlib"
|
||||
else
|
||||
CFLAGS="$TARGET_CFLAGS -nostdlib -Wl,--defsym,___main=0x8100"
|
||||
@@ -835,15 +832,15 @@ LIBS=""
|
||||
|
||||
# Defined in aclocal.m4.
|
||||
grub_PROG_TARGET_CC
|
||||
if test "x$TARGET_APPLE_LINKER" != x1 ; then
|
||||
if test "x$TARGET_APPLE_CC" != x1 ; then
|
||||
grub_PROG_OBJCOPY_ABSOLUTE
|
||||
fi
|
||||
grub_PROG_LD_BUILD_ID_NONE
|
||||
if test "x$target_cpu" = xi386; then
|
||||
if test "$platform" != emu && test "x$TARGET_APPLE_LINKER" != x1 ; then
|
||||
if test "$platform" != emu && test "x$TARGET_APPLE_CC" != x1 ; then
|
||||
if test ! -z "$TARGET_IMG_LDSCRIPT"; then
|
||||
# Check symbols provided by linker script.
|
||||
CFLAGS="$TARGET_CFLAGS -nostdlib ${TARGET_IMG_LDFLAGS_AC} ${TARGET_IMG_BASE_LDOPT},0x8000 -Wl,--defsym,___main=0x8100"
|
||||
CFLAGS="$TARGET_CFLAGS -nostdlib ${TARGET_IMG_LDFLAGS_AC} ${TARGET_IMG_BASE_LDOPT},8000 -Wl,--defsym,___main=0x8100"
|
||||
fi
|
||||
grub_CHECK_BSS_START_SYMBOL
|
||||
grub_CHECK_END_SYMBOL
|
||||
@@ -853,12 +850,6 @@ if test "x$target_cpu" = xi386; then
|
||||
grub_I386_ASM_ADDR32
|
||||
fi
|
||||
|
||||
grub_PROG_NM_WORKS
|
||||
grub_PROG_NM_MINUS_P
|
||||
grub_PROG_NM_DEFINED_ONLY
|
||||
AC_SUBST(TARGET_NMFLAGS_MINUS_P)
|
||||
AC_SUBST(TARGET_NMFLAGS_DEFINED_ONLY)
|
||||
|
||||
if test "$platform" != emu; then
|
||||
AC_CACHE_CHECK([whether -nostdinc -isystem works], [grub_cv_cc_isystem], [
|
||||
SAVED_CPPFLAGS="$CPPFLAGS"
|
||||
@@ -877,11 +868,13 @@ fi
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK([whether -Wtrampolines work], [grub_cv_cc_wtrampolines], [
|
||||
CFLAGS="$TARGET_CFLAGS -Wtrampolines -Werror"
|
||||
SAVED_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$TARGET_CFLAGS -Wtrampolines"
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdarg.h>
|
||||
int va_arg_func (int fixed, va_list args);]], [[]])],
|
||||
[grub_cv_cc_wtrampolines=yes],
|
||||
[grub_cv_cc_wtrampolines=no])
|
||||
CFLAGS="$SAVED_CFLAGS"
|
||||
])
|
||||
|
||||
if test x"$grub_cv_cc_wtrampolines" = xyes ; then
|
||||
@@ -1025,13 +1018,6 @@ fi
|
||||
AC_SUBST([enable_grub_emu_sdl])
|
||||
AC_SUBST([enable_grub_emu_usb])
|
||||
AC_SUBST([enable_grub_emu_pci])
|
||||
|
||||
else
|
||||
|
||||
# Ignore --enable-emu-* if platform is not emu
|
||||
enable_grub_emu_sdl=no
|
||||
enable_grub_emu_usb=no
|
||||
enable_grub_emu_pci=no
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE([grub-mkfont],
|
||||
@@ -1142,14 +1128,7 @@ DJVU_FONT_SOURCE=
|
||||
|
||||
starfield_excuse=
|
||||
|
||||
AC_ARG_ENABLE([grub-themes],
|
||||
[AS_HELP_STRING([--enable-grub-themes],
|
||||
[build and install GRUB themes (default=guessed)])])
|
||||
if test x"$enable_grub_themes" = xno ; then
|
||||
starfield_excuse="explicitly disabled"
|
||||
fi
|
||||
|
||||
if test x"$starfield_excuse" = x && test x"$enable_build_grub_mkfont" = xno ; then
|
||||
if test x"$enable_build_grub_mkfont" = xno ; then
|
||||
starfield_excuse="No build-time grub-mkfont"
|
||||
fi
|
||||
|
||||
@@ -1168,10 +1147,6 @@ if test x"$starfield_excuse" = x; then
|
||||
fi
|
||||
fi
|
||||
|
||||
if test x"$enable_grub_themes" = xyes && test x"$starfield_excuse" != x; then
|
||||
AC_MSG_ERROR([themes were explicitly requested but requirements are not satisfied])
|
||||
fi
|
||||
|
||||
AC_SUBST([DJVU_FONT_SOURCE])
|
||||
|
||||
FONT_SOURCE=
|
||||
@@ -1274,32 +1249,10 @@ fi
|
||||
|
||||
AC_SUBST([LIBGEOM])
|
||||
|
||||
AC_ARG_ENABLE([liblzma],
|
||||
[AS_HELP_STRING([--enable-liblzma],
|
||||
[enable liblzma integration (default=guessed)])])
|
||||
if test x"$enable_liblzma" = xno ; then
|
||||
liblzma_excuse="explicitly disabled"
|
||||
fi
|
||||
|
||||
if test x"$liblzma_excuse" = x ; then
|
||||
AC_CHECK_LIB([lzma], [lzma_code],
|
||||
[],[liblzma_excuse="need lzma library"])
|
||||
fi
|
||||
if test x"$liblzma_excuse" = x ; then
|
||||
AC_CHECK_HEADER([lzma.h], [], [liblzma_excuse="need lzma header"])
|
||||
fi
|
||||
|
||||
if test x"$enable_liblzma" = xyes && test x"$liblzma_excuse" != x ; then
|
||||
AC_MSG_ERROR([liblzma support was explicitly requested but requirements are not satisfied])
|
||||
fi
|
||||
|
||||
|
||||
if test x"$liblzma_excuse" = x ; then
|
||||
LIBLZMA="-llzma"
|
||||
AC_DEFINE([USE_LIBLZMA], [1],
|
||||
[Define to 1 if you have the LZMA library.])
|
||||
fi
|
||||
|
||||
[LIBLZMA="-llzma"
|
||||
AC_DEFINE([HAVE_LIBLZMA], [1],
|
||||
[Define to 1 if you have the LZMA library.])],)
|
||||
AC_SUBST([LIBLZMA])
|
||||
|
||||
AC_ARG_ENABLE([libzfs],
|
||||
@@ -1348,6 +1301,8 @@ LIBS=""
|
||||
AC_SUBST([FONT_SOURCE])
|
||||
AS_IF([test x$target_cpu = xi386 -a x$platform = xqemu],
|
||||
[AC_SUBST([GRUB_BOOT_MACHINE_LINK_ADDR], 0xffe00)])
|
||||
AS_IF([test x$TARGET_APPLE_CC = x1],
|
||||
[AC_SUBST([USE_APPLE_CC_FIXES], yes)])
|
||||
|
||||
AC_SUBST(HAVE_ASM_USCORE)
|
||||
AC_SUBST(ADDR32)
|
||||
@@ -1358,61 +1313,11 @@ AC_SUBST(PACKAGE)
|
||||
AC_SUBST(VERSION)
|
||||
AC_SUBST(NEED_REGISTER_FRAME_INFO)
|
||||
|
||||
AC_ARG_ENABLE([werror],
|
||||
[AS_HELP_STRING([--disable-werror],
|
||||
[do not use -Werror when building GRUB])])
|
||||
if test x"$enable_werror" != xno ; then
|
||||
TARGET_CFLAGS="$TARGET_CFLAGS -Werror"
|
||||
HOST_CFLAGS="$HOST_CFLAGS -Werror"
|
||||
fi
|
||||
|
||||
if test "x$grub_cv_cc_target_clang" = xno; then
|
||||
TARGET_LDFLAGS_STATIC_LIBGCC="-static-libgcc"
|
||||
else
|
||||
TARGET_LDFLAGS_STATIC_LIBGCC=
|
||||
fi
|
||||
|
||||
TARGET_CPP="$TARGET_CC -E"
|
||||
TARGET_CCAS=$TARGET_CC
|
||||
|
||||
GRUB_TARGET_CPU="${target_cpu}"
|
||||
GRUB_PLATFORM="${platform}"
|
||||
|
||||
AC_SUBST(GRUB_TARGET_CPU)
|
||||
AC_SUBST(GRUB_PLATFORM)
|
||||
|
||||
AC_SUBST(TARGET_OBJCONV)
|
||||
AC_SUBST(TARGET_LIBGCC)
|
||||
AC_SUBST(TARGET_LDFLAGS_STATIC_LIBGCC)
|
||||
AC_SUBST(TARGET_CPP)
|
||||
AC_SUBST(TARGET_CCAS)
|
||||
AC_SUBST(TARGET_OBJ2ELF)
|
||||
AC_SUBST(TARGET_MODULE_FORMAT)
|
||||
|
||||
AC_SUBST(TARGET_CFLAGS)
|
||||
AC_SUBST(TARGET_LDFLAGS)
|
||||
AC_SUBST(TARGET_CPPFLAGS)
|
||||
AC_SUBST(TARGET_CCASFLAGS)
|
||||
|
||||
AC_SUBST(TARGET_IMG_LDSCRIPT)
|
||||
AC_SUBST(TARGET_IMG_LDFLAGS)
|
||||
AC_SUBST(TARGET_IMG_CFLAGS)
|
||||
AC_SUBST(TARGET_IMG_BASE_LDOPT)
|
||||
AC_SUBST(TARGET_APPLE_LINKER)
|
||||
|
||||
AC_SUBST(HOST_CFLAGS)
|
||||
AC_SUBST(HOST_LDFLAGS)
|
||||
AC_SUBST(HOST_CPPFLAGS)
|
||||
AC_SUBST(HOST_CCASFLAGS)
|
||||
|
||||
AC_SUBST(BUILD_LIBM)
|
||||
|
||||
#
|
||||
# Automake conditionals
|
||||
#
|
||||
|
||||
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_efi], [test x$target_cpu = xi386 -a x$platform = xefi])
|
||||
AM_CONDITIONAL([COND_ia64_efi], [test x$target_cpu = xia64 -a x$platform = xefi])
|
||||
@@ -1421,8 +1326,6 @@ AM_CONDITIONAL([COND_i386_ieee1275], [test x$target_cpu = xi386 -a x$platform =
|
||||
AM_CONDITIONAL([COND_i386_coreboot], [test x$target_cpu = xi386 -a x$platform = xcoreboot])
|
||||
AM_CONDITIONAL([COND_i386_multiboot], [test x$target_cpu = xi386 -a x$platform = xmultiboot])
|
||||
AM_CONDITIONAL([COND_x86_64_efi], [test x$target_cpu = xx86_64 -a x$platform = xefi])
|
||||
AM_CONDITIONAL([COND_i386_xen], [test x$target_cpu = xi386 -a x$platform = xxen])
|
||||
AM_CONDITIONAL([COND_x86_64_xen], [test x$target_cpu = xx86_64 -a x$platform = xxen])
|
||||
AM_CONDITIONAL([COND_mips_loongson], [test x$target_cpu = xmipsel -a x$platform = xloongson])
|
||||
AM_CONDITIONAL([COND_mips_qemu_mips], [test "(" x$target_cpu = xmips -o x$target_cpu = xmipsel ")" -a x$platform = xqemu_mips])
|
||||
AM_CONDITIONAL([COND_mips_arc], [test "(" x$target_cpu = xmips -o x$target_cpu = xmipsel ")" -a x$platform = xarc])
|
||||
@@ -1448,9 +1351,11 @@ 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_PCI], [test x$enable_grub_emu_pci = xyes])
|
||||
AM_CONDITIONAL([COND_GRUB_MKFONT], [test x$enable_grub_mkfont = xyes])
|
||||
AM_CONDITIONAL([COND_BUILD_GRUB_MKFONT], [test x$enable_build_grub_mkfont = xyes])
|
||||
AM_CONDITIONAL([COND_GRUB_MOUNT], [test x$enable_grub_mount = xyes])
|
||||
AM_CONDITIONAL([COND_HAVE_FONT_SOURCE], [test x$FONT_SOURCE != x])
|
||||
AM_CONDITIONAL([COND_APPLE_LINKER], [test x$TARGET_APPLE_LINKER = x1])
|
||||
AM_CONDITIONAL([COND_GRUB_PE2ELF], [test x$TARGET_OBJ2ELF != x])
|
||||
AM_CONDITIONAL([COND_APPLE_CC], [test x$TARGET_APPLE_CC = x1])
|
||||
AM_CONDITIONAL([COND_ENABLE_EFIEMU], [test x$enable_efiemu = xyes])
|
||||
AM_CONDITIONAL([COND_ENABLE_CACHE_STATS], [test x$DISK_CACHE_STATS = x1])
|
||||
AM_CONDITIONAL([COND_ENABLE_BOOT_TIME_STATS], [test x$BOOT_TIME_STATS = x1])
|
||||
@@ -1460,20 +1365,6 @@ AM_CONDITIONAL([COND_HAVE_CXX], [test x$HAVE_CXX = xyes])
|
||||
AM_CONDITIONAL([COND_HAVE_ASM_USCORE], [test x$HAVE_ASM_USCORE = x1])
|
||||
AM_CONDITIONAL([COND_CYGWIN], [test x$target_os = xcygwin])
|
||||
AM_CONDITIONAL([COND_STARFIELD], [test "x$starfield_excuse" = x])
|
||||
AM_CONDITIONAL([COND_HAVE_EXEC], [test "x$have_exec" = xy])
|
||||
|
||||
test "x$prefix" = xNONE && prefix="$ac_default_prefix"
|
||||
test "x$exec_prefix" = xNONE && exec_prefix="${prefix}"
|
||||
datarootdir="$(eval echo "$datarootdir")"
|
||||
grub_libdir="$(eval echo "$libdir")"
|
||||
grub_localedir="$(eval echo "$localedir")"
|
||||
grub_datadir="$(eval echo "$datadir")"
|
||||
grub_sysconfdir="$(eval echo "$sysconfdir")"
|
||||
AC_DEFINE_UNQUOTED(LOCALEDIR, "$grub_localedir", [Locale dir])
|
||||
AC_DEFINE_UNQUOTED(GRUB_LIBDIR, "$grub_libdir", [Library dir])
|
||||
AC_DEFINE_UNQUOTED(GRUB_DATADIR, "$grub_datadir", [Data dir])
|
||||
AC_DEFINE_UNQUOTED(GRUB_SYSCONFDIR, "$grub_sysconfdir", [Configuration dir])
|
||||
|
||||
|
||||
# Output files.
|
||||
cpudir="${target_cpu}"
|
||||
@@ -1585,8 +1476,8 @@ else
|
||||
echo Build-time grub-mkfont: No "($grub_build_mkfont_excuse)"
|
||||
echo "Without unifont (no build-time grub-mkfont)"
|
||||
fi
|
||||
if test x"$liblzma_excuse" != x ; then
|
||||
echo "Without liblzma (no support for XZ-compressed mips images) ($liblzma_excuse)"
|
||||
if test "x$LIBLZMA" = x ; then
|
||||
echo "Without liblzma (no support for XZ-compressed mips images)"
|
||||
else
|
||||
echo "With liblzma from $LIBLZMA (support for XZ-compressed mips images)"
|
||||
fi
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
if test -f (cbfsdisk)/etc/grub.cfg; then
|
||||
source (cbfsdisk)/etc/grub.cfg
|
||||
fi
|
||||
244
docs/autoiso.cfg
244
docs/autoiso.cfg
@@ -1,244 +0,0 @@
|
||||
# Sample GRUB script to autodetect operating systems
|
||||
#
|
||||
# Copyright (C) 2010 Free Software Foundation, Inc.
|
||||
#
|
||||
# GRUB is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# GRUB is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
function pathname { regexp -s 2:"$2" '^(\(.*\))?(/.*)$' "$1"; }
|
||||
function devname { regexp -s "$2" '^(\(.*\)).*$' "$1"; }
|
||||
|
||||
function loopback_iso_entry {
|
||||
realdev="$1"
|
||||
isopath="$2"
|
||||
loopdev="$3"
|
||||
|
||||
if test -f /boot/grub/loopback.cfg; then
|
||||
cfgpath=/boot/grub/loopback.cfg
|
||||
elif test -f /grub/loopback.cfg; then
|
||||
cfgpath=/grub/loopback.cfg
|
||||
else
|
||||
return 1;
|
||||
fi
|
||||
|
||||
echo loopback.cfg $isopath: yes
|
||||
menuentry "Boot GRUB Loopback Config from ${realdev}${isopath}" "$realdev" "$isopath" "$cfgpath" {
|
||||
set device="$2"
|
||||
set iso_path="$3"
|
||||
set cfg_path="$4"
|
||||
|
||||
export iso_path
|
||||
loopback loopdev_cfg "${device}${iso_path}"
|
||||
set root=(loopdev_cfg)
|
||||
configfile $cfg_path
|
||||
loopback -d loopdev_cfg
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
function grml_iso_entry {
|
||||
realdev="$1"
|
||||
isopath="$2"
|
||||
loopdev="$3"
|
||||
|
||||
result=1
|
||||
for dir in /boot/grml /boot/grmlsmall /boot/grmlmedium; do
|
||||
if ! test -f ${dir}/linux26 -a -f ${dir}/initrd.gz; then continue; fi
|
||||
|
||||
echo grml $isopath: yes
|
||||
result=0
|
||||
menuentry "GRML Linux from ${realdev}${isopath}" \
|
||||
"$realdev" "$isopath" "$dir" {
|
||||
set device="$2"
|
||||
set isopath="$3"
|
||||
set grmldir="$4"
|
||||
|
||||
loopback loopdev_grml "${device}${isopath}"
|
||||
set root=(loopdev_grml)
|
||||
linux $grmldir/linux26 findiso="$isopath" apm=power-off quiet \
|
||||
boot=live nomce
|
||||
initrd $grmldir/initrd.gz
|
||||
loopback -d loopdev_grml
|
||||
}
|
||||
done
|
||||
return $result
|
||||
}
|
||||
|
||||
function pmagic_iso_entry {
|
||||
realdev="$1"
|
||||
isopath="$2"
|
||||
loopdev="$3"
|
||||
|
||||
if ! test -f /pmagic/bzImage -a -f /pmagic/initramfs; then return 1; fi
|
||||
|
||||
echo pmagic $isopath: yes
|
||||
menuentry "Parted Magic from ${realdev}${isopath}" "$realdev" "$isopath" {
|
||||
set device="$2"
|
||||
set isopath="$3"
|
||||
|
||||
loopback loopdev_pmagic "${device}${isopath}"
|
||||
set root=(loopdev_pmagic)
|
||||
linux /pmagic/bzImage iso_filename="$isopath" edd=off noapic \
|
||||
load_ramdisk=1 prompt_ramdisk=0 rw sleep=10 loglevel=0 \
|
||||
keymap=$langcode
|
||||
initrd /pmagic/initramfs
|
||||
loopback -d loopdev_pmagic
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
function sidux_iso_entry {
|
||||
realdev="$1"
|
||||
isopath="$2"
|
||||
loopdev="$3"
|
||||
|
||||
result=1
|
||||
for kernel in /boot/vmlinuz-*-sidux-*; do
|
||||
if ! test -f "$kernel"; then continue; fi
|
||||
regexp -s 1:v1 -s 2:v2 '/boot/vmlinuz-(.*)-sidux-(.*)' "$kernel"
|
||||
|
||||
initrd="/boot/initrd.img-$v1-sidux-$v2"
|
||||
if ! test -f "$initrd"; then continue; fi
|
||||
|
||||
result=0
|
||||
echo sidux $isopath: yes
|
||||
menuentry "Sidux vmlinux-$v1-sidux-$v2 from ${realdev}${isopath}" "$realdev" "$isopath" "$kernel" "$initrd" {
|
||||
set device="$2"
|
||||
set isopath="$3"
|
||||
set kernel="$4"
|
||||
set initrd="$5"
|
||||
|
||||
loopback loopdev_sidux "${device}${isopath}"
|
||||
set root=(loopdev_sidux)
|
||||
linux $kernel fromiso=$isopath boot=fll quiet
|
||||
initrd $initrd
|
||||
loopback -d loopdev_sidux
|
||||
}
|
||||
done
|
||||
return $result
|
||||
}
|
||||
|
||||
function slax_iso_entry {
|
||||
realdev="$1"
|
||||
isopath="$2"
|
||||
loopdev="$3"
|
||||
|
||||
if ! test -f /boot/vmlinuz -a -f /boot/initrd.gz; then return 1; fi
|
||||
|
||||
echo slax $isopath: yes
|
||||
menuentry "Slax Linux from ${realdev}${isopath}" "$realdev" "$isopath" {
|
||||
set device="$2"
|
||||
set isopath="$3"
|
||||
|
||||
loopback loopdev_slax "${device}${isopath}"
|
||||
set root=(loopdev_slax)
|
||||
linux /boot/vmlinuz from=$isopath ramdisk_size=6666 root=/dev/ram0 rw
|
||||
initrd /boot/initrd.gz
|
||||
loopback -d loopdev_slax
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
function tinycore_iso_entry {
|
||||
realpath="$1"
|
||||
isopath="$2"
|
||||
loopdev="$3"
|
||||
|
||||
if ! test -f /boot/bzImage -a -f /boot/tinycore.gz; then return 1; fi
|
||||
|
||||
echo tinycore $isopath: yes
|
||||
menuentry "Tinycore Linux from ${realdev}${isopath}" "$realdev" "$isopath" {
|
||||
set device="$2"
|
||||
set isopath="$3"
|
||||
|
||||
loopback loopdev_tiny "${device}${isopath}"
|
||||
set root=(loopdev_tiny)
|
||||
linux /boot/bzImage
|
||||
initrd /boot/tinycore.gz
|
||||
loopback -d loopdev_tiny
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
function casper_iso_entry {
|
||||
realpath="$1"
|
||||
isopath="$2"
|
||||
loopdev="$3"
|
||||
|
||||
if ! test -f /casper/vmlinuz; then return 1; fi
|
||||
initrd=
|
||||
for f in /casper/initrd.*z; do
|
||||
if ! test -f "$f"; then continue; fi
|
||||
pathname "$f" initrd
|
||||
done
|
||||
if test -z "$initrd"; then return 1; fi
|
||||
|
||||
echo casper $isopath: yes
|
||||
menuentry "Casper based Linux from ${realdev}${isopath}" "$realdev" "$isopath" "$initrd" {
|
||||
set device="$2"
|
||||
set isopath="$3"
|
||||
set initrd="$4"
|
||||
|
||||
loopback loopdev_casper "${device}${isopath}"
|
||||
set root=(loopdev_casper)
|
||||
linux /casper/vmlinuz boot=casper iso-scan/filename="$isopath" quiet splash noprompt keyb="$langcode" \
|
||||
debian-installer/language="$langcode" console-setup/layoutcode?="$langcode" --
|
||||
initrd $initrd
|
||||
loopback -d loopdev_casper
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
function scan_isos {
|
||||
isodirs="$1"
|
||||
|
||||
for dev in (*); do
|
||||
for dir in $isodirs; do
|
||||
for file in ${dev}${dir}/*.iso ${dev}${dir}/*.ISO; do
|
||||
if ! test -f "$file"; then continue; fi
|
||||
|
||||
pathname $file isopath
|
||||
if test -z "$dev" -o -z "$isopath"; then continue; fi
|
||||
|
||||
if ! loopback loopdev_scan "$file"; then continue; fi
|
||||
saved_root=$root
|
||||
set root=(loopdev_scan)
|
||||
|
||||
if loopback_iso_entry $dev $isopath (loopdev_scan); then true;
|
||||
elif grml_iso_entry $dev $isopath (loopdev_scan); then true;
|
||||
elif pmagic_iso_entry $dev $isopath (loopdev_scan); then true;
|
||||
elif sidux_iso_entry $dev $isopath (loopdev_scan); then true;
|
||||
elif slax_iso_entry $dev $isopath (loopdev_scan); then true;
|
||||
elif tinycore_iso_entry $dev $isopath (loopdev_scan); then true;
|
||||
elif casper_iso_entry $dev $isopath (loopdev_scan); then true;
|
||||
else true; fi
|
||||
|
||||
set root=$saved_root
|
||||
loopback -d loopdev_scan
|
||||
done
|
||||
done
|
||||
done
|
||||
return 0
|
||||
}
|
||||
|
||||
# XXX Remove later
|
||||
insmod serial
|
||||
serial
|
||||
terminal_output --append serial
|
||||
# terminal_input --append serial
|
||||
|
||||
langcode="$lang"
|
||||
|
||||
insmod regexp
|
||||
scan_isos /iso /boot/iso
|
||||
|
||||
@@ -79,6 +79,7 @@ This edition documents version @value{VERSION}.
|
||||
* Contributing Changes::
|
||||
* Porting::
|
||||
* Error Handling::
|
||||
* CIA::
|
||||
* BIOS port memory map::
|
||||
* Video Subsystem::
|
||||
* PFF2 Font File Format::
|
||||
@@ -91,36 +92,24 @@ This edition documents version @value{VERSION}.
|
||||
@node Getting the source code
|
||||
@chapter Getting the source code
|
||||
|
||||
GRUB is maintained using the @uref{GIT revision
|
||||
control system}. To fetch:
|
||||
GRUB is maintained using the @uref{http://bazaar-vcs.org/, Bazaar revision
|
||||
control system}. To fetch the primary development branch:
|
||||
|
||||
@example
|
||||
git clone git://git.sv.gnu.org/grub.git
|
||||
bzr get http://bzr.savannah.gnu.org/r/grub/trunk/grub
|
||||
@end example
|
||||
|
||||
Web access is available under
|
||||
The GRUB developers maintain several other branches with work in progress.
|
||||
Of these, the most interesting is the experimental branch, which is a
|
||||
staging area for new code which we expect to eventually merge into trunk but
|
||||
which is not yet ready:
|
||||
|
||||
@example
|
||||
http://git.savannah.gnu.org/cgit/grub.git/
|
||||
bzr get http://bzr.savannah.gnu.org/r/grub/branches/experimental
|
||||
@end example
|
||||
|
||||
The branches available are:
|
||||
|
||||
@table @samp
|
||||
@item master
|
||||
Main developpement branch.
|
||||
@item grub-legacy
|
||||
GRUB 0.97 codebase. Kept for reference and legal reasons
|
||||
@item multiboot
|
||||
Multiboot specfication
|
||||
@item multiboot2
|
||||
Multiboot2 specfication
|
||||
@item developper branches
|
||||
Prefixed with developper name. Every developper of a team manages his own branches.
|
||||
Developper branches do not need changelog entries.
|
||||
@end table
|
||||
|
||||
Once you have used @kbd{git clone} to fetch an initial copy of a branch, you
|
||||
can use @kbd{git pull} to keep it up to date. If you have modified your
|
||||
Once you have used @kbd{bzr get} to fetch an initial copy of a branch, you
|
||||
can use @kbd{bzr pull} to keep it up to date. If you have modified your
|
||||
local version, you may need to resolve conflicts when pulling.
|
||||
|
||||
@node Coding style
|
||||
@@ -345,10 +334,10 @@ anymore.
|
||||
@itemize
|
||||
@item Always use latest GRUB 2 source code. So get that first.
|
||||
|
||||
For developers it is recommended always to use the newest development version of GRUB 2. If development takes a long period of time, please remember to keep in sync with newest developments regularly so it is much easier to integrate your change in the future. GRUB 2 is being developed in a GIT repository.
|
||||
For developers it is recommended always to use the newest development version of GRUB 2. If development takes a long period of time, please remember to keep in sync with newest developments regularly so it is much easier to integrate your change in the future. GRUB 2 is being developed in a Bazaar (bzr) repository.
|
||||
|
||||
Please check Savannah's GRUB project page for details how to get newest git:
|
||||
@uref{https://savannah.gnu.org/git/?group=grub, GRUB 2 git Repository}
|
||||
Please check Savannah's GRUB project page for details how to get newest bzr:
|
||||
@uref{http://savannah.gnu.org/bzr/?group=grub, GRUB 2 bzr Repository}
|
||||
|
||||
@item Compile it and try it out.
|
||||
|
||||
@@ -906,6 +895,34 @@ if (grub_errno != GRUB_ERR_NONE)
|
||||
grub_error_pop ();
|
||||
@end example
|
||||
|
||||
@node CIA
|
||||
@chapter CIA
|
||||
@c By Robert Millan and Carles Pina
|
||||
If you have commit access, please setup CIA in your Bazaar
|
||||
config so those in IRC receive notification of your commits.
|
||||
|
||||
In @file{~/.bazaar/bazaar.conf}, add "cia_send_revno = true".
|
||||
Optionally, you can also add "cia_user = myusername" if you'd
|
||||
like CIA service to use a specific account (for statistical purpose).
|
||||
|
||||
In the @file{.bzr/branch/branch.conf} of your checkout branch,
|
||||
"set nickname = /path_to_this_branch" and "cia_project = GNU GRUB".
|
||||
|
||||
Additionally, please set cia_send_revno in the [DEFAULT] section
|
||||
of your @file{~/.bazaar/bazaar.conf}. E.g.:
|
||||
|
||||
@example
|
||||
[DEFAULT]
|
||||
cia_send_revno = true
|
||||
@end example
|
||||
|
||||
Remember to install cia-clients (Debian/Ubuntu package) to be able to use CIA.
|
||||
|
||||
Keep in mind Bazaar sends notifications for all commits to branches that have
|
||||
this setting, regardless of whether they're bound branches (checkouts) or not.
|
||||
So if you make local commits in a non-bound branch and it bothers you that
|
||||
others can read them, do not use this setting.
|
||||
|
||||
@node BIOS port memory map
|
||||
@chapter BIOS port memory map
|
||||
@c By Yoshinori K Okuji
|
||||
@@ -1096,47 +1113,6 @@ struct grub_video_palette_data
|
||||
Used to query indexed color palettes. If mode is RGB mode, colors will be copied from emulated palette data. In Indexed Color modes, palettes will be read from hardware. Color values will be converted to suit structure format. @code{start} will tell what hardware color index (or emulated color index) will be used as a source for first indice of @code{palette_data}, after that both hardware color index and @code{palette_data} index will be incremented until @code{count} number of colors have been read.
|
||||
@end itemize
|
||||
|
||||
@subsection grub_video_set_area_status
|
||||
@itemize
|
||||
|
||||
@item Prototype:
|
||||
@example
|
||||
grub_err_t
|
||||
grub_video_set_area_status (grub_video_area_status_t area_status);
|
||||
@end example
|
||||
@example
|
||||
enum grub_video_area_status_t
|
||||
@{
|
||||
GRUB_VIDEO_AREA_DISABLED,
|
||||
GRUB_VIDEO_AREA_ENABLED
|
||||
@};
|
||||
@end example
|
||||
|
||||
@item Description:
|
||||
|
||||
Used to set area drawing mode for redrawing the specified region. Draw commands
|
||||
are performed in the intersection of the viewport and the region called area.
|
||||
Coordinates remain related to the viewport. If draw commands try to draw over
|
||||
the area, they are clipped.
|
||||
Set status to DISABLED if you need to draw everything.
|
||||
Set status to ENABLED and region to the desired rectangle to redraw everything
|
||||
inside the region leaving everything else intact.
|
||||
Should be used for redrawing of active elements.
|
||||
@end itemize
|
||||
|
||||
@subsection grub_video_get_area_status
|
||||
@itemize
|
||||
|
||||
@item Prototype:
|
||||
@example
|
||||
grub_err_r
|
||||
grub_video_get_area_status (grub_video_area_status_t *area_status);
|
||||
@end example
|
||||
|
||||
@item Description:
|
||||
Used to query the area status.
|
||||
@end itemize
|
||||
|
||||
@subsection grub_video_set_viewport
|
||||
@itemize
|
||||
@item Prototype:
|
||||
@@ -1163,37 +1139,6 @@ grub_video_get_viewport (unsigned int *x, unsigned int *y, unsigned int *width,
|
||||
Used to query current viewport dimensions. Software developer can use this to choose best way to render contents of the viewport.
|
||||
@end itemize
|
||||
|
||||
@subsection grub_video_set_region
|
||||
@itemize
|
||||
@item Prototype:
|
||||
|
||||
@example
|
||||
grub_err_t
|
||||
grub_video_set_region (unsigned int x, unsigned int y, unsigned int width, unsigned int height);
|
||||
@end example
|
||||
@item Description:
|
||||
|
||||
Used to specify the region of the screen which should be redrawn. Use absolute
|
||||
values. When the region is set and area status is ENABLE all draw commands will
|
||||
be performed inside the interseption of region and viewport named area.
|
||||
If draw commands try to draw over viewport, they are clipped. If developer
|
||||
requests larger than possible region, width and height will be clamped to fit
|
||||
screen. Should be used for redrawing of active elements.
|
||||
@end itemize
|
||||
|
||||
@subsection grub_video_get_region
|
||||
@itemize
|
||||
@item Prototype:
|
||||
|
||||
@example
|
||||
grub_err_t
|
||||
grub_video_get_region (unsigned int *x, unsigned int *y, unsigned int *width, unsigned int *height);
|
||||
@end example
|
||||
@item Description:
|
||||
|
||||
Used to query current region dimensions.
|
||||
@end itemize
|
||||
|
||||
@subsection grub_video_map_color
|
||||
@itemize
|
||||
@item Prototype:
|
||||
|
||||
149
docs/grub.texi
149
docs/grub.texi
@@ -701,26 +701,6 @@ you may run those commands directly to install GRUB, without using
|
||||
with the internals of GRUB. Installing a boot loader on a running OS may be
|
||||
extremely dangerous.
|
||||
|
||||
On EFI systems for fixed disk install you have to mount EFI System Partition.
|
||||
If you mount it at @file{/boot/efi} then you don't need any special arguments:
|
||||
|
||||
@example
|
||||
# @kbd{grub-install}
|
||||
@end example
|
||||
|
||||
Otherwise you need to specify where your EFI System partition is mounted:
|
||||
|
||||
@example
|
||||
# @kbd{grub-install --efi-directory=/mnt/efi}
|
||||
@end example
|
||||
|
||||
For removable installs you have to use @option{--removable} and specify both
|
||||
@option{--boot-directory} and @option{--efi-directory}:
|
||||
|
||||
@example
|
||||
# @kbd{grub-install --efi-directory=/mnt/usb --boot-directory=/mnt/usb/boot --removable}
|
||||
@end example
|
||||
|
||||
@node Making a GRUB bootable CD-ROM
|
||||
@section Making a GRUB bootable CD-ROM
|
||||
|
||||
@@ -1254,14 +1234,14 @@ Valid keys in @file{/etc/default/grub} are as follows:
|
||||
@item GRUB_DEFAULT
|
||||
The default menu entry. This may be a number, in which case it identifies
|
||||
the Nth entry in the generated menu counted from zero, or the title of a
|
||||
menu entry, or the special string @samp{saved}. Using the id may be
|
||||
menu entry, or the special string @samp{saved}. Using the title may be
|
||||
useful if you want to set a menu entry as the default even though there may
|
||||
be a variable number of entries before it.
|
||||
|
||||
For example, if you have:
|
||||
|
||||
@verbatim
|
||||
menuentry 'Example GNU/Linux distribution' --class gnu-linux --id example-gnu-linux {
|
||||
menuentry 'Example GNU/Linux distribution' --class gnu-linux {
|
||||
...
|
||||
}
|
||||
@end verbatim
|
||||
@@ -1269,17 +1249,12 @@ menuentry 'Example GNU/Linux distribution' --class gnu-linux --id example-gnu-li
|
||||
then you can make this the default using:
|
||||
|
||||
@example
|
||||
GRUB_DEFAULT=example-gnu-linux
|
||||
GRUB_DEFAULT='Example GNU/Linux distribution'
|
||||
@end example
|
||||
|
||||
Previously it was documented the way to use entry title. While this still
|
||||
works it's not recommended since titles often contain unstable device names
|
||||
and may be translated
|
||||
|
||||
If you set this to @samp{saved}, then the default menu entry will be that
|
||||
saved by @samp{GRUB_SAVEDEFAULT} or @command{grub-set-default}. This relies on
|
||||
the environment block, which may not be available in all situations
|
||||
(@pxref{Environment block}).
|
||||
saved by @samp{GRUB_SAVEDEFAULT}, @command{grub-set-default}, or
|
||||
@command{grub-reboot}.
|
||||
|
||||
The default is @samp{0}.
|
||||
|
||||
@@ -1288,7 +1263,7 @@ If this option is set to @samp{true}, then, when an entry is selected, save
|
||||
it as a new default entry for use by future runs of GRUB. This is only
|
||||
useful if @samp{GRUB_DEFAULT=saved}; it is a separate option because
|
||||
@samp{GRUB_DEFAULT=saved} is useful without this option, in conjunction with
|
||||
@command{grub-set-default}. Unset by default.
|
||||
@command{grub-set-default} or @command{grub-reboot}. Unset by default.
|
||||
This option relies on the environment block, which may not be available in
|
||||
all situations (@pxref{Environment block}).
|
||||
|
||||
@@ -1451,22 +1426,6 @@ Normally, @command{grub-mkconfig} will try to use the external
|
||||
systems installed on the same system and generate appropriate menu entries
|
||||
for them. Set this option to @samp{true} to disable this.
|
||||
|
||||
@item GRUB_OS_PROBER_SKIP_LIST
|
||||
List of space-separated FS UUIDs of filesystems to be ignored from os-prober
|
||||
output. For efi chainloaders it's <UUID>@@<EFI FILE>
|
||||
|
||||
@item GRUB_DISABLE_SUBMENU
|
||||
Normally, @command{grub-mkconfig} will generate top level menu entry for
|
||||
the kernel with highest version number and put all other found kernels
|
||||
or alternative menu entries for recovery mode in submenu. For entries returned
|
||||
by @command{os-prober} first entry will be put on top level and all others
|
||||
in submenu. If this option is set to @samp{y}, flat menu with all entries
|
||||
on top level will be generated instead. Changing this option will require
|
||||
changing existing values of @samp{GRUB_DEFAULT}, @samp{fallback} (@pxref{fallback})
|
||||
and @samp{default} (@pxref{default}) environment variables as well as saved
|
||||
default entry using @command{grub-set-default} and value used with
|
||||
@command{grub-reboot}.
|
||||
|
||||
@item GRUB_ENABLE_CRYPTODISK
|
||||
If set to @samp{y}, @command{grub-mkconfig} and @command{grub-install} will
|
||||
check for encrypted disks and generate additional commands needed to access
|
||||
@@ -2488,8 +2447,6 @@ button. @samp{GRUB_BUTTON_CMOS_ADDRESS} is vendor-specific and partially
|
||||
model-specific. Values known to the GRUB team are:
|
||||
|
||||
@table @key
|
||||
@item Dell XPS M1330M
|
||||
121:3
|
||||
@item Dell XPS M1530
|
||||
85:3
|
||||
@item Dell Latitude E4300
|
||||
@@ -2669,7 +2626,6 @@ Heavily limited platforms:
|
||||
Lightly limited platforms:
|
||||
|
||||
@itemize
|
||||
@item *-xen: limited only by adress space and RAM size.
|
||||
@item i386-qemu: kernel.img (.text + .data + .bss) is limited by 392704 bytes.
|
||||
(core.img would be limited by ROM size but it's unlimited on qemu
|
||||
@item All EFI platforms: limited by contiguous RAM size and possibly firmware bugs
|
||||
@@ -2725,9 +2681,9 @@ by a digit, like @samp{fd0}, or @samp{cd}.
|
||||
AHCI, PATA (ata), crypto, USB use the name of driver followed by a number.
|
||||
Memdisk and host are limited to one disk and so it's refered just by driver
|
||||
name.
|
||||
RAID (md), ofdisk (ieee1275 and nand), LVM (lvm), LDM, virtio (vdsk)
|
||||
and arcdisk (arc) use intrinsic name of disk prefixed by driver name.
|
||||
Additionally just ``nand'' refers to the disk aliased as ``nand''.
|
||||
RAID (md), ofdisk (ieee1275 and nand), LVM (lvm), LDM and arcdisk (arc) use
|
||||
intrinsic name of disk prefixed by driver name. Additionally just ``nand''
|
||||
refers to the disk aliased as ``nand''.
|
||||
Conflicts are solved by suffixing a number if necessarry.
|
||||
Commas need to be escaped.
|
||||
Loopback uses whatever name specified to @command{loopback} command.
|
||||
@@ -2993,7 +2949,6 @@ These variables have special meaning to GRUB.
|
||||
* biosnum::
|
||||
* check_signatures::
|
||||
* chosen::
|
||||
* cmdpath::
|
||||
* color_highlight::
|
||||
* color_normal::
|
||||
* debug::
|
||||
@@ -3063,16 +3018,6 @@ the titles of each of the submenus starting from the top level followed by
|
||||
the title of the menu entry itself, separated by @samp{>}.
|
||||
|
||||
|
||||
@node cmdpath
|
||||
@subsection cmdpath
|
||||
|
||||
The location from which @file{core.img} was loaded as an absolute
|
||||
directory name (@pxref{File name syntax}). This is set by GRUB at
|
||||
startup based on information returned by platform firmware. Not every
|
||||
platform provides this information and some may return only device
|
||||
without path name.
|
||||
|
||||
|
||||
@node color_highlight
|
||||
@subsection color_highlight
|
||||
|
||||
@@ -3143,8 +3088,7 @@ to go beyond the current 16 colors.
|
||||
This variable may be set to enable debugging output from various components
|
||||
of GRUB. The value is a list of debug facility names separated by
|
||||
whitespace or @samp{,}, or @samp{all} to enable all available debugging
|
||||
output. The facility names are the first argument to grub_dprintf. Consult
|
||||
source for more details.
|
||||
output.
|
||||
|
||||
|
||||
@node default
|
||||
@@ -3152,21 +3096,7 @@ source for more details.
|
||||
|
||||
If this variable is set, it identifies a menu entry that should be selected
|
||||
by default, possibly after a timeout (@pxref{timeout}). The entry may be
|
||||
identified by number or by id.
|
||||
|
||||
For example, if you have:
|
||||
|
||||
@verbatim
|
||||
menuentry 'Example GNU/Linux distribution' --class gnu-linux --id example-gnu-linux {
|
||||
...
|
||||
}
|
||||
@end verbatim
|
||||
|
||||
then you can make this the default using:
|
||||
|
||||
@example
|
||||
default=example-gnu-linux
|
||||
@end example
|
||||
identified by number or by title.
|
||||
|
||||
If the entry is in a submenu, then it must be identified using the titles of
|
||||
each of the submenus starting from the top level followed by the number or
|
||||
@@ -3206,8 +3136,7 @@ If this variable is set, it sets the resolution used on the @samp{gfxterm}
|
||||
graphical terminal. Note that you can only use modes which your graphics
|
||||
card supports via VESA BIOS Extensions (VBE), so for example native LCD
|
||||
panel resolutions may not be available. The default is @samp{auto}, which
|
||||
selects a platform-specific default that should look reasonable. Supported
|
||||
modes can be listed by @samp{videoinfo} command in GRUB.
|
||||
selects a platform-specific default that should look reasonable.
|
||||
|
||||
The resolution may be specified as a sequence of one or more modes,
|
||||
separated by commas (@samp{,}) or semicolons (@samp{;}); each will be tried
|
||||
@@ -3751,8 +3680,6 @@ you forget a command, you can run the command @command{help}
|
||||
* lsfonts:: List loaded fonts
|
||||
* lsmod:: Show loaded modules
|
||||
* md5sum:: Compute or check MD5 hash
|
||||
* module:: Load module for multiboot kernel
|
||||
* multiboot:: Load multiboot compliant kernel
|
||||
* nativedisk:: Switch to native disk drivers
|
||||
* normal:: Enter normal mode
|
||||
* normal_exit:: Exit from normal mode
|
||||
@@ -4442,6 +4369,7 @@ List loaded fonts.
|
||||
Show list of loaded modules.
|
||||
@end deffn
|
||||
|
||||
|
||||
@node md5sum
|
||||
@subsection md5sum
|
||||
|
||||
@@ -4450,34 +4378,6 @@ Alias for @code{hashsum --hash md5 arg @dots{}}. See command @command{hashsum}
|
||||
(@pxref{hashsum}) for full description.
|
||||
@end deffn
|
||||
|
||||
@node module
|
||||
@subsection module
|
||||
|
||||
@deffn Command module [--nounzip] file [arguments]
|
||||
Load a module for multiboot kernel image. The rest of the
|
||||
line is passed verbatim as the module command line.
|
||||
@end deffn
|
||||
|
||||
@node multiboot
|
||||
@subsection multiboot
|
||||
|
||||
@deffn Command multiboot [--quirk-bad-kludge] [--quirk-modules-after-kernel] file @dots{}
|
||||
Load a multiboot kernel image from @var{file}. The rest of the
|
||||
line is passed verbatim as the @dfn{kernel command-line}. Any module must
|
||||
be reloaded after using this command (@pxref{module}).
|
||||
|
||||
Some kernels have known problems. You need to specify --quirk-* for those.
|
||||
--quirk-bad-kludge is a problem seen in several products that they include
|
||||
loading kludge information with invalid data in ELF file. GRUB prior to 0.97
|
||||
and some custom builds prefered ELF information while 0.97 and GRUB 2
|
||||
use kludge. Use this option to ignore kludge.
|
||||
Known affected systems: old Solaris, SkyOS.
|
||||
|
||||
--quirk-modules-after-kernel is needed for kernels which load at relatively
|
||||
high address e.g. 16MiB mark and can't cope with modules stuffed between
|
||||
1MiB mark and beginning of the kernel.
|
||||
Known afftected systems: VMWare.
|
||||
@end deffn
|
||||
|
||||
@node nativedisk
|
||||
@subsection nativedisk
|
||||
@@ -5220,14 +5120,12 @@ is given, use default list of servers.
|
||||
|
||||
|
||||
@node Internationalisation
|
||||
@chapter Internationalisation
|
||||
|
||||
@section Charset
|
||||
@chapter Charset
|
||||
GRUB uses UTF-8 internally other than in rendering where some GRUB-specific
|
||||
appropriate representation is used. All text files (including config) are
|
||||
assumed to be encoded in UTF-8.
|
||||
|
||||
@section Filesystems
|
||||
@chapter Filesystems
|
||||
NTFS, JFS, UDF, HFS+, exFAT, long filenames in FAT, Joliet part of
|
||||
ISO9660 are treated as UTF-16 as per specification. AFS and BFS are read
|
||||
as UTF-8, again according to specification. BtrFS, cpio, tar, squash4, minix,
|
||||
@@ -5261,7 +5159,7 @@ treated as distinct from u+combining diaresis. This however means that in
|
||||
order to access file on HFS+ its name must be specified in normalisation form D.
|
||||
On normalized ZFS subvolumes filenames out of normalisation are inaccessible.
|
||||
|
||||
@section Output terminal
|
||||
@chapter Output terminal
|
||||
Firmware output console ``console'' on ARC and IEEE1275 are limited to ASCII.
|
||||
|
||||
BIOS firmware console and VGA text are limited to ASCII and some pseudographics.
|
||||
@@ -5295,7 +5193,7 @@ called ``annotation characters'' If you can complete either of
|
||||
two lists or, better, propose a patch to improve rendering, please contact
|
||||
developer team.
|
||||
|
||||
@section Input terminal
|
||||
@chapter Input terminal
|
||||
Firmware console on BIOS, IEEE1275 and ARC doesn't allow you to enter non-ASCII
|
||||
characters. EFI specification allows for such but author is unaware of any
|
||||
actual implementations. Serial input is currently limited for latin1 (unlikely
|
||||
@@ -5305,15 +5203,15 @@ So no dead keys or advanced input method. Also there is no keymap change hotkey.
|
||||
In practice it makes difficult to enter any text using non-Latin alphabet.
|
||||
Moreover all current input consumers are limited to ASCII.
|
||||
|
||||
@section Gettext
|
||||
@chapter Gettext
|
||||
GRUB supports being translated. For this you need to have language *.mo files in $prefix/locale, load gettext module and set ``lang'' variable.
|
||||
|
||||
@section Regexp
|
||||
@chapter Regexp
|
||||
Regexps work on unicode characters, however no attempt at checking cannonical
|
||||
equivalence has been made. Moreover the classes like [:alpha:] match only
|
||||
ASCII subset.
|
||||
|
||||
@section Other
|
||||
@chapter Other
|
||||
Currently GRUB always uses YEAR-MONTH-DAY HOUR:MINUTE:SECOND [WEEKDAY] 24-hour
|
||||
datetime format but weekdays are translated.
|
||||
GRUB always uses the decimal number format with [0-9] as digits and . as
|
||||
@@ -5442,8 +5340,9 @@ may halt or otherwise impact the boot process.
|
||||
|
||||
GRUB uses GPG-style detached signatures (meaning that a file
|
||||
@file{foo.sig} will be produced when file @file{foo} is signed), and
|
||||
currently supports the DSA and RSA signing algorithms. A signing key
|
||||
can be generated as follows:
|
||||
currently supports the DSA signing algorithm. Both 2048-bit and
|
||||
3072-bit keys are supported. A signing key can be generated as
|
||||
follows:
|
||||
|
||||
@example
|
||||
gpg --gen-key
|
||||
@@ -5783,7 +5682,7 @@ X86 support is summarised in the following table. ``Yes'' means that the kernel
|
||||
PowerPC, IA64 and Sparc64 ports support only Linux. MIPS port supports Linux
|
||||
and multiboot2.
|
||||
|
||||
@section Boot tests
|
||||
@chapter Boot tests
|
||||
|
||||
As you have seen in previous chapter the support matrix is pretty big and some of the configurations are only rarely used. To ensure the quality bootchecks are available for all x86 targets except EFI chainloader, Appleloader and XNU. All x86 platforms have bootcheck facility except ieee1275. Multiboot, multiboot2, BIOS chainloader, ntldr and freebsd-bootloader boot targets are tested only with a fake kernel images. Only Linux is tested among the payloads using Linux protocols.
|
||||
|
||||
|
||||
24
gentpl.py
24
gentpl.py
@@ -21,7 +21,6 @@
|
||||
|
||||
GRUB_PLATFORMS = [ "emu", "i386_pc", "i386_efi", "i386_qemu", "i386_coreboot",
|
||||
"i386_multiboot", "i386_ieee1275", "x86_64_efi",
|
||||
"i386_xen", "x86_64_xen",
|
||||
"mips_loongson", "sparc64_ieee1275",
|
||||
"powerpc_ieee1275", "mips_arc", "ia64_efi",
|
||||
"mips_qemu_mips", "arm_uboot", "arm_efi" ]
|
||||
@@ -43,7 +42,6 @@ GROUPS["arm"] = [ "arm_uboot", "arm_efi" ]
|
||||
GROUPS["efi"] = [ "i386_efi", "x86_64_efi", "ia64_efi", "arm_efi" ]
|
||||
GROUPS["ieee1275"] = [ "i386_ieee1275", "sparc64_ieee1275", "powerpc_ieee1275" ]
|
||||
GROUPS["uboot"] = [ "arm_uboot" ]
|
||||
GROUPS["xen"] = [ "i386_xen", "x86_64_xen" ]
|
||||
|
||||
# emu is a special case so many core functionality isn't needed on this platform
|
||||
GROUPS["noemu"] = GRUB_PLATFORMS[:]; GROUPS["noemu"].remove("emu")
|
||||
@@ -51,7 +49,7 @@ GROUPS["noemu"] = GRUB_PLATFORMS[:]; GROUPS["noemu"].remove("emu")
|
||||
# Groups based on hardware features
|
||||
GROUPS["cmos"] = GROUPS["x86"][:] + ["mips_loongson", "mips_qemu_mips",
|
||||
"sparc64_ieee1275", "powerpc_ieee1275"]
|
||||
GROUPS["cmos"].remove("i386_efi"); GROUPS["cmos"].remove("x86_64_efi");
|
||||
GROUPS["cmos"].remove("i386_efi"); GROUPS["cmos"].remove("x86_64_efi")
|
||||
GROUPS["pci"] = GROUPS["x86"] + ["mips_loongson"]
|
||||
GROUPS["usb"] = GROUPS["pci"]
|
||||
|
||||
@@ -61,7 +59,7 @@ GROUPS["videomodules"] = GRUB_PLATFORMS[:];
|
||||
for i in GROUPS["videoinkernel"]: GROUPS["videomodules"].remove(i)
|
||||
|
||||
# Similar for terminfo
|
||||
GROUPS["terminfoinkernel"] = [ "emu", "mips_loongson", "mips_arc", "mips_qemu_mips" ] + GROUPS["xen"] + GROUPS["ieee1275"] + GROUPS["uboot"];
|
||||
GROUPS["terminfoinkernel"] = [ "emu", "mips_loongson", "mips_arc", "mips_qemu_mips" ] + GROUPS["ieee1275"] + GROUPS["uboot"];
|
||||
GROUPS["terminfomodule"] = GRUB_PLATFORMS[:];
|
||||
for i in GROUPS["terminfoinkernel"]: GROUPS["terminfomodule"].remove(i)
|
||||
|
||||
@@ -309,8 +307,13 @@ def define_macro_for_platform_nodist_sources(p):
|
||||
return define_autogen_macro(
|
||||
"get_" + p + "_nodist_sources",
|
||||
platform_values(p, "_nodist"))
|
||||
def define_macro_for_platform_dependencies(p):
|
||||
return define_autogen_macro(
|
||||
"get_" + p + "_dependencies",
|
||||
platform_values(p, "dependencies", "_dependencies"))
|
||||
def platform_sources(p): return "[+ get_" + p + "_sources +]"
|
||||
def platform_nodist_sources(p): return "[+ get_" + p + "_nodist_sources +]"
|
||||
def platform_dependencies(p): return "[+ get_" + p + "_dependencies +]"
|
||||
|
||||
#
|
||||
# Returns Autogen code which defines the autogen macros that collect
|
||||
@@ -425,13 +428,13 @@ def kernel(platform):
|
||||
r += gvar_add("CLEANFILES", "[+ name +].img")
|
||||
r += rule("[+ name +].img", "[+ name +].exec$(EXEEXT)",
|
||||
if_platform_tagged(platform, "nostrip",
|
||||
"""if test x$(TARGET_APPLE_LINKER) = x1; then \
|
||||
"""if test x$(USE_APPLE_CC_FIXES) = xyes; then \
|
||||
$(TARGET_OBJCONV) -f$(TARGET_MODULE_FORMAT) -nr:_grub_mod_init:grub_mod_init -nr:_grub_mod_fini:grub_mod_fini -ed2022 -wd1106 -nu -nd $< $@; \
|
||||
elif test ! -z '$(TARGET_OBJ2ELF)'; then \
|
||||
cp $< $@.bin; $(TARGET_OBJ2ELF) $@.bin && cp $@.bin $@ || (rm -f $@.bin; exit 1); \
|
||||
else cp $< $@; fi""",
|
||||
"""if test x$(TARGET_APPLE_LINKER) = x1; then \
|
||||
$(TARGET_STRIP) -S -x $(""" + cname() + """) -o $@.bin $<; \
|
||||
"""if test x$(USE_APPLE_CC_FIXES) = xyes; then \
|
||||
$(TARGET_STRIP) $(""" + cname() + """) -o $@.bin $<; \
|
||||
$(TARGET_OBJCONV) -f$(TARGET_MODULE_FORMAT) -nr:_grub_mod_init:grub_mod_init -nr:_grub_mod_fini:grub_mod_fini -ed2022 -wd1106 -nu -nd $@.bin $@; \
|
||||
else """ + "$(TARGET_STRIP) $(" + cname() + "_STRIPFLAGS) -o $@ $<; \
|
||||
fi"""))
|
||||
@@ -457,7 +460,7 @@ def image(platform):
|
||||
r += gvar_add("platform_DATA", "[+ name +].img")
|
||||
r += gvar_add("CLEANFILES", "[+ name +].img")
|
||||
r += rule("[+ name +].img", "[+ name +].image$(EXEEXT)", """
|
||||
if test x$(TARGET_APPLE_LINKER) = x1; then \
|
||||
if test x$(USE_APPLE_CC_FIXES) = xyes; then \
|
||||
$(MACHO2IMG) $< $@; \
|
||||
else \
|
||||
$(TARGET_OBJCOPY) $(""" + cname() + """_OBJCOPYFLAGS) --strip-unneeded -R .note -R .comment -R .note.gnu.build-id -R .reginfo -R .rel.dyn -R .note.gnu.gold-version $< $@; \
|
||||
@@ -541,8 +544,8 @@ def script(platform):
|
||||
r += "[+ IF mansection +]" + manpage("grub-mkconfig_lib") + "[+ ENDIF +]"
|
||||
r += "[+ ENDIF +]"
|
||||
|
||||
r += rule("[+ name +]", "$(top_builddir)/config.status " + platform_sources(platform) + platform_dependencies(platform), """
|
||||
(for x in """ + platform_sources(platform) + """; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:-
|
||||
r += rule("[+ name +]", "$(top_builddir)/config.status " + platform_sources(platform), """
|
||||
(skip=1; for x in $^; do if [ $$skip = 1 ]; then skip=0; else cat "$$x"; fi; done) | $(top_builddir)/config.status --file=$@:-
|
||||
chmod a+x [+ name +]
|
||||
""")
|
||||
|
||||
@@ -602,6 +605,7 @@ print ("[+ AutoGen5 template +]\n")
|
||||
for p in GRUB_PLATFORMS:
|
||||
print (define_macro_for_platform_sources(p))
|
||||
print (define_macro_for_platform_nodist_sources(p))
|
||||
# print define_macro_for_platform_dependencies(p)
|
||||
|
||||
print (define_macro_for_platform_startup(p))
|
||||
print (define_macro_for_platform_cflags(p))
|
||||
|
||||
@@ -82,9 +82,7 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/term.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/time.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/mm_private.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/net.h
|
||||
if !COND_clang
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/libgcc.h
|
||||
endif
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/memory.h
|
||||
|
||||
if COND_i386_pc
|
||||
@@ -130,24 +128,6 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
|
||||
endif
|
||||
|
||||
if COND_i386_xen
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/xen.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/xen/hypercall.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/loader.h
|
||||
endif
|
||||
|
||||
if COND_x86_64_xen
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/xen.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/x86_64/xen/hypercall.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/loader.h
|
||||
endif
|
||||
|
||||
if COND_x86_64_efi
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h
|
||||
@@ -389,49 +369,42 @@ CLEANFILES += $(MOD_FILES)
|
||||
if COND_ENABLE_EFIEMU
|
||||
efiemu32.o: efiemu/runtime/efiemu.c $(TARGET_OBJ2ELF)
|
||||
-rm -f $@; \
|
||||
if test "x$(TARGET_APPLE_LINKER)" = x1; then \
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -m32 -Wall -Werror -nostdlib -O2 -c -o $@.bin $< || exit 1; \
|
||||
if test "x$(TARGET_APPLE_CC)" = x1; then \
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -DELF32 -DAPPLE_CC -m32 -Wall -Werror -nostdlib -O2 -c -o $@.bin $< || exit 1; \
|
||||
$(OBJCONV) -felf32 -nu -nd $@.bin $@ || exit 1; \
|
||||
rm -f $@.bin; \
|
||||
else \
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -m32 -Wall -Werror -nostdlib -O2 -c -o $@ $< || exit 1; \
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -DELF32 -m32 -Wall -Werror -nostdlib -O2 -c -o $@ $< || exit 1; \
|
||||
if test ! -z "$(TARGET_OBJ2ELF)"; then $(TARGET_OBJ2ELF) $@ || (rm -f $@; exit 1); fi; \
|
||||
fi
|
||||
|
||||
efiemu64_c.o: efiemu/runtime/efiemu.c
|
||||
if test "x$(TARGET_APPLE_LINKER)" = x1; then \
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -m64 -nostdlib -Wall -Werror -mno-red-zone -c -o $@ $< || exit 1; \
|
||||
if test "x$(TARGET_APPLE_CC)" = x1; then \
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -DELF64 -DAPPLE_CC=1 -m64 -nostdlib -Wall -Werror -mno-red-zone -c -o $@ $< || exit 1; \
|
||||
else \
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -m64 -nostdlib -Wall -Werror -O2 -mcmodel=large -mno-red-zone -c -o $@ $< || exit 1; \
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -DELF64 -m64 -nostdlib -Wall -Werror -O2 -mcmodel=large -mno-red-zone -c -o $@ $< || exit 1; \
|
||||
fi
|
||||
|
||||
efiemu64_s.o: efiemu/runtime/efiemu.S
|
||||
-rm -f $@
|
||||
if test "x$(TARGET_APPLE_LINKER)" = x1; then \
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -m64 -Wall -Werror -nostdlib -O2 -mno-red-zone -c -o $@ $< || exit 1; \
|
||||
if test "x$(TARGET_APPLE_CC)" = x1; then \
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -DELF64 -DAPPLE_CC=1 -m64 -Wall -Werror -nostdlib -O2 -mno-red-zone -c -o $@ $< || exit 1; \
|
||||
else \
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -m64 -Wall -Werror -nostdlib -O2 -mcmodel=large -mno-red-zone -c -o $@ $< || exit 1; \
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -DELF64 -m64 -Wall -Werror -nostdlib -O2 -mcmodel=large -mno-red-zone -c -o $@ $< || exit 1; \
|
||||
fi
|
||||
|
||||
efiemu64.o: efiemu64_c.o efiemu64_s.o $(TARGET_OBJ2ELEF)
|
||||
-rm -f $@; \
|
||||
if test "x$(TARGET_APPLE_LINKER)" = x1; then \
|
||||
if test "x$(TARGET_APPLE_CC)" = x1; then \
|
||||
rm -f $@.bin; \
|
||||
$(TARGET_CC) -m64 -Wl,-r -nostdlib -o $@.bin $^ || exit 1; \
|
||||
$(OBJCONV) -felf64 -nu -nd $@.bin $@ || exit 1; \
|
||||
rm -f $@.bin; \
|
||||
else \
|
||||
$(TARGET_CC) -m64 -Wl,-melf_x86_64 -nostdlib -Wl,-r -o $@ $^ || exit 1; \
|
||||
$(TARGET_CC) -m64 -nostdlib -Wl,-r -o $@ $^ || exit 1; \
|
||||
if test ! -z "$(TARGET_OBJ2ELF)"; then $(TARGET_OBJ2ELF) $@ || (rm -f $@; exit 1); fi; \
|
||||
fi
|
||||
|
||||
platform_DATA += efiemu32.o efiemu64.o
|
||||
CLEANFILES += efiemu32.o efiemu64.o efiemu64_c.o efiemu64_s.o
|
||||
endif
|
||||
|
||||
windowsdir=$(top_builddir)/$(PACKAGE)-$(VERSION)-for-windows
|
||||
windowsdir: $(PROGRAMS) $(starfield_DATA) $(platform_DATA)
|
||||
test -d $(windowsdir)/$(target_cpu)-$(platform) || mkdir $(windowsdir)/$(target_cpu)-$(platform)
|
||||
for x in $(platform_DATA); do \
|
||||
cp -fp $$x $(windowsdir)/$(target_cpu)-$(platform)/$$x; \
|
||||
done
|
||||
|
||||
@@ -59,11 +59,6 @@ kernel = {
|
||||
ia64_efi_ldflags = '-Wl,-r,-d';
|
||||
ia64_efi_stripflags = '--strip-unneeded -K start -R .note -R .comment -R .note.gnu.gold-version';
|
||||
|
||||
x86_64_xen_ldflags = '-Wl,-Ttext=0';
|
||||
x86_64_xen_cppflags = '$(CPPFLAGS_XEN)';
|
||||
i386_xen_ldflags = '-Wl,-Ttext=0';
|
||||
i386_xen_cppflags = '$(CPPFLAGS_XEN)';
|
||||
|
||||
arm_efi_ldflags = '-Wl,-r,-d';
|
||||
arm_efi_stripflags = '--strip-unneeded -K start -R .note -R .comment -R .note.gnu.gold-version';
|
||||
|
||||
@@ -95,8 +90,6 @@ kernel = {
|
||||
i386_pc_startup = kern/i386/pc/startup.S;
|
||||
i386_efi_startup = kern/i386/efi/startup.S;
|
||||
x86_64_efi_startup = kern/x86_64/efi/startup.S;
|
||||
i386_xen_startup = kern/i386/xen/startup.S;
|
||||
x86_64_xen_startup = kern/x86_64/xen/startup.S;
|
||||
i386_qemu_startup = kern/i386/qemu/startup.S;
|
||||
i386_ieee1275_startup = kern/i386/ieee1275/startup.S;
|
||||
i386_coreboot_startup = kern/i386/coreboot/startup.S;
|
||||
@@ -153,7 +146,6 @@ kernel = {
|
||||
terminfoinkernel = lib/arg.c;
|
||||
|
||||
i386 = kern/i386/dl.c;
|
||||
i386_xen = kern/i386/dl.c;
|
||||
|
||||
i386_coreboot = kern/i386/coreboot/init.c;
|
||||
i386_multiboot = kern/i386/coreboot/init.c;
|
||||
@@ -172,20 +164,11 @@ kernel = {
|
||||
i386_efi = kern/i386/efi/init.c;
|
||||
i386_efi = bus/pci.c;
|
||||
|
||||
x86_64 = kern/x86_64/dl.c;
|
||||
x86_64_xen = kern/x86_64/dl.c;
|
||||
x86_64_efi = kern/x86_64/dl.c;
|
||||
x86_64_efi = kern/x86_64/efi/callwrap.S;
|
||||
x86_64_efi = kern/i386/efi/init.c;
|
||||
x86_64_efi = bus/pci.c;
|
||||
|
||||
xen = kern/i386/tsc.c;
|
||||
x86_64_xen = kern/x86_64/xen/hypercall.S;
|
||||
i386_xen = kern/i386/xen/hypercall.S;
|
||||
xen = kern/xen/init.c;
|
||||
xen = term/xen/console.c;
|
||||
xen = disk/xen/xendisk.c;
|
||||
xen = commands/boot.c;
|
||||
|
||||
ia64_efi = kern/ia64/efi/startup.S;
|
||||
ia64_efi = kern/ia64/efi/init.c;
|
||||
ia64_efi = kern/ia64/dl.c;
|
||||
@@ -426,9 +409,9 @@ image = {
|
||||
cppflags = '-I$(srcdir)/lib/posix_wrap -I$(srcdir)/lib/xzembed -DGRUB_EMBED_DECOMPRESSOR=1';
|
||||
|
||||
objcopyflags = '-O binary';
|
||||
mips_ldflags = '$(TARGET_LDFLAGS_STATIC_LIBGCC) -Wl,-Ttext,$(TARGET_DECOMPRESSOR_LINK_ADDR)';
|
||||
ldadd = '$(TARGET_LIBGCC)';
|
||||
cflags = '-Wno-unreachable-code $(TARGET_LDFLAGS_STATIC_LIBGCC)';
|
||||
mips_ldflags = '-static-libgcc -Wl,-Ttext,$(TARGET_DECOMPRESSOR_LINK_ADDR)';
|
||||
ldadd = '-lgcc';
|
||||
cflags = '-Wno-unreachable-code -static-libgcc';
|
||||
enable = mips;
|
||||
};
|
||||
|
||||
@@ -440,9 +423,9 @@ image = {
|
||||
cppflags = '-DGRUB_EMBED_DECOMPRESSOR=1';
|
||||
|
||||
objcopyflags = '-O binary';
|
||||
mips_ldflags = '$(TARGET_LDFLAGS_STATIC_LIBGCC) -Wl,-Ttext,$(TARGET_DECOMPRESSOR_LINK_ADDR)';
|
||||
ldadd = '$(TARGET_LIBGCC)';
|
||||
cflags = '$(TARGET_LDFLAGS_STATIC_LIBGCC)';
|
||||
mips_ldflags = '-static-libgcc -Wl,-Ttext,$(TARGET_DECOMPRESSOR_LINK_ADDR)';
|
||||
ldadd = '-lgcc';
|
||||
cflags = '-static-libgcc';
|
||||
enable = mips;
|
||||
};
|
||||
|
||||
@@ -460,7 +443,7 @@ image = {
|
||||
name = fwstart;
|
||||
mips_loongson = boot/mips/loongson/fwstart.S;
|
||||
objcopyflags = '-O binary';
|
||||
ldflags = '$(TARGET_LDFLAGS_STATIC_LIBGCC) $(TARGET_LIBGCC) -Wl,-N,-S,-Ttext,0xbfc00000,-Bstatic';
|
||||
ldflags = '-static-libgcc -lgcc -Wl,-N,-S,-Ttext,0xbfc00000,-Bstatic';
|
||||
enable = mips_loongson;
|
||||
};
|
||||
|
||||
@@ -468,16 +451,10 @@ image = {
|
||||
name = fwstart_fuloong2f;
|
||||
mips_loongson = boot/mips/loongson/fuloong2f.S;
|
||||
objcopyflags = '-O binary';
|
||||
ldflags = '$(TARGET_LDFLAGS_STATIC_LIBGCC) $(TARGET_LIBGCC) -Wl,-N,-S,-Ttext,0xbfc00000,-Bstatic';
|
||||
ldflags = '-static-libgcc -lgcc -Wl,-N,-S,-Ttext,0xbfc00000,-Bstatic';
|
||||
enable = mips_loongson;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = disk;
|
||||
common = lib/disk.c;
|
||||
extra_dist = kern/disk_common.c;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = trig;
|
||||
common_nodist = trigtables.c;
|
||||
@@ -514,7 +491,6 @@ module = {
|
||||
module = {
|
||||
name = emuusb;
|
||||
common = bus/usb/usb.c;
|
||||
enable = emu;
|
||||
condition = COND_GRUB_EMU_USB;
|
||||
};
|
||||
|
||||
@@ -563,7 +539,6 @@ module = {
|
||||
module = {
|
||||
name = pci;
|
||||
common = bus/pci.c;
|
||||
i386_ieee1275 = bus/i386/ieee1275/pci.c;
|
||||
|
||||
enable = i386_pc;
|
||||
enable = i386_ieee1275;
|
||||
@@ -585,7 +560,6 @@ module = {
|
||||
common = bus/emu/pci.c;
|
||||
common = commands/lspci.c;
|
||||
|
||||
enable = emu;
|
||||
condition = COND_GRUB_EMU_PCI;
|
||||
};
|
||||
|
||||
@@ -596,19 +570,6 @@ module = {
|
||||
enable = mips_arc;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = lsxen;
|
||||
common = commands/xen/lsxen.c;
|
||||
cppflags = '$(CPPFLAGS_XEN)';
|
||||
|
||||
enable = xen;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = check_nt_hiberfil;
|
||||
common = commands/i386/nthibr.c;
|
||||
};
|
||||
|
||||
library = {
|
||||
name = libgnulib.a;
|
||||
common = gnulib/regex.c;
|
||||
@@ -771,10 +732,8 @@ module = {
|
||||
|
||||
module = {
|
||||
name = cpuid;
|
||||
common = commands/i386/cpuid.c;
|
||||
x86 = commands/i386/cpuid.c;
|
||||
enable = x86;
|
||||
enable = i386_xen;
|
||||
enable = x86_64_xen;
|
||||
};
|
||||
|
||||
module = {
|
||||
@@ -831,8 +790,6 @@ module = {
|
||||
i386_multiboot = lib/i386/halt.c;
|
||||
i386_coreboot = lib/i386/halt.c;
|
||||
i386_qemu = lib/i386/halt.c;
|
||||
xen = lib/xen/halt.c;
|
||||
xen_cppflags = '$(CPPFLAGS_XEN)';
|
||||
efi = lib/efi/halt.c;
|
||||
ieee1275 = lib/ieee1275/halt.c;
|
||||
emu = lib/emu/halt.c;
|
||||
@@ -851,8 +808,6 @@ module = {
|
||||
mips_arc = lib/mips/arc/reboot.c;
|
||||
mips_loongson = lib/mips/loongson/reboot.c;
|
||||
mips_qemu_mips = lib/mips/qemu_mips/reboot.c;
|
||||
xen = lib/xen/reboot.c;
|
||||
xen_cppflags = '$(CPPFLAGS_XEN)';
|
||||
uboot = lib/uboot/reboot.c;
|
||||
common = commands/reboot.c;
|
||||
};
|
||||
@@ -1476,11 +1431,6 @@ module = {
|
||||
common = io/gzio.c;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = offsetio;
|
||||
common = io/offset.c;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = bufio;
|
||||
common = io/bufio.c;
|
||||
@@ -1514,21 +1464,13 @@ module = {
|
||||
x86 = lib/i386/relocator64.S;
|
||||
i386 = lib/i386/relocator_asm.S;
|
||||
x86_64 = lib/x86_64/relocator_asm.S;
|
||||
i386_xen = lib/i386/relocator_asm.S;
|
||||
x86_64_xen = lib/x86_64/relocator_asm.S;
|
||||
x86 = lib/i386/relocator.c;
|
||||
x86 = lib/i386/relocator_common_c.c;
|
||||
ieee1275 = lib/ieee1275/relocator.c;
|
||||
efi = lib/efi/relocator.c;
|
||||
mips = lib/mips/relocator_asm.S;
|
||||
mips = lib/mips/relocator.c;
|
||||
powerpc = lib/powerpc/relocator_asm.S;
|
||||
powerpc = lib/powerpc/relocator.c;
|
||||
xen = lib/xen/relocator.c;
|
||||
i386_xen = lib/i386/xen/relocator.S;
|
||||
x86_64_xen = lib/x86_64/xen/relocator.S;
|
||||
xen = lib/i386/relocator_common_c.c;
|
||||
xen_cppflags = '$(CPPFLAGS_XEN)';
|
||||
|
||||
extra_dist = lib/i386/relocator_common.S;
|
||||
extra_dist = kern/powerpc/cache_flush.S;
|
||||
@@ -1536,7 +1478,6 @@ module = {
|
||||
enable = mips;
|
||||
enable = powerpc;
|
||||
enable = x86;
|
||||
enable = xen;
|
||||
};
|
||||
|
||||
module = {
|
||||
@@ -1548,8 +1489,6 @@ module = {
|
||||
powerpc_ieee1275 = lib/ieee1275/datetime.c;
|
||||
sparc64_ieee1275 = lib/ieee1275/cmos.c;
|
||||
powerpc_ieee1275 = lib/ieee1275/cmos.c;
|
||||
xen = lib/xen/datetime.c;
|
||||
xen_cppflags = '$(CPPFLAGS_XEN)';
|
||||
|
||||
mips_arc = lib/arc/datetime.c;
|
||||
enable = noemu;
|
||||
@@ -1624,7 +1563,6 @@ module = {
|
||||
cppflags = "-DGRUB_USE_MULTIBOOT2";
|
||||
|
||||
common = loader/multiboot.c;
|
||||
common = lib/cmdline.c;
|
||||
common = loader/multiboot_mbi2.c;
|
||||
enable = x86;
|
||||
enable = mips;
|
||||
@@ -1633,7 +1571,6 @@ module = {
|
||||
module = {
|
||||
name = multiboot;
|
||||
common = loader/multiboot.c;
|
||||
common = lib/cmdline.c;
|
||||
x86 = loader/i386/multiboot_mbi.c;
|
||||
extra_dist = loader/multiboot_elfxx.c;
|
||||
enable = x86;
|
||||
@@ -1642,12 +1579,6 @@ module = {
|
||||
module = {
|
||||
name = linux;
|
||||
x86 = loader/i386/linux.c;
|
||||
xen = loader/i386/xen.c;
|
||||
xen = loader/i386/xen_file.c;
|
||||
xen = loader/i386/xen_file32.c;
|
||||
xen = loader/i386/xen_file64.c;
|
||||
extra_dist = loader/i386/xen_fileXX.c;
|
||||
xen_cppflags = '$(CPPFLAGS_XEN)';
|
||||
i386_pc = lib/i386/pc/vesa_modes_table.c;
|
||||
mips = loader/mips/linux.c;
|
||||
powerpc_ieee1275 = loader/powerpc/ieee1275/linux.c;
|
||||
@@ -1686,7 +1617,6 @@ module = {
|
||||
efi = loader/efi/chainloader.c;
|
||||
i386_pc = loader/i386/pc/chainloader.c;
|
||||
i386_coreboot = loader/i386/coreboot/chainloader.c;
|
||||
i386_coreboot = lib/LzmaDec.c;
|
||||
enable = i386_pc;
|
||||
enable = i386_coreboot;
|
||||
enable = efi;
|
||||
@@ -1912,37 +1842,6 @@ module = {
|
||||
common = tests/setjmp_test.c;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = signature_test;
|
||||
common = tests/signature_test.c;
|
||||
common = tests/signatures.h;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = xnu_uuid_test;
|
||||
common = tests/xnu_uuid_test.c;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = pbkdf2_test;
|
||||
common = tests/pbkdf2_test.c;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = legacy_password_test;
|
||||
common = tests/legacy_password_test.c;
|
||||
enable = i386_pc;
|
||||
enable = i386_efi;
|
||||
enable = x86_64_efi;
|
||||
enable = emu;
|
||||
enable = xen;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = div_test;
|
||||
common = tests/div_test.c;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = videotest_checksum;
|
||||
common = tests/videotest_checksum.c;
|
||||
@@ -2096,13 +1995,11 @@ module = {
|
||||
emu = lib/i386/pc/vesa_modes_table.c;
|
||||
i386_efi = lib/i386/pc/vesa_modes_table.c;
|
||||
x86_64_efi = lib/i386/pc/vesa_modes_table.c;
|
||||
xen = lib/i386/pc/vesa_modes_table.c;
|
||||
|
||||
enable = i386_pc;
|
||||
enable = i386_efi;
|
||||
enable = x86_64_efi;
|
||||
enable = emu;
|
||||
enable = xen;
|
||||
};
|
||||
|
||||
module = {
|
||||
@@ -2136,12 +2033,8 @@ module = {
|
||||
module = {
|
||||
name = backtrace;
|
||||
x86 = lib/i386/backtrace.c;
|
||||
i386_xen = lib/i386/backtrace.c;
|
||||
x86_64_xen = lib/i386/backtrace.c;
|
||||
common = lib/backtrace.c;
|
||||
enable = x86;
|
||||
enable = i386_xen;
|
||||
enable = x86_64_xen;
|
||||
};
|
||||
|
||||
module = {
|
||||
@@ -2247,3 +2140,8 @@ module = {
|
||||
name = progress;
|
||||
common = lib/progress.c;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = crypto_devmapper;
|
||||
common = disk/devmapper.c;
|
||||
};
|
||||
@@ -1,42 +0,0 @@
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GRUB is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <grub/dl.h>
|
||||
#include <grub/pci.h>
|
||||
#include <grub/mm.h>
|
||||
#include <grub/misc.h>
|
||||
#include <grub/ieee1275/ieee1275.h>
|
||||
|
||||
volatile void *
|
||||
grub_pci_device_map_range (grub_pci_device_t dev __attribute__ ((unused)),
|
||||
grub_addr_t base,
|
||||
grub_size_t size)
|
||||
{
|
||||
if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_REAL_MODE))
|
||||
return (volatile void *) base;
|
||||
if (grub_ieee1275_map (base, base, size, 7))
|
||||
grub_fatal ("couldn't map 0x%lx", base);
|
||||
return (volatile void *) base;
|
||||
}
|
||||
|
||||
void
|
||||
grub_pci_device_unmap_range (grub_pci_device_t dev __attribute__ ((unused)),
|
||||
volatile void *mem __attribute__ ((unused)),
|
||||
grub_size_t size __attribute__ ((unused)))
|
||||
{
|
||||
}
|
||||
@@ -1677,7 +1677,7 @@ grub_ehci_hubports (grub_usb_controller_t dev)
|
||||
return portinfo;
|
||||
}
|
||||
|
||||
static grub_usb_err_t
|
||||
static grub_err_t
|
||||
grub_ehci_portstatus (grub_usb_controller_t dev,
|
||||
unsigned int port, unsigned int enable)
|
||||
{
|
||||
@@ -1699,14 +1699,14 @@ grub_ehci_portstatus (grub_usb_controller_t dev,
|
||||
endtime = grub_get_time_ms () + 1000;
|
||||
while (grub_ehci_port_read (e, port) & GRUB_EHCI_PORT_ENABLED)
|
||||
if (grub_get_time_ms () > endtime)
|
||||
return GRUB_USB_ERR_TIMEOUT;
|
||||
return grub_error (GRUB_ERR_IO, "portstatus: EHCI Timed out - disable");
|
||||
|
||||
if (!enable) /* We don't need reset port */
|
||||
{
|
||||
grub_dprintf ("ehci", "portstatus: Disabled.\n");
|
||||
grub_dprintf ("ehci", "portstatus: end, status=0x%02x\n",
|
||||
grub_ehci_port_read (e, port));
|
||||
return GRUB_USB_ERR_NONE;
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
grub_dprintf ("ehci", "portstatus: enable\n");
|
||||
@@ -1724,7 +1724,8 @@ grub_ehci_portstatus (grub_usb_controller_t dev,
|
||||
endtime = grub_get_time_ms () + 1000;
|
||||
while (grub_ehci_port_read (e, port) & GRUB_EHCI_PORT_RESET)
|
||||
if (grub_get_time_ms () > endtime)
|
||||
return GRUB_USB_ERR_TIMEOUT;
|
||||
return grub_error (GRUB_ERR_IO,
|
||||
"portstatus: EHCI Timed out - reset port");
|
||||
grub_boot_time ("Port %d reset", port);
|
||||
/* Remember "we did the reset" - needed by detect_dev */
|
||||
e->reset |= (1 << port);
|
||||
@@ -1752,7 +1753,7 @@ grub_ehci_portstatus (grub_usb_controller_t dev,
|
||||
grub_dprintf ("ehci", "portstatus: end, status=0x%02x\n",
|
||||
grub_ehci_port_read (e, port));
|
||||
|
||||
return GRUB_USB_ERR_NONE;
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static grub_usb_speed_t
|
||||
@@ -1887,7 +1888,7 @@ grub_ehci_restore_hw (void)
|
||||
}
|
||||
}
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
return GRUB_USB_ERR_NONE;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
@@ -1910,7 +1911,7 @@ grub_ehci_fini_hw (int noreturn __attribute__ ((unused)))
|
||||
grub_ehci_reset (e);
|
||||
}
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
return GRUB_USB_ERR_NONE;
|
||||
}
|
||||
|
||||
static struct grub_usb_controller_dev usb_controller = {
|
||||
|
||||
@@ -1216,7 +1216,7 @@ grub_ohci_cancel_transfer (grub_usb_controller_t dev,
|
||||
return GRUB_USB_ERR_NONE;
|
||||
}
|
||||
|
||||
static grub_usb_err_t
|
||||
static grub_err_t
|
||||
grub_ohci_portstatus (grub_usb_controller_t dev,
|
||||
unsigned int port, unsigned int enable)
|
||||
{
|
||||
@@ -1236,11 +1236,11 @@ grub_ohci_portstatus (grub_usb_controller_t dev,
|
||||
while ((grub_ohci_readreg32 (o, GRUB_OHCI_REG_RHUBPORT + port)
|
||||
& (1 << 1)))
|
||||
if (grub_get_time_ms () > endtime)
|
||||
return GRUB_USB_ERR_TIMEOUT;
|
||||
return grub_error (GRUB_ERR_IO, "OHCI Timed out - disable");
|
||||
|
||||
grub_dprintf ("ohci", "end of portstatus=0x%02x\n",
|
||||
grub_ohci_readreg32 (o, GRUB_OHCI_REG_RHUBPORT + port));
|
||||
return GRUB_USB_ERR_NONE;
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
/* OHCI does one reset signal 10ms long but USB spec.
|
||||
@@ -1257,7 +1257,7 @@ grub_ohci_portstatus (grub_usb_controller_t dev,
|
||||
while (! (grub_ohci_readreg32 (o, GRUB_OHCI_REG_RHUBPORT + port)
|
||||
& GRUB_OHCI_SET_PORT_RESET_STATUS_CHANGE))
|
||||
if (grub_get_time_ms () > endtime)
|
||||
return GRUB_USB_ERR_TIMEOUT;
|
||||
return grub_error (GRUB_ERR_IO, "OHCI Timed out - reset");
|
||||
|
||||
/* End the reset signaling - reset the reset status change */
|
||||
grub_ohci_writereg32 (o, GRUB_OHCI_REG_RHUBPORT + port,
|
||||
@@ -1275,7 +1275,7 @@ grub_ohci_portstatus (grub_usb_controller_t dev,
|
||||
while (! (grub_ohci_readreg32 (o, GRUB_OHCI_REG_RHUBPORT + port)
|
||||
& (1 << 1)))
|
||||
if (grub_get_time_ms () > endtime)
|
||||
return GRUB_USB_ERR_TIMEOUT;
|
||||
return grub_error (GRUB_ERR_IO, "OHCI Timed out - enable");
|
||||
|
||||
/* Reset bit Connect Status Change */
|
||||
grub_ohci_writereg32 (o, GRUB_OHCI_REG_RHUBPORT + port,
|
||||
@@ -1287,7 +1287,7 @@ grub_ohci_portstatus (grub_usb_controller_t dev,
|
||||
grub_dprintf ("ohci", "end of portstatus=0x%02x\n",
|
||||
grub_ohci_readreg32 (o, GRUB_OHCI_REG_RHUBPORT + port));
|
||||
|
||||
return GRUB_USB_ERR_NONE;
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static grub_usb_speed_t
|
||||
|
||||
@@ -91,13 +91,11 @@ real_config (struct grub_serial_port *port)
|
||||
|
||||
grub_usb_control_msg (port->usbdev, GRUB_USB_REQTYPE_VENDOR_OUT,
|
||||
GRUB_FTDI_MODEM_CTRL,
|
||||
port->config.rtscts ? GRUB_FTDI_MODEM_CTRL_DTRRTS : 0,
|
||||
0, 0, 0);
|
||||
GRUB_FTDI_MODEM_CTRL_DTRRTS, 0, 0, 0);
|
||||
|
||||
grub_usb_control_msg (port->usbdev, GRUB_USB_REQTYPE_VENDOR_OUT,
|
||||
GRUB_FTDI_FLOW_CTRL,
|
||||
port->config.rtscts ? GRUB_FTDI_FLOW_CTRL_DTRRTS : 0,
|
||||
0, 0, 0);
|
||||
GRUB_FTDI_FLOW_CTRL_DTRRTS, 0, 0, 0);
|
||||
|
||||
divisor = get_divisor (port->config.speed);
|
||||
grub_usb_control_msg (port->usbdev, GRUB_USB_REQTYPE_VENDOR_OUT,
|
||||
|
||||
@@ -125,7 +125,7 @@ real_config (struct grub_serial_port *port)
|
||||
0x22, 3, 0, 0, 0);
|
||||
|
||||
grub_usb_control_msg (port->usbdev, GRUB_USB_REQTYPE_VENDOR_OUT,
|
||||
1, 0, port->config.rtscts ? 0x61 : 0, 0, 0);
|
||||
1, 0, 0x61, 0, 0);
|
||||
port->configured = 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -189,6 +189,11 @@ grub_uhci_writereg32 (struct grub_uhci *u,
|
||||
grub_outl (val, u->iobase + reg);
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_uhci_portstatus (grub_usb_controller_t dev,
|
||||
unsigned int port, unsigned int enable);
|
||||
|
||||
|
||||
/* Iterate over all PCI devices. Determine if a device is an UHCI
|
||||
controller. If this is the case, initialize it. */
|
||||
static int
|
||||
@@ -710,7 +715,7 @@ grub_uhci_iterate (grub_usb_controller_iterate_hook_t hook, void *hook_data)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static grub_usb_err_t
|
||||
static grub_err_t
|
||||
grub_uhci_portstatus (grub_usb_controller_t dev,
|
||||
unsigned int port, unsigned int enable)
|
||||
{
|
||||
@@ -728,7 +733,8 @@ grub_uhci_portstatus (grub_usb_controller_t dev,
|
||||
else if (port == 1)
|
||||
reg = GRUB_UHCI_REG_PORTSC2;
|
||||
else
|
||||
return GRUB_USB_ERR_INTERNAL;
|
||||
return grub_error (GRUB_ERR_OUT_OF_RANGE,
|
||||
"UHCI Root Hub port does not exist");
|
||||
|
||||
status = grub_uhci_readreg16 (u, reg);
|
||||
grub_dprintf ("uhci", "detect=0x%02x\n", status);
|
||||
@@ -741,11 +747,11 @@ grub_uhci_portstatus (grub_usb_controller_t dev,
|
||||
endtime = grub_get_time_ms () + 1000;
|
||||
while ((grub_uhci_readreg16 (u, reg) & (1 << 2)))
|
||||
if (grub_get_time_ms () > endtime)
|
||||
return GRUB_USB_ERR_TIMEOUT;
|
||||
return grub_error (GRUB_ERR_IO, "UHCI Timed out - disable");
|
||||
|
||||
status = grub_uhci_readreg16 (u, reg);
|
||||
grub_dprintf ("uhci", ">3detect=0x%02x\n", status);
|
||||
return GRUB_USB_ERR_NONE;
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
/* Reset the port. */
|
||||
@@ -776,7 +782,7 @@ grub_uhci_portstatus (grub_usb_controller_t dev,
|
||||
endtime = grub_get_time_ms () + 1000;
|
||||
while (! ((status = grub_uhci_readreg16 (u, reg)) & (1 << 2)))
|
||||
if (grub_get_time_ms () > endtime)
|
||||
return GRUB_USB_ERR_TIMEOUT;
|
||||
return grub_error (GRUB_ERR_IO, "UHCI Timed out - enable");
|
||||
|
||||
/* Reset recovery time */
|
||||
grub_millisleep (10);
|
||||
@@ -786,7 +792,7 @@ grub_uhci_portstatus (grub_usb_controller_t dev,
|
||||
grub_dprintf ("uhci", ">3detect=0x%02x\n", status);
|
||||
|
||||
|
||||
return GRUB_USB_ERR_NONE;
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static grub_usb_speed_t
|
||||
|
||||
@@ -195,7 +195,7 @@ grub_usb_add_hub (grub_usb_device_t dev)
|
||||
|
||||
rescan = 1;
|
||||
|
||||
return GRUB_USB_ERR_NONE;
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -203,7 +203,7 @@ attach_root_port (struct grub_usb_hub *hub, int portno,
|
||||
grub_usb_speed_t speed)
|
||||
{
|
||||
grub_usb_device_t dev;
|
||||
grub_usb_err_t err;
|
||||
grub_err_t err;
|
||||
|
||||
grub_boot_time ("After detect_dev");
|
||||
|
||||
|
||||
@@ -639,7 +639,7 @@ grub_cmd_acpi (struct grub_extcmd_context *ctxt, int argc, char **args)
|
||||
grub_size_t size;
|
||||
char *buf;
|
||||
|
||||
file = grub_file_open (args[i], GRUB_FILE_TYPE_ACPI_TABLE);
|
||||
file = grub_file_open (args[i]);
|
||||
if (! file)
|
||||
{
|
||||
free_tables ();
|
||||
|
||||
@@ -62,47 +62,23 @@ read_blocklist (grub_disk_addr_t sector, unsigned offset, unsigned length,
|
||||
if (ctx->num_sectors > 0)
|
||||
{
|
||||
if (ctx->start_sector + ctx->num_sectors == sector
|
||||
&& offset == 0 && length >= GRUB_DISK_SECTOR_SIZE)
|
||||
&& offset == 0 && length == GRUB_DISK_SECTOR_SIZE)
|
||||
{
|
||||
ctx->num_sectors += length >> GRUB_DISK_SECTOR_BITS;
|
||||
sector += length >> GRUB_DISK_SECTOR_BITS;
|
||||
length &= (GRUB_DISK_SECTOR_SIZE - 1);
|
||||
ctx->num_sectors++;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!length)
|
||||
return;
|
||||
print_blocklist (ctx->start_sector, ctx->num_sectors, 0, 0, ctx);
|
||||
ctx->num_sectors = 0;
|
||||
}
|
||||
|
||||
if (offset)
|
||||
{
|
||||
unsigned l = length + offset;
|
||||
l &= (GRUB_DISK_SECTOR_SIZE - 1);
|
||||
l -= offset;
|
||||
print_blocklist (sector, 0, offset, l, ctx);
|
||||
length -= l;
|
||||
sector++;
|
||||
offset = 0;
|
||||
}
|
||||
|
||||
if (!length)
|
||||
return;
|
||||
|
||||
if (length & (GRUB_DISK_SECTOR_SIZE - 1))
|
||||
{
|
||||
if (length >> GRUB_DISK_SECTOR_BITS)
|
||||
{
|
||||
print_blocklist (sector, length >> GRUB_DISK_SECTOR_BITS, 0, 0, ctx);
|
||||
sector += length >> GRUB_DISK_SECTOR_BITS;
|
||||
}
|
||||
print_blocklist (sector, 0, 0, length & (GRUB_DISK_SECTOR_SIZE - 1), ctx);
|
||||
}
|
||||
else
|
||||
if (offset == 0 && length == GRUB_DISK_SECTOR_SIZE)
|
||||
{
|
||||
ctx->start_sector = sector;
|
||||
ctx->num_sectors = length >> GRUB_DISK_SECTOR_BITS;
|
||||
ctx->num_sectors++;
|
||||
}
|
||||
else
|
||||
print_blocklist (sector, 0, offset, length, ctx);
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
@@ -121,8 +97,8 @@ grub_cmd_blocklist (grub_command_t cmd __attribute__ ((unused)),
|
||||
if (argc < 1)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
||||
|
||||
file = grub_file_open (args[0], GRUB_FILE_TYPE_PRINT_BLOCKLIST
|
||||
| GRUB_FILE_TYPE_NO_DECOMPRESS);
|
||||
grub_file_filter_disable_compression ();
|
||||
file = grub_file_open (args[0]);
|
||||
if (! file)
|
||||
return grub_errno;
|
||||
|
||||
|
||||
@@ -146,7 +146,8 @@ grub_loader_boot (void)
|
||||
return grub_error (GRUB_ERR_NO_KERNEL,
|
||||
N_("you need to load the kernel first"));
|
||||
|
||||
grub_machine_fini (grub_loader_flags);
|
||||
if (grub_loader_flags & GRUB_LOADER_FLAG_NORETURN)
|
||||
grub_machine_fini ();
|
||||
|
||||
for (cur = preboots_head; cur; cur = cur->next)
|
||||
{
|
||||
|
||||
@@ -56,7 +56,7 @@ grub_cmd_cat (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
if (argc != 1)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
||||
|
||||
file = grub_file_open (args[0], GRUB_FILE_TYPE_CAT);
|
||||
file = grub_file_open (args[0]);
|
||||
if (! file)
|
||||
return grub_errno;
|
||||
|
||||
|
||||
@@ -45,8 +45,8 @@ grub_cmd_cmp (grub_command_t cmd __attribute__ ((unused)),
|
||||
grub_printf_ (N_("Compare file `%s' with `%s':\n"), args[0],
|
||||
args[1]);
|
||||
|
||||
file1 = grub_file_open (args[0], GRUB_FILE_TYPE_CMP);
|
||||
file2 = grub_file_open (args[1], GRUB_FILE_TYPE_CMP);
|
||||
file1 = grub_file_open (args[0]);
|
||||
file2 = grub_file_open (args[1]);
|
||||
if (! file1 || ! file2)
|
||||
goto cleanup;
|
||||
|
||||
|
||||
@@ -169,7 +169,7 @@ grub_cmd_loadbios (grub_command_t cmd __attribute__ ((unused)),
|
||||
|
||||
if (argc > 1)
|
||||
{
|
||||
file = grub_file_open (argv[1], GRUB_FILE_TYPE_VBE_DUMP);
|
||||
file = grub_file_open (argv[1]);
|
||||
if (! file)
|
||||
return grub_errno;
|
||||
|
||||
@@ -183,7 +183,7 @@ grub_cmd_loadbios (grub_command_t cmd __attribute__ ((unused)),
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
file = grub_file_open (argv[0], GRUB_FILE_TYPE_VBE_DUMP);
|
||||
file = grub_file_open (argv[0]);
|
||||
if (! file)
|
||||
return grub_errno;
|
||||
|
||||
|
||||
@@ -63,23 +63,17 @@ hextoval (char c)
|
||||
static grub_err_t
|
||||
hash_file (grub_file_t file, const gcry_md_spec_t *hash, void *result)
|
||||
{
|
||||
void *context;
|
||||
grub_uint8_t *readbuf;
|
||||
#define BUF_SIZE 4096
|
||||
readbuf = grub_malloc (BUF_SIZE);
|
||||
if (!readbuf)
|
||||
return grub_errno;
|
||||
context = grub_zalloc (hash->contextsize);
|
||||
if (!readbuf || !context)
|
||||
goto fail;
|
||||
GRUB_PROPERLY_ALIGNED_ARRAY (context, hash->contextsize);
|
||||
grub_uint8_t readbuf[4096];
|
||||
|
||||
grub_memset (context, 0, sizeof (context));
|
||||
hash->init (context);
|
||||
while (1)
|
||||
{
|
||||
grub_ssize_t r;
|
||||
r = grub_file_read (file, readbuf, BUF_SIZE);
|
||||
r = grub_file_read (file, readbuf, sizeof (readbuf));
|
||||
if (r < 0)
|
||||
goto fail;
|
||||
return grub_errno;
|
||||
if (r == 0)
|
||||
break;
|
||||
hash->write (context, readbuf, r);
|
||||
@@ -87,15 +81,7 @@ hash_file (grub_file_t file, const gcry_md_spec_t *hash, void *result)
|
||||
hash->final (context);
|
||||
grub_memcpy (result, hash->read (context), hash->mdlen);
|
||||
|
||||
grub_free (readbuf);
|
||||
grub_free (context);
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
|
||||
fail:
|
||||
grub_free (readbuf);
|
||||
grub_free (context);
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
@@ -104,16 +90,13 @@ check_list (const gcry_md_spec_t *hash, const char *hashfilename,
|
||||
{
|
||||
grub_file_t hashlist, file;
|
||||
char *buf = NULL;
|
||||
grub_uint8_t expected[GRUB_CRYPTO_MAX_MDLEN];
|
||||
grub_uint8_t actual[GRUB_CRYPTO_MAX_MDLEN];
|
||||
grub_uint8_t expected[hash->mdlen];
|
||||
grub_uint8_t actual[hash->mdlen];
|
||||
grub_err_t err;
|
||||
unsigned i;
|
||||
unsigned unread = 0, mismatch = 0;
|
||||
|
||||
if (hash->mdlen > GRUB_CRYPTO_MAX_MDLEN)
|
||||
return grub_error (GRUB_ERR_BUG, "mdlen is too long");
|
||||
|
||||
hashlist = grub_file_open (hashfilename, GRUB_FILE_TYPE_HASHLIST);
|
||||
hashlist = grub_file_open (hashfilename);
|
||||
if (!hashlist)
|
||||
return grub_errno;
|
||||
|
||||
@@ -141,15 +124,17 @@ check_list (const gcry_md_spec_t *hash, const char *hashfilename,
|
||||
filename = grub_xasprintf ("%s/%s", prefix, p);
|
||||
if (!filename)
|
||||
return grub_errno;
|
||||
file = grub_file_open (filename, GRUB_FILE_TYPE_TO_HASH
|
||||
| (!uncompress ? GRUB_FILE_TYPE_NO_DECOMPRESS
|
||||
: 0));
|
||||
if (!uncompress)
|
||||
grub_file_filter_disable_compression ();
|
||||
file = grub_file_open (filename);
|
||||
grub_free (filename);
|
||||
}
|
||||
else
|
||||
file = grub_file_open (p, GRUB_FILE_TYPE_TO_HASH
|
||||
| (!uncompress ? GRUB_FILE_TYPE_NO_DECOMPRESS
|
||||
: 0));
|
||||
{
|
||||
if (!uncompress)
|
||||
grub_file_filter_disable_compression ();
|
||||
file = grub_file_open (p);
|
||||
}
|
||||
if (!file)
|
||||
{
|
||||
grub_file_close (hashlist);
|
||||
@@ -220,9 +205,6 @@ grub_cmd_hashsum (struct grub_extcmd_context *ctxt,
|
||||
if (!hash)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, "unknown hash");
|
||||
|
||||
if (hash->mdlen > GRUB_CRYPTO_MAX_MDLEN)
|
||||
return grub_error (GRUB_ERR_BUG, "mdlen is too long");
|
||||
|
||||
if (state[2].set)
|
||||
prefix = state[2].arg;
|
||||
|
||||
@@ -236,13 +218,13 @@ grub_cmd_hashsum (struct grub_extcmd_context *ctxt,
|
||||
|
||||
for (i = 0; i < (unsigned) argc; i++)
|
||||
{
|
||||
GRUB_PROPERLY_ALIGNED_ARRAY (result, GRUB_CRYPTO_MAX_MDLEN);
|
||||
GRUB_PROPERLY_ALIGNED_ARRAY (result, hash->mdlen);
|
||||
grub_file_t file;
|
||||
grub_err_t err;
|
||||
unsigned j;
|
||||
file = grub_file_open (args[i], GRUB_FILE_TYPE_TO_HASH
|
||||
| (!uncompress ? GRUB_FILE_TYPE_NO_DECOMPRESS
|
||||
: 0));
|
||||
if (!uncompress)
|
||||
grub_file_filter_disable_compression ();
|
||||
file = grub_file_open (args[i]);
|
||||
if (!file)
|
||||
{
|
||||
if (!keep)
|
||||
|
||||
@@ -90,7 +90,7 @@ grub_cmd_hexdump (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
grub_file_t file;
|
||||
|
||||
file = grub_file_open (args[0], GRUB_FILE_TYPE_HEXCAT);
|
||||
file = grub_file_open (args[0]);
|
||||
if (! file)
|
||||
return 0;
|
||||
|
||||
|
||||
@@ -81,25 +81,7 @@ grub_cmd_cmosclean (struct grub_command *cmd __attribute__ ((unused)),
|
||||
return grub_cmos_write (byte, value & (~(1 << bit)));
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_cmd_cmosset (struct grub_command *cmd __attribute__ ((unused)),
|
||||
int argc, char *argv[])
|
||||
{
|
||||
int byte, bit;
|
||||
grub_err_t err;
|
||||
grub_uint8_t value;
|
||||
|
||||
err = parse_args (argc, argv, &byte, &bit);
|
||||
if (err)
|
||||
return err;
|
||||
err = grub_cmos_read (byte, &value);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return grub_cmos_write (byte, value | (1 << bit));
|
||||
}
|
||||
|
||||
static grub_command_t cmd, cmd_clean, cmd_set;
|
||||
static grub_command_t cmd, cmd_clean;
|
||||
|
||||
|
||||
GRUB_MOD_INIT(cmostest)
|
||||
@@ -110,14 +92,10 @@ GRUB_MOD_INIT(cmostest)
|
||||
cmd_clean = grub_register_command ("cmosclean", grub_cmd_cmosclean,
|
||||
N_("BYTE:BIT"),
|
||||
N_("Clean bit at BYTE:BIT in CMOS."));
|
||||
cmd_set = grub_register_command ("cmosset", grub_cmd_cmosset,
|
||||
N_("BYTE:BIT"),
|
||||
N_("Set bit at BYTE:BIT in CMOS."));
|
||||
}
|
||||
|
||||
GRUB_MOD_FINI(cmostest)
|
||||
{
|
||||
grub_unregister_command (cmd);
|
||||
grub_unregister_command (cmd_clean);
|
||||
grub_unregister_command (cmd_set);
|
||||
}
|
||||
|
||||
@@ -29,6 +29,11 @@
|
||||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
#define cpuid(num,a,b,c,d) \
|
||||
asm volatile ("xchgl %%ebx, %1; cpuid; xchgl %%ebx, %1" \
|
||||
: "=a" (a), "=r" (b), "=c" (c), "=d" (d) \
|
||||
: "0" (num))
|
||||
|
||||
static const struct grub_arg_option options[] =
|
||||
{
|
||||
/* TRANSLATORS: "(default)" at the end means that this option is used if
|
||||
@@ -73,18 +78,18 @@ GRUB_MOD_INIT(cpuid)
|
||||
goto done;
|
||||
|
||||
/* Check the highest input value for eax. */
|
||||
grub_cpuid (0, eax, ebx, ecx, edx);
|
||||
cpuid (0, eax, ebx, ecx, edx);
|
||||
/* We only look at the first four characters. */
|
||||
max_level = eax;
|
||||
if (max_level == 0)
|
||||
goto done;
|
||||
|
||||
grub_cpuid (0x80000000, eax, ebx, ecx, edx);
|
||||
cpuid (0x80000000, eax, ebx, ecx, edx);
|
||||
ext_level = eax;
|
||||
if (ext_level < 0x80000000)
|
||||
goto done;
|
||||
|
||||
grub_cpuid (0x80000001, eax, ebx, ecx, edx);
|
||||
cpuid (0x80000001, eax, ebx, ecx, edx);
|
||||
grub_cpuid_has_longmode = !!(edx & bit_LM);
|
||||
done:
|
||||
#endif
|
||||
|
||||
@@ -1,79 +0,0 @@
|
||||
/* nthibr.c - tests whether an MS Windows system partition is hibernated */
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2013 Peter Lustig
|
||||
* Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GRUB is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <grub/types.h>
|
||||
#include <grub/mm.h>
|
||||
#include <grub/file.h>
|
||||
#include <grub/misc.h>
|
||||
#include <grub/dl.h>
|
||||
#include <grub/command.h>
|
||||
#include <grub/err.h>
|
||||
#include <grub/i18n.h>
|
||||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
static grub_err_t
|
||||
grub_cmd_nthibr (grub_command_t cmd __attribute__ ((unused)),
|
||||
int argc, char **args)
|
||||
{
|
||||
grub_uint8_t hibr_file_magic[4];
|
||||
grub_file_t hibr_file = 0;
|
||||
|
||||
if (argc != 1)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));
|
||||
|
||||
hibr_file = grub_file_open (args[0], GRUB_FILE_TYPE_FILE_ID);
|
||||
if (!hibr_file)
|
||||
return grub_errno;
|
||||
|
||||
/* Try to read magic number of 'hiberfil.sys' */
|
||||
if (grub_file_read (hibr_file, hibr_file_magic,
|
||||
sizeof (hibr_file_magic))
|
||||
!= (grub_ssize_t) sizeof (hibr_file_magic))
|
||||
{
|
||||
if (!grub_errno)
|
||||
grub_error (GRUB_ERR_TEST_FAILURE, "false");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (!(grub_memcmp ("hibr", hibr_file_magic, sizeof (hibr_file_magic)) == 0
|
||||
|| grub_memcmp ("HIBR", hibr_file_magic, sizeof (hibr_file_magic)) == 0))
|
||||
grub_error (GRUB_ERR_TEST_FAILURE, "false");
|
||||
|
||||
exit:
|
||||
grub_file_close (hibr_file);
|
||||
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
static grub_command_t cmd;
|
||||
|
||||
GRUB_MOD_INIT (check_nt_hiberfil)
|
||||
{
|
||||
cmd = grub_register_command ("check_nt_hiberfil", grub_cmd_nthibr,
|
||||
N_("FILE"),
|
||||
N_("Test whether a hiberfil.sys is "
|
||||
"in hibernated state."));
|
||||
}
|
||||
|
||||
GRUB_MOD_FINI (check_nt_hiberfil)
|
||||
{
|
||||
grub_unregister_command (cmd);
|
||||
}
|
||||
@@ -93,7 +93,7 @@ grub_cmd_play (grub_command_t cmd __attribute__ ((unused)),
|
||||
grub_uint32_t tempo;
|
||||
grub_file_t file;
|
||||
|
||||
file = grub_file_open (args[0], GRUB_FILE_TYPE_AUDIO);
|
||||
file = grub_file_open (args[0]);
|
||||
|
||||
if (! file)
|
||||
return grub_errno;
|
||||
|
||||
@@ -218,7 +218,7 @@ grub_cmd_keymap (struct grub_command *cmd __attribute__ ((unused)),
|
||||
else
|
||||
filename = argv[0];
|
||||
|
||||
file = grub_file_open (filename, GRUB_FILE_TYPE_KEYBOARD_LAYOUT);
|
||||
file = grub_file_open (filename);
|
||||
if (! file)
|
||||
goto fail;
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@ legacy_file (const char *filename)
|
||||
if (!suffix)
|
||||
return grub_errno;
|
||||
|
||||
file = grub_file_open (filename, GRUB_FILE_TYPE_CONFIG);
|
||||
file = grub_file_open (filename);
|
||||
if (! file)
|
||||
return grub_errno;
|
||||
|
||||
@@ -358,7 +358,7 @@ grub_cmd_legacy_kernel (struct grub_command *mycmd __attribute__ ((unused)),
|
||||
dev = grub_device_open (0);
|
||||
if (dev && dev->disk
|
||||
&& dev->disk->dev->id == GRUB_DISK_DEVICE_BIOSDISK_ID
|
||||
&& dev->disk->id >= 0x80 && dev->disk->id <= 0x90)
|
||||
&& dev->disk->dev->id >= 0x80 && dev->disk->dev->id <= 0x90)
|
||||
{
|
||||
struct grub_partition *part = dev->disk->partition;
|
||||
bsd_device = dev->disk->id - 0x80 - hdbias;
|
||||
@@ -546,6 +546,8 @@ struct legacy_md5_password
|
||||
grub_uint8_t hash[MD5_HASHLEN];
|
||||
};
|
||||
|
||||
#pragma GCC diagnostic ignored "-Wunsafe-loop-optimizations"
|
||||
|
||||
static int
|
||||
check_password_md5_real (const char *entered,
|
||||
struct legacy_md5_password *pw)
|
||||
@@ -553,13 +555,8 @@ check_password_md5_real (const char *entered,
|
||||
grub_size_t enteredlen = grub_strlen (entered);
|
||||
unsigned char alt_result[MD5_HASHLEN];
|
||||
unsigned char *digest;
|
||||
grub_uint8_t *ctx;
|
||||
grub_uint8_t ctx[GRUB_MD_MD5->contextsize];
|
||||
grub_size_t i;
|
||||
int ret;
|
||||
|
||||
ctx = grub_zalloc (GRUB_MD_MD5->contextsize);
|
||||
if (!ctx)
|
||||
return 0;
|
||||
|
||||
GRUB_MD_MD5->init (ctx);
|
||||
GRUB_MD_MD5->write (ctx, entered, enteredlen);
|
||||
@@ -605,9 +602,7 @@ check_password_md5_real (const char *entered,
|
||||
GRUB_MD_MD5->final (ctx);
|
||||
}
|
||||
|
||||
ret = (grub_crypto_memcmp (digest, pw->hash, MD5_HASHLEN) == 0);
|
||||
grub_free (ctx);
|
||||
return ret;
|
||||
return (grub_crypto_memcmp (digest, pw->hash, MD5_HASHLEN) == 0);
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
@@ -730,37 +725,11 @@ grub_cmd_legacy_password (struct grub_command *mycmd __attribute__ ((unused)),
|
||||
NULL);
|
||||
}
|
||||
|
||||
int
|
||||
grub_legacy_check_md5_password (int argc, char **args,
|
||||
char *entered)
|
||||
{
|
||||
struct legacy_md5_password *pw = NULL;
|
||||
int ret;
|
||||
|
||||
if (args[0][0] != '-' || args[0][1] != '-')
|
||||
{
|
||||
char correct[GRUB_AUTH_MAX_PASSLEN];
|
||||
|
||||
grub_memset (correct, 0, sizeof (correct));
|
||||
grub_strncpy (correct, args[0], sizeof (correct));
|
||||
|
||||
return grub_crypto_memcmp (entered, correct, GRUB_AUTH_MAX_PASSLEN) == 0;
|
||||
}
|
||||
|
||||
pw = parse_legacy_md5 (argc, args);
|
||||
|
||||
if (!pw)
|
||||
return 0;
|
||||
|
||||
ret = check_password_md5_real (entered, pw);
|
||||
grub_free (pw);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_cmd_legacy_check_password (struct grub_command *mycmd __attribute__ ((unused)),
|
||||
int argc, char **args)
|
||||
{
|
||||
struct legacy_md5_password *pw = NULL;
|
||||
char entered[GRUB_AUTH_MAX_PASSLEN];
|
||||
|
||||
if (argc == 0)
|
||||
@@ -769,8 +738,24 @@ grub_cmd_legacy_check_password (struct grub_command *mycmd __attribute__ ((unuse
|
||||
if (!grub_password_get (entered, GRUB_AUTH_MAX_PASSLEN))
|
||||
return GRUB_ACCESS_DENIED;
|
||||
|
||||
if (!grub_legacy_check_md5_password (argc, args,
|
||||
entered))
|
||||
if (args[0][0] != '-' || args[0][1] != '-')
|
||||
{
|
||||
char correct[GRUB_AUTH_MAX_PASSLEN];
|
||||
|
||||
grub_memset (correct, 0, sizeof (correct));
|
||||
grub_strncpy (correct, args[0], sizeof (correct));
|
||||
|
||||
if (grub_crypto_memcmp (entered, correct, GRUB_AUTH_MAX_PASSLEN) != 0)
|
||||
return GRUB_ACCESS_DENIED;
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
pw = parse_legacy_md5 (argc, args);
|
||||
|
||||
if (!pw)
|
||||
return GRUB_ACCESS_DENIED;
|
||||
|
||||
if (!check_password_md5_real (entered, pw))
|
||||
return GRUB_ACCESS_DENIED;
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
|
||||
@@ -44,8 +44,7 @@ static const struct grub_arg_option options[] =
|
||||
PUBKEY filter (that insists upon properly signed files) as well. PUBKEY
|
||||
filter is restored before the function returns. */
|
||||
static grub_file_t
|
||||
open_envblk_file (char *filename,
|
||||
enum grub_file_type type)
|
||||
open_envblk_file (char *filename, int untrusted)
|
||||
{
|
||||
grub_file_t file;
|
||||
char *buf = 0;
|
||||
@@ -73,7 +72,13 @@ open_envblk_file (char *filename,
|
||||
grub_strcpy (filename + len + 1, GRUB_ENVBLK_DEFCFG);
|
||||
}
|
||||
|
||||
file = grub_file_open (filename, type);
|
||||
/* The filters that are disabled will be re-enabled by the call to
|
||||
grub_file_open() after this particular file is opened. */
|
||||
grub_file_filter_disable_compression ();
|
||||
if (untrusted)
|
||||
grub_file_filter_disable_pubkey ();
|
||||
|
||||
file = grub_file_open (filename);
|
||||
|
||||
grub_free (buf);
|
||||
return file;
|
||||
@@ -166,10 +171,7 @@ grub_cmd_load_env (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
whitelist.list = args;
|
||||
|
||||
/* state[0] is the -f flag; state[1] is the --skip-sig flag */
|
||||
file = open_envblk_file ((state[0].set) ? state[0].arg : 0,
|
||||
GRUB_FILE_TYPE_LOADENV
|
||||
| (state[1].set
|
||||
? GRUB_FILE_TYPE_SKIP_SIGNATURE : 0));
|
||||
file = open_envblk_file ((state[0].set) ? state[0].arg : 0, state[1].set);
|
||||
if (! file)
|
||||
return grub_errno;
|
||||
|
||||
@@ -204,10 +206,7 @@ grub_cmd_list_env (grub_extcmd_context_t ctxt,
|
||||
grub_file_t file;
|
||||
grub_envblk_t envblk;
|
||||
|
||||
file = open_envblk_file ((state[0].set) ? state[0].arg : 0,
|
||||
GRUB_FILE_TYPE_LOADENV
|
||||
| (state[1].set
|
||||
? GRUB_FILE_TYPE_SKIP_SIGNATURE : 0));
|
||||
file = open_envblk_file ((state[0].set) ? state[0].arg : 0, 0);
|
||||
if (! file)
|
||||
return grub_errno;
|
||||
|
||||
@@ -260,28 +259,10 @@ check_blocklists (grub_envblk_t envblk, struct blocklist *blocklists,
|
||||
for (p = blocklists; p; p = p->next)
|
||||
{
|
||||
struct blocklist *q;
|
||||
/* Check if any pair of blocks overlap. */
|
||||
for (q = p->next; q; q = q->next)
|
||||
{
|
||||
grub_disk_addr_t s1, s2;
|
||||
grub_disk_addr_t e1, e2, t;
|
||||
|
||||
s1 = p->sector;
|
||||
e1 = s1 + ((p->length + GRUB_DISK_SECTOR_SIZE - 1) >> GRUB_DISK_SECTOR_BITS);
|
||||
|
||||
s2 = q->sector;
|
||||
e2 = s2 + ((q->length + GRUB_DISK_SECTOR_SIZE - 1) >> GRUB_DISK_SECTOR_BITS);
|
||||
|
||||
if (s2 > s1)
|
||||
{
|
||||
t = s2;
|
||||
s2 = s1;
|
||||
s1 = t;
|
||||
t = e2;
|
||||
e2 = e1;
|
||||
e1 = t;
|
||||
}
|
||||
if (e1 > s2)
|
||||
/* Check if any pair of blocks overlap. */
|
||||
if (p->sector == q->sector)
|
||||
{
|
||||
/* This might be actually valid, but it is unbelievable that
|
||||
any filesystem makes such a silly allocation. */
|
||||
@@ -305,18 +286,9 @@ check_blocklists (grub_envblk_t envblk, struct blocklist *blocklists,
|
||||
part_start = grub_partition_get_start (disk->partition);
|
||||
|
||||
buf = grub_envblk_buffer (envblk);
|
||||
char *blockbuf = NULL;
|
||||
grub_size_t blockbuf_len = 0;
|
||||
for (p = blocklists, index = 0; p; index += p->length, p = p->next)
|
||||
{
|
||||
if (p->length > blockbuf_len)
|
||||
{
|
||||
grub_free (blockbuf);
|
||||
blockbuf_len = 2 * p->length;
|
||||
blockbuf = grub_malloc (blockbuf_len);
|
||||
if (!blockbuf)
|
||||
return grub_errno;
|
||||
}
|
||||
char blockbuf[GRUB_DISK_SECTOR_SIZE];
|
||||
|
||||
if (grub_disk_read (disk, p->sector - part_start,
|
||||
p->offset, p->length, blockbuf))
|
||||
@@ -368,6 +340,10 @@ save_env_read_hook (grub_disk_addr_t sector, unsigned offset, unsigned length,
|
||||
struct grub_cmd_save_env_ctx *ctx = data;
|
||||
struct blocklist *block;
|
||||
|
||||
if (offset + length > GRUB_DISK_SECTOR_SIZE)
|
||||
/* Seemingly a bug. */
|
||||
return;
|
||||
|
||||
block = grub_malloc (sizeof (*block));
|
||||
if (! block)
|
||||
return;
|
||||
@@ -400,8 +376,7 @@ grub_cmd_save_env (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, "no variable is specified");
|
||||
|
||||
file = open_envblk_file ((state[0].set) ? state[0].arg : 0,
|
||||
GRUB_FILE_TYPE_SAVEENV
|
||||
| GRUB_FILE_TYPE_SKIP_SIGNATURE);
|
||||
1 /* allow untrusted */);
|
||||
if (! file)
|
||||
return grub_errno;
|
||||
|
||||
@@ -434,8 +409,6 @@ grub_cmd_save_env (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
else
|
||||
grub_envblk_delete (envblk, args[0]);
|
||||
|
||||
argc--;
|
||||
args++;
|
||||
|
||||
@@ -129,8 +129,8 @@ print_files_long (const char *filename, const struct grub_dirhook_info *info,
|
||||
|
||||
/* XXX: For ext2fs symlinks are detected as files while they
|
||||
should be reported as directories. */
|
||||
file = grub_file_open (pathname, GRUB_FILE_TYPE_GET_SIZE
|
||||
| GRUB_FILE_TYPE_NO_DECOMPRESS);
|
||||
grub_file_filter_disable_compression ();
|
||||
file = grub_file_open (pathname);
|
||||
if (! file)
|
||||
{
|
||||
grub_errno = 0;
|
||||
@@ -225,8 +225,8 @@ grub_ls_list_files (char *dirname, int longlist, int all, int human)
|
||||
struct grub_dirhook_info info;
|
||||
grub_errno = 0;
|
||||
|
||||
file = grub_file_open (dirname, GRUB_FILE_TYPE_GET_SIZE
|
||||
| GRUB_FILE_TYPE_NO_DECOMPRESS);
|
||||
grub_file_filter_disable_compression ();
|
||||
file = grub_file_open (dirname);
|
||||
if (! file)
|
||||
goto fail;
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@ grub_mini_cmd_cat (struct grub_command *cmd __attribute__ ((unused)),
|
||||
if (argc < 1)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
||||
|
||||
file = grub_file_open (argv[0], GRUB_FILE_TYPE_CAT);
|
||||
file = grub_file_open (argv[0]);
|
||||
if (! file)
|
||||
return grub_errno;
|
||||
|
||||
|
||||
@@ -75,7 +75,6 @@ get_uuid (const char *name, char **uuid, int getnative)
|
||||
/* Native disks. */
|
||||
case GRUB_DISK_DEVICE_ATA_ID:
|
||||
case GRUB_DISK_DEVICE_SCSI_ID:
|
||||
case GRUB_DISK_DEVICE_XEN:
|
||||
if (getnative)
|
||||
break;
|
||||
|
||||
@@ -234,8 +233,7 @@ grub_cmd_nativedisk (grub_command_t cmd __attribute__ ((unused)),
|
||||
if (! filename)
|
||||
goto fail;
|
||||
|
||||
file = grub_file_open (filename,
|
||||
GRUB_FILE_TYPE_GRUB_MODULE);
|
||||
file = grub_file_open (filename);
|
||||
grub_free (filename);
|
||||
if (! file)
|
||||
goto fail;
|
||||
|
||||
@@ -193,7 +193,7 @@ grub_cmd_parttool (grub_command_t cmd __attribute__ ((unused)),
|
||||
{
|
||||
grub_file_t file;
|
||||
|
||||
file = grub_file_open (filename, GRUB_FILE_TYPE_GRUB_MODULE_LIST);
|
||||
file = grub_file_open (filename);
|
||||
if (file)
|
||||
{
|
||||
char *buf = 0;
|
||||
|
||||
@@ -81,8 +81,8 @@ iterate_device (const char *name, void *data)
|
||||
if (! buf)
|
||||
return 1;
|
||||
|
||||
file = grub_file_open (buf, GRUB_FILE_TYPE_FS_SEARCH
|
||||
| GRUB_FILE_TYPE_NO_DECOMPRESS);
|
||||
grub_file_filter_disable_compression ();
|
||||
file = grub_file_open (buf);
|
||||
if (file)
|
||||
{
|
||||
found = 1;
|
||||
|
||||
@@ -355,8 +355,8 @@ test_parse (char **args, int *argn, int argc)
|
||||
if (grub_strcmp (args[*argn], "-s") == 0)
|
||||
{
|
||||
grub_file_t file;
|
||||
file = grub_file_open (args[*argn + 1], GRUB_FILE_TYPE_GET_SIZE
|
||||
| GRUB_FILE_TYPE_NO_DECOMPRESS);
|
||||
grub_file_filter_disable_compression ();
|
||||
file = grub_file_open (args[*argn + 1]);
|
||||
update_val (file && (grub_file_size (file) != 0), &ctx);
|
||||
if (file)
|
||||
grub_file_close (file);
|
||||
|
||||
@@ -35,13 +35,10 @@ GRUB_MOD_LICENSE ("GPLv3+");
|
||||
static void
|
||||
read_progress (grub_disk_addr_t sector __attribute__ ((unused)),
|
||||
unsigned offset __attribute__ ((unused)),
|
||||
unsigned len,
|
||||
unsigned len __attribute__ ((unused)),
|
||||
void *data __attribute__ ((unused)))
|
||||
{
|
||||
for (; len >= GRUB_DISK_SECTOR_SIZE; len -= GRUB_DISK_SECTOR_SIZE)
|
||||
grub_xputs (".");
|
||||
if (len)
|
||||
grub_xputs (".");
|
||||
grub_xputs (".");
|
||||
grub_refresh ();
|
||||
}
|
||||
|
||||
@@ -57,7 +54,7 @@ grub_cmd_testload (struct grub_command *cmd __attribute__ ((unused)),
|
||||
if (argc < 1)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
||||
|
||||
file = grub_file_open (argv[0], GRUB_FILE_TYPE_TESTLOAD);
|
||||
file = grub_file_open (argv[0]);
|
||||
if (! file)
|
||||
return grub_errno;
|
||||
|
||||
|
||||
@@ -61,7 +61,7 @@ grub_cmd_testspeed (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
if (buffer == NULL)
|
||||
return grub_errno;
|
||||
|
||||
file = grub_file_open (args[0], GRUB_FILE_TYPE_TESTLOAD);
|
||||
file = grub_file_open (args[0]);
|
||||
if (file == NULL)
|
||||
goto quit;
|
||||
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
#include <grub/env.h>
|
||||
#include <grub/kernel.h>
|
||||
#include <grub/extcmd.h>
|
||||
#include <grub/efi/pe32.h>
|
||||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
@@ -146,31 +145,16 @@ const char *hashes[] = {
|
||||
[0x0b] = "sha224"
|
||||
};
|
||||
|
||||
struct gcry_pk_spec *grub_crypto_pk_dsa;
|
||||
struct gcry_pk_spec *grub_crypto_pk_ecdsa;
|
||||
struct gcry_pk_spec *grub_crypto_pk_rsa;
|
||||
|
||||
static int
|
||||
dsa_pad (gcry_mpi_t *hmpi, grub_uint8_t *hval,
|
||||
const gcry_md_spec_t *hash, struct grub_public_subkey *sk);
|
||||
static int
|
||||
rsa_pad (gcry_mpi_t *hmpi, grub_uint8_t *hval,
|
||||
const gcry_md_spec_t *hash, struct grub_public_subkey *sk);
|
||||
|
||||
struct
|
||||
{
|
||||
const char *name;
|
||||
grub_size_t nmpisig;
|
||||
grub_size_t nmpipub;
|
||||
struct gcry_pk_spec **algo;
|
||||
int (*pad) (gcry_mpi_t *hmpi, grub_uint8_t *hval,
|
||||
const gcry_md_spec_t *hash, struct grub_public_subkey *sk);
|
||||
const char *module;
|
||||
} pkalgos[] =
|
||||
{
|
||||
[1] = { "rsa", 1, 2, &grub_crypto_pk_rsa, rsa_pad, "gcry_rsa" },
|
||||
[3] = { "rsa", 1, 2, &grub_crypto_pk_rsa, rsa_pad, "gcry_rsa" },
|
||||
[17] = { "dsa", 2, 4, &grub_crypto_pk_dsa, dsa_pad, "gcry_dsa" },
|
||||
[1] = { "rsa", 1, 2 },
|
||||
[3] = { "rsa", 1, 2 },
|
||||
[17] = { "dsa", 2, 4 },
|
||||
};
|
||||
|
||||
struct grub_public_key
|
||||
@@ -193,39 +177,22 @@ free_pk (struct grub_public_key *pk)
|
||||
struct grub_public_subkey *nsk, *sk;
|
||||
for (sk = pk->subkeys; sk; sk = nsk)
|
||||
{
|
||||
grub_size_t i;
|
||||
for (i = 0; i < ARRAY_SIZE (sk->mpis); i++)
|
||||
if (sk->mpis[i])
|
||||
gcry_mpi_release (sk->mpis[i]);
|
||||
nsk = sk->next;
|
||||
grub_free (sk);
|
||||
}
|
||||
grub_free (pk);
|
||||
}
|
||||
|
||||
#define READBUF_SIZE 4096
|
||||
|
||||
struct grub_public_key *
|
||||
grub_load_public_key (grub_file_t f)
|
||||
{
|
||||
grub_err_t err;
|
||||
struct grub_public_key *ret;
|
||||
struct grub_public_subkey **last = 0;
|
||||
void *fingerprint_context = NULL;
|
||||
grub_uint8_t *buffer = NULL;
|
||||
|
||||
ret = grub_zalloc (sizeof (*ret));
|
||||
if (!ret)
|
||||
{
|
||||
grub_free (fingerprint_context);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
buffer = grub_zalloc (READBUF_SIZE);
|
||||
fingerprint_context = grub_zalloc (GRUB_MD_SHA1->contextsize);
|
||||
|
||||
if (!buffer || !fingerprint_context)
|
||||
goto fail;
|
||||
return NULL;
|
||||
|
||||
last = &ret->subkeys;
|
||||
|
||||
@@ -239,6 +206,7 @@ grub_load_public_key (grub_file_t f)
|
||||
struct grub_public_subkey *sk;
|
||||
grub_size_t i;
|
||||
grub_uint16_t len_be;
|
||||
GRUB_PROPERLY_ALIGNED_ARRAY (fingerprint_context, GRUB_MD_SHA1->contextsize);
|
||||
|
||||
err = read_packet_header (f, &type, &len);
|
||||
|
||||
@@ -247,11 +215,7 @@ grub_load_public_key (grub_file_t f)
|
||||
if (type == 0xfe)
|
||||
continue;
|
||||
if (type == 0xff)
|
||||
{
|
||||
grub_free (fingerprint_context);
|
||||
grub_free (buffer);
|
||||
return ret;
|
||||
}
|
||||
return ret;
|
||||
|
||||
grub_dprintf ("crypt", "len = %x\n", (int) len);
|
||||
|
||||
@@ -315,6 +279,7 @@ grub_load_public_key (grub_file_t f)
|
||||
{
|
||||
grub_uint16_t l;
|
||||
grub_size_t lb;
|
||||
grub_uint8_t buffer[4096];
|
||||
if (grub_file_read (f, &l, sizeof (l)) != sizeof (l))
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
@@ -322,7 +287,7 @@ grub_load_public_key (grub_file_t f)
|
||||
}
|
||||
|
||||
lb = (grub_be_to_cpu16 (l) + GRUB_CHAR_BIT - 1) / GRUB_CHAR_BIT;
|
||||
if (lb > READBUF_SIZE - sizeof (grub_uint16_t))
|
||||
if (lb > sizeof (buffer) - sizeof (grub_uint16_t))
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
goto fail;
|
||||
@@ -357,8 +322,6 @@ grub_load_public_key (grub_file_t f)
|
||||
}
|
||||
fail:
|
||||
free_pk (ret);
|
||||
grub_free (fingerprint_context);
|
||||
grub_free (buffer);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -388,401 +351,6 @@ grub_crypto_pk_locate_subkey_in_trustdb (grub_uint64_t keyid)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
dsa_pad (gcry_mpi_t *hmpi, grub_uint8_t *hval,
|
||||
const gcry_md_spec_t *hash, struct grub_public_subkey *sk)
|
||||
{
|
||||
unsigned nbits = gcry_mpi_get_nbits (sk->mpis[1]);
|
||||
grub_dprintf ("crypt", "must be %u bits got %d bits\n", nbits,
|
||||
(int)(8 * hash->mdlen));
|
||||
return gcry_mpi_scan (hmpi, GCRYMPI_FMT_USG, hval,
|
||||
nbits / 8 < (unsigned) hash->mdlen ? nbits / 8
|
||||
: (unsigned) hash->mdlen, 0);
|
||||
}
|
||||
|
||||
static int
|
||||
rsa_pad (gcry_mpi_t *hmpi, grub_uint8_t *hval,
|
||||
const gcry_md_spec_t *hash, struct grub_public_subkey *sk)
|
||||
{
|
||||
grub_size_t tlen, emlen, fflen;
|
||||
grub_uint8_t *em, *emptr;
|
||||
unsigned nbits = gcry_mpi_get_nbits (sk->mpis[0]);
|
||||
int ret;
|
||||
tlen = hash->mdlen + hash->asnlen;
|
||||
emlen = (nbits + 7) / 8;
|
||||
if (emlen < tlen + 11)
|
||||
return 1;
|
||||
|
||||
em = grub_malloc (emlen);
|
||||
if (!em)
|
||||
return 1;
|
||||
|
||||
em[0] = 0x00;
|
||||
em[1] = 0x01;
|
||||
fflen = emlen - tlen - 3;
|
||||
for (emptr = em + 2; emptr < em + 2 + fflen; emptr++)
|
||||
*emptr = 0xff;
|
||||
*emptr++ = 0x00;
|
||||
grub_memcpy (emptr, hash->asnoid, hash->asnlen);
|
||||
emptr += hash->asnlen;
|
||||
grub_memcpy (emptr, hval, hash->mdlen);
|
||||
|
||||
ret = gcry_mpi_scan (hmpi, GCRYMPI_FMT_USG, em, emlen, 0);
|
||||
grub_free (em);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
get (char *buf, grub_size_t size,
|
||||
grub_file_t f, void *out,
|
||||
grub_off_t off, grub_size_t sz)
|
||||
{
|
||||
if (buf)
|
||||
{
|
||||
if (off > ~(grub_uint32_t) sz
|
||||
|| off + sz > size)
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
grub_memcpy (out, buf + off, sz);
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
if (grub_file_seek (f, off) == (grub_size_t) -1)
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
if (grub_file_read (f, out, sz) != (grub_ssize_t) sz)
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
read_len (char *buf, grub_size_t size,
|
||||
grub_file_t f, grub_off_t *curoff, grub_uint32_t *endoff)
|
||||
{
|
||||
grub_uint8_t cb;
|
||||
unsigned ss, rl;
|
||||
grub_uint32_t v = 0;
|
||||
grub_err_t err;
|
||||
|
||||
err = get (buf, size, f, &cb, (*curoff)++, 1);
|
||||
if (err)
|
||||
return err;
|
||||
if (!(cb & 0x80))
|
||||
{
|
||||
*endoff = *curoff + (cb & 0x7f);
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
ss = cb & 0x7f;
|
||||
if (ss > 4)
|
||||
rl = 4;
|
||||
else
|
||||
rl = ss;
|
||||
*curoff += (ss - rl);
|
||||
err = get (buf, size, f, (char *) &v + (4 - rl), *curoff,
|
||||
rl);
|
||||
if (err)
|
||||
return err;
|
||||
*curoff += rl;
|
||||
*endoff = *curoff + (grub_be_to_cpu32 (v) & 0x7fffff);
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
#define MAX_FULLASN 128
|
||||
|
||||
static grub_err_t
|
||||
grub_verify_pe_signature_real (char *buf, grub_size_t size,
|
||||
grub_file_t f,
|
||||
struct grub_public_key *pkey)
|
||||
{
|
||||
grub_uint8_t mz[2];
|
||||
const gcry_md_spec_t *hash;
|
||||
grub_uint32_t coff_offset, opt_offset;
|
||||
union
|
||||
{
|
||||
struct grub_pe32_optional_header o32;
|
||||
struct grub_pe64_optional_header o64;
|
||||
} opt_head;
|
||||
struct grub_pe32_data_directory *certtab;
|
||||
grub_err_t err;
|
||||
void *context = NULL;
|
||||
void *read_buf = NULL;
|
||||
grub_uint8_t *hval;
|
||||
grub_off_t curoff;
|
||||
grub_uint8_t cb;
|
||||
grub_uint8_t full_asn[MAX_FULLASN];
|
||||
/*
|
||||
hash as:
|
||||
offs[0] - offs[1]
|
||||
skip: checksum
|
||||
offs[2] - offs[3]
|
||||
skip: cert entry
|
||||
offs[4] - offs[5]
|
||||
skip: cert
|
||||
offs[6] - offs[7]
|
||||
*/
|
||||
grub_uint32_t offs[8];
|
||||
grub_uint32_t endoff[5];
|
||||
grub_uint32_t full_asn_offset, full_asn_offset_end;
|
||||
grub_size_t i;
|
||||
|
||||
err = get (buf, size, f, mz, 0, 2);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (mz[0] != 'M' || mz[1] != 'Z')
|
||||
goto fail;
|
||||
|
||||
err = get (buf, size, f, &coff_offset, 0x3c, 4);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
opt_offset = grub_cpu_to_le32 (coff_offset) + sizeof (struct grub_pe32_coff_header) + 4;
|
||||
|
||||
err = get (buf, size, f, &opt_head, opt_offset, sizeof (opt_head));
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
grub_dprintf ("crypt", "opt_offset = %x\n", (int) opt_offset);
|
||||
|
||||
if (opt_head.o32.magic == grub_cpu_to_le16_compile_time (GRUB_PE32_PE32_MAGIC))
|
||||
{
|
||||
offs[1] = (char *) &opt_head.o32.checksum - (char *) &opt_head + opt_offset;
|
||||
certtab = &opt_head.o32.certificate_table;
|
||||
}
|
||||
else if (opt_head.o64.magic == grub_cpu_to_le16_compile_time (GRUB_PE32_PE64_MAGIC))
|
||||
{
|
||||
offs[1] = (char *) &opt_head.o64.checksum - (char *) &opt_head + opt_offset;
|
||||
certtab = &opt_head.o64.certificate_table;
|
||||
}
|
||||
else
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
|
||||
if (certtab->size == 0)
|
||||
goto fail;
|
||||
|
||||
offs[0] = 0;
|
||||
offs[2] = offs[1] + 4;
|
||||
offs[3] = (char *) certtab - (char *) &opt_head + opt_offset;
|
||||
offs[4] = offs[3] + sizeof (*certtab);
|
||||
offs[5] = grub_le_to_cpu32 (certtab->rva);
|
||||
offs[6] = offs[5] + grub_le_to_cpu32 (certtab->size);
|
||||
offs[7] = buf ? size : grub_file_size (f);
|
||||
|
||||
/* Verify that offset sequence is valid. */
|
||||
for (i = 0; i < 7; i++)
|
||||
if (offs[i + 1] < offs[i])
|
||||
goto fail;
|
||||
|
||||
grub_dprintf ("crypt", "sig @%x+%x\n", (int)certtab->rva,
|
||||
(int)certtab->size);
|
||||
|
||||
|
||||
curoff = grub_le_to_cpu32 (certtab->rva) + 8;
|
||||
err = get (buf, size, f, &cb, curoff++, 1);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (cb != 0x30)
|
||||
goto fail;
|
||||
|
||||
/* into. */
|
||||
err = read_len (buf, size, f, &curoff, &endoff[0]);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = get (buf, size, f, &cb, curoff++, 1);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (cb != 0x06)
|
||||
goto fail;
|
||||
|
||||
/* skip. */
|
||||
err = read_len (buf, size, f, &curoff, &endoff[1]);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
curoff = endoff[1];
|
||||
|
||||
err = get (buf, size, f, &cb, curoff++, 1);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (cb != 0xa0)
|
||||
goto fail;
|
||||
|
||||
/* into. */
|
||||
err = read_len (buf, size, f, &curoff, &endoff[1]);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = get (buf, size, f, &cb, curoff++, 1);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (cb != 0x30)
|
||||
goto fail;
|
||||
|
||||
/* into. */
|
||||
err = read_len (buf, size, f, &curoff, &endoff[2]);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = get (buf, size, f, &cb, curoff++, 1);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (cb != 0x02)
|
||||
goto fail;
|
||||
|
||||
/* skip */
|
||||
err = read_len (buf, size, f, &curoff, &endoff[2]);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
curoff = endoff[2];
|
||||
|
||||
err = get (buf, size, f, &cb, curoff++, 1);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (cb != 0x31)
|
||||
goto fail;
|
||||
|
||||
err = get (buf, size, f, &cb, curoff++, 1);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (cb != 0x0f)
|
||||
goto fail;
|
||||
|
||||
err = read_len (buf, size, f, &curoff, &endoff[3]);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
curoff = endoff[3];
|
||||
|
||||
err = get (buf, size, f, &cb, curoff++, 1);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (cb != 0x03)
|
||||
goto fail;
|
||||
|
||||
err = read_len (buf, size, f, &curoff, &endoff[3]);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
curoff = endoff[3];
|
||||
|
||||
err = get (buf, size, f, &cb, curoff++, 1);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (cb != 0xa0)
|
||||
goto fail;
|
||||
|
||||
err = read_len (buf, size, f, &curoff, &endoff[3]);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
curoff = endoff[3];
|
||||
|
||||
grub_dprintf ("crypt", "off: %x\n",
|
||||
(int)curoff - grub_le_to_cpu32 (certtab->rva));
|
||||
|
||||
/* At this point we have the full ASN at current offset */
|
||||
full_asn_offset = curoff;
|
||||
err = get (buf, size, f, &cb, curoff++, 1);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (cb != 0x30)
|
||||
goto fail;
|
||||
|
||||
err = read_len (buf, size, f, &curoff, &endoff[3]);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
curoff = endoff[3];
|
||||
full_asn_offset_end = curoff;
|
||||
|
||||
grub_dprintf ("crypt", "off: %x\n",
|
||||
(int)full_asn_offset_end - grub_le_to_cpu32 (certtab->rva));
|
||||
|
||||
if (full_asn_offset_end - full_asn_offset > MAX_FULLASN)
|
||||
goto fail;
|
||||
|
||||
err = get (buf, size, f, full_asn, full_asn_offset,
|
||||
full_asn_offset_end - full_asn_offset);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
hash = grub_crypto_lookup_md_by_asn (full_asn,
|
||||
full_asn_offset_end - full_asn_offset);
|
||||
if (!hash)
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, "hash not loaded");
|
||||
|
||||
if (hash->asnlen + hash->mdlen != full_asn_offset_end - full_asn_offset)
|
||||
goto fail;
|
||||
|
||||
context = grub_zalloc (hash->contextsize);
|
||||
if (!context)
|
||||
goto fail;
|
||||
|
||||
hash->init (context);
|
||||
|
||||
if (buf)
|
||||
{
|
||||
for (i = 0; i <= 3; i++)
|
||||
hash->write (context, buf + offs[2 * i],
|
||||
offs[2 * i + 1] - offs[2 * i]);
|
||||
}
|
||||
else
|
||||
{
|
||||
read_buf = grub_malloc (READBUF_SIZE);
|
||||
for (i = 0; i <= 3; i++)
|
||||
{
|
||||
grub_size_t rem;
|
||||
grub_ssize_t r;
|
||||
if (grub_file_seek (f, offs[2 * i]) == (grub_size_t) -1)
|
||||
goto fail;
|
||||
rem = offs[2 * i + 1] - offs[2 * i];
|
||||
COMPILE_TIME_ASSERT (sizeof (rem) >= sizeof (offs[0]));
|
||||
while (rem)
|
||||
{
|
||||
r = grub_file_read (f, read_buf,
|
||||
rem < READBUF_SIZE ? rem : READBUF_SIZE);
|
||||
if (r < 0)
|
||||
goto fail;
|
||||
if (r == 0)
|
||||
break;
|
||||
hash->write (context, read_buf, r);
|
||||
rem -= r;
|
||||
}
|
||||
if (rem)
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
|
||||
hash->final (context);
|
||||
hval = hash->read (context);
|
||||
|
||||
if (grub_memcmp (full_asn + hash->asnlen,
|
||||
hval, hash->mdlen) != 0)
|
||||
goto fail;
|
||||
for (i = 0; i < hash->mdlen; i++)
|
||||
grub_printf ("%02x ", hval[i]);
|
||||
grub_printf ("\n");
|
||||
|
||||
(void) pkey;
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
fail:
|
||||
grub_free (context);
|
||||
grub_free (read_buf);
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_verify_signature_real (char *buf, grub_size_t size,
|
||||
grub_file_t f, grub_file_t sig,
|
||||
@@ -836,7 +404,7 @@ grub_verify_signature_real (char *buf, grub_size_t size,
|
||||
grub_dprintf ("crypt", "alive\n");
|
||||
|
||||
{
|
||||
void *context = NULL;
|
||||
GRUB_PROPERLY_ALIGNED_ARRAY (context, hash->contextsize);
|
||||
unsigned char *hval;
|
||||
grub_ssize_t rem = grub_be_to_cpu16 (v4.hashed_sub);
|
||||
grub_uint32_t headlen = grub_cpu_to_be32 (rem + 6);
|
||||
@@ -847,22 +415,18 @@ grub_verify_signature_real (char *buf, grub_size_t size,
|
||||
gcry_mpi_t hmpi;
|
||||
grub_uint64_t keyid = 0;
|
||||
struct grub_public_subkey *sk;
|
||||
grub_uint8_t *readbuf = NULL;
|
||||
|
||||
context = grub_zalloc (hash->contextsize);
|
||||
readbuf = grub_zalloc (READBUF_SIZE);
|
||||
if (!context || !readbuf)
|
||||
goto fail;
|
||||
|
||||
grub_memset (context, 0, sizeof (context));
|
||||
hash->init (context);
|
||||
if (buf)
|
||||
hash->write (context, buf, size);
|
||||
else
|
||||
while (1)
|
||||
{
|
||||
r = grub_file_read (f, readbuf, READBUF_SIZE);
|
||||
grub_uint8_t readbuf[4096];
|
||||
r = grub_file_read (f, readbuf, sizeof (readbuf));
|
||||
if (r < 0)
|
||||
goto fail;
|
||||
return grub_errno;
|
||||
if (r == 0)
|
||||
break;
|
||||
hash->write (context, readbuf, r);
|
||||
@@ -872,33 +436,32 @@ grub_verify_signature_real (char *buf, grub_size_t size,
|
||||
hash->write (context, &v4, sizeof (v4));
|
||||
while (rem)
|
||||
{
|
||||
r = grub_file_read (sig, readbuf,
|
||||
rem < READBUF_SIZE ? rem : READBUF_SIZE);
|
||||
grub_uint8_t readbuf[4096];
|
||||
r = grub_file_read (sig, readbuf, rem < (grub_ssize_t) sizeof (readbuf) ? rem : (grub_ssize_t) sizeof (readbuf));
|
||||
if (r < 0)
|
||||
goto fail;
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
if (r == 0)
|
||||
break;
|
||||
hash->write (context, readbuf, r);
|
||||
rem -= r;
|
||||
}
|
||||
if (rem)
|
||||
goto fail;
|
||||
hash->write (context, &v, sizeof (v));
|
||||
s = 0xff;
|
||||
hash->write (context, &s, sizeof (s));
|
||||
hash->write (context, &headlen, sizeof (headlen));
|
||||
r = grub_file_read (sig, &unhashed_sub, sizeof (unhashed_sub));
|
||||
if (r != sizeof (unhashed_sub))
|
||||
goto fail;
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
{
|
||||
grub_uint8_t readbuf[4096];
|
||||
grub_uint8_t *ptr;
|
||||
grub_uint32_t l;
|
||||
rem = grub_be_to_cpu16 (unhashed_sub);
|
||||
if (rem > READBUF_SIZE)
|
||||
goto fail;
|
||||
if (rem > (int) sizeof (readbuf))
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
r = grub_file_read (sig, readbuf, rem);
|
||||
if (r != rem)
|
||||
goto fail;
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
for (ptr = readbuf; ptr < readbuf + rem; ptr += l)
|
||||
{
|
||||
if (*ptr < 192)
|
||||
@@ -929,9 +492,9 @@ grub_verify_signature_real (char *buf, grub_size_t size,
|
||||
hval = hash->read (context);
|
||||
|
||||
if (grub_file_read (sig, hash_start, sizeof (hash_start)) != sizeof (hash_start))
|
||||
goto fail;
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
if (grub_memcmp (hval, hash_start, sizeof (hash_start)) != 0)
|
||||
goto fail;
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
|
||||
grub_dprintf ("crypt", "@ %x\n", (int)grub_file_tell (sig));
|
||||
|
||||
@@ -939,24 +502,25 @@ grub_verify_signature_real (char *buf, grub_size_t size,
|
||||
{
|
||||
grub_uint16_t l;
|
||||
grub_size_t lb;
|
||||
grub_uint8_t buffer[4096];
|
||||
grub_dprintf ("crypt", "alive\n");
|
||||
if (grub_file_read (sig, &l, sizeof (l)) != sizeof (l))
|
||||
goto fail;
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
grub_dprintf ("crypt", "alive\n");
|
||||
lb = (grub_be_to_cpu16 (l) + 7) / 8;
|
||||
grub_dprintf ("crypt", "l = 0x%04x\n", grub_be_to_cpu16 (l));
|
||||
if (lb > READBUF_SIZE - sizeof (grub_uint16_t))
|
||||
goto fail;
|
||||
if (lb > sizeof (buffer) - sizeof (grub_uint16_t))
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
grub_dprintf ("crypt", "alive\n");
|
||||
if (grub_file_read (sig, readbuf + sizeof (grub_uint16_t), lb) != (grub_ssize_t) lb)
|
||||
goto fail;
|
||||
if (grub_file_read (sig, buffer + sizeof (grub_uint16_t), lb) != (grub_ssize_t) lb)
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
grub_dprintf ("crypt", "alive\n");
|
||||
grub_memcpy (readbuf, &l, sizeof (l));
|
||||
grub_memcpy (buffer, &l, sizeof (l));
|
||||
grub_dprintf ("crypt", "alive\n");
|
||||
|
||||
if (gcry_mpi_scan (&mpis[i], GCRYMPI_FMT_PGP,
|
||||
readbuf, lb + sizeof (grub_uint16_t), 0))
|
||||
goto fail;
|
||||
buffer, lb + sizeof (grub_uint16_t), 0))
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
grub_dprintf ("crypt", "alive\n");
|
||||
}
|
||||
|
||||
@@ -965,42 +529,24 @@ grub_verify_signature_real (char *buf, grub_size_t size,
|
||||
else
|
||||
sk = grub_crypto_pk_locate_subkey_in_trustdb (keyid);
|
||||
if (!sk)
|
||||
{
|
||||
/* TRANSLATORS: %08x is 32-bit key id. */
|
||||
grub_error (GRUB_ERR_BAD_SIGNATURE, N_("public key %08x not found"),
|
||||
keyid);
|
||||
goto fail;
|
||||
}
|
||||
/* TRANSLATORS: %08x is 32-bit key id. */
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("public key %08x not found"), keyid);
|
||||
|
||||
if (pkalgos[pk].pad (&hmpi, hval, hash, sk))
|
||||
goto fail;
|
||||
if (!*pkalgos[pk].algo)
|
||||
{
|
||||
grub_dl_load (pkalgos[pk].module);
|
||||
grub_errno = GRUB_ERR_NONE;
|
||||
}
|
||||
unsigned nbits = gcry_mpi_get_nbits (sk->mpis[1]);
|
||||
grub_dprintf ("crypt", "must be %u bits got %d bits\n", nbits,
|
||||
(int)(8 * hash->mdlen));
|
||||
|
||||
if (!*pkalgos[pk].algo)
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_SIGNATURE, N_("module `%s' isn't loaded"),
|
||||
pkalgos[pk].module);
|
||||
goto fail;
|
||||
}
|
||||
if ((*pkalgos[pk].algo)->verify (0, hmpi, mpis, sk->mpis, 0, 0))
|
||||
goto fail;
|
||||
|
||||
grub_free (context);
|
||||
grub_free (readbuf);
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
|
||||
fail:
|
||||
grub_free (context);
|
||||
grub_free (readbuf);
|
||||
if (!grub_errno)
|
||||
if (gcry_mpi_scan (&hmpi, GCRYMPI_FMT_USG, hval,
|
||||
nbits / 8 < (unsigned) hash->mdlen ? nbits / 8
|
||||
: (unsigned) hash->mdlen, 0))
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
if (!grub_crypto_pk_dsa)
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("module `%s' isn't loaded"), "gcry_dsa");
|
||||
if (grub_crypto_pk_dsa->verify (0, hmpi, mpis, sk->mpis, 0, 0))
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
grub_err_t
|
||||
@@ -1020,12 +566,10 @@ grub_cmd_trust (grub_extcmd_context_t ctxt,
|
||||
if (argc < 1)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));
|
||||
|
||||
pkf = grub_file_open (args[0],
|
||||
GRUB_FILE_TYPE_PUBLIC_KEY_TRUST
|
||||
| GRUB_FILE_TYPE_NO_DECOMPRESS
|
||||
| (ctxt->state[OPTION_SKIP_SIG].set
|
||||
? GRUB_FILE_TYPE_SKIP_SIGNATURE
|
||||
: 0));
|
||||
grub_file_filter_disable_compression ();
|
||||
if (ctxt->state[OPTION_SKIP_SIG].set)
|
||||
grub_file_filter_disable_pubkey ();
|
||||
pkf = grub_file_open (args[0]);
|
||||
if (!pkf)
|
||||
return grub_errno;
|
||||
pk = grub_load_public_key (pkf);
|
||||
@@ -1099,8 +643,8 @@ static grub_err_t
|
||||
grub_cmd_verify_signature (grub_extcmd_context_t ctxt,
|
||||
int argc, char **args)
|
||||
{
|
||||
grub_file_t f = NULL, sig = NULL;
|
||||
grub_err_t err = GRUB_ERR_NONE;
|
||||
grub_file_t f, sig;
|
||||
grub_err_t err;
|
||||
struct grub_public_key *pk = NULL;
|
||||
|
||||
grub_dprintf ("crypt", "alive\n");
|
||||
@@ -1113,12 +657,10 @@ grub_cmd_verify_signature (grub_extcmd_context_t ctxt,
|
||||
if (argc > 2)
|
||||
{
|
||||
grub_file_t pkf;
|
||||
pkf = grub_file_open (args[2],
|
||||
GRUB_FILE_TYPE_PUBLIC_KEY
|
||||
| GRUB_FILE_TYPE_NO_DECOMPRESS
|
||||
| (ctxt->state[OPTION_SKIP_SIG].set
|
||||
? GRUB_FILE_TYPE_SKIP_SIGNATURE
|
||||
: 0));
|
||||
grub_file_filter_disable_compression ();
|
||||
if (ctxt->state[OPTION_SKIP_SIG].set)
|
||||
grub_file_filter_disable_pubkey ();
|
||||
pkf = grub_file_open (args[2]);
|
||||
if (!pkf)
|
||||
return grub_errno;
|
||||
pk = grub_load_public_key (pkf);
|
||||
@@ -1130,81 +672,22 @@ grub_cmd_verify_signature (grub_extcmd_context_t ctxt,
|
||||
grub_file_close (pkf);
|
||||
}
|
||||
|
||||
f = grub_file_open (args[0], GRUB_FILE_TYPE_VERIFY_SIGNATURE);
|
||||
grub_file_filter_disable_all ();
|
||||
f = grub_file_open (args[0]);
|
||||
if (!f)
|
||||
{
|
||||
err = grub_errno;
|
||||
goto fail;
|
||||
}
|
||||
return grub_errno;
|
||||
|
||||
sig = grub_file_open (args[1],
|
||||
GRUB_FILE_TYPE_SIGNATURE
|
||||
| GRUB_FILE_TYPE_NO_DECOMPRESS);
|
||||
grub_file_filter_disable_all ();
|
||||
sig = grub_file_open (args[1]);
|
||||
if (!sig)
|
||||
{
|
||||
err = grub_errno;
|
||||
goto fail;
|
||||
grub_file_close (f);
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
err = grub_verify_signature (f, sig, pk);
|
||||
fail:
|
||||
if (sig)
|
||||
grub_file_close (sig);
|
||||
if (f)
|
||||
grub_file_close (f);
|
||||
if (pk)
|
||||
free_pk (pk);
|
||||
return err;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_cmd_verify_pe_signature (grub_extcmd_context_t ctxt,
|
||||
int argc, char **args)
|
||||
{
|
||||
grub_file_t f = NULL;
|
||||
grub_err_t err = GRUB_ERR_NONE;
|
||||
struct grub_public_key *pk = NULL;
|
||||
|
||||
grub_dprintf ("crypt", "alive\n");
|
||||
|
||||
if (argc < 1)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));
|
||||
|
||||
grub_dprintf ("crypt", "alive\n");
|
||||
|
||||
if (argc > 1)
|
||||
{
|
||||
grub_file_t pkf;
|
||||
pkf = grub_file_open (args[1],
|
||||
GRUB_FILE_TYPE_PUBLIC_KEY
|
||||
| GRUB_FILE_TYPE_NO_DECOMPRESS
|
||||
| (ctxt->state[OPTION_SKIP_SIG].set
|
||||
? GRUB_FILE_TYPE_SKIP_SIGNATURE
|
||||
: 0));
|
||||
if (!pkf)
|
||||
return grub_errno;
|
||||
pk = grub_load_public_key (pkf);
|
||||
if (!pk)
|
||||
{
|
||||
grub_file_close (pkf);
|
||||
return grub_errno;
|
||||
}
|
||||
grub_file_close (pkf);
|
||||
}
|
||||
|
||||
f = grub_file_open (args[0], GRUB_FILE_TYPE_VERIFY_SIGNATURE);
|
||||
if (!f)
|
||||
{
|
||||
err = grub_errno;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
err = grub_verify_pe_signature_real (0, 0, f, pk);
|
||||
fail:
|
||||
if (f)
|
||||
grub_file_close (f);
|
||||
if (pk)
|
||||
free_pk (pk);
|
||||
grub_file_close (f);
|
||||
grub_file_close (sig);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -1233,25 +716,33 @@ struct grub_fs verified_fs =
|
||||
};
|
||||
|
||||
static grub_file_t
|
||||
grub_pubkey_open (grub_file_t io, enum grub_file_type type)
|
||||
grub_pubkey_open (grub_file_t io, const char *filename)
|
||||
{
|
||||
grub_file_t sig;
|
||||
char *fsuf, *ptr;
|
||||
grub_err_t err;
|
||||
grub_file_filter_t curfilt[GRUB_FILE_FILTER_MAX];
|
||||
grub_file_t ret;
|
||||
|
||||
if ((type & GRUB_FILE_TYPE_MASK) == GRUB_FILE_TYPE_SIGNATURE
|
||||
|| (type & GRUB_FILE_TYPE_MASK) == GRUB_FILE_TYPE_VERIFY_SIGNATURE
|
||||
|| (type & GRUB_FILE_TYPE_SKIP_SIGNATURE))
|
||||
return io;
|
||||
|
||||
if (!sec)
|
||||
return io;
|
||||
if (io->device->disk && io->device->disk->id == GRUB_DISK_DEVICE_MEMDISK_ID)
|
||||
return io;
|
||||
fsuf = grub_malloc (grub_strlen (io->name) + sizeof (".sig"));
|
||||
fsuf = grub_malloc (grub_strlen (filename) + sizeof (".sig"));
|
||||
if (!fsuf)
|
||||
return NULL;
|
||||
ptr = grub_stpcpy (fsuf, filename);
|
||||
grub_memcpy (ptr, ".sig", sizeof (".sig"));
|
||||
|
||||
grub_memcpy (curfilt, grub_file_filters_enabled,
|
||||
sizeof (curfilt));
|
||||
grub_file_filter_disable_all ();
|
||||
sig = grub_file_open (fsuf);
|
||||
grub_memcpy (grub_file_filters_enabled, curfilt,
|
||||
sizeof (curfilt));
|
||||
grub_free (fsuf);
|
||||
if (!sig)
|
||||
return NULL;
|
||||
|
||||
ret = grub_malloc (sizeof (*ret));
|
||||
if (!ret)
|
||||
@@ -1276,30 +767,12 @@ grub_pubkey_open (grub_file_t io, enum grub_file_type type)
|
||||
{
|
||||
if (!grub_errno)
|
||||
grub_error (GRUB_ERR_FILE_READ_ERROR, N_("premature end of file %s"),
|
||||
io->name);
|
||||
filename);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ptr = grub_stpcpy (fsuf, io->name);
|
||||
grub_memcpy (ptr, ".sig", sizeof (".sig"));
|
||||
|
||||
sig = grub_file_open (fsuf, GRUB_FILE_TYPE_SIGNATURE);
|
||||
grub_free (fsuf);
|
||||
if (!sig)
|
||||
grub_errno = GRUB_ERR_NONE;
|
||||
|
||||
if (sig)
|
||||
{
|
||||
err = grub_verify_signature_real (ret->data, ret->size, 0, sig, NULL);
|
||||
grub_file_close (sig);
|
||||
if (err == GRUB_ERR_BAD_SIGNATURE)
|
||||
{
|
||||
grub_errno = GRUB_ERR_NONE;
|
||||
err = grub_verify_pe_signature_real (ret->data, ret->size, 0, 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
err = grub_verify_pe_signature_real (ret->data, ret->size, 0, 0);
|
||||
err = grub_verify_signature_real (ret->data, ret->size, 0, sig, NULL);
|
||||
grub_file_close (sig);
|
||||
if (err)
|
||||
return NULL;
|
||||
io->device = 0;
|
||||
@@ -1330,6 +803,9 @@ struct grub_fs pseudo_fs =
|
||||
.read = pseudo_read
|
||||
};
|
||||
|
||||
struct gcry_pk_spec *grub_crypto_pk_dsa;
|
||||
struct gcry_pk_spec *grub_crypto_pk_ecdsa;
|
||||
struct gcry_pk_spec *grub_crypto_pk_rsa;
|
||||
|
||||
static grub_extcmd_t cmd, cmd_trust;
|
||||
static grub_command_t cmd_distrust, cmd_list;
|
||||
@@ -1381,10 +857,6 @@ GRUB_MOD_INIT(verify)
|
||||
N_("[-s|--skip-sig] FILE SIGNATURE_FILE [PUBKEY_FILE]"),
|
||||
N_("Verify detached signature."),
|
||||
options);
|
||||
cmd = grub_register_extcmd ("verify_pe", grub_cmd_verify_pe_signature, 0,
|
||||
N_("[-s|--skip-sig] FILE [PUBKEY_FILE]"),
|
||||
N_("Verify PE signature."),
|
||||
options);
|
||||
cmd_trust = grub_register_extcmd ("trust", grub_cmd_trust, 0,
|
||||
N_("[-s|--skip-sig] PUBKEY_FILE"),
|
||||
N_("Add PKFILE to trusted keys."),
|
||||
|
||||
@@ -1,90 +0,0 @@
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2011 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GRUB is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <grub/dl.h>
|
||||
#include <grub/misc.h>
|
||||
#include <grub/command.h>
|
||||
#include <grub/i18n.h>
|
||||
#include <grub/xen.h>
|
||||
#include <grub/term.h>
|
||||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
static int
|
||||
hook (const char *dir, void *hook_data __attribute__ ((unused)))
|
||||
{
|
||||
grub_printf ("%s\n", dir);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_cmd_lsxen (grub_command_t cmd __attribute__ ((unused)),
|
||||
int argc, char **args)
|
||||
{
|
||||
char *dir;
|
||||
grub_err_t err;
|
||||
char *buf;
|
||||
|
||||
if (argc >= 1)
|
||||
return grub_xenstore_dir (args[0], hook, NULL);
|
||||
|
||||
buf = grub_xenstore_get_file ("domid", NULL);
|
||||
if (!buf)
|
||||
return grub_errno;
|
||||
dir = grub_xasprintf ("/local/domain/%s", buf);
|
||||
grub_free (buf);
|
||||
err = grub_xenstore_dir (dir, hook, NULL);
|
||||
grub_free (dir);
|
||||
return err;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_cmd_catxen (grub_command_t cmd __attribute__ ((unused)),
|
||||
int argc, char **args)
|
||||
{
|
||||
const char *dir = "domid";
|
||||
char *buf;
|
||||
|
||||
if (argc >= 1)
|
||||
dir = args[0];
|
||||
|
||||
buf = grub_xenstore_get_file (dir, NULL);
|
||||
if (!buf)
|
||||
return grub_errno;
|
||||
grub_xputs (buf);
|
||||
grub_xputs ("\n");
|
||||
grub_free (buf);
|
||||
return GRUB_ERR_NONE;
|
||||
|
||||
}
|
||||
|
||||
static grub_command_t cmd_ls, cmd_cat;
|
||||
|
||||
GRUB_MOD_INIT (lsxen)
|
||||
{
|
||||
cmd_ls = grub_register_command ("xen_ls", grub_cmd_lsxen, "[DIR]",
|
||||
N_("List XEN storage."));
|
||||
cmd_cat = grub_register_command ("xen_cat", grub_cmd_catxen, "[DIR]",
|
||||
N_("List XEN storage."));
|
||||
}
|
||||
|
||||
GRUB_MOD_FINI (lsxen)
|
||||
{
|
||||
grub_unregister_command (cmd_ls);
|
||||
grub_unregister_command (cmd_cat);
|
||||
}
|
||||
@@ -50,7 +50,7 @@ grub_cmd_xnu_uuid (grub_command_t cmd __attribute__ ((unused)),
|
||||
grub_uint8_t *xnu_uuid;
|
||||
char uuid_string[sizeof ("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")];
|
||||
char *ptr;
|
||||
void *ctx;
|
||||
grub_uint8_t ctx[GRUB_MD_MD5->contextsize];
|
||||
int low = 0;
|
||||
|
||||
if (argc < 1)
|
||||
@@ -65,14 +65,11 @@ grub_cmd_xnu_uuid (grub_command_t cmd __attribute__ ((unused)),
|
||||
|
||||
serial = grub_cpu_to_be64 (grub_strtoull (args[0], 0, 16));
|
||||
|
||||
ctx = grub_zalloc (GRUB_MD_MD5->contextsize);
|
||||
if (!ctx)
|
||||
return grub_errno;
|
||||
GRUB_MD_MD5->init (ctx);
|
||||
GRUB_MD_MD5->write (ctx, hash_prefix, sizeof (hash_prefix));
|
||||
GRUB_MD_MD5->write (ctx, &serial, sizeof (serial));
|
||||
GRUB_MD_MD5->final (ctx);
|
||||
xnu_uuid = GRUB_MD_MD5->read (ctx);
|
||||
GRUB_MD_MD5->init (&ctx);
|
||||
GRUB_MD_MD5->write (&ctx, hash_prefix, sizeof (hash_prefix));
|
||||
GRUB_MD_MD5->write (&ctx, &serial, sizeof (serial));
|
||||
GRUB_MD_MD5->final (&ctx);
|
||||
xnu_uuid = GRUB_MD_MD5->read (&ctx);
|
||||
|
||||
grub_snprintf (uuid_string, sizeof (uuid_string),
|
||||
"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
|
||||
@@ -94,8 +91,6 @@ grub_cmd_xnu_uuid (grub_command_t cmd __attribute__ ((unused)),
|
||||
if (argc > 1)
|
||||
grub_env_set (args[1], uuid_string);
|
||||
|
||||
grub_free (ctx);
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
|
||||
@@ -37,8 +37,8 @@ diffuse (const gcry_md_spec_t * hash, grub_uint8_t * src,
|
||||
|
||||
grub_size_t fullblocks = size / hash->mdlen;
|
||||
int padding = size % hash->mdlen;
|
||||
grub_uint8_t final[GRUB_CRYPTO_MAX_MDLEN];
|
||||
grub_uint8_t temp[sizeof (IV) + GRUB_CRYPTO_MAX_MDLEN];
|
||||
grub_uint8_t final[hash->mdlen];
|
||||
grub_uint8_t temp[sizeof (IV) + hash->mdlen];
|
||||
|
||||
/* hash block the whole data set with different IVs to produce
|
||||
* more than just a single data block
|
||||
@@ -76,9 +76,6 @@ AF_merge (const gcry_md_spec_t * hash, grub_uint8_t * src, grub_uint8_t * dst,
|
||||
if (bufblock == NULL)
|
||||
return GPG_ERR_OUT_OF_MEMORY;
|
||||
|
||||
if (hash->mdlen > GRUB_CRYPTO_MAX_MDLEN)
|
||||
return GPG_ERR_INV_ARG;
|
||||
|
||||
grub_memset (bufblock, 0, blocksize);
|
||||
for (i = 0; i < blocknumbers - 1; i++)
|
||||
{
|
||||
|
||||
@@ -133,7 +133,6 @@ struct grub_ahci_device
|
||||
volatile struct grub_ahci_cmd_table *command_table;
|
||||
struct grub_pci_dma_chunk *rfis;
|
||||
int present;
|
||||
int atapi;
|
||||
};
|
||||
|
||||
static grub_err_t
|
||||
@@ -617,10 +616,6 @@ grub_ahci_pciinit (grub_pci_device_t dev,
|
||||
grub_dma_free (failed_adevs[i]->rfis);
|
||||
}
|
||||
|
||||
for (i = 0; i < nports; i++)
|
||||
if (adevs[i] && (adevs[i]->hba->ports[adevs[i]->port].sig >> 16) == 0xeb14)
|
||||
adevs[i]->atapi = 1;
|
||||
|
||||
for (i = 0; i < nports; i++)
|
||||
if (adevs[i])
|
||||
{
|
||||
@@ -1080,7 +1075,6 @@ grub_ahci_open (int id, int devnum, struct grub_ata *ata)
|
||||
|
||||
ata->data = dev;
|
||||
ata->dma = 1;
|
||||
ata->atapi = dev->atapi;
|
||||
ata->maxbuffer = GRUB_AHCI_PRDT_MAX_CHUNK_LENGTH;
|
||||
ata->present = &dev->present;
|
||||
|
||||
|
||||
@@ -108,9 +108,6 @@ grub_ata_identify (struct grub_ata *dev)
|
||||
grub_uint16_t *info16;
|
||||
grub_err_t err;
|
||||
|
||||
if (dev->atapi)
|
||||
return grub_atapi_identify (dev);
|
||||
|
||||
info64 = grub_malloc (GRUB_DISK_SECTOR_SIZE);
|
||||
info32 = (grub_uint32_t *) info64;
|
||||
info16 = (grub_uint16_t *) info64;
|
||||
@@ -132,7 +129,7 @@ grub_ata_identify (struct grub_ata *dev)
|
||||
grub_free (info16);
|
||||
grub_errno = GRUB_ERR_NONE;
|
||||
if ((sts & (GRUB_ATA_STATUS_BUSY | GRUB_ATA_STATUS_DRQ
|
||||
| GRUB_ATA_STATUS_ERR)) == GRUB_ATA_STATUS_ERR
|
||||
| GRUB_ATA_STATUS_ERR)) == GRUB_ATA_STATUS_ERR
|
||||
&& (parms.taskfile.error & 0x04 /* ABRT */))
|
||||
/* Device without ATA IDENTIFY, try ATAPI. */
|
||||
return grub_atapi_identify (dev);
|
||||
@@ -288,6 +285,7 @@ grub_ata_readwrite (grub_disk_t disk, grub_disk_addr_t sector,
|
||||
|
||||
if (addressing == GRUB_ATA_LBA48 && ((sector + size) >> 28) != 0)
|
||||
{
|
||||
batch = 65536;
|
||||
if (ata->dma)
|
||||
{
|
||||
cmd = GRUB_ATA_CMD_READ_SECTORS_DMA_EXT;
|
||||
@@ -303,6 +301,10 @@ grub_ata_readwrite (grub_disk_t disk, grub_disk_addr_t sector,
|
||||
{
|
||||
if (addressing == GRUB_ATA_LBA48)
|
||||
addressing = GRUB_ATA_LBA;
|
||||
if (addressing != GRUB_ATA_CHS)
|
||||
batch = 256;
|
||||
else
|
||||
batch = 1;
|
||||
if (ata->dma)
|
||||
{
|
||||
cmd = GRUB_ATA_CMD_READ_SECTORS_DMA;
|
||||
@@ -315,10 +317,8 @@ grub_ata_readwrite (grub_disk_t disk, grub_disk_addr_t sector,
|
||||
}
|
||||
}
|
||||
|
||||
if (addressing != GRUB_ATA_CHS)
|
||||
batch = 256;
|
||||
else
|
||||
batch = 1;
|
||||
if (batch > (ata->maxbuffer >> ata->log_sector_size))
|
||||
batch = (ata->maxbuffer >> ata->log_sector_size);
|
||||
|
||||
while (nsectors < size)
|
||||
{
|
||||
@@ -366,7 +366,7 @@ grub_ata_real_open (int id, int bus)
|
||||
struct grub_ata *ata;
|
||||
grub_ata_dev_t p;
|
||||
|
||||
ata = grub_zalloc (sizeof (*ata));
|
||||
ata = grub_malloc (sizeof (*ata));
|
||||
if (!ata)
|
||||
return NULL;
|
||||
for (p = grub_ata_dev_list; p; p = p->next)
|
||||
@@ -464,10 +464,6 @@ grub_ata_open (const char *name, grub_disk_t disk)
|
||||
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "not an ATA harddisk");
|
||||
|
||||
disk->total_sectors = ata->size;
|
||||
disk->max_agglomerate = (ata->maxbuffer >> (GRUB_DISK_CACHE_BITS + GRUB_DISK_SECTOR_BITS));
|
||||
if (disk->max_agglomerate > (256U >> (GRUB_DISK_CACHE_BITS + GRUB_DISK_SECTOR_BITS - ata->log_sector_size)))
|
||||
disk->max_agglomerate = (256U >> (GRUB_DISK_CACHE_BITS + GRUB_DISK_SECTOR_BITS - ata->log_sector_size));
|
||||
|
||||
disk->log_sector_size = ata->log_sector_size;
|
||||
|
||||
disk->id = grub_make_scsi_id (id, bus, 0);
|
||||
|
||||
@@ -109,9 +109,7 @@ grub_crypto_pcbc_decrypt (grub_crypto_cipher_handle_t cipher,
|
||||
void *iv)
|
||||
{
|
||||
grub_uint8_t *inptr, *outptr, *end;
|
||||
grub_uint8_t ivt[GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE];
|
||||
if (cipher->cipher->blocksize > GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE)
|
||||
return GPG_ERR_INV_ARG;
|
||||
grub_uint8_t ivt[cipher->cipher->blocksize];
|
||||
if (!cipher->cipher->decrypt)
|
||||
return GPG_ERR_NOT_SUPPORTED;
|
||||
if (size % cipher->cipher->blocksize != 0)
|
||||
@@ -134,9 +132,7 @@ grub_crypto_pcbc_encrypt (grub_crypto_cipher_handle_t cipher,
|
||||
void *iv)
|
||||
{
|
||||
grub_uint8_t *inptr, *outptr, *end;
|
||||
grub_uint8_t ivt[GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE];
|
||||
if (cipher->cipher->blocksize > GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE)
|
||||
return GPG_ERR_INV_ARG;
|
||||
grub_uint8_t ivt[cipher->cipher->blocksize];
|
||||
if (!cipher->cipher->decrypt)
|
||||
return GPG_ERR_NOT_SUPPORTED;
|
||||
if (size % cipher->cipher->blocksize != 0)
|
||||
@@ -222,9 +218,6 @@ grub_cryptodisk_endecrypt (struct grub_cryptodisk *dev,
|
||||
grub_size_t i;
|
||||
gcry_err_code_t err;
|
||||
|
||||
if (dev->cipher->cipher->blocksize > GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE)
|
||||
return GPG_ERR_INV_ARG;
|
||||
|
||||
/* The only mode without IV. */
|
||||
if (dev->mode == GRUB_CRYPTODISK_MODE_ECB && !dev->rekey)
|
||||
return (do_encrypt ? grub_crypto_ecb_encrypt (dev->cipher, data, data, len)
|
||||
@@ -235,7 +228,7 @@ grub_cryptodisk_endecrypt (struct grub_cryptodisk *dev,
|
||||
grub_size_t sz = ((dev->cipher->cipher->blocksize
|
||||
+ sizeof (grub_uint32_t) - 1)
|
||||
/ sizeof (grub_uint32_t));
|
||||
grub_uint32_t iv[(GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE + 3) / 4];
|
||||
grub_uint32_t iv[sz];
|
||||
|
||||
if (dev->rekey)
|
||||
{
|
||||
@@ -249,7 +242,7 @@ grub_cryptodisk_endecrypt (struct grub_cryptodisk *dev,
|
||||
}
|
||||
}
|
||||
|
||||
grub_memset (iv, 0, sizeof (iv));
|
||||
grub_memset (iv, 0, sz * sizeof (iv[0]));
|
||||
switch (dev->mode_iv)
|
||||
{
|
||||
case GRUB_CRYPTODISK_MODE_IV_NULL:
|
||||
@@ -257,11 +250,9 @@ grub_cryptodisk_endecrypt (struct grub_cryptodisk *dev,
|
||||
case GRUB_CRYPTODISK_MODE_IV_BYTECOUNT64_HASH:
|
||||
{
|
||||
grub_uint64_t tmp;
|
||||
void *ctx;
|
||||
GRUB_PROPERLY_ALIGNED_ARRAY (ctx, dev->iv_hash->contextsize);
|
||||
|
||||
ctx = grub_zalloc (dev->iv_hash->contextsize);
|
||||
if (!ctx)
|
||||
return GPG_ERR_OUT_OF_MEMORY;
|
||||
grub_memset (ctx, 0, sizeof (ctx));
|
||||
|
||||
tmp = grub_cpu_to_le64 (sector << dev->log_sector_size);
|
||||
dev->iv_hash->init (ctx);
|
||||
@@ -270,7 +261,6 @@ grub_cryptodisk_endecrypt (struct grub_cryptodisk *dev,
|
||||
dev->iv_hash->final (ctx);
|
||||
|
||||
grub_memcpy (iv, dev->iv_hash->read (ctx), sizeof (iv));
|
||||
grub_free (ctx);
|
||||
}
|
||||
break;
|
||||
case GRUB_CRYPTODISK_MODE_IV_PLAIN64:
|
||||
@@ -417,9 +407,7 @@ grub_cryptodisk_setkey (grub_cryptodisk_t dev, grub_uint8_t *key, grub_size_t ke
|
||||
if (dev->mode_iv == GRUB_CRYPTODISK_MODE_IV_ESSIV)
|
||||
{
|
||||
grub_size_t essiv_keysize = dev->essiv_hash->mdlen;
|
||||
grub_uint8_t hashed_key[GRUB_CRYPTO_MAX_MDLEN];
|
||||
if (essiv_keysize > GRUB_CRYPTO_MAX_MDLEN)
|
||||
return GPG_ERR_INV_ARG;
|
||||
grub_uint8_t hashed_key[essiv_keysize];
|
||||
|
||||
grub_crypto_hash (dev->essiv_hash, hashed_key, key, keysize);
|
||||
err = grub_crypto_cipher_set_key (dev->essiv_cipher,
|
||||
@@ -529,7 +517,6 @@ grub_cryptodisk_open (const char *name, grub_disk_t disk)
|
||||
|
||||
disk->data = dev;
|
||||
disk->total_sectors = dev->total_length;
|
||||
disk->max_agglomerate = GRUB_DISK_MAX_MAX_AGGLOMERATE;
|
||||
disk->id = dev->id;
|
||||
dev->ref++;
|
||||
return GRUB_ERR_NONE;
|
||||
@@ -644,16 +631,10 @@ grub_cryptodisk_write (grub_disk_t disk, grub_disk_addr_t sector,
|
||||
return grub_crypto_gcry_error (gcry_err);
|
||||
}
|
||||
|
||||
/* Since ->write was called so disk.mod is loaded but be paranoid */
|
||||
|
||||
if (grub_disk_write_weak)
|
||||
err = grub_disk_write_weak (dev->source_disk,
|
||||
(sector << (disk->log_sector_size
|
||||
- GRUB_DISK_SECTOR_BITS))
|
||||
+ dev->offset,
|
||||
0, size << disk->log_sector_size, tmp);
|
||||
else
|
||||
err = grub_error (GRUB_ERR_BUG, "disk.mod not loaded");
|
||||
err = grub_disk_write (dev->source_disk,
|
||||
(sector << (disk->log_sector_size
|
||||
- GRUB_DISK_SECTOR_BITS)) + dev->offset,
|
||||
0, size << disk->log_sector_size, tmp);
|
||||
grub_free (tmp);
|
||||
return err;
|
||||
}
|
||||
@@ -1011,14 +992,12 @@ hex (grub_uint8_t val)
|
||||
|
||||
/* Open a file named NAME and initialize FILE. */
|
||||
static char *
|
||||
luks_script_get (grub_size_t *sz)
|
||||
luks_script_get (void)
|
||||
{
|
||||
grub_cryptodisk_t i;
|
||||
grub_size_t size = 0;
|
||||
char *ptr, *ret;
|
||||
|
||||
*sz = 0;
|
||||
|
||||
for (i = cryptodisk_list; i != NULL; i = i->next)
|
||||
if (grub_strcmp (i->modname, "luks") == 0)
|
||||
{
|
||||
@@ -1100,7 +1079,6 @@ luks_script_get (grub_size_t *sz)
|
||||
*ptr++ = '\n';
|
||||
}
|
||||
*ptr = '\0';
|
||||
*sz = ptr - ret;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
414
grub-core/disk/devmapper.c
Normal file
414
grub-core/disk/devmapper.c
Normal file
@@ -0,0 +1,414 @@
|
||||
/*
|
||||
* devmapper.c - Device mapper (w/ crypto support)
|
||||
*
|
||||
* Copyright (C) 2007 Simon Peter <dn.tlp@gmx.net>
|
||||
* Thanks to Raoul Boenisch <jkl345@gmx.net> for the initial idea.
|
||||
*/
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2003,2007 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GRUB is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <grub/types.h>
|
||||
#include <grub/misc.h>
|
||||
#include <grub/mm.h>
|
||||
#include <grub/err.h>
|
||||
#include <grub/dl.h>
|
||||
#include <grub/normal.h>
|
||||
#include <grub/extcmd.h>
|
||||
#include <grub/disk.h>
|
||||
#include <grub/crypto.h>
|
||||
|
||||
#define DEFAULT_HASH "ripemd160"
|
||||
#define DEFAULT_CIPHER "aes-cbc"
|
||||
#define MAX_KEYSIZE 64
|
||||
#define MAX_PASSPHRASE 256
|
||||
|
||||
#define MIN(a, b) (a < b ? a : b)
|
||||
|
||||
struct grub_crypto
|
||||
{
|
||||
char *devname, *source_devname;
|
||||
int has_partitions;
|
||||
grub_crypto_cipher_handle_t cipher;
|
||||
grub_disk_t srcdisk;
|
||||
int keysize;
|
||||
|
||||
struct grub_crypto *next;
|
||||
};
|
||||
|
||||
typedef struct grub_crypto *grub_crypto_t;
|
||||
|
||||
struct crypto_private
|
||||
{
|
||||
grub_crypto_t crypto;
|
||||
grub_disk_t srcdisk;
|
||||
};
|
||||
|
||||
typedef struct crypto_private *crypto_private_t;
|
||||
|
||||
static grub_crypto_t crypto_list = NULL;
|
||||
|
||||
/* Delete a registered crypto device. */
|
||||
static grub_err_t
|
||||
delete_crypto (const char *name)
|
||||
{
|
||||
grub_crypto_t dev, *prev;
|
||||
|
||||
/* Search for the device */
|
||||
for (dev = crypto_list, prev = &crypto_list; dev;
|
||||
prev = &dev->next, dev = dev->next)
|
||||
if (grub_strcmp (dev->devname, name) == 0)
|
||||
break;
|
||||
|
||||
if (!dev)
|
||||
return grub_error (GRUB_ERR_BAD_DEVICE, "Device not found");
|
||||
|
||||
/* Remove the device from the list */
|
||||
*prev = dev->next;
|
||||
grub_free (dev->devname);
|
||||
grub_free (dev->source_devname);
|
||||
grub_crypto_cipher_close (dev->cipher);
|
||||
grub_free (dev);
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
/* Hashes a passphrase into a key and stores it with cipher. */
|
||||
static gcry_err_code_t
|
||||
set_passphrase (grub_crypto_t dev, const gcry_md_spec_t *hashparams,
|
||||
const char *passphrase)
|
||||
{
|
||||
grub_uint8_t hash[MAX_KEYSIZE * 2], *key = hash;
|
||||
char *p;
|
||||
unsigned int round, i, size = dev->keysize;
|
||||
unsigned int len;
|
||||
|
||||
/* Need no passphrase if there's no key */
|
||||
if (size == 0)
|
||||
return GPG_ERR_INV_KEYLEN;
|
||||
|
||||
/* Hack to support the "none" hash */
|
||||
if (hashparams)
|
||||
len = hashparams->mdlen;
|
||||
else
|
||||
len = grub_strlen (passphrase);
|
||||
|
||||
if (size > MAX_KEYSIZE || len > MAX_KEYSIZE)
|
||||
return GPG_ERR_INV_KEYLEN;
|
||||
|
||||
p = grub_malloc (grub_strlen (passphrase) + 2 + size / len);
|
||||
if (!p)
|
||||
return grub_errno;
|
||||
|
||||
for (round = 0; size; round++, key += len, size -= len)
|
||||
{
|
||||
/* hack from hashalot to avoid null bytes in key */
|
||||
for (i = 0; i < round; i++)
|
||||
p[i] = 'A';
|
||||
|
||||
grub_strcpy (p + i, passphrase);
|
||||
|
||||
if (len > size)
|
||||
len = size;
|
||||
|
||||
grub_crypto_hash (hashparams, key, p, grub_strlen (p));
|
||||
}
|
||||
|
||||
return grub_crypto_cipher_set_key (dev->cipher, hash, size);
|
||||
}
|
||||
|
||||
/***** GRUB command line interface *****************************************/
|
||||
|
||||
|
||||
static const struct grub_arg_option options[] = {
|
||||
{"delete", 'd', 0, "delete the crypto device entry", 0, ARG_TYPE_NONE},
|
||||
{"partitions", 'p', 0, "set that the device has partitions", 0,
|
||||
ARG_TYPE_NONE},
|
||||
{"cipher", 'c', 0, "set cipher (default=" DEFAULT_CIPHER ")", 0,
|
||||
ARG_TYPE_STRING},
|
||||
{"hash", 'h', 0, "set hash function (default=" DEFAULT_HASH ")", 0,
|
||||
ARG_TYPE_STRING},
|
||||
{"passphrase", 'P', 0, "set decryption passphrase", 0, ARG_TYPE_STRING},
|
||||
{"keysize", 'k', 0, "set key size (default is cipher specific)", 0,
|
||||
ARG_TYPE_INT},
|
||||
{0, 0, 0, 0, 0, 0}
|
||||
};
|
||||
|
||||
static grub_err_t
|
||||
grub_cmd_devmap (grub_extcmd_t cmd, int argc, char **args)
|
||||
{
|
||||
grub_disk_t disk;
|
||||
grub_crypto_t newdev;
|
||||
const char *cipher, *hash;
|
||||
const gcry_md_spec_t *hashparams;
|
||||
grub_err_t err = GRUB_ERR_NONE;
|
||||
char *passphrase = "";
|
||||
/* char cmdphrase[MAX_PASSPHRASE]; */
|
||||
const gcry_cipher_spec_t *ciph;
|
||||
struct grub_arg_list *state = cmd->state;
|
||||
|
||||
if (argc < 1)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Device name required");
|
||||
|
||||
/* Check whether delete is requested */
|
||||
if (state[0].set)
|
||||
return delete_crypto (args[0]);
|
||||
|
||||
if (argc < 2)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Source device name required");
|
||||
|
||||
/*** Create device is requested ***/
|
||||
|
||||
/* Choke on already existing devices */
|
||||
for (newdev = crypto_list; newdev != NULL; newdev = newdev->next)
|
||||
if (grub_strcmp (newdev->devname, args[0]) == 0)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Device already exists");
|
||||
|
||||
/* Check whether source device can be opened */
|
||||
disk = grub_disk_open (args[1]);
|
||||
if (!disk)
|
||||
return grub_errno;
|
||||
grub_disk_close (disk);
|
||||
|
||||
/* Parse remaining options */
|
||||
if (state[2].set)
|
||||
cipher = state[2].arg;
|
||||
else
|
||||
cipher = DEFAULT_CIPHER;
|
||||
if (state[3].set)
|
||||
hash = state[3].arg;
|
||||
else
|
||||
hash = DEFAULT_HASH;
|
||||
|
||||
/* Create new device entry */
|
||||
newdev = grub_malloc (sizeof (struct grub_crypto));
|
||||
if (!newdev)
|
||||
return grub_errno;
|
||||
newdev->devname = grub_strdup (args[0]);
|
||||
if (!newdev->devname)
|
||||
{
|
||||
grub_free (newdev);
|
||||
return grub_errno;
|
||||
}
|
||||
newdev->source_devname = grub_strdup (args[1]);
|
||||
if (!newdev->source_devname)
|
||||
{
|
||||
grub_free (newdev->devname);
|
||||
grub_free (newdev);
|
||||
return grub_errno;
|
||||
}
|
||||
newdev->has_partitions = state[1].set;
|
||||
ciph = grub_crypto_lookup_cipher_by_name (cipher);
|
||||
if (!ciph)
|
||||
{
|
||||
grub_free (newdev->source_devname);
|
||||
grub_free (newdev->devname);
|
||||
grub_free (newdev);
|
||||
return grub_error (GRUB_ERR_CIPHER_NOT_FOUND, "Unknown cipher %s", hash);
|
||||
}
|
||||
newdev->cipher = grub_crypto_cipher_open (ciph);
|
||||
if (!newdev->cipher)
|
||||
{
|
||||
grub_free (newdev->source_devname);
|
||||
grub_free (newdev->devname);
|
||||
grub_free (newdev);
|
||||
return grub_errno;
|
||||
}
|
||||
hashparams = grub_crypto_lookup_md_by_name (hash);
|
||||
if (!hashparams)
|
||||
{
|
||||
grub_free (newdev->source_devname);
|
||||
grub_free (newdev->devname);
|
||||
grub_free (newdev);
|
||||
grub_crypto_cipher_close (newdev->cipher);
|
||||
return grub_error (GRUB_ERR_CIPHER_NOT_FOUND, "Unknown digest %s", hash);
|
||||
}
|
||||
newdev->srcdisk = NULL;
|
||||
if (state[5].set)
|
||||
newdev->keysize = grub_strtoul (state[5].arg, NULL, 10);
|
||||
else
|
||||
newdev->keysize = 16;
|
||||
|
||||
/* Get passphrase */
|
||||
if (state[4].set) /* Passphrase supplied on commandline */
|
||||
passphrase = state[4].arg;
|
||||
else
|
||||
{
|
||||
#if 1
|
||||
return 0;
|
||||
#else
|
||||
if (grub_strcmp (cipher, "none"))
|
||||
{
|
||||
grub_cmdline_get ("Passphrase: ", cmdphrase, MAX_PASSPHRASE, '*',
|
||||
0);
|
||||
passphrase = cmdphrase;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
err = set_passphrase (newdev, hashparams, passphrase);
|
||||
if (err)
|
||||
{
|
||||
grub_crypto_cipher_close (newdev->cipher);
|
||||
grub_free (newdev->source_devname);
|
||||
grub_free (newdev->devname);
|
||||
grub_free (newdev);
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Add new entry to list and return */
|
||||
newdev->next = crypto_list;
|
||||
crypto_list = newdev;
|
||||
|
||||
/* Error conditions */
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
/***** GRUB disk device interface ******************************************/
|
||||
|
||||
static int
|
||||
grub_crypto_iterate (int (*hook) (const char *name))
|
||||
{
|
||||
grub_crypto_t i;
|
||||
|
||||
for (i = crypto_list; i != NULL; i = i->next)
|
||||
if (hook (i->devname))
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_crypto_open (const char *name, grub_disk_t disk)
|
||||
{
|
||||
grub_crypto_t dev;
|
||||
crypto_private_t private;
|
||||
|
||||
for (dev = crypto_list; dev != NULL; dev = dev->next)
|
||||
if (grub_strcmp (dev->devname, name) == 0)
|
||||
break;
|
||||
|
||||
if (!dev)
|
||||
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "Can't open device");
|
||||
|
||||
/* Setup crypto private structure */
|
||||
if (!(private = grub_malloc (sizeof (struct crypto_private))))
|
||||
return grub_errno;
|
||||
private->crypto = dev;
|
||||
|
||||
/* Open underlying device */
|
||||
private->srcdisk = grub_disk_open (dev->source_devname);
|
||||
if (!private->srcdisk)
|
||||
{
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
/* Populate requested disk */
|
||||
disk->total_sectors = grub_disk_get_size (private->srcdisk);
|
||||
disk->id = (int) dev;
|
||||
disk->has_partitions = dev->has_partitions;
|
||||
disk->data = private;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
grub_crypto_close (grub_disk_t disk)
|
||||
{
|
||||
crypto_private_t private = (crypto_private_t) disk->data;
|
||||
|
||||
grub_disk_close (private->srcdisk);
|
||||
grub_free (private);
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_crypto_read (grub_disk_t disk, grub_disk_addr_t sector,
|
||||
grub_size_t size, char *buf)
|
||||
{
|
||||
crypto_private_t private = (crypto_private_t) disk->data;
|
||||
grub_err_t err;
|
||||
grub_crypto_cipher_handle_t cipher = private->crypto->cipher;
|
||||
grub_size_t i;
|
||||
|
||||
/* Read sectors from underlying disk */
|
||||
err =
|
||||
grub_disk_read (private->srcdisk, sector, 0,
|
||||
size << GRUB_DISK_SECTOR_BITS, buf);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/* Decrypt sectors */
|
||||
for (i = 0; i < size; i++)
|
||||
{
|
||||
grub_disk_addr_t s = grub_cpu_to_le64 (sector + i);
|
||||
grub_uint8_t iv[cipher->cipher->blocksize];
|
||||
gcry_err_code_t gcry_err;
|
||||
|
||||
/* Set IV from raw sector number (plain mode) */
|
||||
grub_memset (iv, 0, cipher->cipher->blocksize);
|
||||
grub_memcpy (iv, &s,
|
||||
MIN (sizeof (grub_disk_addr_t),
|
||||
cipher->cipher->blocksize));
|
||||
|
||||
gcry_err = grub_crypto_cbc_decrypt (cipher,
|
||||
buf + (i << GRUB_DISK_SECTOR_BITS),
|
||||
buf + (i << GRUB_DISK_SECTOR_BITS),
|
||||
GRUB_DISK_SECTOR_SIZE, iv);
|
||||
if (gcry_err)
|
||||
return grub_crypto_gcry_error (gcry_err);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_crypto_write (grub_disk_t disk __attribute ((unused)),
|
||||
grub_disk_addr_t sector __attribute ((unused)),
|
||||
grub_size_t size __attribute ((unused)),
|
||||
const char *buf __attribute ((unused)))
|
||||
{
|
||||
return GRUB_ERR_NOT_IMPLEMENTED_YET;
|
||||
}
|
||||
|
||||
static struct grub_disk_dev grub_crypto_dev = {
|
||||
.name = "crypto",
|
||||
.id = GRUB_DISK_DEVICE_DEVMAP_ID,
|
||||
.iterate = grub_crypto_iterate,
|
||||
.open = grub_crypto_open,
|
||||
.close = grub_crypto_close,
|
||||
.read = grub_crypto_read,
|
||||
.write = grub_crypto_write,
|
||||
.next = 0
|
||||
};
|
||||
|
||||
/***** GRUB module (de-)initialization *************************************/
|
||||
|
||||
static grub_extcmd_t cmd;
|
||||
|
||||
GRUB_MOD_INIT (devmapper)
|
||||
{
|
||||
cmd = grub_register_extcmd ("devmap", grub_cmd_devmap, GRUB_COMMAND_FLAG_BOTH,
|
||||
"devmap [OPTIONS...] [DEVICE] [SRC-DEV]",
|
||||
"Map one device onto another (w/ cryptography support).",
|
||||
options);
|
||||
grub_disk_dev_register (&grub_crypto_dev);
|
||||
}
|
||||
|
||||
GRUB_MOD_FINI (devmapper)
|
||||
{
|
||||
grub_unregister_extcmd (cmd);
|
||||
grub_disk_dev_unregister (&grub_crypto_dev);
|
||||
}
|
||||
@@ -445,7 +445,6 @@ grub_diskfilter_open (const char *name, grub_disk_t disk)
|
||||
disk->data = lv;
|
||||
|
||||
disk->total_sectors = lv->size;
|
||||
disk->max_agglomerate = GRUB_DISK_MAX_MAX_AGGLOMERATE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -934,7 +933,7 @@ grub_diskfilter_make_raid (grub_size_t uuidlen, char *uuid, int nmemb,
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
totsize = (nmemb - ((unsigned) level / 3U)) * disk_size;
|
||||
totsize = (nmemb - level / 3) * disk_size;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
@@ -518,8 +518,6 @@ grub_efidisk_open (const char *name, struct grub_disk *disk)
|
||||
grub_dprintf ("efidisk", "m = %p, last block = %llx, block size = %x\n",
|
||||
m, (unsigned long long) m->last_block, m->block_size);
|
||||
disk->total_sectors = m->last_block + 1;
|
||||
/* Don't increase this value due to bug in some EFI. */
|
||||
disk->max_agglomerate = 0xa0000 >> (GRUB_DISK_CACHE_BITS + GRUB_DISK_SECTOR_BITS);
|
||||
if (m->block_size & (m->block_size - 1) || !m->block_size)
|
||||
return grub_error (GRUB_ERR_IO, "invalid sector size %d",
|
||||
m->block_size);
|
||||
@@ -544,17 +542,32 @@ static grub_efi_status_t
|
||||
grub_efidisk_readwrite (struct grub_disk *disk, grub_disk_addr_t sector,
|
||||
grub_size_t size, char *buf, int wr)
|
||||
{
|
||||
/* For now, use the disk io interface rather than the block io's. */
|
||||
struct grub_efidisk_data *d;
|
||||
grub_efi_block_io_t *bio;
|
||||
grub_efi_status_t status;
|
||||
|
||||
d = disk->data;
|
||||
bio = d->block_io;
|
||||
|
||||
return efi_call_5 ((wr ? bio->write_blocks : bio->read_blocks), bio,
|
||||
bio->media->media_id,
|
||||
(grub_efi_uint64_t) sector,
|
||||
(grub_efi_uintn_t) size << disk->log_sector_size,
|
||||
buf);
|
||||
while (size > 0)
|
||||
{
|
||||
grub_size_t len;
|
||||
len = 0x500;
|
||||
if (len > size)
|
||||
len = size;
|
||||
status = efi_call_5 ((wr ? bio->write_blocks : bio->read_blocks), bio,
|
||||
bio->media->media_id,
|
||||
(grub_efi_uint64_t) sector,
|
||||
(grub_efi_uintn_t) len << disk->log_sector_size,
|
||||
buf);
|
||||
size -= len;
|
||||
buf += len << disk->log_sector_size;
|
||||
sector += len;
|
||||
if (status != GRUB_EFI_SUCCESS)
|
||||
return status;
|
||||
}
|
||||
return GRUB_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
|
||||
@@ -146,33 +146,40 @@ geli_rekey (struct grub_cryptodisk *dev, grub_uint64_t zoneno)
|
||||
grub_uint64_t zone;
|
||||
} __attribute__ ((packed)) tohash
|
||||
= { {'e', 'k', 'e', 'y'}, grub_cpu_to_le64 (zoneno) };
|
||||
GRUB_PROPERLY_ALIGNED_ARRAY (key, GRUB_CRYPTO_MAX_MDLEN);
|
||||
|
||||
if (dev->hash->mdlen > GRUB_CRYPTO_MAX_MDLEN)
|
||||
return GPG_ERR_INV_ARG;
|
||||
GRUB_PROPERLY_ALIGNED_ARRAY (key, dev->hash->mdlen);
|
||||
|
||||
grub_dprintf ("geli", "rekeying %" PRIuGRUB_UINT64_T " keysize=%d\n",
|
||||
zoneno, dev->rekey_derived_size);
|
||||
gcry_err = grub_crypto_hmac_buffer (dev->hash, dev->rekey_key, 64,
|
||||
&tohash, sizeof (tohash), key);
|
||||
if (gcry_err)
|
||||
return gcry_err;
|
||||
return grub_crypto_gcry_error (gcry_err);
|
||||
|
||||
return grub_cryptodisk_setkey (dev, (grub_uint8_t *) key,
|
||||
dev->rekey_derived_size);
|
||||
}
|
||||
|
||||
static inline int
|
||||
ascii2hex (char c)
|
||||
{
|
||||
if (c >= '0' && c <= '9')
|
||||
return c - '0';
|
||||
if (c >= 'a' && c <= 'f')
|
||||
return c - 'a' + 10;
|
||||
if (c >= 'A' && c <= 'F')
|
||||
return c - 'A' + 10;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline gcry_err_code_t
|
||||
make_uuid (const struct grub_geli_phdr *header,
|
||||
char *uuid)
|
||||
{
|
||||
grub_uint8_t uuidbin[GRUB_CRYPTODISK_MAX_UUID_LENGTH];
|
||||
grub_uint8_t uuidbin[GRUB_MD_SHA256->mdlen];
|
||||
gcry_err_code_t err;
|
||||
grub_uint8_t *iptr;
|
||||
char *optr;
|
||||
|
||||
if (2 * GRUB_MD_SHA256->mdlen + 1 > GRUB_CRYPTODISK_MAX_UUID_LENGTH)
|
||||
return GPG_ERR_TOO_LARGE;
|
||||
err = grub_crypto_hmac_buffer (GRUB_MD_SHA256,
|
||||
header->salt, sizeof (header->salt),
|
||||
"uuid", sizeof ("uuid") - 1, uuidbin);
|
||||
@@ -180,7 +187,7 @@ make_uuid (const struct grub_geli_phdr *header,
|
||||
return err;
|
||||
|
||||
optr = uuid;
|
||||
for (iptr = uuidbin; iptr < &uuidbin[GRUB_MD_SHA256->mdlen]; iptr++)
|
||||
for (iptr = uuidbin; iptr < &uuidbin[ARRAY_SIZE (uuidbin)]; iptr++)
|
||||
{
|
||||
grub_snprintf (optr, 3, "%02x", *iptr);
|
||||
optr += 2;
|
||||
@@ -247,13 +254,10 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid,
|
||||
const struct gcry_cipher_spec *ciph;
|
||||
const char *ciphername = NULL;
|
||||
gcry_err_code_t gcry_err;
|
||||
char uuid[GRUB_CRYPTODISK_MAX_UUID_LENGTH];
|
||||
char uuid[GRUB_MD_SHA256->mdlen * 2 + 1];
|
||||
grub_disk_addr_t sector;
|
||||
grub_err_t err;
|
||||
|
||||
if (2 * GRUB_MD_SHA256->mdlen + 1 > GRUB_CRYPTODISK_MAX_UUID_LENGTH)
|
||||
return NULL;
|
||||
|
||||
sector = grub_disk_get_size (disk);
|
||||
if (sector == GRUB_DISK_SIZE_UNKNOWN || sector == 0)
|
||||
return NULL;
|
||||
@@ -387,10 +391,10 @@ static grub_err_t
|
||||
recover_key (grub_disk_t source, grub_cryptodisk_t dev)
|
||||
{
|
||||
grub_size_t keysize;
|
||||
grub_uint8_t digest[GRUB_CRYPTO_MAX_MDLEN];
|
||||
grub_uint8_t geomkey[GRUB_CRYPTO_MAX_MDLEN];
|
||||
grub_uint8_t verify_key[GRUB_CRYPTO_MAX_MDLEN];
|
||||
grub_uint8_t zero[GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE];
|
||||
grub_uint8_t digest[dev->hash->mdlen];
|
||||
grub_uint8_t geomkey[dev->hash->mdlen];
|
||||
grub_uint8_t verify_key[dev->hash->mdlen];
|
||||
grub_uint8_t zero[dev->cipher->cipher->blocksize];
|
||||
char passphrase[MAX_PASSPHRASE] = "";
|
||||
unsigned i;
|
||||
gcry_err_code_t gcry_err;
|
||||
@@ -399,12 +403,6 @@ recover_key (grub_disk_t source, grub_cryptodisk_t dev)
|
||||
grub_disk_addr_t sector;
|
||||
grub_err_t err;
|
||||
|
||||
if (dev->cipher->cipher->blocksize > GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE)
|
||||
return grub_error (GRUB_ERR_BUG, "cipher block is too long");
|
||||
|
||||
if (dev->hash->mdlen > GRUB_CRYPTO_MAX_MDLEN)
|
||||
return grub_error (GRUB_ERR_BUG, "mdlen is too long");
|
||||
|
||||
sector = grub_disk_get_size (source);
|
||||
if (sector == GRUB_DISK_SIZE_UNKNOWN || sector == 0)
|
||||
return grub_error (GRUB_ERR_BUG, "not a geli");
|
||||
@@ -466,12 +464,12 @@ recover_key (grub_disk_t source, grub_cryptodisk_t dev)
|
||||
}
|
||||
|
||||
gcry_err = grub_crypto_hmac_buffer (dev->hash, geomkey,
|
||||
dev->hash->mdlen, "\1", 1, digest);
|
||||
sizeof (geomkey), "\1", 1, digest);
|
||||
if (gcry_err)
|
||||
return grub_crypto_gcry_error (gcry_err);
|
||||
|
||||
gcry_err = grub_crypto_hmac_buffer (dev->hash, geomkey,
|
||||
dev->hash->mdlen, "\0", 1, verify_key);
|
||||
sizeof (geomkey), "\0", 1, verify_key);
|
||||
if (gcry_err)
|
||||
return grub_crypto_gcry_error (gcry_err);
|
||||
|
||||
@@ -481,7 +479,7 @@ recover_key (grub_disk_t source, grub_cryptodisk_t dev)
|
||||
for (i = 0; i < ARRAY_SIZE (header.keys); i++)
|
||||
{
|
||||
struct grub_geli_key candidate_key;
|
||||
grub_uint8_t key_hmac[GRUB_CRYPTO_MAX_MDLEN];
|
||||
grub_uint8_t key_hmac[dev->hash->mdlen];
|
||||
|
||||
/* Check if keyslot is enabled. */
|
||||
if (! (header.keys_used & (1 << i)))
|
||||
@@ -502,7 +500,7 @@ recover_key (grub_disk_t source, grub_cryptodisk_t dev)
|
||||
return grub_crypto_gcry_error (gcry_err);
|
||||
|
||||
gcry_err = grub_crypto_hmac_buffer (dev->hash, verify_key,
|
||||
dev->hash->mdlen,
|
||||
sizeof (verify_key),
|
||||
&candidate_key,
|
||||
(sizeof (candidate_key)
|
||||
- sizeof (candidate_key.hmac)),
|
||||
|
||||
@@ -20,13 +20,9 @@
|
||||
/* When using the disk, make a reference to this module. Otherwise
|
||||
the user will end up with a useless module :-). */
|
||||
|
||||
#include <config.h>
|
||||
#include <config-util.h>
|
||||
|
||||
#include <grub/dl.h>
|
||||
#include <grub/disk.h>
|
||||
#include <grub/misc.h>
|
||||
#include <grub/emu/hostdisk.h>
|
||||
|
||||
int grub_disk_host_i_want_a_reference;
|
||||
|
||||
|
||||
@@ -424,9 +424,6 @@ grub_biosdisk_open (const char *name, grub_disk_t disk)
|
||||
}
|
||||
|
||||
disk->total_sectors = total_sectors;
|
||||
/* Limit the max to 0x7f because of Phoenix EDD. */
|
||||
disk->max_agglomerate = 0x7f >> GRUB_DISK_CACHE_BITS;
|
||||
|
||||
disk->data = data;
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
@@ -551,6 +548,10 @@ get_safe_sectors (grub_disk_t disk, grub_disk_addr_t sector)
|
||||
|
||||
size = sectors - offset;
|
||||
|
||||
/* Limit the max to 0x7f because of Phoenix EDD. */
|
||||
if (size > ((0x7fU << GRUB_DISK_SECTOR_BITS) >> disk->log_sector_size))
|
||||
size = ((0x7fU << GRUB_DISK_SECTOR_BITS) >> disk->log_sector_size);
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
|
||||
@@ -90,8 +90,7 @@ grub_cmd_loopback (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
if (argc < 2)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
||||
|
||||
file = grub_file_open (args[1], GRUB_FILE_TYPE_LOOPBACK
|
||||
| GRUB_FILE_TYPE_NO_DECOMPRESS);
|
||||
file = grub_file_open (args[1]);
|
||||
if (! file)
|
||||
return grub_errno;
|
||||
|
||||
@@ -168,10 +167,6 @@ grub_loopback_open (const char *name, grub_disk_t disk)
|
||||
/ GRUB_DISK_SECTOR_SIZE);
|
||||
else
|
||||
disk->total_sectors = GRUB_DISK_SIZE_UNKNOWN;
|
||||
/* Avoid reading more than 512M. */
|
||||
disk->max_agglomerate = 1 << (29 - GRUB_DISK_SECTOR_BITS
|
||||
- GRUB_DISK_CACHE_BITS);
|
||||
|
||||
disk->id = (unsigned long) dev;
|
||||
|
||||
disk->data = dev;
|
||||
|
||||
@@ -316,8 +316,6 @@ luks_recover_key (grub_disk_t source,
|
||||
|
||||
grub_puts_ (N_("Attempting to decrypt master key..."));
|
||||
keysize = grub_be_to_cpu32 (header.keyBytes);
|
||||
if (keysize > GRUB_CRYPTODISK_MAX_KEYLEN)
|
||||
return grub_error (GRUB_ERR_BAD_FS, "key is too long");
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE (header.keyblock); i++)
|
||||
if (grub_be_to_cpu32 (header.keyblock[i].active) == LUKS_KEY_ENABLED
|
||||
@@ -346,8 +344,8 @@ luks_recover_key (grub_disk_t source,
|
||||
for (i = 0; i < ARRAY_SIZE (header.keyblock); i++)
|
||||
{
|
||||
gcry_err_code_t gcry_err;
|
||||
grub_uint8_t candidate_key[GRUB_CRYPTODISK_MAX_KEYLEN];
|
||||
grub_uint8_t digest[GRUB_CRYPTODISK_MAX_KEYLEN];
|
||||
grub_uint8_t candidate_key[keysize];
|
||||
grub_uint8_t digest[keysize];
|
||||
|
||||
/* Check if keyslot is enabled. */
|
||||
if (grub_be_to_cpu32 (header.keyblock[i].active) != LUKS_KEY_ENABLED)
|
||||
|
||||
@@ -184,10 +184,9 @@ grub_mdraid_detect (grub_disk_t disk,
|
||||
{
|
||||
grub_disk_addr_t sector;
|
||||
grub_uint64_t size;
|
||||
struct grub_raid_super_09 *sb = NULL;
|
||||
struct grub_raid_super_09 sb;
|
||||
grub_uint32_t *uuid;
|
||||
grub_uint32_t level;
|
||||
struct grub_diskfilter_vg *ret;
|
||||
|
||||
/* The sector where the mdraid 0.90 superblock is stored, if available. */
|
||||
size = grub_disk_get_size (disk);
|
||||
@@ -196,31 +195,27 @@ grub_mdraid_detect (grub_disk_t disk,
|
||||
return NULL;
|
||||
sector = NEW_SIZE_SECTORS (size);
|
||||
|
||||
sb = grub_malloc (sizeof (*sb));
|
||||
if (!sb)
|
||||
if (grub_disk_read (disk, sector, 0, SB_BYTES, &sb))
|
||||
return NULL;
|
||||
|
||||
if (grub_disk_read (disk, sector, 0, SB_BYTES, sb))
|
||||
goto fail;
|
||||
|
||||
/* Look whether there is a mdraid 0.90 superblock. */
|
||||
if (sb->md_magic != grub_cpu_to_md32_compile_time (SB_MAGIC))
|
||||
if (sb.md_magic != grub_cpu_to_md32_compile_time (SB_MAGIC))
|
||||
/* not 0.9x raid. */
|
||||
goto fail;
|
||||
return NULL;
|
||||
|
||||
if (sb->major_version != grub_cpu_to_md32_compile_time (0)
|
||||
|| sb->minor_version != grub_cpu_to_md32_compile_time (90))
|
||||
if (sb.major_version != grub_cpu_to_md32_compile_time (0)
|
||||
|| sb.minor_version != grub_cpu_to_md32_compile_time (90))
|
||||
/* Unsupported version. */
|
||||
goto fail;
|
||||
return NULL;
|
||||
|
||||
/* No need for explicit check that sb->size is 0 (unspecified) since
|
||||
/* No need for explicit check that sb.size is 0 (unspecified) since
|
||||
0 >= non-0 is false. */
|
||||
if (((grub_disk_addr_t) grub_md_to_cpu32 (sb->size)) * 2 >= size)
|
||||
goto fail;
|
||||
if (((grub_disk_addr_t) grub_md_to_cpu32 (sb.size)) * 2 >= size)
|
||||
return NULL;
|
||||
|
||||
/* FIXME: Check the checksum. */
|
||||
|
||||
level = grub_md_to_cpu32 (sb->level);
|
||||
level = grub_md_to_cpu32 (sb.level);
|
||||
/* Multipath. */
|
||||
if ((int) level == -4)
|
||||
level = 1;
|
||||
@@ -230,43 +225,37 @@ grub_mdraid_detect (grub_disk_t disk,
|
||||
{
|
||||
grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
|
||||
"unsupported RAID level: %d", level);
|
||||
goto fail;
|
||||
return NULL;
|
||||
}
|
||||
if (grub_md_to_cpu32 (sb->this_disk.number) == 0xffff
|
||||
|| grub_md_to_cpu32 (sb->this_disk.number) == 0xfffe)
|
||||
if (grub_md_to_cpu32 (sb.this_disk.number) == 0xffff
|
||||
|| grub_md_to_cpu32 (sb.this_disk.number) == 0xfffe)
|
||||
/* Spares aren't implemented. */
|
||||
goto fail;
|
||||
return NULL;
|
||||
|
||||
uuid = grub_malloc (16);
|
||||
if (!uuid)
|
||||
goto fail;
|
||||
return NULL;
|
||||
|
||||
uuid[0] = grub_swap_bytes32 (sb->set_uuid0);
|
||||
uuid[1] = grub_swap_bytes32 (sb->set_uuid1);
|
||||
uuid[2] = grub_swap_bytes32 (sb->set_uuid2);
|
||||
uuid[3] = grub_swap_bytes32 (sb->set_uuid3);
|
||||
uuid[0] = grub_swap_bytes32 (sb.set_uuid0);
|
||||
uuid[1] = grub_swap_bytes32 (sb.set_uuid1);
|
||||
uuid[2] = grub_swap_bytes32 (sb.set_uuid2);
|
||||
uuid[3] = grub_swap_bytes32 (sb.set_uuid3);
|
||||
|
||||
*start_sector = 0;
|
||||
|
||||
id->uuidlen = 0;
|
||||
id->id = grub_md_to_cpu32 (sb->this_disk.number);
|
||||
id->id = grub_md_to_cpu32 (sb.this_disk.number);
|
||||
|
||||
char buf[32];
|
||||
grub_snprintf (buf, sizeof (buf), "md%d", grub_md_to_cpu32 (sb->md_minor));
|
||||
ret = grub_diskfilter_make_raid (16, (char *) uuid,
|
||||
grub_md_to_cpu32 (sb->raid_disks), buf,
|
||||
(sb->size) ? ((grub_disk_addr_t)
|
||||
grub_md_to_cpu32 (sb->size)) * 2
|
||||
: sector,
|
||||
grub_md_to_cpu32 (sb->chunk_size) >> 9,
|
||||
grub_md_to_cpu32 (sb->layout),
|
||||
level);
|
||||
grub_free (sb);
|
||||
return ret;
|
||||
|
||||
fail:
|
||||
grub_free (sb);
|
||||
return NULL;
|
||||
grub_snprintf (buf, sizeof (buf), "md%d", grub_md_to_cpu32 (sb.md_minor));
|
||||
return grub_diskfilter_make_raid (16, (char *) uuid,
|
||||
grub_md_to_cpu32 (sb.raid_disks), buf,
|
||||
(sb.size) ? ((grub_disk_addr_t)
|
||||
grub_md_to_cpu32 (sb.size)) * 2
|
||||
: sector,
|
||||
grub_md_to_cpu32 (sb.chunk_size) >> 9,
|
||||
grub_md_to_cpu32 (sb.layout),
|
||||
level);
|
||||
}
|
||||
|
||||
static struct grub_diskfilter grub_mdraid_dev = {
|
||||
|
||||
@@ -46,7 +46,6 @@ grub_memdisk_open (const char *name, grub_disk_t disk)
|
||||
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "not a memdisk");
|
||||
|
||||
disk->total_sectors = memdisk_size / GRUB_DISK_SECTOR_SIZE;
|
||||
disk->max_agglomerate = GRUB_DISK_MAX_MAX_AGGLOMERATE;
|
||||
disk->id = (unsigned long) "mdsk";
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
|
||||
@@ -606,13 +606,6 @@ grub_scsi_open (const char *name, grub_disk_t disk)
|
||||
}
|
||||
|
||||
disk->total_sectors = scsi->last_block + 1;
|
||||
/* PATA doesn't support more than 32K reads.
|
||||
Not sure about AHCI and USB. If it's confirmed that either of
|
||||
them can do bigger reads reliably this value can be moved to 'scsi'
|
||||
structure. */
|
||||
disk->max_agglomerate = 32768 >> (GRUB_DISK_SECTOR_BITS
|
||||
+ GRUB_DISK_CACHE_BITS);
|
||||
|
||||
if (scsi->blocksize & (scsi->blocksize - 1) || !scsi->blocksize)
|
||||
{
|
||||
grub_free (scsi);
|
||||
@@ -654,27 +647,40 @@ grub_scsi_read (grub_disk_t disk, grub_disk_addr_t sector,
|
||||
|
||||
scsi = disk->data;
|
||||
|
||||
grub_err_t err;
|
||||
/* Depending on the type, select a read function. */
|
||||
switch (scsi->devtype)
|
||||
while (size)
|
||||
{
|
||||
case grub_scsi_devtype_direct:
|
||||
if (sector >> 32)
|
||||
err = grub_scsi_read16 (disk, sector, size, buf);
|
||||
else
|
||||
err = grub_scsi_read10 (disk, sector, size, buf);
|
||||
if (err)
|
||||
return err;
|
||||
break;
|
||||
/* PATA doesn't support more than 32K reads.
|
||||
Not sure about AHCI and USB. If it's confirmed that either of
|
||||
them can do bigger reads reliably this value can be moved to 'scsi'
|
||||
structure. */
|
||||
grub_size_t len = 32768 >> disk->log_sector_size;
|
||||
grub_err_t err;
|
||||
if (len > size)
|
||||
len = size;
|
||||
/* Depending on the type, select a read function. */
|
||||
switch (scsi->devtype)
|
||||
{
|
||||
case grub_scsi_devtype_direct:
|
||||
if (sector >> 32)
|
||||
err = grub_scsi_read16 (disk, sector, len, buf);
|
||||
else
|
||||
err = grub_scsi_read10 (disk, sector, len, buf);
|
||||
if (err)
|
||||
return err;
|
||||
break;
|
||||
|
||||
case grub_scsi_devtype_cdrom:
|
||||
if (sector >> 32)
|
||||
err = grub_scsi_read16 (disk, sector, size, buf);
|
||||
else
|
||||
err = grub_scsi_read12 (disk, sector, size, buf);
|
||||
if (err)
|
||||
return err;
|
||||
break;
|
||||
case grub_scsi_devtype_cdrom:
|
||||
if (sector >> 32)
|
||||
err = grub_scsi_read16 (disk, sector, len, buf);
|
||||
else
|
||||
err = grub_scsi_read12 (disk, sector, len, buf);
|
||||
if (err)
|
||||
return err;
|
||||
break;
|
||||
}
|
||||
size -= len;
|
||||
sector += len;
|
||||
buf += len << disk->log_sector_size;
|
||||
}
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
@@ -712,10 +718,10 @@ grub_scsi_read (grub_disk_t disk, grub_disk_addr_t sector,
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_scsi_write (grub_disk_t disk,
|
||||
grub_disk_addr_t sector,
|
||||
grub_size_t size,
|
||||
const char *buf)
|
||||
grub_scsi_write (grub_disk_t disk __attribute((unused)),
|
||||
grub_disk_addr_t sector __attribute((unused)),
|
||||
grub_size_t size __attribute((unused)),
|
||||
const char *buf __attribute((unused)))
|
||||
{
|
||||
grub_scsi_t scsi;
|
||||
|
||||
@@ -724,18 +730,31 @@ grub_scsi_write (grub_disk_t disk,
|
||||
if (scsi->devtype == grub_scsi_devtype_cdrom)
|
||||
return grub_error (GRUB_ERR_IO, N_("cannot write to CD-ROM"));
|
||||
|
||||
grub_err_t err;
|
||||
/* Depending on the type, select a read function. */
|
||||
switch (scsi->devtype)
|
||||
while (size)
|
||||
{
|
||||
case grub_scsi_devtype_direct:
|
||||
if (sector >> 32)
|
||||
err = grub_scsi_write16 (disk, sector, size, buf);
|
||||
else
|
||||
err = grub_scsi_write10 (disk, sector, size, buf);
|
||||
if (err)
|
||||
return err;
|
||||
break;
|
||||
/* PATA doesn't support more than 32K reads.
|
||||
Not sure about AHCI and USB. If it's confirmed that either of
|
||||
them can do bigger reads reliably this value can be moved to 'scsi'
|
||||
structure. */
|
||||
grub_size_t len = 32768 >> disk->log_sector_size;
|
||||
grub_err_t err;
|
||||
if (len > size)
|
||||
len = size;
|
||||
/* Depending on the type, select a read function. */
|
||||
switch (scsi->devtype)
|
||||
{
|
||||
case grub_scsi_devtype_direct:
|
||||
if (sector >> 32)
|
||||
err = grub_scsi_write16 (disk, sector, len, buf);
|
||||
else
|
||||
err = grub_scsi_write10 (disk, sector, len, buf);
|
||||
if (err)
|
||||
return err;
|
||||
break;
|
||||
}
|
||||
size -= len;
|
||||
sector += len;
|
||||
buf += len << disk->log_sector_size;
|
||||
}
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
|
||||
@@ -47,7 +47,6 @@ grub_ubootdisk_register (struct device_info *newdev)
|
||||
{
|
||||
case DT_STOR_IDE:
|
||||
case DT_STOR_SATA:
|
||||
case DT_STOR_SCSI:
|
||||
case DT_STOR_MMC:
|
||||
case DT_STOR_USB:
|
||||
/* hd */
|
||||
|
||||
@@ -76,7 +76,7 @@ typedef struct grub_usbms_dev *grub_usbms_dev_t;
|
||||
static grub_usbms_dev_t grub_usbms_devices[MAX_USBMS_DEVICES];
|
||||
static int first_available_slot = 0;
|
||||
|
||||
static grub_usb_err_t
|
||||
static grub_err_t
|
||||
grub_usbms_cbi_cmd (grub_usb_device_t dev, int interface,
|
||||
grub_uint8_t *cbicb)
|
||||
{
|
||||
@@ -86,7 +86,7 @@ grub_usbms_cbi_cmd (grub_usb_device_t dev, int interface,
|
||||
GRUB_USBMS_CBI_CMD_SIZE, (char*)cbicb);
|
||||
}
|
||||
|
||||
static grub_usb_err_t
|
||||
static grub_err_t
|
||||
grub_usbms_cbi_reset (grub_usb_device_t dev, int interface)
|
||||
{
|
||||
/* Prepare array with Command Block Reset (=CBR) */
|
||||
@@ -108,13 +108,17 @@ grub_usbms_cbi_reset (grub_usb_device_t dev, int interface)
|
||||
return grub_usbms_cbi_cmd (dev, interface, (grub_uint8_t *)&cbicb);
|
||||
}
|
||||
|
||||
static grub_usb_err_t
|
||||
static grub_err_t
|
||||
grub_usbms_bo_reset (grub_usb_device_t dev, int interface)
|
||||
{
|
||||
return grub_usb_control_msg (dev, 0x21, 255, 0, interface, 0, 0);
|
||||
grub_usb_err_t u;
|
||||
u = grub_usb_control_msg (dev, 0x21, 255, 0, interface, 0, 0);
|
||||
if (u)
|
||||
return grub_error (GRUB_ERR_IO, "USB error %d", u);
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static grub_usb_err_t
|
||||
static grub_err_t
|
||||
grub_usbms_reset (grub_usbms_dev_t dev)
|
||||
{
|
||||
if (dev->protocol == GRUB_USBMS_PROTOCOL_BULK)
|
||||
@@ -145,7 +149,7 @@ grub_usbms_attach (grub_usb_device_t usbdev, int configno, int interfno)
|
||||
int j;
|
||||
grub_uint8_t luns = 0;
|
||||
unsigned curnum;
|
||||
grub_usb_err_t err = GRUB_USB_ERR_NONE;
|
||||
grub_usb_err_t err = GRUB_ERR_NONE;
|
||||
|
||||
grub_boot_time ("Attaching USB mass storage");
|
||||
|
||||
@@ -567,11 +571,8 @@ grub_usbms_transfer_cbi (struct grub_scsi *scsi, grub_size_t cmdsize, char *cmd,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (err)
|
||||
return grub_error (GRUB_ERR_IO, "USB error %d", err);
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,458 +0,0 @@
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GRUB is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <grub/disk.h>
|
||||
#include <grub/dl.h>
|
||||
#include <grub/mm.h>
|
||||
#include <grub/types.h>
|
||||
#include <grub/misc.h>
|
||||
#include <grub/err.h>
|
||||
#include <grub/term.h>
|
||||
#include <grub/i18n.h>
|
||||
#include <grub/xen.h>
|
||||
#include <grub/time.h>
|
||||
#include <xen/io/blkif.h>
|
||||
|
||||
struct virtdisk
|
||||
{
|
||||
int handle;
|
||||
char *fullname;
|
||||
char *backend_dir;
|
||||
char *frontend_dir;
|
||||
struct blkif_sring *shared_page;
|
||||
struct blkif_front_ring ring;
|
||||
grub_xen_grant_t grant;
|
||||
grub_xen_evtchn_t evtchn;
|
||||
void *dma_page;
|
||||
grub_xen_grant_t dma_grant;
|
||||
};
|
||||
|
||||
#define xen_wmb() mb()
|
||||
#define xen_mb() mb()
|
||||
|
||||
static struct virtdisk *virtdisks;
|
||||
static grub_size_t vdiskcnt;
|
||||
|
||||
static int
|
||||
grub_virtdisk_iterate (grub_disk_dev_iterate_hook_t hook, void *hook_data,
|
||||
grub_disk_pull_t pull)
|
||||
{
|
||||
grub_size_t i;
|
||||
|
||||
if (pull != GRUB_DISK_PULL_NONE)
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < vdiskcnt; i++)
|
||||
if (hook (virtdisks[i].fullname, hook_data))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_virtdisk_open (const char *name, grub_disk_t disk)
|
||||
{
|
||||
grub_size_t i;
|
||||
grub_uint32_t secsize;
|
||||
char fdir[200];
|
||||
char *buf;
|
||||
|
||||
for (i = 0; i < vdiskcnt; i++)
|
||||
if (grub_strcmp (name, virtdisks[i].fullname) == 0)
|
||||
break;
|
||||
if (i == vdiskcnt)
|
||||
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "not a virtdisk");
|
||||
disk->data = &virtdisks[i];
|
||||
disk->id = i;
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "%s/sectors", virtdisks[i].backend_dir);
|
||||
buf = grub_xenstore_get_file (fdir, NULL);
|
||||
if (!buf)
|
||||
return grub_errno;
|
||||
disk->total_sectors = grub_strtoull (buf, 0, 10);
|
||||
if (grub_errno)
|
||||
return grub_errno;
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "%s/sector-size",
|
||||
virtdisks[i].backend_dir);
|
||||
buf = grub_xenstore_get_file (fdir, NULL);
|
||||
if (!buf)
|
||||
return grub_errno;
|
||||
secsize = grub_strtoull (buf, 0, 10);
|
||||
if (grub_errno)
|
||||
return grub_errno;
|
||||
|
||||
if ((secsize & (secsize - 1)) || !secsize || secsize < 512
|
||||
|| secsize > GRUB_XEN_PAGE_SIZE)
|
||||
return grub_error (GRUB_ERR_IO, "unsupported sector size %d", secsize);
|
||||
|
||||
for (disk->log_sector_size = 0;
|
||||
(1U << disk->log_sector_size) < secsize; disk->log_sector_size++);
|
||||
|
||||
disk->total_sectors >>= disk->log_sector_size - 9;
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static void
|
||||
grub_virtdisk_close (grub_disk_t disk __attribute__ ((unused)))
|
||||
{
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_virtdisk_read (grub_disk_t disk, grub_disk_addr_t sector,
|
||||
grub_size_t size, char *buf)
|
||||
{
|
||||
struct virtdisk *data = disk->data;
|
||||
|
||||
while (size)
|
||||
{
|
||||
grub_size_t cur;
|
||||
struct blkif_request *req;
|
||||
struct blkif_response *resp;
|
||||
int sta = 0;
|
||||
struct evtchn_send send;
|
||||
cur = size;
|
||||
if (cur > (unsigned) (GRUB_XEN_PAGE_SIZE >> disk->log_sector_size))
|
||||
cur = GRUB_XEN_PAGE_SIZE >> disk->log_sector_size;
|
||||
while (RING_FULL (&data->ring))
|
||||
grub_xen_sched_op (SCHEDOP_yield, 0);
|
||||
req = RING_GET_REQUEST (&data->ring, data->ring.req_prod_pvt);
|
||||
req->operation = BLKIF_OP_READ;
|
||||
req->nr_segments = 1;
|
||||
req->handle = data->handle;
|
||||
req->id = 0;
|
||||
req->sector_number = sector << (disk->log_sector_size - 9);
|
||||
req->seg[0].gref = data->dma_grant;
|
||||
req->seg[0].first_sect = 0;
|
||||
req->seg[0].last_sect = (cur << (disk->log_sector_size - 9)) - 1;
|
||||
data->ring.req_prod_pvt++;
|
||||
RING_PUSH_REQUESTS (&data->ring);
|
||||
mb ();
|
||||
send.port = data->evtchn;
|
||||
grub_xen_event_channel_op (EVTCHNOP_send, &send);
|
||||
|
||||
while (!RING_HAS_UNCONSUMED_RESPONSES (&data->ring))
|
||||
{
|
||||
grub_xen_sched_op (SCHEDOP_yield, 0);
|
||||
mb ();
|
||||
}
|
||||
while (1)
|
||||
{
|
||||
int wtd;
|
||||
RING_FINAL_CHECK_FOR_RESPONSES (&data->ring, wtd);
|
||||
if (!wtd)
|
||||
break;
|
||||
resp = RING_GET_RESPONSE (&data->ring, data->ring.rsp_cons);
|
||||
data->ring.rsp_cons++;
|
||||
if (resp->status)
|
||||
sta = resp->status;
|
||||
}
|
||||
if (sta)
|
||||
return grub_error (GRUB_ERR_IO, "read failed");
|
||||
grub_memcpy (buf, data->dma_page, cur << disk->log_sector_size);
|
||||
size -= cur;
|
||||
sector += cur;
|
||||
buf += cur << disk->log_sector_size;
|
||||
}
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_virtdisk_write (grub_disk_t disk, grub_disk_addr_t sector,
|
||||
grub_size_t size, const char *buf)
|
||||
{
|
||||
struct virtdisk *data = disk->data;
|
||||
|
||||
while (size)
|
||||
{
|
||||
grub_size_t cur;
|
||||
struct blkif_request *req;
|
||||
struct blkif_response *resp;
|
||||
int sta = 0;
|
||||
struct evtchn_send send;
|
||||
cur = size;
|
||||
if (cur > (unsigned) (GRUB_XEN_PAGE_SIZE >> disk->log_sector_size))
|
||||
cur = GRUB_XEN_PAGE_SIZE >> disk->log_sector_size;
|
||||
|
||||
grub_memcpy (data->dma_page, buf, cur << disk->log_sector_size);
|
||||
|
||||
while (RING_FULL (&data->ring))
|
||||
grub_xen_sched_op (SCHEDOP_yield, 0);
|
||||
req = RING_GET_REQUEST (&data->ring, data->ring.req_prod_pvt);
|
||||
req->operation = BLKIF_OP_WRITE;
|
||||
req->nr_segments = 1;
|
||||
req->handle = data->handle;
|
||||
req->id = 0;
|
||||
req->sector_number = sector << (disk->log_sector_size - 9);
|
||||
req->seg[0].gref = data->dma_grant;
|
||||
req->seg[0].first_sect = 0;
|
||||
req->seg[0].last_sect = (cur << (disk->log_sector_size - 9)) - 1;
|
||||
data->ring.req_prod_pvt++;
|
||||
RING_PUSH_REQUESTS (&data->ring);
|
||||
mb ();
|
||||
send.port = data->evtchn;
|
||||
grub_xen_event_channel_op (EVTCHNOP_send, &send);
|
||||
|
||||
while (!RING_HAS_UNCONSUMED_RESPONSES (&data->ring))
|
||||
{
|
||||
grub_xen_sched_op (SCHEDOP_yield, 0);
|
||||
mb ();
|
||||
}
|
||||
while (1)
|
||||
{
|
||||
int wtd;
|
||||
RING_FINAL_CHECK_FOR_RESPONSES (&data->ring, wtd);
|
||||
if (!wtd)
|
||||
break;
|
||||
resp = RING_GET_RESPONSE (&data->ring, data->ring.rsp_cons);
|
||||
data->ring.rsp_cons++;
|
||||
if (resp->status)
|
||||
sta = resp->status;
|
||||
}
|
||||
if (sta)
|
||||
return grub_error (GRUB_ERR_IO, "write failed");
|
||||
size -= cur;
|
||||
sector += cur;
|
||||
buf += cur << disk->log_sector_size;
|
||||
}
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static struct grub_disk_dev grub_virtdisk_dev = {
|
||||
.name = "xen",
|
||||
.id = GRUB_DISK_DEVICE_XEN,
|
||||
.iterate = grub_virtdisk_iterate,
|
||||
.open = grub_virtdisk_open,
|
||||
.close = grub_virtdisk_close,
|
||||
.read = grub_virtdisk_read,
|
||||
.write = grub_virtdisk_write,
|
||||
.next = 0
|
||||
};
|
||||
|
||||
static int
|
||||
count (const char *dir __attribute__ ((unused)), void *data)
|
||||
{
|
||||
grub_size_t *ctr = data;
|
||||
(*ctr)++;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
fill (const char *dir, void *data)
|
||||
{
|
||||
grub_size_t *ctr = data;
|
||||
domid_t dom;
|
||||
/* "dir" is just a number, at most 19 characters. */
|
||||
char fdir[200];
|
||||
char num[20];
|
||||
grub_err_t err;
|
||||
void *buf;
|
||||
struct evtchn_alloc_unbound alloc_unbound;
|
||||
|
||||
/* Shouldn't happen unles some hotplug happened. */
|
||||
if (vdiskcnt >= *ctr)
|
||||
return 1;
|
||||
virtdisks[vdiskcnt].handle = grub_strtoul (dir, 0, 10);
|
||||
if (grub_errno)
|
||||
{
|
||||
grub_errno = 0;
|
||||
return 0;
|
||||
}
|
||||
virtdisks[vdiskcnt].fullname = 0;
|
||||
virtdisks[vdiskcnt].backend_dir = 0;
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "device/vbd/%s/backend", dir);
|
||||
virtdisks[vdiskcnt].backend_dir = grub_xenstore_get_file (fdir, NULL);
|
||||
if (!virtdisks[vdiskcnt].backend_dir)
|
||||
goto out_fail_1;
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "%s/dev",
|
||||
virtdisks[vdiskcnt].backend_dir);
|
||||
buf = grub_xenstore_get_file (fdir, NULL);
|
||||
if (!buf)
|
||||
{
|
||||
grub_errno = 0;
|
||||
virtdisks[vdiskcnt].fullname = grub_xasprintf ("xenid/%s", dir);
|
||||
}
|
||||
else
|
||||
{
|
||||
virtdisks[vdiskcnt].fullname = grub_xasprintf ("xen/%s", (char *) buf);
|
||||
grub_free (buf);
|
||||
}
|
||||
if (!virtdisks[vdiskcnt].fullname)
|
||||
goto out_fail_1;
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "device/vbd/%s/backend-id", dir);
|
||||
buf = grub_xenstore_get_file (fdir, NULL);
|
||||
if (!buf)
|
||||
goto out_fail_1;
|
||||
|
||||
dom = grub_strtoul (buf, 0, 10);
|
||||
grub_free (buf);
|
||||
if (grub_errno)
|
||||
goto out_fail_1;
|
||||
|
||||
virtdisks[vdiskcnt].shared_page =
|
||||
grub_xen_alloc_shared_page (dom, &virtdisks[vdiskcnt].grant);
|
||||
if (!virtdisks[vdiskcnt].shared_page)
|
||||
goto out_fail_1;
|
||||
|
||||
virtdisks[vdiskcnt].dma_page =
|
||||
grub_xen_alloc_shared_page (dom, &virtdisks[vdiskcnt].dma_grant);
|
||||
if (!virtdisks[vdiskcnt].dma_page)
|
||||
goto out_fail_2;
|
||||
|
||||
alloc_unbound.dom = DOMID_SELF;
|
||||
alloc_unbound.remote_dom = dom;
|
||||
|
||||
grub_xen_event_channel_op (EVTCHNOP_alloc_unbound, &alloc_unbound);
|
||||
virtdisks[vdiskcnt].evtchn = alloc_unbound.port;
|
||||
|
||||
SHARED_RING_INIT (virtdisks[vdiskcnt].shared_page);
|
||||
FRONT_RING_INIT (&virtdisks[vdiskcnt].ring, virtdisks[vdiskcnt].shared_page,
|
||||
GRUB_XEN_PAGE_SIZE);
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "device/vbd/%s/ring-ref", dir);
|
||||
grub_snprintf (num, sizeof (num), "%u", virtdisks[vdiskcnt].grant);
|
||||
err = grub_xenstore_write_file (fdir, num, grub_strlen (num));
|
||||
if (err)
|
||||
goto out_fail_3;
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "device/vbd/%s/event-channel", dir);
|
||||
grub_snprintf (num, sizeof (num), "%u", virtdisks[vdiskcnt].evtchn);
|
||||
err = grub_xenstore_write_file (fdir, num, grub_strlen (num));
|
||||
if (err)
|
||||
goto out_fail_3;
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "device/vbd/%s/protocol", dir);
|
||||
err = grub_xenstore_write_file (fdir, XEN_IO_PROTO_ABI_NATIVE,
|
||||
grub_strlen (XEN_IO_PROTO_ABI_NATIVE));
|
||||
if (err)
|
||||
goto out_fail_3;
|
||||
|
||||
struct gnttab_dump_table dt;
|
||||
dt.dom = DOMID_SELF;
|
||||
grub_xen_grant_table_op (GNTTABOP_dump_table, (void *) &dt, 1);
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "device/vbd/%s/state", dir);
|
||||
err = grub_xenstore_write_file (fdir, "3", 1);
|
||||
if (err)
|
||||
goto out_fail_3;
|
||||
|
||||
while (1)
|
||||
{
|
||||
grub_snprintf (fdir, sizeof (fdir), "%s/state",
|
||||
virtdisks[vdiskcnt].backend_dir);
|
||||
buf = grub_xenstore_get_file (fdir, NULL);
|
||||
if (!buf)
|
||||
goto out_fail_3;
|
||||
if (grub_strcmp (buf, "2") != 0)
|
||||
break;
|
||||
grub_free (buf);
|
||||
grub_xen_sched_op (SCHEDOP_yield, 0);
|
||||
}
|
||||
grub_dprintf ("xen", "state=%s\n", (char *) buf);
|
||||
grub_free (buf);
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "device/vbd/%s", dir);
|
||||
|
||||
virtdisks[vdiskcnt].frontend_dir = grub_strdup (fdir);
|
||||
|
||||
vdiskcnt++;
|
||||
return 0;
|
||||
|
||||
out_fail_3:
|
||||
grub_xen_free_shared_page (virtdisks[vdiskcnt].dma_page);
|
||||
out_fail_2:
|
||||
grub_xen_free_shared_page (virtdisks[vdiskcnt].shared_page);
|
||||
out_fail_1:
|
||||
grub_free (virtdisks[vdiskcnt].backend_dir);
|
||||
grub_free (virtdisks[vdiskcnt].fullname);
|
||||
|
||||
grub_errno = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
grub_xendisk_init (void)
|
||||
{
|
||||
grub_size_t ctr = 0;
|
||||
if (grub_xenstore_dir ("device/vbd", count, &ctr))
|
||||
grub_errno = 0;
|
||||
|
||||
if (!ctr)
|
||||
return;
|
||||
|
||||
virtdisks = grub_malloc (ctr * sizeof (virtdisks[0]));
|
||||
if (!virtdisks)
|
||||
return;
|
||||
if (grub_xenstore_dir ("device/vbd", fill, &ctr))
|
||||
grub_errno = 0;
|
||||
|
||||
grub_disk_dev_register (&grub_virtdisk_dev);
|
||||
}
|
||||
|
||||
void
|
||||
grub_xendisk_fini (void)
|
||||
{
|
||||
char fdir[200];
|
||||
unsigned i;
|
||||
|
||||
for (i = 0; i < vdiskcnt; i++)
|
||||
{
|
||||
char *buf;
|
||||
struct evtchn_close close_op = {.port = virtdisks[i].evtchn };
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "%s/state",
|
||||
virtdisks[i].frontend_dir);
|
||||
grub_xenstore_write_file (fdir, "6", 1);
|
||||
|
||||
while (1)
|
||||
{
|
||||
grub_snprintf (fdir, sizeof (fdir), "%s/state",
|
||||
virtdisks[i].backend_dir);
|
||||
buf = grub_xenstore_get_file (fdir, NULL);
|
||||
grub_dprintf ("xen", "state=%s\n", (char *) buf);
|
||||
|
||||
if (!buf || grub_strcmp (buf, "6") == 0)
|
||||
break;
|
||||
grub_free (buf);
|
||||
grub_xen_sched_op (SCHEDOP_yield, 0);
|
||||
}
|
||||
grub_free (buf);
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "%s/ring-ref",
|
||||
virtdisks[i].frontend_dir);
|
||||
grub_xenstore_write_file (fdir, NULL, 0);
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "%s/event-channel",
|
||||
virtdisks[i].frontend_dir);
|
||||
grub_xenstore_write_file (fdir, NULL, 0);
|
||||
|
||||
grub_xen_free_shared_page (virtdisks[i].dma_page);
|
||||
grub_xen_free_shared_page (virtdisks[i].shared_page);
|
||||
|
||||
grub_xen_event_channel_op (EVTCHNOP_close, &close_op);
|
||||
|
||||
/* Prepare for handoff. */
|
||||
grub_snprintf (fdir, sizeof (fdir), "%s/state",
|
||||
virtdisks[i].frontend_dir);
|
||||
grub_xenstore_write_file (fdir, "1", 1);
|
||||
}
|
||||
}
|
||||
@@ -18,10 +18,42 @@
|
||||
|
||||
#include <grub/efiemu/efiemu.h>
|
||||
#include <grub/command.h>
|
||||
#include <grub/i386/cpuid.h>
|
||||
|
||||
#define cpuid(num,a,b,c,d) \
|
||||
asm volatile ("xchgl %%ebx, %1; cpuid; xchgl %%ebx, %1" \
|
||||
: "=a" (a), "=r" (b), "=c" (c), "=d" (d) \
|
||||
: "0" (num))
|
||||
|
||||
#define bit_LM (1 << 29)
|
||||
|
||||
const char *
|
||||
grub_efiemu_get_default_core_name (void)
|
||||
{
|
||||
return grub_cpuid_has_longmode ? "efiemu64.o" : "efiemu32.o";
|
||||
|
||||
unsigned int eax, ebx, ecx, edx;
|
||||
unsigned int max_level;
|
||||
unsigned int ext_level;
|
||||
|
||||
/* See if we can use cpuid. */
|
||||
asm volatile ("pushfl; pushfl; popl %0; movl %0,%1; xorl %2,%0;"
|
||||
"pushl %0; popfl; pushfl; popl %0; popfl"
|
||||
: "=&r" (eax), "=&r" (ebx)
|
||||
: "i" (0x00200000));
|
||||
if (((eax ^ ebx) & 0x00200000) == 0)
|
||||
return "efiemu32.o";
|
||||
|
||||
/* Check the highest input value for eax. */
|
||||
cpuid (0, eax, ebx, ecx, edx);
|
||||
/* We only look at the first four characters. */
|
||||
max_level = eax;
|
||||
if (max_level == 0)
|
||||
return "efiemu32.o";
|
||||
|
||||
cpuid (0x80000000, eax, ebx, ecx, edx);
|
||||
ext_level = eax;
|
||||
if (ext_level < 0x80000000)
|
||||
return "efiemu32.o";
|
||||
|
||||
cpuid (0x80000001, eax, ebx, ecx, edx);
|
||||
return (edx & bit_LM) ? "efiemu64.o" : "efiemu32.o";
|
||||
}
|
||||
|
||||
@@ -122,10 +122,7 @@ SUFFIX (grub_efiemu_crc) (void)
|
||||
int handle;
|
||||
grub_off_t off;
|
||||
struct SUFFIX (grub_efiemu_runtime_services) *runtime_services;
|
||||
grub_uint32_t crc32_val;
|
||||
|
||||
if (GRUB_MD_CRC32->mdlen != 4)
|
||||
return grub_error (GRUB_ERR_BUG, "incorrect mdlen");
|
||||
grub_uint8_t crc32_context[GRUB_MD_CRC32->contextsize];
|
||||
|
||||
/* compute CRC32 of runtime_services */
|
||||
err = grub_efiemu_resolve_symbol ("efiemu_runtime_services",
|
||||
@@ -137,11 +134,12 @@ SUFFIX (grub_efiemu_crc) (void)
|
||||
((grub_uint8_t *) grub_efiemu_mm_obtain_request (handle) + off);
|
||||
|
||||
runtime_services->hdr.crc32 = 0;
|
||||
GRUB_MD_CRC32->init(crc32_context);
|
||||
GRUB_MD_CRC32->write(crc32_context, runtime_services, runtime_services->hdr.header_size);
|
||||
GRUB_MD_CRC32->final(crc32_context);
|
||||
|
||||
grub_crypto_hash (GRUB_MD_CRC32, &crc32_val,
|
||||
runtime_services, runtime_services->hdr.header_size);
|
||||
runtime_services->hdr.crc32 =
|
||||
grub_be_to_cpu32(crc32_val);
|
||||
grub_be_to_cpu32(*(grub_uint32_t*)GRUB_MD_CRC32->read(crc32_context));
|
||||
|
||||
err = grub_efiemu_resolve_symbol ("efiemu_system_table", &handle, &off);
|
||||
if (err)
|
||||
@@ -149,11 +147,12 @@ SUFFIX (grub_efiemu_crc) (void)
|
||||
|
||||
/* compute CRC32 of system table */
|
||||
SUFFIX (grub_efiemu_system_table)->hdr.crc32 = 0;
|
||||
grub_crypto_hash (GRUB_MD_CRC32, &crc32_val,
|
||||
SUFFIX (grub_efiemu_system_table),
|
||||
SUFFIX (grub_efiemu_system_table)->hdr.header_size);
|
||||
GRUB_MD_CRC32->init(crc32_context);
|
||||
GRUB_MD_CRC32->write(crc32_context, SUFFIX (grub_efiemu_system_table),
|
||||
SUFFIX (grub_efiemu_system_table)->hdr.header_size);
|
||||
GRUB_MD_CRC32->final(crc32_context);
|
||||
SUFFIX (grub_efiemu_system_table)->hdr.crc32 =
|
||||
grub_be_to_cpu32(crc32_val);
|
||||
grub_be_to_cpu32(*(grub_uint32_t*)GRUB_MD_CRC32->read(crc32_context));
|
||||
|
||||
grub_dprintf ("efiemu","system_table = %p, runtime_services = %p\n",
|
||||
SUFFIX (grub_efiemu_system_table), runtime_services);
|
||||
|
||||
@@ -19,18 +19,16 @@
|
||||
|
||||
#define GRUB_TYPES_CPU_HEADER 1
|
||||
|
||||
#ifdef __i386__
|
||||
#ifdef ELF32
|
||||
# define SIZEOF_VOID_P 4
|
||||
# define SIZEOF_LONG 4
|
||||
# define GRUB_TARGET_SIZEOF_VOID_P 4
|
||||
# define GRUB_TARGET_SIZEOF_LONG 4
|
||||
# define EFI_FUNC(x) x
|
||||
#elif defined (__x86_64__)
|
||||
#else
|
||||
# define SIZEOF_VOID_P 8
|
||||
# define SIZEOF_LONG 8
|
||||
# define GRUB_TARGET_SIZEOF_VOID_P 8
|
||||
# define GRUB_TARGET_SIZEOF_LONG 8
|
||||
# define EFI_FUNC(x) x ## _real
|
||||
#else
|
||||
#error "Unknown architecture"
|
||||
#endif
|
||||
|
||||
@@ -418,7 +418,7 @@ grub_font_load (const char *filename)
|
||||
#endif
|
||||
|
||||
if (filename[0] == '(' || filename[0] == '/' || filename[0] == '+')
|
||||
file = grub_buffile_open (filename, GRUB_FILE_TYPE_FONT, 1024);
|
||||
file = grub_buffile_open (filename, 1024);
|
||||
else
|
||||
{
|
||||
const char *prefix = grub_env_get ("prefix");
|
||||
@@ -438,7 +438,7 @@ grub_font_load (const char *filename)
|
||||
ptr = grub_stpcpy (ptr, filename);
|
||||
ptr = grub_stpcpy (ptr, ".pf2");
|
||||
*ptr = 0;
|
||||
file = grub_buffile_open (fullname, GRUB_FILE_TYPE_FONT, 1024);
|
||||
file = grub_buffile_open (fullname, 1024);
|
||||
grub_free (fullname);
|
||||
}
|
||||
if (!file)
|
||||
|
||||
@@ -67,7 +67,6 @@ handle_symlink (struct grub_archelp_data *data,
|
||||
grub_size_t prefixlen;
|
||||
char *rest;
|
||||
char *linktarget;
|
||||
grub_size_t linktarget_len;
|
||||
|
||||
*restart = 0;
|
||||
|
||||
@@ -97,8 +96,7 @@ handle_symlink (struct grub_archelp_data *data,
|
||||
return grub_errno;
|
||||
if (linktarget[0] == '\0')
|
||||
return GRUB_ERR_NONE;
|
||||
linktarget_len = grub_strlen (linktarget);
|
||||
target = grub_malloc (linktarget_len + grub_strlen (*name) + 2);
|
||||
target = grub_malloc (grub_strlen (linktarget) + grub_strlen (*name) + 2);
|
||||
if (!target)
|
||||
return grub_errno;
|
||||
|
||||
@@ -123,7 +121,7 @@ handle_symlink (struct grub_archelp_data *data,
|
||||
grub_memcpy (target, *name, prefixlen);
|
||||
target[prefixlen-1] = '/';
|
||||
}
|
||||
grub_strcpy (target + prefixlen + linktarget_len, rest);
|
||||
grub_strcat (target, rest);
|
||||
grub_dprintf ("archelp", "symlink redirected %s to %s\n",
|
||||
*name, target);
|
||||
grub_free (*name);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/* btrfs.c - B-tree file system. */
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2010,2011,2012,2013 Free Software Foundation, Inc.
|
||||
* Copyright (C) 2010 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -28,7 +28,6 @@
|
||||
#include <grub/deflate.h>
|
||||
#include <minilzo.h>
|
||||
#include <grub/i18n.h>
|
||||
#include <grub/btrfs.h>
|
||||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
@@ -107,6 +106,24 @@ struct grub_btrfs_data
|
||||
struct grub_btrfs_extent_data *extent;
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
GRUB_BTRFS_ITEM_TYPE_INODE_ITEM = 0x01,
|
||||
GRUB_BTRFS_ITEM_TYPE_INODE_REF = 0x0c,
|
||||
GRUB_BTRFS_ITEM_TYPE_DIR_ITEM = 0x54,
|
||||
GRUB_BTRFS_ITEM_TYPE_EXTENT_ITEM = 0x6c,
|
||||
GRUB_BTRFS_ITEM_TYPE_ROOT_ITEM = 0x84,
|
||||
GRUB_BTRFS_ITEM_TYPE_DEVICE = 0xd8,
|
||||
GRUB_BTRFS_ITEM_TYPE_CHUNK = 0xe4
|
||||
};
|
||||
|
||||
struct grub_btrfs_key
|
||||
{
|
||||
grub_uint64_t object_id;
|
||||
grub_uint8_t type;
|
||||
grub_uint64_t offset;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct grub_btrfs_chunk_item
|
||||
{
|
||||
grub_uint64_t size;
|
||||
@@ -171,6 +188,13 @@ struct grub_btrfs_leaf_descriptor
|
||||
} *data;
|
||||
};
|
||||
|
||||
struct grub_btrfs_root_item
|
||||
{
|
||||
grub_uint8_t dummy[0xb0];
|
||||
grub_uint64_t tree;
|
||||
grub_uint64_t inode;
|
||||
};
|
||||
|
||||
struct grub_btrfs_time
|
||||
{
|
||||
grub_int64_t sec;
|
||||
@@ -911,6 +935,7 @@ grub_btrfs_lzo_decompress(char *ibuf, grub_size_t isize, grub_off_t off,
|
||||
{
|
||||
grub_uint32_t total_size, cblock_size;
|
||||
grub_size_t ret = 0;
|
||||
unsigned char buf[GRUB_BTRFS_LZO_BLOCK_SIZE];
|
||||
char *ibuf0 = ibuf;
|
||||
|
||||
total_size = grub_le_to_cpu32 (grub_get_unaligned32 (ibuf));
|
||||
@@ -954,21 +979,13 @@ grub_btrfs_lzo_decompress(char *ibuf, grub_size_t isize, grub_off_t off,
|
||||
if (off > 0 || osize < GRUB_BTRFS_LZO_BLOCK_SIZE)
|
||||
{
|
||||
grub_size_t to_copy = GRUB_BTRFS_LZO_BLOCK_SIZE - off;
|
||||
grub_uint8_t *buf;
|
||||
|
||||
if (to_copy > osize)
|
||||
to_copy = osize;
|
||||
|
||||
buf = grub_malloc (GRUB_BTRFS_LZO_BLOCK_SIZE);
|
||||
if (!buf)
|
||||
return -1;
|
||||
|
||||
if (lzo1x_decompress_safe ((lzo_bytep)ibuf, cblock_size, buf, &usize,
|
||||
NULL) != LZO_E_OK)
|
||||
{
|
||||
grub_free (buf);
|
||||
return -1;
|
||||
}
|
||||
return -1;
|
||||
|
||||
if (to_copy > usize)
|
||||
to_copy = usize;
|
||||
@@ -979,8 +996,6 @@ grub_btrfs_lzo_decompress(char *ibuf, grub_size_t isize, grub_off_t off,
|
||||
obuf += to_copy;
|
||||
ibuf += cblock_size;
|
||||
off = 0;
|
||||
|
||||
grub_free (buf);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -1181,40 +1196,6 @@ grub_btrfs_extent_read (struct grub_btrfs_data *data,
|
||||
return pos - pos0;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
get_root (struct grub_btrfs_data *data, struct grub_btrfs_key *key,
|
||||
grub_uint64_t *tree, grub_uint8_t *type)
|
||||
{
|
||||
grub_err_t err;
|
||||
grub_disk_addr_t elemaddr;
|
||||
grub_size_t elemsize;
|
||||
struct grub_btrfs_key key_out, key_in;
|
||||
struct grub_btrfs_root_item ri;
|
||||
|
||||
key_in.object_id = GRUB_BTRFS_ROOT_VOL_OBJECTID;
|
||||
key_in.offset = 0;
|
||||
key_in.type = GRUB_BTRFS_ITEM_TYPE_ROOT_ITEM;
|
||||
err = lower_bound (data, &key_in, &key_out,
|
||||
data->sblock.root_tree,
|
||||
&elemaddr, &elemsize, NULL, 0);
|
||||
if (err)
|
||||
return err;
|
||||
if (key_in.object_id != key_out.object_id
|
||||
|| key_in.type != key_out.type
|
||||
|| key_in.offset != key_out.offset)
|
||||
return grub_error (GRUB_ERR_BAD_FS, "no root");
|
||||
err = grub_btrfs_read_logical (data, elemaddr, &ri,
|
||||
sizeof (ri), 0);
|
||||
if (err)
|
||||
return err;
|
||||
key->type = GRUB_BTRFS_ITEM_TYPE_DIR_ITEM;
|
||||
key->offset = 0;
|
||||
key->object_id = grub_cpu_to_le64_compile_time (GRUB_BTRFS_OBJECT_ID_CHUNK);
|
||||
*tree = ri.tree;
|
||||
*type = GRUB_BTRFS_DIR_ITEM_TYPE_DIRECTORY;
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
find_path (struct grub_btrfs_data *data,
|
||||
const char *path, struct grub_btrfs_key *key,
|
||||
@@ -1227,31 +1208,42 @@ find_path (struct grub_btrfs_data *data,
|
||||
grub_size_t allocated = 0;
|
||||
struct grub_btrfs_dir_item *direl = NULL;
|
||||
struct grub_btrfs_key key_out;
|
||||
int skip_default;
|
||||
const char *ctoken;
|
||||
grub_size_t ctokenlen;
|
||||
char *path_alloc = NULL;
|
||||
char *origpath = NULL;
|
||||
unsigned symlinks_max = 32;
|
||||
|
||||
err = get_root (data, key, tree, type);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
*type = GRUB_BTRFS_DIR_ITEM_TYPE_DIRECTORY;
|
||||
*tree = data->sblock.root_tree;
|
||||
key->object_id = data->sblock.root_dir_objectid;
|
||||
key->type = GRUB_BTRFS_ITEM_TYPE_DIR_ITEM;
|
||||
key->offset = 0;
|
||||
skip_default = 1;
|
||||
origpath = grub_strdup (path);
|
||||
if (!origpath)
|
||||
return grub_errno;
|
||||
|
||||
while (1)
|
||||
{
|
||||
while (path[0] == '/')
|
||||
path++;
|
||||
if (!path[0])
|
||||
break;
|
||||
slash = grub_strchr (path, '/');
|
||||
if (!slash)
|
||||
slash = path + grub_strlen (path);
|
||||
ctoken = path;
|
||||
ctokenlen = slash - path;
|
||||
if (!skip_default)
|
||||
{
|
||||
while (path[0] == '/')
|
||||
path++;
|
||||
if (!path[0])
|
||||
break;
|
||||
slash = grub_strchr (path, '/');
|
||||
if (!slash)
|
||||
slash = path + grub_strlen (path);
|
||||
ctoken = path;
|
||||
ctokenlen = slash - path;
|
||||
}
|
||||
else
|
||||
{
|
||||
ctoken = "default";
|
||||
ctokenlen = sizeof ("default") - 1;
|
||||
}
|
||||
|
||||
if (*type != GRUB_BTRFS_DIR_ITEM_TYPE_DIRECTORY)
|
||||
{
|
||||
@@ -1262,8 +1254,10 @@ find_path (struct grub_btrfs_data *data,
|
||||
|
||||
if (ctokenlen == 1 && ctoken[0] == '.')
|
||||
{
|
||||
path = slash;
|
||||
continue;
|
||||
if (!skip_default)
|
||||
path = slash;
|
||||
skip_default = 0;
|
||||
continue;
|
||||
}
|
||||
if (ctokenlen == 2 && ctoken[0] == '.' && ctoken[1] == '.')
|
||||
{
|
||||
@@ -1293,7 +1287,9 @@ find_path (struct grub_btrfs_data *data,
|
||||
*type = GRUB_BTRFS_DIR_ITEM_TYPE_DIRECTORY;
|
||||
key->object_id = key_out.offset;
|
||||
|
||||
path = slash;
|
||||
if (!skip_default)
|
||||
path = slash;
|
||||
skip_default = 0;
|
||||
|
||||
continue;
|
||||
}
|
||||
@@ -1363,7 +1359,9 @@ find_path (struct grub_btrfs_data *data,
|
||||
return err;
|
||||
}
|
||||
|
||||
path = slash;
|
||||
if (!skip_default)
|
||||
path = slash;
|
||||
skip_default = 0;
|
||||
if (cdirel->type == GRUB_BTRFS_DIR_ITEM_TYPE_SYMLINK)
|
||||
{
|
||||
struct grub_btrfs_inode inode;
|
||||
@@ -1413,9 +1411,12 @@ find_path (struct grub_btrfs_data *data,
|
||||
path = path_alloc = tmp;
|
||||
if (path[0] == '/')
|
||||
{
|
||||
err = get_root (data, key, tree, type);
|
||||
if (err)
|
||||
return err;
|
||||
*type = GRUB_BTRFS_DIR_ITEM_TYPE_DIRECTORY;
|
||||
*tree = data->sblock.root_tree;
|
||||
key->object_id = data->sblock.root_dir_objectid;
|
||||
key->type = GRUB_BTRFS_ITEM_TYPE_DIR_ITEM;
|
||||
key->offset = 0;
|
||||
skip_default = 1;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -267,8 +267,7 @@ grub_cbfs_close (grub_file_t file)
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
#if (defined (__i386__) || defined (__x86_64__)) && !defined (GRUB_UTIL) \
|
||||
&& !defined (GRUB_MACHINE_EMU) && !defined (GRUB_MACHINE_XEN)
|
||||
#if (defined (__i386__) || defined (__x86_64__)) && !defined (GRUB_UTIL) && !defined (GRUB_MACHINE_EMU)
|
||||
|
||||
static char *cbfsdisk_addr;
|
||||
static grub_off_t cbfsdisk_size = 0;
|
||||
@@ -290,7 +289,6 @@ grub_cbfsdisk_open (const char *name, grub_disk_t disk)
|
||||
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "not a cbfsdisk");
|
||||
|
||||
disk->total_sectors = cbfsdisk_size / GRUB_DISK_SECTOR_SIZE;
|
||||
disk->max_agglomerate = GRUB_DISK_MAX_MAX_AGGLOMERATE;
|
||||
disk->id = (unsigned long) "cbfs";
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
@@ -376,7 +374,7 @@ static struct grub_fs grub_cbfs_fs = {
|
||||
|
||||
GRUB_MOD_INIT (cbfs)
|
||||
{
|
||||
#if (defined (__i386__) || defined (__x86_64__)) && !defined (GRUB_UTIL) && !defined (GRUB_MACHINE_EMU) && !defined (GRUB_MACHINE_XEN)
|
||||
#if (defined (__i386__) || defined (__x86_64__)) && !defined (GRUB_UTIL) && !defined (GRUB_MACHINE_EMU)
|
||||
init_cbfsdisk ();
|
||||
#endif
|
||||
grub_fs_register (&grub_cbfs_fs);
|
||||
@@ -385,7 +383,7 @@ GRUB_MOD_INIT (cbfs)
|
||||
GRUB_MOD_FINI (cbfs)
|
||||
{
|
||||
grub_fs_unregister (&grub_cbfs_fs);
|
||||
#if (defined (__i386__) || defined (__x86_64__)) && !defined (GRUB_UTIL) && !defined (GRUB_MACHINE_EMU) && !defined (GRUB_MACHINE_XEN)
|
||||
#if (defined (__i386__) || defined (__x86_64__)) && !defined (GRUB_UTIL) && !defined (GRUB_MACHINE_EMU)
|
||||
fini_cbfsdisk ();
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -247,7 +247,6 @@ struct ext2_dirent
|
||||
{
|
||||
grub_uint32_t inode;
|
||||
grub_uint16_t direntlen;
|
||||
#define MAX_NAMELEN 255
|
||||
grub_uint8_t namelen;
|
||||
grub_uint8_t filetype;
|
||||
};
|
||||
@@ -345,12 +344,11 @@ grub_ext2_blockgroup (struct grub_ext2_data *data, int group,
|
||||
}
|
||||
|
||||
static struct grub_ext4_extent_header *
|
||||
grub_ext4_find_leaf (struct grub_ext2_data *data,
|
||||
grub_ext4_find_leaf (struct grub_ext2_data *data, grub_properly_aligned_t *buf,
|
||||
struct grub_ext4_extent_header *ext_block,
|
||||
grub_uint32_t fileblock)
|
||||
{
|
||||
struct grub_ext4_extent_idx *index;
|
||||
void *buf = NULL;
|
||||
|
||||
while (1)
|
||||
{
|
||||
@@ -359,8 +357,8 @@ grub_ext4_find_leaf (struct grub_ext2_data *data,
|
||||
|
||||
index = (struct grub_ext4_extent_idx *) (ext_block + 1);
|
||||
|
||||
if (ext_block->magic != grub_cpu_to_le16_compile_time (EXT4_EXT_MAGIC))
|
||||
goto fail;
|
||||
if (grub_le_to_cpu16(ext_block->magic) != EXT4_EXT_MAGIC)
|
||||
return 0;
|
||||
|
||||
if (ext_block->depth == 0)
|
||||
return ext_block;
|
||||
@@ -372,24 +370,17 @@ grub_ext4_find_leaf (struct grub_ext2_data *data,
|
||||
}
|
||||
|
||||
if (--i < 0)
|
||||
goto fail;
|
||||
return 0;
|
||||
|
||||
block = grub_le_to_cpu16 (index[i].leaf_hi);
|
||||
block = (block << 32) | grub_le_to_cpu32 (index[i].leaf);
|
||||
if (!buf)
|
||||
buf = grub_malloc (EXT2_BLOCK_SIZE(data));
|
||||
if (!buf)
|
||||
goto fail;
|
||||
if (grub_disk_read (data->disk,
|
||||
block << LOG2_EXT2_BLOCK_SIZE (data),
|
||||
0, EXT2_BLOCK_SIZE(data), buf))
|
||||
goto fail;
|
||||
return 0;
|
||||
|
||||
ext_block = buf;
|
||||
ext_block = (struct grub_ext4_extent_header *) buf;
|
||||
}
|
||||
fail:
|
||||
grub_free (buf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static grub_disk_addr_t
|
||||
@@ -397,21 +388,20 @@ grub_ext2_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock)
|
||||
{
|
||||
struct grub_ext2_data *data = node->data;
|
||||
struct grub_ext2_inode *inode = &node->inode;
|
||||
grub_disk_addr_t blknr = -1;
|
||||
unsigned int blksz = EXT2_BLOCK_SIZE (data);
|
||||
grub_disk_addr_t blksz_quarter = blksz / 4;
|
||||
int log2_blksz = LOG2_EXT2_BLOCK_SIZE (data);
|
||||
int log_perblock = log2_blksz + 9 - 2;
|
||||
grub_uint32_t indir;
|
||||
int shift;
|
||||
|
||||
if (inode->flags & grub_cpu_to_le32_compile_time (EXT4_EXTENTS_FLAG))
|
||||
{
|
||||
GRUB_PROPERLY_ALIGNED_ARRAY (buf, EXT2_BLOCK_SIZE(data));
|
||||
struct grub_ext4_extent_header *leaf;
|
||||
struct grub_ext4_extent *ext;
|
||||
int i;
|
||||
grub_disk_addr_t ret;
|
||||
|
||||
leaf = grub_ext4_find_leaf (data, (struct grub_ext4_extent_header *) inode->blocks.dir_blocks, fileblock);
|
||||
leaf = grub_ext4_find_leaf (data, buf,
|
||||
(struct grub_ext4_extent_header *) inode->blocks.dir_blocks,
|
||||
fileblock);
|
||||
if (! leaf)
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_FS, "invalid extent");
|
||||
@@ -429,7 +419,7 @@ grub_ext2_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock)
|
||||
{
|
||||
fileblock -= grub_le_to_cpu32 (ext[i].block);
|
||||
if (fileblock >= grub_le_to_cpu16 (ext[i].len))
|
||||
ret = 0;
|
||||
return 0;
|
||||
else
|
||||
{
|
||||
grub_disk_addr_t start;
|
||||
@@ -437,64 +427,98 @@ grub_ext2_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock)
|
||||
start = grub_le_to_cpu16 (ext[i].start_hi);
|
||||
start = (start << 32) + grub_le_to_cpu32 (ext[i].start);
|
||||
|
||||
ret = fileblock + start;
|
||||
return fileblock + start;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_FS, "something wrong with extent");
|
||||
ret = -1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (leaf != (struct grub_ext4_extent_header *) inode->blocks.dir_blocks)
|
||||
grub_free (leaf);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Direct blocks. */
|
||||
if (fileblock < INDIRECT_BLOCKS)
|
||||
return grub_le_to_cpu32 (inode->blocks.dir_blocks[fileblock]);
|
||||
fileblock -= INDIRECT_BLOCKS;
|
||||
blknr = grub_le_to_cpu32 (inode->blocks.dir_blocks[fileblock]);
|
||||
/* Indirect. */
|
||||
if (fileblock < blksz_quarter)
|
||||
else if (fileblock < INDIRECT_BLOCKS + blksz / 4)
|
||||
{
|
||||
indir = inode->blocks.indir_block;
|
||||
shift = 0;
|
||||
goto indirect;
|
||||
grub_uint32_t indir[blksz / 4];
|
||||
|
||||
if (grub_disk_read (data->disk,
|
||||
((grub_disk_addr_t)
|
||||
grub_le_to_cpu32 (inode->blocks.indir_block))
|
||||
<< log2_blksz,
|
||||
0, blksz, indir))
|
||||
return grub_errno;
|
||||
|
||||
blknr = grub_le_to_cpu32 (indir[fileblock - INDIRECT_BLOCKS]);
|
||||
}
|
||||
fileblock -= blksz_quarter;
|
||||
/* Double indirect. */
|
||||
if (fileblock < blksz_quarter * blksz_quarter)
|
||||
else if (fileblock < INDIRECT_BLOCKS
|
||||
+ blksz / 4 * ((grub_disk_addr_t) blksz / 4 + 1))
|
||||
{
|
||||
indir = inode->blocks.double_indir_block;
|
||||
shift = 1;
|
||||
goto indirect;
|
||||
int log_perblock = log2_blksz + 9 - 2;
|
||||
grub_disk_addr_t rblock = fileblock - (INDIRECT_BLOCKS
|
||||
+ blksz / 4);
|
||||
grub_uint32_t indir[blksz / 4];
|
||||
|
||||
if (grub_disk_read (data->disk,
|
||||
((grub_disk_addr_t)
|
||||
grub_le_to_cpu32 (inode->blocks.double_indir_block))
|
||||
<< log2_blksz,
|
||||
0, blksz, indir))
|
||||
return grub_errno;
|
||||
|
||||
if (grub_disk_read (data->disk,
|
||||
((grub_disk_addr_t)
|
||||
grub_le_to_cpu32 (indir[rblock >> log_perblock]))
|
||||
<< log2_blksz,
|
||||
0, blksz, indir))
|
||||
return grub_errno;
|
||||
|
||||
|
||||
blknr = grub_le_to_cpu32 (indir[rblock & ((1 << log_perblock) - 1)]);
|
||||
}
|
||||
fileblock -= blksz_quarter * blksz_quarter;
|
||||
/* Triple indirect. */
|
||||
if (fileblock < blksz_quarter * blksz_quarter * (blksz_quarter + 1))
|
||||
/* triple indirect. */
|
||||
else if (fileblock < INDIRECT_BLOCKS + blksz / 4 * ((grub_disk_addr_t) blksz / 4 + 1)
|
||||
+ ((grub_disk_addr_t) blksz / 4) * ((grub_disk_addr_t) blksz / 4)
|
||||
* ((grub_disk_addr_t) blksz / 4 + 1))
|
||||
{
|
||||
indir = inode->blocks.triple_indir_block;
|
||||
shift = 2;
|
||||
goto indirect;
|
||||
int log_perblock = log2_blksz + 9 - 2;
|
||||
grub_disk_addr_t rblock = fileblock - (INDIRECT_BLOCKS + blksz / 4
|
||||
* (blksz / 4 + 1));
|
||||
grub_uint32_t indir[blksz / 4];
|
||||
|
||||
if (grub_disk_read (data->disk,
|
||||
((grub_disk_addr_t)
|
||||
grub_le_to_cpu32 (inode->blocks.triple_indir_block))
|
||||
<< log2_blksz,
|
||||
0, blksz, indir))
|
||||
return grub_errno;
|
||||
|
||||
if (grub_disk_read (data->disk,
|
||||
((grub_disk_addr_t)
|
||||
grub_le_to_cpu32 (indir[(rblock >> log_perblock) >> log_perblock]))
|
||||
<< log2_blksz,
|
||||
0, blksz, indir))
|
||||
return grub_errno;
|
||||
|
||||
if (grub_disk_read (data->disk,
|
||||
((grub_disk_addr_t)
|
||||
grub_le_to_cpu32 (indir[(rblock >> log_perblock) & ((1 << log_perblock) - 1)]))
|
||||
<< log2_blksz,
|
||||
0, blksz, indir))
|
||||
return grub_errno;
|
||||
|
||||
blknr = grub_le_to_cpu32 (indir[rblock & ((1 << log_perblock) - 1)]);
|
||||
}
|
||||
else
|
||||
{
|
||||
grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
|
||||
"ext2fs doesn't support quadruple indirect blocks");
|
||||
}
|
||||
return grub_error (GRUB_ERR_BAD_FS,
|
||||
"ext2fs doesn't support quadruple indirect blocks");
|
||||
|
||||
indirect:
|
||||
do {
|
||||
if (grub_disk_read (data->disk,
|
||||
((grub_disk_addr_t) grub_le_to_cpu32 (indir))
|
||||
<< log2_blksz,
|
||||
((fileblock >> (log_perblock * shift))
|
||||
& ((1 << log_perblock) - 1))
|
||||
* sizeof (indir),
|
||||
sizeof (indir), &indir))
|
||||
return grub_errno;
|
||||
} while (shift--);
|
||||
|
||||
return grub_le_to_cpu32 (indir);
|
||||
return blknr;
|
||||
}
|
||||
|
||||
/* Read LEN bytes from the file described by DATA starting with byte
|
||||
@@ -646,10 +670,10 @@ grub_ext2_read_symlink (grub_fshelp_node_t node)
|
||||
/* If the filesize of the symlink is bigger than
|
||||
60 the symlink is stored in a separate block,
|
||||
otherwise it is stored in the inode. */
|
||||
if (grub_le_to_cpu32 (diro->inode.size) <= sizeof (diro->inode.symlink))
|
||||
grub_memcpy (symlink,
|
||||
diro->inode.symlink,
|
||||
grub_le_to_cpu32 (diro->inode.size));
|
||||
if (grub_le_to_cpu32 (diro->inode.size) <= 60)
|
||||
grub_strncpy (symlink,
|
||||
diro->inode.symlink,
|
||||
grub_le_to_cpu32 (diro->inode.size));
|
||||
else
|
||||
{
|
||||
grub_ext2_read_file (diro, 0, 0, 0,
|
||||
@@ -695,7 +719,7 @@ grub_ext2_iterate_dir (grub_fshelp_node_t dir,
|
||||
|
||||
if (dirent.inode != 0 && dirent.namelen != 0)
|
||||
{
|
||||
char filename[MAX_NAMELEN + 1];
|
||||
char filename[dirent.namelen + 1];
|
||||
struct grub_fshelp_node *fdiro;
|
||||
enum grub_fshelp_filetype type = GRUB_FSHELP_UNKNOWN;
|
||||
|
||||
|
||||
@@ -133,7 +133,6 @@ find_file (const char *currpath, grub_fshelp_node_t currroot,
|
||||
if (ctx->type == GRUB_FSHELP_SYMLINK)
|
||||
{
|
||||
char *symlink;
|
||||
const char *next;
|
||||
|
||||
/* Test if the symlink does not loop. */
|
||||
if (++ctx->symlinknest == 8)
|
||||
@@ -165,10 +164,8 @@ find_file (const char *currpath, grub_fshelp_node_t currroot,
|
||||
}
|
||||
|
||||
/* Lookup the node the symlink points to. */
|
||||
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);
|
||||
|
||||
|
||||
@@ -888,8 +888,6 @@ grub_hfsplus_read (grub_file_t file, char *buf, grub_size_t len)
|
||||
struct grub_hfsplus_data *data =
|
||||
(struct grub_hfsplus_data *) file->data;
|
||||
|
||||
data->opened_file.file = file;
|
||||
|
||||
if (grub_hfsplus_read_compressed && data->opened_file.compressed)
|
||||
return grub_hfsplus_read_compressed (&data->opened_file,
|
||||
file->offset, len, buf);
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <grub/misc.h>
|
||||
#include <grub/mm.h>
|
||||
#include <grub/deflate.h>
|
||||
#include <grub/file.h>
|
||||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
@@ -122,8 +121,6 @@ hfsplus_read_compressed_real (struct grub_hfsplus_file *node,
|
||||
if (node->compressed == 1)
|
||||
{
|
||||
grub_memcpy (buf, node->cbuf + pos, len);
|
||||
if (grub_file_progress_hook && node->file)
|
||||
grub_file_progress_hook (0, 0, len, node->file);
|
||||
return len;
|
||||
}
|
||||
|
||||
@@ -165,8 +162,6 @@ hfsplus_read_compressed_real (struct grub_hfsplus_file *node,
|
||||
}
|
||||
grub_memcpy (buf, node->cbuf + (pos % HFSPLUS_COMPRESS_BLOCK_SIZE),
|
||||
curlen);
|
||||
if (grub_file_progress_hook && node->file)
|
||||
grub_file_progress_hook (0, 0, curlen, node->file);
|
||||
buf += curlen;
|
||||
pos += curlen;
|
||||
len -= curlen;
|
||||
|
||||
@@ -72,13 +72,10 @@ struct grub_jfs_extent
|
||||
grub_uint32_t blk2;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#define GRUB_JFS_IAG_INODES_OFFSET 3072
|
||||
#define GRUB_JFS_IAG_INODES_COUNT 128
|
||||
|
||||
struct grub_jfs_iag
|
||||
{
|
||||
grub_uint8_t unused[GRUB_JFS_IAG_INODES_OFFSET];
|
||||
struct grub_jfs_extent inodes[GRUB_JFS_IAG_INODES_COUNT];
|
||||
grub_uint8_t unused[3072];
|
||||
struct grub_jfs_extent inodes[128];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
|
||||
@@ -286,25 +283,20 @@ getblk (struct grub_jfs_treehead *treehead,
|
||||
|
||||
if (found != -1)
|
||||
{
|
||||
grub_int64_t ret = -1;
|
||||
struct
|
||||
{
|
||||
struct grub_jfs_treehead treehead;
|
||||
struct grub_jfs_tree_extent extents[254];
|
||||
} *tree;
|
||||
} tree;
|
||||
|
||||
tree = grub_zalloc (sizeof (*tree));
|
||||
if (!tree)
|
||||
if (grub_disk_read (data->disk,
|
||||
((grub_disk_addr_t) grub_le_to_cpu32 (extents[found].extent.blk2))
|
||||
<< (grub_le_to_cpu16 (data->sblock.log2_blksz)
|
||||
- GRUB_DISK_SECTOR_BITS), 0,
|
||||
sizeof (tree), (char *) &tree))
|
||||
return -1;
|
||||
|
||||
if (!grub_disk_read (data->disk,
|
||||
((grub_disk_addr_t) grub_le_to_cpu32 (extents[found].extent.blk2))
|
||||
<< (grub_le_to_cpu16 (data->sblock.log2_blksz)
|
||||
- GRUB_DISK_SECTOR_BITS), 0,
|
||||
sizeof (*tree), (char *) tree))
|
||||
ret = getblk (&tree->treehead, &tree->extents[0], data, blk);
|
||||
grub_free (tree);
|
||||
return ret;
|
||||
return getblk (&tree.treehead, &tree.extents[0], data, blk);
|
||||
}
|
||||
|
||||
return -1;
|
||||
@@ -324,7 +316,7 @@ static grub_err_t
|
||||
grub_jfs_read_inode (struct grub_jfs_data *data, grub_uint32_t ino,
|
||||
struct grub_jfs_inode *inode)
|
||||
{
|
||||
struct grub_jfs_extent iag_inodes[GRUB_JFS_IAG_INODES_COUNT];
|
||||
struct grub_jfs_iag iag;
|
||||
grub_uint32_t iagnum = ino / 4096;
|
||||
unsigned inoext = (ino % 4096) / 32;
|
||||
unsigned inonum = (ino % 4096) % 32;
|
||||
@@ -338,12 +330,11 @@ grub_jfs_read_inode (struct grub_jfs_data *data, grub_uint32_t ino,
|
||||
/* Read in the IAG. */
|
||||
if (grub_disk_read (data->disk,
|
||||
iagblk << (grub_le_to_cpu16 (data->sblock.log2_blksz)
|
||||
- GRUB_DISK_SECTOR_BITS),
|
||||
GRUB_JFS_IAG_INODES_OFFSET,
|
||||
sizeof (iag_inodes), &iag_inodes))
|
||||
- GRUB_DISK_SECTOR_BITS), 0,
|
||||
sizeof (struct grub_jfs_iag), &iag))
|
||||
return grub_errno;
|
||||
|
||||
inoblk = grub_le_to_cpu32 (iag_inodes[inoext].blk2);
|
||||
inoblk = grub_le_to_cpu32 (iag.inodes[inoext].blk2);
|
||||
inoblk <<= (grub_le_to_cpu16 (data->sblock.log2_blksz)
|
||||
- GRUB_DISK_SECTOR_BITS);
|
||||
inoblk += inonum;
|
||||
@@ -732,7 +723,7 @@ grub_jfs_lookup_symlink (struct grub_jfs_data *data, grub_uint32_t ino)
|
||||
if (!symlink)
|
||||
return grub_errno;
|
||||
if (size <= sizeof (data->currinode.symlink.path))
|
||||
grub_memcpy (symlink, (char *) (data->currinode.symlink.path), size);
|
||||
grub_strncpy (symlink, (char *) (data->currinode.symlink.path), size);
|
||||
else if (grub_jfs_read_file (data, 0, 0, 0, size, symlink) < 0)
|
||||
{
|
||||
grub_free (symlink);
|
||||
|
||||
@@ -378,9 +378,6 @@ read_data (struct grub_ntfs_attr *at, grub_uint8_t *pa, grub_uint8_t *dest,
|
||||
ctx->comp.log_spc = at->mft->data->log_spc;
|
||||
ctx->comp.disk = at->mft->data->disk;
|
||||
|
||||
if (read_hook == grub_file_progress_hook)
|
||||
ctx->file = read_hook_data;
|
||||
|
||||
if (pa[8] == 0)
|
||||
{
|
||||
if (ofs + len > u32at (pa, 0x10))
|
||||
|
||||
@@ -226,9 +226,6 @@ read_block (struct grub_ntfs_rlst *ctx, grub_uint8_t *buf, grub_size_t num)
|
||||
{
|
||||
grub_memset (buf, 0, nn * GRUB_NTFS_COM_LEN);
|
||||
buf += nn * GRUB_NTFS_COM_LEN;
|
||||
if (grub_file_progress_hook && ctx->file)
|
||||
grub_file_progress_hook (0, 0, nn * GRUB_NTFS_COM_LEN,
|
||||
ctx->file);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -239,9 +236,6 @@ read_block (struct grub_ntfs_rlst *ctx, grub_uint8_t *buf, grub_size_t num)
|
||||
return grub_errno;
|
||||
if (buf)
|
||||
buf += GRUB_NTFS_COM_LEN;
|
||||
if (grub_file_progress_hook && ctx->file)
|
||||
grub_file_progress_hook (0, 0, GRUB_NTFS_COM_LEN,
|
||||
ctx->file);
|
||||
nn--;
|
||||
}
|
||||
}
|
||||
@@ -268,11 +262,6 @@ read_block (struct grub_ntfs_rlst *ctx, grub_uint8_t *buf, grub_size_t num)
|
||||
ctx->target_vcn)) << ctx->comp.log_spc, 0,
|
||||
tt << (ctx->comp.log_spc + GRUB_NTFS_BLK_SHR), buf))
|
||||
return grub_errno;
|
||||
if (grub_file_progress_hook && ctx->file)
|
||||
grub_file_progress_hook (0, 0,
|
||||
tt << (ctx->comp.log_spc
|
||||
+ GRUB_NTFS_BLK_SHR),
|
||||
ctx->file);
|
||||
buf += tt << (ctx->comp.log_spc + GRUB_NTFS_BLK_SHR);
|
||||
}
|
||||
nn -= tt;
|
||||
@@ -291,11 +280,6 @@ read_block (struct grub_ntfs_rlst *ctx, grub_uint8_t *buf, grub_size_t num)
|
||||
nn << (ctx->comp.log_spc + GRUB_NTFS_BLK_SHR), buf))
|
||||
return grub_errno;
|
||||
buf += nn << (ctx->comp.log_spc + GRUB_NTFS_BLK_SHR);
|
||||
if (grub_file_progress_hook && ctx->file)
|
||||
grub_file_progress_hook (0, 0,
|
||||
nn << (ctx->comp.log_spc
|
||||
+ GRUB_NTFS_BLK_SHR),
|
||||
ctx->file);
|
||||
}
|
||||
ctx->target_vcn += nn;
|
||||
}
|
||||
@@ -322,8 +306,6 @@ ntfscomp (grub_uint8_t *dest, grub_disk_addr_t ofs,
|
||||
n = len;
|
||||
|
||||
grub_memcpy (dest, ctx->attr->sbuf + ofs - ctx->attr->save_pos, n);
|
||||
if (grub_file_progress_hook && ctx->file)
|
||||
grub_file_progress_hook (0, 0, n, ctx->file);
|
||||
if (n == len)
|
||||
return 0;
|
||||
|
||||
@@ -369,9 +351,6 @@ ntfscomp (grub_uint8_t *dest, grub_disk_addr_t ofs,
|
||||
if (ofs % GRUB_NTFS_COM_LEN)
|
||||
{
|
||||
grub_uint32_t t, n, o;
|
||||
void *file = ctx->file;
|
||||
|
||||
ctx->file = 0;
|
||||
|
||||
t = ctx->target_vcn << (ctx->comp.log_spc + GRUB_NTFS_BLK_SHR);
|
||||
if (read_block (ctx, ctx->attr->sbuf, 1))
|
||||
@@ -380,8 +359,6 @@ ntfscomp (grub_uint8_t *dest, grub_disk_addr_t ofs,
|
||||
goto quit;
|
||||
}
|
||||
|
||||
ctx->file = file;
|
||||
|
||||
ctx->attr->save_pos = t;
|
||||
|
||||
o = ofs % GRUB_NTFS_COM_LEN;
|
||||
@@ -389,8 +366,6 @@ ntfscomp (grub_uint8_t *dest, grub_disk_addr_t ofs,
|
||||
if (n > len)
|
||||
n = len;
|
||||
grub_memcpy (dest, &ctx->attr->sbuf[o], n);
|
||||
if (grub_file_progress_hook && ctx->file)
|
||||
grub_file_progress_hook (0, 0, n, ctx->file);
|
||||
if (n == len)
|
||||
goto quit;
|
||||
dest += n;
|
||||
@@ -408,9 +383,7 @@ ntfscomp (grub_uint8_t *dest, grub_disk_addr_t ofs,
|
||||
if (len)
|
||||
{
|
||||
grub_uint32_t t;
|
||||
void *file = ctx->file;
|
||||
|
||||
ctx->file = 0;
|
||||
t = ctx->target_vcn << (ctx->comp.log_spc + GRUB_NTFS_BLK_SHR);
|
||||
if (read_block (ctx, ctx->attr->sbuf, 1))
|
||||
{
|
||||
@@ -421,8 +394,6 @@ ntfscomp (grub_uint8_t *dest, grub_disk_addr_t ofs,
|
||||
ctx->attr->save_pos = t;
|
||||
|
||||
grub_memcpy (dest, ctx->attr->sbuf, len);
|
||||
if (grub_file_progress_hook && file)
|
||||
grub_file_progress_hook (0, 0, len, file);
|
||||
}
|
||||
|
||||
quit:
|
||||
|
||||
@@ -128,11 +128,10 @@ grub_procfs_open (struct grub_file *file, const char *path)
|
||||
FOR_LIST_ELEMENTS((entry), (grub_procfs_entries))
|
||||
if (grub_strcmp (pathptr, entry->name) == 0)
|
||||
{
|
||||
grub_size_t sz;
|
||||
file->data = entry->get_contents (&sz);
|
||||
file->data = entry->get_contents ();
|
||||
if (!file->data)
|
||||
return grub_errno;
|
||||
file->size = sz;
|
||||
file->size = grub_strlen (file->data);
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
|
||||
@@ -781,7 +781,7 @@ grub_reiserfs_iterate_dir (grub_fshelp_node_t item,
|
||||
= grub_le_to_cpu16 (directory_header->state);
|
||||
grub_fshelp_node_t entry_item;
|
||||
struct grub_reiserfs_key entry_key;
|
||||
enum grub_fshelp_filetype entry_type;
|
||||
enum grub_reiserfs_item_type entry_type;
|
||||
char *entry_name;
|
||||
|
||||
if (!(entry_state & GRUB_REISERFS_VISIBLE_MASK))
|
||||
|
||||
@@ -297,17 +297,10 @@ static grub_ssize_t
|
||||
grub_cpio_read (grub_file_t file, char *buf, grub_size_t len)
|
||||
{
|
||||
struct grub_archelp_data *data;
|
||||
grub_ssize_t ret;
|
||||
|
||||
data = file->data;
|
||||
|
||||
data->disk->read_hook = file->read_hook;
|
||||
data->disk->read_hook_data = file->read_hook_data;
|
||||
ret = (grub_disk_read (data->disk, 0, data->dofs + file->offset,
|
||||
len, buf)) ? -1 : (grub_ssize_t) len;
|
||||
data->disk->read_hook = 0;
|
||||
|
||||
return ret;
|
||||
return (grub_disk_read (data->disk, 0, data->dofs + file->offset,
|
||||
len, buf)) ? -1 : (grub_ssize_t) len;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
|
||||
@@ -129,7 +129,7 @@ LEAF_HASH (int bs, grub_uint64_t h, zap_leaf_phys_t *l)
|
||||
static inline int
|
||||
ZAP_LEAF_NUMCHUNKS (int bs)
|
||||
{
|
||||
return (((1U << bs) - 2 * ZAP_LEAF_HASH_NUMENTRIES (bs)) /
|
||||
return (((1 << bs) - 2 * ZAP_LEAF_HASH_NUMENTRIES (bs)) /
|
||||
ZAP_LEAF_CHUNKSIZE - 2);
|
||||
}
|
||||
|
||||
@@ -877,13 +877,18 @@ nvlist_next_nvpair (const char *nvl, const char *nvpair)
|
||||
* containing the name of nvpair is saved in buf.
|
||||
*/
|
||||
static int
|
||||
nvpair_name (const char *nvp, char **buf, grub_size_t *buflen)
|
||||
nvpair_name (const char *nvp, char **buf, int *buflen)
|
||||
{
|
||||
int len;
|
||||
|
||||
/* skip over encode/decode size */
|
||||
nvp += 4 * 2;
|
||||
|
||||
len = grub_be_to_cpu32 (grub_get_unaligned32 (nvp));
|
||||
nvp=nvp+4;
|
||||
|
||||
*buf = (char *) (nvp + 4);
|
||||
*buflen = grub_be_to_cpu32 (grub_get_unaligned32 (nvp));
|
||||
*buf=(char*)nvp;
|
||||
*buflen=len;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1108,15 +1113,15 @@ check_pool_label (struct grub_zfs_data *data,
|
||||
const char *nvp=NULL;
|
||||
char name[MAX_SUPPORTED_FEATURE_STRLEN + 1];
|
||||
char *nameptr;
|
||||
grub_size_t namelen;
|
||||
int namelen;
|
||||
while ((nvp = nvlist_next_nvpair(features, nvp)) != NULL)
|
||||
{
|
||||
nvpair_name (nvp, &nameptr, &namelen);
|
||||
nvpair_name(nvp, &nameptr,&namelen);
|
||||
if(namelen > MAX_SUPPORTED_FEATURE_STRLEN)
|
||||
namelen = MAX_SUPPORTED_FEATURE_STRLEN;
|
||||
grub_memcpy (name, nameptr, namelen);
|
||||
name[namelen] = '\0';
|
||||
grub_dprintf("zfs","str=%s\n",name);
|
||||
grub_strncpy(name,nameptr,namelen);
|
||||
name[namelen]=0;
|
||||
grub_dprintf("zfs","namelen=%u str=%s\n",namelen,name);
|
||||
if (check_feature(name,1, NULL) != 0)
|
||||
{
|
||||
grub_dprintf("zfs","feature missing in check_pool_label:%s\n",name);
|
||||
@@ -3303,8 +3308,7 @@ nvlist_find_value (const char *nvlist_in, const char *name,
|
||||
int valtype, char **val,
|
||||
grub_size_t *size_out, grub_size_t *nelm_out)
|
||||
{
|
||||
grub_size_t nvp_name_len, name_len = grub_strlen(name);
|
||||
int type;
|
||||
int name_len, type ;
|
||||
const char *nvpair=NULL,*nvlist=nvlist_in;
|
||||
char *nvp_name;
|
||||
|
||||
@@ -3325,12 +3329,9 @@ nvlist_find_value (const char *nvlist_in, const char *name,
|
||||
*/
|
||||
while ((nvpair=nvlist_next_nvpair(nvlist,nvpair)))
|
||||
{
|
||||
nvpair_name(nvpair,&nvp_name, &nvp_name_len);
|
||||
nvpair_name(nvpair,&nvp_name,&name_len);
|
||||
type = nvpair_type(nvpair);
|
||||
if (type == valtype
|
||||
&& (nvp_name_len == name_len
|
||||
|| (nvp_name_len > name_len && nvp_name[name_len] == '\0'))
|
||||
&& grub_memcmp (nvp_name, name, name_len) == 0)
|
||||
if ((grub_strncmp (nvp_name, name, grub_strlen(name)) == 0) && type == valtype)
|
||||
{
|
||||
return nvpair_value(nvpair,val,size_out,nelm_out);
|
||||
}
|
||||
|
||||
@@ -143,7 +143,7 @@ grub_ccm_decrypt (grub_crypto_cipher_handle_t cipher,
|
||||
return err;
|
||||
if (mac_out)
|
||||
grub_crypto_xor (mac_out, mac, mul, m);
|
||||
return GPG_ERR_NO_ERROR;
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -244,7 +244,7 @@ grub_gcm_decrypt (grub_crypto_cipher_handle_t cipher,
|
||||
if (mac_out)
|
||||
grub_crypto_xor (mac_out, mac, mac_xor, m);
|
||||
|
||||
return GPG_ERR_NO_ERROR;
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
|
||||
@@ -258,14 +258,13 @@ algo_decrypt (grub_crypto_cipher_handle_t cipher, grub_uint64_t algo,
|
||||
switch (algo)
|
||||
{
|
||||
case 0:
|
||||
return grub_ccm_decrypt (cipher, out, in, psize,
|
||||
mac_out, nonce, l, m);
|
||||
return grub_ccm_decrypt (cipher, out, in, psize, mac_out, nonce, l, m);
|
||||
case 1:
|
||||
return grub_gcm_decrypt (cipher, out, in, psize,
|
||||
mac_out, nonce,
|
||||
return grub_gcm_decrypt (cipher, out, in, psize, mac_out, nonce,
|
||||
15 - l, m);
|
||||
default:
|
||||
return GPG_ERR_CIPHER_ALGO;
|
||||
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, "algorithm %lld is not supported yet",
|
||||
(long long) algo);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -280,7 +279,7 @@ grub_zfs_decrypt_real (grub_crypto_cipher_handle_t cipher,
|
||||
grub_uint32_t mac[4];
|
||||
unsigned i;
|
||||
grub_uint32_t sw[4];
|
||||
gcry_err_code_t err;
|
||||
grub_err_t err;
|
||||
|
||||
grub_memcpy (sw, nonce, 16);
|
||||
if (endian != GRUB_ZFS_BIG_ENDIAN)
|
||||
@@ -296,7 +295,7 @@ grub_zfs_decrypt_real (grub_crypto_cipher_handle_t cipher,
|
||||
size, mac,
|
||||
sw + 1, 3, 12);
|
||||
if (err)
|
||||
return grub_crypto_gcry_error (err);
|
||||
return err;
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
if (grub_zfs_to_cpu32 (expected_mac[i], endian)
|
||||
@@ -418,7 +417,7 @@ grub_cmd_zfs_key (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
if (argc > 0)
|
||||
{
|
||||
grub_file_t file;
|
||||
file = grub_file_open (args[0], GRUB_FILE_TYPE_ZFS_ENCRYPTION_KEY);
|
||||
file = grub_file_open (args[0]);
|
||||
if (!file)
|
||||
return grub_errno;
|
||||
real_size = grub_file_read (file, buf, 1024);
|
||||
|
||||
@@ -201,7 +201,7 @@ grub_gdb_hex2int (char **ptr, grub_uint64_t *int_value)
|
||||
}
|
||||
|
||||
/* This function does all command procesing for interfacing to gdb. */
|
||||
void __attribute__ ((regparm(3)))
|
||||
void
|
||||
grub_gdb_trap (int trap_no)
|
||||
{
|
||||
unsigned int sig_no;
|
||||
@@ -216,7 +216,7 @@ grub_gdb_trap (int trap_no)
|
||||
grub_backtrace_print_address ((void *) grub_gdb_regs[PC]);
|
||||
grub_printf ("\n");
|
||||
grub_backtrace_pointer ((void *) grub_gdb_regs[EBP]);
|
||||
grub_fatal ("Unhandled exception");
|
||||
grub_abort ();
|
||||
}
|
||||
|
||||
sig_no = grub_gdb_trap2sig (trap_no);
|
||||
|
||||
@@ -35,7 +35,7 @@ deps=`grep ^$modname: $moddep | sed s@^.*:@@`
|
||||
# remove old files if any
|
||||
rm -f $tmpfile $outfile
|
||||
|
||||
if test x@TARGET_APPLE_LINKER@ != x1; then
|
||||
if test x@TARGET_APPLE_CC@ != x1; then
|
||||
# stripout .modname and .moddeps sections from input module
|
||||
@TARGET_OBJCOPY@ -R .modname -R .moddeps $infile $tmpfile
|
||||
|
||||
|
||||
@@ -22,12 +22,9 @@ module=$1
|
||||
modname=`echo $module | sed -e 's@\.module.*$@@'`
|
||||
|
||||
# Print all symbols defined by module
|
||||
if test x"@TARGET_NMFLAGS_DEFINED_ONLY@" = x && test x"@TARGET_NMFLAGS_MINUS_P@" = x; then
|
||||
@TARGET_NM@ -g -p $module | \
|
||||
sed -n "s@^\([0-9a-fA-F]*\) *[TBRDS] *\([^ ]*\).*@defined $modname \2@p"
|
||||
elif test x"@TARGET_NMFLAGS_DEFINED_ONLY@" = x; then
|
||||
if test x"@TARGET_NMFLAGS_DEFINED_ONLY@" = x; then
|
||||
@TARGET_NM@ -g @TARGET_NMFLAGS_MINUS_P@ -p $module | \
|
||||
sed -n "s@^\([^ ]*\) *[TBRDS] *\([0-9a-fA-F]*\).*@defined $modname \1@p"
|
||||
sed -n "s@^\([0-9a-fA-F]*\) *[TBRDS] *\([^ ]*\).*@defined $modname \2@p"
|
||||
else
|
||||
@TARGET_NM@ -g --defined-only @TARGET_NMFLAGS_MINUS_P@ -p $module | \
|
||||
sed "s@^\([^ ]*\).*@defined $modname \1@g"
|
||||
|
||||
@@ -34,6 +34,8 @@ GRUB_MOD_LICENSE ("GPLv3+");
|
||||
http://www.gnu.org/software/autoconf/manual/gettext/MO-Files.html .
|
||||
*/
|
||||
|
||||
static struct grub_gettext_context main_context, secondary_context;
|
||||
|
||||
static const char *(*grub_gettext_original) (const char *s);
|
||||
|
||||
struct grub_gettext_msg
|
||||
@@ -67,8 +69,6 @@ struct grub_gettext_context
|
||||
struct grub_gettext_msg *grub_gettext_msg_list;
|
||||
};
|
||||
|
||||
static struct grub_gettext_context main_context, secondary_context;
|
||||
|
||||
#define MO_MAGIC_NUMBER 0x950412de
|
||||
|
||||
static grub_err_t
|
||||
@@ -291,7 +291,7 @@ grub_mofile_open (struct grub_gettext_context *ctx,
|
||||
/* Using fd_mo and not another variable because
|
||||
it's needed for grub_gettext_get_info. */
|
||||
|
||||
fd = grub_file_open (filename, GRUB_FILE_TYPE_GETTEXT_CATALOG);
|
||||
fd = grub_file_open (filename);
|
||||
|
||||
if (!fd)
|
||||
return grub_errno;
|
||||
@@ -423,10 +423,6 @@ grub_gettext_init_ext (struct grub_gettext_context *ctx,
|
||||
|
||||
grub_free (lang);
|
||||
}
|
||||
|
||||
if (locale[0] == 'e' && locale[1] == 'n'
|
||||
&& (locale[2] == '\0' || locale[2] == '_'))
|
||||
grub_errno = err = GRUB_ERR_NONE;
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
@@ -234,30 +234,14 @@ static void
|
||||
box_paint (void *vself, const grub_video_rect_t *region)
|
||||
{
|
||||
grub_gui_box_t self = vself;
|
||||
|
||||
struct component_node *cur;
|
||||
grub_video_rect_t vpsave;
|
||||
|
||||
grub_video_area_status_t box_area_status;
|
||||
grub_video_get_area_status (&box_area_status);
|
||||
|
||||
grub_gui_set_viewport (&self->bounds, &vpsave);
|
||||
for (cur = self->chead.next; cur != &self->ctail; cur = cur->next)
|
||||
{
|
||||
grub_gui_component_t comp = cur->component;
|
||||
grub_video_rect_t r;
|
||||
comp->ops->get_bounds(comp, &r);
|
||||
|
||||
if (!grub_video_have_common_points (region, &r))
|
||||
continue;
|
||||
|
||||
/* Paint the child. */
|
||||
if (box_area_status == GRUB_VIDEO_AREA_ENABLED
|
||||
&& grub_video_bounds_inside_region (&r, region))
|
||||
grub_video_set_area_status (GRUB_VIDEO_AREA_DISABLED);
|
||||
comp->ops->paint (comp, region);
|
||||
if (box_area_status == GRUB_VIDEO_AREA_ENABLED)
|
||||
grub_video_set_area_status (GRUB_VIDEO_AREA_ENABLED);
|
||||
}
|
||||
grub_gui_restore_viewport (&vpsave);
|
||||
}
|
||||
|
||||
@@ -80,13 +80,9 @@ static void
|
||||
canvas_paint (void *vself, const grub_video_rect_t *region)
|
||||
{
|
||||
grub_gui_canvas_t self = vself;
|
||||
|
||||
struct component_node *cur;
|
||||
grub_video_rect_t vpsave;
|
||||
|
||||
grub_video_area_status_t canvas_area_status;
|
||||
grub_video_get_area_status (&canvas_area_status);
|
||||
|
||||
grub_gui_set_viewport (&self->bounds, &vpsave);
|
||||
for (cur = self->components.next; cur; cur = cur->next)
|
||||
{
|
||||
@@ -139,16 +135,9 @@ canvas_paint (void *vself, const grub_video_rect_t *region)
|
||||
r.height = h;
|
||||
comp->ops->set_bounds (comp, &r);
|
||||
|
||||
if (!grub_video_have_common_points (region, &r))
|
||||
continue;
|
||||
|
||||
/* Paint the child. */
|
||||
if (canvas_area_status == GRUB_VIDEO_AREA_ENABLED
|
||||
&& grub_video_bounds_inside_region (&r, region))
|
||||
grub_video_set_area_status (GRUB_VIDEO_AREA_DISABLED);
|
||||
comp->ops->paint (comp, region);
|
||||
if (canvas_area_status == GRUB_VIDEO_AREA_ENABLED)
|
||||
grub_video_set_area_status (GRUB_VIDEO_AREA_ENABLED);
|
||||
if (grub_video_have_common_points (region, &r))
|
||||
comp->ops->paint (comp, region);
|
||||
}
|
||||
grub_gui_restore_viewport (&vpsave);
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@ struct grub_gui_circular_progress
|
||||
int start;
|
||||
int end;
|
||||
int value;
|
||||
unsigned num_ticks;
|
||||
int num_ticks;
|
||||
int start_angle;
|
||||
int ticks_disappear;
|
||||
char *theme_dir;
|
||||
@@ -139,16 +139,15 @@ circprog_paint (void *vself, const grub_video_rect_t *region)
|
||||
center_width, center_height);
|
||||
|
||||
int radius = grub_min (height, width) / 2 - grub_max (tick_height, tick_width) / 2 - 1;
|
||||
unsigned nticks;
|
||||
unsigned tick_begin;
|
||||
unsigned tick_end;
|
||||
if (self->end <= self->start
|
||||
|| self->value <= self->start)
|
||||
int nticks;
|
||||
int tick_begin;
|
||||
int tick_end;
|
||||
if (self->end == self->start)
|
||||
nticks = 0;
|
||||
else
|
||||
nticks = ((unsigned) (self->num_ticks
|
||||
* (self->value - self->start)))
|
||||
/ ((unsigned) (self->end - self->start));
|
||||
nticks = (self->num_ticks
|
||||
* (self->value - self->start)
|
||||
/ (self->end - self->start));
|
||||
/* Do ticks appear or disappear as the value approached the end? */
|
||||
if (self->ticks_disappear)
|
||||
{
|
||||
@@ -161,7 +160,7 @@ circprog_paint (void *vself, const grub_video_rect_t *region)
|
||||
tick_end = nticks;
|
||||
}
|
||||
|
||||
unsigned i;
|
||||
int i;
|
||||
for (i = tick_begin; i < tick_end; i++)
|
||||
{
|
||||
int x;
|
||||
@@ -169,8 +168,7 @@ circprog_paint (void *vself, const grub_video_rect_t *region)
|
||||
int angle;
|
||||
|
||||
/* Calculate the location of the tick. */
|
||||
angle = self->start_angle
|
||||
+ i * GRUB_TRIG_ANGLE_MAX / self->num_ticks;
|
||||
angle = self->start_angle + i * GRUB_TRIG_ANGLE_MAX / self->num_ticks;
|
||||
x = width / 2 + (grub_cos (angle) * radius / GRUB_TRIG_FRACTION_SCALE);
|
||||
y = height / 2 + (grub_sin (angle) * radius / GRUB_TRIG_FRACTION_SCALE);
|
||||
|
||||
@@ -240,7 +238,7 @@ parse_angle (const char *value)
|
||||
/* Unicode symbol of degrees (a circle, U+b0). Put here in UTF-8 to
|
||||
avoid potential problem with text file reesncoding */
|
||||
|| grub_strcmp (ptr, "\xc2\xb0") == 0)
|
||||
angle = grub_divide_round (angle * 64, 90);
|
||||
angle = (angle * 64 + 45) / 90;
|
||||
return angle;
|
||||
}
|
||||
|
||||
@@ -250,7 +248,7 @@ circprog_set_property (void *vself, const char *name, const char *value)
|
||||
circular_progress_t self = vself;
|
||||
if (grub_strcmp (name, "num_ticks") == 0)
|
||||
{
|
||||
self->num_ticks = grub_strtoul (value, 0, 10);
|
||||
self->num_ticks = grub_strtol (value, 0, 10);
|
||||
}
|
||||
else if (grub_strcmp (name, "start_angle") == 0)
|
||||
{
|
||||
|
||||
@@ -251,24 +251,18 @@ draw_scrollbar (list_impl_t self,
|
||||
int value, int extent, int min, int max,
|
||||
int scrollbar_width, int scrollbar_height)
|
||||
{
|
||||
unsigned thumby, thumbheight;
|
||||
|
||||
grub_gfxmenu_box_t frame = self->scrollbar_frame;
|
||||
grub_gfxmenu_box_t thumb = self->scrollbar_thumb;
|
||||
int frame_vertical_pad = (frame->get_top_pad (frame)
|
||||
+ frame->get_bottom_pad (frame));
|
||||
int frame_horizontal_pad = (frame->get_left_pad (frame)
|
||||
+ frame->get_right_pad (frame));
|
||||
unsigned thumb_vertical_pad = (thumb->get_top_pad (thumb)
|
||||
+ thumb->get_bottom_pad (thumb));
|
||||
int thumb_vertical_pad = (thumb->get_top_pad (thumb)
|
||||
+ thumb->get_bottom_pad (thumb));
|
||||
int thumb_horizontal_pad = (thumb->get_left_pad (thumb)
|
||||
+ thumb->get_right_pad (thumb));
|
||||
int tracktop = frame->get_top_pad (frame);
|
||||
unsigned tracklen;
|
||||
if (scrollbar_height <= frame_vertical_pad)
|
||||
tracklen = 0;
|
||||
else
|
||||
tracklen = scrollbar_height - frame_vertical_pad;
|
||||
int tracklen = scrollbar_height - frame_vertical_pad;
|
||||
frame->set_content_size (frame,
|
||||
scrollbar_width - frame_horizontal_pad,
|
||||
tracklen);
|
||||
@@ -277,28 +271,15 @@ draw_scrollbar (list_impl_t self,
|
||||
tracklen += thumb_vertical_pad;
|
||||
tracktop -= thumb->get_top_pad (thumb);
|
||||
}
|
||||
if (value <= min || max <= min)
|
||||
thumby = 0;
|
||||
else
|
||||
thumby = ((unsigned) tracklen * (value - min))
|
||||
/ ((unsigned) (max - min));
|
||||
if (max <= min)
|
||||
thumbheight = 1;
|
||||
else
|
||||
thumbheight = ((unsigned) (tracklen * extent)
|
||||
/ ((unsigned) (max - min))) + 1;
|
||||
int thumby = tracktop + tracklen * (value - min) / (max - min);
|
||||
int thumbheight = tracklen * extent / (max - min) + 1;
|
||||
/* Rare occasion: too many entries or too low height. */
|
||||
if (thumbheight < thumb_vertical_pad)
|
||||
{
|
||||
thumbheight = thumb_vertical_pad;
|
||||
if (value <= min || max <= extent
|
||||
|| tracklen <= thumb_vertical_pad)
|
||||
thumby = 0;
|
||||
else
|
||||
thumby = ((unsigned) ((tracklen - thumb_vertical_pad) * (value - min))
|
||||
/ ((unsigned)(max - extent)));
|
||||
thumby = tracktop + ((tracklen - thumb_vertical_pad) * (value - min)
|
||||
/ (max - extent));
|
||||
}
|
||||
thumby += tracktop;
|
||||
int thumbx = frame->get_left_pad (frame);
|
||||
int thumbwidth = scrollbar_width - frame_horizontal_pad;
|
||||
if (!self->scrollbar_thumb_overlay)
|
||||
|
||||
@@ -169,12 +169,8 @@ draw_pixmap_bar (grub_gui_progress_bar_t self)
|
||||
else
|
||||
hlheight -= hl_v_pad;
|
||||
|
||||
if (self->value <= self->start
|
||||
|| self->end <= self->start)
|
||||
barwidth = 0;
|
||||
else
|
||||
barwidth = ((unsigned) (tracklen * (self->value - self->start))
|
||||
/ ((unsigned) (self->end - self->start)));
|
||||
barwidth = (tracklen * (self->value - self->start)
|
||||
/ (self->end - self->start));
|
||||
|
||||
if (barwidth >= hl_h_pad)
|
||||
{
|
||||
|
||||
@@ -137,19 +137,23 @@ static struct grub_video_bitmap *
|
||||
try_loading_icon (grub_gfxmenu_icon_manager_t mgr,
|
||||
const char *dir, const char *class_name)
|
||||
{
|
||||
char *path, *ptr;
|
||||
char *path;
|
||||
int l;
|
||||
|
||||
path = grub_malloc (grub_strlen (dir) + grub_strlen (class_name)
|
||||
+ grub_strlen (icon_extension) + 3);
|
||||
if (! path)
|
||||
return 0;
|
||||
|
||||
ptr = grub_stpcpy (path, dir);
|
||||
if (path == ptr || ptr[-1] != '/')
|
||||
*ptr++ = '/';
|
||||
ptr = grub_stpcpy (ptr, class_name);
|
||||
ptr = grub_stpcpy (ptr, icon_extension);
|
||||
*ptr = '\0';
|
||||
grub_strcpy (path, dir);
|
||||
l = grub_strlen (path);
|
||||
if (path[l-1] != '/')
|
||||
{
|
||||
path[l] = '/';
|
||||
path[l+1] = 0;
|
||||
}
|
||||
grub_strcat (path, class_name);
|
||||
grub_strcat (path, icon_extension);
|
||||
|
||||
struct grub_video_bitmap *raw_bitmap;
|
||||
grub_video_bitmap_load (&raw_bitmap, path);
|
||||
|
||||
@@ -743,7 +743,7 @@ grub_gfxmenu_view_load_theme (grub_gfxmenu_view_t view, const char *theme_path)
|
||||
p.view = view;
|
||||
p.theme_dir = grub_get_dirname (theme_path);
|
||||
|
||||
file = grub_file_open (theme_path, GRUB_FILE_TYPE_THEME);
|
||||
file = grub_file_open (theme_path);
|
||||
if (! file)
|
||||
{
|
||||
grub_free (p.theme_dir);
|
||||
|
||||
@@ -213,7 +213,6 @@ redraw_timeouts (struct grub_gfxmenu_view *view)
|
||||
{
|
||||
grub_video_rect_t bounds;
|
||||
cur->self->ops->get_bounds (cur->self, &bounds);
|
||||
grub_video_set_area_status (GRUB_VIDEO_AREA_ENABLED);
|
||||
grub_gfxmenu_view_redraw (view, &bounds);
|
||||
}
|
||||
}
|
||||
@@ -322,11 +321,6 @@ grub_gfxmenu_view_redraw (grub_gfxmenu_view_t view,
|
||||
grub_gfxterm_schedule_repaint ();
|
||||
|
||||
grub_video_set_active_render_target (GRUB_VIDEO_RENDER_TARGET_DISPLAY);
|
||||
grub_video_area_status_t area_status;
|
||||
grub_video_get_area_status (&area_status);
|
||||
if (area_status == GRUB_VIDEO_AREA_ENABLED)
|
||||
grub_video_set_region (region->x, region->y,
|
||||
region->width, region->height);
|
||||
|
||||
redraw_background (view, region);
|
||||
if (view->canvas)
|
||||
@@ -334,9 +328,6 @@ grub_gfxmenu_view_redraw (grub_gfxmenu_view_t view,
|
||||
draw_title (view);
|
||||
if (grub_video_have_common_points (&view->progress_message_frame, region))
|
||||
draw_message (view);
|
||||
|
||||
if (area_status == GRUB_VIDEO_AREA_ENABLED)
|
||||
grub_video_set_area_status (GRUB_VIDEO_AREA_ENABLED);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -359,15 +350,10 @@ grub_gfxmenu_view_draw (grub_gfxmenu_view_t view)
|
||||
refresh_menu_components (view);
|
||||
update_menu_components (view);
|
||||
|
||||
grub_video_set_area_status (GRUB_VIDEO_AREA_DISABLED);
|
||||
grub_gfxmenu_view_redraw (view, &view->screen);
|
||||
grub_video_swap_buffers ();
|
||||
if (view->double_repaint)
|
||||
{
|
||||
grub_video_set_area_status (GRUB_VIDEO_AREA_DISABLED);
|
||||
grub_gfxmenu_view_redraw (view, &view->screen);
|
||||
}
|
||||
|
||||
grub_gfxmenu_view_redraw (view, &view->screen);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -381,7 +367,6 @@ redraw_menu_visit (grub_gui_component_t component,
|
||||
grub_video_rect_t bounds;
|
||||
|
||||
component->ops->get_bounds (component, &bounds);
|
||||
grub_video_set_area_status (GRUB_VIDEO_AREA_ENABLED);
|
||||
grub_gfxmenu_view_redraw (view, &bounds);
|
||||
}
|
||||
}
|
||||
@@ -419,8 +404,6 @@ grub_gfxmenu_draw_terminal_box (void)
|
||||
if (!term_box)
|
||||
return;
|
||||
|
||||
grub_video_set_area_status (GRUB_VIDEO_AREA_DISABLED);
|
||||
|
||||
term_box->set_content_size (term_box, term_view->terminal_rect.width,
|
||||
term_view->terminal_rect.height);
|
||||
|
||||
|
||||
@@ -43,8 +43,7 @@ typedef struct grub_bufio *grub_bufio_t;
|
||||
static struct grub_fs grub_bufio_fs;
|
||||
|
||||
grub_file_t
|
||||
grub_bufio_open (grub_file_t io,
|
||||
grub_size_t size)
|
||||
grub_bufio_open (grub_file_t io, int size)
|
||||
{
|
||||
grub_file_t file;
|
||||
grub_bufio_t bufio = 0;
|
||||
@@ -58,7 +57,7 @@ grub_bufio_open (grub_file_t io,
|
||||
else if (size > GRUB_BUFIO_MAX_SIZE)
|
||||
size = GRUB_BUFIO_MAX_SIZE;
|
||||
|
||||
if (size > io->size)
|
||||
if ((size < 0) || ((unsigned) size > io->size))
|
||||
size = ((io->size > GRUB_BUFIO_MAX_SIZE) ? GRUB_BUFIO_MAX_SIZE :
|
||||
io->size);
|
||||
|
||||
@@ -82,12 +81,11 @@ grub_bufio_open (grub_file_t io,
|
||||
}
|
||||
|
||||
grub_file_t
|
||||
grub_buffile_open (const char *name, enum grub_file_type type,
|
||||
grub_size_t size)
|
||||
grub_buffile_open (const char *name, int size)
|
||||
{
|
||||
grub_file_t io, file;
|
||||
|
||||
io = grub_file_open (name, type);
|
||||
io = grub_file_open (name);
|
||||
if (! io)
|
||||
return 0;
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user