Merge branch 'master' into leiflindholm/arm64

Conflicts:
	include/grub/util/install.h
This commit is contained in:
Vladimir Serbinenko 2013-11-25 13:02:27 +01:00
commit d6c92cdc34
82 changed files with 2897 additions and 353 deletions

283
ChangeLog
View file

@ -1,3 +1,286 @@
2013-11-25 Vladimir Serbinenko <phcoder@gmail.com>
* grub-core/osdep/unix/platform.c (get_ofpathname): Trim ending newline.
Don't rely on PATH_MAX.
2013-11-25 Vladimir Serbinenko <phcoder@gmail.com>
* grub-core/genmoddep.awk: Use more portable && rather than and.
2013-11-24 Vladimir Serbinenko <phcoder@gmail.com>
* grub-core/kern/i386/pc/startup.S [__APPLE__]: Create _edata by placing
an object after data. While it doesn't seem right solution, it
works well enough and OSX isn't main compilation platform.
2013-11-24 Vladimir Serbinenko <phcoder@gmail.com>
* gentpl.py: Add -ed2016 in order to make objconv accept our binary.
While it doesn't seem right solution, it works well enough and
OSX isn't main compilation platform.
2013-11-24 Vladimir Serbinenko <phcoder@gmail.com>
* configure.ac: Add -static to LDFLAGS when using apple linker to
prevent it from pulling in dynamic linker.
2013-11-24 Vladimir Serbinenko <phcoder@gmail.com>
Apple assembly doesn't handle symbol arithmetic well. So define an
offset symbol in boot.S and use it.
2013-11-24 Vladimir Serbinenko <phcoder@gmail.com>
Apple assembly doesn't handle symbol arithmetic well. So instead
of getting addres of kernel_sector + 4 define kernel_sector_high.
It also makes code more readable.
2013-11-24 Vladimir Serbinenko <phcoder@gmail.com>
With Apple assembly in .macro environvemnt you have to use $$ instead
of $. So introduce new preprocessor macro MACRO_DOLLAR(x) which expands
to $$x on Apple and to $x on everything else.
2013-11-24 Vladimir Serbinenko <phcoder@gmail.com>
* grub-core/Makefile.am: Use correct TARGET_OBJCONV rather than
OBJCONV.
2013-11-24 Vladimir Serbinenko <phcoder@gmail.com>
* grub-core/gdb/i386/machdep.S: Use xorl %eax, %eax on both Apple
and non-Apple. This instruction is shorter and faster,
so no reason not to use it on both.
2013-11-24 Vladimir Serbinenko <phcoder@gmail.com>
* grub-core/lib/reed_solomon.c: Use section _text, _text rather than
.text when compiling for Apple.
2013-11-24 Vladimir Serbinenko <phcoder@gmail.com>
* grub-core/term/arc/console.c: Add missing cast to silence warning.
2013-11-24 Vladimir Serbinenko <phcoder@gmail.com>
* grub-core/boot/i386/pc/boot.S: Fix floppy probe. Due to missing
%dx restore the probe worked on non-existant drive. Reorganize the
code a little bit to free 2 bytes necessary for push/pop.
2013-11-23 Vladimir Serbinenko <phcoder@gmail.com>
* grub-core/kern/mips/arc/init.c (grub_machine_get_bootlocation):
Add missing cast to silence warning.
2013-11-23 Keshav Padram Amburay <the.ridikulus.rat@gmail.com>
* util/grub-install.c (update_nvram): Support --no-nvram flag
for EFI targets.
2013-11-23 Vladimir Serbinenko <phcoder@gmail.com>
* INSTALL: Add note about sparc64/ia64 with clang (unsupported).
2013-11-23 Vladimir Serbinenko <phcoder@gmail.com>
* util/garbage-gen.c: Add missing include of sys/time.h.
2013-11-23 Vladimir Serbinenko <phcoder@gmail.com>
Don't add -mflush-func if it's not supported by compiler.
2013-11-23 Vladimir Serbinenko <phcoder@gmail.com>
Move common BIOS/coreboot memory map declarations to
include/grub/i386/memory_raw.h and eliminate duplicate declarations.
2013-11-22 Andrey Borzenkov <arvidjaar@gmail.com>
* Makefile.am: Add util/garbage-gen.c to EXTRA_DIST.
2013-11-22 Vladimir Serbinenko <phcoder@gmail.com>
* INSTALL: Document why older clang versions aren't appropriate.
2013-11-22 Vladimir Serbinenko <phcoder@gmail.com>
* INSTALL: Document about clang for mips.
2013-11-22 Vladimir Serbinenko <phcoder@gmail.com>
* grub-core/lib/libgcrypt/mpi/longlong.h: Use C version with mips
clang.
2013-11-22 Vladimir Serbinenko <phcoder@gmail.com>
Add *-xen to the list of grub-install-common platforms.
2013-11-22 Vladimir Serbinenko <phcoder@gmail.com>
* configure.ac: Do not enforce -mcmodel=large. It's not necessarry with
3 last commits.
2013-11-22 Vladimir Serbinenko <phcoder@gmail.com>
* grub-core/kern/xen/init.c: Do not map more pages than we can address.
2013-11-22 Vladimir Serbinenko <phcoder@gmail.com>
* grub-core/kern/efi/mm.c: Limit allocations to 2GiB when not compiling
with -mcmodel=large.
2013-11-22 Vladimir Serbinenko <phcoder@gmail.com>
* grub-core/kern/x86_64/dl.c (grub_arch_dl_relocate_symbols): Add
range-checking for 32-bit quantities.
2013-11-22 Vladimir Serbinenko <phcoder@gmail.com>
* configure.ac: Compile with -fPIC when compiling with clang on
mips.
2013-11-22 Vladimir Serbinenko <phcoder@gmail.com>
* configure.ac: Add -no-integrated-as on mips(el) to TARGET_CCASFLAGS
when compiling with clang.
2013-11-22 Vladimir Serbinenko <phcoder@gmail.com>
clang emits calls to abort () under some unknown conditions.
Export abort () when compiling with clang.
2013-11-22 Vladimir Serbinenko <phcoder@gmail.com>
* docs/grub-dev.texi: Document stack and heap sizes.
2013-11-22 Vladimir Serbinenko <phcoder@gmail.com>
* include/grub/i386/pc/memory.h: Decrease
GRUB_MEMORY_MACHINE_SCRATCH_SIZE and increase
GRUB_MEMORY_MACHINE_PROT_STACK_SIZE.
The binary doesn't change (checked). It's more to better reflect actual
usage.
2013-11-22 Vladimir Serbinenko <phcoder@gmail.com>
* grub-core/disk/i386/pc/biosdisk.c (grub_biosdisk_open): Ensure
at compile time that enough of scratch size is available.
2013-11-22 Vladimir Serbinenko <phcoder@gmail.com>
* grub-core/kern/x86_64/efi/callwrap.S: Fix stack alignment.
Previously we misaligned stack by 8 in startup.S and compensated
for it in callwrap.S. According to ABI docs (EFI and sysv amd64)
right behaviour is to align stack in startup.S and keep it aligned
in callwrap.S. startup.S part was committed few commits before. This
takes care of callwrap.S.
Reported by: Gary Lin.
2013-11-22 Vladimir Serbinenko <phcoder@gmail.com>
* grub-core/boot/mips/startup_raw.S: Handle the case of gap between
.data and .bss. May happen if compiler and assembly use different
alignment.
2013-11-22 Vladimir Serbinenko <phcoder@gmail.com>
On MIPS handle got16 relocations to local symbols in an ABI-compliant
way.
2013-11-22 Vladimir Serbinenko <phcoder@gmail.com>
Add support for a new magic symbol _gp_disp on mips to handle PIC
binaries.
2013-11-22 Vladimir Serbinenko <phcoder@gmail.com>
Use $t9 for indirect calls from asm to C as PIC ABI requires.
2013-11-22 Vladimir Serbinenko <phcoder@gmail.com>
Remove -march=mips3 from TARGET_CCASFLAGS as it creates linking problem
when rest of GRUB is compiled for hisher stepping. Instead use
.set mips3/.set mips1 around cache and sync opcodes.
2013-11-21 Vladimir Serbinenko <phcoder@gmail.com>
Unify GOT/trampoline handling between PPC, MIPS and IA64 as they
do essentially the same thing, do it in similar way.
2013-11-21 Colin Watson <cjwatson@ubuntu.com>
* util/grub-mkrescue.c (main): If a source directory is not
specified, read platform-specific files from subdirectories of
pkglibdir, not pkgdatadir.
2013-11-21 Colin Watson <cjwatson@ubuntu.com>
* grub-core/normal/progress.c: Remove unused file.
2013-11-20 Vladimir Serbinenko <phcoder@gmail.com>
* grub-core/lib/crypto.c (grub_crypto_hash): Remove variable length
array.
2013-11-20 Vladimir Serbinenko <phcoder@gmail.com>
* util/grub-mkconfig.in: Say explicit "grub configuration" rather
than grub.cfg.
2013-11-20 Vladimir Serbinenko <phcoder@gmail.com>
* coreboot.cfg: Add missing file.
2013-11-19 Vladimir Serbinenko <phcoder@gmail.com>
* Makefile.am: Allow STRIP to be empty when creating windowszip.
2013-11-19 Axel Kellermann <axel.kellermann@gmx.de>
* util/grub.d/30_os-prober.in: Add GRUB_OS_PROBER_SKIP_LIST to
selectively skipping systems.
2013-11-19 Colin Watson <cjwatson@ubuntu.com>
* Makefile.util.def (grub-mkimage): Add
grub-core/osdep/aros/config.c to extra_dist.
* conf/Makefile.extra-dist (EXTRA_DIST): Add docs/autoiso.cfg,
docs/osdetect.cfg, grub-core/gnulib-fix-null-deref.diff,
grub-core/gnulib-fix-width.diff, grub-core/gnulib-no-abort.diff, and
grub-core/gnulib-no-gets.diff.
2013-11-19 Vladimir Serbinenko <phcoder@gmail.com>
Add automated filesystem checking based on scripts I've used now for
quite some time locally. Most of the test require root so they are
skipped when run without necessarry privelegies.
2013-11-19 Colin Watson <cjwatson@ubuntu.com>
* util/grub-install.c (main): Adjust info messages to match
installed paths of grub-bios-setup and grub-sparc64-setup.
2013-11-19 Colin Watson <cjwatson@ubuntu.com>
* util/grub-install-common.c (copy_locales): Consistently use
grub_util_get_localedir () rather than LOCALEDIR.
(grub_install_copy_files): Likewise.
2013-11-19 Josh Triplett <josh@joshtriplett.org>
* grub-core/kern/x86_64/efi/startup.S (_start): Align the stack to a
16-byte boundary, as required by the x86-64 ABI, before calling
grub_main. In some cases, GCC emits code that assumes this
alignment, which crashes if not aligned. The EFI firmware is also
entitled to assume that stack alignment without checking.
2013-11-18 Josh Triplett <josh@joshtriplett.org>
* grub-core/mmap/efi/mmap.c (grub_mmap_register): Round up/down to
4k page boundaries as expected by firmware rather than 1k
boundaries.
(grub_mmap_malign_and_register): Likewise.
2013-11-18 Vladimir Serbinenko <phcoder@gmail.com> 2013-11-18 Vladimir Serbinenko <phcoder@gmail.com>
* tests/grub_func_test.in: Decrease RAM size to 512M. With less * tests/grub_func_test.in: Decrease RAM size to 512M. With less

10
INSTALL
View file

@ -15,8 +15,18 @@ configuring the GRUB.
Note: older versions may work but support is limited 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 Note: clang 3.2 or later works for i386 and x86_64 targets but results in
much bigger binaries. much bigger binaries.
earlier versions not tested
Note: clang 3.2 or later works for arm Note: clang 3.2 or later works for arm
earlier versions not tested
Note: clang 3.3 or later works for mips(el)
earlier versions fail to generate .reginfo and hence gprel relocations
fail.
Note: clang 3.4 or later works for powerpc Note: clang 3.4 or later works for powerpc
earlier versions suffer from vacopy bug (#15286)
Note: clang has no support for generating 64-bit sparc code and hence you
can't compile GRUB for sparc64 with clang
Note: clang has no support for ia64 and hence you can't compile GRUB
for ia64 with clang
* GNU Make * GNU Make
* GNU Bison 2.3 or later * GNU Bison 2.3 or later
* GNU gettext 0.17 or later * GNU gettext 0.17 or later

View file

@ -70,6 +70,11 @@ build-grub-mkfont: util/grub-mkfont.c grub-core/unidata.c grub-core/kern/emu/mis
$(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 -DGRUB_BUILD_PROGRAM_NAME=\"build-grub-mkfont\" $^ $(build_freetype_cflags) $(build_freetype_libs) $(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 -DGRUB_BUILD_PROGRAM_NAME=\"build-grub-mkfont\" $^ $(build_freetype_cflags) $(build_freetype_libs)
CLEANFILES += build-grub-mkfont CLEANFILES += build-grub-mkfont
garbage-gen: util/garbage-gen.c
$(BUILD_CC) -o $@ $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $^
CLEANFILES += garbage-gen
EXTRA_DIST += util/garbage-gen.c
build-grub-gen-asciih: util/grub-gen-asciih.c 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 $(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 CLEANFILES += build-grub-gen-asciih
@ -406,7 +411,8 @@ windowsdir: $(PROGRAMS) $(starfield_DATA) $(platform_DATA)
test -d $(windowsdir)/themes || mkdir $(windowsdir)/themes test -d $(windowsdir)/themes || mkdir $(windowsdir)/themes
test -d $(windowsdir)/themes/starfield || mkdir $(windowsdir)/themes/starfield test -d $(windowsdir)/themes/starfield || mkdir $(windowsdir)/themes/starfield
for x in $(PROGRAMS); do \ for x in $(PROGRAMS); do \
$(STRIP) $$x -o $(windowsdir)/$$x; \ if [ x$(STRIP) != x ]; then $(STRIP) $$x -o $(windowsdir)/$$x; \
else cp -fp $$x $(windowsdir)/$$x; fi; \
done done
for x in $(pkgdata_DATA); do \ for x in $(pkgdata_DATA); do \
cp -fp $$x $(windowsdir)/$$x; \ cp -fp $$x $(windowsdir)/$$x; \

View file

@ -174,6 +174,7 @@ program = {
common = grub-core/kern/emu/argp_common.c; common = grub-core/kern/emu/argp_common.c;
common = grub-core/osdep/init.c; common = grub-core/osdep/init.c;
common = grub-core/osdep/config.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/windows/config.c;
extra_dist = grub-core/osdep/unix/config.c; extra_dist = grub-core/osdep/unix/config.c;
common = util/config.c; common = util/config.c;
@ -682,6 +683,127 @@ script = {
installdir = noinst; 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 = { script = {
testcase; testcase;
name = example_scripted_test; name = example_scripted_test;

View file

@ -10,10 +10,6 @@ if COND_mips_loongson
CFLAGS_PLATFORM += -mexplicit-relocs CFLAGS_PLATFORM += -mexplicit-relocs
CPPFLAGS_PLATFORM = -DUSE_ASCII_FALLBACK CPPFLAGS_PLATFORM = -DUSE_ASCII_FALLBACK
endif endif
if COND_mips
CFLAGS_PLATFORM += -mflush-func=grub_red_herring
CCASFLAGS_PLATFORM = -march=mips3
endif
if COND_sparc64_ieee1275 if COND_sparc64_ieee1275
CFLAGS_PLATFORM += -mno-app-regs CFLAGS_PLATFORM += -mno-app-regs
LDFLAGS_PLATFORM = -Wl,-melf64_sparc -mno-relax LDFLAGS_PLATFORM = -Wl,-melf64_sparc -mno-relax

View file

@ -12,7 +12,9 @@ EXTRA_DIST += util/import_gcry.py
EXTRA_DIST += util/import_unicode.py EXTRA_DIST += util/import_unicode.py
EXTRA_DIST += docs/man EXTRA_DIST += docs/man
EXTRA_DIST += docs/autoiso.cfg
EXTRA_DIST += docs/grub.cfg EXTRA_DIST += docs/grub.cfg
EXTRA_DIST += docs/osdetect.cfg
EXTRA_DIST += conf/i386-pc-cygwin-img-ld.sc EXTRA_DIST += conf/i386-pc-cygwin-img-ld.sc
@ -26,6 +28,11 @@ EXTRA_DIST += grub-core/gensymlist.sh
EXTRA_DIST += grub-core/genemuinit.sh EXTRA_DIST += grub-core/genemuinit.sh
EXTRA_DIST += grub-core/genemuinitheader.sh EXTRA_DIST += grub-core/genemuinitheader.sh
EXTRA_DIST += grub-core/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
EXTRA_DIST += grub-core/lib/libgcrypt-grub/mpi/generic EXTRA_DIST += grub-core/lib/libgcrypt-grub/mpi/generic
EXTRA_DIST += $(shell find $(top_srcdir)/include -name '*.h') EXTRA_DIST += $(shell find $(top_srcdir)/include -name '*.h')
@ -103,3 +110,4 @@ EXTRA_DIST += grub-core/osdep/windows/sleep.c
EXTRA_DIST += tests/dfly-mbr-mbexample.mbr.img.gz EXTRA_DIST += tests/dfly-mbr-mbexample.mbr.img.gz
EXTRA_DIST += tests/dfly-mbr-mbexample.dfly.img.gz EXTRA_DIST += tests/dfly-mbr-mbexample.dfly.img.gz
EXTRA_DIST += coreboot.cfg

View file

@ -492,7 +492,11 @@ AC_CACHE_CHECK([if compiling with clang], [grub_cv_cc_target_clang]
# on x86 clang doesn't support .code16 # on x86 clang doesn't support .code16
# on arm clang doesn't support .arch directive # 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 # on mips clang doesn't support privilegied instructions, doubleword store/load
# and crashes with hand-written assembly
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 \
|| test "x$target_cpu" = xmips || test "x$target_cpu" = xmipsel ); then
TARGET_CCASFLAGS="$TARGET_CCASFLAGS -no-integrated-as" TARGET_CCASFLAGS="$TARGET_CCASFLAGS -no-integrated-as"
fi fi
@ -522,6 +526,21 @@ if test "x$grub_cv_cc_target_clang" = xno && test "x$target_cpu" = xi386 && test
TARGET_CFLAGS="$TARGET_CFLAGS -mrtd -mregparm=3" TARGET_CFLAGS="$TARGET_CFLAGS -mrtd -mregparm=3"
fi fi
# on mips redirect cache flushing function to non-existant one.
if test "x$target_cpu" = xmips || test "x$target_cpu" = xmipsel ; then
AC_CACHE_CHECK([whether -mflush-func=grub_red_herring works], [grub_cv_cc_mflush_func], [
CFLAGS="$TARGET_CFLAGS -mflush-func=grub_red_herring -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
[grub_cv_cc_mflush_func=yes],
[grub_cv_cc_mflush_func=no])
])
if test "x$grub_cv_cc_mflush_func" = xyes; then
TARGET_CFLAGS="$TARGET_CFLAGS -mflush-func=grub_red_herring"
fi
fi
# Force no alignment to save space on i386. # Force no alignment to save space on i386.
if test "x$target_cpu" = xi386; then if test "x$target_cpu" = xi386; then
AC_CACHE_CHECK([whether -falign-loops works], [grub_cv_cc_falign_loop], [ AC_CACHE_CHECK([whether -falign-loops works], [grub_cv_cc_falign_loop], [
@ -660,8 +679,8 @@ if test x"$target_cpu" = xi386 || test x"$target_cpu" = xx86_64; then
if test x${target_cpu} != xi386 && test x$format = x${target_cpu}pe; then if test x${target_cpu} != xi386 && test x$format = x${target_cpu}pe; then
continue continue
fi fi
CFLAGS="$TARGET_CFLAGS -static" CFLAGS="$TARGET_CFLAGS"
LDFLAGS="$TARGET_LDFLAGS -Wl,$format -nostdlib" LDFLAGS="$TARGET_LDFLAGS -Wl,$format -nostdlib -static"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
asm (".globl start; start:"); asm (".globl start; start:");
asm (".globl _start; _start:"); asm (".globl _start; _start:");
@ -729,9 +748,7 @@ if test "$target_cpu" = x86_64; then
[grub_cv_cc_mcmodel=yes], [grub_cv_cc_mcmodel=yes],
[grub_cv_cc_mcmodel=no]) [grub_cv_cc_mcmodel=no])
]) ])
if test "x$grub_cv_cc_mcmodel" = xno; then if test "x$grub_cv_cc_mcmodel" = xyes; then
AC_MSG_ERROR([-mcmodel=large not supported. Upgrade your gcc.])
else
TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=large" TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=large"
fi fi
fi fi
@ -769,9 +786,16 @@ CFLAGS="$TARGET_CFLAGS"
# Position independent executable. # Position independent executable.
grub_CHECK_PIC grub_CHECK_PIC
[# Need that, because some distributions ship compilers that include [# On most platforms we don't want PIC as it only makes relocations harder
# `-fPIC' in the default specs. # and code less efficient. On mips we want to have one got table per module
if [ x"$pic_possible" = xyes ]; then # and reload $gp in every function.
# GCC implements it using symbol __gnu_local_gp in non-PIC as well.
# However with clang we need PIC for this reloading to happen.
# Since default varies across dictributions use either -fPIC or -fno-PIC
# explicitly.
if ( test x$target_cpu = xmips || test x$target_cpu = xmipsel ) && test "x$grub_cv_cc_target_clang" = xyes ; then
TARGET_CFLAGS="$TARGET_CFLAGS -fPIC"
elif [ x"$pic_possible" = xyes ]; then
TARGET_CFLAGS="$TARGET_CFLAGS -fno-PIC" TARGET_CFLAGS="$TARGET_CFLAGS -fno-PIC"
fi] fi]
@ -807,7 +831,7 @@ fi
# Set them to their new values for the tests below. # Set them to their new values for the tests below.
CC="$TARGET_CC" CC="$TARGET_CC"
if test "x$TARGET_APPLE_LINKER" = x1 ; then if test "x$TARGET_APPLE_LINKER" = x1 ; then
CFLAGS="$TARGET_CFLAGS -nostdlib -Wno-error" CFLAGS="$TARGET_CFLAGS -nostdlib -static -Wno-error"
else else
CFLAGS="$TARGET_CFLAGS -nostdlib -Wl,--defsym,___main=0x8100 -Wno-error" CFLAGS="$TARGET_CFLAGS -nostdlib -Wl,--defsym,___main=0x8100 -Wno-error"
fi fi
@ -833,7 +857,7 @@ fi
AC_CHECK_FUNCS(__bswapsi2 __bswapdi2 __ashldi3 __ashrdi3 __lshrdi3 __ucmpdi2 _restgpr_14_x) AC_CHECK_FUNCS(__bswapsi2 __bswapdi2 __ashldi3 __ashrdi3 __lshrdi3 __ucmpdi2 _restgpr_14_x)
if test "x$TARGET_APPLE_LINKER" = x1 ; then if test "x$TARGET_APPLE_LINKER" = x1 ; then
CFLAGS="$TARGET_CFLAGS -nostdlib" CFLAGS="$TARGET_CFLAGS -nostdlib -static"
else else
CFLAGS="$TARGET_CFLAGS -nostdlib -Wl,--defsym,___main=0x8100" CFLAGS="$TARGET_CFLAGS -nostdlib -Wl,--defsym,___main=0x8100"
fi fi

3
coreboot.cfg Normal file
View file

@ -0,0 +1,3 @@
if test -f (cbfsdisk)/etc/grub.cfg; then
source (cbfsdisk)/etc/grub.cfg
fi

View file

@ -79,6 +79,7 @@ This edition documents version @value{VERSION}.
* Contributing Changes:: * Contributing Changes::
* Porting:: * Porting::
* Error Handling:: * Error Handling::
* Stack and heap size::
* BIOS port memory map:: * BIOS port memory map::
* Video Subsystem:: * Video Subsystem::
* PFF2 Font File Format:: * PFF2 Font File Format::
@ -906,6 +907,69 @@ if (grub_errno != GRUB_ERR_NONE)
grub_error_pop (); grub_error_pop ();
@end example @end example
@node Stack and heap size
@chapter Stack and heap size
On emu stack and heap are just normal host OS stack and heap. Stack is typically
8 MiB although it's OS-dependent.
On i386-pc, i386-coreboot, i386-qemu and i386-multiboot the stack is 60KiB.
All available space between 1MiB and 4GiB marks is part of heap.
On *-xen stack is 4MiB. If compiled for x86-64 with GCC 4.4 or later adressable
space is unlimited. When compiled for x86-64 with older GCC version adressable
space is limited to 2GiB. When compiling for i386 adressable space is limited
to 4GiB. All adressable pages except the ones for stack, GRUB binary, special
pages and page table are in the heap.
On *-efi GRUB uses same stack as EFI. If compiled for x86-64 with GCC 4.4 or
later adressable space is unlimited. When compiled for x86-64 with older GCC
version adressable space is limited to 2GiB. For all other platforms adressable
space is limited to 4GiB. GRUB allocates pages from EFI for its heap, at most
1.6 GiB.
On i386-ieee1275 and powerpc-ieee1275 GRUB uses same stack as IEEE1275.
It allocates at most 32MiB for its heap.
On sparc64-ieee1275 stack is 256KiB and heap is 2MiB.
On mips(el)-qemu_mips and mipsel-loongson stack is 2MiB (everything below
GRUB image) and everything above GRUB image (from 2MiB + kernel size)
until 256MiB is part of heap.
On mips-arc stack is 2MiB (everything below GRUB image) and everything above
GRUB image(from 2MiB + kernel size) until 128MiB is part of heap.
On mipsel-arc stack is 2MiB (everything below GRUB image which is not part
of ARC) and everything above GRUB image (from 7MiB + kernel size)
until 256MiB is part of heap.
On arm-uboot stack is 256KiB and heap is 2MiB.
In short:
@multitable @columnfractions .15 .25 .5
@headitem Platform @tab Stack @tab Heap
@item emu @tab 8 MiB @tab ?
@item i386-pc @tab 60 KiB @tab < 4 GiB
@item i386-coreboot @tab 60 KiB @tab < 4 GiB
@item i386-multiboot @tab 60 KiB @tab < 4 GiB
@item i386-qemu @tab 60 KiB @tab < 4 GiB
@item *-efi @tab ? @tab < 1.6 GiB
@item i386-ieee1275 @tab ? @tab < 32 MiB
@item powerpc-ieee1275 @tab ? @tab < 32 MiB
@item sparc64-ieee1275 @tab 256KiB @tab 2 MiB
@item arm-uboot @tab 256KiB @tab 2 MiB
@item mips(el)-qemu_mips @tab 2MiB @tab 253 MiB
@item mipsel-loongson @tab 2MiB @tab 253 MiB
@item mips-arc @tab 2MiB @tab 125 MiB
@item mipsel-arc @tab 2MiB @tab 248 MiB
@item x86_64-xen (GCC >= 4.4) @tab 4MiB @tab unlimited
@item x86_64-xen (GCC < 4.4) @tab 4MiB @tab < 2GiB
@item i386-xen @tab 4MiB @tab < 4GiB
@end multitable
@node BIOS port memory map @node BIOS port memory map
@chapter BIOS port memory map @chapter BIOS port memory map
@c By Yoshinori K Okuji @c By Yoshinori K Okuji
@ -917,9 +981,8 @@ grub_error_pop ();
@item ? @tab 0x2000 - 1 @tab Real mode stack @item ? @tab 0x2000 - 1 @tab Real mode stack
@item 0x7C00 @tab 0x7D00 - 1 @tab Boot sector @item 0x7C00 @tab 0x7D00 - 1 @tab Boot sector
@item 0x8000 @tab ? @tab GRUB kernel @item 0x8000 @tab ? @tab GRUB kernel
@item 0x68000 @tab 0x78000 - 1 @tab Disk buffer @item 0x68000 @tab 0x71000 - 1 @tab Disk buffer
@item ? @tab 0x80000 - 1 @tab Protected mode stack @item ? @tab 0x80000 - 1 @tab Protected mode stack
@item 0x80000 @tab ? @tab Heap
@item ? @tab 0xA0000 - 1 @tab Extended BIOS Data Area @item ? @tab 0xA0000 - 1 @tab Extended BIOS Data Area
@item 0xA0000 @tab 0xC0000 - 1 @tab Video RAM @item 0xA0000 @tab 0xC0000 - 1 @tab Video RAM
@item 0xC0000 @tab 0x100000 - 1 @tab BIOS @item 0xC0000 @tab 0x100000 - 1 @tab BIOS

View file

@ -1451,6 +1451,10 @@ Normally, @command{grub-mkconfig} will try to use the external
systems installed on the same system and generate appropriate menu entries systems installed on the same system and generate appropriate menu entries
for them. Set this option to @samp{true} to disable this. 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 @item GRUB_DISABLE_SUBMENU
Normally, @command{grub-mkconfig} will generate top level menu entry for Normally, @command{grub-mkconfig} will generate top level menu entry for
the kernel with highest version number and put all other found kernels the kernel with highest version number and put all other found kernels

View file

@ -433,7 +433,7 @@ def kernel(platform):
else cp $< $@; fi""", else cp $< $@; fi""",
"""if test x$(TARGET_APPLE_LINKER) = x1; then \ """if test x$(TARGET_APPLE_LINKER) = x1; then \
$(TARGET_STRIP) -S -x $(""" + cname() + """) -o $@.bin $<; \ $(TARGET_STRIP) -S -x $(""" + 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 $@; \ $(TARGET_OBJCONV) -f$(TARGET_MODULE_FORMAT) -nr:_grub_mod_init:grub_mod_init -nr:_grub_mod_fini:grub_mod_fini -ed2022 -ed2016 -wd1106 -nu -nd $@.bin $@; \
else """ + "$(TARGET_STRIP) $(" + cname() + "_STRIPFLAGS) -o $@ $<; \ else """ + "$(TARGET_STRIP) $(" + cname() + "_STRIPFLAGS) -o $@ $<; \
fi""")) fi"""))
return r return r
@ -542,8 +542,8 @@ def script(platform):
r += "[+ IF mansection +]" + manpage("grub-mkconfig_lib") + "[+ ENDIF +]" r += "[+ IF mansection +]" + manpage("grub-mkconfig_lib") + "[+ ENDIF +]"
r += "[+ ENDIF +]" r += "[+ ENDIF +]"
r += rule("[+ name +]", "$(top_builddir)/config.status " + platform_sources(platform), """ r += rule("[+ name +]", "$(top_builddir)/config.status " + platform_sources(platform) + platform_dependencies(platform), """
(skip=1; for x in $^; do if [ $$skip = 1 ]; then skip=0; else cat "$$x"; fi; done) | $(top_builddir)/config.status --file=$@:- (for x in """ + platform_sources(platform) + """; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:-
chmod a+x [+ name +] chmod a+x [+ name +]
""") """)

View file

@ -396,7 +396,7 @@ efiemu32.o: efiemu/runtime/efiemu.c $(TARGET_OBJ2ELF)
-rm -f $@; \ -rm -f $@; \
if test "x$(TARGET_APPLE_LINKER)" = x1; then \ 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; \ $(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -m32 -Wall -Werror -nostdlib -O2 -c -o $@.bin $< || exit 1; \
$(OBJCONV) -felf32 -nu -nd $@.bin $@ || exit 1; \ $(TARGET_OBJCONV) -felf32 -nu -nd $@.bin $@ || exit 1; \
rm -f $@.bin; \ rm -f $@.bin; \
else \ 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) -m32 -Wall -Werror -nostdlib -O2 -c -o $@ $< || exit 1; \
@ -423,7 +423,7 @@ efiemu64.o: efiemu64_c.o efiemu64_s.o $(TARGET_OBJ2ELEF)
if test "x$(TARGET_APPLE_LINKER)" = x1; then \ if test "x$(TARGET_APPLE_LINKER)" = x1; then \
rm -f $@.bin; \ rm -f $@.bin; \
$(TARGET_CC) -m64 -Wl,-r -nostdlib -o $@.bin $^ || exit 1; \ $(TARGET_CC) -m64 -Wl,-r -nostdlib -o $@.bin $^ || exit 1; \
$(OBJCONV) -felf64 -nu -nd $@.bin $@ || exit 1; \ $(TARGET_OBJCONV) -felf64 -nu -nd $@.bin $@ || exit 1; \
rm -f $@.bin; \ rm -f $@.bin; \
else \ else \
$(TARGET_CC) -m64 -Wl,-melf_x86_64 -nostdlib -Wl,-r -o $@ $^ || exit 1; \ $(TARGET_CC) -m64 -Wl,-melf_x86_64 -nostdlib -Wl,-r -o $@ $^ || exit 1; \

View file

@ -31,27 +31,32 @@
.macro floppy .macro floppy
part_start: part_start:
probe_values: LOCAL(probe_values):
.byte 36, 18, 15, 9, 0 .byte 36, 18, 15, 9, 0
LOCAL(floppy_probe): LOCAL(floppy_probe):
pushw %dx
/* /*
* Perform floppy probe. * Perform floppy probe.
*/ */
#ifdef __APPLE__
movw $probe_values - 1, %si LOCAL(probe_values_minus_one) = LOCAL(probe_values) - 1
movw MACRO_DOLLAR(LOCAL(probe_values_minus_one)), %si
#else
movw MACRO_DOLLAR(LOCAL(probe_values)) - 1, %si
#endif
LOCAL(probe_loop): LOCAL(probe_loop):
/* reset floppy controller INT 13h AH=0 */ /* reset floppy controller INT 13h AH=0 */
xorw %ax, %ax xorw %ax, %ax
int $0x13 int MACRO_DOLLAR(0x13)
incw %si incw %si
movb (%si), %cl movb (%si), %cl
/* if number of sectors is 0, display error and die */ /* if number of sectors is 0, display error and die */
cmpb $0, %cl testb %cl, %cl
jne 1f jnz 1f
/* /*
* Floppy disk probe failure. * Floppy disk probe failure.
@ -64,20 +69,20 @@ fd_probe_error_string: .asciz "Floppy"
1: 1:
/* perform read */ /* perform read */
movw $GRUB_BOOT_MACHINE_BUFFER_SEG, %bx movw MACRO_DOLLAR(GRUB_BOOT_MACHINE_BUFFER_SEG), %bx
movw %bx, %es movw %bx, %es
xorw %bx, %bx xorw %bx, %bx
movw $0x201, %ax movw MACRO_DOLLAR(0x201), %ax
movb $0, %ch movb MACRO_DOLLAR(0), %ch
movb $0, %dh movb MACRO_DOLLAR(0), %dh
int $0x13 int MACRO_DOLLAR(0x13)
/* if error, jump to "LOCAL(probe_loop)" */ /* if error, jump to "LOCAL(probe_loop)" */
jc LOCAL(probe_loop) jc LOCAL(probe_loop)
/* %cl is already the correct value! */ /* %cl is already the correct value! */
movb $1, %dh movb MACRO_DOLLAR(1), %dh
movb $79, %ch movb MACRO_DOLLAR(79), %ch
jmp LOCAL(final_init) jmp LOCAL(final_init)
.endm .endm
@ -180,7 +185,9 @@ kernel_address:
#ifndef HYBRID_BOOT #ifndef HYBRID_BOOT
. = _start + GRUB_BOOT_MACHINE_KERNEL_SECTOR . = _start + GRUB_BOOT_MACHINE_KERNEL_SECTOR
kernel_sector: kernel_sector:
.long 1, 0 .long 1
kernel_sector_high:
.long 0
#endif #endif
. = _start + GRUB_BOOT_MACHINE_BOOT_DRIVE . = _start + GRUB_BOOT_MACHINE_BOOT_DRIVE
@ -285,7 +292,7 @@ lba_mode:
/* the absolute address */ /* the absolute address */
movl kernel_sector, %ebx movl kernel_sector, %ebx
movl %ebx, 8(%si) movl %ebx, 8(%si)
movl kernel_sector + 4, %ebx movl kernel_sector_high, %ebx
movl %ebx, 12(%si) movl %ebx, 12(%si)
/* the segment of buffer address */ /* the segment of buffer address */
@ -318,11 +325,12 @@ LOCAL(chs_mode):
int $0x13 int $0x13
jnc LOCAL(final_init) jnc LOCAL(final_init)
popw %dx
/* /*
* The call failed, so maybe use the floppy probe instead. * The call failed, so maybe use the floppy probe instead.
*/ */
testb $GRUB_BOOT_MACHINE_BIOS_HD_FLAG, %dl testb %dl, %dl
jz LOCAL(floppy_probe) jnb LOCAL(floppy_probe)
/* Nope, we definitely have a hard disk, and we're screwed. */ /* Nope, we definitely have a hard disk, and we're screwed. */
ERR(hd_probe_error_string) ERR(hd_probe_error_string)
@ -353,7 +361,7 @@ LOCAL(final_init):
setup_sectors: setup_sectors:
/* load logical sector start (top half) */ /* load logical sector start (top half) */
movl kernel_sector + 4, %eax movl kernel_sector_high, %eax
orl %eax, %eax orl %eax, %eax
jnz LOCAL(geometry_error) jnz LOCAL(geometry_error)
@ -505,7 +513,9 @@ LOCAL(message):
#ifdef HYBRID_BOOT #ifdef HYBRID_BOOT
. = _start + 0x1b0 . = _start + 0x1b0
kernel_sector: kernel_sector:
.long 1, 0 .long 1
kernel_sector_high:
.long 0
#endif #endif
. = _start + GRUB_BOOT_MACHINE_WINDOWS_NT_MAGIC . = _start + GRUB_BOOT_MACHINE_WINDOWS_NT_MAGIC
nt_magic: nt_magic:

View file

@ -18,7 +18,6 @@
#include <config.h> #include <config.h>
#include <grub/symbol.h> #include <grub/symbol.h>
#include <grub/i386/pc/memory.h>
#include <grub/machine/memory.h> #include <grub/machine/memory.h>
#include <grub/machine/boot.h> #include <grub/machine/boot.h>
#include <grub/machine/kernel.h> #include <grub/machine/kernel.h>

View file

@ -27,6 +27,7 @@
.extern __bss_start .extern __bss_start
.extern _end .extern _end
.extern _edata
.globl __start, _start, start .globl __start, _start, start
.set noreorder .set noreorder
@ -248,8 +249,9 @@ cmdlinedone:
#include "../../kern/mips/cache_flush.S" #include "../../kern/mips/cache_flush.S"
/* Decompress the payload. */ /* Decompress the payload. */
lui $a0, %hi(__bss_start) lui $a0, %hi(_edata)
addiu $a0, $a0, %lo(__bss_start) addiu $a0, $a0, %lo(_edata)
lui $t0, %hi(base) lui $t0, %hi(base)
addiu $t0, $t0, %lo(base) addiu $t0, $t0, %lo(base)
subu $a0, $a0, $t0 subu $a0, $a0, $t0
@ -265,16 +267,16 @@ cmdlinedone:
*/ */
move $s6, $a3 move $s6, $a3
lui $t0, %hi(EXT_C(grub_decompress_core)) lui $t9, %hi(EXT_C(grub_decompress_core))
addiu $t0, $t0, %lo(EXT_C(grub_decompress_core)) addiu $t9, $t9, %lo(EXT_C(grub_decompress_core))
#ifdef GRUB_MACHINE_ARC #ifdef GRUB_MACHINE_ARC
lui $sp, %hi(_start - 512) lui $sp, %hi(_start - 512)
jalr $t0 jalr $t9
addiu $sp, $sp, %lo(_start - 512) addiu $sp, $sp, %lo(_start - 512)
#else #else
lui $sp, %hi(_start - 256) lui $sp, %hi(_start - 256)
jalr $t0 jalr $t9
addiu $sp, $sp, %lo(_start - 256) addiu $sp, $sp, %lo(_start - 256)
#endif #endif
move $a0, $s1 move $a0, $s1
@ -287,3 +289,11 @@ cmdlinedone:
jr $t1 jr $t1
nop nop
/* Ensure that .data section is created. In code we suppose that _edata
is first location not in decompressor image. Strictly speaking it's
_edata only when .data is present and _etext otherwise. But checking
for .data presence would cost more in code than it is to ensure that
.data is created.
*/
.data
.long 0

View file

@ -426,6 +426,10 @@ grub_biosdisk_open (const char *name, grub_disk_t disk)
disk->total_sectors = total_sectors; disk->total_sectors = total_sectors;
/* Limit the max to 0x7f because of Phoenix EDD. */ /* Limit the max to 0x7f because of Phoenix EDD. */
disk->max_agglomerate = 0x7f >> GRUB_DISK_CACHE_BITS; disk->max_agglomerate = 0x7f >> GRUB_DISK_CACHE_BITS;
COMPILE_TIME_ASSERT ((0x7f >> GRUB_DISK_CACHE_BITS
<< (GRUB_DISK_SECTOR_BITS + GRUB_DISK_CACHE_BITS))
+ sizeof (struct grub_biosdisk_dap)
< GRUB_MEMORY_MACHINE_SCRATCH_SIZE);
disk->data = data; disk->data = data;

View file

@ -71,11 +71,7 @@ VARIABLE(grub_gdb_stack)
#define REG \reg #define REG \reg
#define NDX \ndx #define NDX \ndx
#endif #endif
#ifdef __APPLE__
xorl %eax, %eax xorl %eax, %eax
#else
movl $0, %eax
#endif
movw REG, EXT_C(grub_gdb_regs)+(NDX * 4) movw REG, EXT_C(grub_gdb_regs)+(NDX * 4)
movw %ax, EXT_C(grub_gdb_regs)+(NDX * 4 + 2) movw %ax, EXT_C(grub_gdb_regs)+(NDX * 4 + 2)
movl EXT_C(grub_gdb_regs)+(EAX * 4), %eax movl EXT_C(grub_gdb_regs)+(EAX * 4), %eax
@ -190,11 +186,7 @@ VARIABLE(grub_gdb_stack)
.text .text
1: 1:
.if EC .if EC
#ifdef __APPLE__ add MACRO_DOLLAR(4), %esp
add $$4, %esp
#else
add $4, %esp
#endif
.endif .endif
save_context save_context

View file

@ -23,7 +23,7 @@ BEGIN {
} else if ($1 == "undefined") { } else if ($1 == "undefined") {
if ($3 in symtab) if ($3 in symtab)
modtab[$2] = modtab[$2] " " symtab[$3]; modtab[$2] = modtab[$2] " " symtab[$3];
else if ($3 != "__gnu_local_gp") { else if ($3 != "__gnu_local_gp" && $3 != "_gp_disp") {
printf "%s in %s is not defined\n", $3, $2 >"/dev/stderr"; printf "%s in %s is not defined\n", $3, $2 >"/dev/stderr";
error++; error++;
} }

View file

@ -229,9 +229,10 @@ grub_dl_load_segments (grub_dl_t mod, const Elf_Ehdr *e)
unsigned i; unsigned i;
Elf_Shdr *s; Elf_Shdr *s;
grub_size_t tsize = 0, talign = 1; grub_size_t tsize = 0, talign = 1;
#if defined (__ia64__) || defined (__powerpc__) #if defined (__ia64__) || defined (__powerpc__) || defined (__mips__)
grub_size_t tramp; grub_size_t tramp;
grub_size_t got; grub_size_t got;
grub_err_t err;
#endif #endif
char *ptr; char *ptr;
@ -244,10 +245,10 @@ grub_dl_load_segments (grub_dl_t mod, const Elf_Ehdr *e)
talign = s->sh_addralign; talign = s->sh_addralign;
} }
#if defined (__ia64__) || defined (__powerpc__) #if defined (__ia64__) || defined (__powerpc__) || defined (__mips__)
grub_arch_dl_get_tramp_got_size (e, &tramp, &got); err = grub_arch_dl_get_tramp_got_size (e, &tramp, &got);
tramp *= GRUB_ARCH_DL_TRAMP_SIZE; if (err)
got *= sizeof (grub_uint64_t); return err;
tsize += ALIGN_UP (tramp, GRUB_ARCH_DL_TRAMP_ALIGN); tsize += ALIGN_UP (tramp, GRUB_ARCH_DL_TRAMP_ALIGN);
if (talign < GRUB_ARCH_DL_TRAMP_ALIGN) if (talign < GRUB_ARCH_DL_TRAMP_ALIGN)
talign = GRUB_ARCH_DL_TRAMP_ALIGN; talign = GRUB_ARCH_DL_TRAMP_ALIGN;
@ -313,7 +314,7 @@ grub_dl_load_segments (grub_dl_t mod, const Elf_Ehdr *e)
mod->segment = seg; mod->segment = seg;
} }
} }
#if defined (__ia64__) || defined (__powerpc__) #if defined (__ia64__) || defined (__powerpc__) || defined (__mips__)
ptr = (char *) ALIGN_UP ((grub_addr_t) ptr, GRUB_ARCH_DL_TRAMP_ALIGN); ptr = (char *) ALIGN_UP ((grub_addr_t) ptr, GRUB_ARCH_DL_TRAMP_ALIGN);
mod->tramp = ptr; mod->tramp = ptr;
ptr += tramp; ptr += tramp;

View file

@ -32,6 +32,12 @@
#define BYTES_TO_PAGES(bytes) (((bytes) + 0xfff) >> 12) #define BYTES_TO_PAGES(bytes) (((bytes) + 0xfff) >> 12)
#define PAGES_TO_BYTES(pages) ((pages) << 12) #define PAGES_TO_BYTES(pages) ((pages) << 12)
#if defined (__code_model_large__) || !defined (__x86_64__)
#define MAX_USABLE_ADDRESS 0xffffffff
#else
#define MAX_USABLE_ADDRESS 0x7fffffff
#endif
/* The size of a memory map obtained from the firmware. This must be /* The size of a memory map obtained from the firmware. This must be
a multiplier of 4KB. */ a multiplier of 4KB. */
#define MEMORY_MAP_SIZE 0x3000 #define MEMORY_MAP_SIZE 0x3000
@ -58,7 +64,7 @@ grub_efi_allocate_pages (grub_efi_physical_address_t address,
#if 1 #if 1
/* Limit the memory access to less than 4GB for 32-bit platforms. */ /* Limit the memory access to less than 4GB for 32-bit platforms. */
if (address > 0xffffffff) if (address > MAX_USABLE_ADDRESS)
return 0; return 0;
#endif #endif
@ -66,7 +72,7 @@ grub_efi_allocate_pages (grub_efi_physical_address_t address,
if (address == 0) if (address == 0)
{ {
type = GRUB_EFI_ALLOCATE_MAX_ADDRESS; type = GRUB_EFI_ALLOCATE_MAX_ADDRESS;
address = 0xffffffff; address = MAX_USABLE_ADDRESS;
} }
else else
type = GRUB_EFI_ALLOCATE_ADDRESS; type = GRUB_EFI_ALLOCATE_ADDRESS;
@ -86,7 +92,7 @@ grub_efi_allocate_pages (grub_efi_physical_address_t address,
{ {
/* Uggh, the address 0 was allocated... This is too annoying, /* Uggh, the address 0 was allocated... This is too annoying,
so reallocate another one. */ so reallocate another one. */
address = 0xffffffff; address = MAX_USABLE_ADDRESS;
status = efi_call_4 (b->allocate_pages, type, GRUB_EFI_LOADER_DATA, pages, &address); status = efi_call_4 (b->allocate_pages, type, GRUB_EFI_LOADER_DATA, pages, &address);
grub_efi_free_pages (0, pages); grub_efi_free_pages (0, pages);
if (status != GRUB_EFI_SUCCESS) if (status != GRUB_EFI_SUCCESS)
@ -319,7 +325,7 @@ filter_memory_map (grub_efi_memory_descriptor_t *memory_map,
{ {
if (desc->type == GRUB_EFI_CONVENTIONAL_MEMORY if (desc->type == GRUB_EFI_CONVENTIONAL_MEMORY
#if 1 #if 1
&& desc->physical_start <= 0xffffffff && desc->physical_start <= MAX_USABLE_ADDRESS
#endif #endif
&& desc->physical_start + PAGES_TO_BYTES (desc->num_pages) > 0x100000 && desc->physical_start + PAGES_TO_BYTES (desc->num_pages) > 0x100000
&& desc->num_pages != 0) && desc->num_pages != 0)
@ -337,9 +343,9 @@ filter_memory_map (grub_efi_memory_descriptor_t *memory_map,
#if 1 #if 1
if (BYTES_TO_PAGES (filtered_desc->physical_start) if (BYTES_TO_PAGES (filtered_desc->physical_start)
+ filtered_desc->num_pages + filtered_desc->num_pages
> BYTES_TO_PAGES (0x100000000LL)) > BYTES_TO_PAGES (MAX_USABLE_ADDRESS+1LL))
filtered_desc->num_pages filtered_desc->num_pages
= (BYTES_TO_PAGES (0x100000000LL) = (BYTES_TO_PAGES (MAX_USABLE_ADDRESS+1LL)
- BYTES_TO_PAGES (filtered_desc->physical_start)); - BYTES_TO_PAGES (filtered_desc->physical_start));
#endif #endif

View file

@ -46,7 +46,7 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr)
return GRUB_ERR_BAD_MODULE; return GRUB_ERR_BAD_MODULE;
} }
#if defined (__ia64__) || defined (__powerpc__) #if defined (__ia64__) || defined (__powerpc__) || defined (__mips__)
void grub_arch_dl_get_tramp_got_size (const void *ehdr __attribute__ ((unused)), void grub_arch_dl_get_tramp_got_size (const void *ehdr __attribute__ ((unused)),
grub_size_t *tramp, grub_size_t *got) grub_size_t *tramp, grub_size_t *got)
{ {

View file

@ -17,8 +17,6 @@
*/ */
#include <grub/symbol.h> #include <grub/symbol.h>
/* For stack parameters. */
#include <grub/i386/pc/memory.h>
#include <grub/machine/memory.h> #include <grub/machine/memory.h>
#include <grub/cpu/linux.h> #include <grub/cpu/linux.h>
#include <grub/offsets.h> #include <grub/offsets.h>

View file

@ -161,13 +161,13 @@ mmap_iterate_hook (grub_uint64_t addr, grub_uint64_t size,
void *data __attribute__ ((unused))) void *data __attribute__ ((unused)))
{ {
/* Avoid the lower memory. */ /* Avoid the lower memory. */
if (addr < 0x100000) if (addr < GRUB_MEMORY_MACHINE_UPPER_START)
{ {
if (size <= 0x100000 - addr) if (size <= GRUB_MEMORY_MACHINE_UPPER_START - addr)
return 0; return 0;
size -= 0x100000 - addr; size -= GRUB_MEMORY_MACHINE_UPPER_START - addr;
addr = 0x100000; addr = GRUB_MEMORY_MACHINE_UPPER_START;
} }
/* Ignore >4GB. */ /* Ignore >4GB. */

View file

@ -19,7 +19,6 @@
#include <config.h> #include <config.h>
#include <grub/symbol.h> #include <grub/symbol.h>
#include <grub/i386/pc/memory.h>
#include <grub/machine/memory.h> #include <grub/machine/memory.h>
#include <grub/machine/kernel.h> #include <grub/machine/kernel.h>

View file

@ -16,7 +16,7 @@
* along with GRUB. If not, see <http://www.gnu.org/licenses/>. * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include <grub/i386/pc/memory.h> #include <grub/machine/memory.h>
/* /*
* Note: These functions defined in this file may be called from C. * Note: These functions defined in this file may be called from C.
@ -196,8 +196,6 @@ protcseg:
* along with GRUB. If not, see <http://www.gnu.org/licenses/>. * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include <grub/i386/pc/memory.h>
prot_to_real: prot_to_real:
/* just in case, set GDT */ /* just in case, set GDT */
lgdt gdtdesc lgdt gdtdesc

View file

@ -170,7 +170,7 @@ grub_ia64_make_trampoline (struct grub_ia64_trampoline *tr, grub_uint64_t addr)
grub_memcpy (tr->jump, jump, sizeof (tr->jump)); grub_memcpy (tr->jump, jump, sizeof (tr->jump));
} }
void grub_err_t
grub_ia64_dl_get_tramp_got_size (const void *ehdr, grub_size_t *tramp, grub_ia64_dl_get_tramp_got_size (const void *ehdr, grub_size_t *tramp,
grub_size_t *got) grub_size_t *got)
{ {
@ -187,7 +187,7 @@ grub_ia64_dl_get_tramp_got_size (const void *ehdr, grub_size_t *tramp,
break; break;
if (i == grub_le_to_cpu16 (e->e_shnum)) if (i == grub_le_to_cpu16 (e->e_shnum))
return; return GRUB_ERR_NONE;
for (i = 0, s = (Elf64_Shdr *) ((char *) e + grub_le_to_cpu64 (e->e_shoff)); for (i = 0, s = (Elf64_Shdr *) ((char *) e + grub_le_to_cpu64 (e->e_shoff));
i < grub_le_to_cpu16 (e->e_shnum); i < grub_le_to_cpu16 (e->e_shnum);
@ -211,7 +211,9 @@ grub_ia64_dl_get_tramp_got_size (const void *ehdr, grub_size_t *tramp,
break; break;
} }
} }
*tramp = cntt; *tramp = cntt * sizeof (struct grub_ia64_trampoline);
*got = cntg; *got = cntg * sizeof (grub_uint64_t);
return GRUB_ERR_NONE;
} }

View file

@ -396,7 +396,7 @@ grub_machine_get_bootlocation (char **device, char **path)
const char *syspart = 0; const char *syspart = 0;
if (GRUB_ARC_SYSTEM_PARAMETER_BLOCK->firmware_vector_length if (GRUB_ARC_SYSTEM_PARAMETER_BLOCK->firmware_vector_length
>= ((char *) (&GRUB_ARC_FIRMWARE_VECTOR->getenvironmentvariable + 1) >= (unsigned) ((char *) (&GRUB_ARC_FIRMWARE_VECTOR->getenvironmentvariable + 1)
- (char *) GRUB_ARC_FIRMWARE_VECTOR) - (char *) GRUB_ARC_FIRMWARE_VECTOR)
&& GRUB_ARC_FIRMWARE_VECTOR->getenvironmentvariable) && GRUB_ARC_FIRMWARE_VECTOR->getenvironmentvariable)
syspart = GRUB_ARC_FIRMWARE_VECTOR->getenvironmentvariable ("SystemPartition"); syspart = GRUB_ARC_FIRMWARE_VECTOR->getenvironmentvariable ("SystemPartition");

View file

@ -20,11 +20,11 @@ FUNCTION (grub_arch_sync_dma_caches)
move $t0, $t2 move $t0, $t2
subu $t1, $t3, $t2 subu $t1, $t3, $t2
1: 1:
cache 1, 0($t0) cache_op 1, 0($t0)
#ifdef GRUB_MACHINE_MIPS_LOONGSON #ifdef GRUB_MACHINE_MIPS_LOONGSON
cache 1, 1($t0) cache_op 1, 1($t0)
cache 1, 2($t0) cache_op 1, 2($t0)
cache 1, 3($t0) cache_op 1, 3($t0)
addiu $t1, $t1, -0x20 addiu $t1, $t1, -0x20
bne $t1, $zero, 1b bne $t1, $zero, 1b
@ -34,36 +34,36 @@ FUNCTION (grub_arch_sync_dma_caches)
bne $t1, $zero, 1b bne $t1, $zero, 1b
addiu $t0, $t0, 0x4 addiu $t0, $t0, 0x4
#endif #endif
sync sync_op
move $t0, $t2 move $t0, $t2
subu $t1, $t3, $t2 subu $t1, $t3, $t2
2: 2:
#ifdef GRUB_MACHINE_MIPS_LOONGSON #ifdef GRUB_MACHINE_MIPS_LOONGSON
cache 0, 0($t0) cache_op 0, 0($t0)
addiu $t1, $t1, -0x20 addiu $t1, $t1, -0x20
bne $t1, $zero, 2b bne $t1, $zero, 2b
addiu $t0, $t0, 0x20 addiu $t0, $t0, 0x20
#else #else
cache 0, 0($t0) cache_op 0, 0($t0)
addiu $t1, $t1, -4 addiu $t1, $t1, -4
bne $t1, $zero, 2b bne $t1, $zero, 2b
addiu $t0, $t0, 0x4 addiu $t0, $t0, 0x4
#endif #endif
sync sync_op
move $t0, $t2 move $t0, $t2
subu $t1, $t3, $t2 subu $t1, $t3, $t2
2: 2:
#ifdef GRUB_MACHINE_MIPS_LOONGSON #ifdef GRUB_MACHINE_MIPS_LOONGSON
cache 23, 0($t0) cache_op 23, 0($t0)
addiu $t1, $t1, -0x20 addiu $t1, $t1, -0x20
bne $t1, $zero, 2b bne $t1, $zero, 2b
addiu $t0, $t0, 0x20 addiu $t0, $t0, 0x20
#else #else
cache 23, 0($t0) cache_op 23, 0($t0)
addiu $t1, $t1, -0x4 addiu $t1, $t1, -0x4
bne $t1, $zero, 2b bne $t1, $zero, 2b
addiu $t0, $t0, 0x4 addiu $t0, $t0, 0x4
#endif #endif
sync sync_op
jr $ra jr $ra

View file

@ -1,3 +1,17 @@
#ifndef CACHE_OP_DEFINED
#define CACHE_OP_DEFINED 1
.macro cache_op op addr
.set mips3
cache \op, \addr
.set mips1
.endm
.macro sync_op
.set mips3
sync
.set mips1
.endm
#endif
move $t2, $a0 move $t2, $a0
addu $t3, $a0, $a1 addu $t3, $a0, $a1
srl $t2, $t2, 5 srl $t2, $t2, 5
@ -8,12 +22,12 @@
move $t0, $t2 move $t0, $t2
subu $t1, $t3, $t2 subu $t1, $t3, $t2
1: 1:
cache 1, 0($t0) cache_op 1, 0($t0)
/* All four ways. */ /* All four ways. */
#ifdef GRUB_MACHINE_MIPS_LOONGSON #ifdef GRUB_MACHINE_MIPS_LOONGSON
cache 1, 1($t0) cache_op 1, 1($t0)
cache 1, 2($t0) cache_op 1, 2($t0)
cache 1, 3($t0) cache_op 1, 3($t0)
addiu $t1, $t1, -0x20 addiu $t1, $t1, -0x20
bne $t1, $zero, 1b bne $t1, $zero, 1b
addiu $t0, $t0, 0x20 addiu $t0, $t0, 0x20
@ -23,11 +37,11 @@
bne $t1, $zero, 1b bne $t1, $zero, 1b
addiu $t0, $t0, 0x4 addiu $t0, $t0, 0x4
#endif #endif
sync sync_op
move $t0, $t2 move $t0, $t2
subu $t1, $t3, $t2 subu $t1, $t3, $t2
2: 2:
cache 0, 0($t0) cache_op 0, 0($t0)
#ifdef GRUB_MACHINE_MIPS_LOONGSON #ifdef GRUB_MACHINE_MIPS_LOONGSON
addiu $t1, $t1, -0x20 addiu $t1, $t1, -0x20
bne $t1, $zero, 2b bne $t1, $zero, 2b
@ -37,4 +51,4 @@
bne $t1, $zero, 2b bne $t1, $zero, 2b
addiu $t0, $t0, 0x4 addiu $t0, $t0, 0x4
#endif #endif
sync sync_op

View file

@ -27,6 +27,7 @@
/* Dummy __gnu_local_gp. Resolved by linker. */ /* Dummy __gnu_local_gp. Resolved by linker. */
static char __gnu_local_gp_dummy; static char __gnu_local_gp_dummy;
static char _gp_disp_dummy;
/* Check if EHDR is a valid ELF header. */ /* Check if EHDR is a valid ELF header. */
grub_err_t grub_err_t
@ -51,6 +52,58 @@ grub_arch_dl_check_header (void *ehdr)
#pragma GCC diagnostic ignored "-Wcast-align" #pragma GCC diagnostic ignored "-Wcast-align"
grub_err_t
grub_arch_dl_get_tramp_got_size (const void *ehdr, grub_size_t *tramp,
grub_size_t *got)
{
const Elf_Ehdr *e = ehdr;
const Elf_Shdr *s;
unsigned i;
/* FIXME: suboptimal. */
grub_size_t gp_size = 0;
*tramp = 0;
*got = 0;
/* Find a symbol table. */
for (i = 0, s = (const Elf_Shdr *) ((const char *) e + e->e_shoff);
i < e->e_shnum;
i++, s = (const Elf_Shdr *) ((const char *) s + e->e_shentsize))
if (s->sh_type == SHT_SYMTAB)
break;
if (i == e->e_shnum)
return grub_error (GRUB_ERR_BAD_MODULE, N_("no symbol table"));
for (i = 0, s = (const Elf_Shdr *) ((const char *) e + e->e_shoff);
i < e->e_shnum;
i++, s = (const Elf_Shdr *) ((const char *) s + e->e_shentsize))
if (s->sh_type == SHT_REL)
{
const Elf_Rel *rel, *max;
for (rel = (const Elf_Rel *) ((const char *) e + s->sh_offset),
max = rel + s->sh_size / s->sh_entsize;
rel < max;
rel++)
switch (ELF_R_TYPE (rel->r_info))
{
case R_MIPS_GOT16:
case R_MIPS_CALL16:
case R_MIPS_GPREL32:
gp_size += 4;
break;
}
}
if (gp_size > 0x08000)
return grub_error (GRUB_ERR_OUT_OF_RANGE, "__gnu_local_gp is too big\n");
*got = gp_size;
return GRUB_ERR_NONE;
}
/* Relocate symbols. */ /* Relocate symbols. */
grub_err_t grub_err_t
grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr) grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr)
@ -59,7 +112,6 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr)
Elf_Shdr *s; Elf_Shdr *s;
Elf_Word entsize; Elf_Word entsize;
unsigned i; unsigned i;
grub_size_t gp_size = 0;
/* FIXME: suboptimal. */ /* FIXME: suboptimal. */
grub_uint32_t *gp, *gpptr; grub_uint32_t *gp, *gpptr;
grub_uint32_t gp0; grub_uint32_t gp0;
@ -88,43 +140,7 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr)
gp0 = ((grub_uint32_t *)((char *) e + s->sh_offset))[5]; gp0 = ((grub_uint32_t *)((char *) e + s->sh_offset))[5];
for (i = 0, s = (Elf_Shdr *) ((char *) e + e->e_shoff); gpptr = gp = mod->got;
i < e->e_shnum;
i++, s = (Elf_Shdr *) ((char *) s + e->e_shentsize))
if (s->sh_type == SHT_REL)
{
grub_dl_segment_t seg;
/* Find the target segment. */
for (seg = mod->segment; seg; seg = seg->next)
if (seg->section == s->sh_info)
break;
if (seg)
{
Elf_Rel *rel, *max;
for (rel = (Elf_Rel *) ((char *) e + s->sh_offset),
max = rel + s->sh_size / s->sh_entsize;
rel < max;
rel++)
switch (ELF_R_TYPE (rel->r_info))
{
case R_MIPS_GOT16:
case R_MIPS_CALL16:
case R_MIPS_GPREL32:
gp_size += 4;
break;
}
}
}
if (gp_size > 0x08000)
return grub_error (GRUB_ERR_OUT_OF_RANGE, "__gnu_local_gp is too big\n");
gpptr = gp = grub_malloc (gp_size);
if (!gp)
return grub_errno;
for (i = 0, s = (Elf_Shdr *) ((char *) e + e->e_shoff); for (i = 0, s = (Elf_Shdr *) ((char *) e + e->e_shoff);
i < e->e_shnum; i < e->e_shnum;
@ -149,6 +165,7 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr)
{ {
grub_uint8_t *addr; grub_uint8_t *addr;
Elf_Sym *sym; Elf_Sym *sym;
grub_uint32_t sym_value;
if (seg->size < rel->r_offset) if (seg->size < rel->r_offset)
return grub_error (GRUB_ERR_BAD_MODULE, return grub_error (GRUB_ERR_BAD_MODULE,
@ -157,9 +174,17 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr)
addr = (grub_uint8_t *) ((char *) seg->addr + rel->r_offset); addr = (grub_uint8_t *) ((char *) seg->addr + rel->r_offset);
sym = (Elf_Sym *) ((char *) mod->symtab sym = (Elf_Sym *) ((char *) mod->symtab
+ entsize * ELF_R_SYM (rel->r_info)); + entsize * ELF_R_SYM (rel->r_info));
if (sym->st_value == (grub_addr_t) &__gnu_local_gp_dummy) sym_value = sym->st_value;
sym->st_value = (grub_addr_t) gp; if (sym_value == (grub_addr_t) &__gnu_local_gp_dummy)
sym_value = (grub_addr_t) gp;
else if (sym_value == (grub_addr_t) &_gp_disp_dummy)
{
sym_value = (grub_addr_t) gp - (grub_addr_t) addr;
if (ELF_R_TYPE (rel->r_info) == R_MIPS_LO16)
/* ABI mandates +4 even if partner lui doesn't
immediately precede addiu. */
sym_value += 4;
}
switch (ELF_R_TYPE (rel->r_info)) switch (ELF_R_TYPE (rel->r_info))
{ {
case R_MIPS_HI16: case R_MIPS_HI16:
@ -175,7 +200,7 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr)
treated as signed. Hence add 0x8000 to compensate. treated as signed. Hence add 0x8000 to compensate.
*/ */
value = (*(grub_uint16_t *) addr << 16) value = (*(grub_uint16_t *) addr << 16)
+ sym->st_value + 0x8000; + sym_value + 0x8000;
for (rel2 = rel + 1; rel2 < max; rel2++) for (rel2 = rel + 1; rel2 < max; rel2++)
if (ELF_R_SYM (rel2->r_info) if (ELF_R_SYM (rel2->r_info)
== ELF_R_SYM (rel->r_info) == ELF_R_SYM (rel->r_info)
@ -196,13 +221,13 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr)
#ifdef GRUB_CPU_WORDS_BIGENDIAN #ifdef GRUB_CPU_WORDS_BIGENDIAN
addr += 2; addr += 2;
#endif #endif
*(grub_uint16_t *) addr += (sym->st_value) & 0xffff; *(grub_uint16_t *) addr += sym_value & 0xffff;
break; break;
case R_MIPS_32: case R_MIPS_32:
*(grub_uint32_t *) addr += sym->st_value; *(grub_uint32_t *) addr += sym_value;
break; break;
case R_MIPS_GPREL32: case R_MIPS_GPREL32:
*(grub_uint32_t *) addr = sym->st_value *(grub_uint32_t *) addr = sym_value
+ *(grub_uint32_t *) addr + gp0 - (grub_uint32_t)gp; + *(grub_uint32_t *) addr + gp0 - (grub_uint32_t)gp;
break; break;
@ -212,7 +237,7 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr)
grub_uint32_t raw; grub_uint32_t raw;
raw = (*(grub_uint32_t *) addr) & 0x3ffffff; raw = (*(grub_uint32_t *) addr) & 0x3ffffff;
value = raw << 2; value = raw << 2;
value += sym->st_value; value += sym_value;
raw = (value >> 2) & 0x3ffffff; raw = (value >> 2) & 0x3ffffff;
*(grub_uint32_t *) addr = *(grub_uint32_t *) addr =
@ -220,12 +245,36 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr)
} }
break; break;
case R_MIPS_GOT16: case R_MIPS_GOT16:
if (ELF_ST_BIND (sym->st_info) == STB_LOCAL)
{
Elf_Rel *rel2;
/* Handle partner lo16 relocation. Lower part is
treated as signed. Hence add 0x8000 to compensate.
*/
sym_value += (*(grub_uint16_t *) addr << 16)
+ 0x8000;
for (rel2 = rel + 1; rel2 < max; rel2++)
if (ELF_R_SYM (rel2->r_info)
== ELF_R_SYM (rel->r_info)
&& ELF_R_TYPE (rel2->r_info) == R_MIPS_LO16)
{
sym_value += *(grub_int16_t *)
((char *) seg->addr + rel2->r_offset
#ifdef GRUB_CPU_WORDS_BIGENDIAN
+ 2
#endif
);
break;
}
sym_value &= 0xffff0000;
*(grub_uint16_t *) addr = 0;
}
case R_MIPS_CALL16: case R_MIPS_CALL16:
/* FIXME: reuse*/ /* FIXME: reuse*/
#ifdef GRUB_CPU_WORDS_BIGENDIAN #ifdef GRUB_CPU_WORDS_BIGENDIAN
addr += 2; addr += 2;
#endif #endif
*gpptr = sym->st_value + *(grub_uint16_t *) addr; *gpptr = sym_value + *(grub_uint16_t *) addr;
*(grub_uint16_t *) addr *(grub_uint16_t *) addr
= sizeof (grub_uint32_t) * (gpptr - gp); = sizeof (grub_uint32_t) * (gpptr - gp);
gpptr++; gpptr++;
@ -234,7 +283,6 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr)
break; break;
default: default:
{ {
grub_free (gp);
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
N_("relocation 0x%x is not implemented yet"), N_("relocation 0x%x is not implemented yet"),
ELF_R_TYPE (rel->r_info)); ELF_R_TYPE (rel->r_info));
@ -252,5 +300,6 @@ void
grub_arch_dl_init_linker (void) grub_arch_dl_init_linker (void)
{ {
grub_dl_register_symbol ("__gnu_local_gp", &__gnu_local_gp_dummy, 0, 0); grub_dl_register_symbol ("__gnu_local_gp", &__gnu_local_gp_dummy, 0, 0);
grub_dl_register_symbol ("_gp_disp", &_gp_disp_dummy, 0, 0);
} }

View file

@ -116,10 +116,10 @@ bsscont:
bne $t3, $0, bsscont bne $t3, $0, bsscont
nop nop
lui $t1, %hi(grub_main) lui $t9, %hi(grub_main)
addiu $t1, %lo(grub_main) addiu $t9, %lo(grub_main)
lui $sp, %hi(GRUB_MACHINE_MEMORY_STACK_HIGH) lui $sp, %hi(GRUB_MACHINE_MEMORY_STACK_HIGH)
jr $t1 jr $t9
addiu $sp, $sp, %lo(GRUB_MACHINE_MEMORY_STACK_HIGH) addiu $sp, $sp, %lo(GRUB_MACHINE_MEMORY_STACK_HIGH)

View file

@ -1220,6 +1220,15 @@ grub_abort (void)
grub_exit (); grub_exit ();
} }
#if defined (__clang__) && !defined (GRUB_UTIL)
/* clang emits references to abort(). */
void __attribute__ ((noreturn))
abort (void)
{
grub_abort ();
}
#endif
void void
grub_fatal (const char *fmt, ...) grub_fatal (const char *fmt, ...)
{ {

View file

@ -38,9 +38,26 @@ grub_arch_dl_check_header (void *ehdr)
return GRUB_ERR_NONE; return GRUB_ERR_NONE;
} }
/* For low-endian reverse lis and addr_high as well as ori and addr_low. */
struct trampoline
{
grub_uint32_t lis;
grub_uint32_t ori;
grub_uint32_t mtctr;
grub_uint32_t bctr;
};
static const struct trampoline trampoline_template =
{
0x3d800000,
0x618c0000,
0x7d8903a6,
0x4e800420,
};
#pragma GCC diagnostic ignored "-Wcast-align" #pragma GCC diagnostic ignored "-Wcast-align"
void grub_err_t
grub_arch_dl_get_tramp_got_size (const void *ehdr, grub_size_t *tramp, grub_arch_dl_get_tramp_got_size (const void *ehdr, grub_size_t *tramp,
grub_size_t *got) grub_size_t *got)
{ {
@ -59,7 +76,7 @@ grub_arch_dl_get_tramp_got_size (const void *ehdr, grub_size_t *tramp,
break; break;
if (i == e->e_shnum) if (i == e->e_shnum)
return; return GRUB_ERR_NONE;
for (i = 0, s = (const Elf_Shdr *) ((const char *) e + e->e_shoff); for (i = 0, s = (const Elf_Shdr *) ((const char *) e + e->e_shoff);
i < e->e_shnum; i < e->e_shnum;
@ -77,26 +94,11 @@ grub_arch_dl_get_tramp_got_size (const void *ehdr, grub_size_t *tramp,
} }
return; *tramp *= sizeof (struct trampoline);
return GRUB_ERR_NONE;
} }
/* For low-endian reverse lis and addr_high as well as ori and addr_low. */
struct trampoline
{
grub_uint32_t lis;
grub_uint32_t ori;
grub_uint32_t mtctr;
grub_uint32_t bctr;
};
static const struct trampoline trampoline_template =
{
0x3d800000,
0x618c0000,
0x7d8903a6,
0x4e800420,
};
/* Relocate symbols. */ /* Relocate symbols. */
grub_err_t grub_err_t
grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr) grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr)
@ -167,8 +169,6 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr)
if (delta << 6 >> 6 != delta) if (delta << 6 >> 6 != delta)
{ {
COMPILE_TIME_ASSERT (sizeof (struct trampoline)
== GRUB_ARCH_DL_TRAMP_SIZE);
grub_memcpy (tptr, &trampoline_template, grub_memcpy (tptr, &trampoline_template,
sizeof (*tptr)); sizeof (*tptr));
delta = (grub_uint8_t *) tptr - (grub_uint8_t *) addr; delta = (grub_uint8_t *) tptr - (grub_uint8_t *) addr;

View file

@ -100,13 +100,31 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr)
break; break;
case R_X86_64_PC32: case R_X86_64_PC32:
*addr32 += rel->r_addend + sym->st_value - {
grub_int64_t value;
value = ((grub_int32_t) *addr32) + rel->r_addend + sym->st_value -
(Elf64_Xword) seg->addr - rel->r_offset; (Elf64_Xword) seg->addr - rel->r_offset;
if (value != (grub_int32_t) value)
return grub_error (GRUB_ERR_BAD_MODULE, "relocation out of range");
*addr32 = value;
}
break; break;
case R_X86_64_32: case R_X86_64_32:
{
grub_uint64_t value = *addr32 + rel->r_addend + sym->st_value;
if (value != (grub_uint32_t) value)
return grub_error (GRUB_ERR_BAD_MODULE, "relocation out of range");
*addr32 = value;
}
break;
case R_X86_64_32S: case R_X86_64_32S:
*addr32 += rel->r_addend + sym->st_value; {
grub_int64_t value = ((grub_int32_t) *addr32) + rel->r_addend + sym->st_value;
if (value != (grub_int32_t) value)
return grub_error (GRUB_ERR_BAD_MODULE, "relocation out of range");
*addr32 = value;
}
break; break;
default: default:

View file

@ -36,94 +36,94 @@
.text .text
FUNCTION(efi_wrap_0) FUNCTION(efi_wrap_0)
subq $48, %rsp subq $40, %rsp
call *%rdi call *%rdi
addq $48, %rsp addq $40, %rsp
ret ret
FUNCTION(efi_wrap_1) FUNCTION(efi_wrap_1)
subq $48, %rsp subq $40, %rsp
mov %rsi, %rcx mov %rsi, %rcx
call *%rdi call *%rdi
addq $48, %rsp addq $40, %rsp
ret ret
FUNCTION(efi_wrap_2) FUNCTION(efi_wrap_2)
subq $48, %rsp subq $40, %rsp
mov %rsi, %rcx mov %rsi, %rcx
call *%rdi call *%rdi
addq $48, %rsp addq $40, %rsp
ret ret
FUNCTION(efi_wrap_3) FUNCTION(efi_wrap_3)
subq $48, %rsp subq $40, %rsp
mov %rcx, %r8 mov %rcx, %r8
mov %rsi, %rcx mov %rsi, %rcx
call *%rdi call *%rdi
addq $48, %rsp addq $40, %rsp
ret ret
FUNCTION(efi_wrap_4) FUNCTION(efi_wrap_4)
subq $48, %rsp subq $40, %rsp
mov %r8, %r9 mov %r8, %r9
mov %rcx, %r8 mov %rcx, %r8
mov %rsi, %rcx mov %rsi, %rcx
call *%rdi call *%rdi
addq $48, %rsp addq $40, %rsp
ret ret
FUNCTION(efi_wrap_5) FUNCTION(efi_wrap_5)
subq $48, %rsp subq $40, %rsp
mov %r9, 32(%rsp) mov %r9, 32(%rsp)
mov %r8, %r9 mov %r8, %r9
mov %rcx, %r8 mov %rcx, %r8
mov %rsi, %rcx mov %rsi, %rcx
call *%rdi call *%rdi
addq $48, %rsp addq $40, %rsp
ret ret
FUNCTION(efi_wrap_6) FUNCTION(efi_wrap_6)
subq $64, %rsp subq $56, %rsp
mov 64+8(%rsp), %rax mov 56+8(%rsp), %rax
mov %rax, 40(%rsp) mov %rax, 40(%rsp)
mov %r9, 32(%rsp) mov %r9, 32(%rsp)
mov %r8, %r9 mov %r8, %r9
mov %rcx, %r8 mov %rcx, %r8
mov %rsi, %rcx mov %rsi, %rcx
call *%rdi call *%rdi
addq $64, %rsp addq $56, %rsp
ret ret
FUNCTION(efi_wrap_7) FUNCTION(efi_wrap_7)
subq $96, %rsp subq $88, %rsp
mov 96+16(%rsp), %rax mov 88+16(%rsp), %rax
mov %rax, 48(%rsp) mov %rax, 48(%rsp)
mov 96+8(%rsp), %rax mov 88+8(%rsp), %rax
mov %rax, 40(%rsp) mov %rax, 40(%rsp)
mov %r9, 32(%rsp) mov %r9, 32(%rsp)
mov %r8, %r9 mov %r8, %r9
mov %rcx, %r8 mov %rcx, %r8
mov %rsi, %rcx mov %rsi, %rcx
call *%rdi call *%rdi
addq $96, %rsp addq $88, %rsp
ret ret
FUNCTION(efi_wrap_10) FUNCTION(efi_wrap_10)
subq $96, %rsp subq $88, %rsp
mov 96+40(%rsp), %rax mov 88+40(%rsp), %rax
mov %rax, 72(%rsp) mov %rax, 72(%rsp)
mov 96+32(%rsp), %rax mov 88+32(%rsp), %rax
mov %rax, 64(%rsp) mov %rax, 64(%rsp)
mov 96+24(%rsp), %rax mov 88+24(%rsp), %rax
mov %rax, 56(%rsp) mov %rax, 56(%rsp)
mov 96+16(%rsp), %rax mov 88+16(%rsp), %rax
mov %rax, 48(%rsp) mov %rax, 48(%rsp)
mov 96+8(%rsp), %rax mov 88+8(%rsp), %rax
mov %rax, 40(%rsp) mov %rax, 40(%rsp)
mov %r9, 32(%rsp) mov %r9, 32(%rsp)
mov %r8, %r9 mov %r8, %r9
mov %rcx, %r8 mov %rcx, %r8
mov %rsi, %rcx mov %rsi, %rcx
call *%rdi call *%rdi
addq $96, %rsp addq $88, %rsp
ret ret

View file

@ -30,6 +30,6 @@ _start:
movq %rcx, EXT_C(grub_efi_image_handle)(%rip) movq %rcx, EXT_C(grub_efi_image_handle)(%rip)
movq %rdx, EXT_C(grub_efi_system_table)(%rip) movq %rdx, EXT_C(grub_efi_system_table)(%rip)
andq $~0xf, %rsp
call EXT_C(grub_main) call EXT_C(grub_main)
ret /* Doesn't return. */

View file

@ -341,6 +341,14 @@ page2offset (grub_uint64_t page)
return page << 12; return page << 12;
} }
#if defined (__x86_64__) && defined (__code_model_large__)
#define MAX_TOTAL_PAGES (1LL << (64 - 12))
#elif defined (__x86_64__)
#define MAX_TOTAL_PAGES (1LL << (31 - 12))
#else
#define MAX_TOTAL_PAGES (1LL << (32 - 12))
#endif
static void static void
map_all_pages (void) map_all_pages (void)
{ {
@ -355,6 +363,9 @@ map_all_pages (void)
grub_size_t n_unusable_pages = 0; grub_size_t n_unusable_pages = 0;
struct mmu_update m2p_updates[2 * MAX_N_UNUSABLE_PAGES]; struct mmu_update m2p_updates[2 * MAX_N_UNUSABLE_PAGES];
if (total_pages > MAX_TOTAL_PAGES - 4)
total_pages = MAX_TOTAL_PAGES - 4;
grub_memset (&gnttab_setver, 0, sizeof (gnttab_setver)); grub_memset (&gnttab_setver, 0, sizeof (gnttab_setver));
gnttab_setver.version = 2; gnttab_setver.version = 2;

View file

@ -125,7 +125,10 @@ void
grub_crypto_hash (const gcry_md_spec_t *hash, void *out, const void *in, grub_crypto_hash (const gcry_md_spec_t *hash, void *out, const void *in,
grub_size_t inlen) grub_size_t inlen)
{ {
grub_uint8_t ctx[hash->contextsize]; GRUB_PROPERLY_ALIGNED_ARRAY (ctx, GRUB_CRYPTO_MAX_MD_CONTEXT_SIZE);
if (hash->contextsize > sizeof (ctx))
grub_fatal ("Too large md context");
hash->init (&ctx); hash->init (&ctx);
hash->write (&ctx, in, inlen); hash->write (&ctx, in, inlen);
hash->final (&ctx); hash->final (&ctx);

View file

@ -749,7 +749,7 @@ extern USItype __udiv_qrnnd ();
************** MIPS ***************** ************** MIPS *****************
***************************************/ ***************************************/
#if defined (__mips__) && W_TYPE_SIZE == 32 #if defined (__mips__) && W_TYPE_SIZE == 32
#if (__GNUC__ >= 5) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) #if defined (__clang__) || (__GNUC__ >= 5) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
#define umul_ppmm(w1, w0, u, v) \ #define umul_ppmm(w1, w0, u, v) \
do { \ do { \
UDItype _r; \ UDItype _r; \

View file

@ -69,16 +69,23 @@ typedef grub_uint8_t gf_single_t;
#define GF_POLYNOMIAL 0x1d #define GF_POLYNOMIAL 0x1d
#define GF_INVERT2 0x8e #define GF_INVERT2 0x8e
#if defined (STANDALONE) && !defined (TEST) #if defined (STANDALONE) && !defined (TEST)
static gf_single_t * const gf_powx __attribute__ ((section(".text"))) = (void *) 0x100000;
static gf_single_t * const gf_powx_inv __attribute__ ((section(".text"))) = (void *) 0x100200; #ifdef __APPLE__
static int *const chosenstat __attribute__ ((section(".text"))) = (void *) 0x100300; #define ATTRIBUTE_TEXT __attribute__ ((section("_text,_text")))
static gf_single_t *const sigma __attribute__ ((section(".text"))) = (void *) 0x100700; #else
static gf_single_t *const errpot __attribute__ ((section(".text"))) = (void *) 0x100800; #define ATTRIBUTE_TEXT __attribute__ ((section(".text")))
static int *const errpos __attribute__ ((section(".text"))) = (void *) 0x100900; #endif
static gf_single_t *const sy __attribute__ ((section(".text"))) = (void *) 0x100d00;
static gf_single_t *const mstat __attribute__ ((section(".text"))) = (void *) 0x100e00; static gf_single_t * const gf_powx ATTRIBUTE_TEXT = (void *) 0x100000;
static gf_single_t *const errvals __attribute__ ((section(".text"))) = (void *) 0x100f00; static gf_single_t * const gf_powx_inv ATTRIBUTE_TEXT = (void *) 0x100200;
static gf_single_t *const eqstat __attribute__ ((section(".text"))) = (void *) 0x101000; static int *const chosenstat ATTRIBUTE_TEXT = (void *) 0x100300;
static gf_single_t *const sigma ATTRIBUTE_TEXT = (void *) 0x100700;
static gf_single_t *const errpot ATTRIBUTE_TEXT = (void *) 0x100800;
static int *const errpos ATTRIBUTE_TEXT = (void *) 0x100900;
static gf_single_t *const sy ATTRIBUTE_TEXT = (void *) 0x100d00;
static gf_single_t *const mstat ATTRIBUTE_TEXT = (void *) 0x100e00;
static gf_single_t *const errvals ATTRIBUTE_TEXT = (void *) 0x100f00;
static gf_single_t *const eqstat ATTRIBUTE_TEXT = (void *) 0x101000;
/* Next available address: (void *) 0x112000. */ /* Next available address: (void *) 0x112000. */
#else #else

View file

@ -184,8 +184,8 @@ grub_mmap_register (grub_uint64_t start, grub_uint64_t size, int type)
return 0; return 0;
b = grub_efi_system_table->boot_services; b = grub_efi_system_table->boot_services;
address = start & (~0x3ffULL); address = start & (~0xfffULL);
pages = (end - address + 0x3ff) >> 12; pages = (end - address + 0xfff) >> 12;
status = efi_call_2 (b->free_pages, address, pages); status = efi_call_2 (b->free_pages, address, pages);
if (status != GRUB_EFI_SUCCESS && status != GRUB_EFI_NOT_FOUND) if (status != GRUB_EFI_SUCCESS && status != GRUB_EFI_NOT_FOUND)
{ {
@ -263,7 +263,7 @@ grub_mmap_malign_and_register (grub_uint64_t align __attribute__ ((unused)),
atype = GRUB_EFI_ALLOCATE_ANY_PAGES; atype = GRUB_EFI_ALLOCATE_ANY_PAGES;
#endif #endif
pages = (size + 0x3ff) >> 12; pages = (size + 0xfff) >> 12;
status = efi_call_4 (b->allocate_pages, atype, status = efi_call_4 (b->allocate_pages, atype,
make_efi_memtype (type), pages, &address); make_efi_memtype (type), pages, &address);
if (status != GRUB_EFI_SUCCESS) if (status != GRUB_EFI_SUCCESS)

View file

@ -1,21 +0,0 @@
static void
grub_file_progress_hook_real (grub_disk_addr_t sector,
unsigned offset, unsigned length,
void *data)
{
grub_file_t file = data;
file->progress_offset += length;
show_progress (file->progress_offset, file->size);
}
GRUB_MOD_INIT (progress)
{
grub_file_progress_hook = grub_file_progress_hook_real;
}
GRUB_MOD_FINI (progress)
{
grub_file_progress_hook = 0;
}

View file

@ -31,11 +31,11 @@
static char * static char *
get_ofpathname (const char *dev) get_ofpathname (const char *dev)
{ {
char *ret = xmalloc (2 * PATH_MAX); size_t alloced = 4096;
char *end = ret + 2 * PATH_MAX - 1; char *ret = xmalloc (alloced);
size_t offset = 0;
int fd; int fd;
pid_t pid; pid_t pid;
char *ptr = ret;
pid = grub_util_exec_pipe ((const char * []){ "ofpathname", dev, NULL }, &fd); pid = grub_util_exec_pipe ((const char * []){ "ofpathname", dev, NULL }, &fd);
if (!pid) if (!pid)
@ -45,12 +45,28 @@ get_ofpathname (const char *dev)
if (!fp) if (!fp)
goto fail; goto fail;
while (!feof (fp) && ptr < end) while (!feof (fp))
{ {
size_t r; size_t r;
r = fread (ptr, 1, end - ptr, fp); if (alloced == offset)
ptr += r; {
alloced *= 2;
ret = xrealloc (ret, alloced);
} }
r = fread (ret + offset, 1, alloced - offset, fp);
offset += r;
}
if (offset > 0 && ret[offset - 1] == '\n')
offset--;
if (offset > 0 && ret[offset - 1] == '\r')
offset--;
if (alloced == offset)
{
alloced++;
ret = xrealloc (ret, alloced);
}
ret[offset] = '\0';
fclose (fp); fclose (fp);

View file

@ -114,7 +114,7 @@ check_is_serial (void)
isn't critical. isn't critical.
*/ */
if (GRUB_ARC_SYSTEM_PARAMETER_BLOCK->firmware_vector_length if (GRUB_ARC_SYSTEM_PARAMETER_BLOCK->firmware_vector_length
>= ((char *) (&GRUB_ARC_FIRMWARE_VECTOR->getenvironmentvariable + 1) >= (unsigned) ((char *) (&GRUB_ARC_FIRMWARE_VECTOR->getenvironmentvariable + 1)
- (char *) GRUB_ARC_FIRMWARE_VECTOR) - (char *) GRUB_ARC_FIRMWARE_VECTOR)
&& GRUB_ARC_FIRMWARE_VECTOR->getenvironmentvariable) && GRUB_ARC_FIRMWARE_VECTOR->getenvironmentvariable)
consout = GRUB_ARC_FIRMWARE_VECTOR->getenvironmentvariable ("ConsoleOut"); consout = GRUB_ARC_FIRMWARE_VECTOR->getenvironmentvariable ("ConsoleOut");
@ -136,7 +136,7 @@ set_console_dimensions (void)
} }
if (GRUB_ARC_SYSTEM_PARAMETER_BLOCK->firmware_vector_length if (GRUB_ARC_SYSTEM_PARAMETER_BLOCK->firmware_vector_length
>= ((char *) (&GRUB_ARC_FIRMWARE_VECTOR->getdisplaystatus + 1) >= (unsigned) ((char *) (&GRUB_ARC_FIRMWARE_VECTOR->getdisplaystatus + 1)
- (char *) GRUB_ARC_FIRMWARE_VECTOR) - (char *) GRUB_ARC_FIRMWARE_VECTOR)
&& GRUB_ARC_FIRMWARE_VECTOR->getdisplaystatus) && GRUB_ARC_FIRMWARE_VECTOR->getdisplaystatus)
info = GRUB_ARC_FIRMWARE_VECTOR->getdisplaystatus (GRUB_ARC_STDOUT); info = GRUB_ARC_FIRMWARE_VECTOR->getdisplaystatus (GRUB_ARC_STDOUT);

View file

@ -88,6 +88,7 @@ enum gcry_cipher_modes
/* Don't rely on this. Check! */ /* Don't rely on this. Check! */
#define GRUB_CRYPTO_MAX_MDLEN 64 #define GRUB_CRYPTO_MAX_MDLEN 64
#define GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE 16 #define GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE 16
#define GRUB_CRYPTO_MAX_MD_CONTEXT_SIZE 256
/* Type for the cipher_setkey function. */ /* Type for the cipher_setkey function. */
typedef gcry_err_code_t (*gcry_cipher_setkey_t) (void *c, typedef gcry_err_code_t (*gcry_cipher_setkey_t) (void *c,

View file

@ -179,7 +179,7 @@ struct grub_dl
Elf_Sym *symtab; Elf_Sym *symtab;
void (*init) (struct grub_dl *mod); void (*init) (struct grub_dl *mod);
void (*fini) (void); void (*fini) (void);
#if defined (__ia64__) || defined (__powerpc__) #if defined (__ia64__) || defined (__powerpc__) || defined (__mips__)
void *got; void *got;
void *tramp; void *tramp;
#endif #endif
@ -243,23 +243,21 @@ void grub_arch_dl_init_linker (void);
#define GRUB_IA64_DL_TRAMP_SIZE 48 #define GRUB_IA64_DL_TRAMP_SIZE 48
#define GRUB_IA64_DL_GOT_ALIGN 16 #define GRUB_IA64_DL_GOT_ALIGN 16
void grub_err_t
grub_ia64_dl_get_tramp_got_size (const void *ehdr, grub_size_t *tramp, grub_ia64_dl_get_tramp_got_size (const void *ehdr, grub_size_t *tramp,
grub_size_t *got); grub_size_t *got);
#if defined (__ia64__) #if defined (__ia64__)
#define GRUB_ARCH_DL_TRAMP_ALIGN GRUB_IA64_DL_TRAMP_ALIGN #define GRUB_ARCH_DL_TRAMP_ALIGN GRUB_IA64_DL_TRAMP_ALIGN
#define GRUB_ARCH_DL_GOT_ALIGN GRUB_IA64_DL_GOT_ALIGN #define GRUB_ARCH_DL_GOT_ALIGN GRUB_IA64_DL_GOT_ALIGN
#define GRUB_ARCH_DL_TRAMP_SIZE GRUB_IA64_DL_TRAMP_SIZE
#define grub_arch_dl_get_tramp_got_size grub_ia64_dl_get_tramp_got_size #define grub_arch_dl_get_tramp_got_size grub_ia64_dl_get_tramp_got_size
#else #else
void grub_err_t
grub_arch_dl_get_tramp_got_size (const void *ehdr, grub_size_t *tramp, grub_arch_dl_get_tramp_got_size (const void *ehdr, grub_size_t *tramp,
grub_size_t *got); grub_size_t *got);
#endif #endif
#ifdef __powerpc__ #if defined (__powerpc__) || defined (__mips__)
#define GRUB_ARCH_DL_TRAMP_SIZE 16
#define GRUB_ARCH_DL_TRAMP_ALIGN 4 #define GRUB_ARCH_DL_TRAMP_ALIGN 4
#define GRUB_ARCH_DL_GOT_ALIGN 4 #define GRUB_ARCH_DL_GOT_ALIGN 4
#endif #endif

View file

@ -28,14 +28,8 @@
#include <grub/memory.h> #include <grub/memory.h>
#endif #endif
#define GRUB_MEMORY_MACHINE_SCRATCH_ADDR 0x68000 #include <grub/i386/memory.h>
#define GRUB_MEMORY_MACHINE_SCRATCH_SEG (GRUB_MEMORY_MACHINE_SCRATCH_ADDR >> 4) #include <grub/i386/memory_raw.h>
#define GRUB_MEMORY_MACHINE_SCRATCH_SIZE 0x10000
#define GRUB_MEMORY_MACHINE_LOWER_USABLE 0x9fc00 /* 640 kiB - 1 kiB */
#define GRUB_MEMORY_MACHINE_UPPER_START 0x100000 /* 1 MiB */
#define GRUB_MEMORY_MACHINE_LOWER_SIZE GRUB_MEMORY_MACHINE_UPPER_START
#ifndef ASM_FILE #ifndef ASM_FILE

View file

@ -28,6 +28,9 @@
#define GRUB_MEMORY_CPU_AMD64_MSR 0xc0000080 #define GRUB_MEMORY_CPU_AMD64_MSR 0xc0000080
#define GRUB_MEMORY_CPU_AMD64_MSR_ON 0x00000100 #define GRUB_MEMORY_CPU_AMD64_MSR_ON 0x00000100
#define GRUB_MEMORY_MACHINE_UPPER_START 0x100000 /* 1 MiB */
#define GRUB_MEMORY_MACHINE_LOWER_SIZE GRUB_MEMORY_MACHINE_UPPER_START
#ifndef ASM_FILE #ifndef ASM_FILE
#define GRUB_MMAP_MALLOC_LOW 1 #define GRUB_MMAP_MALLOC_LOW 1

View file

@ -0,0 +1,58 @@
/* memory_raw.h - describe the memory map on qemu/coreboot/multiboot/pc */
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2002,2007,2008,2009,2013 Free Software Foundation, Inc.
*
* GRUB is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* GRUB is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef GRUB_MEMORY_CPU_RAW_HEADER
#define GRUB_MEMORY_CPU_RAW_HEADER 1
/* The scratch buffer used in real mode code. */
#define GRUB_MEMORY_MACHINE_SCRATCH_ADDR 0x68000
#define GRUB_MEMORY_MACHINE_SCRATCH_SEG (GRUB_MEMORY_MACHINE_SCRATCH_ADDR >> 4)
#define GRUB_MEMORY_MACHINE_SCRATCH_SIZE 0x9000
/* The real mode stack. */
#define GRUB_MEMORY_MACHINE_REAL_STACK (0x2000 - 0x10)
/* The size of the protect mode stack. */
#define GRUB_MEMORY_MACHINE_PROT_STACK_SIZE 0xf000
/* The protected mode stack. */
#define GRUB_MEMORY_MACHINE_PROT_STACK \
(GRUB_MEMORY_MACHINE_SCRATCH_ADDR + GRUB_MEMORY_MACHINE_SCRATCH_SIZE \
+ GRUB_MEMORY_MACHINE_PROT_STACK_SIZE - 0x10)
/* The memory area where GRUB uses its own purpose. This part is not added
into free memory for dynamic allocations. */
#define GRUB_MEMORY_MACHINE_RESERVED_START \
GRUB_MEMORY_MACHINE_SCRATCH_ADDR
#define GRUB_MEMORY_MACHINE_RESERVED_END \
(GRUB_MEMORY_MACHINE_PROT_STACK + 0x10)
/* The code segment of the protected mode. */
#define GRUB_MEMORY_MACHINE_PROT_MODE_CSEG 0x8
/* The data segment of the protected mode. */
#define GRUB_MEMORY_MACHINE_PROT_MODE_DSEG 0x10
/* The code segment of the pseudo real mode. */
#define GRUB_MEMORY_MACHINE_PSEUDO_REAL_CSEG 0x18
/* The data segment of the pseudo real mode. */
#define GRUB_MEMORY_MACHINE_PSEUDO_REAL_DSEG 0x20
#endif

View file

@ -28,32 +28,10 @@
#endif #endif
#include <grub/i386/memory.h> #include <grub/i386/memory.h>
#include <grub/i386/memory_raw.h>
#include <grub/offsets.h> #include <grub/offsets.h>
/* The scratch buffer used in real mode code. */
#define GRUB_MEMORY_MACHINE_SCRATCH_ADDR 0x68000
#define GRUB_MEMORY_MACHINE_SCRATCH_SEG (GRUB_MEMORY_MACHINE_SCRATCH_ADDR >> 4)
#define GRUB_MEMORY_MACHINE_SCRATCH_SIZE 0x10000
/* The real mode stack. */
#define GRUB_MEMORY_MACHINE_REAL_STACK (0x2000 - 0x10)
/* The size of the protect mode stack. */
#define GRUB_MEMORY_MACHINE_PROT_STACK_SIZE 0x8000
/* The protected mode stack. */
#define GRUB_MEMORY_MACHINE_PROT_STACK \
(GRUB_MEMORY_MACHINE_SCRATCH_ADDR + GRUB_MEMORY_MACHINE_SCRATCH_SIZE \
+ GRUB_MEMORY_MACHINE_PROT_STACK_SIZE - 0x10)
/* The memory area where GRUB uses its own purpose. This part is not added
into free memory for dynamic allocations. */
#define GRUB_MEMORY_MACHINE_RESERVED_START \
GRUB_MEMORY_MACHINE_SCRATCH_ADDR
#define GRUB_MEMORY_MACHINE_RESERVED_END \
(GRUB_MEMORY_MACHINE_PROT_STACK + 0x10)
/* The area where GRUB is decompressed at early startup. */ /* The area where GRUB is decompressed at early startup. */
#define GRUB_MEMORY_MACHINE_DECOMPRESSION_ADDR 0x100000 #define GRUB_MEMORY_MACHINE_DECOMPRESSION_ADDR 0x100000
@ -63,18 +41,6 @@
/* The address where another boot loader is loaded. */ /* The address where another boot loader is loaded. */
#define GRUB_MEMORY_MACHINE_BOOT_LOADER_ADDR 0x7c00 #define GRUB_MEMORY_MACHINE_BOOT_LOADER_ADDR 0x7c00
/* The code segment of the protected mode. */
#define GRUB_MEMORY_MACHINE_PROT_MODE_CSEG 0x8
/* The data segment of the protected mode. */
#define GRUB_MEMORY_MACHINE_PROT_MODE_DSEG 0x10
/* The code segment of the pseudo real mode. */
#define GRUB_MEMORY_MACHINE_PSEUDO_REAL_CSEG 0x18
/* The data segment of the pseudo real mode. */
#define GRUB_MEMORY_MACHINE_PSEUDO_REAL_DSEG 0x20
#define GRUB_MEMORY_MACHINE_BIOS_DATA_AREA_ADDR 0x400 #define GRUB_MEMORY_MACHINE_BIOS_DATA_AREA_ADDR 0x400
#ifndef ASM_FILE #ifndef ASM_FILE

View file

@ -1,36 +1 @@
/* memory.h - describe the memory map */
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2002,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/>.
*/
#ifndef _GRUB_MEMORY_MACHINE_HEADER
#define _GRUB_MEMORY_MACHINE_HEADER 1
#include <grub/symbol.h>
#include <grub/i386/coreboot/memory.h> #include <grub/i386/coreboot/memory.h>
#ifndef ASM_FILE
#include <grub/err.h>
#include <grub/types.h>
#endif
#define GRUB_MEMORY_MACHINE_LOWER_USABLE 0x9fc00 /* 640 kiB - 1 kiB */
#define GRUB_MEMORY_MACHINE_UPPER_START 0x100000 /* 1 MiB */
#define GRUB_MEMORY_MACHINE_LOWER_SIZE GRUB_MEMORY_MACHINE_UPPER_START
#endif /* ! _GRUB_MEMORY_MACHINE_HEADER */

View file

@ -421,6 +421,10 @@ void EXPORT_FUNC(grub_reboot) (void) __attribute__ ((noreturn));
void grub_reboot (void) __attribute__ ((noreturn)); void grub_reboot (void) __attribute__ ((noreturn));
#endif #endif
#if defined (__clang__) && !defined (GRUB_UTIL)
void __attribute__ ((noreturn)) EXPORT_FUNC (abort) (void);
#endif
#ifdef GRUB_MACHINE_PCBIOS #ifdef GRUB_MACHINE_PCBIOS
/* Halt the system, using APM if possible. If NO_APM is true, don't /* Halt the system, using APM if possible. If NO_APM is true, don't
* use APM even if it is available. */ * use APM even if it is available. */

View file

@ -27,6 +27,12 @@
/* Add an underscore to a C symbol in assembler code if needed. */ /* Add an underscore to a C symbol in assembler code if needed. */
#ifndef GRUB_UTIL #ifndef GRUB_UTIL
#ifdef __APPLE__
#define MACRO_DOLLAR(x) $$ ## x
#else
#define MACRO_DOLLAR(x) $ ## x
#endif
#if HAVE_ASM_USCORE #if HAVE_ASM_USCORE
#ifdef ASM_FILE #ifdef ASM_FILE
# define EXT_C(sym) _ ## sym # define EXT_C(sym) _ ## sym

View file

@ -87,6 +87,8 @@ enum grub_install_plat
GRUB_INSTALL_PLATFORM_ARM_EFI, GRUB_INSTALL_PLATFORM_ARM_EFI,
GRUB_INSTALL_PLATFORM_MIPSEL_QEMU_MIPS, GRUB_INSTALL_PLATFORM_MIPSEL_QEMU_MIPS,
GRUB_INSTALL_PLATFORM_MIPS_QEMU_MIPS, GRUB_INSTALL_PLATFORM_MIPS_QEMU_MIPS,
GRUB_INSTALL_PLATFORM_I386_XEN,
GRUB_INSTALL_PLATFORM_X86_64_XEN,
GRUB_INSTALL_PLATFORM_ARM64_EFI, GRUB_INSTALL_PLATFORM_ARM64_EFI,
GRUB_INSTALL_PLATFORM_MAX GRUB_INSTALL_PLATFORM_MAX
}; };

24
tests/btrfs_test.in Normal file
View file

@ -0,0 +1,24 @@
#!/bin/sh
set -e
if [ "x$EUID" = "x" ] ; then
EUID=`id -u`
fi
if [ "$EUID" != 0 ] ; then
exit 77
fi
if ! which mkfs.btrfs >/dev/null 2>&1; then
echo "mkfs.btrfs not installed; cannot test btrfs."
exit 77
fi
"@builddir@/grub-fs-tester" btrfs
"@builddir@/grub-fs-tester" btrfs_zlib
"@builddir@/grub-fs-tester" btrfs_lzo
"@builddir@/grub-fs-tester" btrfs_raid0
"@builddir@/grub-fs-tester" btrfs_raid1
"@builddir@/grub-fs-tester" btrfs_single
"@builddir@/grub-fs-tester" btrfs_raid10

16
tests/cpio_test.in Normal file
View file

@ -0,0 +1,16 @@
#!/bin/sh
set -e
if ! which cpio >/dev/null 2>&1; then
echo "cpio not installed; cannot test cpio."
exit 77
fi
"@builddir@/grub-fs-tester" cpio_bin
"@builddir@/grub-fs-tester" cpio_odc
"@builddir@/grub-fs-tester" cpio_newc
"@builddir@/grub-fs-tester" cpio_crc
"@builddir@/grub-fs-tester" cpio_ustar
"@builddir@/grub-fs-tester" cpio_hpbin
"@builddir@/grub-fs-tester" cpio_hpodc

18
tests/exfat_test.in Normal file
View file

@ -0,0 +1,18 @@
#!/bin/sh
set -e
if [ "x$EUID" = "x" ] ; then
EUID=`id -u`
fi
if [ "$EUID" != 0 ] ; then
exit 77
fi
if ! which mkfs.exfat >/dev/null 2>&1; then
echo "mkfs.exfat not installed; cannot test exFAT."
exit 77
fi
"@builddir@/grub-fs-tester" exfat

31
tests/ext234_test.in Normal file
View file

@ -0,0 +1,31 @@
#!/bin/sh
set -e
if [ "x$EUID" = "x" ] ; then
EUID=`id -u`
fi
if [ "$EUID" != 0 ] ; then
exit 77
fi
if ! which mkfs.ext2 >/dev/null 2>&1; then
echo "mkfs.ext2 not installed; cannot test ext2."
exit 77
fi
if ! which mkfs.ext3 >/dev/null 2>&1; then
echo "mkfs.ext3 not installed; cannot test ext3."
exit 77
fi
if ! which mkfs.ext4 >/dev/null 2>&1; then
echo "mkfs.ext4 not installed; cannot test ext4."
exit 77
fi
"@builddir@/grub-fs-tester" ext2_old
"@builddir@/grub-fs-tester" ext2
"@builddir@/grub-fs-tester" ext3
"@builddir@/grub-fs-tester" ext4

22
tests/fat_test.in Normal file
View file

@ -0,0 +1,22 @@
#!/bin/sh
set -e
if [ "x$EUID" = "x" ] ; then
EUID=`id -u`
fi
if [ "$EUID" != 0 ] ; then
exit 77
fi
if ! which mkfs.vfat >/dev/null 2>&1; then
echo "mkfs.vfat not installed; cannot test FAT."
exit 77
fi
"@builddir@/grub-fs-tester" vfat16a
"@builddir@/grub-fs-tester" vfat12a
"@builddir@/grub-fs-tester" vfat12
"@builddir@/grub-fs-tester" vfat16
"@builddir@/grub-fs-tester" vfat32

23
tests/hfs_test.in Normal file
View file

@ -0,0 +1,23 @@
#!/bin/sh
set -e
if [ "x$EUID" = "x" ] ; then
EUID=`id -u`
fi
if [ "$EUID" != 0 ] ; then
exit 77
fi
if ! which mkfs.hfs >/dev/null 2>&1; then
echo "mkfs.hfs not installed; cannot test HFS."
exit 77
fi
if ! modprobe mac-roman; then
echo "no mac-roman support; cannot test HFS."
exit 77
fi
"@builddir@/grub-fs-tester" hfs

20
tests/hfsplus_test.in Normal file
View file

@ -0,0 +1,20 @@
#!/bin/sh
set -e
if [ "x$EUID" = "x" ] ; then
EUID=`id -u`
fi
if [ "$EUID" != 0 ] ; then
exit 77
fi
if ! which mkfs.hfsplus >/dev/null 2>&1; then
echo "mkfs.hfsplus not installed; cannot test hfsplus."
exit 77
fi
"@builddir@/grub-fs-tester" hfsplus
"@builddir@/grub-fs-tester" hfsplus_casesens
"@builddir@/grub-fs-tester" hfsplus_wrap

15
tests/iso9660_test.in Normal file
View file

@ -0,0 +1,15 @@
#!/bin/sh
set -e
if ! which xorriso >/dev/null 2>&1; then
echo "xorriso not installed; cannot test iso9660."
exit 77
fi
"@builddir@/grub-fs-tester" joliet
"@builddir@/grub-fs-tester" rockridge
"@builddir@/grub-fs-tester" rockridge_joliet
"@builddir@/grub-fs-tester" joliet_1999
"@builddir@/grub-fs-tester" rockridge_1999
"@builddir@/grub-fs-tester" rockridge_joliet_1999

18
tests/jfs_test.in Normal file
View file

@ -0,0 +1,18 @@
#!/bin/sh
set -e
if [ "x$EUID" = "x" ] ; then
EUID=`id -u`
fi
if [ "$EUID" != 0 ] ; then
exit 77
fi
if ! which mkfs.jfs >/dev/null 2>&1; then
echo "mkfs.jfs not installed; cannot test JFS."
exit 77
fi
"@builddir@/grub-fs-tester" jfs

25
tests/minixfs_test.in Normal file
View file

@ -0,0 +1,25 @@
#!/bin/sh
set -e
if [ "x$EUID" = "x" ] ; then
EUID=`id -u`
fi
if [ "$EUID" != 0 ] ; then
exit 77
fi
if ! which mkfs.minix >/dev/null 2>&1; then
echo "mkfs.minix not installed; cannot test minixfs."
exit 77
fi
if ! mkfs.minix -h | grep -- -v > /dev/null; then
echo "mkfs.minix doesn't support minix3fs; cannot test minix*fs."
exit 77
fi
"@builddir@/grub-fs-tester" minix
"@builddir@/grub-fs-tester" minix2
"@builddir@/grub-fs-tester" minix3

18
tests/nilfs2_test.in Normal file
View file

@ -0,0 +1,18 @@
#!/bin/sh
set -e
if [ "x$EUID" = "x" ] ; then
EUID=`id -u`
fi
if [ "$EUID" != 0 ] ; then
exit 77
fi
if ! which mkfs.nilfs2 >/dev/null 2>&1; then
echo "mkfs.nilfs2 not installed; cannot test nilfs2."
exit 77
fi
"@builddir@/grub-fs-tester" nilfs2

19
tests/ntfs_test.in Normal file
View file

@ -0,0 +1,19 @@
#!/bin/sh
set -e
if [ "x$EUID" = "x" ] ; then
EUID=`id -u`
fi
if [ "$EUID" != 0 ] ; then
exit 77
fi
if ! which mkfs.ntfs >/dev/null 2>&1; then
echo "mkfs.ntfs not installed; cannot test ntfs."
exit 77
fi
"@builddir@/grub-fs-tester" ntfs
"@builddir@/grub-fs-tester" ntfscomp

20
tests/reiserfs_test.in Normal file
View file

@ -0,0 +1,20 @@
#!/bin/sh
set -e
if [ "x$EUID" = "x" ] ; then
EUID=`id -u`
fi
if [ "$EUID" != 0 ] ; then
exit 77
fi
if ! which mkfs.reiserfs >/dev/null 2>&1; then
echo "mkfs.reiserfs not installed; cannot test reiserfs."
exit 77
fi
"@builddir@/grub-fs-tester" reiserfs
"@builddir@/grub-fs-tester" reiserfs_old

10
tests/romfs_test.in Normal file
View file

@ -0,0 +1,10 @@
#!/bin/sh
set -e
if ! which genromfs >/dev/null 2>&1; then
echo "genromfs not installed; cannot test romfs."
exit 77
fi
"@builddir@/grub-fs-tester" romfs

12
tests/squashfs_test.in Normal file
View file

@ -0,0 +1,12 @@
#!/bin/sh
set -e
if ! which mksquashfs >/dev/null 2>&1; then
echo "mksquashfs not installed; cannot test squashfs."
exit 77
fi
"@builddir@/grub-fs-tester" squash4_gzip
"@builddir@/grub-fs-tester" squash4_xz
"@builddir@/grub-fs-tester" squash4_lzo

10
tests/tar_test.in Normal file
View file

@ -0,0 +1,10 @@
#!/bin/sh
set -e
if ! which tar >/dev/null 2>&1; then
echo "tar not installed; cannot test tar."
exit 77
fi
"@builddir@/grub-fs-tester" tarfs

19
tests/udf_test.in Normal file
View file

@ -0,0 +1,19 @@
#!/bin/sh
set -e
if [ "x$EUID" = "x" ] ; then
EUID=`id -u`
fi
if [ "$EUID" != 0 ] ; then
exit 77
fi
if ! which mkudffs >/dev/null 2>&1; then
echo "mkudffs not installed; cannot test UDF."
exit 77
fi
"@builddir@/grub-fs-tester" udf

1427
tests/util/grub-fs-tester.in Normal file

File diff suppressed because it is too large Load diff

19
tests/xfs_test.in Normal file
View file

@ -0,0 +1,19 @@
#!/bin/sh
set -e
if [ "x$EUID" = "x" ] ; then
EUID=`id -u`
fi
if [ "$EUID" != 0 ] ; then
exit 77
fi
if ! which mkfs.xfs >/dev/null 2>&1; then
echo "mkfs.xfs not installed; cannot test xfs."
exit 77
fi
"@builddir@/grub-fs-tester" xfs

27
tests/zfs_test.in Normal file
View file

@ -0,0 +1,27 @@
#!/bin/sh
set -e
if [ "x$EUID" = "x" ] ; then
EUID=`id -u`
fi
if [ "$EUID" != 0 ] ; then
exit 77
fi
if ! which zpool >/dev/null 2>&1; then
echo "zpool not installed; cannot test zfs."
exit 77
fi
"@builddir@/grub-fs-tester" zfs
"@builddir@/grub-fs-tester" zfs_lzjb
"@builddir@/grub-fs-tester" zfs_gzip
"@builddir@/grub-fs-tester" zfs_zle
"@builddir@/grub-fs-tester" zfs_raidz3
"@builddir@/grub-fs-tester" zfs_raidz2
"@builddir@/grub-fs-tester" zfs_raidz
"@builddir@/grub-fs-tester" zfs_mirror
"@builddir@/grub-fs-tester" zfs_stripe
"@builddir@/grub-fs-tester" zfs_caseins

67
util/garbage-gen.c Normal file
View file

@ -0,0 +1,67 @@
/*
* 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/>.
*/
/* Standard random generator is slow. For FS testing we need just some
garbage files, we don't need them to be high-quality random.
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
static unsigned long long buffer[1048576];
int
main (int argc, char **argv)
{
unsigned long long high = 0, low = 1;
unsigned long i, j;
unsigned long long cnt = strtoull (argv[1], 0, 0);
struct timeval tv;
gettimeofday (&tv, NULL);
high = tv.tv_sec;
low = tv.tv_usec;
if (!high)
high = 1;
if (!low)
low = 2;
for (j = 0; j < (cnt + sizeof (buffer) - 1) / sizeof (buffer); j++)
{
for (i = 0; i < sizeof (buffer) / sizeof (buffer[0]); i += 2)
{
int c1 = 0, c2 = 0;
buffer[i] = low;
buffer[i+1] = high;
if (low & (1ULL << 63))
c1 = 1;
low <<= 1;
if (high & (1ULL << 63))
c2 = 1;
high = (high << 1) | c1;
if (c2)
low ^= 0x87;
}
if (sizeof (buffer) < cnt - sizeof (buffer) * j)
fwrite (buffer, 1, sizeof (buffer), stdout);
else
fwrite (buffer, 1, cnt - sizeof (buffer) * j, stdout);
}
return 0;
}

View file

@ -558,7 +558,7 @@ copy_locales (const char *dstd)
grub_util_fd_dirent_t de; grub_util_fd_dirent_t de;
const char *locale_dir = grub_util_get_localedir (); const char *locale_dir = grub_util_get_localedir ();
d = grub_util_fd_opendir (LOCALEDIR); d = grub_util_fd_opendir (locale_dir);
if (!d) if (!d)
{ {
grub_util_warn (_("cannot open directory `%s': %s"), grub_util_warn (_("cannot open directory `%s': %s"),
@ -597,6 +597,8 @@ static struct
[GRUB_INSTALL_PLATFORM_I386_MULTIBOOT] = { "i386", "multiboot" }, [GRUB_INSTALL_PLATFORM_I386_MULTIBOOT] = { "i386", "multiboot" },
[GRUB_INSTALL_PLATFORM_I386_IEEE1275] = { "i386", "ieee1275" }, [GRUB_INSTALL_PLATFORM_I386_IEEE1275] = { "i386", "ieee1275" },
[GRUB_INSTALL_PLATFORM_X86_64_EFI] = { "x86_64", "efi" }, [GRUB_INSTALL_PLATFORM_X86_64_EFI] = { "x86_64", "efi" },
[GRUB_INSTALL_PLATFORM_I386_XEN] = { "i386", "xen" },
[GRUB_INSTALL_PLATFORM_X86_64_XEN] = { "x86_64", "xen" },
[GRUB_INSTALL_PLATFORM_MIPSEL_LOONGSON] = { "mipsel", "loongson" }, [GRUB_INSTALL_PLATFORM_MIPSEL_LOONGSON] = { "mipsel", "loongson" },
[GRUB_INSTALL_PLATFORM_MIPSEL_QEMU_MIPS] = { "mipsel", "qemu_mips" }, [GRUB_INSTALL_PLATFORM_MIPSEL_QEMU_MIPS] = { "mipsel", "qemu_mips" },
[GRUB_INSTALL_PLATFORM_MIPS_QEMU_MIPS] = { "mips", "qemu_mips" }, [GRUB_INSTALL_PLATFORM_MIPS_QEMU_MIPS] = { "mips", "qemu_mips" },
@ -707,6 +709,8 @@ grub_install_copy_files (const char *src,
} }
else else
{ {
const char *locale_dir = grub_util_get_localedir ();
for (i = 0; i < install_locales.n_entries; i++) for (i = 0; i < install_locales.n_entries; i++)
{ {
char *srcf = grub_util_path_concat_ext (3, src, char *srcf = grub_util_path_concat_ext (3, src,
@ -724,7 +728,7 @@ grub_install_copy_files (const char *src,
} }
free (srcf); free (srcf);
srcf = grub_util_path_concat_ext (4, srcf = grub_util_path_concat_ext (4,
LOCALEDIR, locale_dir,
install_locales.entries[i], install_locales.entries[i],
"LC_MESSAGES", "LC_MESSAGES",
PACKAGE, PACKAGE,

View file

@ -233,7 +233,7 @@ static struct argp_option options[] = {
"This option is only available on BIOS target."), 2}, "This option is only available on BIOS target."), 2},
{"no-nvram", OPTION_NO_NVRAM, 0, 0, {"no-nvram", OPTION_NO_NVRAM, 0, 0,
N_("don't update the `boot-device' NVRAM variable. " N_("don't update the `boot-device' NVRAM variable. "
"This option is only available on IEEE1275 targets."), 2}, "This option is only available on EFI and IEEE1275 targets."), 2},
{"skip-fs-probe",'s',0, 0, {"skip-fs-probe",'s',0, 0,
N_("do not probe for filesystems in DEVICE"), 0}, N_("do not probe for filesystems in DEVICE"), 0},
{"no-bootsector", OPTION_NO_BOOTSECTOR, 0, 0, {"no-bootsector", OPTION_NO_BOOTSECTOR, 0, 0,
@ -418,6 +418,9 @@ have_bootdev (enum grub_install_plat pl)
case GRUB_INSTALL_PLATFORM_MIPSEL_LOONGSON: case GRUB_INSTALL_PLATFORM_MIPSEL_LOONGSON:
case GRUB_INSTALL_PLATFORM_ARM_UBOOT: case GRUB_INSTALL_PLATFORM_ARM_UBOOT:
case GRUB_INSTALL_PLATFORM_I386_XEN:
case GRUB_INSTALL_PLATFORM_X86_64_XEN:
return 0; return 0;
/* pacify warning. */ /* pacify warning. */
@ -758,6 +761,8 @@ main (int argc, char *argv[])
case GRUB_INSTALL_PLATFORM_MIPSEL_ARC: case GRUB_INSTALL_PLATFORM_MIPSEL_ARC:
case GRUB_INSTALL_PLATFORM_MIPS_ARC: case GRUB_INSTALL_PLATFORM_MIPS_ARC:
case GRUB_INSTALL_PLATFORM_ARM_UBOOT: case GRUB_INSTALL_PLATFORM_ARM_UBOOT:
case GRUB_INSTALL_PLATFORM_I386_XEN:
case GRUB_INSTALL_PLATFORM_X86_64_XEN:
break; break;
case GRUB_INSTALL_PLATFORM_I386_QEMU: case GRUB_INSTALL_PLATFORM_I386_QEMU:
@ -798,6 +803,8 @@ main (int argc, char *argv[])
case GRUB_INSTALL_PLATFORM_MIPSEL_LOONGSON: case GRUB_INSTALL_PLATFORM_MIPSEL_LOONGSON:
case GRUB_INSTALL_PLATFORM_MIPSEL_QEMU_MIPS: case GRUB_INSTALL_PLATFORM_MIPSEL_QEMU_MIPS:
case GRUB_INSTALL_PLATFORM_MIPS_QEMU_MIPS: case GRUB_INSTALL_PLATFORM_MIPS_QEMU_MIPS:
case GRUB_INSTALL_PLATFORM_I386_XEN:
case GRUB_INSTALL_PLATFORM_X86_64_XEN:
free (install_device); free (install_device);
install_device = NULL; install_device = NULL;
break; break;
@ -1217,6 +1224,8 @@ main (int argc, char *argv[])
case GRUB_INSTALL_PLATFORM_MIPS_ARC: case GRUB_INSTALL_PLATFORM_MIPS_ARC:
case GRUB_INSTALL_PLATFORM_MIPSEL_ARC: case GRUB_INSTALL_PLATFORM_MIPSEL_ARC:
case GRUB_INSTALL_PLATFORM_ARM_UBOOT: case GRUB_INSTALL_PLATFORM_ARM_UBOOT:
case GRUB_INSTALL_PLATFORM_I386_XEN:
case GRUB_INSTALL_PLATFORM_X86_64_XEN:
grub_util_warn ("%s", _("no hints available for your platform. Expect reduced performance")); grub_util_warn ("%s", _("no hints available for your platform. Expect reduced performance"));
break; break;
/* pacify warning. */ /* pacify warning. */
@ -1304,6 +1313,8 @@ main (int argc, char *argv[])
case GRUB_INSTALL_PLATFORM_I386_MULTIBOOT: case GRUB_INSTALL_PLATFORM_I386_MULTIBOOT:
case GRUB_INSTALL_PLATFORM_I386_IEEE1275: case GRUB_INSTALL_PLATFORM_I386_IEEE1275:
case GRUB_INSTALL_PLATFORM_POWERPC_IEEE1275: case GRUB_INSTALL_PLATFORM_POWERPC_IEEE1275:
case GRUB_INSTALL_PLATFORM_I386_XEN:
case GRUB_INSTALL_PLATFORM_X86_64_XEN:
core_name = "core.elf"; core_name = "core.elf";
snprintf (mkimage_target, sizeof (mkimage_target), snprintf (mkimage_target, sizeof (mkimage_target),
"%s-%s", "%s-%s",
@ -1395,6 +1406,8 @@ main (int argc, char *argv[])
case GRUB_INSTALL_PLATFORM_ARM_UBOOT: case GRUB_INSTALL_PLATFORM_ARM_UBOOT:
case GRUB_INSTALL_PLATFORM_I386_QEMU: case GRUB_INSTALL_PLATFORM_I386_QEMU:
case GRUB_INSTALL_PLATFORM_SPARC64_IEEE1275: case GRUB_INSTALL_PLATFORM_SPARC64_IEEE1275:
case GRUB_INSTALL_PLATFORM_I386_XEN:
case GRUB_INSTALL_PLATFORM_X86_64_XEN:
break; break;
/* pacify warning. */ /* pacify warning. */
case GRUB_INSTALL_PLATFORM_MAX: case GRUB_INSTALL_PLATFORM_MAX:
@ -1414,7 +1427,7 @@ main (int argc, char *argv[])
"boot.img"); "boot.img");
grub_install_copy_file (boot_img_src, boot_img, 1); grub_install_copy_file (boot_img_src, boot_img, 1);
grub_util_info ("%sgrub_bios_setup %s %s %s %s --directory='%s' --device-map='%s' '%s'", grub_util_info ("%sgrub-bios-setup %s %s %s %s --directory='%s' --device-map='%s' '%s'",
install_bootsector ? "" : "NOT RUNNING: ", install_bootsector ? "" : "NOT RUNNING: ",
allow_floppy ? "--allow-floppy " : "", allow_floppy ? "--allow-floppy " : "",
verbosity ? "--verbose " : "", verbosity ? "--verbose " : "",
@ -1440,7 +1453,7 @@ main (int argc, char *argv[])
"boot.img"); "boot.img");
grub_install_copy_file (boot_img_src, boot_img, 1); grub_install_copy_file (boot_img_src, boot_img, 1);
grub_util_info ("%sgrub_sparc_setup %s %s %s %s --directory='%s' --device-map='%s' '%s'", grub_util_info ("%sgrub-sparc64-setup %s %s %s %s --directory='%s' --device-map='%s' '%s'",
install_bootsector ? "" : "NOT RUNNING: ", install_bootsector ? "" : "NOT RUNNING: ",
allow_floppy ? "--allow-floppy " : "", allow_floppy ? "--allow-floppy " : "",
verbosity ? "--verbose " : "", verbosity ? "--verbose " : "",
@ -1525,7 +1538,7 @@ main (int argc, char *argv[])
grub_install_copy_file (imgfile, dst, 1); grub_install_copy_file (imgfile, dst, 1);
free (dst); free (dst);
} }
if (!removable) if (!removable && update_nvram)
{ {
char * efidir_disk; char * efidir_disk;
int efidir_part; int efidir_part;
@ -1552,6 +1565,8 @@ main (int argc, char *argv[])
case GRUB_INSTALL_PLATFORM_MIPSEL_ARC: case GRUB_INSTALL_PLATFORM_MIPSEL_ARC:
case GRUB_INSTALL_PLATFORM_ARM_UBOOT: case GRUB_INSTALL_PLATFORM_ARM_UBOOT:
case GRUB_INSTALL_PLATFORM_I386_QEMU: case GRUB_INSTALL_PLATFORM_I386_QEMU:
case GRUB_INSTALL_PLATFORM_I386_XEN:
case GRUB_INSTALL_PLATFORM_X86_64_XEN:
grub_util_warn ("%s", grub_util_warn ("%s",
_("WARNING: no platform-specific install was performed")); _("WARNING: no platform-specific install was performed"));
break; break;

View file

@ -216,6 +216,7 @@ export GRUB_DEFAULT \
GRUB_SAVEDEFAULT \ GRUB_SAVEDEFAULT \
GRUB_ENABLE_CRYPTODISK \ GRUB_ENABLE_CRYPTODISK \
GRUB_BADRAM \ GRUB_BADRAM \
GRUB_OS_PROBER_SKIP_LIST \
GRUB_DISABLE_SUBMENU GRUB_DISABLE_SUBMENU
if test "x${grub_cfg}" != "x"; then if test "x${grub_cfg}" != "x"; then
@ -224,7 +225,7 @@ if test "x${grub_cfg}" != "x"; then
exec > "${grub_cfg}.new" exec > "${grub_cfg}.new"
umask $oldumask umask $oldumask
fi fi
gettext "Generating grub.cfg ..." >&2 gettext "Generating grub configuration file ..." >&2
echo >&2 echo >&2
cat << EOF cat << EOF

View file

@ -1376,7 +1376,6 @@ SUFFIX (load_image) (const char *kernel_path, size_t *exec_size,
*kernel_sz = ALIGN_UP (*kernel_sz, 16); *kernel_sz = ALIGN_UP (*kernel_sz, 16);
grub_ia64_dl_get_tramp_got_size (e, &tramp, &got); grub_ia64_dl_get_tramp_got_size (e, &tramp, &got);
tramp *= sizeof (struct grub_ia64_trampoline);
ia64_toff = *kernel_sz; ia64_toff = *kernel_sz;
*kernel_sz += ALIGN_UP (tramp, 16); *kernel_sz += ALIGN_UP (tramp, 16);
@ -1387,7 +1386,7 @@ SUFFIX (load_image) (const char *kernel_path, size_t *exec_size,
*kernel_sz += 16 * ia64jmpnum; *kernel_sz += 16 * ia64jmpnum;
ia64_got_off = *kernel_sz; ia64_got_off = *kernel_sz;
*kernel_sz += ALIGN_UP (got * sizeof (grub_uint64_t), 16); *kernel_sz += ALIGN_UP (got, 16);
} }
#endif #endif

View file

@ -396,11 +396,12 @@ main (int argc, char *argv[])
if (!grub_install_source_directory) if (!grub_install_source_directory)
{ {
const char *pkglibdir = grub_util_get_pkglibdir ();
enum grub_install_plat plat; enum grub_install_plat plat;
for (plat = 0; plat < GRUB_INSTALL_PLATFORM_MAX; plat++) for (plat = 0; plat < GRUB_INSTALL_PLATFORM_MAX; plat++)
{ {
char *platdir = grub_util_path_concat (2, pkgdatadir, char *platdir = grub_util_path_concat (2, pkglibdir,
grub_install_get_platform_name (plat)); grub_install_get_platform_name (plat));
if (!grub_util_is_directory (platdir)) if (!grub_util_is_directory (platdir))

View file

@ -112,6 +112,18 @@ for OS in ${OSPROBED} ; do
LONGNAME="`echo ${OS} | cut -d ':' -f 2 | tr '^' ' '`" LONGNAME="`echo ${OS} | cut -d ':' -f 2 | tr '^' ' '`"
LABEL="`echo ${OS} | cut -d ':' -f 3 | tr '^' ' '`" LABEL="`echo ${OS} | cut -d ':' -f 3 | tr '^' ' '`"
BOOT="`echo ${OS} | cut -d ':' -f 4`" BOOT="`echo ${OS} | cut -d ':' -f 4`"
UUID="`grub-probe --target=fs_uuid --device ${DEVICE%@*}`"
EXPUUID="$UUID"
if [ x"${DEVICE#*@}" != x ] ; then
EXPUUID="${EXPUUID}@${DEVICE#*@}"
fi
if [ "x${GRUB_OS_PROBER_SKIP_LIST}" != "x" -a "x`echo ${GRUB_OS_PROBER_SKIP_LIST} | grep -i -e '\b'${EXPUUID}'\b'`" != "x" ] ; then
echo "Skipped ${LONGNAME} on ${DEVICE} by user request." >&2
continue
fi
BTRFS="`echo ${OS} | cut -d ':' -f 5`" BTRFS="`echo ${OS} | cut -d ':' -f 5`"
if [ "x$BTRFS" = "xbtrfs" ]; then if [ "x$BTRFS" = "xbtrfs" ]; then
BTRFSuuid="`echo ${OS} | cut -d ':' -f 6`" BTRFSuuid="`echo ${OS} | cut -d ':' -f 6`"
@ -265,7 +277,7 @@ EOF
echo "$title_correction_code" echo "$title_correction_code"
;; ;;
macosx) macosx)
OSXUUID="`${grub_probe} --target=fs_uuid --device ${DEVICE} 2> /dev/null`" OSXUUID="${UUID}"
osx_entry xnu_kernel 32 osx_entry xnu_kernel 32
osx_entry xnu_kernel64 64 osx_entry xnu_kernel64 64
;; ;;

View file

@ -137,11 +137,13 @@ for cipher_file in cipher_files:
ciphernames = [] ciphernames = []
mdnames = [] mdnames = []
mdctxsizes = []
pknames = [] pknames = []
hold = False hold = False
skip = 0 skip = 0
skip2 = False skip2 = False
ismd = False ismd = False
mdarg = 0
ispk = False ispk = False
iscipher = False iscipher = False
iscryptostart = False iscryptostart = False
@ -174,6 +176,11 @@ for cipher_file in cipher_files:
sg = s.groups()[0] sg = s.groups()[0]
cryptolist.write (("%s: %s\n") % (sg, modname)) cryptolist.write (("%s: %s\n") % (sg, modname))
iscryptostart = False iscryptostart = False
if ismd:
spl = line.split (",")
if mdarg + len (spl) > 9 and mdarg <= 9 and ("sizeof" in spl[9-mdarg]):
mdctxsizes.append (spl[9-mdarg].lstrip ().rstrip())
mdarg = mdarg + len (spl) - 1
if ismd or iscipher or ispk: if ismd or iscipher or ispk:
if not re.search (" *};", line) is None: if not re.search (" *};", line) is None:
if not iscomma: if not iscomma:
@ -189,6 +196,7 @@ for cipher_file in cipher_files:
fw.write (" .blocksize = %s\n" fw.write (" .blocksize = %s\n"
% mdblocksizes [mdname]) % mdblocksizes [mdname])
ismd = False ismd = False
mdarg = 0
iscipher = False iscipher = False
ispk = False ispk = False
iscomma = not re.search (",$", line) is None iscomma = not re.search (",$", line) is None
@ -283,6 +291,7 @@ for cipher_file in cipher_files:
mdname = re.match("[a-zA-Z0-9_]*",mdname).group () mdname = re.match("[a-zA-Z0-9_]*",mdname).group ()
mdnames.append (mdname) mdnames.append (mdname)
ismd = True ismd = True
mdarg = 0
iscryptostart = True iscryptostart = True
m = re.match ("static const char \*selftest.*;$", line) m = re.match ("static const char \*selftest.*;$", line)
if not m is None: if not m is None:
@ -423,6 +432,8 @@ for cipher_file in cipher_files:
chmsg = "Register cipher %s" % ciphername chmsg = "Register cipher %s" % ciphername
chlognew = "%s\n %s" % (chlognew, chmsg) chlognew = "%s\n %s" % (chlognew, chmsg)
fw.write (" grub_cipher_register (&%s);\n" % ciphername) fw.write (" grub_cipher_register (&%s);\n" % ciphername)
for ctxsize in mdctxsizes:
fw.write (" COMPILE_TIME_ASSERT(%s <= GRUB_CRYPTO_MAX_MD_CONTEXT_SIZE);\n" % ctxsize)
for mdname in mdnames: for mdname in mdnames:
chmsg = "Register digest %s" % mdname chmsg = "Register digest %s" % mdname
chlognew = "%s\n %s" % (chlognew, chmsg) chlognew = "%s\n %s" % (chlognew, chmsg)