mirror of
http://cgit.git.savannah.gnu.org/git/grub.git
synced 2026-04-28 14:33:34 +00:00
Compare commits
19 Commits
phcoder/ef
...
phcoder/po
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7c58da503f | ||
|
|
5574a209a0 | ||
|
|
739b471725 | ||
|
|
4c2055ef0b | ||
|
|
5d20f9b0e7 | ||
|
|
8d5401d29e | ||
|
|
3f170e4e73 | ||
|
|
7cb450b45e | ||
|
|
f0a52cf8d2 | ||
|
|
3c75c98572 | ||
|
|
e2977a3d68 | ||
|
|
69fbf6a348 | ||
|
|
cd4ae2e39b | ||
|
|
20fbcb1e9d | ||
|
|
2762216e13 | ||
|
|
6e8c12917b | ||
|
|
0947b55c73 | ||
|
|
8a9ece7b4c | ||
|
|
85872c8373 |
16
.gitignore
vendored
16
.gitignore
vendored
@@ -12,9 +12,7 @@ ascii.bitmaps
|
||||
ascii.h
|
||||
autom4te.cache
|
||||
build_env.mk
|
||||
build-grub-gen-asciih
|
||||
build-grub-gen-widthspec
|
||||
build-grub-mkfont
|
||||
.bzrignore
|
||||
cdboot_test
|
||||
cmp_test
|
||||
config.cache
|
||||
@@ -51,7 +49,6 @@ grub_cmd_set_date
|
||||
grub_cmd_sleep
|
||||
grub-editenv
|
||||
grub-emu
|
||||
grub-emu-lite
|
||||
grub_emu_init.c
|
||||
grub_emu_init.h
|
||||
grub-fstest
|
||||
@@ -62,7 +59,7 @@ grub-install
|
||||
grub-kbdcomp
|
||||
grub-macho2img
|
||||
grub-menulst2cfg
|
||||
/grub-mk*
|
||||
grub-mk*
|
||||
grub-mount
|
||||
grub-ofpathname
|
||||
grub-pe2elf
|
||||
@@ -130,7 +127,6 @@ mod-*.c
|
||||
missing
|
||||
netboot_test
|
||||
*.o
|
||||
*.a
|
||||
ohci_test
|
||||
partmap_test
|
||||
pata_test
|
||||
@@ -165,10 +161,10 @@ depcomp
|
||||
mdate-sh
|
||||
texinfo.tex
|
||||
grub-core/lib/libgcrypt-grub
|
||||
.deps
|
||||
.deps-util
|
||||
.deps-core
|
||||
.dirstamp
|
||||
**/.deps
|
||||
**/.deps-util
|
||||
**/.deps-core
|
||||
**/.dirstamp
|
||||
Makefile.util.am
|
||||
contrib
|
||||
grub-core/bootinfo.txt
|
||||
|
||||
893
ChangeLog
893
ChangeLog
@@ -1,897 +1,6 @@
|
||||
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>
|
||||
|
||||
* tests/grub_func_test.in: Decrease RAM size to 512M. With less
|
||||
fragmentation 512M is enough.
|
||||
|
||||
2013-11-18 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/kern/mm.c (grub_real_malloc): Decrease cut-off of moving the
|
||||
pointer to 32K. This is the size of cache element which is the most
|
||||
common allocation >1K. This way the pointer is always around blocks
|
||||
of 32K and so we keep performance while decreasing fragmentation.
|
||||
|
||||
2013-11-18 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/kern/mm.c (grub_real_malloc): Don't update the pointer to
|
||||
current memory when allocating large chunks. This significantly
|
||||
decreases memory fragmentation.
|
||||
|
||||
2013-11-18 Colin Watson <cjwatson@ubuntu.com>
|
||||
|
||||
* tests/gzcompress_test.in: Skip if gzip is not installed (unlikely,
|
||||
but for symmetry).
|
||||
* tests/lzocompress_test.in: Skip if lzop is not installed.
|
||||
* tests/xzcompress_test.in: Skip if xz is not installed.
|
||||
|
||||
2013-11-18 Colin Watson <cjwatson@ubuntu.com>
|
||||
|
||||
* util/grub-mkrescue.c (main): Fix typo.
|
||||
|
||||
2013-11-18 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/kern/mips/qemu_mips/init.c (grub_machine_init): Update
|
||||
clock frequency to 200 MHz,
|
||||
|
||||
2013-11-18 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* tests/util/grub-shell.in: Increase console size to 1024x1024.
|
||||
|
||||
2013-11-18 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* Makefile.am (default_payload.elf): Add pata to loaded modules.
|
||||
Load config file from (cbfsdisk)/etc/grub.cfg.
|
||||
|
||||
2013-11-18 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* util/grub-install-common.c (grub_install_copy_files): Fix module
|
||||
destination directory.
|
||||
|
||||
2013-11-18 Colin Watson <cjwatson@ubuntu.com>
|
||||
|
||||
* tests/util/grub-shell.in: Don't fail on emu platform if po/*.gmo
|
||||
files have not been built.
|
||||
|
||||
2013-11-18 Colin Watson <cjwatson@ubuntu.com>
|
||||
|
||||
* grub-core/osdep/unix/hostdisk.c (grub_util_make_temporary_file):
|
||||
Handle errors from mkstemp.
|
||||
(grub_util_make_temporary_dir): Handle errors from mkdtemp.
|
||||
|
||||
2013-11-18 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* tests/util/grub-shell.in: Use -cdrom and don't force cdrom
|
||||
on primary master on pseries.
|
||||
|
||||
2013-11-18 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/tests/videotest_checksum.c: Don't reload unifont if it's
|
||||
already loaded. This saves memory needed for tests,
|
||||
|
||||
2013-11-18 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* util/grub-mkrescue.c (main): Fix a typo to make yeeloong part
|
||||
work again.
|
||||
|
||||
2013-11-18 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/term/terminfo.c (grub_cmd_terminfo): Fix a typo to make -g
|
||||
work again.
|
||||
|
||||
2013-11-18 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* tests/util/grub-shell.in: For powerpc tests put the CD-ROM as primary
|
||||
master since with some combinations of qemu and firmware only primary
|
||||
IDE channel is available.
|
||||
|
||||
2013-11-18 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/tests/gfxterm_menu.c: Skip high-resolution tests on
|
||||
low-memory platforms where we don't have enough memory for them.
|
||||
* grub-core/tests/videotest_checksum.c: Likewise.
|
||||
|
||||
2013-11-18 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/tests/cmdline_cat_test.c: Don't reload unifont if it's
|
||||
already loaded. This saves memory needed for tests,
|
||||
|
||||
2013-11-18 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
Fix handling of install lists.
|
||||
|
||||
2013-11-18 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/lib/sparc64/setjmp.S: Force spilling of current window.
|
||||
|
||||
2013-11-18 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
On i386-ieee1275 we run in paged mode. So we need to explicitly map
|
||||
the devices before accessing them.
|
||||
|
||||
2013-11-18 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/lib/relocator.c (grub_mm_check_real): Accept const char *
|
||||
as file argument.
|
||||
|
||||
2013-11-18 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/normal/cmdline.c (grub_cmdline_get): Plug memory leak.
|
||||
|
||||
2013-11-18 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/kern/file.c (grub_file_open): Free file->name on failure.
|
||||
(grub_file_close): Free file->name.
|
||||
|
||||
2013-11-18 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/commands/verify.c (free_pk): Plug memory leak.
|
||||
(grub_load_public_key): Likewise.
|
||||
(grub_verify_signature_real): Likewise.
|
||||
(grub_cmd_verify_signature): Likewise.
|
||||
|
||||
2013-11-18 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/commands/legacycfg.c (grub_legacy_check_md5_password): Plug
|
||||
memory leak.
|
||||
|
||||
2013-11-18 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/lib/powerpc/setjmp.S (grub_setjmp): Save r31.
|
||||
(grub_longjmp): Restore r31.
|
||||
* include/grub/powerpc/setjmp.h (grub_jmp_buf): Reserve space for r31.
|
||||
|
||||
2013-11-18 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* util/grub-mkrescue.c (make_image_fwdisk_abs): Insert all partmap
|
||||
modules to be in line with make_image_abs.
|
||||
|
||||
2013-11-18 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* include/grub/mips/setjmp.h (grub_jmp_buf): Fix buffer size.
|
||||
|
||||
setjmp.S uses 12 entries but buffer is declared with only 11 entries.
|
||||
|
||||
2013-11-17 Ian Campbell <ijc@hellion.org.uk>
|
||||
|
||||
* grub-core/disk/uboot/ubootdisk.c: Include SCSI disks.
|
||||
|
||||
2013-11-17 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* tests/grub_func_test.in: Increase memory reservation as on EFI we need
|
||||
to leave some memory to firmware.
|
||||
|
||||
2013-11-17 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/tests/cmdline_cat_test.c (cmdline_cat_test): Ignore errors
|
||||
of loading gfxterm as gfxterm is embed in kernel on some platforms.
|
||||
* grub-core/tests/gfxterm_menu.c (gfxterm_menu): Likewise.
|
||||
Load gfxmenu.
|
||||
|
||||
2013-11-17 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* tests/core_compress_test.in: Use full arguments as grub-mkimage-extra
|
||||
now needs full arguments.
|
||||
|
||||
2013-11-17 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* util/grub-mkrescue.c (main): Add trailing \n in
|
||||
.disk_label.contentDetails to be in line with previous shell script.
|
||||
|
||||
2013-11-17 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* util/grub-mkrescue.c (main): Use right source file for bootinfo.txt.
|
||||
|
||||
2013-11-17 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* util/grub-install-common.c (grub_install_parse): Recognize
|
||||
--compress=none like shell script did.
|
||||
|
||||
2013-11-17 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* include/grub/misc.h: Replace check for __sparc64__ with one for
|
||||
__sparc__ as __sparc64__ isn't actually defined.
|
||||
|
||||
2013-11-17 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* tests/util/grub-shell.in: Use escc-ch-b on powerpc. This is missing
|
||||
counterpart of fixing the naming of escc ports.
|
||||
|
||||
2013-11-17 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* util/grub-install-common.c (platforms): Fix the order of entries and
|
||||
remove useless field val.
|
||||
|
||||
2013-11-16 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* util/grub-install.c: Add new option --no-bootsector to skip
|
||||
installing of bootsector. Accept --grub-setup=/bin/true as
|
||||
backwards-compatible synonym.
|
||||
|
||||
2013-11-16 Andrey Borzenkov <arvidjaar@gmail.com>
|
||||
|
||||
* util/grub-install.c (device_map_check_duplicates): Fix incorrect
|
||||
order of qsort arguments (number of elements vs. element size).
|
||||
|
||||
2013-11-16 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
Rewrite grub-install, grub-mkrescue, grub-mkstandalone and grub-mknetdir
|
||||
the function of these files exceeds what can be sanely handled in shell
|
||||
in posix-comaptible way. Also writing it in C extends the functionality
|
||||
to non-UNIX-like OS and minimal environments.
|
||||
|
||||
2013-11-16 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/kern/arm/cache.S: Don't switch back to ARM mode when
|
||||
compiling to thumb2.
|
||||
* grub-core/kern/arm/cache_armv7.S: Likewise.
|
||||
* grub-core/lib/arm/setjmp.S: Likewise.
|
||||
|
||||
2013-11-16 Leif Lindholm <leif.lindholm@linaro.org>
|
||||
|
||||
* grub-core/kern/arm/uboot/startup.S: delete superflouous save of r8
|
||||
in grub_uboot_syscall
|
||||
|
||||
2013-11-16 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
Decrease stack usage in lexer.
|
||||
|
||||
We have only 92K of stack and using over 4K per frame is wasteful
|
||||
|
||||
* grub-core/script/yylex.l (yyalloc), (yyfree), (yyrealloc): Declare
|
||||
as macros so that compiler would remove useless structure on stack.
|
||||
Better solution would be to fix flex not to put this structure on
|
||||
the stack but flex is external program.
|
||||
|
||||
2013-11-16 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
Decrease stack usage in signature verification.
|
||||
|
||||
We have only 92K of stack and using over 4K per frame is wasteful
|
||||
|
||||
* grub-core/commands/verify.c (grub_load_public_key): Allocate on heap
|
||||
rather than stack.
|
||||
(grub_verify_signature_real): Likewise.
|
||||
|
||||
2013-11-16 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
Decrease stack usage in mdraid 0.9x.
|
||||
|
||||
We have only 92K of stack and using over 4K per frame is wasteful
|
||||
|
||||
* grub-core/disk/mdraid_linux.c (grub_mdraid_detect): Allocate on heap
|
||||
rather than stack.
|
||||
|
||||
2013-11-16 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
Decrease stack usage in BtrFS.
|
||||
|
||||
We have only 92K of stack and using over 4K per frame is wasteful
|
||||
|
||||
* grub-core/fs/btrfs.c (grub_btrfs_lzo_decompress): Allocate on heap
|
||||
rather than stack.
|
||||
|
||||
2013-11-16 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
Decrease stack usage in JFS.
|
||||
|
||||
We have only 92K of stack and using over 4K per frame is wasteful
|
||||
|
||||
* grub-core/fs/jfs.c (getblk): Allocate on heap rather than on
|
||||
stack. Note: this function is recursive.
|
||||
(grub_jfs_read_inode): Read only part we care about.
|
||||
|
||||
2013-11-16 Leif Lindholm <leif.lindholm@linaro.org>
|
||||
|
||||
* grub-core/kern/arm/uboot/startup.S: fix grub_uboot_syscall va_arg
|
||||
handling
|
||||
|
||||
2013-11-16 Andrey Borzenkov <arvidjaar@gmail.com>
|
||||
|
||||
* configure.ac: Restore -nostdlib for libgcc symbols tests.
|
||||
|
||||
2013-11-16 Andrey Borzenkov <arvidjaar@gmail.com>
|
||||
|
||||
* docs/grub.texi (Environment): Document cmdpath.
|
||||
|
||||
2013-11-16 Andrey Borzenkov <arvidjaar@gmail.com>
|
||||
|
||||
* grub-core/kern/mips/arc/init.c (grub_machine_get_bootlocation):
|
||||
Remove "unused" attribute from arguments, they are used.
|
||||
|
||||
2013-11-15 Colin Watson <cjwatson@debian.org>
|
||||
|
||||
* .gitignore: Only ignore grub-mk* at the top level.
|
||||
|
||||
2013-11-15 Colin Watson <cjwatson@ubuntu.com>
|
||||
|
||||
* util/grub-reboot.in (usage): Fix a typo.
|
||||
|
||||
2013-11-15 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
Replace libgcc version of ctz with our own.
|
||||
|
||||
On upcoming arm64 port libgcc ctz* are not usable in standalone
|
||||
environment. Since we need ctz* for this case and implementation is
|
||||
in C we may as well use it on all concerned platforms.
|
||||
|
||||
2013-11-14 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* configure.ac: Probe for linking format rather than guessing it based
|
||||
on target_os.
|
||||
|
||||
2013-11-14 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/disk/xen/xendisk.c (grub_xendisk_fini): Set state to
|
||||
"1" prior to handoff.
|
||||
|
||||
Reported by: M A Young.
|
||||
|
||||
2013-11-14 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/kern/xen/init.c (grub_xenstore_write_file): Don't add
|
||||
\0 to all files.
|
||||
|
||||
Reported by: M A Young.
|
||||
|
||||
2013-11-14 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/osdep/bsd/hostdisk.c (grub_util_get_fd_size_os): Fix
|
||||
compilation on NetBSD.
|
||||
|
||||
2013-11-14 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* acinclude.m4: Don't add -P on initial nm test.
|
||||
|
||||
Note: even though this patch postdates Andrey's it bears 14 Nov as
|
||||
date due to timezone difference.
|
||||
|
||||
2013-11-15 Andrey Borzenkov <arvidjaar@gmail.com>
|
||||
|
||||
* grub-core/Makefile.core.def (signature_test): Add missing
|
||||
tests/signatures.h.
|
||||
|
||||
2013-11-14 Colin Watson <cjwatson@ubuntu.com>
|
||||
|
||||
* util/grub-install_header: Set localedir here, since this file is
|
||||
where it's used.
|
||||
* util/grub-install.in: Remove setting of localedir.
|
||||
* util/grub-mkrescue.in: Likewise.
|
||||
|
||||
2013-11-14 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* Makefile.am (default_payload.elf): Add uhci, ohci and usb_keyboard.
|
||||
|
||||
2013-11-14 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* configure.ac: Move nm checks to the end.
|
||||
Call grub_PROG_NM_WORKS.
|
||||
* acinclude.m4: New check grub_PROG_NM_WORKS.
|
||||
Use $TARGET_CFLAGS -c when compiling test binary.
|
||||
|
||||
2013-11-14 Colin Watson <cjwatson@ubuntu.com>
|
||||
|
||||
* util/getroot.c (grub_util_biosdisk_get_grub_dev) [__GNU__]: Remove
|
||||
unused variables.
|
||||
|
||||
2013-11-14 Matthew Garrett <mjg@redhat.com>
|
||||
|
||||
* grub-core/kern/main.c (grub_set_prefix_and_root): Set variable
|
||||
cmdpath to firmware directory.
|
||||
|
||||
2013-11-14 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/kern/efi/efi.c (grub_efi_get_filename): Reset the pointer
|
||||
at the start of second iteration.
|
||||
|
||||
2013-11-14 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/Makefile.am (efiemu64.o): Explicitly set link format.
|
||||
|
||||
2013-11-14 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* Makefile.am (default_payload.elf): New target for easier coreboot
|
||||
build.
|
||||
|
||||
2013-11-14 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/kern/arm/cache_armv6.S: Remove special handling for
|
||||
clang (not necessarry with -no-integrated-as).
|
||||
* include/grub/symbol.h [__arm__]: Likewise.
|
||||
|
||||
2013-11-14 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* configure.ac: Use -no-integrated-as on arm with clang.
|
||||
* INSTALL: Mention ARM compilation with clang.
|
||||
|
||||
2013-11-14 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* conf/Makefile.common (CCASFLAGS_PLATFORM) [COND_arm]: Add
|
||||
-mthumb-interwork.
|
||||
|
||||
2013-11-14 Colin Watson <cjwatson@ubuntu.com>
|
||||
|
||||
* grub-core/fs/ext2.c (grub_ext2_read_block): Factor out common
|
||||
code for indirect block handling.
|
||||
|
||||
Saves 185 bytes on compressed image.
|
||||
|
||||
2013-11-13 Paulo Flabiano Smorigo <pfsmorigo@br.ibm.com>
|
||||
|
||||
Fix make clean.
|
||||
|
||||
* Makefile.am: Remove build-grub-* in make clean.
|
||||
|
||||
2013-11-13 Paulo Flabiano Smorigo <pfsmorigo@br.ibm.com>
|
||||
|
||||
New files to gitignore.
|
||||
|
||||
* .gitignore: Add build-grub-gen-asciih, build-grub-gen-widthspec,
|
||||
build-grub-mkfont, and grub-emu-lite. Remove .bzrignore.
|
||||
|
||||
2013-11-13 Leif Lindholm <leif.lindholm@linaro.org>
|
||||
|
||||
* grub-core/kern/arm/misc.S: Make thumb2-compatible.
|
||||
|
||||
2013-11-13 Leif Lindholm <leif.lindholm@linaro.org>
|
||||
|
||||
* .gitignore: fix rules for .dep* and add *.a post git migration
|
||||
|
||||
2013-11-13 Colin Watson <cjwatson@ubuntu.com>
|
||||
|
||||
* configure.ac (AM_INIT_AUTOMAKE): Require at least version 1.10.1,
|
||||
to match INSTALL.
|
||||
|
||||
2013-11-13 Colin Watson <cjwatson@ubuntu.com>
|
||||
|
||||
* grub-core/kern/misc.c: Don't redirect divisions in the
|
||||
GRUB_UTIL case.
|
||||
* include/grub/misc.h: Likewise.
|
||||
|
||||
2013-11-13 Colin Watson <cjwatson@ubuntu.com>
|
||||
|
||||
* grub-core/osdep/unix/emuconsole.c (put): Pacify the compiler on
|
||||
systems that require checking the return value of write.
|
||||
|
||||
2013-11-13 Colin Watson <cjwatson@ubuntu.com>
|
||||
|
||||
* util/grub-install.in (efi_quiet): Fix inverted logic: make
|
||||
efibootmgr quiet when --debug is not used, rather than when it is.
|
||||
|
||||
2013-11-13 Colin Watson <cjwatson@ubuntu.com>
|
||||
|
||||
* gentpl.py (define_macro_for_platform_dependencies): Remove
|
||||
first (and thus unused) of two definitions for this function.
|
||||
(platform_dependencies): Likewise.
|
||||
|
||||
2013-11-13 Colin Watson <cjwatson@ubuntu.com>
|
||||
|
||||
* acinclude.m4 (grub_apple_cc): Remove; since the removal of nested
|
||||
functions, we only need to check this for the target, not the host.
|
||||
* configure.ac (grub_apple_cc): Likewise.
|
||||
|
||||
2013-11-13 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/kern/arm/cache.c (probe_caches): Move asm part to ...
|
||||
* grub-core/kern/arm/cache_armv6.S: ... here. This allows this
|
||||
asm to stay in arm even if surrounding is thumb.
|
||||
|
||||
2013-11-13 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/kern/arm/misc.S: Add __muldi3 and __aeabi_lmul. Those
|
||||
helper functions are needed for thumb.
|
||||
|
||||
2013-11-13 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/disk/diskfilter.c (grub_diskfilter_make_raid): Make
|
||||
level / 3 division explicitly unsigned. Saves few bytes.
|
||||
|
||||
2013-11-13 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/fs/zfs/zfs.c (ZAP_LEAF_NUMCHUNKS): Use unsigned arithmetics.
|
||||
|
||||
2013-11-13 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/normal/datetime.c (grub_get_weekday): Use if rather than
|
||||
division.
|
||||
|
||||
2013-11-13 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/kern/uboot/init.c: Move grub_uboot_machine_type and
|
||||
grub_uboot_boot_data to asm part.
|
||||
|
||||
2013-11-13 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/kern/arm/uboot/startup.S: Remove = by replacing with
|
||||
literal load.
|
||||
(grub_uboot_syscall): Save/restore r9 and align stack.
|
||||
|
||||
2013-11-13 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/kern/arm/cache.S: Replace = with explicit litteral load.
|
||||
|
||||
2013-11-13 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* include/grub/symbol.h (END) [__arm__]: New macros. Replace all .end
|
||||
occurencies with END.
|
||||
|
||||
2013-11-13 Colin Watson <cjwatson@ubuntu.com>
|
||||
|
||||
* util/grub-editenv.c (help_filter, argp): Document how to delete
|
||||
the whole environment block.
|
||||
Reported by Dan Jacobson. Fixes Debian bug #726265.
|
||||
|
||||
2013-11-13 Colin Watson <cjwatson@ubuntu.com>
|
||||
|
||||
* docs/grub.texi (Internationalisation, Supported kernels): Fix
|
||||
sectioning.
|
||||
|
||||
2013-11-13 Josh Triplett <josh@joshtriplett.org>
|
||||
|
||||
* grub-core/normal/term.c (grub_set_more): Use bool logic rather than
|
||||
increment/decrement.
|
||||
|
||||
2013-11-13 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/kern/arm/cache_armv6.S [__clang__]: Don't add .armv6 when
|
||||
compiling with clang.
|
||||
|
||||
2013-11-13 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/kern/arm/uboot/startup.S: Use .org rather than assigning
|
||||
".".
|
||||
|
||||
2013-11-13 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
Redirect all divisions to grub_divmod64.
|
||||
|
||||
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/term/tparm.c (tparam_internal): Use unsigned divisions.
|
||||
|
||||
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
Add missing includes of loader.h.
|
||||
|
||||
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* configure.ac: Allow disabling themes.
|
||||
|
||||
2013-11-12 Lukas Schwaighofer <lukas@schwaighofer.name>
|
||||
|
||||
* util/grub.d/20_linux_xen.in: Don't decompress initrd.
|
||||
|
||||
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/term/at_keyboard.c: Don't poll non-functional AT controller
|
||||
until it becomes operational.
|
||||
|
||||
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/Makefile.core.def (legacy_password_test): Disable
|
||||
on platforms where no legacycfg is compiled.
|
||||
* grub-core/tests/lib/functional_test.c: Tolerate failure to
|
||||
load legacy_password_test.
|
||||
|
||||
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/loader/i386/bsd.c: Remove variable length arrays.
|
||||
|
||||
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/efiemu/prepare.c: Remove variable length arrays.
|
||||
|
||||
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/osdep/windows/hostdisk.c (grub_util_fd_strerror): Silence
|
||||
strict-aliasing warning.
|
||||
(fsync): Silence cast warning.
|
||||
|
||||
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/commands/verify.c: Remove variable length arrays.
|
||||
Load gcry_dsa/gcry_rsa automatically.
|
||||
|
||||
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/tests/signature_test.c: New test.
|
||||
|
||||
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/disk/cryptodisk.c (luks_script_get): Adapt to new procfs
|
||||
API.
|
||||
|
||||
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/tests/legacy_password_test.c (vectors): Make static.
|
||||
* grub-core/tests/pbkdf2_test.c (vectors): Likewise.
|
||||
|
||||
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/tests/setjmp_test.c: Reset counter to 0 before starting.
|
||||
|
||||
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/fs/proc.c: Allow \0 in proc files.
|
||||
|
||||
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/tests/xnu_uuid_test.c: Fix assert message.
|
||||
|
||||
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/tests/xnu_uuid_test.c: Fix copyright year.
|
||||
|
||||
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/fs/ext2.c: Remove variable length arrays.
|
||||
|
||||
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/lib/crypto.c (grub_crypto_cbc_decrypt): Remove variable
|
||||
length arrays.
|
||||
|
||||
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/disk/AFSplitter.c: Remove variable length arrays.
|
||||
* grub-core/disk/cryptodisk.c: Likewise.
|
||||
* grub-core/disk/geli.c: Likewise.
|
||||
* grub-core/disk/luks.c: Likewise.
|
||||
|
||||
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/tests/legacy_password_test.c: New test.
|
||||
* grub-core/commands/legacycfg.c: Remove variable length arrays.
|
||||
|
||||
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/lib/pbkdf2.c: Remove variable length arrays.
|
||||
|
||||
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/tests/pbkdf2_test.c: New test.
|
||||
|
||||
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/lib/xzembed/xz_dec_stream.c: Remove variable length arrays.
|
||||
|
||||
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/io/lzopio.c: Remove variable length arrays.
|
||||
|
||||
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* include/grub/crypto.h: Add maximums on hash size and cipher block
|
||||
size.
|
||||
|
||||
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/commands/xnu_uuid.c: Remove variable length arrays.
|
||||
|
||||
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/tests/xnu_uuid_test.c: New test.
|
||||
|
||||
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/commands/hashsum.c: Remove unneeded memset (zalloc already
|
||||
covers it).
|
||||
|
||||
2013-11-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/commands/hashsum.c: Remove variable length arrays.
|
||||
|
||||
2013-11-11 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/tests/gfxterm_menu.c (gfxterm_menu): Handle out-of-memory
|
||||
condition.
|
||||
* tests/grub_func_test.in: Increase memory allocation.
|
||||
|
||||
2013-11-11 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/osdep/unix/getroot.c [HAVE_STRUCT_STATFS_F_FSTYPENAME
|
||||
&& HAVE_STRUCT_STATFS_F_MNTFROMNAME]: Include sys/param.h and
|
||||
sys/mount.h.
|
||||
|
||||
2013-11-11 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/osdep/apple/hostdisk.c (grub_util_get_fd_size): Rename to ..
|
||||
(grub_util_get_fd_size_os): ...this.
|
||||
(grub_hostdisk_flush_initial_buffer): New empty function.
|
||||
|
||||
2013-11-11 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/gensyminfo.sh.in: Handle the case of portable output
|
||||
without --defined-only.
|
||||
|
||||
2013-11-11 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/lib/i386/relocator_common.S [__APPLE__ && __x86_64__]: Use
|
||||
rip-relative addressing in prologue.
|
||||
|
||||
2013-11-11 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* include/grub/misc.h [__APPLE__]: Do not add regparm(0) on x86_64.
|
||||
* grub-core/kern/misc.c (__bzero) [__APPLE__]: New function.
|
||||
|
||||
2013-11-11 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* util/getroot.c (grub_util_biosdisk_get_grub_dev) [__APPLE__]:
|
||||
Add missing semicolon.
|
||||
|
||||
2013-11-11 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* util/grub-macho2img.c: Use plain fopen rather than grub_util_fopen.
|
||||
|
||||
2013-11-11 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* configure.ac: Check for lzma.h for enabling liblzma and allow
|
||||
manual disabling.
|
||||
|
||||
2013-11-11 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
Add missing includes of loader.h.
|
||||
|
||||
2013-11-11 Fam Zheng <famcool@gmail.com>
|
||||
|
||||
* util/grub.d/30_os-prober.in: Add minix entry.
|
||||
|
||||
2013-11-10 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/loader/i386/coreboot/chainloader.c (load_segment): Use
|
||||
right buffer for temporary load.
|
||||
|
||||
2013-11-10 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/loader/i386/coreboot/chainloader.c: Support tianocore.
|
||||
|
||||
2013-11-10 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/loader/i386/coreboot/chainloader.c: Support lzma-compressed
|
||||
payload.
|
||||
|
||||
2013-11-10 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* include/grub/lib/LzmaDec.h: Fix to include LzmaTypes.h and
|
||||
not Types.h.
|
||||
* grub-core/lib/LzmaDec.c: Fix prologue to make it compileable in GRUB
|
||||
environment.
|
||||
(LzmaDec_InitDicAndState): Make static.
|
||||
|
||||
2013-11-10 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* util/grub-mkimagexx.c (generate_elf): Fix module address on coreboot.
|
||||
|
||||
2013-11-10 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/term/ieee1275/escc.c (GRUB_MOD_INIT): Fix order of channels.
|
||||
|
||||
Reported by: Aaro Koskinen <aaro.koskinen@iki.fi>
|
||||
|
||||
2013-11-10 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* docs/grub-dev.texi: Replace bzr references with git ones.
|
||||
|
||||
2013-11-10 Andrey Borzenkov <arvidjaar@gmail.com>
|
||||
|
||||
* docs/grub.texi (Simple configuration): Remove reference to
|
||||
grub-reboot from saved default entry description - grub-default
|
||||
does not use it anymore.
|
||||
|
||||
2013-11-10 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* configure.ac: Make efiemu test cflags match the cflags efiemu is
|
||||
compiled with.
|
||||
|
||||
2013-11-10 Andrey Borzenkov <arvidjaar@gmail.com>
|
||||
|
||||
* docs/grub.texi (Simple configuration): Document GRUB_DISABLE_SUBMENU.
|
||||
|
||||
2013-11-10 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
Fix grub_machine_fini bitrot.
|
||||
|
||||
Reported by: Glenn Washburn.
|
||||
|
||||
2013-11-10 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* configure.ac: Remove leftover -fnested-funcions -Wl,-allow_execute.
|
||||
|
||||
2013-11-10 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/Makefile.am (efiemu): Remove leftover -DAPPLE_CC and
|
||||
-DELF.
|
||||
* grub-core/efiemu/runtime/config.h: Use __i386__ and __x86_64__
|
||||
instead of ELF*.
|
||||
|
||||
2013-11-10 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* configure.ac: Restore CFLAGS to TARGET_CFLAGS before external tests.
|
||||
Add -march=core2 when testing compile of efiemu64.
|
||||
|
||||
Thanks Andrey Borzenkov for spotting this.
|
||||
|
||||
2013-11-09 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
Add new ports: i386-xen and x86_64-xen. This allows running GRUB in
|
||||
XEN PV environment and load kernels.
|
||||
|
||||
2013-11-09 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/loader/i386/multiboot_mbi.c: Handle space in command line.
|
||||
* grub-core/loader/multiboot_mbi2.c: Likewise.
|
||||
|
||||
2013-11-09 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/lib/cmdline.c (grub_loader_cmdline_size): Fix empty cmdline
|
||||
handling.
|
||||
|
||||
2013-11-09 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/commands/i386/cmostest.c: Add new command "cmosset".
|
||||
|
||||
Tested by: Denis 'GNUtoo' Carikli.
|
||||
|
||||
2013-11-08 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/normal/datetime.c (grub_get_weekday): Use unsigned types.
|
||||
|
||||
2013-11-08 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/gfxmenu/gui_circular_progress.c (parse_angle):
|
||||
Use to get rounded angle rather than truncated.
|
||||
|
||||
2013-11-08 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* grub-core/term/serial.c: Add option for enabling/disabling
|
||||
* b/grub-core/term/serial.c: Add option for enabling/disabling
|
||||
RTS/CTS flow control.
|
||||
|
||||
2013-11-08 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
1
INSTALL
1
INSTALL
@@ -15,7 +15,6 @@ configuring the GRUB.
|
||||
Note: older versions may work but support is limited
|
||||
Note: clang 3.2 or later works for i386 and x86_64 targets but results in
|
||||
much bigger binaries.
|
||||
Note: clang 3.2 or later works for arm
|
||||
Note: clang 3.4 or later works for powerpc
|
||||
* GNU Make
|
||||
* GNU Bison 2.3 or later
|
||||
|
||||
42
Makefile.am
42
Makefile.am
@@ -68,19 +68,12 @@ starfield_theme_files = $(srcdir)/themes/starfield/blob_w.png $(srcdir)/themes/s
|
||||
|
||||
build-grub-mkfont: util/grub-mkfont.c grub-core/unidata.c grub-core/kern/emu/misc.c util/misc.c
|
||||
$(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 -DGRUB_BUILD_PROGRAM_NAME=\"build-grub-mkfont\" $^ $(build_freetype_cflags) $(build_freetype_libs)
|
||||
CLEANFILES += build-grub-mkfont
|
||||
|
||||
garbage-gen: util/garbage-gen.c
|
||||
$(BUILD_CC) -o $@ $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $^
|
||||
CLEANFILES += garbage-gen
|
||||
|
||||
build-grub-gen-asciih: util/grub-gen-asciih.c
|
||||
$(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 $^ $(build_freetype_cflags) $(build_freetype_libs) -Wall -Werror
|
||||
CLEANFILES += build-grub-gen-asciih
|
||||
|
||||
build-grub-gen-widthspec: util/grub-gen-widthspec.c
|
||||
$(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 $^ $(build_freetype_cflags) $(build_freetype_libs) -Wall -Werror
|
||||
CLEANFILES += build-grub-gen-widthspec
|
||||
|
||||
if COND_STARFIELD
|
||||
starfield_DATA = dejavu_10.pf2 dejavu_12.pf2 dejavu_bold_14.pf2 dejavu_14.pf2 dejavu_16.pf2 $(starfield_theme_files)
|
||||
@@ -95,7 +88,7 @@ dejavu_bold_14.pf2: $(DJVU_FONT_SOURCE) build-grub-mkfont
|
||||
dejavu_16.pf2: $(DJVU_FONT_SOURCE) build-grub-mkfont
|
||||
./build-grub-mkfont -s 16 -o $@ $(DJVU_FONT_SOURCE)
|
||||
else
|
||||
starfield_DATA =
|
||||
starfield_DATA =
|
||||
endif
|
||||
|
||||
EXTRA_DIST += $(starfield_theme_files)
|
||||
@@ -118,11 +111,11 @@ euro.pf2: $(FONT_SOURCE) build-grub-mkfont
|
||||
CLEANFILES += euro.pf2
|
||||
|
||||
ascii.h: $(FONT_SOURCE) build-grub-gen-asciih
|
||||
./build-grub-gen-asciih $(FONT_SOURCE) $@
|
||||
./build-grub-gen-asciih $(FONT_SOURCE) $@
|
||||
CLEANFILES += ascii.h
|
||||
|
||||
widthspec.h: $(FONT_SOURCE) build-grub-gen-widthspec
|
||||
./build-grub-gen-widthspec $(FONT_SOURCE) $@
|
||||
./build-grub-gen-widthspec $(FONT_SOURCE) $@
|
||||
CLEANFILES += widthspec.h
|
||||
|
||||
# Install config.h into platformdir
|
||||
@@ -396,33 +389,4 @@ BOOTCHECK_TIMEOUT=180
|
||||
|
||||
bootcheck: $(BOOTCHECKS)
|
||||
|
||||
if COND_i386_coreboot
|
||||
default_payload.elf: grub-mkstandalone grub-mkimage
|
||||
pkgdatadir=. ./grub-mkstandalone --grub-mkimage=./grub-mkimage -O i386-coreboot -o $@ --modules='ahci pata ehci uhci ohci usb_keyboard usbms part_msdos xfs ext2 fat at_keyboard part_gpt usbserial_usbdebug cbfs' --install-modules='ls linux search configfile normal cbtime cbls memrw iorw minicmd lsmmap lspci halt reboot hexdump pcidump regexp setpci lsacpi chain test' --fonts= --themes= --locales= -d grub-core/ /boot/grub/grub.cfg=$(srcdir)/coreboot.cfg
|
||||
endif
|
||||
|
||||
windowsdir=$(top_builddir)/$(PACKAGE)-$(VERSION)-for-windows
|
||||
windowsdir: $(PROGRAMS) $(starfield_DATA) $(platform_DATA)
|
||||
test -d $(windowsdir) && rm -rf $(windowsdir) || true
|
||||
test -d $(windowsdir) || mkdir $(windowsdir)
|
||||
$(MAKE) -C po $(AM_MAKEFLAGS) windowsdir
|
||||
$(MAKE) -C grub-core $(AM_MAKEFLAGS) windowsdir
|
||||
test -d $(windowsdir)/themes || mkdir $(windowsdir)/themes
|
||||
test -d $(windowsdir)/themes/starfield || mkdir $(windowsdir)/themes/starfield
|
||||
for x in $(PROGRAMS); do \
|
||||
if [ x$(STRIP) != x ]; then $(STRIP) $$x -o $(windowsdir)/$$x; \
|
||||
else cp -fp $$x $(windowsdir)/$$x; fi; \
|
||||
done
|
||||
for x in $(pkgdata_DATA); do \
|
||||
cp -fp $$x $(windowsdir)/$$x; \
|
||||
done
|
||||
for x in $(starfield_DATA); do \
|
||||
cp -fp $$x $(windowsdir)/themes/starfield/$$(basename $$x); \
|
||||
done
|
||||
|
||||
windowszip=$(top_builddir)/$(PACKAGE)-$(VERSION)-for-windows.zip
|
||||
windowszip: windowsdir
|
||||
test -f $(windowszip) && rm $(windowszip) || true
|
||||
zip -r $(windowszip) $(windowsdir)
|
||||
|
||||
EXTRA_DIST += linguas.sh
|
||||
|
||||
@@ -171,11 +171,6 @@ program = {
|
||||
common = util/resolve.c;
|
||||
common = grub-core/kern/emu/argp_common.c;
|
||||
common = grub-core/osdep/init.c;
|
||||
common = grub-core/osdep/config.c;
|
||||
extra_dist = grub-core/osdep/aros/config.c;
|
||||
extra_dist = grub-core/osdep/windows/config.c;
|
||||
extra_dist = grub-core/osdep/unix/config.c;
|
||||
common = util/config.c;
|
||||
|
||||
common = grub-core/kern/arm/dl_helper.c;
|
||||
|
||||
@@ -255,7 +250,7 @@ program = {
|
||||
name = grub-macho2img;
|
||||
mansection = 1;
|
||||
common = util/grub-macho2img.c;
|
||||
condition = COND_APPLE_LINKER;
|
||||
condition = COND_APPLE_CC;
|
||||
};
|
||||
|
||||
program = {
|
||||
@@ -315,7 +310,6 @@ program = {
|
||||
installdir = sbin;
|
||||
mansection = 8;
|
||||
common = util/grub-probe.c;
|
||||
common = util/probe.c;
|
||||
common = grub-core/osdep/ofpath.c;
|
||||
common = grub-core/kern/emu/argp_common.c;
|
||||
common = grub-core/osdep/init.c;
|
||||
@@ -485,165 +479,38 @@ script = {
|
||||
installdir = grubconf;
|
||||
};
|
||||
|
||||
program = {
|
||||
script = {
|
||||
mansection = 1;
|
||||
name = grub-mkrescue;
|
||||
|
||||
common = util/grub-mkrescue.c;
|
||||
common = util/render-label.c;
|
||||
common = util/glue-efi.c;
|
||||
common = util/mkimage.c;
|
||||
common = util/grub-install-common.c;
|
||||
common = util/setup_bios.c;
|
||||
common = util/setup_sparc.c;
|
||||
common = grub-core/lib/reed_solomon.c;
|
||||
common = grub-core/osdep/random.c;
|
||||
common = grub-core/osdep/ofpath.c;
|
||||
common = grub-core/osdep/platform.c;
|
||||
common = grub-core/osdep/platform_unix.c;
|
||||
common = grub-core/osdep/compress.c;
|
||||
extra_dist = grub-core/osdep/unix/compress.c;
|
||||
extra_dist = grub-core/osdep/basic/compress.c;
|
||||
common = util/editenv.c;
|
||||
common = grub-core/osdep/blocklist.c;
|
||||
common = grub-core/osdep/config.c;
|
||||
common = util/config.c;
|
||||
|
||||
common = grub-core/kern/emu/hostfs.c;
|
||||
common = grub-core/disk/host.c;
|
||||
|
||||
common = grub-core/kern/arm/dl_helper.c;
|
||||
|
||||
common = util/resolve.c;
|
||||
|
||||
common = grub-core/kern/emu/argp_common.c;
|
||||
common = grub-core/osdep/init.c;
|
||||
|
||||
ldadd = '$(LIBLZMA)';
|
||||
ldadd = libgrubmods.a;
|
||||
ldadd = libgrubgcry.a;
|
||||
ldadd = libgrubkern.a;
|
||||
ldadd = grub-core/gnulib/libgnu.a;
|
||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||
|
||||
condition = COND_HAVE_EXEC;
|
||||
common = util/grub-install_header;
|
||||
common = util/grub-mkrescue.in;
|
||||
enable = noemu;
|
||||
};
|
||||
|
||||
program = {
|
||||
script = {
|
||||
mansection = 1;
|
||||
name = grub-mkstandalone;
|
||||
common = util/grub-mkstandalone.c;
|
||||
|
||||
common = util/render-label.c;
|
||||
common = util/glue-efi.c;
|
||||
common = util/mkimage.c;
|
||||
common = util/grub-install-common.c;
|
||||
common = util/setup_bios.c;
|
||||
common = util/setup_sparc.c;
|
||||
common = grub-core/lib/reed_solomon.c;
|
||||
common = grub-core/osdep/random.c;
|
||||
common = grub-core/osdep/ofpath.c;
|
||||
common = grub-core/osdep/platform.c;
|
||||
common = grub-core/osdep/platform_unix.c;
|
||||
extra_dist = grub-core/osdep/linux/platform.c;
|
||||
extra_dist = grub-core/osdep/basic/platform.c;
|
||||
extra_dist = grub-core/osdep/basic/no_platform.c;
|
||||
extra_dist = grub-core/osdep/unix/platform.c;
|
||||
common = grub-core/osdep/compress.c;
|
||||
common = util/editenv.c;
|
||||
common = grub-core/osdep/blocklist.c;
|
||||
common = grub-core/osdep/config.c;
|
||||
common = util/config.c;
|
||||
|
||||
common = grub-core/kern/emu/hostfs.c;
|
||||
common = grub-core/disk/host.c;
|
||||
|
||||
common = grub-core/kern/arm/dl_helper.c;
|
||||
|
||||
common = util/resolve.c;
|
||||
|
||||
common = grub-core/kern/emu/argp_common.c;
|
||||
common = grub-core/osdep/init.c;
|
||||
|
||||
ldadd = '$(LIBLZMA)';
|
||||
ldadd = libgrubmods.a;
|
||||
ldadd = libgrubgcry.a;
|
||||
ldadd = libgrubkern.a;
|
||||
ldadd = grub-core/gnulib/libgnu.a;
|
||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||
common = util/grub-install_header;
|
||||
common = util/grub-mkstandalone.in;
|
||||
};
|
||||
|
||||
program = {
|
||||
script = {
|
||||
mansection = 8;
|
||||
installdir = sbin;
|
||||
name = grub-install;
|
||||
|
||||
common = util/grub-install.c;
|
||||
common = util/probe.c;
|
||||
common = util/mkimage.c;
|
||||
common = util/grub-install-common.c;
|
||||
common = util/setup_bios.c;
|
||||
common = util/setup_sparc.c;
|
||||
common = grub-core/lib/reed_solomon.c;
|
||||
common = grub-core/osdep/random.c;
|
||||
common = grub-core/osdep/ofpath.c;
|
||||
common = grub-core/osdep/platform.c;
|
||||
common = grub-core/osdep/platform_unix.c;
|
||||
common = grub-core/osdep/compress.c;
|
||||
common = util/editenv.c;
|
||||
common = grub-core/osdep/blocklist.c;
|
||||
common = grub-core/osdep/config.c;
|
||||
common = util/config.c;
|
||||
|
||||
common = grub-core/kern/arm/dl_helper.c;
|
||||
|
||||
common = util/resolve.c;
|
||||
common = util/grub-install_header;
|
||||
common = util/grub-install.in;
|
||||
enable = noemu;
|
||||
common = grub-core/kern/emu/argp_common.c;
|
||||
common = grub-core/osdep/init.c;
|
||||
|
||||
ldadd = '$(LIBLZMA)';
|
||||
ldadd = libgrubmods.a;
|
||||
ldadd = libgrubgcry.a;
|
||||
ldadd = libgrubkern.a;
|
||||
ldadd = grub-core/gnulib/libgnu.a;
|
||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||
};
|
||||
|
||||
program = {
|
||||
script = {
|
||||
mansection = 1;
|
||||
installdir = bin;
|
||||
name = grub-mknetdir;
|
||||
|
||||
common = util/grub-mknetdir.c;
|
||||
|
||||
common = util/mkimage.c;
|
||||
common = util/grub-install-common.c;
|
||||
common = util/setup_bios.c;
|
||||
common = util/setup_sparc.c;
|
||||
common = grub-core/lib/reed_solomon.c;
|
||||
common = grub-core/osdep/random.c;
|
||||
common = grub-core/osdep/ofpath.c;
|
||||
common = grub-core/osdep/platform.c;
|
||||
common = grub-core/osdep/platform_unix.c;
|
||||
common = grub-core/osdep/compress.c;
|
||||
common = util/editenv.c;
|
||||
common = grub-core/osdep/blocklist.c;
|
||||
common = grub-core/osdep/config.c;
|
||||
common = util/config.c;
|
||||
|
||||
common = grub-core/kern/arm/dl_helper.c;
|
||||
|
||||
common = util/resolve.c;
|
||||
common = grub-core/kern/emu/argp_common.c;
|
||||
common = grub-core/osdep/init.c;
|
||||
|
||||
ldadd = '$(LIBLZMA)';
|
||||
ldadd = libgrubmods.a;
|
||||
ldadd = libgrubgcry.a;
|
||||
ldadd = libgrubkern.a;
|
||||
ldadd = grub-core/gnulib/libgnu.a;
|
||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||
common = util/grub-install_header;
|
||||
common = util/grub-mknetdir.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
@@ -691,127 +558,6 @@ script = {
|
||||
installdir = noinst;
|
||||
};
|
||||
|
||||
script = {
|
||||
name = grub-fs-tester;
|
||||
common = tests/util/grub-fs-tester.in;
|
||||
installdir = noinst;
|
||||
dependencies = garbage-gen;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = ext234_test;
|
||||
common = tests/ext234_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = squashfs_test;
|
||||
common = tests/squashfs_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = iso9660_test;
|
||||
common = tests/iso9660_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = hfsplus_test;
|
||||
common = tests/hfsplus_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = ntfs_test;
|
||||
common = tests/ntfs_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = reiserfs_test;
|
||||
common = tests/reiserfs_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = fat_test;
|
||||
common = tests/fat_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = minixfs_test;
|
||||
common = tests/minixfs_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = xfs_test;
|
||||
common = tests/xfs_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = nilfs2_test;
|
||||
common = tests/nilfs2_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = romfs_test;
|
||||
common = tests/romfs_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = exfat_test;
|
||||
common = tests/exfat_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = tar_test;
|
||||
common = tests/tar_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = udf_test;
|
||||
common = tests/udf_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = hfs_test;
|
||||
common = tests/hfs_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = jfs_test;
|
||||
common = tests/jfs_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = btrfs_test;
|
||||
common = tests/btrfs_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = zfs_test;
|
||||
common = tests/zfs_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = cpio_test;
|
||||
common = tests/cpio_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = example_scripted_test;
|
||||
|
||||
60
acinclude.m4
60
acinclude.m4
@@ -134,29 +134,6 @@ if test "x$grub_cv_prog_ld_build_id_none" = xyes; then
|
||||
fi
|
||||
])
|
||||
|
||||
dnl Check nm
|
||||
AC_DEFUN([grub_PROG_NM_WORKS],
|
||||
[AC_MSG_CHECKING([whether nm works])
|
||||
AC_CACHE_VAL(grub_cv_prog_nm_works,
|
||||
[
|
||||
nm_works_tmp_dir="$(mktemp -d "./confXXXXXX")"
|
||||
AC_LANG_CONFTEST([AC_LANG_PROGRAM([[]], [[]])])
|
||||
$TARGET_CC $TARGET_CFLAGS -c conftest.c -o "$nm_works_tmp_dir/ef"
|
||||
if $TARGET_NM "$nm_works_tmp_dir/ef" > /dev/null; then
|
||||
grub_cv_prog_nm_works=yes
|
||||
else
|
||||
grub_cv_prog_nm_minus_p=no
|
||||
fi
|
||||
rm "$nm_works_tmp_dir/ef"
|
||||
rmdir "$nm_works_tmp_dir"
|
||||
])
|
||||
AC_MSG_RESULT([$grub_cv_prog_nm_works])
|
||||
|
||||
if test "x$grub_cv_prog_nm_works" != xyes; then
|
||||
AC_MSG_ERROR([nm does not work])
|
||||
fi
|
||||
])
|
||||
|
||||
dnl Supply -P to nm
|
||||
AC_DEFUN([grub_PROG_NM_MINUS_P],
|
||||
[AC_MSG_CHECKING([whether nm accepts -P])
|
||||
@@ -164,14 +141,13 @@ AC_CACHE_VAL(grub_cv_prog_nm_minus_p,
|
||||
[
|
||||
nm_minus_p_tmp_dir="$(mktemp -d "./confXXXXXX")"
|
||||
AC_LANG_CONFTEST([AC_LANG_PROGRAM([[]], [[]])])
|
||||
$TARGET_CC $TARGET_CFLAGS -c conftest.c -o "$nm_minus_p_tmp_dir/ef"
|
||||
$TARGET_CC conftest.c -o "$nm_minus_p_tmp_dir/ef"
|
||||
if $TARGET_NM -P "$nm_minus_p_tmp_dir/ef" 2>&1 > /dev/null; then
|
||||
grub_cv_prog_nm_minus_p=yes
|
||||
else
|
||||
grub_cv_prog_nm_minus_p=no
|
||||
fi
|
||||
rm "$nm_minus_p_tmp_dir/ef"
|
||||
rmdir "$nm_minus_p_tmp_dir"
|
||||
])
|
||||
AC_MSG_RESULT([$grub_cv_prog_nm_minus_p])
|
||||
|
||||
@@ -189,14 +165,13 @@ AC_CACHE_VAL(grub_cv_prog_nm_defined_only,
|
||||
[
|
||||
nm_defined_only_tmp_dir="$(mktemp -d "./confXXXXXX")"
|
||||
AC_LANG_CONFTEST([AC_LANG_PROGRAM([[]], [[]])])
|
||||
$TARGET_CC $TARGET_CFLAGS -c conftest.c -o "$nm_defined_only_tmp_dir/ef"
|
||||
$TARGET_CC conftest.c -o "$nm_defined_only_tmp_dir/ef"
|
||||
if $TARGET_NM --defined-only "$nm_defined_only_tmp_dir/ef" 2>&1 > /dev/null; then
|
||||
grub_cv_prog_nm_defined_only=yes
|
||||
else
|
||||
grub_cv_prog_nm_defined_only=no
|
||||
fi
|
||||
rm "$nm_defined_only_tmp_dir/ef"
|
||||
rmdir "$nm_defined_only_tmp_dir"
|
||||
])
|
||||
AC_MSG_RESULT([$grub_cv_prog_nm_defined_only])
|
||||
|
||||
@@ -247,6 +222,37 @@ rm -f conftest*])
|
||||
|
||||
AC_MSG_RESULT([$grub_cv_i386_asm_addr32])])
|
||||
|
||||
dnl check if our compiler is apple cc
|
||||
dnl because it requires numerous workarounds
|
||||
AC_DEFUN([grub_apple_cc],
|
||||
[AC_REQUIRE([AC_PROG_CC])
|
||||
AC_MSG_CHECKING([whether our compiler is apple cc])
|
||||
AC_CACHE_VAL(grub_cv_apple_cc,
|
||||
[if $CC -v 2>&1 | grep "Apple Inc." > /dev/null; then
|
||||
grub_cv_apple_cc=yes
|
||||
else
|
||||
grub_cv_apple_cc=no
|
||||
fi
|
||||
])
|
||||
|
||||
AC_MSG_RESULT([$grub_cv_apple_cc])])
|
||||
|
||||
dnl check if our target compiler is apple cc
|
||||
dnl because it requires numerous workarounds
|
||||
AC_DEFUN([grub_apple_target_cc],
|
||||
[AC_REQUIRE([AC_PROG_CC])
|
||||
AC_MSG_CHECKING([whether our target compiler is apple cc])
|
||||
AC_CACHE_VAL(grub_cv_apple_target_cc,
|
||||
[if $CC -v 2>&1 | grep "Apple Inc." > /dev/null; then
|
||||
grub_cv_apple_target_cc=yes
|
||||
else
|
||||
grub_cv_apple_target_cc=no
|
||||
fi
|
||||
])
|
||||
|
||||
AC_MSG_RESULT([$grub_cv_apple_target_cc])])
|
||||
|
||||
|
||||
dnl Later versions of GAS requires that addr32 and data32 prefixes
|
||||
dnl appear in the same lines as the instructions they modify, while
|
||||
dnl earlier versions requires that they appear in separate lines.
|
||||
|
||||
@@ -20,13 +20,9 @@ if COND_sparc64_ieee1275
|
||||
endif
|
||||
if COND_arm
|
||||
CFLAGS_PLATFORM += -mthumb-interwork -mlong-calls
|
||||
CCASFLAGS_PLATFORM = -mthumb-interwork
|
||||
LDFLAGS_PLATFORM = -Wl,--wrap=__clear_cache
|
||||
endif
|
||||
|
||||
#FIXME: discover and check XEN headers
|
||||
CPPFLAGS_XEN = -I/usr/include
|
||||
|
||||
# Other options
|
||||
|
||||
CPPFLAGS_DEFAULT = -DGRUB_FILE=\"$(subst $(srcdir)/,,$<)\"
|
||||
|
||||
@@ -12,9 +12,7 @@ EXTRA_DIST += util/import_gcry.py
|
||||
EXTRA_DIST += util/import_unicode.py
|
||||
|
||||
EXTRA_DIST += docs/man
|
||||
EXTRA_DIST += docs/autoiso.cfg
|
||||
EXTRA_DIST += docs/grub.cfg
|
||||
EXTRA_DIST += docs/osdetect.cfg
|
||||
|
||||
EXTRA_DIST += conf/i386-pc-cygwin-img-ld.sc
|
||||
|
||||
@@ -28,11 +26,6 @@ EXTRA_DIST += grub-core/gensymlist.sh
|
||||
EXTRA_DIST += grub-core/genemuinit.sh
|
||||
EXTRA_DIST += grub-core/genemuinitheader.sh
|
||||
|
||||
EXTRA_DIST += grub-core/gnulib-fix-null-deref.diff
|
||||
EXTRA_DIST += grub-core/gnulib-fix-width.diff
|
||||
EXTRA_DIST += grub-core/gnulib-no-abort.diff
|
||||
EXTRA_DIST += grub-core/gnulib-no-gets.diff
|
||||
|
||||
EXTRA_DIST += grub-core/lib/libgcrypt
|
||||
EXTRA_DIST += grub-core/lib/libgcrypt-grub/mpi/generic
|
||||
EXTRA_DIST += $(shell find $(top_srcdir)/include -name '*.h')
|
||||
|
||||
283
configure.ac
283
configure.ac
@@ -45,7 +45,7 @@ save_program_prefix="${program_prefix}"
|
||||
AC_CANONICAL_TARGET
|
||||
program_prefix="${save_program_prefix}"
|
||||
|
||||
AM_INIT_AUTOMAKE([1.10.1])
|
||||
AM_INIT_AUTOMAKE()
|
||||
AC_PREREQ(2.60)
|
||||
AC_CONFIG_SRCDIR([include/grub/dl.h])
|
||||
AC_CONFIG_HEADER([config-util.h])
|
||||
@@ -75,10 +75,14 @@ if test "x$TARGET_CFLAGS" = x; then
|
||||
TARGET_CFLAGS="$TARGET_CFLAGS -Os"
|
||||
fi
|
||||
|
||||
BUILD_CPPFLAGS="$BUILD_CPPFLAGS -DLOCALEDIR=\\\"\$(localedir)\\\""
|
||||
|
||||
# Default HOST_CPPFLAGS
|
||||
HOST_CPPFLAGS="$HOST_CPPFLAGS -Wall -W"
|
||||
HOST_CPPFLAGS="$HOST_CPPFLAGS -I\$(top_builddir)/include"
|
||||
HOST_CPPFLAGS="$HOST_CPPFLAGS -DGRUB_UTIL=1"
|
||||
HOST_CPPFLAGS="$HOST_CPPFLAGS -DGRUB_LIBDIR=\\\"\$(pkglibdir)\\\""
|
||||
HOST_CPPFLAGS="$HOST_CPPFLAGS -DLOCALEDIR=\\\"\$(localedir)\\\""
|
||||
|
||||
TARGET_CPPFLAGS="$TARGET_CPPFLAGS -Wall -W"
|
||||
TARGET_CPPFLAGS="$TARGET_CPPFLAGS -I\$(top_srcdir)/include"
|
||||
@@ -119,6 +123,7 @@ if test "x$with_platform" = x; then
|
||||
mipsel-*) platform=loongson ;;
|
||||
mips-*) platform=arc ;;
|
||||
ia64-*) platform=efi ;;
|
||||
alpha-*) platform=srm ;;
|
||||
arm-*) platform=uboot ;;
|
||||
*) AC_MSG_ERROR([unsupported CPU: "$target_cpu"]) ;;
|
||||
esac
|
||||
@@ -129,7 +134,6 @@ fi
|
||||
case "$target_cpu"-"$platform" in
|
||||
x86_64-efi) ;;
|
||||
x86_64-emu) ;;
|
||||
x86_64-xen) ;;
|
||||
x86_64-*) target_cpu=i386 ;;
|
||||
powerpc64-ieee1275) target_cpu=powerpc ;;
|
||||
esac
|
||||
@@ -138,8 +142,6 @@ esac
|
||||
case "$target_cpu"-"$platform" in
|
||||
i386-efi) ;;
|
||||
x86_64-efi) ;;
|
||||
i386-xen) ;;
|
||||
x86_64-xen) ;;
|
||||
i386-pc) ;;
|
||||
i386-multiboot) ;;
|
||||
i386-coreboot) ;;
|
||||
@@ -158,6 +160,7 @@ case "$target_cpu"-"$platform" in
|
||||
mipsel-yeeloong) platform=loongson ;;
|
||||
mipsel-fuloong) platform=loongson ;;
|
||||
mipsel-loongson) ;;
|
||||
alpha-srm ) ;;
|
||||
arm-uboot) ;;
|
||||
arm-efi) ;;
|
||||
*-emu) ;;
|
||||
@@ -188,21 +191,15 @@ case "$host_os" in
|
||||
cygwin | windows* | mingw32*) host_kernel=windows ;;
|
||||
esac
|
||||
|
||||
case "$host_os" in
|
||||
cygwin | windows* | mingw32*) have_exec=n ;;
|
||||
aros*) have_exec=n ;;
|
||||
*) have_exec=y;;
|
||||
esac
|
||||
|
||||
case "$platform" in
|
||||
coreboot) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_COREBOOT=1" ;;
|
||||
multiboot) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MULTIBOOT=1" ;;
|
||||
efi) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_EFI=1" ;;
|
||||
xen) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_XEN=1" ;;
|
||||
ieee1275) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_IEEE1275=1" ;;
|
||||
uboot) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_UBOOT=1" ;;
|
||||
qemu) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_QEMU=1" ;;
|
||||
pc) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_PCBIOS=1" ;;
|
||||
srm) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_ALPHA_SRM=1" ;;
|
||||
emu) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_EMU=1" ;;
|
||||
loongson) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MIPS_LOONGSON=1 -DGRUB_MACHINE_MIPS_BONITO=1" ;;
|
||||
qemu_mips) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MIPS_QEMU_MIPS=1 -DGRUB_MACHINE_MIPS_BONITO=1" ;;
|
||||
@@ -351,6 +348,12 @@ case "$host_os" in
|
||||
;;
|
||||
esac
|
||||
|
||||
grub_apple_cc
|
||||
if test x$grub_cv_apple_cc = xyes ; then
|
||||
HOST_CPPFLAGS="$HOST_CPPFLAGS -fnested-functions"
|
||||
HOST_LDFLAGS="$HOST_LDFLAGS -Wl,-allow_stack_execute"
|
||||
fi
|
||||
|
||||
if test x$USE_NLS = xno; then
|
||||
HOST_CFLAGS="$HOST_CFLAGS -fno-builtin-gettext"
|
||||
fi
|
||||
@@ -465,6 +468,11 @@ CPPFLAGS="$TARGET_CPPFLAGS"
|
||||
LDFLAGS="$TARGET_LDFLAGS"
|
||||
LIBS=""
|
||||
|
||||
grub_PROG_NM_MINUS_P
|
||||
grub_PROG_NM_DEFINED_ONLY
|
||||
AC_SUBST(TARGET_NMFLAGS_MINUS_P)
|
||||
AC_SUBST(TARGET_NMFLAGS_DEFINED_ONLY)
|
||||
|
||||
# debug flags.
|
||||
WARN_FLAGS="-Wall -W -Wshadow -Wold-style-definition -Wpointer-arith -Wundef -Wextra -Wattributes -Wchar-subscripts -Wcomment -Wdeprecated-declarations -Wdisabled-optimization -Wdiv-by-zero -Wendif-labels -Wfloat-equal -Wformat-extra-args -Wformat-security -Wformat-y2k -Wimplicit -Wimplicit-function-declaration -Wimplicit-int -Winit-self -Wint-to-pointer-cast -Winvalid-pch -Wmain -Wmissing-braces -Wmissing-field-initializers -Wmissing-format-attribute -Wmultichar -Wnonnull -Woverflow -Wparentheses -Wpointer-arith -Wpointer-to-int-cast -Wreturn-type -Wsequence-point -Wshadow -Wsign-compare -Wstrict-aliasing -Wswitch -Wtrigraphs -Wundef -Wunknown-pragmas -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value -Wunused-variable -Wvariadic-macros -Wvolatile-register-var -Wwrite-strings -Wnested-externs -Wstrict-prototypes -Wpointer-sign"
|
||||
HOST_CFLAGS="$HOST_CFLAGS $WARN_FLAGS -Wcast-align"
|
||||
@@ -484,9 +492,8 @@ AC_CACHE_CHECK([if compiling with clang], [grub_cv_cc_target_clang]
|
||||
]])],
|
||||
[grub_cv_cc_target_clang=no], [grub_cv_cc_target_clang=yes])])
|
||||
|
||||
# on x86 clang doesn't support .code16
|
||||
# on arm clang doesn't support .arch directive
|
||||
if test "x$grub_cv_cc_target_clang" = xyes && ( test "x$target_cpu" = xi386 || test "x$target_cpu" = xx86_64 || test "x$target_cpu" = xarm ); then
|
||||
# clang doesn't support .code16
|
||||
if test "x$grub_cv_cc_target_clang" = xyes && ( test "x$target_cpu" = xi386 || test "x$target_cpu" = xx86_64 ); then
|
||||
TARGET_CCASFLAGS="$TARGET_CCASFLAGS -no-integrated-as"
|
||||
fi
|
||||
|
||||
@@ -599,14 +606,52 @@ if test "x$grub_cv_cc_fno_asynchronous_unwind_tables" = xyes; then
|
||||
TARGET_CFLAGS="$TARGET_CFLAGS -fno-asynchronous-unwind-tables"
|
||||
fi
|
||||
|
||||
grub_apple_target_cc
|
||||
if test x$grub_cv_apple_target_cc = xyes ; then
|
||||
TARGET_APPLE_CC=1
|
||||
AC_CHECK_PROG([TARGET_OBJCONV], [objconv], [objconv], [])
|
||||
if test "x$TARGET_OBJCONV" = x ; then
|
||||
AC_CHECK_PROG([TARGET_OBJCONV], [objconv], [./objconv], [], [.])
|
||||
fi
|
||||
if test "x$TARGET_OBJCONV" = x ; then
|
||||
AC_MSG_ERROR([objconv not found which is required when building with apple compiler])
|
||||
fi
|
||||
TARGET_IMG_LDSCRIPT=
|
||||
TARGET_IMG_CFLAGS="-static"
|
||||
TARGET_IMG_LDFLAGS='-nostdlib -static -Wl,-preload -Wl,-segalign,20'
|
||||
TARGET_IMG_LDFLAGS_AC='-nostdlib -static -Wl,-preload -Wl,-segalign,20'
|
||||
TARGET_IMG_BASE_LDOPT="-Wl,-image_base"
|
||||
TARGET_LDFLAGS_OLDMAGIC=""
|
||||
else
|
||||
TARGET_APPLE_CC=0
|
||||
TARGET_LDFLAGS_OLDMAGIC="-Wl,-N"
|
||||
# Use linker script if present, otherwise use builtin -N script.
|
||||
if test -f "${srcdir}/${grub_coredir}/conf/${target_cpu}-${platform}-${target_os}-img-ld.sc"; then
|
||||
TARGET_IMG_LDSCRIPT='$(top_srcdir)'"/${grub_coredir}/conf/${target_cpu}-${platform}-${target_os}-img-ld.sc"
|
||||
TARGET_IMG_LDFLAGS="-Wl,-T${TARGET_IMG_LDSCRIPT}"
|
||||
TARGET_IMG_LDFLAGS_AC="-Wl,-T${srcdir}/${grub_coredir}/conf/${target_cpu}-${platform}-${target_os}-img-ld.sc"
|
||||
TARGET_IMG_BASE_LDOPT="-Wl,-Ttext"
|
||||
else
|
||||
TARGET_IMG_LDSCRIPT=
|
||||
TARGET_IMG_LDFLAGS='-Wl,-N'
|
||||
TARGET_IMG_LDFLAGS_AC='-Wl,-N'
|
||||
TARGET_IMG_BASE_LDOPT="-Wl,-Ttext"
|
||||
fi
|
||||
TARGET_IMG_CFLAGS=
|
||||
fi
|
||||
|
||||
AC_SUBST(TARGET_LDFLAGS_OLDMAGIC)
|
||||
|
||||
# For platforms where ELF is not the default link format.
|
||||
AC_MSG_CHECKING([for command to convert module to ELF format])
|
||||
case "${target_os}" in
|
||||
cygwin)
|
||||
cygwin) TARGET_OBJ2ELF='./build-grub-pe2elf';
|
||||
# FIXME: put proper test here
|
||||
NEED_REGISTER_FRAME_INFO=1
|
||||
;;
|
||||
*) NEED_REGISTER_FRAME_INFO=0 ;;
|
||||
esac
|
||||
AC_MSG_RESULT([$TARGET_OBJ2ELF])
|
||||
|
||||
|
||||
AC_ARG_ENABLE([efiemu],
|
||||
@@ -626,7 +671,7 @@ if test x"$platform" = xefi ; then
|
||||
fi
|
||||
if test x"$efiemu_excuse" = x ; then
|
||||
AC_CACHE_CHECK([whether options required for efiemu work], grub_cv_cc_efiemu, [
|
||||
CFLAGS="-m64 -nostdlib -O2 -mcmodel=large -mno-red-zone"
|
||||
CFLAGS="$TARGET_CFLAGS -m64 -mcmodel=large -mno-red-zone -nostdlib"
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
|
||||
[grub_cv_cc_efiemu=yes],
|
||||
[grub_cv_cc_efiemu=no])
|
||||
@@ -645,75 +690,42 @@ enable_efiemu=no
|
||||
fi
|
||||
AC_SUBST([enable_efiemu])
|
||||
|
||||
CFLAGS="$TARGET_CFLAGS"
|
||||
|
||||
if test x"$target_cpu" = xi386 || test x"$target_cpu" = xx86_64; then
|
||||
AC_CACHE_CHECK([for linking format], [grub_cv_target_cc_link_format], [
|
||||
grub_cv_target_cc_link_format=unknown
|
||||
for format in -melf_${target_cpu} -melf_${target_cpu}_fbsd -melf_${target_cpu}_obsd -melf_${target_cpu}_haiku -m${target_cpu}pe -arch,${target_cpu}; do
|
||||
if test x${target_cpu} != xi386 && test x$format = x${target_cpu}pe; then
|
||||
continue
|
||||
fi
|
||||
CFLAGS="$TARGET_CFLAGS -static"
|
||||
LDFLAGS="$TARGET_LDFLAGS -Wl,$format -nostdlib"
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
||||
asm (".globl start; start:");
|
||||
asm (".globl _start; _start:");
|
||||
asm (".globl __start; __start:");
|
||||
void __main (void);
|
||||
void __main (void) {}
|
||||
]], [[]])], [flag=1], [])
|
||||
if test x"$flag" = x1; then
|
||||
grub_cv_target_cc_link_format="$format"
|
||||
break;
|
||||
fi
|
||||
done])
|
||||
if test x"$grub_cv_target_cc_link_format" = xunknown; then
|
||||
AC_MSG_ERROR([no suitable link format found])
|
||||
fi
|
||||
TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,$grub_cv_target_cc_link_format"
|
||||
if test x"$grub_cv_target_cc_link_format" = x-mi386pe; then
|
||||
TARGET_OBJ2ELF='./build-grub-pe2elf';
|
||||
fi
|
||||
fi
|
||||
|
||||
if test x$grub_cv_target_cc_link_format = x-arch,i386 || test x$grub_cv_target_cc_link_format = x-arch,x86_64; then
|
||||
TARGET_APPLE_LINKER=1
|
||||
AC_CHECK_PROG([TARGET_OBJCONV], [objconv], [objconv], [])
|
||||
if test "x$TARGET_OBJCONV" = x ; then
|
||||
AC_CHECK_PROG([TARGET_OBJCONV], [objconv], [./objconv], [], [.])
|
||||
fi
|
||||
if test "x$TARGET_OBJCONV" = x ; then
|
||||
AC_MSG_ERROR([objconv not found which is required when building with apple compiler])
|
||||
fi
|
||||
TARGET_IMG_LDSCRIPT=
|
||||
TARGET_IMG_CFLAGS="-static"
|
||||
TARGET_IMG_LDFLAGS='-nostdlib -static -Wl,-preload -Wl,-segalign,20'
|
||||
TARGET_IMG_LDFLAGS_AC='-nostdlib -static -Wl,-preload -Wl,-segalign,20'
|
||||
TARGET_IMG_BASE_LDOPT="-Wl,-image_base"
|
||||
TARGET_LDFLAGS_OLDMAGIC=""
|
||||
elif test x$grub_cv_target_cc_link_format = x-mi386pe && test x$platform = xpc; then
|
||||
TARGET_APPLE_LINKER=0
|
||||
TARGET_LDFLAGS_OLDMAGIC="-Wl,-N"
|
||||
TARGET_IMG_LDSCRIPT='$(top_srcdir)'"/${grub_coredir}/conf/i386-pc-cygwin-img-ld.sc"
|
||||
TARGET_IMG_LDFLAGS="-Wl,-T${TARGET_IMG_LDSCRIPT}"
|
||||
TARGET_IMG_LDFLAGS_AC="-Wl,-T${srcdir}/${grub_coredir}/conf/i386-pc-cygwin-img-ld.sc"
|
||||
TARGET_IMG_BASE_LDOPT="-Wl,-Ttext"
|
||||
TARGET_IMG_CFLAGS=
|
||||
else
|
||||
TARGET_APPLE_LINKER=0
|
||||
TARGET_LDFLAGS_OLDMAGIC="-Wl,-N"
|
||||
TARGET_IMG_LDSCRIPT=
|
||||
TARGET_IMG_LDFLAGS='-Wl,-N'
|
||||
TARGET_IMG_LDFLAGS_AC='-Wl,-N'
|
||||
TARGET_IMG_BASE_LDOPT="-Wl,-Ttext"
|
||||
TARGET_IMG_CFLAGS=
|
||||
fi
|
||||
|
||||
AC_SUBST(TARGET_LDFLAGS_OLDMAGIC)
|
||||
|
||||
|
||||
LDFLAGS="$TARGET_LDFLAGS"
|
||||
case "$target_os" in
|
||||
cygwin)
|
||||
;;
|
||||
freebsd | kfreebsd*-gnu)
|
||||
if test x"$target_cpu" = xi386; then
|
||||
TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,-melf_i386_fbsd"
|
||||
fi
|
||||
if test x"$target_cpu" = xx86_64; then
|
||||
TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,-melf_x86_64_fbsd"
|
||||
fi
|
||||
;;
|
||||
openbsd*)
|
||||
if test x"$target_cpu" = xi386; then
|
||||
TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,-melf_i386_obsd"
|
||||
fi
|
||||
if test x"$target_cpu" = xx86_64; then
|
||||
TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,-melf_x86_64_obsd"
|
||||
fi
|
||||
;;
|
||||
haiku*)
|
||||
if test x"$target_cpu" = xi386; then
|
||||
TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,-melf_i386_haiku"
|
||||
fi
|
||||
if test x"$target_cpu" = xx86_64; then
|
||||
TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,-melf_x86_64_haiku"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
if test x"$target_cpu" = xi386; then
|
||||
TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,-melf_i386"
|
||||
fi
|
||||
if test x"$target_cpu" = xx86_64; then
|
||||
TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,-melf_x86_64"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
if test "$target_cpu" = x86_64; then
|
||||
# Use large model to support 4G memory
|
||||
@@ -749,8 +761,6 @@ fi
|
||||
# Compiler features.
|
||||
#
|
||||
|
||||
CFLAGS="$TARGET_CFLAGS"
|
||||
|
||||
# Position independent executable.
|
||||
grub_CHECK_PIE
|
||||
[# Need that, because some distributions ship compilers that include
|
||||
@@ -759,8 +769,6 @@ if [ x"$pie_possible" = xyes ]; then
|
||||
TARGET_CFLAGS="$TARGET_CFLAGS -fno-PIE"
|
||||
fi]
|
||||
|
||||
CFLAGS="$TARGET_CFLAGS"
|
||||
|
||||
# Position independent executable.
|
||||
grub_CHECK_PIC
|
||||
[# Need that, because some distributions ship compilers that include
|
||||
@@ -769,8 +777,6 @@ if [ x"$pic_possible" = xyes ]; then
|
||||
TARGET_CFLAGS="$TARGET_CFLAGS -fno-PIC"
|
||||
fi]
|
||||
|
||||
CFLAGS="$TARGET_CFLAGS"
|
||||
|
||||
# Smashing stack protector.
|
||||
grub_CHECK_STACK_PROTECTOR
|
||||
# Need that, because some distributions ship compilers that include
|
||||
@@ -778,9 +784,6 @@ grub_CHECK_STACK_PROTECTOR
|
||||
if test "x$ssp_possible" = xyes; then
|
||||
TARGET_CFLAGS="$TARGET_CFLAGS -fno-stack-protector"
|
||||
fi
|
||||
|
||||
CFLAGS="$TARGET_CFLAGS"
|
||||
|
||||
grub_CHECK_STACK_ARG_PROBE
|
||||
# Cygwin's GCC uses alloca() to probe the stackframe on static
|
||||
# stack allocations above some threshold.
|
||||
@@ -788,8 +791,6 @@ if test x"$sap_possible" = xyes; then
|
||||
TARGET_CFLAGS="$TARGET_CFLAGS -mno-stack-arg-probe"
|
||||
fi
|
||||
|
||||
CFLAGS="$TARGET_CFLAGS"
|
||||
|
||||
# -mno-unaligned-access
|
||||
if test "$target_cpu" = arm; then
|
||||
grub_CHECK_NO_UNALIGNED_ACCESS
|
||||
@@ -800,7 +801,7 @@ fi
|
||||
|
||||
# Set them to their new values for the tests below.
|
||||
CC="$TARGET_CC"
|
||||
if test "x$TARGET_APPLE_LINKER" = x1 ; then
|
||||
if test "x$TARGET_APPLE_CC" = x1 ; then
|
||||
CFLAGS="$TARGET_CFLAGS -nostdlib -Wno-error"
|
||||
else
|
||||
CFLAGS="$TARGET_CFLAGS -nostdlib -Wl,--defsym,___main=0x8100 -Wno-error"
|
||||
@@ -815,18 +816,16 @@ fi
|
||||
LIBS="$TARGET_LIBGCC"
|
||||
|
||||
grub_ASM_USCORE
|
||||
if test "x$TARGET_APPLE_LINKER" = x0 ; then
|
||||
if test x$grub_cv_asm_uscore = xyes; then
|
||||
CFLAGS="$TARGET_CFLAGS -nostdlib -Wl,--defsym,_abort=_main"
|
||||
CFLAGS="$TARGET_CFLAGS -Wl,--defsym,_abort=_main"
|
||||
else
|
||||
CFLAGS="$TARGET_CFLAGS -nostdlib -Wl,--defsym,abort=main"
|
||||
fi
|
||||
CFLAGS="$TARGET_CFLAGS -Wl,--defsym,abort=main"
|
||||
fi
|
||||
|
||||
# Check for libgcc symbols
|
||||
AC_CHECK_FUNCS(__bswapsi2 __bswapdi2 __ashldi3 __ashrdi3 __lshrdi3 __ucmpdi2 _restgpr_14_x)
|
||||
AC_CHECK_FUNCS(__bswapsi2 __bswapdi2 __ashldi3 __ashrdi3 __lshrdi3 __ucmpdi2 _restgpr_14_x __udivsi3 __umoddi3 __udivdi3 __divsi3 __modsi3 __umodsi3 __moddi3 __divdi3 __ctzdi2 __ctzsi2)
|
||||
|
||||
if test "x$TARGET_APPLE_LINKER" = x1 ; then
|
||||
if test "x$TARGET_APPLE_CC" = x1 ; then
|
||||
CFLAGS="$TARGET_CFLAGS -nostdlib"
|
||||
else
|
||||
CFLAGS="$TARGET_CFLAGS -nostdlib -Wl,--defsym,___main=0x8100"
|
||||
@@ -835,12 +834,12 @@ LIBS=""
|
||||
|
||||
# Defined in aclocal.m4.
|
||||
grub_PROG_TARGET_CC
|
||||
if test "x$TARGET_APPLE_LINKER" != x1 ; then
|
||||
if test "x$TARGET_APPLE_CC" != x1 ; then
|
||||
grub_PROG_OBJCOPY_ABSOLUTE
|
||||
fi
|
||||
grub_PROG_LD_BUILD_ID_NONE
|
||||
if test "x$target_cpu" = xi386; then
|
||||
if test "$platform" != emu && test "x$TARGET_APPLE_LINKER" != x1 ; then
|
||||
if test "$platform" != emu && test "x$TARGET_APPLE_CC" != x1 ; then
|
||||
if test ! -z "$TARGET_IMG_LDSCRIPT"; then
|
||||
# Check symbols provided by linker script.
|
||||
CFLAGS="$TARGET_CFLAGS -nostdlib ${TARGET_IMG_LDFLAGS_AC} ${TARGET_IMG_BASE_LDOPT},0x8000 -Wl,--defsym,___main=0x8100"
|
||||
@@ -853,12 +852,6 @@ if test "x$target_cpu" = xi386; then
|
||||
grub_I386_ASM_ADDR32
|
||||
fi
|
||||
|
||||
grub_PROG_NM_WORKS
|
||||
grub_PROG_NM_MINUS_P
|
||||
grub_PROG_NM_DEFINED_ONLY
|
||||
AC_SUBST(TARGET_NMFLAGS_MINUS_P)
|
||||
AC_SUBST(TARGET_NMFLAGS_DEFINED_ONLY)
|
||||
|
||||
if test "$platform" != emu; then
|
||||
AC_CACHE_CHECK([whether -nostdinc -isystem works], [grub_cv_cc_isystem], [
|
||||
SAVED_CPPFLAGS="$CPPFLAGS"
|
||||
@@ -1142,14 +1135,7 @@ DJVU_FONT_SOURCE=
|
||||
|
||||
starfield_excuse=
|
||||
|
||||
AC_ARG_ENABLE([grub-themes],
|
||||
[AS_HELP_STRING([--enable-grub-themes],
|
||||
[build and install GRUB themes (default=guessed)])])
|
||||
if test x"$enable_grub_themes" = xno ; then
|
||||
starfield_excuse="explicitly disabled"
|
||||
fi
|
||||
|
||||
if test x"$starfield_excuse" = x && test x"$enable_build_grub_mkfont" = xno ; then
|
||||
if test x"$enable_build_grub_mkfont" = xno ; then
|
||||
starfield_excuse="No build-time grub-mkfont"
|
||||
fi
|
||||
|
||||
@@ -1168,10 +1154,6 @@ if test x"$starfield_excuse" = x; then
|
||||
fi
|
||||
fi
|
||||
|
||||
if test x"$enable_grub_themes" = xyes && test x"$starfield_excuse" != x; then
|
||||
AC_MSG_ERROR([themes were explicitly requested but requirements are not satisfied])
|
||||
fi
|
||||
|
||||
AC_SUBST([DJVU_FONT_SOURCE])
|
||||
|
||||
FONT_SOURCE=
|
||||
@@ -1274,32 +1256,10 @@ fi
|
||||
|
||||
AC_SUBST([LIBGEOM])
|
||||
|
||||
AC_ARG_ENABLE([liblzma],
|
||||
[AS_HELP_STRING([--enable-liblzma],
|
||||
[enable liblzma integration (default=guessed)])])
|
||||
if test x"$enable_liblzma" = xno ; then
|
||||
liblzma_excuse="explicitly disabled"
|
||||
fi
|
||||
|
||||
if test x"$liblzma_excuse" = x ; then
|
||||
AC_CHECK_LIB([lzma], [lzma_code],
|
||||
[],[liblzma_excuse="need lzma library"])
|
||||
fi
|
||||
if test x"$liblzma_excuse" = x ; then
|
||||
AC_CHECK_HEADER([lzma.h], [], [liblzma_excuse="need lzma header"])
|
||||
fi
|
||||
|
||||
if test x"$enable_liblzma" = xyes && test x"$liblzma_excuse" != x ; then
|
||||
AC_MSG_ERROR([liblzma support was explicitly requested but requirements are not satisfied])
|
||||
fi
|
||||
|
||||
|
||||
if test x"$liblzma_excuse" = x ; then
|
||||
LIBLZMA="-llzma"
|
||||
AC_DEFINE([USE_LIBLZMA], [1],
|
||||
[Define to 1 if you have the LZMA library.])
|
||||
fi
|
||||
|
||||
[LIBLZMA="-llzma"
|
||||
AC_DEFINE([HAVE_LIBLZMA], [1],
|
||||
[Define to 1 if you have the LZMA library.])],)
|
||||
AC_SUBST([LIBLZMA])
|
||||
|
||||
AC_ARG_ENABLE([libzfs],
|
||||
@@ -1348,6 +1308,8 @@ LIBS=""
|
||||
AC_SUBST([FONT_SOURCE])
|
||||
AS_IF([test x$target_cpu = xi386 -a x$platform = xqemu],
|
||||
[AC_SUBST([GRUB_BOOT_MACHINE_LINK_ADDR], 0xffe00)])
|
||||
AS_IF([test x$TARGET_APPLE_CC = x1],
|
||||
[AC_SUBST([USE_APPLE_CC_FIXES], yes)])
|
||||
|
||||
AC_SUBST(HAVE_ASM_USCORE)
|
||||
AC_SUBST(ADDR32)
|
||||
@@ -1387,6 +1349,7 @@ AC_SUBST(TARGET_LDFLAGS_STATIC_LIBGCC)
|
||||
AC_SUBST(TARGET_CPP)
|
||||
AC_SUBST(TARGET_CCAS)
|
||||
AC_SUBST(TARGET_OBJ2ELF)
|
||||
AC_SUBST(TARGET_APPLE_CC)
|
||||
AC_SUBST(TARGET_MODULE_FORMAT)
|
||||
|
||||
AC_SUBST(TARGET_CFLAGS)
|
||||
@@ -1398,7 +1361,6 @@ AC_SUBST(TARGET_IMG_LDSCRIPT)
|
||||
AC_SUBST(TARGET_IMG_LDFLAGS)
|
||||
AC_SUBST(TARGET_IMG_CFLAGS)
|
||||
AC_SUBST(TARGET_IMG_BASE_LDOPT)
|
||||
AC_SUBST(TARGET_APPLE_LINKER)
|
||||
|
||||
AC_SUBST(HOST_CFLAGS)
|
||||
AC_SUBST(HOST_LDFLAGS)
|
||||
@@ -1421,14 +1383,13 @@ AM_CONDITIONAL([COND_i386_ieee1275], [test x$target_cpu = xi386 -a x$platform =
|
||||
AM_CONDITIONAL([COND_i386_coreboot], [test x$target_cpu = xi386 -a x$platform = xcoreboot])
|
||||
AM_CONDITIONAL([COND_i386_multiboot], [test x$target_cpu = xi386 -a x$platform = xmultiboot])
|
||||
AM_CONDITIONAL([COND_x86_64_efi], [test x$target_cpu = xx86_64 -a x$platform = xefi])
|
||||
AM_CONDITIONAL([COND_i386_xen], [test x$target_cpu = xi386 -a x$platform = xxen])
|
||||
AM_CONDITIONAL([COND_x86_64_xen], [test x$target_cpu = xx86_64 -a x$platform = xxen])
|
||||
AM_CONDITIONAL([COND_mips_loongson], [test x$target_cpu = xmipsel -a x$platform = xloongson])
|
||||
AM_CONDITIONAL([COND_mips_qemu_mips], [test "(" x$target_cpu = xmips -o x$target_cpu = xmipsel ")" -a x$platform = xqemu_mips])
|
||||
AM_CONDITIONAL([COND_mips_arc], [test "(" x$target_cpu = xmips -o x$target_cpu = xmipsel ")" -a x$platform = xarc])
|
||||
AM_CONDITIONAL([COND_sparc64_ieee1275], [test x$target_cpu = xsparc64 -a x$platform = xieee1275])
|
||||
AM_CONDITIONAL([COND_powerpc_ieee1275], [test x$target_cpu = xpowerpc -a x$platform = xieee1275])
|
||||
AM_CONDITIONAL([COND_mips], [test x$target_cpu = xmips -o x$target_cpu = xmipsel])
|
||||
AM_CONDITIONAL([COND_alpha_srm], [test x$target_cpu = xalpha -a x$platform = xsrm])
|
||||
AM_CONDITIONAL([COND_mipsel], [test x$target_cpu = xmipsel])
|
||||
AM_CONDITIONAL([COND_mipseb], [test x$target_cpu = xmips])
|
||||
AM_CONDITIONAL([COND_arm], [test x$target_cpu = xarm ])
|
||||
@@ -1450,7 +1411,7 @@ AM_CONDITIONAL([COND_GRUB_EMU_PCI], [test x$enable_grub_emu_pci = xyes])
|
||||
AM_CONDITIONAL([COND_GRUB_MKFONT], [test x$enable_grub_mkfont = xyes])
|
||||
AM_CONDITIONAL([COND_GRUB_MOUNT], [test x$enable_grub_mount = xyes])
|
||||
AM_CONDITIONAL([COND_HAVE_FONT_SOURCE], [test x$FONT_SOURCE != x])
|
||||
AM_CONDITIONAL([COND_APPLE_LINKER], [test x$TARGET_APPLE_LINKER = x1])
|
||||
AM_CONDITIONAL([COND_APPLE_CC], [test x$TARGET_APPLE_CC = x1])
|
||||
AM_CONDITIONAL([COND_ENABLE_EFIEMU], [test x$enable_efiemu = xyes])
|
||||
AM_CONDITIONAL([COND_ENABLE_CACHE_STATS], [test x$DISK_CACHE_STATS = x1])
|
||||
AM_CONDITIONAL([COND_ENABLE_BOOT_TIME_STATS], [test x$BOOT_TIME_STATS = x1])
|
||||
@@ -1460,20 +1421,6 @@ AM_CONDITIONAL([COND_HAVE_CXX], [test x$HAVE_CXX = xyes])
|
||||
AM_CONDITIONAL([COND_HAVE_ASM_USCORE], [test x$HAVE_ASM_USCORE = x1])
|
||||
AM_CONDITIONAL([COND_CYGWIN], [test x$target_os = xcygwin])
|
||||
AM_CONDITIONAL([COND_STARFIELD], [test "x$starfield_excuse" = x])
|
||||
AM_CONDITIONAL([COND_HAVE_EXEC], [test "x$have_exec" = xy])
|
||||
|
||||
test "x$prefix" = xNONE && prefix="$ac_default_prefix"
|
||||
test "x$exec_prefix" = xNONE && exec_prefix="${prefix}"
|
||||
datarootdir="$(eval echo "$datarootdir")"
|
||||
grub_libdir="$(eval echo "$libdir")"
|
||||
grub_localedir="$(eval echo "$localedir")"
|
||||
grub_datadir="$(eval echo "$datadir")"
|
||||
grub_sysconfdir="$(eval echo "$sysconfdir")"
|
||||
AC_DEFINE_UNQUOTED(LOCALEDIR, "$grub_localedir", [Locale dir])
|
||||
AC_DEFINE_UNQUOTED(GRUB_LIBDIR, "$grub_libdir", [Library dir])
|
||||
AC_DEFINE_UNQUOTED(GRUB_DATADIR, "$grub_datadir", [Data dir])
|
||||
AC_DEFINE_UNQUOTED(GRUB_SYSCONFDIR, "$grub_sysconfdir", [Configuration dir])
|
||||
|
||||
|
||||
# Output files.
|
||||
cpudir="${target_cpu}"
|
||||
@@ -1585,8 +1532,8 @@ else
|
||||
echo Build-time grub-mkfont: No "($grub_build_mkfont_excuse)"
|
||||
echo "Without unifont (no build-time grub-mkfont)"
|
||||
fi
|
||||
if test x"$liblzma_excuse" != x ; then
|
||||
echo "Without liblzma (no support for XZ-compressed mips images) ($liblzma_excuse)"
|
||||
if test "x$LIBLZMA" = x ; then
|
||||
echo "Without liblzma (no support for XZ-compressed mips images)"
|
||||
else
|
||||
echo "With liblzma from $LIBLZMA (support for XZ-compressed mips images)"
|
||||
fi
|
||||
|
||||
@@ -79,6 +79,7 @@ This edition documents version @value{VERSION}.
|
||||
* Contributing Changes::
|
||||
* Porting::
|
||||
* Error Handling::
|
||||
* CIA::
|
||||
* BIOS port memory map::
|
||||
* Video Subsystem::
|
||||
* PFF2 Font File Format::
|
||||
@@ -91,36 +92,24 @@ This edition documents version @value{VERSION}.
|
||||
@node Getting the source code
|
||||
@chapter Getting the source code
|
||||
|
||||
GRUB is maintained using the @uref{GIT revision
|
||||
control system}. To fetch:
|
||||
GRUB is maintained using the @uref{http://bazaar-vcs.org/, Bazaar revision
|
||||
control system}. To fetch the primary development branch:
|
||||
|
||||
@example
|
||||
git clone git://git.sv.gnu.org/grub.git
|
||||
bzr get http://bzr.savannah.gnu.org/r/grub/trunk/grub
|
||||
@end example
|
||||
|
||||
Web access is available under
|
||||
The GRUB developers maintain several other branches with work in progress.
|
||||
Of these, the most interesting is the experimental branch, which is a
|
||||
staging area for new code which we expect to eventually merge into trunk but
|
||||
which is not yet ready:
|
||||
|
||||
@example
|
||||
http://git.savannah.gnu.org/cgit/grub.git/
|
||||
bzr get http://bzr.savannah.gnu.org/r/grub/branches/experimental
|
||||
@end example
|
||||
|
||||
The branches available are:
|
||||
|
||||
@table @samp
|
||||
@item master
|
||||
Main developpement branch.
|
||||
@item grub-legacy
|
||||
GRUB 0.97 codebase. Kept for reference and legal reasons
|
||||
@item multiboot
|
||||
Multiboot specfication
|
||||
@item multiboot2
|
||||
Multiboot2 specfication
|
||||
@item developper branches
|
||||
Prefixed with developper name. Every developper of a team manages his own branches.
|
||||
Developper branches do not need changelog entries.
|
||||
@end table
|
||||
|
||||
Once you have used @kbd{git clone} to fetch an initial copy of a branch, you
|
||||
can use @kbd{git pull} to keep it up to date. If you have modified your
|
||||
Once you have used @kbd{bzr get} to fetch an initial copy of a branch, you
|
||||
can use @kbd{bzr pull} to keep it up to date. If you have modified your
|
||||
local version, you may need to resolve conflicts when pulling.
|
||||
|
||||
@node Coding style
|
||||
@@ -345,10 +334,10 @@ anymore.
|
||||
@itemize
|
||||
@item Always use latest GRUB 2 source code. So get that first.
|
||||
|
||||
For developers it is recommended always to use the newest development version of GRUB 2. If development takes a long period of time, please remember to keep in sync with newest developments regularly so it is much easier to integrate your change in the future. GRUB 2 is being developed in a GIT repository.
|
||||
For developers it is recommended always to use the newest development version of GRUB 2. If development takes a long period of time, please remember to keep in sync with newest developments regularly so it is much easier to integrate your change in the future. GRUB 2 is being developed in a Bazaar (bzr) repository.
|
||||
|
||||
Please check Savannah's GRUB project page for details how to get newest git:
|
||||
@uref{https://savannah.gnu.org/git/?group=grub, GRUB 2 git Repository}
|
||||
Please check Savannah's GRUB project page for details how to get newest bzr:
|
||||
@uref{http://savannah.gnu.org/bzr/?group=grub, GRUB 2 bzr Repository}
|
||||
|
||||
@item Compile it and try it out.
|
||||
|
||||
@@ -906,6 +895,34 @@ if (grub_errno != GRUB_ERR_NONE)
|
||||
grub_error_pop ();
|
||||
@end example
|
||||
|
||||
@node CIA
|
||||
@chapter CIA
|
||||
@c By Robert Millan and Carles Pina
|
||||
If you have commit access, please setup CIA in your Bazaar
|
||||
config so those in IRC receive notification of your commits.
|
||||
|
||||
In @file{~/.bazaar/bazaar.conf}, add "cia_send_revno = true".
|
||||
Optionally, you can also add "cia_user = myusername" if you'd
|
||||
like CIA service to use a specific account (for statistical purpose).
|
||||
|
||||
In the @file{.bzr/branch/branch.conf} of your checkout branch,
|
||||
"set nickname = /path_to_this_branch" and "cia_project = GNU GRUB".
|
||||
|
||||
Additionally, please set cia_send_revno in the [DEFAULT] section
|
||||
of your @file{~/.bazaar/bazaar.conf}. E.g.:
|
||||
|
||||
@example
|
||||
[DEFAULT]
|
||||
cia_send_revno = true
|
||||
@end example
|
||||
|
||||
Remember to install cia-clients (Debian/Ubuntu package) to be able to use CIA.
|
||||
|
||||
Keep in mind Bazaar sends notifications for all commits to branches that have
|
||||
this setting, regardless of whether they're bound branches (checkouts) or not.
|
||||
So if you make local commits in a non-bound branch and it bothers you that
|
||||
others can read them, do not use this setting.
|
||||
|
||||
@node BIOS port memory map
|
||||
@chapter BIOS port memory map
|
||||
@c By Yoshinori K Okuji
|
||||
|
||||
@@ -1277,9 +1277,8 @@ works it's not recommended since titles often contain unstable device names
|
||||
and may be translated
|
||||
|
||||
If you set this to @samp{saved}, then the default menu entry will be that
|
||||
saved by @samp{GRUB_SAVEDEFAULT} or @command{grub-set-default}. This relies on
|
||||
the environment block, which may not be available in all situations
|
||||
(@pxref{Environment block}).
|
||||
saved by @samp{GRUB_SAVEDEFAULT}, @command{grub-set-default}, or
|
||||
@command{grub-reboot}.
|
||||
|
||||
The default is @samp{0}.
|
||||
|
||||
@@ -1288,7 +1287,7 @@ If this option is set to @samp{true}, then, when an entry is selected, save
|
||||
it as a new default entry for use by future runs of GRUB. This is only
|
||||
useful if @samp{GRUB_DEFAULT=saved}; it is a separate option because
|
||||
@samp{GRUB_DEFAULT=saved} is useful without this option, in conjunction with
|
||||
@command{grub-set-default}. Unset by default.
|
||||
@command{grub-set-default} or @command{grub-reboot}. Unset by default.
|
||||
This option relies on the environment block, which may not be available in
|
||||
all situations (@pxref{Environment block}).
|
||||
|
||||
@@ -1451,22 +1450,6 @@ Normally, @command{grub-mkconfig} will try to use the external
|
||||
systems installed on the same system and generate appropriate menu entries
|
||||
for them. Set this option to @samp{true} to disable this.
|
||||
|
||||
@item GRUB_OS_PROBER_SKIP_LIST
|
||||
List of space-separated FS UUIDs of filesystems to be ignored from os-prober
|
||||
output. For efi chainloaders it's <UUID>@@<EFI FILE>
|
||||
|
||||
@item GRUB_DISABLE_SUBMENU
|
||||
Normally, @command{grub-mkconfig} will generate top level menu entry for
|
||||
the kernel with highest version number and put all other found kernels
|
||||
or alternative menu entries for recovery mode in submenu. For entries returned
|
||||
by @command{os-prober} first entry will be put on top level and all others
|
||||
in submenu. If this option is set to @samp{y}, flat menu with all entries
|
||||
on top level will be generated instead. Changing this option will require
|
||||
changing existing values of @samp{GRUB_DEFAULT}, @samp{fallback} (@pxref{fallback})
|
||||
and @samp{default} (@pxref{default}) environment variables as well as saved
|
||||
default entry using @command{grub-set-default} and value used with
|
||||
@command{grub-reboot}.
|
||||
|
||||
@item GRUB_ENABLE_CRYPTODISK
|
||||
If set to @samp{y}, @command{grub-mkconfig} and @command{grub-install} will
|
||||
check for encrypted disks and generate additional commands needed to access
|
||||
@@ -2669,7 +2652,6 @@ Heavily limited platforms:
|
||||
Lightly limited platforms:
|
||||
|
||||
@itemize
|
||||
@item *-xen: limited only by adress space and RAM size.
|
||||
@item i386-qemu: kernel.img (.text + .data + .bss) is limited by 392704 bytes.
|
||||
(core.img would be limited by ROM size but it's unlimited on qemu
|
||||
@item All EFI platforms: limited by contiguous RAM size and possibly firmware bugs
|
||||
@@ -2725,9 +2707,9 @@ by a digit, like @samp{fd0}, or @samp{cd}.
|
||||
AHCI, PATA (ata), crypto, USB use the name of driver followed by a number.
|
||||
Memdisk and host are limited to one disk and so it's refered just by driver
|
||||
name.
|
||||
RAID (md), ofdisk (ieee1275 and nand), LVM (lvm), LDM, virtio (vdsk)
|
||||
and arcdisk (arc) use intrinsic name of disk prefixed by driver name.
|
||||
Additionally just ``nand'' refers to the disk aliased as ``nand''.
|
||||
RAID (md), ofdisk (ieee1275 and nand), LVM (lvm), LDM and arcdisk (arc) use
|
||||
intrinsic name of disk prefixed by driver name. Additionally just ``nand''
|
||||
refers to the disk aliased as ``nand''.
|
||||
Conflicts are solved by suffixing a number if necessarry.
|
||||
Commas need to be escaped.
|
||||
Loopback uses whatever name specified to @command{loopback} command.
|
||||
@@ -2993,7 +2975,6 @@ These variables have special meaning to GRUB.
|
||||
* biosnum::
|
||||
* check_signatures::
|
||||
* chosen::
|
||||
* cmdpath::
|
||||
* color_highlight::
|
||||
* color_normal::
|
||||
* debug::
|
||||
@@ -3063,16 +3044,6 @@ the titles of each of the submenus starting from the top level followed by
|
||||
the title of the menu entry itself, separated by @samp{>}.
|
||||
|
||||
|
||||
@node cmdpath
|
||||
@subsection cmdpath
|
||||
|
||||
The location from which @file{core.img} was loaded as an absolute
|
||||
directory name (@pxref{File name syntax}). This is set by GRUB at
|
||||
startup based on information returned by platform firmware. Not every
|
||||
platform provides this information and some may return only device
|
||||
without path name.
|
||||
|
||||
|
||||
@node color_highlight
|
||||
@subsection color_highlight
|
||||
|
||||
@@ -5220,14 +5191,12 @@ is given, use default list of servers.
|
||||
|
||||
|
||||
@node Internationalisation
|
||||
@chapter Internationalisation
|
||||
|
||||
@section Charset
|
||||
@chapter Charset
|
||||
GRUB uses UTF-8 internally other than in rendering where some GRUB-specific
|
||||
appropriate representation is used. All text files (including config) are
|
||||
assumed to be encoded in UTF-8.
|
||||
|
||||
@section Filesystems
|
||||
@chapter Filesystems
|
||||
NTFS, JFS, UDF, HFS+, exFAT, long filenames in FAT, Joliet part of
|
||||
ISO9660 are treated as UTF-16 as per specification. AFS and BFS are read
|
||||
as UTF-8, again according to specification. BtrFS, cpio, tar, squash4, minix,
|
||||
@@ -5261,7 +5230,7 @@ treated as distinct from u+combining diaresis. This however means that in
|
||||
order to access file on HFS+ its name must be specified in normalisation form D.
|
||||
On normalized ZFS subvolumes filenames out of normalisation are inaccessible.
|
||||
|
||||
@section Output terminal
|
||||
@chapter Output terminal
|
||||
Firmware output console ``console'' on ARC and IEEE1275 are limited to ASCII.
|
||||
|
||||
BIOS firmware console and VGA text are limited to ASCII and some pseudographics.
|
||||
@@ -5295,7 +5264,7 @@ called ``annotation characters'' If you can complete either of
|
||||
two lists or, better, propose a patch to improve rendering, please contact
|
||||
developer team.
|
||||
|
||||
@section Input terminal
|
||||
@chapter Input terminal
|
||||
Firmware console on BIOS, IEEE1275 and ARC doesn't allow you to enter non-ASCII
|
||||
characters. EFI specification allows for such but author is unaware of any
|
||||
actual implementations. Serial input is currently limited for latin1 (unlikely
|
||||
@@ -5305,15 +5274,15 @@ So no dead keys or advanced input method. Also there is no keymap change hotkey.
|
||||
In practice it makes difficult to enter any text using non-Latin alphabet.
|
||||
Moreover all current input consumers are limited to ASCII.
|
||||
|
||||
@section Gettext
|
||||
@chapter Gettext
|
||||
GRUB supports being translated. For this you need to have language *.mo files in $prefix/locale, load gettext module and set ``lang'' variable.
|
||||
|
||||
@section Regexp
|
||||
@chapter Regexp
|
||||
Regexps work on unicode characters, however no attempt at checking cannonical
|
||||
equivalence has been made. Moreover the classes like [:alpha:] match only
|
||||
ASCII subset.
|
||||
|
||||
@section Other
|
||||
@chapter Other
|
||||
Currently GRUB always uses YEAR-MONTH-DAY HOUR:MINUTE:SECOND [WEEKDAY] 24-hour
|
||||
datetime format but weekdays are translated.
|
||||
GRUB always uses the decimal number format with [0-9] as digits and . as
|
||||
@@ -5783,7 +5752,7 @@ X86 support is summarised in the following table. ``Yes'' means that the kernel
|
||||
PowerPC, IA64 and Sparc64 ports support only Linux. MIPS port supports Linux
|
||||
and multiboot2.
|
||||
|
||||
@section Boot tests
|
||||
@chapter Boot tests
|
||||
|
||||
As you have seen in previous chapter the support matrix is pretty big and some of the configurations are only rarely used. To ensure the quality bootchecks are available for all x86 targets except EFI chainloader, Appleloader and XNU. All x86 platforms have bootcheck facility except ieee1275. Multiboot, multiboot2, BIOS chainloader, ntldr and freebsd-bootloader boot targets are tested only with a fake kernel images. Only Linux is tested among the payloads using Linux protocols.
|
||||
|
||||
|
||||
26
gentpl.py
26
gentpl.py
@@ -21,10 +21,9 @@
|
||||
|
||||
GRUB_PLATFORMS = [ "emu", "i386_pc", "i386_efi", "i386_qemu", "i386_coreboot",
|
||||
"i386_multiboot", "i386_ieee1275", "x86_64_efi",
|
||||
"i386_xen", "x86_64_xen",
|
||||
"mips_loongson", "sparc64_ieee1275",
|
||||
"powerpc_ieee1275", "mips_arc", "ia64_efi",
|
||||
"mips_qemu_mips", "arm_uboot", "arm_efi" ]
|
||||
"mips_qemu_mips", "alpha_srm", "arm_uboot", "arm_efi" ]
|
||||
|
||||
GROUPS = {}
|
||||
|
||||
@@ -43,7 +42,6 @@ GROUPS["arm"] = [ "arm_uboot", "arm_efi" ]
|
||||
GROUPS["efi"] = [ "i386_efi", "x86_64_efi", "ia64_efi", "arm_efi" ]
|
||||
GROUPS["ieee1275"] = [ "i386_ieee1275", "sparc64_ieee1275", "powerpc_ieee1275" ]
|
||||
GROUPS["uboot"] = [ "arm_uboot" ]
|
||||
GROUPS["xen"] = [ "i386_xen", "x86_64_xen" ]
|
||||
|
||||
# emu is a special case so many core functionality isn't needed on this platform
|
||||
GROUPS["noemu"] = GRUB_PLATFORMS[:]; GROUPS["noemu"].remove("emu")
|
||||
@@ -51,7 +49,7 @@ GROUPS["noemu"] = GRUB_PLATFORMS[:]; GROUPS["noemu"].remove("emu")
|
||||
# Groups based on hardware features
|
||||
GROUPS["cmos"] = GROUPS["x86"][:] + ["mips_loongson", "mips_qemu_mips",
|
||||
"sparc64_ieee1275", "powerpc_ieee1275"]
|
||||
GROUPS["cmos"].remove("i386_efi"); GROUPS["cmos"].remove("x86_64_efi");
|
||||
GROUPS["cmos"].remove("i386_efi"); GROUPS["cmos"].remove("x86_64_efi")
|
||||
GROUPS["pci"] = GROUPS["x86"] + ["mips_loongson"]
|
||||
GROUPS["usb"] = GROUPS["pci"]
|
||||
|
||||
@@ -61,7 +59,7 @@ GROUPS["videomodules"] = GRUB_PLATFORMS[:];
|
||||
for i in GROUPS["videoinkernel"]: GROUPS["videomodules"].remove(i)
|
||||
|
||||
# Similar for terminfo
|
||||
GROUPS["terminfoinkernel"] = [ "emu", "mips_loongson", "mips_arc", "mips_qemu_mips" ] + GROUPS["xen"] + GROUPS["ieee1275"] + GROUPS["uboot"];
|
||||
GROUPS["terminfoinkernel"] = [ "emu", "mips_loongson", "mips_arc", "mips_qemu_mips", "alpha_srm" ] + GROUPS["ieee1275"] + GROUPS["uboot"];
|
||||
GROUPS["terminfomodule"] = GRUB_PLATFORMS[:];
|
||||
for i in GROUPS["terminfoinkernel"]: GROUPS["terminfomodule"].remove(i)
|
||||
|
||||
@@ -309,8 +307,13 @@ def define_macro_for_platform_nodist_sources(p):
|
||||
return define_autogen_macro(
|
||||
"get_" + p + "_nodist_sources",
|
||||
platform_values(p, "_nodist"))
|
||||
def define_macro_for_platform_dependencies(p):
|
||||
return define_autogen_macro(
|
||||
"get_" + p + "_dependencies",
|
||||
platform_values(p, "dependencies", "_dependencies"))
|
||||
def platform_sources(p): return "[+ get_" + p + "_sources +]"
|
||||
def platform_nodist_sources(p): return "[+ get_" + p + "_nodist_sources +]"
|
||||
def platform_dependencies(p): return "[+ get_" + p + "_dependencies +]"
|
||||
|
||||
#
|
||||
# Returns Autogen code which defines the autogen macros that collect
|
||||
@@ -425,13 +428,13 @@ def kernel(platform):
|
||||
r += gvar_add("CLEANFILES", "[+ name +].img")
|
||||
r += rule("[+ name +].img", "[+ name +].exec$(EXEEXT)",
|
||||
if_platform_tagged(platform, "nostrip",
|
||||
"""if test x$(TARGET_APPLE_LINKER) = x1; then \
|
||||
"""if test x$(USE_APPLE_CC_FIXES) = xyes; then \
|
||||
$(TARGET_OBJCONV) -f$(TARGET_MODULE_FORMAT) -nr:_grub_mod_init:grub_mod_init -nr:_grub_mod_fini:grub_mod_fini -ed2022 -wd1106 -nu -nd $< $@; \
|
||||
elif test ! -z '$(TARGET_OBJ2ELF)'; then \
|
||||
cp $< $@.bin; $(TARGET_OBJ2ELF) $@.bin && cp $@.bin $@ || (rm -f $@.bin; exit 1); \
|
||||
else cp $< $@; fi""",
|
||||
"""if test x$(TARGET_APPLE_LINKER) = x1; then \
|
||||
$(TARGET_STRIP) -S -x $(""" + cname() + """) -o $@.bin $<; \
|
||||
"""if test x$(USE_APPLE_CC_FIXES) = xyes; then \
|
||||
$(TARGET_STRIP) $(""" + cname() + """) -o $@.bin $<; \
|
||||
$(TARGET_OBJCONV) -f$(TARGET_MODULE_FORMAT) -nr:_grub_mod_init:grub_mod_init -nr:_grub_mod_fini:grub_mod_fini -ed2022 -wd1106 -nu -nd $@.bin $@; \
|
||||
else """ + "$(TARGET_STRIP) $(" + cname() + "_STRIPFLAGS) -o $@ $<; \
|
||||
fi"""))
|
||||
@@ -457,7 +460,7 @@ def image(platform):
|
||||
r += gvar_add("platform_DATA", "[+ name +].img")
|
||||
r += gvar_add("CLEANFILES", "[+ name +].img")
|
||||
r += rule("[+ name +].img", "[+ name +].image$(EXEEXT)", """
|
||||
if test x$(TARGET_APPLE_LINKER) = x1; then \
|
||||
if test x$(USE_APPLE_CC_FIXES) = xyes; then \
|
||||
$(MACHO2IMG) $< $@; \
|
||||
else \
|
||||
$(TARGET_OBJCOPY) $(""" + cname() + """_OBJCOPYFLAGS) --strip-unneeded -R .note -R .comment -R .note.gnu.build-id -R .reginfo -R .rel.dyn -R .note.gnu.gold-version $< $@; \
|
||||
@@ -541,8 +544,8 @@ def script(platform):
|
||||
r += "[+ IF mansection +]" + manpage("grub-mkconfig_lib") + "[+ ENDIF +]"
|
||||
r += "[+ ENDIF +]"
|
||||
|
||||
r += rule("[+ name +]", "$(top_builddir)/config.status " + platform_sources(platform) + platform_dependencies(platform), """
|
||||
(for x in """ + platform_sources(platform) + """; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:-
|
||||
r += rule("[+ name +]", "$(top_builddir)/config.status " + platform_sources(platform), """
|
||||
(skip=1; for x in $^; do if [ $$skip = 1 ]; then skip=0; else cat "$$x"; fi; done) | $(top_builddir)/config.status --file=$@:-
|
||||
chmod a+x [+ name +]
|
||||
""")
|
||||
|
||||
@@ -602,6 +605,7 @@ print ("[+ AutoGen5 template +]\n")
|
||||
for p in GRUB_PLATFORMS:
|
||||
print (define_macro_for_platform_sources(p))
|
||||
print (define_macro_for_platform_nodist_sources(p))
|
||||
# print define_macro_for_platform_dependencies(p)
|
||||
|
||||
print (define_macro_for_platform_startup(p))
|
||||
print (define_macro_for_platform_cflags(p))
|
||||
|
||||
@@ -130,24 +130,6 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
|
||||
endif
|
||||
|
||||
if COND_i386_xen
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/xen.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/xen/hypercall.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/loader.h
|
||||
endif
|
||||
|
||||
if COND_x86_64_xen
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/xen.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/x86_64/xen/hypercall.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/loader.h
|
||||
endif
|
||||
|
||||
if COND_x86_64_efi
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h
|
||||
@@ -160,6 +142,12 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h
|
||||
endif
|
||||
|
||||
if COND_alpha_srm
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/alpha/divide.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/loader.h
|
||||
endif
|
||||
|
||||
if COND_mips
|
||||
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/cpu/kernel.h
|
||||
endif
|
||||
@@ -389,49 +377,42 @@ CLEANFILES += $(MOD_FILES)
|
||||
if COND_ENABLE_EFIEMU
|
||||
efiemu32.o: efiemu/runtime/efiemu.c $(TARGET_OBJ2ELF)
|
||||
-rm -f $@; \
|
||||
if test "x$(TARGET_APPLE_LINKER)" = x1; then \
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -m32 -Wall -Werror -nostdlib -O2 -c -o $@.bin $< || exit 1; \
|
||||
if test "x$(TARGET_APPLE_CC)" = x1; then \
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -DELF32 -DAPPLE_CC -m32 -Wall -Werror -nostdlib -O2 -c -o $@.bin $< || exit 1; \
|
||||
$(OBJCONV) -felf32 -nu -nd $@.bin $@ || exit 1; \
|
||||
rm -f $@.bin; \
|
||||
else \
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -m32 -Wall -Werror -nostdlib -O2 -c -o $@ $< || exit 1; \
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -DELF32 -m32 -Wall -Werror -nostdlib -O2 -c -o $@ $< || exit 1; \
|
||||
if test ! -z "$(TARGET_OBJ2ELF)"; then $(TARGET_OBJ2ELF) $@ || (rm -f $@; exit 1); fi; \
|
||||
fi
|
||||
|
||||
efiemu64_c.o: efiemu/runtime/efiemu.c
|
||||
if test "x$(TARGET_APPLE_LINKER)" = x1; then \
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -m64 -nostdlib -Wall -Werror -mno-red-zone -c -o $@ $< || exit 1; \
|
||||
if test "x$(TARGET_APPLE_CC)" = x1; then \
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -DELF64 -DAPPLE_CC=1 -m64 -nostdlib -Wall -Werror -mno-red-zone -c -o $@ $< || exit 1; \
|
||||
else \
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -m64 -nostdlib -Wall -Werror -O2 -mcmodel=large -mno-red-zone -c -o $@ $< || exit 1; \
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -DELF64 -m64 -nostdlib -Wall -Werror -O2 -mcmodel=large -mno-red-zone -c -o $@ $< || exit 1; \
|
||||
fi
|
||||
|
||||
efiemu64_s.o: efiemu/runtime/efiemu.S
|
||||
-rm -f $@
|
||||
if test "x$(TARGET_APPLE_LINKER)" = x1; then \
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -m64 -Wall -Werror -nostdlib -O2 -mno-red-zone -c -o $@ $< || exit 1; \
|
||||
if test "x$(TARGET_APPLE_CC)" = x1; then \
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -DELF64 -DAPPLE_CC=1 -m64 -Wall -Werror -nostdlib -O2 -mno-red-zone -c -o $@ $< || exit 1; \
|
||||
else \
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -m64 -Wall -Werror -nostdlib -O2 -mcmodel=large -mno-red-zone -c -o $@ $< || exit 1; \
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -DELF64 -m64 -Wall -Werror -nostdlib -O2 -mcmodel=large -mno-red-zone -c -o $@ $< || exit 1; \
|
||||
fi
|
||||
|
||||
efiemu64.o: efiemu64_c.o efiemu64_s.o $(TARGET_OBJ2ELEF)
|
||||
-rm -f $@; \
|
||||
if test "x$(TARGET_APPLE_LINKER)" = x1; then \
|
||||
if test "x$(TARGET_APPLE_CC)" = x1; then \
|
||||
rm -f $@.bin; \
|
||||
$(TARGET_CC) -m64 -Wl,-r -nostdlib -o $@.bin $^ || exit 1; \
|
||||
$(OBJCONV) -felf64 -nu -nd $@.bin $@ || exit 1; \
|
||||
rm -f $@.bin; \
|
||||
else \
|
||||
$(TARGET_CC) -m64 -Wl,-melf_x86_64 -nostdlib -Wl,-r -o $@ $^ || exit 1; \
|
||||
$(TARGET_CC) -m64 -nostdlib -Wl,-r -o $@ $^ || exit 1; \
|
||||
if test ! -z "$(TARGET_OBJ2ELF)"; then $(TARGET_OBJ2ELF) $@ || (rm -f $@; exit 1); fi; \
|
||||
fi
|
||||
|
||||
platform_DATA += efiemu32.o efiemu64.o
|
||||
CLEANFILES += efiemu32.o efiemu64.o efiemu64_c.o efiemu64_s.o
|
||||
endif
|
||||
|
||||
windowsdir=$(top_builddir)/$(PACKAGE)-$(VERSION)-for-windows
|
||||
windowsdir: $(PROGRAMS) $(starfield_DATA) $(platform_DATA)
|
||||
test -d $(windowsdir)/$(target_cpu)-$(platform) || mkdir $(windowsdir)/$(target_cpu)-$(platform)
|
||||
for x in $(platform_DATA); do \
|
||||
cp -fp $$x $(windowsdir)/$(target_cpu)-$(platform)/$$x; \
|
||||
done
|
||||
|
||||
@@ -59,11 +59,6 @@ kernel = {
|
||||
ia64_efi_ldflags = '-Wl,-r,-d';
|
||||
ia64_efi_stripflags = '--strip-unneeded -K start -R .note -R .comment -R .note.gnu.gold-version';
|
||||
|
||||
x86_64_xen_ldflags = '-Wl,-Ttext=0';
|
||||
x86_64_xen_cppflags = '$(CPPFLAGS_XEN)';
|
||||
i386_xen_ldflags = '-Wl,-Ttext=0';
|
||||
i386_xen_cppflags = '$(CPPFLAGS_XEN)';
|
||||
|
||||
arm_efi_ldflags = '-Wl,-r,-d';
|
||||
arm_efi_stripflags = '--strip-unneeded -K start -R .note -R .comment -R .note.gnu.gold-version';
|
||||
|
||||
@@ -75,6 +70,8 @@ kernel = {
|
||||
|
||||
ldadd = '$(LDADD_KERNEL)';
|
||||
|
||||
alpha_srm_cflags = '-mcpu=ev4 -mno-fp-regs -ffixed-8';
|
||||
|
||||
i386_coreboot_ldflags = '-Wl,-Ttext=0x8200';
|
||||
i386_multiboot_ldflags = '-Wl,-Ttext=0x8200';
|
||||
i386_ieee1275_ldflags = '-Wl,-Ttext=0x10000';
|
||||
@@ -83,6 +80,7 @@ kernel = {
|
||||
sparc64_ieee1275_ldflags = '-Wl,-Ttext,0x4400';
|
||||
mips_arc_ldflags = '-Wl,-Ttext,$(TARGET_LINK_ADDR)';
|
||||
mips_qemu_mips_ldflags = '-Wl,-Ttext,0x80200000';
|
||||
alpha_srm_ldflags = '-Wl,-Ttext,0x20000000';
|
||||
|
||||
mips_arc_cppflags = '-DGRUB_DECOMPRESSOR_LINK_ADDR=$(TARGET_DECOMPRESSOR_LINK_ADDR)';
|
||||
mips_loongson_cppflags = '-DUSE_ASCII_FALLBACK';
|
||||
@@ -95,8 +93,6 @@ kernel = {
|
||||
i386_pc_startup = kern/i386/pc/startup.S;
|
||||
i386_efi_startup = kern/i386/efi/startup.S;
|
||||
x86_64_efi_startup = kern/x86_64/efi/startup.S;
|
||||
i386_xen_startup = kern/i386/xen/startup.S;
|
||||
x86_64_xen_startup = kern/x86_64/xen/startup.S;
|
||||
i386_qemu_startup = kern/i386/qemu/startup.S;
|
||||
i386_ieee1275_startup = kern/i386/ieee1275/startup.S;
|
||||
i386_coreboot_startup = kern/i386/coreboot/startup.S;
|
||||
@@ -104,6 +100,7 @@ kernel = {
|
||||
mips_startup = kern/mips/startup.S;
|
||||
sparc64_ieee1275_startup = kern/sparc64/ieee1275/crt0.S;
|
||||
powerpc_ieee1275_startup = kern/powerpc/ieee1275/startup.S;
|
||||
alpha_srm_startup = kern/alpha/srm/startup.S;
|
||||
arm_uboot_startup = kern/arm/uboot/startup.S;
|
||||
arm_efi_startup = kern/arm/efi/startup.S;
|
||||
|
||||
@@ -132,6 +129,7 @@ kernel = {
|
||||
noemu_nodist = symlist.c;
|
||||
|
||||
mips = kern/generic/rtc_get_time_ms.c;
|
||||
alpha_srm = kern/generic/rtc_get_time_ms.c;
|
||||
|
||||
ieee1275 = disk/ieee1275/ofdisk.c;
|
||||
ieee1275 = kern/ieee1275/cmain.c;
|
||||
@@ -153,7 +151,6 @@ kernel = {
|
||||
terminfoinkernel = lib/arg.c;
|
||||
|
||||
i386 = kern/i386/dl.c;
|
||||
i386_xen = kern/i386/dl.c;
|
||||
|
||||
i386_coreboot = kern/i386/coreboot/init.c;
|
||||
i386_multiboot = kern/i386/coreboot/init.c;
|
||||
@@ -163,7 +160,6 @@ kernel = {
|
||||
|
||||
efi = disk/efi/efidisk.c;
|
||||
efi = kern/efi/efi.c;
|
||||
efi = kern/efi/efi_core.c;
|
||||
efi = kern/efi/init.c;
|
||||
efi = kern/efi/mm.c;
|
||||
efi = term/efi/console.c;
|
||||
@@ -173,20 +169,11 @@ kernel = {
|
||||
i386_efi = kern/i386/efi/init.c;
|
||||
i386_efi = bus/pci.c;
|
||||
|
||||
x86_64 = kern/x86_64/dl.c;
|
||||
x86_64_xen = kern/x86_64/dl.c;
|
||||
x86_64_efi = kern/x86_64/dl.c;
|
||||
x86_64_efi = kern/x86_64/efi/callwrap.S;
|
||||
x86_64_efi = kern/i386/efi/init.c;
|
||||
x86_64_efi = bus/pci.c;
|
||||
|
||||
xen = kern/i386/tsc.c;
|
||||
x86_64_xen = kern/x86_64/xen/hypercall.S;
|
||||
i386_xen = kern/i386/xen/hypercall.S;
|
||||
xen = kern/xen/init.c;
|
||||
xen = term/xen/console.c;
|
||||
xen = disk/xen/xendisk.c;
|
||||
xen = commands/boot.c;
|
||||
|
||||
ia64_efi = kern/ia64/efi/startup.S;
|
||||
ia64_efi = kern/ia64/efi/init.c;
|
||||
ia64_efi = kern/ia64/dl.c;
|
||||
@@ -255,6 +242,16 @@ kernel = {
|
||||
arm = kern/arm/cache.c;
|
||||
arm = kern/arm/misc.S;
|
||||
|
||||
alpha_srm = kern/alpha/srm/dispatch.S;
|
||||
alpha_srm = kern/alpha/dl.c;
|
||||
alpha_srm = kern/alpha/cache.S;
|
||||
alpha_srm = kern/alpha/divide.S;
|
||||
alpha_srm = kern/alpha/srm/pal_init.c;
|
||||
alpha_srm = kern/alpha/srm/init.c;
|
||||
alpha_srm = term/alpha/srm/console.c;
|
||||
alpha_srm = disk/alpha/srm/srmdisk.c;
|
||||
alpha_srm = commands/boot.c;
|
||||
|
||||
emu = disk/host.c;
|
||||
emu = kern/emu/cache_s.S;
|
||||
emu = kern/emu/hostdisk.c;
|
||||
@@ -417,22 +414,12 @@ image = {
|
||||
|
||||
image = {
|
||||
name = xz_decompress;
|
||||
ia64_efi = kern/ia64/efi/startup.S;
|
||||
i386_efi = kern/i386/efi/startup.S;
|
||||
x86_64_efi = kern/x86_64/efi/startup.S;
|
||||
arm_efi = kern/arm/efi/startup.S;
|
||||
|
||||
mips = boot/mips/startup_raw.S;
|
||||
mips = boot/mips/scratch.c;
|
||||
common = boot/decompressor/minilib.c;
|
||||
common = boot/decompressor/xz.c;
|
||||
common = lib/xzembed/xz_dec_bcj.c;
|
||||
common = lib/xzembed/xz_dec_lzma2.c;
|
||||
common = lib/xzembed/xz_dec_stream.c;
|
||||
efi = boot/efi/decompressor.c;
|
||||
efi = kern/efi/efi_core.c;
|
||||
|
||||
x86_64_efi = kern/x86_64/efi/callwrap.S;
|
||||
|
||||
cppflags = '-I$(srcdir)/lib/posix_wrap -I$(srcdir)/lib/xzembed -DGRUB_EMBED_DECOMPRESSOR=1';
|
||||
|
||||
@@ -441,7 +428,6 @@ image = {
|
||||
ldadd = '$(TARGET_LIBGCC)';
|
||||
cflags = '-Wno-unreachable-code $(TARGET_LDFLAGS_STATIC_LIBGCC)';
|
||||
enable = mips;
|
||||
enable = efi;
|
||||
};
|
||||
|
||||
image = {
|
||||
@@ -575,7 +561,6 @@ module = {
|
||||
module = {
|
||||
name = pci;
|
||||
common = bus/pci.c;
|
||||
i386_ieee1275 = bus/i386/ieee1275/pci.c;
|
||||
|
||||
enable = i386_pc;
|
||||
enable = i386_ieee1275;
|
||||
@@ -608,14 +593,6 @@ module = {
|
||||
enable = mips_arc;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = lsxen;
|
||||
common = commands/xen/lsxen.c;
|
||||
cppflags = '$(CPPFLAGS_XEN)';
|
||||
|
||||
enable = xen;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = check_nt_hiberfil;
|
||||
common = commands/i386/nthibr.c;
|
||||
@@ -783,10 +760,8 @@ module = {
|
||||
|
||||
module = {
|
||||
name = cpuid;
|
||||
common = commands/i386/cpuid.c;
|
||||
x86 = commands/i386/cpuid.c;
|
||||
enable = x86;
|
||||
enable = i386_xen;
|
||||
enable = x86_64_xen;
|
||||
};
|
||||
|
||||
module = {
|
||||
@@ -843,10 +818,10 @@ module = {
|
||||
i386_multiboot = lib/i386/halt.c;
|
||||
i386_coreboot = lib/i386/halt.c;
|
||||
i386_qemu = lib/i386/halt.c;
|
||||
xen = lib/xen/halt.c;
|
||||
xen_cppflags = '$(CPPFLAGS_XEN)';
|
||||
efi = lib/efi/halt.c;
|
||||
ieee1275 = lib/ieee1275/halt.c;
|
||||
alpha_srm = lib/alpha/srm/halt.c;
|
||||
|
||||
emu = lib/emu/halt.c;
|
||||
uboot = lib/uboot/halt.c;
|
||||
};
|
||||
@@ -863,9 +838,8 @@ module = {
|
||||
mips_arc = lib/mips/arc/reboot.c;
|
||||
mips_loongson = lib/mips/loongson/reboot.c;
|
||||
mips_qemu_mips = lib/mips/qemu_mips/reboot.c;
|
||||
xen = lib/xen/reboot.c;
|
||||
xen_cppflags = '$(CPPFLAGS_XEN)';
|
||||
uboot = lib/uboot/reboot.c;
|
||||
alpha_srm = lib/alpha/srm/reboot.c;
|
||||
common = commands/reboot.c;
|
||||
};
|
||||
|
||||
@@ -1488,11 +1462,6 @@ module = {
|
||||
common = io/gzio.c;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = offsetio;
|
||||
common = io/offset.c;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = bufio;
|
||||
common = io/bufio.c;
|
||||
@@ -1526,21 +1495,13 @@ module = {
|
||||
x86 = lib/i386/relocator64.S;
|
||||
i386 = lib/i386/relocator_asm.S;
|
||||
x86_64 = lib/x86_64/relocator_asm.S;
|
||||
i386_xen = lib/i386/relocator_asm.S;
|
||||
x86_64_xen = lib/x86_64/relocator_asm.S;
|
||||
x86 = lib/i386/relocator.c;
|
||||
x86 = lib/i386/relocator_common_c.c;
|
||||
ieee1275 = lib/ieee1275/relocator.c;
|
||||
efi = lib/efi/relocator.c;
|
||||
mips = lib/mips/relocator_asm.S;
|
||||
mips = lib/mips/relocator.c;
|
||||
powerpc = lib/powerpc/relocator_asm.S;
|
||||
powerpc = lib/powerpc/relocator.c;
|
||||
xen = lib/xen/relocator.c;
|
||||
i386_xen = lib/i386/xen/relocator.S;
|
||||
x86_64_xen = lib/x86_64/xen/relocator.S;
|
||||
xen = lib/i386/relocator_common_c.c;
|
||||
xen_cppflags = '$(CPPFLAGS_XEN)';
|
||||
|
||||
extra_dist = lib/i386/relocator_common.S;
|
||||
extra_dist = kern/powerpc/cache_flush.S;
|
||||
@@ -1548,7 +1509,6 @@ module = {
|
||||
enable = mips;
|
||||
enable = powerpc;
|
||||
enable = x86;
|
||||
enable = xen;
|
||||
};
|
||||
|
||||
module = {
|
||||
@@ -1560,10 +1520,9 @@ module = {
|
||||
powerpc_ieee1275 = lib/ieee1275/datetime.c;
|
||||
sparc64_ieee1275 = lib/ieee1275/cmos.c;
|
||||
powerpc_ieee1275 = lib/ieee1275/cmos.c;
|
||||
xen = lib/xen/datetime.c;
|
||||
xen_cppflags = '$(CPPFLAGS_XEN)';
|
||||
|
||||
mips_arc = lib/arc/datetime.c;
|
||||
alpha_srm = lib/alpha/srm/datetime.c;
|
||||
enable = noemu;
|
||||
};
|
||||
|
||||
@@ -1577,7 +1536,7 @@ module = {
|
||||
extra_dist = lib/powerpc/setjmp.S;
|
||||
extra_dist = lib/ia64/setjmp.S;
|
||||
extra_dist = lib/ia64/longjmp.S;
|
||||
extra_dist = lib/arm/setjmp.S;
|
||||
extra_dist = lib/alpha/setjmp.S;
|
||||
};
|
||||
|
||||
module = {
|
||||
@@ -1636,7 +1595,6 @@ module = {
|
||||
cppflags = "-DGRUB_USE_MULTIBOOT2";
|
||||
|
||||
common = loader/multiboot.c;
|
||||
common = lib/cmdline.c;
|
||||
common = loader/multiboot_mbi2.c;
|
||||
enable = x86;
|
||||
enable = mips;
|
||||
@@ -1645,7 +1603,6 @@ module = {
|
||||
module = {
|
||||
name = multiboot;
|
||||
common = loader/multiboot.c;
|
||||
common = lib/cmdline.c;
|
||||
x86 = loader/i386/multiboot_mbi.c;
|
||||
extra_dist = loader/multiboot_elfxx.c;
|
||||
enable = x86;
|
||||
@@ -1654,12 +1611,6 @@ module = {
|
||||
module = {
|
||||
name = linux;
|
||||
x86 = loader/i386/linux.c;
|
||||
xen = loader/i386/xen.c;
|
||||
xen = loader/i386/xen_file.c;
|
||||
xen = loader/i386/xen_file32.c;
|
||||
xen = loader/i386/xen_file64.c;
|
||||
extra_dist = loader/i386/xen_fileXX.c;
|
||||
xen_cppflags = '$(CPPFLAGS_XEN)';
|
||||
i386_pc = lib/i386/pc/vesa_modes_table.c;
|
||||
mips = loader/mips/linux.c;
|
||||
powerpc_ieee1275 = loader/powerpc/ieee1275/linux.c;
|
||||
@@ -1698,7 +1649,6 @@ module = {
|
||||
efi = loader/efi/chainloader.c;
|
||||
i386_pc = loader/i386/pc/chainloader.c;
|
||||
i386_coreboot = loader/i386/coreboot/chainloader.c;
|
||||
i386_coreboot = lib/LzmaDec.c;
|
||||
enable = i386_pc;
|
||||
enable = i386_coreboot;
|
||||
enable = efi;
|
||||
@@ -1924,32 +1874,6 @@ module = {
|
||||
common = tests/setjmp_test.c;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = signature_test;
|
||||
common = tests/signature_test.c;
|
||||
common = tests/signatures.h;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = xnu_uuid_test;
|
||||
common = tests/xnu_uuid_test.c;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = pbkdf2_test;
|
||||
common = tests/pbkdf2_test.c;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = legacy_password_test;
|
||||
common = tests/legacy_password_test.c;
|
||||
enable = i386_pc;
|
||||
enable = i386_efi;
|
||||
enable = x86_64_efi;
|
||||
enable = emu;
|
||||
enable = xen;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = div_test;
|
||||
common = tests/div_test.c;
|
||||
@@ -2108,13 +2032,11 @@ module = {
|
||||
emu = lib/i386/pc/vesa_modes_table.c;
|
||||
i386_efi = lib/i386/pc/vesa_modes_table.c;
|
||||
x86_64_efi = lib/i386/pc/vesa_modes_table.c;
|
||||
xen = lib/i386/pc/vesa_modes_table.c;
|
||||
|
||||
enable = i386_pc;
|
||||
enable = i386_efi;
|
||||
enable = x86_64_efi;
|
||||
enable = emu;
|
||||
enable = xen;
|
||||
};
|
||||
|
||||
module = {
|
||||
@@ -2148,12 +2070,8 @@ module = {
|
||||
module = {
|
||||
name = backtrace;
|
||||
x86 = lib/i386/backtrace.c;
|
||||
i386_xen = lib/i386/backtrace.c;
|
||||
x86_64_xen = lib/i386/backtrace.c;
|
||||
common = lib/backtrace.c;
|
||||
enable = x86;
|
||||
enable = i386_xen;
|
||||
enable = x86_64_xen;
|
||||
};
|
||||
|
||||
module = {
|
||||
|
||||
@@ -79,3 +79,24 @@ void *memcpy (void *dest, const void *src, grub_size_t n)
|
||||
|
||||
void *grub_decompressor_scratch;
|
||||
|
||||
void
|
||||
find_scratch (void *src, void *dst, unsigned long srcsize,
|
||||
unsigned long dstsize)
|
||||
{
|
||||
#ifdef _mips
|
||||
/* Decoding from ROM. */
|
||||
if (((grub_addr_t) src & 0x10000000))
|
||||
{
|
||||
grub_decompressor_scratch = (void *) ALIGN_UP((grub_addr_t) dst + dstsize,
|
||||
256);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
if ((char *) src + srcsize > (char *) dst + dstsize)
|
||||
grub_decompressor_scratch = (void *) ALIGN_UP ((grub_addr_t) src + srcsize,
|
||||
256);
|
||||
else
|
||||
grub_decompressor_scratch = (void *) ALIGN_UP ((grub_addr_t) dst + dstsize,
|
||||
256);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2010,2013 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GRUB is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <grub/types.h>
|
||||
#include <grub/misc.h>
|
||||
#include <grub/decompressor.h>
|
||||
|
||||
void
|
||||
find_scratch (void *src, void *dst, unsigned long srcsize,
|
||||
unsigned long dstsize)
|
||||
{
|
||||
if ((char *) src + srcsize > (char *) dst + dstsize)
|
||||
grub_decompressor_scratch = (void *) ALIGN_UP ((grub_addr_t) src + srcsize,
|
||||
256);
|
||||
else
|
||||
grub_decompressor_scratch = (void *) ALIGN_UP ((grub_addr_t) dst + dstsize,
|
||||
256);
|
||||
return;
|
||||
}
|
||||
@@ -1,116 +0,0 @@
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GRUB is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <grub/kernel.h>
|
||||
#include <grub/efi/efi.h>
|
||||
#include <grub/decompressor.h>
|
||||
|
||||
/* The handle of GRUB itself. Filled in by the startup code. */
|
||||
grub_efi_handle_t grub_efi_image_handle;
|
||||
|
||||
/* The pointer to a system table. Filled in by the startup code. */
|
||||
grub_efi_system_table_t *grub_efi_system_table;
|
||||
|
||||
int
|
||||
grub_strcmp (const char *s1, const char *s2)
|
||||
{
|
||||
while (*s1 && *s2)
|
||||
{
|
||||
if (*s1 != *s2)
|
||||
break;
|
||||
|
||||
s1++;
|
||||
s2++;
|
||||
}
|
||||
|
||||
return (int) (grub_uint8_t) *s1 - (int) (grub_uint8_t) *s2;
|
||||
}
|
||||
|
||||
static grub_size_t unc_pages, scratch_pages;
|
||||
static void *unc;
|
||||
|
||||
void
|
||||
grub_efi_fini (void)
|
||||
{
|
||||
if (unc)
|
||||
grub_efi_free_pages ((grub_addr_t) unc, unc_pages);
|
||||
if (grub_decompressor_scratch)
|
||||
grub_efi_free_pages ((grub_addr_t) grub_decompressor_scratch,
|
||||
scratch_pages);
|
||||
}
|
||||
|
||||
void
|
||||
find_scratch (void *src __attribute__ ((unused)),
|
||||
void *dst __attribute__ ((unused)),
|
||||
unsigned long srcsize __attribute__ ((unused)),
|
||||
unsigned long dstsize __attribute__ ((unused)))
|
||||
{
|
||||
}
|
||||
|
||||
void __attribute__ ((noreturn))
|
||||
grub_main (void)
|
||||
{
|
||||
grub_addr_t start;
|
||||
grub_size_t sz;
|
||||
grub_addr_t unc_size;
|
||||
grub_efi_boot_services_t *b;
|
||||
grub_efi_status_t status;
|
||||
grub_efi_uintn_t exit_data_size;
|
||||
grub_efi_char16_t *exit_data = 0;
|
||||
grub_efi_handle_t image_handle;
|
||||
grub_efi_loaded_image_t *image;
|
||||
|
||||
b = grub_efi_system_table->boot_services;
|
||||
|
||||
if (!grub_efi_get_section ("payload", &start, &sz)
|
||||
|| sz < 12)
|
||||
grub_exit ();
|
||||
if (grub_memcmp ((void *) start, "COMPRESS", 8) != 0)
|
||||
grub_exit ();
|
||||
unc_size = grub_get_unaligned32 ((char *) start + 8);
|
||||
|
||||
unc_pages = (unc_size + 0xfff) >> 12;
|
||||
|
||||
unc = grub_efi_allocate_pages (0, unc_pages);
|
||||
if (!unc)
|
||||
grub_exit ();
|
||||
|
||||
scratch_pages = 0x200000 >> 12;
|
||||
grub_decompressor_scratch = grub_efi_allocate_pages (0, scratch_pages);
|
||||
if (!grub_decompressor_scratch)
|
||||
grub_exit ();
|
||||
|
||||
grub_decompress_core ((char *) start + 12, unc, sz - 12,
|
||||
unc_size);
|
||||
|
||||
image = grub_efi_get_loaded_image (grub_efi_image_handle);
|
||||
|
||||
status = efi_call_6 (b->load_image, 0, grub_efi_image_handle,
|
||||
image->file_path, unc, unc_size, &image_handle);
|
||||
if (status != GRUB_EFI_SUCCESS)
|
||||
efi_call_4 (grub_efi_system_table->boot_services->exit,
|
||||
grub_efi_image_handle, status, 0, 0);
|
||||
|
||||
status = efi_call_3 (b->start_image, image_handle, &exit_data_size, &exit_data);
|
||||
|
||||
efi_call_4 (grub_efi_system_table->boot_services->exit,
|
||||
grub_efi_image_handle, status, exit_data_size, exit_data);
|
||||
|
||||
grub_exit ();
|
||||
}
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2010,2013 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GRUB is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <grub/types.h>
|
||||
#include <grub/misc.h>
|
||||
#include <grub/decompressor.h>
|
||||
|
||||
void
|
||||
find_scratch (void *src, void *dst, unsigned long srcsize,
|
||||
unsigned long dstsize)
|
||||
{
|
||||
/* Decoding from ROM. */
|
||||
if (((grub_addr_t) src & 0x10000000))
|
||||
{
|
||||
grub_decompressor_scratch = (void *) ALIGN_UP((grub_addr_t) dst + dstsize,
|
||||
256);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((char *) src + srcsize > (char *) dst + dstsize)
|
||||
grub_decompressor_scratch = (void *) ALIGN_UP ((grub_addr_t) src + srcsize,
|
||||
256);
|
||||
else
|
||||
grub_decompressor_scratch = (void *) ALIGN_UP ((grub_addr_t) dst + dstsize,
|
||||
256);
|
||||
return;
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GRUB is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <grub/dl.h>
|
||||
#include <grub/pci.h>
|
||||
#include <grub/mm.h>
|
||||
#include <grub/misc.h>
|
||||
#include <grub/ieee1275/ieee1275.h>
|
||||
|
||||
volatile void *
|
||||
grub_pci_device_map_range (grub_pci_device_t dev __attribute__ ((unused)),
|
||||
grub_addr_t base,
|
||||
grub_size_t size)
|
||||
{
|
||||
if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_REAL_MODE))
|
||||
return (volatile void *) base;
|
||||
if (grub_ieee1275_map (base, base, size, 7))
|
||||
grub_fatal ("couldn't map 0x%lx", base);
|
||||
return (volatile void *) base;
|
||||
}
|
||||
|
||||
void
|
||||
grub_pci_device_unmap_range (grub_pci_device_t dev __attribute__ ((unused)),
|
||||
volatile void *mem __attribute__ ((unused)),
|
||||
grub_size_t size __attribute__ ((unused)))
|
||||
{
|
||||
}
|
||||
@@ -146,7 +146,8 @@ grub_loader_boot (void)
|
||||
return grub_error (GRUB_ERR_NO_KERNEL,
|
||||
N_("you need to load the kernel first"));
|
||||
|
||||
grub_machine_fini (grub_loader_flags);
|
||||
if (grub_loader_flags & GRUB_LOADER_FLAG_NORETURN)
|
||||
grub_machine_fini ();
|
||||
|
||||
for (cur = preboots_head; cur; cur = cur->next)
|
||||
{
|
||||
|
||||
@@ -63,23 +63,17 @@ hextoval (char c)
|
||||
static grub_err_t
|
||||
hash_file (grub_file_t file, const gcry_md_spec_t *hash, void *result)
|
||||
{
|
||||
void *context;
|
||||
grub_uint8_t *readbuf;
|
||||
#define BUF_SIZE 4096
|
||||
readbuf = grub_malloc (BUF_SIZE);
|
||||
if (!readbuf)
|
||||
return grub_errno;
|
||||
context = grub_zalloc (hash->contextsize);
|
||||
if (!readbuf || !context)
|
||||
goto fail;
|
||||
GRUB_PROPERLY_ALIGNED_ARRAY (context, hash->contextsize);
|
||||
grub_uint8_t readbuf[4096];
|
||||
|
||||
grub_memset (context, 0, sizeof (context));
|
||||
hash->init (context);
|
||||
while (1)
|
||||
{
|
||||
grub_ssize_t r;
|
||||
r = grub_file_read (file, readbuf, BUF_SIZE);
|
||||
r = grub_file_read (file, readbuf, sizeof (readbuf));
|
||||
if (r < 0)
|
||||
goto fail;
|
||||
return grub_errno;
|
||||
if (r == 0)
|
||||
break;
|
||||
hash->write (context, readbuf, r);
|
||||
@@ -87,15 +81,7 @@ hash_file (grub_file_t file, const gcry_md_spec_t *hash, void *result)
|
||||
hash->final (context);
|
||||
grub_memcpy (result, hash->read (context), hash->mdlen);
|
||||
|
||||
grub_free (readbuf);
|
||||
grub_free (context);
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
|
||||
fail:
|
||||
grub_free (readbuf);
|
||||
grub_free (context);
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
@@ -104,15 +90,12 @@ check_list (const gcry_md_spec_t *hash, const char *hashfilename,
|
||||
{
|
||||
grub_file_t hashlist, file;
|
||||
char *buf = NULL;
|
||||
grub_uint8_t expected[GRUB_CRYPTO_MAX_MDLEN];
|
||||
grub_uint8_t actual[GRUB_CRYPTO_MAX_MDLEN];
|
||||
grub_uint8_t expected[hash->mdlen];
|
||||
grub_uint8_t actual[hash->mdlen];
|
||||
grub_err_t err;
|
||||
unsigned i;
|
||||
unsigned unread = 0, mismatch = 0;
|
||||
|
||||
if (hash->mdlen > GRUB_CRYPTO_MAX_MDLEN)
|
||||
return grub_error (GRUB_ERR_BUG, "mdlen is too long");
|
||||
|
||||
hashlist = grub_file_open (hashfilename);
|
||||
if (!hashlist)
|
||||
return grub_errno;
|
||||
@@ -222,9 +205,6 @@ grub_cmd_hashsum (struct grub_extcmd_context *ctxt,
|
||||
if (!hash)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, "unknown hash");
|
||||
|
||||
if (hash->mdlen > GRUB_CRYPTO_MAX_MDLEN)
|
||||
return grub_error (GRUB_ERR_BUG, "mdlen is too long");
|
||||
|
||||
if (state[2].set)
|
||||
prefix = state[2].arg;
|
||||
|
||||
@@ -238,7 +218,7 @@ grub_cmd_hashsum (struct grub_extcmd_context *ctxt,
|
||||
|
||||
for (i = 0; i < (unsigned) argc; i++)
|
||||
{
|
||||
GRUB_PROPERLY_ALIGNED_ARRAY (result, GRUB_CRYPTO_MAX_MDLEN);
|
||||
GRUB_PROPERLY_ALIGNED_ARRAY (result, hash->mdlen);
|
||||
grub_file_t file;
|
||||
grub_err_t err;
|
||||
unsigned j;
|
||||
|
||||
@@ -81,25 +81,7 @@ grub_cmd_cmosclean (struct grub_command *cmd __attribute__ ((unused)),
|
||||
return grub_cmos_write (byte, value & (~(1 << bit)));
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_cmd_cmosset (struct grub_command *cmd __attribute__ ((unused)),
|
||||
int argc, char *argv[])
|
||||
{
|
||||
int byte, bit;
|
||||
grub_err_t err;
|
||||
grub_uint8_t value;
|
||||
|
||||
err = parse_args (argc, argv, &byte, &bit);
|
||||
if (err)
|
||||
return err;
|
||||
err = grub_cmos_read (byte, &value);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return grub_cmos_write (byte, value | (1 << bit));
|
||||
}
|
||||
|
||||
static grub_command_t cmd, cmd_clean, cmd_set;
|
||||
static grub_command_t cmd, cmd_clean;
|
||||
|
||||
|
||||
GRUB_MOD_INIT(cmostest)
|
||||
@@ -110,14 +92,10 @@ GRUB_MOD_INIT(cmostest)
|
||||
cmd_clean = grub_register_command ("cmosclean", grub_cmd_cmosclean,
|
||||
N_("BYTE:BIT"),
|
||||
N_("Clean bit at BYTE:BIT in CMOS."));
|
||||
cmd_set = grub_register_command ("cmosset", grub_cmd_cmosset,
|
||||
N_("BYTE:BIT"),
|
||||
N_("Set bit at BYTE:BIT in CMOS."));
|
||||
}
|
||||
|
||||
GRUB_MOD_FINI(cmostest)
|
||||
{
|
||||
grub_unregister_command (cmd);
|
||||
grub_unregister_command (cmd_clean);
|
||||
grub_unregister_command (cmd_set);
|
||||
}
|
||||
|
||||
@@ -553,13 +553,8 @@ check_password_md5_real (const char *entered,
|
||||
grub_size_t enteredlen = grub_strlen (entered);
|
||||
unsigned char alt_result[MD5_HASHLEN];
|
||||
unsigned char *digest;
|
||||
grub_uint8_t *ctx;
|
||||
grub_uint8_t ctx[GRUB_MD_MD5->contextsize];
|
||||
grub_size_t i;
|
||||
int ret;
|
||||
|
||||
ctx = grub_zalloc (GRUB_MD_MD5->contextsize);
|
||||
if (!ctx)
|
||||
return 0;
|
||||
|
||||
GRUB_MD_MD5->init (ctx);
|
||||
GRUB_MD_MD5->write (ctx, entered, enteredlen);
|
||||
@@ -605,9 +600,7 @@ check_password_md5_real (const char *entered,
|
||||
GRUB_MD_MD5->final (ctx);
|
||||
}
|
||||
|
||||
ret = (grub_crypto_memcmp (digest, pw->hash, MD5_HASHLEN) == 0);
|
||||
grub_free (ctx);
|
||||
return ret;
|
||||
return (grub_crypto_memcmp (digest, pw->hash, MD5_HASHLEN) == 0);
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
@@ -730,37 +723,11 @@ grub_cmd_legacy_password (struct grub_command *mycmd __attribute__ ((unused)),
|
||||
NULL);
|
||||
}
|
||||
|
||||
int
|
||||
grub_legacy_check_md5_password (int argc, char **args,
|
||||
char *entered)
|
||||
{
|
||||
struct legacy_md5_password *pw = NULL;
|
||||
int ret;
|
||||
|
||||
if (args[0][0] != '-' || args[0][1] != '-')
|
||||
{
|
||||
char correct[GRUB_AUTH_MAX_PASSLEN];
|
||||
|
||||
grub_memset (correct, 0, sizeof (correct));
|
||||
grub_strncpy (correct, args[0], sizeof (correct));
|
||||
|
||||
return grub_crypto_memcmp (entered, correct, GRUB_AUTH_MAX_PASSLEN) == 0;
|
||||
}
|
||||
|
||||
pw = parse_legacy_md5 (argc, args);
|
||||
|
||||
if (!pw)
|
||||
return 0;
|
||||
|
||||
ret = check_password_md5_real (entered, pw);
|
||||
grub_free (pw);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_cmd_legacy_check_password (struct grub_command *mycmd __attribute__ ((unused)),
|
||||
int argc, char **args)
|
||||
{
|
||||
struct legacy_md5_password *pw = NULL;
|
||||
char entered[GRUB_AUTH_MAX_PASSLEN];
|
||||
|
||||
if (argc == 0)
|
||||
@@ -769,8 +736,24 @@ grub_cmd_legacy_check_password (struct grub_command *mycmd __attribute__ ((unuse
|
||||
if (!grub_password_get (entered, GRUB_AUTH_MAX_PASSLEN))
|
||||
return GRUB_ACCESS_DENIED;
|
||||
|
||||
if (!grub_legacy_check_md5_password (argc, args,
|
||||
entered))
|
||||
if (args[0][0] != '-' || args[0][1] != '-')
|
||||
{
|
||||
char correct[GRUB_AUTH_MAX_PASSLEN];
|
||||
|
||||
grub_memset (correct, 0, sizeof (correct));
|
||||
grub_strncpy (correct, args[0], sizeof (correct));
|
||||
|
||||
if (grub_crypto_memcmp (entered, correct, GRUB_AUTH_MAX_PASSLEN) != 0)
|
||||
return GRUB_ACCESS_DENIED;
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
pw = parse_legacy_md5 (argc, args);
|
||||
|
||||
if (!pw)
|
||||
return GRUB_ACCESS_DENIED;
|
||||
|
||||
if (!check_password_md5_real (entered, pw))
|
||||
return GRUB_ACCESS_DENIED;
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
|
||||
@@ -70,12 +70,12 @@ get_uuid (const char *name, char **uuid, int getnative)
|
||||
case GRUB_DISK_DEVICE_ARCDISK_ID:
|
||||
case GRUB_DISK_DEVICE_HOSTDISK_ID:
|
||||
case GRUB_DISK_DEVICE_UBOOTDISK_ID:
|
||||
case GRUB_DISK_DEVICE_SRMDISK_ID:
|
||||
break;
|
||||
|
||||
/* Native disks. */
|
||||
case GRUB_DISK_DEVICE_ATA_ID:
|
||||
case GRUB_DISK_DEVICE_SCSI_ID:
|
||||
case GRUB_DISK_DEVICE_XEN:
|
||||
if (getnative)
|
||||
break;
|
||||
|
||||
|
||||
@@ -192,39 +192,22 @@ free_pk (struct grub_public_key *pk)
|
||||
struct grub_public_subkey *nsk, *sk;
|
||||
for (sk = pk->subkeys; sk; sk = nsk)
|
||||
{
|
||||
grub_size_t i;
|
||||
for (i = 0; i < ARRAY_SIZE (sk->mpis); i++)
|
||||
if (sk->mpis[i])
|
||||
gcry_mpi_release (sk->mpis[i]);
|
||||
nsk = sk->next;
|
||||
grub_free (sk);
|
||||
}
|
||||
grub_free (pk);
|
||||
}
|
||||
|
||||
#define READBUF_SIZE 4096
|
||||
|
||||
struct grub_public_key *
|
||||
grub_load_public_key (grub_file_t f)
|
||||
{
|
||||
grub_err_t err;
|
||||
struct grub_public_key *ret;
|
||||
struct grub_public_subkey **last = 0;
|
||||
void *fingerprint_context = NULL;
|
||||
grub_uint8_t *buffer = NULL;
|
||||
|
||||
ret = grub_zalloc (sizeof (*ret));
|
||||
if (!ret)
|
||||
{
|
||||
grub_free (fingerprint_context);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
buffer = grub_zalloc (READBUF_SIZE);
|
||||
fingerprint_context = grub_zalloc (GRUB_MD_SHA1->contextsize);
|
||||
|
||||
if (!buffer || !fingerprint_context)
|
||||
goto fail;
|
||||
return NULL;
|
||||
|
||||
last = &ret->subkeys;
|
||||
|
||||
@@ -238,6 +221,7 @@ grub_load_public_key (grub_file_t f)
|
||||
struct grub_public_subkey *sk;
|
||||
grub_size_t i;
|
||||
grub_uint16_t len_be;
|
||||
GRUB_PROPERLY_ALIGNED_ARRAY (fingerprint_context, GRUB_MD_SHA1->contextsize);
|
||||
|
||||
err = read_packet_header (f, &type, &len);
|
||||
|
||||
@@ -246,11 +230,7 @@ grub_load_public_key (grub_file_t f)
|
||||
if (type == 0xfe)
|
||||
continue;
|
||||
if (type == 0xff)
|
||||
{
|
||||
grub_free (fingerprint_context);
|
||||
grub_free (buffer);
|
||||
return ret;
|
||||
}
|
||||
return ret;
|
||||
|
||||
grub_dprintf ("crypt", "len = %x\n", (int) len);
|
||||
|
||||
@@ -314,6 +294,7 @@ grub_load_public_key (grub_file_t f)
|
||||
{
|
||||
grub_uint16_t l;
|
||||
grub_size_t lb;
|
||||
grub_uint8_t buffer[4096];
|
||||
if (grub_file_read (f, &l, sizeof (l)) != sizeof (l))
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
@@ -321,7 +302,7 @@ grub_load_public_key (grub_file_t f)
|
||||
}
|
||||
|
||||
lb = (grub_be_to_cpu16 (l) + GRUB_CHAR_BIT - 1) / GRUB_CHAR_BIT;
|
||||
if (lb > READBUF_SIZE - sizeof (grub_uint16_t))
|
||||
if (lb > sizeof (buffer) - sizeof (grub_uint16_t))
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
goto fail;
|
||||
@@ -356,8 +337,6 @@ grub_load_public_key (grub_file_t f)
|
||||
}
|
||||
fail:
|
||||
free_pk (ret);
|
||||
grub_free (fingerprint_context);
|
||||
grub_free (buffer);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -485,7 +464,7 @@ grub_verify_signature_real (char *buf, grub_size_t size,
|
||||
grub_dprintf ("crypt", "alive\n");
|
||||
|
||||
{
|
||||
void *context = NULL;
|
||||
GRUB_PROPERLY_ALIGNED_ARRAY (context, hash->contextsize);
|
||||
unsigned char *hval;
|
||||
grub_ssize_t rem = grub_be_to_cpu16 (v4.hashed_sub);
|
||||
grub_uint32_t headlen = grub_cpu_to_be32 (rem + 6);
|
||||
@@ -496,22 +475,18 @@ grub_verify_signature_real (char *buf, grub_size_t size,
|
||||
gcry_mpi_t hmpi;
|
||||
grub_uint64_t keyid = 0;
|
||||
struct grub_public_subkey *sk;
|
||||
grub_uint8_t *readbuf = NULL;
|
||||
|
||||
context = grub_zalloc (hash->contextsize);
|
||||
readbuf = grub_zalloc (READBUF_SIZE);
|
||||
if (!context || !readbuf)
|
||||
goto fail;
|
||||
|
||||
grub_memset (context, 0, sizeof (context));
|
||||
hash->init (context);
|
||||
if (buf)
|
||||
hash->write (context, buf, size);
|
||||
else
|
||||
while (1)
|
||||
{
|
||||
r = grub_file_read (f, readbuf, READBUF_SIZE);
|
||||
grub_uint8_t readbuf[4096];
|
||||
r = grub_file_read (f, readbuf, sizeof (readbuf));
|
||||
if (r < 0)
|
||||
goto fail;
|
||||
return grub_errno;
|
||||
if (r == 0)
|
||||
break;
|
||||
hash->write (context, readbuf, r);
|
||||
@@ -521,10 +496,10 @@ grub_verify_signature_real (char *buf, grub_size_t size,
|
||||
hash->write (context, &v4, sizeof (v4));
|
||||
while (rem)
|
||||
{
|
||||
r = grub_file_read (sig, readbuf,
|
||||
rem < READBUF_SIZE ? rem : READBUF_SIZE);
|
||||
grub_uint8_t readbuf[4096];
|
||||
r = grub_file_read (sig, readbuf, rem < (grub_ssize_t) sizeof (readbuf) ? rem : (grub_ssize_t) sizeof (readbuf));
|
||||
if (r < 0)
|
||||
goto fail;
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
if (r == 0)
|
||||
break;
|
||||
hash->write (context, readbuf, r);
|
||||
@@ -536,16 +511,17 @@ grub_verify_signature_real (char *buf, grub_size_t size,
|
||||
hash->write (context, &headlen, sizeof (headlen));
|
||||
r = grub_file_read (sig, &unhashed_sub, sizeof (unhashed_sub));
|
||||
if (r != sizeof (unhashed_sub))
|
||||
goto fail;
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
{
|
||||
grub_uint8_t readbuf[4096];
|
||||
grub_uint8_t *ptr;
|
||||
grub_uint32_t l;
|
||||
rem = grub_be_to_cpu16 (unhashed_sub);
|
||||
if (rem > READBUF_SIZE)
|
||||
goto fail;
|
||||
if (rem > (int) sizeof (readbuf))
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
r = grub_file_read (sig, readbuf, rem);
|
||||
if (r != rem)
|
||||
goto fail;
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
for (ptr = readbuf; ptr < readbuf + rem; ptr += l)
|
||||
{
|
||||
if (*ptr < 192)
|
||||
@@ -576,9 +552,9 @@ grub_verify_signature_real (char *buf, grub_size_t size,
|
||||
hval = hash->read (context);
|
||||
|
||||
if (grub_file_read (sig, hash_start, sizeof (hash_start)) != sizeof (hash_start))
|
||||
goto fail;
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
if (grub_memcmp (hval, hash_start, sizeof (hash_start)) != 0)
|
||||
goto fail;
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
|
||||
grub_dprintf ("crypt", "@ %x\n", (int)grub_file_tell (sig));
|
||||
|
||||
@@ -586,24 +562,25 @@ grub_verify_signature_real (char *buf, grub_size_t size,
|
||||
{
|
||||
grub_uint16_t l;
|
||||
grub_size_t lb;
|
||||
grub_uint8_t buffer[4096];
|
||||
grub_dprintf ("crypt", "alive\n");
|
||||
if (grub_file_read (sig, &l, sizeof (l)) != sizeof (l))
|
||||
goto fail;
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
grub_dprintf ("crypt", "alive\n");
|
||||
lb = (grub_be_to_cpu16 (l) + 7) / 8;
|
||||
grub_dprintf ("crypt", "l = 0x%04x\n", grub_be_to_cpu16 (l));
|
||||
if (lb > READBUF_SIZE - sizeof (grub_uint16_t))
|
||||
goto fail;
|
||||
if (lb > sizeof (buffer) - sizeof (grub_uint16_t))
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
grub_dprintf ("crypt", "alive\n");
|
||||
if (grub_file_read (sig, readbuf + sizeof (grub_uint16_t), lb) != (grub_ssize_t) lb)
|
||||
goto fail;
|
||||
if (grub_file_read (sig, buffer + sizeof (grub_uint16_t), lb) != (grub_ssize_t) lb)
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
grub_dprintf ("crypt", "alive\n");
|
||||
grub_memcpy (readbuf, &l, sizeof (l));
|
||||
grub_memcpy (buffer, &l, sizeof (l));
|
||||
grub_dprintf ("crypt", "alive\n");
|
||||
|
||||
if (gcry_mpi_scan (&mpis[i], GCRYMPI_FMT_PGP,
|
||||
readbuf, lb + sizeof (grub_uint16_t), 0))
|
||||
goto fail;
|
||||
buffer, lb + sizeof (grub_uint16_t), 0))
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
grub_dprintf ("crypt", "alive\n");
|
||||
}
|
||||
|
||||
@@ -612,42 +589,18 @@ grub_verify_signature_real (char *buf, grub_size_t size,
|
||||
else
|
||||
sk = grub_crypto_pk_locate_subkey_in_trustdb (keyid);
|
||||
if (!sk)
|
||||
{
|
||||
/* TRANSLATORS: %08x is 32-bit key id. */
|
||||
grub_error (GRUB_ERR_BAD_SIGNATURE, N_("public key %08x not found"),
|
||||
keyid);
|
||||
goto fail;
|
||||
}
|
||||
/* TRANSLATORS: %08x is 32-bit key id. */
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("public key %08x not found"), keyid);
|
||||
|
||||
if (pkalgos[pk].pad (&hmpi, hval, hash, sk))
|
||||
goto fail;
|
||||
if (!*pkalgos[pk].algo)
|
||||
{
|
||||
grub_dl_load (pkalgos[pk].module);
|
||||
grub_errno = GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
if (!*pkalgos[pk].algo)
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_SIGNATURE, N_("module `%s' isn't loaded"),
|
||||
pkalgos[pk].module);
|
||||
goto fail;
|
||||
}
|
||||
if ((*pkalgos[pk].algo)->verify (0, hmpi, mpis, sk->mpis, 0, 0))
|
||||
goto fail;
|
||||
|
||||
grub_free (context);
|
||||
grub_free (readbuf);
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
|
||||
fail:
|
||||
grub_free (context);
|
||||
grub_free (readbuf);
|
||||
if (!grub_errno)
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
return grub_errno;
|
||||
if (!*pkalgos[pk].algo)
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("module `%s' isn't loaded"), pkalgos[pk].module);
|
||||
if ((*pkalgos[pk].algo)->verify (0, hmpi, mpis, sk->mpis, 0, 0))
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
}
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
grub_err_t
|
||||
@@ -744,8 +697,8 @@ static grub_err_t
|
||||
grub_cmd_verify_signature (grub_extcmd_context_t ctxt,
|
||||
int argc, char **args)
|
||||
{
|
||||
grub_file_t f = NULL, sig = NULL;
|
||||
grub_err_t err = GRUB_ERR_NONE;
|
||||
grub_file_t f, sig;
|
||||
grub_err_t err;
|
||||
struct grub_public_key *pk = NULL;
|
||||
|
||||
grub_dprintf ("crypt", "alive\n");
|
||||
@@ -776,27 +729,19 @@ grub_cmd_verify_signature (grub_extcmd_context_t ctxt,
|
||||
grub_file_filter_disable_all ();
|
||||
f = grub_file_open (args[0]);
|
||||
if (!f)
|
||||
{
|
||||
err = grub_errno;
|
||||
goto fail;
|
||||
}
|
||||
return grub_errno;
|
||||
|
||||
grub_file_filter_disable_all ();
|
||||
sig = grub_file_open (args[1]);
|
||||
if (!sig)
|
||||
{
|
||||
err = grub_errno;
|
||||
goto fail;
|
||||
grub_file_close (f);
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
err = grub_verify_signature (f, sig, pk);
|
||||
fail:
|
||||
if (sig)
|
||||
grub_file_close (sig);
|
||||
if (f)
|
||||
grub_file_close (f);
|
||||
if (pk)
|
||||
free_pk (pk);
|
||||
grub_file_close (f);
|
||||
grub_file_close (sig);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,90 +0,0 @@
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2011 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GRUB is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <grub/dl.h>
|
||||
#include <grub/misc.h>
|
||||
#include <grub/command.h>
|
||||
#include <grub/i18n.h>
|
||||
#include <grub/xen.h>
|
||||
#include <grub/term.h>
|
||||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
static int
|
||||
hook (const char *dir, void *hook_data __attribute__ ((unused)))
|
||||
{
|
||||
grub_printf ("%s\n", dir);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_cmd_lsxen (grub_command_t cmd __attribute__ ((unused)),
|
||||
int argc, char **args)
|
||||
{
|
||||
char *dir;
|
||||
grub_err_t err;
|
||||
char *buf;
|
||||
|
||||
if (argc >= 1)
|
||||
return grub_xenstore_dir (args[0], hook, NULL);
|
||||
|
||||
buf = grub_xenstore_get_file ("domid", NULL);
|
||||
if (!buf)
|
||||
return grub_errno;
|
||||
dir = grub_xasprintf ("/local/domain/%s", buf);
|
||||
grub_free (buf);
|
||||
err = grub_xenstore_dir (dir, hook, NULL);
|
||||
grub_free (dir);
|
||||
return err;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_cmd_catxen (grub_command_t cmd __attribute__ ((unused)),
|
||||
int argc, char **args)
|
||||
{
|
||||
const char *dir = "domid";
|
||||
char *buf;
|
||||
|
||||
if (argc >= 1)
|
||||
dir = args[0];
|
||||
|
||||
buf = grub_xenstore_get_file (dir, NULL);
|
||||
if (!buf)
|
||||
return grub_errno;
|
||||
grub_xputs (buf);
|
||||
grub_xputs ("\n");
|
||||
grub_free (buf);
|
||||
return GRUB_ERR_NONE;
|
||||
|
||||
}
|
||||
|
||||
static grub_command_t cmd_ls, cmd_cat;
|
||||
|
||||
GRUB_MOD_INIT (lsxen)
|
||||
{
|
||||
cmd_ls = grub_register_command ("xen_ls", grub_cmd_lsxen, "[DIR]",
|
||||
N_("List XEN storage."));
|
||||
cmd_cat = grub_register_command ("xen_cat", grub_cmd_catxen, "[DIR]",
|
||||
N_("List XEN storage."));
|
||||
}
|
||||
|
||||
GRUB_MOD_FINI (lsxen)
|
||||
{
|
||||
grub_unregister_command (cmd_ls);
|
||||
grub_unregister_command (cmd_cat);
|
||||
}
|
||||
@@ -50,7 +50,7 @@ grub_cmd_xnu_uuid (grub_command_t cmd __attribute__ ((unused)),
|
||||
grub_uint8_t *xnu_uuid;
|
||||
char uuid_string[sizeof ("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")];
|
||||
char *ptr;
|
||||
void *ctx;
|
||||
grub_uint8_t ctx[GRUB_MD_MD5->contextsize];
|
||||
int low = 0;
|
||||
|
||||
if (argc < 1)
|
||||
@@ -65,14 +65,11 @@ grub_cmd_xnu_uuid (grub_command_t cmd __attribute__ ((unused)),
|
||||
|
||||
serial = grub_cpu_to_be64 (grub_strtoull (args[0], 0, 16));
|
||||
|
||||
ctx = grub_zalloc (GRUB_MD_MD5->contextsize);
|
||||
if (!ctx)
|
||||
return grub_errno;
|
||||
GRUB_MD_MD5->init (ctx);
|
||||
GRUB_MD_MD5->write (ctx, hash_prefix, sizeof (hash_prefix));
|
||||
GRUB_MD_MD5->write (ctx, &serial, sizeof (serial));
|
||||
GRUB_MD_MD5->final (ctx);
|
||||
xnu_uuid = GRUB_MD_MD5->read (ctx);
|
||||
GRUB_MD_MD5->init (&ctx);
|
||||
GRUB_MD_MD5->write (&ctx, hash_prefix, sizeof (hash_prefix));
|
||||
GRUB_MD_MD5->write (&ctx, &serial, sizeof (serial));
|
||||
GRUB_MD_MD5->final (&ctx);
|
||||
xnu_uuid = GRUB_MD_MD5->read (&ctx);
|
||||
|
||||
grub_snprintf (uuid_string, sizeof (uuid_string),
|
||||
"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
|
||||
@@ -94,8 +91,6 @@ grub_cmd_xnu_uuid (grub_command_t cmd __attribute__ ((unused)),
|
||||
if (argc > 1)
|
||||
grub_env_set (args[1], uuid_string);
|
||||
|
||||
grub_free (ctx);
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
|
||||
@@ -37,8 +37,8 @@ diffuse (const gcry_md_spec_t * hash, grub_uint8_t * src,
|
||||
|
||||
grub_size_t fullblocks = size / hash->mdlen;
|
||||
int padding = size % hash->mdlen;
|
||||
grub_uint8_t final[GRUB_CRYPTO_MAX_MDLEN];
|
||||
grub_uint8_t temp[sizeof (IV) + GRUB_CRYPTO_MAX_MDLEN];
|
||||
grub_uint8_t final[hash->mdlen];
|
||||
grub_uint8_t temp[sizeof (IV) + hash->mdlen];
|
||||
|
||||
/* hash block the whole data set with different IVs to produce
|
||||
* more than just a single data block
|
||||
@@ -76,9 +76,6 @@ AF_merge (const gcry_md_spec_t * hash, grub_uint8_t * src, grub_uint8_t * dst,
|
||||
if (bufblock == NULL)
|
||||
return GPG_ERR_OUT_OF_MEMORY;
|
||||
|
||||
if (hash->mdlen > GRUB_CRYPTO_MAX_MDLEN)
|
||||
return GPG_ERR_INV_ARG;
|
||||
|
||||
grub_memset (bufblock, 0, blocksize);
|
||||
for (i = 0; i < blocknumbers - 1; i++)
|
||||
{
|
||||
|
||||
240
grub-core/disk/alpha/srm/srmdisk.c
Normal file
240
grub-core/disk/alpha/srm/srmdisk.c
Normal file
@@ -0,0 +1,240 @@
|
||||
/* ofdisk.c - Open Firmware disk access. */
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2004,2006,2007,2008,2009,2011 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GRUB is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <grub/misc.h>
|
||||
#include <grub/disk.h>
|
||||
#include <grub/mm.h>
|
||||
#include <grub/alpha/srm/srm.h>
|
||||
|
||||
static grub_srm_fileno_t last_handle = 0;
|
||||
static char *last_path = NULL;
|
||||
|
||||
static int lnum = 0;
|
||||
|
||||
struct srmdisk_hash_ent
|
||||
{
|
||||
char *devpath;
|
||||
int num;
|
||||
struct srmdisk_hash_ent *next;
|
||||
};
|
||||
|
||||
#define SRMDISK_HASH_SZ 8
|
||||
static struct srmdisk_hash_ent *srmdisk_hash[SRMDISK_HASH_SZ];
|
||||
|
||||
static int
|
||||
srmdisk_hash_fn (const char *devpath)
|
||||
{
|
||||
int hash = 0;
|
||||
while (*devpath)
|
||||
hash ^= *devpath++;
|
||||
return (hash & (SRMDISK_HASH_SZ - 1));
|
||||
}
|
||||
|
||||
static struct srmdisk_hash_ent *
|
||||
srmdisk_hash_find (const char *devpath)
|
||||
{
|
||||
struct srmdisk_hash_ent *p = srmdisk_hash[srmdisk_hash_fn (devpath)];
|
||||
|
||||
while (p)
|
||||
{
|
||||
if (!grub_strcmp (p->devpath, devpath))
|
||||
break;
|
||||
p = p->next;
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
static struct srmdisk_hash_ent *
|
||||
srmdisk_hash_add (char *devpath)
|
||||
{
|
||||
struct srmdisk_hash_ent *p;
|
||||
struct srmdisk_hash_ent **head = &srmdisk_hash[srmdisk_hash_fn(devpath)];
|
||||
|
||||
p = grub_malloc (sizeof (*p));
|
||||
if (!p)
|
||||
return NULL;
|
||||
|
||||
p->devpath = devpath;
|
||||
p->next = *head;
|
||||
p->num = lnum++;
|
||||
*head = p;
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
grub_srmdisk_iterate (grub_disk_dev_iterate_hook_t hook, void *hook_data,
|
||||
grub_disk_pull_t pull)
|
||||
{
|
||||
(void) hook;
|
||||
(void) pull;
|
||||
(void) hook_data;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
reopen (const char *name)
|
||||
{
|
||||
grub_uint64_t r;
|
||||
|
||||
if (last_path && grub_strcmp (last_path, name) == 0)
|
||||
{
|
||||
grub_dprintf ("srmdisk", "using already opened %s\n", name);
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
if (last_path)
|
||||
{
|
||||
grub_alpha_srm_dispatch (GRUB_ALPHA_SRM_CLOSE, last_handle);
|
||||
grub_free (last_path);
|
||||
last_path = NULL;
|
||||
last_handle = 0;
|
||||
}
|
||||
|
||||
grub_dprintf ("srmdisk", "opening %s\n", name);
|
||||
r = grub_alpha_srm_dispatch (GRUB_ALPHA_SRM_OPEN, name, grub_strlen (name));
|
||||
grub_printf ("<%lx>", r);
|
||||
while (1);
|
||||
if (r & (1ULL << 63))
|
||||
{
|
||||
grub_dprintf ("srmdisk", "couldn't open %s\n", name);
|
||||
return grub_error (GRUB_ERR_IO, "couldn't open %s", name);
|
||||
}
|
||||
last_path = grub_strdup (name);
|
||||
if (!last_path)
|
||||
return grub_errno;
|
||||
last_handle = r & 0xffffffff;
|
||||
grub_dprintf ("srmdisk", "opened %s\n", name);
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_srmdisk_open (const char *name, grub_disk_t disk)
|
||||
{
|
||||
char *fullname;
|
||||
grub_err_t err;
|
||||
struct srmdisk_hash_ent *hash;
|
||||
|
||||
if (grub_memcmp (name, "srm/", 4) != 0)
|
||||
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "not srm device");
|
||||
fullname = grub_strdup (name + 4);
|
||||
if (!fullname)
|
||||
return grub_errno;
|
||||
disk->data = fullname;
|
||||
grub_dprintf ("srmdisk", "opening %s\n", fullname);
|
||||
|
||||
hash = srmdisk_hash_find (fullname);
|
||||
if (!hash)
|
||||
hash = srmdisk_hash_add (fullname);
|
||||
if (!hash)
|
||||
return grub_errno;
|
||||
|
||||
err = reopen (fullname);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
{
|
||||
grub_uint64_t res = 0;
|
||||
int i;
|
||||
|
||||
/* FIXME: findout the block size. */
|
||||
for (i = 31; i >= 0; i--)
|
||||
{
|
||||
char buf[512];
|
||||
grub_dprintf ("srmdisk",
|
||||
"seek to 0x%" PRIxGRUB_UINT64_T "\n",
|
||||
res | (1UL << i));
|
||||
if (grub_alpha_srm_dispatch (GRUB_ALPHA_SRM_READ, last_handle, 512,
|
||||
buf, res | (1ULL << i)) & (1ULL << 63))
|
||||
continue;
|
||||
res |= (1ULL << i);
|
||||
}
|
||||
grub_dprintf ("srmdisk",
|
||||
"determined disk size 0x%" PRIxGRUB_UINT64_T "\n", res);
|
||||
disk->total_sectors = res;
|
||||
}
|
||||
|
||||
disk->id = hash->num;
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static void
|
||||
grub_srmdisk_close (grub_disk_t disk)
|
||||
{
|
||||
grub_free (disk->data);
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_srmdisk_read (grub_disk_t disk, grub_disk_addr_t sector,
|
||||
grub_size_t size, char *buf)
|
||||
{
|
||||
grub_err_t err;
|
||||
|
||||
err = reopen (disk->data);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/* FIXME: handle incomplete read. */
|
||||
if (grub_alpha_srm_dispatch (GRUB_ALPHA_SRM_READ, last_handle,
|
||||
size << 9,
|
||||
buf, sector) & (1ULL << 63))
|
||||
return grub_error (GRUB_ERR_READ_ERROR, "read failed");
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_srmdisk_write (grub_disk_t disk __attribute ((unused)),
|
||||
grub_disk_addr_t sector __attribute ((unused)),
|
||||
grub_size_t size __attribute ((unused)),
|
||||
const char *buf __attribute ((unused)))
|
||||
{
|
||||
return GRUB_ERR_NOT_IMPLEMENTED_YET;
|
||||
}
|
||||
|
||||
static struct grub_disk_dev grub_srmdisk_dev =
|
||||
{
|
||||
.name = "srmdisk",
|
||||
.id = GRUB_DISK_DEVICE_SRMDISK_ID,
|
||||
.iterate = grub_srmdisk_iterate,
|
||||
.open = grub_srmdisk_open,
|
||||
.close = grub_srmdisk_close,
|
||||
.read = grub_srmdisk_read,
|
||||
.write = grub_srmdisk_write,
|
||||
.next = 0
|
||||
};
|
||||
|
||||
void
|
||||
grub_srmdisk_init (void)
|
||||
{
|
||||
grub_disk_dev_register (&grub_srmdisk_dev);
|
||||
}
|
||||
|
||||
void
|
||||
grub_srmdisk_fini (void)
|
||||
{
|
||||
if (last_path)
|
||||
{
|
||||
grub_alpha_srm_dispatch (GRUB_ALPHA_SRM_CLOSE, last_handle);
|
||||
grub_free (last_path);
|
||||
last_path = NULL;
|
||||
last_handle = 0;
|
||||
}
|
||||
|
||||
grub_disk_dev_unregister (&grub_srmdisk_dev);
|
||||
}
|
||||
1
grub-core/disk/alpha/srm/srmdisk.txt
Normal file
1
grub-core/disk/alpha/srm/srmdisk.txt
Normal file
@@ -0,0 +1 @@
|
||||
SCSI 0 1004 0 2 200 0 0
|
||||
@@ -109,9 +109,7 @@ grub_crypto_pcbc_decrypt (grub_crypto_cipher_handle_t cipher,
|
||||
void *iv)
|
||||
{
|
||||
grub_uint8_t *inptr, *outptr, *end;
|
||||
grub_uint8_t ivt[GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE];
|
||||
if (cipher->cipher->blocksize > GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE)
|
||||
return GPG_ERR_INV_ARG;
|
||||
grub_uint8_t ivt[cipher->cipher->blocksize];
|
||||
if (!cipher->cipher->decrypt)
|
||||
return GPG_ERR_NOT_SUPPORTED;
|
||||
if (size % cipher->cipher->blocksize != 0)
|
||||
@@ -134,9 +132,7 @@ grub_crypto_pcbc_encrypt (grub_crypto_cipher_handle_t cipher,
|
||||
void *iv)
|
||||
{
|
||||
grub_uint8_t *inptr, *outptr, *end;
|
||||
grub_uint8_t ivt[GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE];
|
||||
if (cipher->cipher->blocksize > GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE)
|
||||
return GPG_ERR_INV_ARG;
|
||||
grub_uint8_t ivt[cipher->cipher->blocksize];
|
||||
if (!cipher->cipher->decrypt)
|
||||
return GPG_ERR_NOT_SUPPORTED;
|
||||
if (size % cipher->cipher->blocksize != 0)
|
||||
@@ -222,9 +218,6 @@ grub_cryptodisk_endecrypt (struct grub_cryptodisk *dev,
|
||||
grub_size_t i;
|
||||
gcry_err_code_t err;
|
||||
|
||||
if (dev->cipher->cipher->blocksize > GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE)
|
||||
return GPG_ERR_INV_ARG;
|
||||
|
||||
/* The only mode without IV. */
|
||||
if (dev->mode == GRUB_CRYPTODISK_MODE_ECB && !dev->rekey)
|
||||
return (do_encrypt ? grub_crypto_ecb_encrypt (dev->cipher, data, data, len)
|
||||
@@ -235,7 +228,7 @@ grub_cryptodisk_endecrypt (struct grub_cryptodisk *dev,
|
||||
grub_size_t sz = ((dev->cipher->cipher->blocksize
|
||||
+ sizeof (grub_uint32_t) - 1)
|
||||
/ sizeof (grub_uint32_t));
|
||||
grub_uint32_t iv[(GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE + 3) / 4];
|
||||
grub_uint32_t iv[sz];
|
||||
|
||||
if (dev->rekey)
|
||||
{
|
||||
@@ -249,7 +242,7 @@ grub_cryptodisk_endecrypt (struct grub_cryptodisk *dev,
|
||||
}
|
||||
}
|
||||
|
||||
grub_memset (iv, 0, sizeof (iv));
|
||||
grub_memset (iv, 0, sz * sizeof (iv[0]));
|
||||
switch (dev->mode_iv)
|
||||
{
|
||||
case GRUB_CRYPTODISK_MODE_IV_NULL:
|
||||
@@ -257,11 +250,9 @@ grub_cryptodisk_endecrypt (struct grub_cryptodisk *dev,
|
||||
case GRUB_CRYPTODISK_MODE_IV_BYTECOUNT64_HASH:
|
||||
{
|
||||
grub_uint64_t tmp;
|
||||
void *ctx;
|
||||
GRUB_PROPERLY_ALIGNED_ARRAY (ctx, dev->iv_hash->contextsize);
|
||||
|
||||
ctx = grub_zalloc (dev->iv_hash->contextsize);
|
||||
if (!ctx)
|
||||
return GPG_ERR_OUT_OF_MEMORY;
|
||||
grub_memset (ctx, 0, sizeof (ctx));
|
||||
|
||||
tmp = grub_cpu_to_le64 (sector << dev->log_sector_size);
|
||||
dev->iv_hash->init (ctx);
|
||||
@@ -270,7 +261,6 @@ grub_cryptodisk_endecrypt (struct grub_cryptodisk *dev,
|
||||
dev->iv_hash->final (ctx);
|
||||
|
||||
grub_memcpy (iv, dev->iv_hash->read (ctx), sizeof (iv));
|
||||
grub_free (ctx);
|
||||
}
|
||||
break;
|
||||
case GRUB_CRYPTODISK_MODE_IV_PLAIN64:
|
||||
@@ -417,9 +407,7 @@ grub_cryptodisk_setkey (grub_cryptodisk_t dev, grub_uint8_t *key, grub_size_t ke
|
||||
if (dev->mode_iv == GRUB_CRYPTODISK_MODE_IV_ESSIV)
|
||||
{
|
||||
grub_size_t essiv_keysize = dev->essiv_hash->mdlen;
|
||||
grub_uint8_t hashed_key[GRUB_CRYPTO_MAX_MDLEN];
|
||||
if (essiv_keysize > GRUB_CRYPTO_MAX_MDLEN)
|
||||
return GPG_ERR_INV_ARG;
|
||||
grub_uint8_t hashed_key[essiv_keysize];
|
||||
|
||||
grub_crypto_hash (dev->essiv_hash, hashed_key, key, keysize);
|
||||
err = grub_crypto_cipher_set_key (dev->essiv_cipher,
|
||||
@@ -1011,14 +999,12 @@ hex (grub_uint8_t val)
|
||||
|
||||
/* Open a file named NAME and initialize FILE. */
|
||||
static char *
|
||||
luks_script_get (grub_size_t *sz)
|
||||
luks_script_get (void)
|
||||
{
|
||||
grub_cryptodisk_t i;
|
||||
grub_size_t size = 0;
|
||||
char *ptr, *ret;
|
||||
|
||||
*sz = 0;
|
||||
|
||||
for (i = cryptodisk_list; i != NULL; i = i->next)
|
||||
if (grub_strcmp (i->modname, "luks") == 0)
|
||||
{
|
||||
@@ -1100,7 +1086,6 @@ luks_script_get (grub_size_t *sz)
|
||||
*ptr++ = '\n';
|
||||
}
|
||||
*ptr = '\0';
|
||||
*sz = ptr - ret;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -934,7 +934,7 @@ grub_diskfilter_make_raid (grub_size_t uuidlen, char *uuid, int nmemb,
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
totsize = (nmemb - ((unsigned) level / 3U)) * disk_size;
|
||||
totsize = (nmemb - level / 3) * disk_size;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
@@ -146,10 +146,7 @@ geli_rekey (struct grub_cryptodisk *dev, grub_uint64_t zoneno)
|
||||
grub_uint64_t zone;
|
||||
} __attribute__ ((packed)) tohash
|
||||
= { {'e', 'k', 'e', 'y'}, grub_cpu_to_le64 (zoneno) };
|
||||
GRUB_PROPERLY_ALIGNED_ARRAY (key, GRUB_CRYPTO_MAX_MDLEN);
|
||||
|
||||
if (dev->hash->mdlen > GRUB_CRYPTO_MAX_MDLEN)
|
||||
return GPG_ERR_INV_ARG;
|
||||
GRUB_PROPERLY_ALIGNED_ARRAY (key, dev->hash->mdlen);
|
||||
|
||||
grub_dprintf ("geli", "rekeying %" PRIuGRUB_UINT64_T " keysize=%d\n",
|
||||
zoneno, dev->rekey_derived_size);
|
||||
@@ -166,13 +163,11 @@ static inline gcry_err_code_t
|
||||
make_uuid (const struct grub_geli_phdr *header,
|
||||
char *uuid)
|
||||
{
|
||||
grub_uint8_t uuidbin[GRUB_CRYPTODISK_MAX_UUID_LENGTH];
|
||||
grub_uint8_t uuidbin[GRUB_MD_SHA256->mdlen];
|
||||
gcry_err_code_t err;
|
||||
grub_uint8_t *iptr;
|
||||
char *optr;
|
||||
|
||||
if (2 * GRUB_MD_SHA256->mdlen + 1 > GRUB_CRYPTODISK_MAX_UUID_LENGTH)
|
||||
return GPG_ERR_TOO_LARGE;
|
||||
err = grub_crypto_hmac_buffer (GRUB_MD_SHA256,
|
||||
header->salt, sizeof (header->salt),
|
||||
"uuid", sizeof ("uuid") - 1, uuidbin);
|
||||
@@ -180,7 +175,7 @@ make_uuid (const struct grub_geli_phdr *header,
|
||||
return err;
|
||||
|
||||
optr = uuid;
|
||||
for (iptr = uuidbin; iptr < &uuidbin[GRUB_MD_SHA256->mdlen]; iptr++)
|
||||
for (iptr = uuidbin; iptr < &uuidbin[ARRAY_SIZE (uuidbin)]; iptr++)
|
||||
{
|
||||
grub_snprintf (optr, 3, "%02x", *iptr);
|
||||
optr += 2;
|
||||
@@ -247,13 +242,10 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid,
|
||||
const struct gcry_cipher_spec *ciph;
|
||||
const char *ciphername = NULL;
|
||||
gcry_err_code_t gcry_err;
|
||||
char uuid[GRUB_CRYPTODISK_MAX_UUID_LENGTH];
|
||||
char uuid[GRUB_MD_SHA256->mdlen * 2 + 1];
|
||||
grub_disk_addr_t sector;
|
||||
grub_err_t err;
|
||||
|
||||
if (2 * GRUB_MD_SHA256->mdlen + 1 > GRUB_CRYPTODISK_MAX_UUID_LENGTH)
|
||||
return NULL;
|
||||
|
||||
sector = grub_disk_get_size (disk);
|
||||
if (sector == GRUB_DISK_SIZE_UNKNOWN || sector == 0)
|
||||
return NULL;
|
||||
@@ -387,10 +379,10 @@ static grub_err_t
|
||||
recover_key (grub_disk_t source, grub_cryptodisk_t dev)
|
||||
{
|
||||
grub_size_t keysize;
|
||||
grub_uint8_t digest[GRUB_CRYPTO_MAX_MDLEN];
|
||||
grub_uint8_t geomkey[GRUB_CRYPTO_MAX_MDLEN];
|
||||
grub_uint8_t verify_key[GRUB_CRYPTO_MAX_MDLEN];
|
||||
grub_uint8_t zero[GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE];
|
||||
grub_uint8_t digest[dev->hash->mdlen];
|
||||
grub_uint8_t geomkey[dev->hash->mdlen];
|
||||
grub_uint8_t verify_key[dev->hash->mdlen];
|
||||
grub_uint8_t zero[dev->cipher->cipher->blocksize];
|
||||
char passphrase[MAX_PASSPHRASE] = "";
|
||||
unsigned i;
|
||||
gcry_err_code_t gcry_err;
|
||||
@@ -399,12 +391,6 @@ recover_key (grub_disk_t source, grub_cryptodisk_t dev)
|
||||
grub_disk_addr_t sector;
|
||||
grub_err_t err;
|
||||
|
||||
if (dev->cipher->cipher->blocksize > GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE)
|
||||
return grub_error (GRUB_ERR_BUG, "cipher block is too long");
|
||||
|
||||
if (dev->hash->mdlen > GRUB_CRYPTO_MAX_MDLEN)
|
||||
return grub_error (GRUB_ERR_BUG, "mdlen is too long");
|
||||
|
||||
sector = grub_disk_get_size (source);
|
||||
if (sector == GRUB_DISK_SIZE_UNKNOWN || sector == 0)
|
||||
return grub_error (GRUB_ERR_BUG, "not a geli");
|
||||
@@ -466,12 +452,12 @@ recover_key (grub_disk_t source, grub_cryptodisk_t dev)
|
||||
}
|
||||
|
||||
gcry_err = grub_crypto_hmac_buffer (dev->hash, geomkey,
|
||||
dev->hash->mdlen, "\1", 1, digest);
|
||||
sizeof (geomkey), "\1", 1, digest);
|
||||
if (gcry_err)
|
||||
return grub_crypto_gcry_error (gcry_err);
|
||||
|
||||
gcry_err = grub_crypto_hmac_buffer (dev->hash, geomkey,
|
||||
dev->hash->mdlen, "\0", 1, verify_key);
|
||||
sizeof (geomkey), "\0", 1, verify_key);
|
||||
if (gcry_err)
|
||||
return grub_crypto_gcry_error (gcry_err);
|
||||
|
||||
@@ -481,7 +467,7 @@ recover_key (grub_disk_t source, grub_cryptodisk_t dev)
|
||||
for (i = 0; i < ARRAY_SIZE (header.keys); i++)
|
||||
{
|
||||
struct grub_geli_key candidate_key;
|
||||
grub_uint8_t key_hmac[GRUB_CRYPTO_MAX_MDLEN];
|
||||
grub_uint8_t key_hmac[dev->hash->mdlen];
|
||||
|
||||
/* Check if keyslot is enabled. */
|
||||
if (! (header.keys_used & (1 << i)))
|
||||
@@ -502,7 +488,7 @@ recover_key (grub_disk_t source, grub_cryptodisk_t dev)
|
||||
return grub_crypto_gcry_error (gcry_err);
|
||||
|
||||
gcry_err = grub_crypto_hmac_buffer (dev->hash, verify_key,
|
||||
dev->hash->mdlen,
|
||||
sizeof (verify_key),
|
||||
&candidate_key,
|
||||
(sizeof (candidate_key)
|
||||
- sizeof (candidate_key.hmac)),
|
||||
|
||||
@@ -316,8 +316,6 @@ luks_recover_key (grub_disk_t source,
|
||||
|
||||
grub_puts_ (N_("Attempting to decrypt master key..."));
|
||||
keysize = grub_be_to_cpu32 (header.keyBytes);
|
||||
if (keysize > GRUB_CRYPTODISK_MAX_KEYLEN)
|
||||
return grub_error (GRUB_ERR_BAD_FS, "key is too long");
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE (header.keyblock); i++)
|
||||
if (grub_be_to_cpu32 (header.keyblock[i].active) == LUKS_KEY_ENABLED
|
||||
@@ -346,8 +344,8 @@ luks_recover_key (grub_disk_t source,
|
||||
for (i = 0; i < ARRAY_SIZE (header.keyblock); i++)
|
||||
{
|
||||
gcry_err_code_t gcry_err;
|
||||
grub_uint8_t candidate_key[GRUB_CRYPTODISK_MAX_KEYLEN];
|
||||
grub_uint8_t digest[GRUB_CRYPTODISK_MAX_KEYLEN];
|
||||
grub_uint8_t candidate_key[keysize];
|
||||
grub_uint8_t digest[keysize];
|
||||
|
||||
/* Check if keyslot is enabled. */
|
||||
if (grub_be_to_cpu32 (header.keyblock[i].active) != LUKS_KEY_ENABLED)
|
||||
|
||||
@@ -184,10 +184,9 @@ grub_mdraid_detect (grub_disk_t disk,
|
||||
{
|
||||
grub_disk_addr_t sector;
|
||||
grub_uint64_t size;
|
||||
struct grub_raid_super_09 *sb = NULL;
|
||||
struct grub_raid_super_09 sb;
|
||||
grub_uint32_t *uuid;
|
||||
grub_uint32_t level;
|
||||
struct grub_diskfilter_vg *ret;
|
||||
|
||||
/* The sector where the mdraid 0.90 superblock is stored, if available. */
|
||||
size = grub_disk_get_size (disk);
|
||||
@@ -196,31 +195,27 @@ grub_mdraid_detect (grub_disk_t disk,
|
||||
return NULL;
|
||||
sector = NEW_SIZE_SECTORS (size);
|
||||
|
||||
sb = grub_malloc (sizeof (*sb));
|
||||
if (!sb)
|
||||
if (grub_disk_read (disk, sector, 0, SB_BYTES, &sb))
|
||||
return NULL;
|
||||
|
||||
if (grub_disk_read (disk, sector, 0, SB_BYTES, sb))
|
||||
goto fail;
|
||||
|
||||
/* Look whether there is a mdraid 0.90 superblock. */
|
||||
if (sb->md_magic != grub_cpu_to_md32_compile_time (SB_MAGIC))
|
||||
if (sb.md_magic != grub_cpu_to_md32_compile_time (SB_MAGIC))
|
||||
/* not 0.9x raid. */
|
||||
goto fail;
|
||||
return NULL;
|
||||
|
||||
if (sb->major_version != grub_cpu_to_md32_compile_time (0)
|
||||
|| sb->minor_version != grub_cpu_to_md32_compile_time (90))
|
||||
if (sb.major_version != grub_cpu_to_md32_compile_time (0)
|
||||
|| sb.minor_version != grub_cpu_to_md32_compile_time (90))
|
||||
/* Unsupported version. */
|
||||
goto fail;
|
||||
return NULL;
|
||||
|
||||
/* No need for explicit check that sb->size is 0 (unspecified) since
|
||||
/* No need for explicit check that sb.size is 0 (unspecified) since
|
||||
0 >= non-0 is false. */
|
||||
if (((grub_disk_addr_t) grub_md_to_cpu32 (sb->size)) * 2 >= size)
|
||||
goto fail;
|
||||
if (((grub_disk_addr_t) grub_md_to_cpu32 (sb.size)) * 2 >= size)
|
||||
return NULL;
|
||||
|
||||
/* FIXME: Check the checksum. */
|
||||
|
||||
level = grub_md_to_cpu32 (sb->level);
|
||||
level = grub_md_to_cpu32 (sb.level);
|
||||
/* Multipath. */
|
||||
if ((int) level == -4)
|
||||
level = 1;
|
||||
@@ -230,43 +225,37 @@ grub_mdraid_detect (grub_disk_t disk,
|
||||
{
|
||||
grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
|
||||
"unsupported RAID level: %d", level);
|
||||
goto fail;
|
||||
return NULL;
|
||||
}
|
||||
if (grub_md_to_cpu32 (sb->this_disk.number) == 0xffff
|
||||
|| grub_md_to_cpu32 (sb->this_disk.number) == 0xfffe)
|
||||
if (grub_md_to_cpu32 (sb.this_disk.number) == 0xffff
|
||||
|| grub_md_to_cpu32 (sb.this_disk.number) == 0xfffe)
|
||||
/* Spares aren't implemented. */
|
||||
goto fail;
|
||||
return NULL;
|
||||
|
||||
uuid = grub_malloc (16);
|
||||
if (!uuid)
|
||||
goto fail;
|
||||
return NULL;
|
||||
|
||||
uuid[0] = grub_swap_bytes32 (sb->set_uuid0);
|
||||
uuid[1] = grub_swap_bytes32 (sb->set_uuid1);
|
||||
uuid[2] = grub_swap_bytes32 (sb->set_uuid2);
|
||||
uuid[3] = grub_swap_bytes32 (sb->set_uuid3);
|
||||
uuid[0] = grub_swap_bytes32 (sb.set_uuid0);
|
||||
uuid[1] = grub_swap_bytes32 (sb.set_uuid1);
|
||||
uuid[2] = grub_swap_bytes32 (sb.set_uuid2);
|
||||
uuid[3] = grub_swap_bytes32 (sb.set_uuid3);
|
||||
|
||||
*start_sector = 0;
|
||||
|
||||
id->uuidlen = 0;
|
||||
id->id = grub_md_to_cpu32 (sb->this_disk.number);
|
||||
id->id = grub_md_to_cpu32 (sb.this_disk.number);
|
||||
|
||||
char buf[32];
|
||||
grub_snprintf (buf, sizeof (buf), "md%d", grub_md_to_cpu32 (sb->md_minor));
|
||||
ret = grub_diskfilter_make_raid (16, (char *) uuid,
|
||||
grub_md_to_cpu32 (sb->raid_disks), buf,
|
||||
(sb->size) ? ((grub_disk_addr_t)
|
||||
grub_md_to_cpu32 (sb->size)) * 2
|
||||
: sector,
|
||||
grub_md_to_cpu32 (sb->chunk_size) >> 9,
|
||||
grub_md_to_cpu32 (sb->layout),
|
||||
level);
|
||||
grub_free (sb);
|
||||
return ret;
|
||||
|
||||
fail:
|
||||
grub_free (sb);
|
||||
return NULL;
|
||||
grub_snprintf (buf, sizeof (buf), "md%d", grub_md_to_cpu32 (sb.md_minor));
|
||||
return grub_diskfilter_make_raid (16, (char *) uuid,
|
||||
grub_md_to_cpu32 (sb.raid_disks), buf,
|
||||
(sb.size) ? ((grub_disk_addr_t)
|
||||
grub_md_to_cpu32 (sb.size)) * 2
|
||||
: sector,
|
||||
grub_md_to_cpu32 (sb.chunk_size) >> 9,
|
||||
grub_md_to_cpu32 (sb.layout),
|
||||
level);
|
||||
}
|
||||
|
||||
static struct grub_diskfilter grub_mdraid_dev = {
|
||||
|
||||
@@ -47,7 +47,6 @@ grub_ubootdisk_register (struct device_info *newdev)
|
||||
{
|
||||
case DT_STOR_IDE:
|
||||
case DT_STOR_SATA:
|
||||
case DT_STOR_SCSI:
|
||||
case DT_STOR_MMC:
|
||||
case DT_STOR_USB:
|
||||
/* hd */
|
||||
|
||||
@@ -1,458 +0,0 @@
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GRUB is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <grub/disk.h>
|
||||
#include <grub/dl.h>
|
||||
#include <grub/mm.h>
|
||||
#include <grub/types.h>
|
||||
#include <grub/misc.h>
|
||||
#include <grub/err.h>
|
||||
#include <grub/term.h>
|
||||
#include <grub/i18n.h>
|
||||
#include <grub/xen.h>
|
||||
#include <grub/time.h>
|
||||
#include <xen/io/blkif.h>
|
||||
|
||||
struct virtdisk
|
||||
{
|
||||
int handle;
|
||||
char *fullname;
|
||||
char *backend_dir;
|
||||
char *frontend_dir;
|
||||
struct blkif_sring *shared_page;
|
||||
struct blkif_front_ring ring;
|
||||
grub_xen_grant_t grant;
|
||||
grub_xen_evtchn_t evtchn;
|
||||
void *dma_page;
|
||||
grub_xen_grant_t dma_grant;
|
||||
};
|
||||
|
||||
#define xen_wmb() mb()
|
||||
#define xen_mb() mb()
|
||||
|
||||
static struct virtdisk *virtdisks;
|
||||
static grub_size_t vdiskcnt;
|
||||
|
||||
static int
|
||||
grub_virtdisk_iterate (grub_disk_dev_iterate_hook_t hook, void *hook_data,
|
||||
grub_disk_pull_t pull)
|
||||
{
|
||||
grub_size_t i;
|
||||
|
||||
if (pull != GRUB_DISK_PULL_NONE)
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < vdiskcnt; i++)
|
||||
if (hook (virtdisks[i].fullname, hook_data))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_virtdisk_open (const char *name, grub_disk_t disk)
|
||||
{
|
||||
grub_size_t i;
|
||||
grub_uint32_t secsize;
|
||||
char fdir[200];
|
||||
char *buf;
|
||||
|
||||
for (i = 0; i < vdiskcnt; i++)
|
||||
if (grub_strcmp (name, virtdisks[i].fullname) == 0)
|
||||
break;
|
||||
if (i == vdiskcnt)
|
||||
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "not a virtdisk");
|
||||
disk->data = &virtdisks[i];
|
||||
disk->id = i;
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "%s/sectors", virtdisks[i].backend_dir);
|
||||
buf = grub_xenstore_get_file (fdir, NULL);
|
||||
if (!buf)
|
||||
return grub_errno;
|
||||
disk->total_sectors = grub_strtoull (buf, 0, 10);
|
||||
if (grub_errno)
|
||||
return grub_errno;
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "%s/sector-size",
|
||||
virtdisks[i].backend_dir);
|
||||
buf = grub_xenstore_get_file (fdir, NULL);
|
||||
if (!buf)
|
||||
return grub_errno;
|
||||
secsize = grub_strtoull (buf, 0, 10);
|
||||
if (grub_errno)
|
||||
return grub_errno;
|
||||
|
||||
if ((secsize & (secsize - 1)) || !secsize || secsize < 512
|
||||
|| secsize > GRUB_XEN_PAGE_SIZE)
|
||||
return grub_error (GRUB_ERR_IO, "unsupported sector size %d", secsize);
|
||||
|
||||
for (disk->log_sector_size = 0;
|
||||
(1U << disk->log_sector_size) < secsize; disk->log_sector_size++);
|
||||
|
||||
disk->total_sectors >>= disk->log_sector_size - 9;
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static void
|
||||
grub_virtdisk_close (grub_disk_t disk __attribute__ ((unused)))
|
||||
{
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_virtdisk_read (grub_disk_t disk, grub_disk_addr_t sector,
|
||||
grub_size_t size, char *buf)
|
||||
{
|
||||
struct virtdisk *data = disk->data;
|
||||
|
||||
while (size)
|
||||
{
|
||||
grub_size_t cur;
|
||||
struct blkif_request *req;
|
||||
struct blkif_response *resp;
|
||||
int sta = 0;
|
||||
struct evtchn_send send;
|
||||
cur = size;
|
||||
if (cur > (unsigned) (GRUB_XEN_PAGE_SIZE >> disk->log_sector_size))
|
||||
cur = GRUB_XEN_PAGE_SIZE >> disk->log_sector_size;
|
||||
while (RING_FULL (&data->ring))
|
||||
grub_xen_sched_op (SCHEDOP_yield, 0);
|
||||
req = RING_GET_REQUEST (&data->ring, data->ring.req_prod_pvt);
|
||||
req->operation = BLKIF_OP_READ;
|
||||
req->nr_segments = 1;
|
||||
req->handle = data->handle;
|
||||
req->id = 0;
|
||||
req->sector_number = sector << (disk->log_sector_size - 9);
|
||||
req->seg[0].gref = data->dma_grant;
|
||||
req->seg[0].first_sect = 0;
|
||||
req->seg[0].last_sect = (cur << (disk->log_sector_size - 9)) - 1;
|
||||
data->ring.req_prod_pvt++;
|
||||
RING_PUSH_REQUESTS (&data->ring);
|
||||
mb ();
|
||||
send.port = data->evtchn;
|
||||
grub_xen_event_channel_op (EVTCHNOP_send, &send);
|
||||
|
||||
while (!RING_HAS_UNCONSUMED_RESPONSES (&data->ring))
|
||||
{
|
||||
grub_xen_sched_op (SCHEDOP_yield, 0);
|
||||
mb ();
|
||||
}
|
||||
while (1)
|
||||
{
|
||||
int wtd;
|
||||
RING_FINAL_CHECK_FOR_RESPONSES (&data->ring, wtd);
|
||||
if (!wtd)
|
||||
break;
|
||||
resp = RING_GET_RESPONSE (&data->ring, data->ring.rsp_cons);
|
||||
data->ring.rsp_cons++;
|
||||
if (resp->status)
|
||||
sta = resp->status;
|
||||
}
|
||||
if (sta)
|
||||
return grub_error (GRUB_ERR_IO, "read failed");
|
||||
grub_memcpy (buf, data->dma_page, cur << disk->log_sector_size);
|
||||
size -= cur;
|
||||
sector += cur;
|
||||
buf += cur << disk->log_sector_size;
|
||||
}
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_virtdisk_write (grub_disk_t disk, grub_disk_addr_t sector,
|
||||
grub_size_t size, const char *buf)
|
||||
{
|
||||
struct virtdisk *data = disk->data;
|
||||
|
||||
while (size)
|
||||
{
|
||||
grub_size_t cur;
|
||||
struct blkif_request *req;
|
||||
struct blkif_response *resp;
|
||||
int sta = 0;
|
||||
struct evtchn_send send;
|
||||
cur = size;
|
||||
if (cur > (unsigned) (GRUB_XEN_PAGE_SIZE >> disk->log_sector_size))
|
||||
cur = GRUB_XEN_PAGE_SIZE >> disk->log_sector_size;
|
||||
|
||||
grub_memcpy (data->dma_page, buf, cur << disk->log_sector_size);
|
||||
|
||||
while (RING_FULL (&data->ring))
|
||||
grub_xen_sched_op (SCHEDOP_yield, 0);
|
||||
req = RING_GET_REQUEST (&data->ring, data->ring.req_prod_pvt);
|
||||
req->operation = BLKIF_OP_WRITE;
|
||||
req->nr_segments = 1;
|
||||
req->handle = data->handle;
|
||||
req->id = 0;
|
||||
req->sector_number = sector << (disk->log_sector_size - 9);
|
||||
req->seg[0].gref = data->dma_grant;
|
||||
req->seg[0].first_sect = 0;
|
||||
req->seg[0].last_sect = (cur << (disk->log_sector_size - 9)) - 1;
|
||||
data->ring.req_prod_pvt++;
|
||||
RING_PUSH_REQUESTS (&data->ring);
|
||||
mb ();
|
||||
send.port = data->evtchn;
|
||||
grub_xen_event_channel_op (EVTCHNOP_send, &send);
|
||||
|
||||
while (!RING_HAS_UNCONSUMED_RESPONSES (&data->ring))
|
||||
{
|
||||
grub_xen_sched_op (SCHEDOP_yield, 0);
|
||||
mb ();
|
||||
}
|
||||
while (1)
|
||||
{
|
||||
int wtd;
|
||||
RING_FINAL_CHECK_FOR_RESPONSES (&data->ring, wtd);
|
||||
if (!wtd)
|
||||
break;
|
||||
resp = RING_GET_RESPONSE (&data->ring, data->ring.rsp_cons);
|
||||
data->ring.rsp_cons++;
|
||||
if (resp->status)
|
||||
sta = resp->status;
|
||||
}
|
||||
if (sta)
|
||||
return grub_error (GRUB_ERR_IO, "write failed");
|
||||
size -= cur;
|
||||
sector += cur;
|
||||
buf += cur << disk->log_sector_size;
|
||||
}
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static struct grub_disk_dev grub_virtdisk_dev = {
|
||||
.name = "xen",
|
||||
.id = GRUB_DISK_DEVICE_XEN,
|
||||
.iterate = grub_virtdisk_iterate,
|
||||
.open = grub_virtdisk_open,
|
||||
.close = grub_virtdisk_close,
|
||||
.read = grub_virtdisk_read,
|
||||
.write = grub_virtdisk_write,
|
||||
.next = 0
|
||||
};
|
||||
|
||||
static int
|
||||
count (const char *dir __attribute__ ((unused)), void *data)
|
||||
{
|
||||
grub_size_t *ctr = data;
|
||||
(*ctr)++;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
fill (const char *dir, void *data)
|
||||
{
|
||||
grub_size_t *ctr = data;
|
||||
domid_t dom;
|
||||
/* "dir" is just a number, at most 19 characters. */
|
||||
char fdir[200];
|
||||
char num[20];
|
||||
grub_err_t err;
|
||||
void *buf;
|
||||
struct evtchn_alloc_unbound alloc_unbound;
|
||||
|
||||
/* Shouldn't happen unles some hotplug happened. */
|
||||
if (vdiskcnt >= *ctr)
|
||||
return 1;
|
||||
virtdisks[vdiskcnt].handle = grub_strtoul (dir, 0, 10);
|
||||
if (grub_errno)
|
||||
{
|
||||
grub_errno = 0;
|
||||
return 0;
|
||||
}
|
||||
virtdisks[vdiskcnt].fullname = 0;
|
||||
virtdisks[vdiskcnt].backend_dir = 0;
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "device/vbd/%s/backend", dir);
|
||||
virtdisks[vdiskcnt].backend_dir = grub_xenstore_get_file (fdir, NULL);
|
||||
if (!virtdisks[vdiskcnt].backend_dir)
|
||||
goto out_fail_1;
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "%s/dev",
|
||||
virtdisks[vdiskcnt].backend_dir);
|
||||
buf = grub_xenstore_get_file (fdir, NULL);
|
||||
if (!buf)
|
||||
{
|
||||
grub_errno = 0;
|
||||
virtdisks[vdiskcnt].fullname = grub_xasprintf ("xenid/%s", dir);
|
||||
}
|
||||
else
|
||||
{
|
||||
virtdisks[vdiskcnt].fullname = grub_xasprintf ("xen/%s", (char *) buf);
|
||||
grub_free (buf);
|
||||
}
|
||||
if (!virtdisks[vdiskcnt].fullname)
|
||||
goto out_fail_1;
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "device/vbd/%s/backend-id", dir);
|
||||
buf = grub_xenstore_get_file (fdir, NULL);
|
||||
if (!buf)
|
||||
goto out_fail_1;
|
||||
|
||||
dom = grub_strtoul (buf, 0, 10);
|
||||
grub_free (buf);
|
||||
if (grub_errno)
|
||||
goto out_fail_1;
|
||||
|
||||
virtdisks[vdiskcnt].shared_page =
|
||||
grub_xen_alloc_shared_page (dom, &virtdisks[vdiskcnt].grant);
|
||||
if (!virtdisks[vdiskcnt].shared_page)
|
||||
goto out_fail_1;
|
||||
|
||||
virtdisks[vdiskcnt].dma_page =
|
||||
grub_xen_alloc_shared_page (dom, &virtdisks[vdiskcnt].dma_grant);
|
||||
if (!virtdisks[vdiskcnt].dma_page)
|
||||
goto out_fail_2;
|
||||
|
||||
alloc_unbound.dom = DOMID_SELF;
|
||||
alloc_unbound.remote_dom = dom;
|
||||
|
||||
grub_xen_event_channel_op (EVTCHNOP_alloc_unbound, &alloc_unbound);
|
||||
virtdisks[vdiskcnt].evtchn = alloc_unbound.port;
|
||||
|
||||
SHARED_RING_INIT (virtdisks[vdiskcnt].shared_page);
|
||||
FRONT_RING_INIT (&virtdisks[vdiskcnt].ring, virtdisks[vdiskcnt].shared_page,
|
||||
GRUB_XEN_PAGE_SIZE);
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "device/vbd/%s/ring-ref", dir);
|
||||
grub_snprintf (num, sizeof (num), "%u", virtdisks[vdiskcnt].grant);
|
||||
err = grub_xenstore_write_file (fdir, num, grub_strlen (num));
|
||||
if (err)
|
||||
goto out_fail_3;
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "device/vbd/%s/event-channel", dir);
|
||||
grub_snprintf (num, sizeof (num), "%u", virtdisks[vdiskcnt].evtchn);
|
||||
err = grub_xenstore_write_file (fdir, num, grub_strlen (num));
|
||||
if (err)
|
||||
goto out_fail_3;
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "device/vbd/%s/protocol", dir);
|
||||
err = grub_xenstore_write_file (fdir, XEN_IO_PROTO_ABI_NATIVE,
|
||||
grub_strlen (XEN_IO_PROTO_ABI_NATIVE));
|
||||
if (err)
|
||||
goto out_fail_3;
|
||||
|
||||
struct gnttab_dump_table dt;
|
||||
dt.dom = DOMID_SELF;
|
||||
grub_xen_grant_table_op (GNTTABOP_dump_table, (void *) &dt, 1);
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "device/vbd/%s/state", dir);
|
||||
err = grub_xenstore_write_file (fdir, "3", 1);
|
||||
if (err)
|
||||
goto out_fail_3;
|
||||
|
||||
while (1)
|
||||
{
|
||||
grub_snprintf (fdir, sizeof (fdir), "%s/state",
|
||||
virtdisks[vdiskcnt].backend_dir);
|
||||
buf = grub_xenstore_get_file (fdir, NULL);
|
||||
if (!buf)
|
||||
goto out_fail_3;
|
||||
if (grub_strcmp (buf, "2") != 0)
|
||||
break;
|
||||
grub_free (buf);
|
||||
grub_xen_sched_op (SCHEDOP_yield, 0);
|
||||
}
|
||||
grub_dprintf ("xen", "state=%s\n", (char *) buf);
|
||||
grub_free (buf);
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "device/vbd/%s", dir);
|
||||
|
||||
virtdisks[vdiskcnt].frontend_dir = grub_strdup (fdir);
|
||||
|
||||
vdiskcnt++;
|
||||
return 0;
|
||||
|
||||
out_fail_3:
|
||||
grub_xen_free_shared_page (virtdisks[vdiskcnt].dma_page);
|
||||
out_fail_2:
|
||||
grub_xen_free_shared_page (virtdisks[vdiskcnt].shared_page);
|
||||
out_fail_1:
|
||||
grub_free (virtdisks[vdiskcnt].backend_dir);
|
||||
grub_free (virtdisks[vdiskcnt].fullname);
|
||||
|
||||
grub_errno = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
grub_xendisk_init (void)
|
||||
{
|
||||
grub_size_t ctr = 0;
|
||||
if (grub_xenstore_dir ("device/vbd", count, &ctr))
|
||||
grub_errno = 0;
|
||||
|
||||
if (!ctr)
|
||||
return;
|
||||
|
||||
virtdisks = grub_malloc (ctr * sizeof (virtdisks[0]));
|
||||
if (!virtdisks)
|
||||
return;
|
||||
if (grub_xenstore_dir ("device/vbd", fill, &ctr))
|
||||
grub_errno = 0;
|
||||
|
||||
grub_disk_dev_register (&grub_virtdisk_dev);
|
||||
}
|
||||
|
||||
void
|
||||
grub_xendisk_fini (void)
|
||||
{
|
||||
char fdir[200];
|
||||
unsigned i;
|
||||
|
||||
for (i = 0; i < vdiskcnt; i++)
|
||||
{
|
||||
char *buf;
|
||||
struct evtchn_close close_op = {.port = virtdisks[i].evtchn };
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "%s/state",
|
||||
virtdisks[i].frontend_dir);
|
||||
grub_xenstore_write_file (fdir, "6", 1);
|
||||
|
||||
while (1)
|
||||
{
|
||||
grub_snprintf (fdir, sizeof (fdir), "%s/state",
|
||||
virtdisks[i].backend_dir);
|
||||
buf = grub_xenstore_get_file (fdir, NULL);
|
||||
grub_dprintf ("xen", "state=%s\n", (char *) buf);
|
||||
|
||||
if (!buf || grub_strcmp (buf, "6") == 0)
|
||||
break;
|
||||
grub_free (buf);
|
||||
grub_xen_sched_op (SCHEDOP_yield, 0);
|
||||
}
|
||||
grub_free (buf);
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "%s/ring-ref",
|
||||
virtdisks[i].frontend_dir);
|
||||
grub_xenstore_write_file (fdir, NULL, 0);
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "%s/event-channel",
|
||||
virtdisks[i].frontend_dir);
|
||||
grub_xenstore_write_file (fdir, NULL, 0);
|
||||
|
||||
grub_xen_free_shared_page (virtdisks[i].dma_page);
|
||||
grub_xen_free_shared_page (virtdisks[i].shared_page);
|
||||
|
||||
grub_xen_event_channel_op (EVTCHNOP_close, &close_op);
|
||||
|
||||
/* Prepare for handoff. */
|
||||
grub_snprintf (fdir, sizeof (fdir), "%s/state",
|
||||
virtdisks[i].frontend_dir);
|
||||
grub_xenstore_write_file (fdir, "1", 1);
|
||||
}
|
||||
}
|
||||
@@ -122,10 +122,7 @@ SUFFIX (grub_efiemu_crc) (void)
|
||||
int handle;
|
||||
grub_off_t off;
|
||||
struct SUFFIX (grub_efiemu_runtime_services) *runtime_services;
|
||||
grub_uint32_t crc32_val;
|
||||
|
||||
if (GRUB_MD_CRC32->mdlen != 4)
|
||||
return grub_error (GRUB_ERR_BUG, "incorrect mdlen");
|
||||
grub_uint8_t crc32_context[GRUB_MD_CRC32->contextsize];
|
||||
|
||||
/* compute CRC32 of runtime_services */
|
||||
err = grub_efiemu_resolve_symbol ("efiemu_runtime_services",
|
||||
@@ -137,11 +134,12 @@ SUFFIX (grub_efiemu_crc) (void)
|
||||
((grub_uint8_t *) grub_efiemu_mm_obtain_request (handle) + off);
|
||||
|
||||
runtime_services->hdr.crc32 = 0;
|
||||
GRUB_MD_CRC32->init(crc32_context);
|
||||
GRUB_MD_CRC32->write(crc32_context, runtime_services, runtime_services->hdr.header_size);
|
||||
GRUB_MD_CRC32->final(crc32_context);
|
||||
|
||||
grub_crypto_hash (GRUB_MD_CRC32, &crc32_val,
|
||||
runtime_services, runtime_services->hdr.header_size);
|
||||
runtime_services->hdr.crc32 =
|
||||
grub_be_to_cpu32(crc32_val);
|
||||
grub_be_to_cpu32(*(grub_uint32_t*)GRUB_MD_CRC32->read(crc32_context));
|
||||
|
||||
err = grub_efiemu_resolve_symbol ("efiemu_system_table", &handle, &off);
|
||||
if (err)
|
||||
@@ -149,11 +147,12 @@ SUFFIX (grub_efiemu_crc) (void)
|
||||
|
||||
/* compute CRC32 of system table */
|
||||
SUFFIX (grub_efiemu_system_table)->hdr.crc32 = 0;
|
||||
grub_crypto_hash (GRUB_MD_CRC32, &crc32_val,
|
||||
SUFFIX (grub_efiemu_system_table),
|
||||
SUFFIX (grub_efiemu_system_table)->hdr.header_size);
|
||||
GRUB_MD_CRC32->init(crc32_context);
|
||||
GRUB_MD_CRC32->write(crc32_context, SUFFIX (grub_efiemu_system_table),
|
||||
SUFFIX (grub_efiemu_system_table)->hdr.header_size);
|
||||
GRUB_MD_CRC32->final(crc32_context);
|
||||
SUFFIX (grub_efiemu_system_table)->hdr.crc32 =
|
||||
grub_be_to_cpu32(crc32_val);
|
||||
grub_be_to_cpu32(*(grub_uint32_t*)GRUB_MD_CRC32->read(crc32_context));
|
||||
|
||||
grub_dprintf ("efiemu","system_table = %p, runtime_services = %p\n",
|
||||
SUFFIX (grub_efiemu_system_table), runtime_services);
|
||||
|
||||
@@ -19,18 +19,16 @@
|
||||
|
||||
#define GRUB_TYPES_CPU_HEADER 1
|
||||
|
||||
#ifdef __i386__
|
||||
#ifdef ELF32
|
||||
# define SIZEOF_VOID_P 4
|
||||
# define SIZEOF_LONG 4
|
||||
# define GRUB_TARGET_SIZEOF_VOID_P 4
|
||||
# define GRUB_TARGET_SIZEOF_LONG 4
|
||||
# define EFI_FUNC(x) x
|
||||
#elif defined (__x86_64__)
|
||||
#else
|
||||
# define SIZEOF_VOID_P 8
|
||||
# define SIZEOF_LONG 8
|
||||
# define GRUB_TARGET_SIZEOF_VOID_P 8
|
||||
# define GRUB_TARGET_SIZEOF_LONG 8
|
||||
# define EFI_FUNC(x) x ## _real
|
||||
#else
|
||||
#error "Unknown architecture"
|
||||
#endif
|
||||
|
||||
@@ -911,6 +911,7 @@ grub_btrfs_lzo_decompress(char *ibuf, grub_size_t isize, grub_off_t off,
|
||||
{
|
||||
grub_uint32_t total_size, cblock_size;
|
||||
grub_size_t ret = 0;
|
||||
unsigned char buf[GRUB_BTRFS_LZO_BLOCK_SIZE];
|
||||
char *ibuf0 = ibuf;
|
||||
|
||||
total_size = grub_le_to_cpu32 (grub_get_unaligned32 (ibuf));
|
||||
@@ -954,21 +955,13 @@ grub_btrfs_lzo_decompress(char *ibuf, grub_size_t isize, grub_off_t off,
|
||||
if (off > 0 || osize < GRUB_BTRFS_LZO_BLOCK_SIZE)
|
||||
{
|
||||
grub_size_t to_copy = GRUB_BTRFS_LZO_BLOCK_SIZE - off;
|
||||
grub_uint8_t *buf;
|
||||
|
||||
if (to_copy > osize)
|
||||
to_copy = osize;
|
||||
|
||||
buf = grub_malloc (GRUB_BTRFS_LZO_BLOCK_SIZE);
|
||||
if (!buf)
|
||||
return -1;
|
||||
|
||||
if (lzo1x_decompress_safe ((lzo_bytep)ibuf, cblock_size, buf, &usize,
|
||||
NULL) != LZO_E_OK)
|
||||
{
|
||||
grub_free (buf);
|
||||
return -1;
|
||||
}
|
||||
return -1;
|
||||
|
||||
if (to_copy > usize)
|
||||
to_copy = usize;
|
||||
@@ -979,8 +972,6 @@ grub_btrfs_lzo_decompress(char *ibuf, grub_size_t isize, grub_off_t off,
|
||||
obuf += to_copy;
|
||||
ibuf += cblock_size;
|
||||
off = 0;
|
||||
|
||||
grub_free (buf);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
@@ -267,8 +267,7 @@ grub_cbfs_close (grub_file_t file)
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
#if (defined (__i386__) || defined (__x86_64__)) && !defined (GRUB_UTIL) \
|
||||
&& !defined (GRUB_MACHINE_EMU) && !defined (GRUB_MACHINE_XEN)
|
||||
#if (defined (__i386__) || defined (__x86_64__)) && !defined (GRUB_UTIL) && !defined (GRUB_MACHINE_EMU)
|
||||
|
||||
static char *cbfsdisk_addr;
|
||||
static grub_off_t cbfsdisk_size = 0;
|
||||
@@ -376,7 +375,7 @@ static struct grub_fs grub_cbfs_fs = {
|
||||
|
||||
GRUB_MOD_INIT (cbfs)
|
||||
{
|
||||
#if (defined (__i386__) || defined (__x86_64__)) && !defined (GRUB_UTIL) && !defined (GRUB_MACHINE_EMU) && !defined (GRUB_MACHINE_XEN)
|
||||
#if (defined (__i386__) || defined (__x86_64__)) && !defined (GRUB_UTIL) && !defined (GRUB_MACHINE_EMU)
|
||||
init_cbfsdisk ();
|
||||
#endif
|
||||
grub_fs_register (&grub_cbfs_fs);
|
||||
@@ -385,7 +384,7 @@ GRUB_MOD_INIT (cbfs)
|
||||
GRUB_MOD_FINI (cbfs)
|
||||
{
|
||||
grub_fs_unregister (&grub_cbfs_fs);
|
||||
#if (defined (__i386__) || defined (__x86_64__)) && !defined (GRUB_UTIL) && !defined (GRUB_MACHINE_EMU) && !defined (GRUB_MACHINE_XEN)
|
||||
#if (defined (__i386__) || defined (__x86_64__)) && !defined (GRUB_UTIL) && !defined (GRUB_MACHINE_EMU)
|
||||
fini_cbfsdisk ();
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -247,7 +247,6 @@ struct ext2_dirent
|
||||
{
|
||||
grub_uint32_t inode;
|
||||
grub_uint16_t direntlen;
|
||||
#define MAX_NAMELEN 255
|
||||
grub_uint8_t namelen;
|
||||
grub_uint8_t filetype;
|
||||
};
|
||||
@@ -345,12 +344,11 @@ grub_ext2_blockgroup (struct grub_ext2_data *data, int group,
|
||||
}
|
||||
|
||||
static struct grub_ext4_extent_header *
|
||||
grub_ext4_find_leaf (struct grub_ext2_data *data,
|
||||
grub_ext4_find_leaf (struct grub_ext2_data *data, grub_properly_aligned_t *buf,
|
||||
struct grub_ext4_extent_header *ext_block,
|
||||
grub_uint32_t fileblock)
|
||||
{
|
||||
struct grub_ext4_extent_idx *index;
|
||||
void *buf = NULL;
|
||||
|
||||
while (1)
|
||||
{
|
||||
@@ -359,8 +357,8 @@ grub_ext4_find_leaf (struct grub_ext2_data *data,
|
||||
|
||||
index = (struct grub_ext4_extent_idx *) (ext_block + 1);
|
||||
|
||||
if (ext_block->magic != grub_cpu_to_le16_compile_time (EXT4_EXT_MAGIC))
|
||||
goto fail;
|
||||
if (grub_le_to_cpu16(ext_block->magic) != EXT4_EXT_MAGIC)
|
||||
return 0;
|
||||
|
||||
if (ext_block->depth == 0)
|
||||
return ext_block;
|
||||
@@ -372,24 +370,17 @@ grub_ext4_find_leaf (struct grub_ext2_data *data,
|
||||
}
|
||||
|
||||
if (--i < 0)
|
||||
goto fail;
|
||||
return 0;
|
||||
|
||||
block = grub_le_to_cpu16 (index[i].leaf_hi);
|
||||
block = (block << 32) | grub_le_to_cpu32 (index[i].leaf);
|
||||
if (!buf)
|
||||
buf = grub_malloc (EXT2_BLOCK_SIZE(data));
|
||||
if (!buf)
|
||||
goto fail;
|
||||
if (grub_disk_read (data->disk,
|
||||
block << LOG2_EXT2_BLOCK_SIZE (data),
|
||||
0, EXT2_BLOCK_SIZE(data), buf))
|
||||
goto fail;
|
||||
return 0;
|
||||
|
||||
ext_block = buf;
|
||||
ext_block = (struct grub_ext4_extent_header *) buf;
|
||||
}
|
||||
fail:
|
||||
grub_free (buf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static grub_disk_addr_t
|
||||
@@ -397,21 +388,20 @@ grub_ext2_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock)
|
||||
{
|
||||
struct grub_ext2_data *data = node->data;
|
||||
struct grub_ext2_inode *inode = &node->inode;
|
||||
grub_disk_addr_t blknr = -1;
|
||||
unsigned int blksz = EXT2_BLOCK_SIZE (data);
|
||||
grub_disk_addr_t blksz_quarter = blksz / 4;
|
||||
int log2_blksz = LOG2_EXT2_BLOCK_SIZE (data);
|
||||
int log_perblock = log2_blksz + 9 - 2;
|
||||
grub_uint32_t indir;
|
||||
int shift;
|
||||
|
||||
if (inode->flags & grub_cpu_to_le32_compile_time (EXT4_EXTENTS_FLAG))
|
||||
{
|
||||
GRUB_PROPERLY_ALIGNED_ARRAY (buf, EXT2_BLOCK_SIZE(data));
|
||||
struct grub_ext4_extent_header *leaf;
|
||||
struct grub_ext4_extent *ext;
|
||||
int i;
|
||||
grub_disk_addr_t ret;
|
||||
|
||||
leaf = grub_ext4_find_leaf (data, (struct grub_ext4_extent_header *) inode->blocks.dir_blocks, fileblock);
|
||||
leaf = grub_ext4_find_leaf (data, buf,
|
||||
(struct grub_ext4_extent_header *) inode->blocks.dir_blocks,
|
||||
fileblock);
|
||||
if (! leaf)
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_FS, "invalid extent");
|
||||
@@ -429,7 +419,7 @@ grub_ext2_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock)
|
||||
{
|
||||
fileblock -= grub_le_to_cpu32 (ext[i].block);
|
||||
if (fileblock >= grub_le_to_cpu16 (ext[i].len))
|
||||
ret = 0;
|
||||
return 0;
|
||||
else
|
||||
{
|
||||
grub_disk_addr_t start;
|
||||
@@ -437,64 +427,98 @@ grub_ext2_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock)
|
||||
start = grub_le_to_cpu16 (ext[i].start_hi);
|
||||
start = (start << 32) + grub_le_to_cpu32 (ext[i].start);
|
||||
|
||||
ret = fileblock + start;
|
||||
return fileblock + start;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_FS, "something wrong with extent");
|
||||
ret = -1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (leaf != (struct grub_ext4_extent_header *) inode->blocks.dir_blocks)
|
||||
grub_free (leaf);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Direct blocks. */
|
||||
if (fileblock < INDIRECT_BLOCKS)
|
||||
return grub_le_to_cpu32 (inode->blocks.dir_blocks[fileblock]);
|
||||
fileblock -= INDIRECT_BLOCKS;
|
||||
blknr = grub_le_to_cpu32 (inode->blocks.dir_blocks[fileblock]);
|
||||
/* Indirect. */
|
||||
if (fileblock < blksz_quarter)
|
||||
else if (fileblock < INDIRECT_BLOCKS + blksz / 4)
|
||||
{
|
||||
indir = inode->blocks.indir_block;
|
||||
shift = 0;
|
||||
goto indirect;
|
||||
grub_uint32_t indir[blksz / 4];
|
||||
|
||||
if (grub_disk_read (data->disk,
|
||||
((grub_disk_addr_t)
|
||||
grub_le_to_cpu32 (inode->blocks.indir_block))
|
||||
<< log2_blksz,
|
||||
0, blksz, indir))
|
||||
return grub_errno;
|
||||
|
||||
blknr = grub_le_to_cpu32 (indir[fileblock - INDIRECT_BLOCKS]);
|
||||
}
|
||||
fileblock -= blksz_quarter;
|
||||
/* Double indirect. */
|
||||
if (fileblock < blksz_quarter * blksz_quarter)
|
||||
else if (fileblock < INDIRECT_BLOCKS
|
||||
+ blksz / 4 * ((grub_disk_addr_t) blksz / 4 + 1))
|
||||
{
|
||||
indir = inode->blocks.double_indir_block;
|
||||
shift = 1;
|
||||
goto indirect;
|
||||
int log_perblock = log2_blksz + 9 - 2;
|
||||
grub_disk_addr_t rblock = fileblock - (INDIRECT_BLOCKS
|
||||
+ blksz / 4);
|
||||
grub_uint32_t indir[blksz / 4];
|
||||
|
||||
if (grub_disk_read (data->disk,
|
||||
((grub_disk_addr_t)
|
||||
grub_le_to_cpu32 (inode->blocks.double_indir_block))
|
||||
<< log2_blksz,
|
||||
0, blksz, indir))
|
||||
return grub_errno;
|
||||
|
||||
if (grub_disk_read (data->disk,
|
||||
((grub_disk_addr_t)
|
||||
grub_le_to_cpu32 (indir[rblock >> log_perblock]))
|
||||
<< log2_blksz,
|
||||
0, blksz, indir))
|
||||
return grub_errno;
|
||||
|
||||
|
||||
blknr = grub_le_to_cpu32 (indir[rblock & ((1 << log_perblock) - 1)]);
|
||||
}
|
||||
fileblock -= blksz_quarter * blksz_quarter;
|
||||
/* Triple indirect. */
|
||||
if (fileblock < blksz_quarter * blksz_quarter * (blksz_quarter + 1))
|
||||
/* triple indirect. */
|
||||
else if (fileblock < INDIRECT_BLOCKS + blksz / 4 * ((grub_disk_addr_t) blksz / 4 + 1)
|
||||
+ ((grub_disk_addr_t) blksz / 4) * ((grub_disk_addr_t) blksz / 4)
|
||||
* ((grub_disk_addr_t) blksz / 4 + 1))
|
||||
{
|
||||
indir = inode->blocks.triple_indir_block;
|
||||
shift = 2;
|
||||
goto indirect;
|
||||
int log_perblock = log2_blksz + 9 - 2;
|
||||
grub_disk_addr_t rblock = fileblock - (INDIRECT_BLOCKS + blksz / 4
|
||||
* (blksz / 4 + 1));
|
||||
grub_uint32_t indir[blksz / 4];
|
||||
|
||||
if (grub_disk_read (data->disk,
|
||||
((grub_disk_addr_t)
|
||||
grub_le_to_cpu32 (inode->blocks.triple_indir_block))
|
||||
<< log2_blksz,
|
||||
0, blksz, indir))
|
||||
return grub_errno;
|
||||
|
||||
if (grub_disk_read (data->disk,
|
||||
((grub_disk_addr_t)
|
||||
grub_le_to_cpu32 (indir[(rblock >> log_perblock) >> log_perblock]))
|
||||
<< log2_blksz,
|
||||
0, blksz, indir))
|
||||
return grub_errno;
|
||||
|
||||
if (grub_disk_read (data->disk,
|
||||
((grub_disk_addr_t)
|
||||
grub_le_to_cpu32 (indir[(rblock >> log_perblock) & ((1 << log_perblock) - 1)]))
|
||||
<< log2_blksz,
|
||||
0, blksz, indir))
|
||||
return grub_errno;
|
||||
|
||||
blknr = grub_le_to_cpu32 (indir[rblock & ((1 << log_perblock) - 1)]);
|
||||
}
|
||||
else
|
||||
{
|
||||
grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
|
||||
"ext2fs doesn't support quadruple indirect blocks");
|
||||
}
|
||||
return grub_error (GRUB_ERR_BAD_FS,
|
||||
"ext2fs doesn't support quadruple indirect blocks");
|
||||
|
||||
indirect:
|
||||
do {
|
||||
if (grub_disk_read (data->disk,
|
||||
((grub_disk_addr_t) grub_le_to_cpu32 (indir))
|
||||
<< log2_blksz,
|
||||
((fileblock >> (log_perblock * shift))
|
||||
& ((1 << log_perblock) - 1))
|
||||
* sizeof (indir),
|
||||
sizeof (indir), &indir))
|
||||
return grub_errno;
|
||||
} while (shift--);
|
||||
|
||||
return grub_le_to_cpu32 (indir);
|
||||
return blknr;
|
||||
}
|
||||
|
||||
/* Read LEN bytes from the file described by DATA starting with byte
|
||||
@@ -695,7 +719,7 @@ grub_ext2_iterate_dir (grub_fshelp_node_t dir,
|
||||
|
||||
if (dirent.inode != 0 && dirent.namelen != 0)
|
||||
{
|
||||
char filename[MAX_NAMELEN + 1];
|
||||
char filename[dirent.namelen + 1];
|
||||
struct grub_fshelp_node *fdiro;
|
||||
enum grub_fshelp_filetype type = GRUB_FSHELP_UNKNOWN;
|
||||
|
||||
|
||||
@@ -72,13 +72,10 @@ struct grub_jfs_extent
|
||||
grub_uint32_t blk2;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#define GRUB_JFS_IAG_INODES_OFFSET 3072
|
||||
#define GRUB_JFS_IAG_INODES_COUNT 128
|
||||
|
||||
struct grub_jfs_iag
|
||||
{
|
||||
grub_uint8_t unused[GRUB_JFS_IAG_INODES_OFFSET];
|
||||
struct grub_jfs_extent inodes[GRUB_JFS_IAG_INODES_COUNT];
|
||||
grub_uint8_t unused[3072];
|
||||
struct grub_jfs_extent inodes[128];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
|
||||
@@ -286,25 +283,20 @@ getblk (struct grub_jfs_treehead *treehead,
|
||||
|
||||
if (found != -1)
|
||||
{
|
||||
grub_int64_t ret = -1;
|
||||
struct
|
||||
{
|
||||
struct grub_jfs_treehead treehead;
|
||||
struct grub_jfs_tree_extent extents[254];
|
||||
} *tree;
|
||||
} tree;
|
||||
|
||||
tree = grub_zalloc (sizeof (*tree));
|
||||
if (!tree)
|
||||
if (grub_disk_read (data->disk,
|
||||
((grub_disk_addr_t) grub_le_to_cpu32 (extents[found].extent.blk2))
|
||||
<< (grub_le_to_cpu16 (data->sblock.log2_blksz)
|
||||
- GRUB_DISK_SECTOR_BITS), 0,
|
||||
sizeof (tree), (char *) &tree))
|
||||
return -1;
|
||||
|
||||
if (!grub_disk_read (data->disk,
|
||||
((grub_disk_addr_t) grub_le_to_cpu32 (extents[found].extent.blk2))
|
||||
<< (grub_le_to_cpu16 (data->sblock.log2_blksz)
|
||||
- GRUB_DISK_SECTOR_BITS), 0,
|
||||
sizeof (*tree), (char *) tree))
|
||||
ret = getblk (&tree->treehead, &tree->extents[0], data, blk);
|
||||
grub_free (tree);
|
||||
return ret;
|
||||
return getblk (&tree.treehead, &tree.extents[0], data, blk);
|
||||
}
|
||||
|
||||
return -1;
|
||||
@@ -324,7 +316,7 @@ static grub_err_t
|
||||
grub_jfs_read_inode (struct grub_jfs_data *data, grub_uint32_t ino,
|
||||
struct grub_jfs_inode *inode)
|
||||
{
|
||||
struct grub_jfs_extent iag_inodes[GRUB_JFS_IAG_INODES_COUNT];
|
||||
struct grub_jfs_iag iag;
|
||||
grub_uint32_t iagnum = ino / 4096;
|
||||
unsigned inoext = (ino % 4096) / 32;
|
||||
unsigned inonum = (ino % 4096) % 32;
|
||||
@@ -338,12 +330,11 @@ grub_jfs_read_inode (struct grub_jfs_data *data, grub_uint32_t ino,
|
||||
/* Read in the IAG. */
|
||||
if (grub_disk_read (data->disk,
|
||||
iagblk << (grub_le_to_cpu16 (data->sblock.log2_blksz)
|
||||
- GRUB_DISK_SECTOR_BITS),
|
||||
GRUB_JFS_IAG_INODES_OFFSET,
|
||||
sizeof (iag_inodes), &iag_inodes))
|
||||
- GRUB_DISK_SECTOR_BITS), 0,
|
||||
sizeof (struct grub_jfs_iag), &iag))
|
||||
return grub_errno;
|
||||
|
||||
inoblk = grub_le_to_cpu32 (iag_inodes[inoext].blk2);
|
||||
inoblk = grub_le_to_cpu32 (iag.inodes[inoext].blk2);
|
||||
inoblk <<= (grub_le_to_cpu16 (data->sblock.log2_blksz)
|
||||
- GRUB_DISK_SECTOR_BITS);
|
||||
inoblk += inonum;
|
||||
|
||||
@@ -128,11 +128,10 @@ grub_procfs_open (struct grub_file *file, const char *path)
|
||||
FOR_LIST_ELEMENTS((entry), (grub_procfs_entries))
|
||||
if (grub_strcmp (pathptr, entry->name) == 0)
|
||||
{
|
||||
grub_size_t sz;
|
||||
file->data = entry->get_contents (&sz);
|
||||
file->data = entry->get_contents ();
|
||||
if (!file->data)
|
||||
return grub_errno;
|
||||
file->size = sz;
|
||||
file->size = grub_strlen (file->data);
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
|
||||
@@ -129,7 +129,7 @@ LEAF_HASH (int bs, grub_uint64_t h, zap_leaf_phys_t *l)
|
||||
static inline int
|
||||
ZAP_LEAF_NUMCHUNKS (int bs)
|
||||
{
|
||||
return (((1U << bs) - 2 * ZAP_LEAF_HASH_NUMENTRIES (bs)) /
|
||||
return (((1 << bs) - 2 * ZAP_LEAF_HASH_NUMENTRIES (bs)) /
|
||||
ZAP_LEAF_CHUNKSIZE - 2);
|
||||
}
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ deps=`grep ^$modname: $moddep | sed s@^.*:@@`
|
||||
# remove old files if any
|
||||
rm -f $tmpfile $outfile
|
||||
|
||||
if test x@TARGET_APPLE_LINKER@ != x1; then
|
||||
if test x@TARGET_APPLE_CC@ != x1; then
|
||||
# stripout .modname and .moddeps sections from input module
|
||||
@TARGET_OBJCOPY@ -R .modname -R .moddeps $infile $tmpfile
|
||||
|
||||
|
||||
@@ -22,12 +22,9 @@ module=$1
|
||||
modname=`echo $module | sed -e 's@\.module.*$@@'`
|
||||
|
||||
# Print all symbols defined by module
|
||||
if test x"@TARGET_NMFLAGS_DEFINED_ONLY@" = x && test x"@TARGET_NMFLAGS_MINUS_P@" = x; then
|
||||
@TARGET_NM@ -g -p $module | \
|
||||
sed -n "s@^\([0-9a-fA-F]*\) *[TBRDS] *\([^ ]*\).*@defined $modname \2@p"
|
||||
elif test x"@TARGET_NMFLAGS_DEFINED_ONLY@" = x; then
|
||||
if test x"@TARGET_NMFLAGS_DEFINED_ONLY@" = x; then
|
||||
@TARGET_NM@ -g @TARGET_NMFLAGS_MINUS_P@ -p $module | \
|
||||
sed -n "s@^\([^ ]*\) *[TBRDS] *\([0-9a-fA-F]*\).*@defined $modname \1@p"
|
||||
sed -n "s@^\([0-9a-fA-F]*\) *[TBRDS] *\([^ ]*\).*@defined $modname \2@p"
|
||||
else
|
||||
@TARGET_NM@ -g --defined-only @TARGET_NMFLAGS_MINUS_P@ -p $module | \
|
||||
sed "s@^\([^ ]*\).*@defined $modname \1@g"
|
||||
|
||||
@@ -240,7 +240,12 @@ parse_angle (const char *value)
|
||||
/* Unicode symbol of degrees (a circle, U+b0). Put here in UTF-8 to
|
||||
avoid potential problem with text file reesncoding */
|
||||
|| grub_strcmp (ptr, "\xc2\xb0") == 0)
|
||||
angle = grub_divide_round (angle * 64, 90);
|
||||
{
|
||||
if (angle >= 0)
|
||||
angle = ((unsigned) angle * 64 + 45) / 90;
|
||||
else
|
||||
angle = -((unsigned) -angle * 64 + 45) / 90;
|
||||
}
|
||||
return angle;
|
||||
}
|
||||
|
||||
|
||||
@@ -166,17 +166,15 @@ read_block_data (struct grub_lzopio *lzopio)
|
||||
|
||||
if (lzopio->ccheck_fun)
|
||||
{
|
||||
grub_uint8_t computed_hash[GRUB_CRYPTO_MAX_MDLEN];
|
||||
GRUB_PROPERLY_ALIGNED_ARRAY (context, lzopio->ccheck_fun->contextsize);
|
||||
|
||||
if (lzopio->ccheck_fun->mdlen > GRUB_CRYPTO_MAX_MDLEN)
|
||||
return -1;
|
||||
|
||||
grub_crypto_hash (lzopio->ccheck_fun, computed_hash,
|
||||
lzopio->block.cdata,
|
||||
lzopio->block.csize);
|
||||
lzopio->ccheck_fun->init (context);
|
||||
lzopio->ccheck_fun->write (context, lzopio->block.cdata,
|
||||
lzopio->block.csize);
|
||||
lzopio->ccheck_fun->final (context);
|
||||
|
||||
if (grub_memcmp
|
||||
(computed_hash, &lzopio->block.ccheck,
|
||||
(lzopio->ccheck_fun->read (context), &lzopio->block.ccheck,
|
||||
sizeof (lzopio->block.ccheck)) != 0)
|
||||
return -1;
|
||||
}
|
||||
@@ -214,17 +212,15 @@ uncompress_block (struct grub_lzopio *lzopio)
|
||||
|
||||
if (lzopio->ucheck_fun)
|
||||
{
|
||||
grub_uint8_t computed_hash[GRUB_CRYPTO_MAX_MDLEN];
|
||||
GRUB_PROPERLY_ALIGNED_ARRAY (context, lzopio->ucheck_fun->contextsize);
|
||||
|
||||
if (lzopio->ucheck_fun->mdlen > GRUB_CRYPTO_MAX_MDLEN)
|
||||
return -1;
|
||||
|
||||
grub_crypto_hash (lzopio->ucheck_fun, computed_hash,
|
||||
lzopio->block.udata,
|
||||
lzopio->block.usize);
|
||||
lzopio->ucheck_fun->init (context);
|
||||
lzopio->ucheck_fun->write (context, lzopio->block.udata,
|
||||
lzopio->block.usize);
|
||||
lzopio->ucheck_fun->final (context);
|
||||
|
||||
if (grub_memcmp
|
||||
(computed_hash, &lzopio->block.ucheck,
|
||||
(lzopio->ucheck_fun->read (context), &lzopio->block.ucheck,
|
||||
sizeof (lzopio->block.ucheck)) != 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -1,111 +0,0 @@
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GRUB is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <grub/file.h>
|
||||
#include <grub/dl.h>
|
||||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
struct grub_offset_file
|
||||
{
|
||||
grub_file_t parent;
|
||||
grub_off_t off;
|
||||
};
|
||||
|
||||
static grub_ssize_t
|
||||
grub_offset_read (grub_file_t file, char *buf, grub_size_t len)
|
||||
{
|
||||
struct grub_offset_file *data = file->data;
|
||||
if (grub_file_seek (data->parent, data->off + file->offset) == (grub_off_t) -1)
|
||||
return -1;
|
||||
return grub_file_read (data->parent, buf, len);
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_offset_close (grub_file_t file)
|
||||
{
|
||||
struct grub_offset_file *data = file->data;
|
||||
|
||||
if (data->parent)
|
||||
grub_file_close (data->parent);
|
||||
|
||||
/* No need to close the same device twice. */
|
||||
file->device = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct grub_fs grub_offset_fs = {
|
||||
.name = "offset",
|
||||
.dir = 0,
|
||||
.open = 0,
|
||||
.read = grub_offset_read,
|
||||
.close = grub_offset_close,
|
||||
.label = 0,
|
||||
.next = 0
|
||||
};
|
||||
|
||||
void
|
||||
grub_file_offset_close (grub_file_t file)
|
||||
{
|
||||
struct grub_offset_file *off_data = file->data;
|
||||
off_data->parent = NULL;
|
||||
grub_file_close (file);
|
||||
}
|
||||
|
||||
grub_file_t
|
||||
grub_file_offset_open (grub_file_t parent, grub_off_t start, grub_off_t size)
|
||||
{
|
||||
struct grub_offset_file *off_data;
|
||||
grub_file_t off_file, last_off_file;
|
||||
grub_file_filter_id_t filter;
|
||||
|
||||
off_file = grub_zalloc (sizeof (*off_file));
|
||||
off_data = grub_zalloc (sizeof (*off_data));
|
||||
if (!off_file || !off_data)
|
||||
{
|
||||
grub_free (off_file);
|
||||
grub_free (off_data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
off_data->off = start;
|
||||
off_data->parent = parent;
|
||||
|
||||
off_file->device = parent->device;
|
||||
off_file->data = off_data;
|
||||
off_file->fs = &grub_offset_fs;
|
||||
off_file->size = size;
|
||||
|
||||
last_off_file = NULL;
|
||||
for (filter = GRUB_FILE_FILTER_COMPRESSION_FIRST;
|
||||
off_file && filter <= GRUB_FILE_FILTER_COMPRESSION_LAST; filter++)
|
||||
if (grub_file_filters_enabled[filter])
|
||||
{
|
||||
last_off_file = off_file;
|
||||
off_file = grub_file_filters_enabled[filter] (off_file, parent->name);
|
||||
}
|
||||
|
||||
if (!off_file)
|
||||
{
|
||||
off_data->parent = NULL;
|
||||
grub_file_close (last_off_file);
|
||||
return 0;
|
||||
}
|
||||
return off_file;
|
||||
}
|
||||
9
grub-core/kern/alpha/cache.S
Normal file
9
grub-core/kern/alpha/cache.S
Normal file
@@ -0,0 +1,9 @@
|
||||
|
||||
#include <grub/symbol.h>
|
||||
|
||||
.set noreorder
|
||||
.set nomacro
|
||||
|
||||
FUNCTION (grub_arch_sync_all_caches)
|
||||
call_pal 134
|
||||
ret $31,($26)
|
||||
114
grub-core/kern/alpha/divide.S
Normal file
114
grub-core/kern/alpha/divide.S
Normal file
@@ -0,0 +1,114 @@
|
||||
|
||||
#include <grub/symbol.h>
|
||||
|
||||
.set noat
|
||||
|
||||
.macro PREAMBLE
|
||||
|
||||
subq $30, 31 * 8, $30
|
||||
stq $0, (0 * 8)($30)
|
||||
stq $1, (1 * 8)($30)
|
||||
stq $2, (2 * 8)($30)
|
||||
stq $3, (3 * 8)($30)
|
||||
stq $4, (4 * 8)($30)
|
||||
stq $5, (5 * 8)($30)
|
||||
stq $6, (6 * 8)($30)
|
||||
stq $7, (7 * 8)($30)
|
||||
stq $8, (8 * 8)($30)
|
||||
stq $9, (9 * 8)($30)
|
||||
stq $10, (10 * 8)($30)
|
||||
stq $11, (11 * 8)($30)
|
||||
stq $12, (12 * 8)($30)
|
||||
stq $13, (13 * 8)($30)
|
||||
stq $14, (14 * 8)($30)
|
||||
stq $15, (15 * 8)($30)
|
||||
stq $16, (16 * 8)($30)
|
||||
stq $17, (17 * 8)($30)
|
||||
stq $18, (18 * 8)($30)
|
||||
stq $19, (19 * 8)($30)
|
||||
stq $20, (20 * 8)($30)
|
||||
stq $21, (21 * 8)($30)
|
||||
stq $22, (22 * 8)($30)
|
||||
stq $23, (23 * 8)($30)
|
||||
stq $24, (24 * 8)($30)
|
||||
stq $25, (25 * 8)($30)
|
||||
stq $26, (26 * 8)($30)
|
||||
stq $28, (28 * 8)($30)
|
||||
stq $29, (29 * 8)($30)
|
||||
addq $30, (30 * 8), $18
|
||||
/* load GP. */
|
||||
br $27, 1f
|
||||
1: ldgp $29, 0($27)
|
||||
.endm
|
||||
|
||||
.macro POSTAMBLE
|
||||
ldq $0, (0 * 8)($30)
|
||||
ldq $1, (1 * 8)($30)
|
||||
ldq $2, (2 * 8)($30)
|
||||
ldq $3, (3 * 8)($30)
|
||||
ldq $4, (4 * 8)($30)
|
||||
ldq $5, (5 * 8)($30)
|
||||
ldq $6, (6 * 8)($30)
|
||||
ldq $7, (7 * 8)($30)
|
||||
ldq $8, (8 * 8)($30)
|
||||
ldq $9, (9 * 8)($30)
|
||||
ldq $10, (10 * 8)($30)
|
||||
ldq $11, (11 * 8)($30)
|
||||
ldq $12, (12 * 8)($30)
|
||||
ldq $13, (13 * 8)($30)
|
||||
ldq $14, (14 * 8)($30)
|
||||
ldq $15, (15 * 8)($30)
|
||||
ldq $16, (16 * 8)($30)
|
||||
ldq $17, (17 * 8)($30)
|
||||
ldq $18, (18 * 8)($30)
|
||||
ldq $19, (19 * 8)($30)
|
||||
ldq $20, (20 * 8)($30)
|
||||
ldq $21, (21 * 8)($30)
|
||||
ldq $22, (22 * 8)($30)
|
||||
ldq $23, (23 * 8)($30)
|
||||
ldq $24, (24 * 8)($30)
|
||||
ldq $25, (25 * 8)($30)
|
||||
ldq $26, (26 * 8)($30)
|
||||
ldq $28, (28 * 8)($30)
|
||||
ldq $29, (29 * 8)($30)
|
||||
addq $30, 31 * 8, $30
|
||||
ret $31,($23)
|
||||
.endm
|
||||
|
||||
FUNCTION (__divqu)
|
||||
PREAMBLE
|
||||
mov $24, $16
|
||||
mov $25, $17
|
||||
jsr $26, EXT_C (grub_divmod64)
|
||||
mov $0, $27
|
||||
POSTAMBLE
|
||||
|
||||
FUNCTION (__remqu)
|
||||
PREAMBLE
|
||||
mov $24, $16
|
||||
mov $25, $17
|
||||
jsr $26, EXT_C (grub_divmod64)
|
||||
ldq $27, (30 * 8)($30)
|
||||
POSTAMBLE
|
||||
|
||||
FUNCTION (__divlu)
|
||||
PREAMBLE
|
||||
sll $24, 32, $16
|
||||
sra $16, 32, $16
|
||||
sll $25, 32, $17
|
||||
sra $17, 32, $17
|
||||
mov $24, $16
|
||||
mov $25, $17
|
||||
jsr $26, EXT_C (grub_divmod64)
|
||||
mov $0, $27
|
||||
POSTAMBLE
|
||||
|
||||
FUNCTION (__remlu)
|
||||
PREAMBLE
|
||||
sll $24, 32, $16
|
||||
sra $16, 32, $16
|
||||
sll $25, 32, $17
|
||||
sra $17, 32, $17
|
||||
jsr $26, EXT_C (grub_divmod64)
|
||||
ldq $27, (30 * 8)($30)
|
||||
POSTAMBLE
|
||||
257
grub-core/kern/alpha/dl.c
Normal file
257
grub-core/kern/alpha/dl.c
Normal file
@@ -0,0 +1,257 @@
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2011 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GRUB is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <grub/dl.h>
|
||||
#include <grub/elf.h>
|
||||
#include <grub/misc.h>
|
||||
#include <grub/err.h>
|
||||
#include <grub/cpu/types.h>
|
||||
#include <grub/mm.h>
|
||||
|
||||
#pragma GCC diagnostic ignored "-Wcast-align"
|
||||
|
||||
void
|
||||
grub_arch_dl_get_tramp_got_size (const void *ehdr, grub_size_t *tramp,
|
||||
grub_size_t *got)
|
||||
{
|
||||
const Elf64_Ehdr *e = ehdr;
|
||||
grub_size_t cntt = 0, cntg = 0;;
|
||||
const Elf64_Shdr *s;
|
||||
unsigned i;
|
||||
|
||||
/* Find a symbol table. */
|
||||
for (i = 0, s = (Elf64_Shdr *) ((char *) e + grub_le_to_cpu32 (e->e_shoff));
|
||||
i < grub_le_to_cpu16 (e->e_shnum);
|
||||
i++, s = (Elf64_Shdr *) ((char *) s + grub_le_to_cpu16 (e->e_shentsize)))
|
||||
if (grub_le_to_cpu32 (s->sh_type) == SHT_SYMTAB)
|
||||
break;
|
||||
|
||||
if (i == grub_le_to_cpu16 (e->e_shnum))
|
||||
return;
|
||||
|
||||
|
||||
for (i = 0, s = (Elf64_Shdr *) ((char *) e + grub_le_to_cpu32 (e->e_shoff));
|
||||
i < grub_le_to_cpu16 (e->e_shnum);
|
||||
i++, s = (Elf64_Shdr *) ((char *) s + grub_le_to_cpu16 (e->e_shentsize)))
|
||||
if (grub_le_to_cpu32 (s->sh_type) == SHT_RELA)
|
||||
{
|
||||
Elf64_Rela *rel, *max;
|
||||
|
||||
for (rel = (Elf64_Rela *) ((char *) e + grub_le_to_cpu32 (s->sh_offset)),
|
||||
max = rel + grub_le_to_cpu32 (s->sh_size) / grub_le_to_cpu16 (s->sh_entsize);
|
||||
rel < max; rel++)
|
||||
switch (ELF64_R_TYPE (grub_le_to_cpu32 (rel->r_info)))
|
||||
{
|
||||
case R_ALPHA_LITERAL:
|
||||
cntg++;
|
||||
break;
|
||||
default:;
|
||||
}
|
||||
}
|
||||
*tramp = cntt;
|
||||
*got = cntg;
|
||||
}
|
||||
|
||||
|
||||
/* Check if EHDR is a valid ELF header. */
|
||||
grub_err_t
|
||||
grub_arch_dl_check_header (void *ehdr)
|
||||
{
|
||||
Elf_Ehdr *e = ehdr;
|
||||
|
||||
/* Check the magic numbers. */
|
||||
if (e->e_ident[EI_CLASS] != ELFCLASS64
|
||||
|| e->e_ident[EI_DATA] != ELFDATA2LSB
|
||||
|| e->e_machine != EM_ALPHA)
|
||||
return grub_error (GRUB_ERR_BAD_OS, "invalid arch specific ELF magic");
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
/* Relocate symbols. */
|
||||
grub_err_t
|
||||
grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr)
|
||||
{
|
||||
Elf_Ehdr *e = ehdr;
|
||||
Elf_Shdr *s;
|
||||
Elf_Word entsize;
|
||||
unsigned i;
|
||||
grub_uint8_t *gp;
|
||||
grub_uint64_t *gpptr;
|
||||
|
||||
gp = (grub_uint8_t *) mod->got;
|
||||
gpptr = (grub_uint64_t *) mod->got;
|
||||
|
||||
/* Find a symbol table. */
|
||||
for (i = 0, s = (Elf_Shdr *) ((char *) e + e->e_shoff);
|
||||
i < e->e_shnum;
|
||||
i++, s = (Elf_Shdr *) ((char *) s + e->e_shentsize))
|
||||
if (s->sh_type == SHT_SYMTAB)
|
||||
break;
|
||||
|
||||
if (i == e->e_shnum)
|
||||
return grub_error (GRUB_ERR_BAD_MODULE, "no symtab found");
|
||||
|
||||
entsize = s->sh_entsize;
|
||||
|
||||
for (i = 0, s = (Elf_Shdr *) ((char *) e + e->e_shoff);
|
||||
i < e->e_shnum;
|
||||
i++, s = (Elf_Shdr *) ((char *) s + e->e_shentsize))
|
||||
if (s->sh_type == SHT_RELA)
|
||||
{
|
||||
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_Rela *rel, *max;
|
||||
|
||||
for (rel = (Elf_Rela *) ((char *) e + s->sh_offset),
|
||||
max = (Elf_Rela *) ((char *) rel + s->sh_size);
|
||||
rel < max;
|
||||
rel++)
|
||||
{
|
||||
grub_uint8_t *addr;
|
||||
Elf_Sym *sym;
|
||||
grub_uint64_t value;
|
||||
|
||||
if (seg->size < rel->r_offset)
|
||||
return grub_error (GRUB_ERR_BAD_MODULE,
|
||||
"reloc offset is out of the segment");
|
||||
|
||||
addr = (grub_uint8_t *) seg->addr + rel->r_offset;
|
||||
sym = (Elf_Sym *) ((char *) mod->symtab
|
||||
+ entsize * ELF_R_SYM (rel->r_info));
|
||||
|
||||
value = sym->st_value + rel->r_addend;
|
||||
switch (ELF_R_TYPE (rel->r_info))
|
||||
{
|
||||
case R_ALPHA_REFQUAD:
|
||||
*(grub_uint64_t *) addr += value;
|
||||
break;
|
||||
case R_ALPHA_REFLONG:
|
||||
*(grub_uint32_t *) addr += value;
|
||||
break;
|
||||
|
||||
case R_ALPHA_GPREL32:
|
||||
*(grub_uint32_t *) addr += value - (grub_addr_t) gp;
|
||||
break;
|
||||
|
||||
case R_ALPHA_GPDISP:
|
||||
{
|
||||
grub_int64_t off = gp - addr;
|
||||
|
||||
if (off < (-2147483647L - 1)
|
||||
|| off > 2147483647L)
|
||||
return grub_error (GRUB_ERR_BAD_MODULE,
|
||||
"gpdisp offset too large");
|
||||
/* Lower part is
|
||||
treated as signed. Hence add 0x8000 to compensate.
|
||||
*/
|
||||
*(grub_uint16_t *) addr = (off + 0x8000) >> 16;
|
||||
*(grub_uint16_t *) (addr + rel->r_addend) = off;
|
||||
break;
|
||||
}
|
||||
|
||||
case R_ALPHA_GPRELHIGH:
|
||||
{
|
||||
Elf_Rela *rel2;
|
||||
|
||||
/* Handle partner lo16 relocation. Lower part is
|
||||
treated as signed. Hence add 0x8000 to compensate.
|
||||
*/
|
||||
value += (*(grub_uint16_t *) addr << 16);
|
||||
value -= (grub_addr_t) gp;
|
||||
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_ALPHA_GPRELLOW)
|
||||
{
|
||||
value += *(grub_int16_t *)
|
||||
((char *) seg->addr + rel2->r_offset);
|
||||
break;
|
||||
}
|
||||
/* Handle partner lo16 relocation. Lower part is
|
||||
treated as signed. Hence add 0x8000 to compensate.
|
||||
*/
|
||||
if ((grub_int64_t) value < (-2147483647L - 1)
|
||||
|| (grub_int64_t) value > 2147483647L)
|
||||
return grub_error (GRUB_ERR_BAD_MODULE,
|
||||
"gpdisp offset too large");
|
||||
value += 0x8000;
|
||||
*(grub_uint16_t *) addr = (value >> 16) & 0xffff;
|
||||
break;
|
||||
}
|
||||
case R_ALPHA_GPRELLOW:
|
||||
value -= (grub_addr_t) gp;
|
||||
*(grub_uint16_t *) addr += value & 0xffff;
|
||||
break;
|
||||
case R_ALPHA_LITERAL:
|
||||
*gpptr = value + *(grub_uint16_t *) addr;
|
||||
*(grub_uint16_t *) addr = ((grub_uint8_t *) gpptr - gp);
|
||||
gpptr++;
|
||||
break;
|
||||
case R_ALPHA_SREL32:
|
||||
*(grub_uint32_t *) addr += value - (grub_addr_t) seg->addr;
|
||||
break;
|
||||
case R_ALPHA_BRSGP:
|
||||
value += (((*(grub_uint32_t *) addr)
|
||||
& ((1 << 21) - 1)) << 2);
|
||||
value -= (grub_addr_t) addr;
|
||||
if (sym->st_other == STO_ALPHA_STD_GPLOAD)
|
||||
value += 4;
|
||||
else
|
||||
value -= 4;
|
||||
if (value & 3)
|
||||
return grub_error (GRUB_ERR_BAD_MODULE,
|
||||
"unaligned branch");
|
||||
|
||||
if ((value & ~((1UL << 22) - 1)) != 0
|
||||
&& (value & ~((1UL << 22) - 1)) != ~((1UL << 22) - 1))
|
||||
return grub_error (GRUB_ERR_BAD_MODULE,
|
||||
"brs offset too large (%lx)",
|
||||
value);
|
||||
|
||||
*(grub_uint32_t *) addr
|
||||
= ((*(grub_uint32_t *) addr & ~((1 << 21) - 1))
|
||||
| ((value >> 2) & ((1 << 21) - 1)));
|
||||
break;
|
||||
|
||||
case R_ALPHA_LITUSE:
|
||||
case R_ALPHA_HINT:
|
||||
break;
|
||||
|
||||
default:
|
||||
{
|
||||
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
|
||||
"Unknown relocation type %d\n",
|
||||
ELF_R_TYPE (rel->r_info));
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
215
grub-core/kern/alpha/srm/init.c
Normal file
215
grub-core/kern/alpha/srm/init.c
Normal file
@@ -0,0 +1,215 @@
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2011 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GRUB is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <grub/types.h>
|
||||
#include <grub/misc.h>
|
||||
#include <grub/mm.h>
|
||||
#include <grub/time.h>
|
||||
#include <grub/err.h>
|
||||
#include <grub/dl.h>
|
||||
#include <grub/cache.h>
|
||||
#include <grub/kernel.h>
|
||||
#include <grub/memory.h>
|
||||
#include <grub/env.h>
|
||||
#include <grub/machine/srm.h>
|
||||
#include <grub/machine/console.h>
|
||||
|
||||
/* FIXME: determine va_size. */
|
||||
static void *kseg_addr = (void *) 0xfffffc0000000000;
|
||||
static grub_uint64_t log_page_size;
|
||||
|
||||
extern char _start[];
|
||||
extern char _end[];
|
||||
|
||||
grub_uint32_t grub_arch_pccclock;
|
||||
|
||||
/* FIXME: use interrupt to count high. */
|
||||
grub_uint64_t
|
||||
grub_get_rtc (void)
|
||||
{
|
||||
static grub_uint32_t high = 0;
|
||||
static grub_uint32_t last = 0;
|
||||
grub_uint32_t low;
|
||||
|
||||
asm volatile ("rpcc %0" : "=r" (low));
|
||||
if (low < last)
|
||||
high++;
|
||||
last = low;
|
||||
|
||||
return (((grub_uint64_t) high) << 32) | low;
|
||||
}
|
||||
|
||||
static grub_addr_t
|
||||
get_pfn (grub_addr_t va, grub_uint64_t ptbr)
|
||||
{
|
||||
grub_uint64_t *l1;
|
||||
grub_uint64_t l1n;
|
||||
grub_uint64_t *l2;
|
||||
grub_uint64_t l2n;
|
||||
grub_uint64_t *l3;
|
||||
grub_uint64_t l3n;
|
||||
|
||||
l3n = va >> log_page_size;
|
||||
l2n = l3n >> (log_page_size - 3);
|
||||
l1n = l2n >> (log_page_size - 3);
|
||||
l3n &= ((1 << (log_page_size - 3)) - 1);
|
||||
l2n &= ((1 << (log_page_size - 3)) - 1);
|
||||
l1n &= ((1 << (log_page_size - 3)) - 1);
|
||||
|
||||
l1 = ((grub_uint64_t *) kseg_addr + (ptbr << (log_page_size - 3))
|
||||
+ l1n);
|
||||
l2 = ((grub_uint64_t *) kseg_addr + ((*l1 >> 32) << (log_page_size - 3))
|
||||
+ l2n);
|
||||
l3 = ((grub_uint64_t *) kseg_addr + ((*l2 >> 32) << (log_page_size - 3))
|
||||
+ l3n);
|
||||
return (*l3 >> 32);
|
||||
}
|
||||
|
||||
void pal_init(void);
|
||||
|
||||
grub_addr_t grub_modbase;
|
||||
|
||||
void
|
||||
grub_machine_get_bootlocation (char **device __attribute__ ((unused)),
|
||||
char **path __attribute__ ((unused)))
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
grub_machine_init (void)
|
||||
{
|
||||
unsigned i;
|
||||
struct grub_alpha_srm_memdesc *memdesc;
|
||||
struct grub_alpha_srm_hwpcb *pcb;
|
||||
grub_addr_t a;
|
||||
grub_addr_t start, end;
|
||||
grub_uint64_t low_pfn = ~0ULL, high_pfn = 0;
|
||||
|
||||
grub_arch_pccclock = GRUB_ALPHA_SRM_HWRPB.pcc_freq;
|
||||
grub_modbase = (grub_addr_t) _end;
|
||||
|
||||
grub_console_init_early ();
|
||||
|
||||
pal_init ();
|
||||
|
||||
grub_install_get_time_ms (grub_rtc_get_time_ms);
|
||||
|
||||
for (log_page_size = 0;
|
||||
!((1 << log_page_size) & GRUB_ALPHA_SRM_HWRPB.page_size);
|
||||
log_page_size++);
|
||||
|
||||
memdesc = (struct grub_alpha_srm_memdesc *)
|
||||
(GRUB_ALPHA_SRM_HWRPB_ADDR + GRUB_ALPHA_SRM_HWRPB.memory_descriptor_table);
|
||||
|
||||
pcb = (void *) (GRUB_ALPHA_SRM_HWRPB_ADDR
|
||||
+ GRUB_ALPHA_SRM_HWRPB.cpu_slots_offset
|
||||
+ (GRUB_ALPHA_SRM_HWRPB.primary_cpu_id
|
||||
* GRUB_ALPHA_SRM_HWRPB.cpu_slot_size));
|
||||
|
||||
start = ALIGN_DOWN ((grub_addr_t) (&_start[0]),
|
||||
GRUB_ALPHA_SRM_HWRPB.page_size);
|
||||
end = ALIGN_UP (grub_modules_get_end (), GRUB_ALPHA_SRM_HWRPB.page_size);
|
||||
for (a = start; a < end; a += GRUB_ALPHA_SRM_HWRPB.page_size)
|
||||
{
|
||||
grub_uint64_t curpfn = get_pfn (a, pcb->ptbr);
|
||||
if (curpfn > high_pfn)
|
||||
high_pfn = curpfn;
|
||||
if (curpfn < low_pfn)
|
||||
low_pfn = curpfn;
|
||||
}
|
||||
|
||||
for (i = 0; i < memdesc->num_entries; i++)
|
||||
{
|
||||
grub_uint64_t from, to;
|
||||
if (memdesc->entries[i].type
|
||||
!= GRUB_ALPHA_SRM_MEMDESC_ENTRY_TYPE_AVAILABLE)
|
||||
continue;
|
||||
from = memdesc->entries[i].start_page;
|
||||
to = memdesc->entries[i].start_page + memdesc->entries[i].num_pages;
|
||||
if ((to > low_pfn) && (from < high_pfn + 1))
|
||||
{
|
||||
if (from < low_pfn)
|
||||
/* from .. (lowpfn - 1) */
|
||||
grub_mm_init_region ((char *) kseg_addr + (from << log_page_size),
|
||||
(low_pfn - from) << log_page_size);
|
||||
if (high_pfn + 1 < to)
|
||||
/* (high_pfn + 1) .. (to - 1) */
|
||||
grub_mm_init_region ((char *) kseg_addr
|
||||
+ ((high_pfn + 1) << log_page_size),
|
||||
(to - high_pfn - 1) << log_page_size);
|
||||
}
|
||||
else
|
||||
/* from .. (to - 1) */
|
||||
grub_mm_init_region ((char *) kseg_addr
|
||||
+ (from << log_page_size),
|
||||
(to - from) << log_page_size);
|
||||
}
|
||||
|
||||
grub_console_init_lately ();
|
||||
|
||||
grub_srmdisk_init ();
|
||||
|
||||
char buf[512];
|
||||
grub_alpha_srm_dispatch (0x22, 2, buf, sizeof (buf));
|
||||
grub_printf ("Hello World %s\n", buf);
|
||||
}
|
||||
|
||||
void
|
||||
grub_machine_fini (void)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
grub_exit (void)
|
||||
{
|
||||
while (1);
|
||||
}
|
||||
|
||||
grub_err_t
|
||||
grub_machine_mmap_iterate (grub_memory_hook_t hook, void *hook_data)
|
||||
{
|
||||
struct grub_alpha_srm_memdesc *memdesc;
|
||||
unsigned i;
|
||||
|
||||
memdesc = (struct grub_alpha_srm_memdesc *)
|
||||
(GRUB_ALPHA_SRM_HWRPB_ADDR + GRUB_ALPHA_SRM_HWRPB.memory_descriptor_table);
|
||||
|
||||
for (i = 0; i < memdesc->num_entries; i++)
|
||||
switch (memdesc->entries[i].type)
|
||||
{
|
||||
case GRUB_ALPHA_SRM_MEMDESC_ENTRY_TYPE_AVAILABLE:
|
||||
hook (memdesc->entries[i].start_page << log_page_size,
|
||||
memdesc->entries[i].num_pages << log_page_size,
|
||||
GRUB_MEMORY_AVAILABLE, hook_data);
|
||||
break;
|
||||
case GRUB_ALPHA_SRM_MEMDESC_ENTRY_TYPE_NONVOLATILE:
|
||||
hook (memdesc->entries[i].start_page << log_page_size,
|
||||
memdesc->entries[i].num_pages << log_page_size,
|
||||
GRUB_MEMORY_NVRAM, hook_data);
|
||||
break;
|
||||
case GRUB_ALPHA_SRM_MEMDESC_ENTRY_TYPE_RESERVED1:
|
||||
case GRUB_ALPHA_SRM_MEMDESC_ENTRY_TYPE_RESERVED2:
|
||||
default:
|
||||
hook (memdesc->entries[i].start_page << log_page_size,
|
||||
memdesc->entries[i].num_pages << log_page_size,
|
||||
GRUB_MEMORY_RESERVED, hook_data);
|
||||
break;
|
||||
}
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
54
grub-core/kern/alpha/srm/startup.S
Normal file
54
grub-core/kern/alpha/srm/startup.S
Normal file
@@ -0,0 +1,54 @@
|
||||
#include <config.h>
|
||||
#include <grub/symbol.h>
|
||||
#include <grub/offsets.h>
|
||||
|
||||
.set noreorder
|
||||
.globl _start
|
||||
.ent _start
|
||||
_start:
|
||||
.prologue 0
|
||||
/* load GP. */
|
||||
br $27, 1f
|
||||
1: ldgp $29, 0($27)
|
||||
|
||||
/* Move modules out of the BSS. */
|
||||
lda $1, __bss_start
|
||||
lda $2, _end
|
||||
lda $4, modsize
|
||||
ldq $3, 0($4)
|
||||
addq $3, 7, $3
|
||||
sra $3, 3, $3
|
||||
sll $3, 3, $4
|
||||
subq $4, 8, $4
|
||||
addq $1, $4, $1
|
||||
addq $2, $4, $2
|
||||
|
||||
2:
|
||||
beq $3, 3f
|
||||
ldq $4, 0($1)
|
||||
stq $4, 0($2)
|
||||
subq $3, 1, $3
|
||||
subq $1, 8, $1
|
||||
subq $2, 8, $2
|
||||
br 2b
|
||||
3:
|
||||
|
||||
/* Clean BSS. */
|
||||
lda $1, __bss_start
|
||||
lda $2, _end
|
||||
subq $2, $1, $2
|
||||
sra $2, 3, $2
|
||||
2:
|
||||
beq $2, 3f
|
||||
stq $31, 0($1)
|
||||
subq $2, 1, $2
|
||||
addq $1, 8, $1
|
||||
br 2b
|
||||
3:
|
||||
/* call main. */
|
||||
lda $27, EXT_C (grub_main)
|
||||
jmp ($27)
|
||||
.end _start
|
||||
. = _start + GRUB_KERNEL_ALPHA_SRM_TOTAL_MODULE_SIZE
|
||||
modsize:
|
||||
.quad 0
|
||||
@@ -21,12 +21,7 @@
|
||||
.file "cache.S"
|
||||
.text
|
||||
.syntax unified
|
||||
#if !defined (__thumb2__) || !defined (ARMV7)
|
||||
.arm
|
||||
#else
|
||||
.thumb
|
||||
#endif
|
||||
|
||||
#if !defined (ARMV6) && !defined (ARMV7)
|
||||
# error Unsupported architecture version!
|
||||
#endif
|
||||
@@ -37,16 +32,11 @@
|
||||
* Simple cache maintenance functions
|
||||
*/
|
||||
|
||||
dlinesz_addr:
|
||||
.long EXT_C(grub_arch_cache_dlinesz)
|
||||
ilinesz_addr:
|
||||
.long EXT_C(grub_arch_cache_ilinesz)
|
||||
|
||||
@ r0 - *beg (inclusive)
|
||||
@ r1 - *end (exclusive)
|
||||
clean_dcache_range:
|
||||
@ Clean data cache for range to point-of-unification
|
||||
ldr r2, dlinesz_addr
|
||||
ldr r2, =EXT_C(grub_arch_cache_dlinesz)
|
||||
ldr r2, [r2]
|
||||
sub r3, r2, #1 @ align "beg" to start of line
|
||||
mvn r3, r3
|
||||
@@ -67,7 +57,7 @@ clean_dcache_range:
|
||||
@ r1 - *end (exclusive)
|
||||
invalidate_icache_range:
|
||||
@ Invalidate instruction cache for range to point-of-unification
|
||||
ldr r2, ilinesz_addr
|
||||
ldr r2, =EXT_C(grub_arch_cache_ilinesz)
|
||||
ldr r2, [r2]
|
||||
sub r3, r2, #1 @ align "beg" to start of line
|
||||
mvn r3, r3
|
||||
|
||||
@@ -21,8 +21,6 @@ void grub_arch_sync_caches_armv6 (void *address, grub_size_t len);
|
||||
void grub_arch_sync_caches_armv7 (void *address, grub_size_t len);
|
||||
void grub_arm_disable_caches_mmu_armv6 (void);
|
||||
void grub_arm_disable_caches_mmu_armv7 (void);
|
||||
grub_uint32_t grub_arm_main_id (void);
|
||||
grub_uint32_t grub_arm_cache_type (void);
|
||||
|
||||
static void
|
||||
probe_caches (void)
|
||||
@@ -30,7 +28,7 @@ probe_caches (void)
|
||||
grub_uint32_t main_id, cache_type;
|
||||
|
||||
/* Read main ID Register */
|
||||
main_id = grub_arm_main_id ();
|
||||
asm volatile ("mrc p15, 0, %0, c0, c0, 0": "=r"(main_id));
|
||||
|
||||
switch ((main_id >> 16) & 0xf)
|
||||
{
|
||||
@@ -46,7 +44,7 @@ probe_caches (void)
|
||||
}
|
||||
|
||||
/* Read Cache Type Register */
|
||||
cache_type = grub_arm_cache_type ();
|
||||
asm volatile ("mrc p15, 0, %0, c0, c0, 1": "=r"(cache_type));
|
||||
|
||||
switch (cache_type >> 24)
|
||||
{
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
.syntax unified
|
||||
.arm
|
||||
.arch armv6
|
||||
|
||||
# define DMB mcr p15, 0, r0, c7, c10, 5
|
||||
# define DSB mcr p15, 0, r0, c7, c10, 4
|
||||
# define ISB mcr p15, 0, r0, c7, c5, 4
|
||||
@@ -33,12 +32,4 @@ clean_invalidate_dcache:
|
||||
mcr p15, 0, r0, c7, c14, 0 @ Clean/Invalidate D-cache
|
||||
bx lr
|
||||
|
||||
#include "cache.S"
|
||||
|
||||
FUNCTION(grub_arm_main_id)
|
||||
mrc p15, 0, r0, c0, c0, 0
|
||||
bx lr
|
||||
|
||||
FUNCTION(grub_arm_cache_type)
|
||||
mrc p15, 0, r0, c0, c0, 1
|
||||
bx lr
|
||||
#include "cache.S"
|
||||
@@ -21,13 +21,8 @@
|
||||
.file "cache_armv7.S"
|
||||
.text
|
||||
.syntax unified
|
||||
#if !defined (__thumb2__)
|
||||
.arch armv7a
|
||||
.arm
|
||||
#else
|
||||
.arch armv7
|
||||
.thumb
|
||||
#endif
|
||||
.arch armv7a
|
||||
# define DMB dmb
|
||||
# define DSB dsb
|
||||
# define ISB isb
|
||||
@@ -63,17 +58,11 @@ clean_invalidate_dcache:
|
||||
@ read current cache information
|
||||
mrc p15, 1, r8, c0, c0, 0 @ Read CCSIDR
|
||||
lsr r3, r8, #13 @ Number of sets -1
|
||||
|
||||
@ Keep only 14 bits of r3
|
||||
lsl r3, r3, #18
|
||||
lsr r3, r3, #18
|
||||
|
||||
ldr r9, =0x3fff
|
||||
and r3, r3, r9
|
||||
lsr r4, r8, #3 @ Number of ways -1
|
||||
|
||||
@ Keep only 9 bits of r4
|
||||
lsl r4, r4, #23
|
||||
lsr r4, r4, #23
|
||||
|
||||
ldr r9, =0x1ff
|
||||
and r4, r4, r9
|
||||
and r7, r8, #7 @ log2(line size in words) - 2
|
||||
add r7, r7, #2 @ adjust
|
||||
mov r8, #1
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <grub/mm.h>
|
||||
#include <grub/time.h>
|
||||
#include <grub/efi/efi.h>
|
||||
#include <grub/loader.h>
|
||||
|
||||
static grub_uint64_t tmr;
|
||||
static grub_efi_event_t tmr_evt;
|
||||
@@ -58,13 +57,10 @@ grub_machine_init (void)
|
||||
}
|
||||
|
||||
void
|
||||
grub_machine_fini (int flags)
|
||||
grub_machine_fini (void)
|
||||
{
|
||||
grub_efi_boot_services_t *b;
|
||||
|
||||
if (!(flags & GRUB_LOADER_FLAG_NORETURN))
|
||||
return;
|
||||
|
||||
b = grub_efi_system_table->boot_services;
|
||||
|
||||
efi_call_3 (b->set_timer, tmr_evt, GRUB_EFI_TIMER_PERIODIC, 0);
|
||||
|
||||
@@ -33,4 +33,4 @@ FUNCTION(_start)
|
||||
str r1, [ip]
|
||||
ldr ip, =EXT_C(grub_main)
|
||||
bx ip
|
||||
END
|
||||
.end
|
||||
|
||||
@@ -30,54 +30,6 @@
|
||||
|
||||
.align 2
|
||||
|
||||
FUNCTION(__muldi3)
|
||||
FUNCTION(__aeabi_lmul)
|
||||
stmfd sp!, {r4, fp}
|
||||
add fp, sp, #4
|
||||
sub sp, sp, #16
|
||||
str r0, [fp, #-12]
|
||||
str r1, [fp, #-8]
|
||||
str r2, [fp, #-20]
|
||||
str r3, [fp, #-16]
|
||||
ldr r3, [fp, #-8]
|
||||
ldr r2, [fp, #-20]
|
||||
mul r2, r3, r2
|
||||
ldr r3, [fp, #-16]
|
||||
ldr r1, [fp, #-12]
|
||||
mul r3, r1, r3
|
||||
add r2, r2, r3
|
||||
ldr r0, [fp, #-12]
|
||||
ldr r1, [fp, #-20]
|
||||
umull r3, r4, r0, r1
|
||||
add r2, r2, r4
|
||||
mov r4, r2
|
||||
mov r0, r3
|
||||
mov r1, r4
|
||||
mov sp, fp
|
||||
sub sp, sp, #4
|
||||
ldmfd sp!, {r4, fp}
|
||||
bx lr
|
||||
|
||||
.macro division parent
|
||||
|
||||
stmfd sp!, {lr}
|
||||
sub sp, sp, #12
|
||||
mov r2, r1
|
||||
add r1, sp, #4
|
||||
str r1, [sp, #0]
|
||||
mov r1, #0
|
||||
mov r3, #0
|
||||
bl \parent
|
||||
ldr r1, [sp, #4]
|
||||
add sp, sp, #12
|
||||
ldmfd sp!, {lr}
|
||||
bx lr
|
||||
.endm
|
||||
|
||||
FUNCTION(__aeabi_uidivmod)
|
||||
division grub_divmod64
|
||||
|
||||
|
||||
/*
|
||||
* Null divide-by-zero handler
|
||||
*/
|
||||
@@ -86,4 +38,4 @@ FUNCTION(raise)
|
||||
mov r0, #0
|
||||
bx lr
|
||||
|
||||
END
|
||||
.end
|
||||
|
||||
@@ -51,40 +51,31 @@ FUNCTION(_start)
|
||||
b codestart
|
||||
|
||||
@ Size of final image integrated module blob - set by grub-mkimage
|
||||
.org _start + GRUB_KERNEL_MACHINE_TOTAL_MODULE_SIZE
|
||||
. = _start + GRUB_KERNEL_MACHINE_TOTAL_MODULE_SIZE
|
||||
VARIABLE(grub_total_module_size)
|
||||
.long 0
|
||||
|
||||
VARIABLE(grub_uboot_machine_type)
|
||||
.long 0
|
||||
VARIABLE(grub_uboot_boot_data)
|
||||
.long 0
|
||||
VARIABLE(grub_modbase)
|
||||
.long 0
|
||||
bss_start_ptr:
|
||||
.long EXT_C(__bss_start)
|
||||
end_ptr:
|
||||
.long EXT_C(_end)
|
||||
|
||||
FUNCTION(codestart)
|
||||
@ Store context: Machine ID, atags/dtb, ...
|
||||
@ U-Boot API signature is stored on the U-Boot heap
|
||||
@ Stack pointer used as start address for signature probing
|
||||
mov r12, sp
|
||||
adr sp, entry_state
|
||||
ldr sp, =entry_state
|
||||
push {r4-r12,lr} @ store U-Boot context (sp in r12)
|
||||
|
||||
str r1, EXT_C(grub_uboot_machine_type)
|
||||
str r2, EXT_C(grub_uboot_boot_data)
|
||||
ldr r12, =EXT_C(grub_uboot_machine_type)
|
||||
str r1, [r12]
|
||||
ldr r12, =EXT_C(grub_uboot_boot_data)
|
||||
str r2, [r12]
|
||||
|
||||
@ Modules have been stored as a blob in BSS,
|
||||
@ they need to be manually relocated to _end
|
||||
ldr r0, bss_start_ptr @ src
|
||||
ldr r0, =EXT_C(__bss_start) @ src
|
||||
add r0, r0, #(GRUB_KERNEL_MACHINE_MOD_ALIGN - 1)
|
||||
mvn r1, #(GRUB_KERNEL_MACHINE_MOD_ALIGN - 1)
|
||||
and r0, r0, r1
|
||||
|
||||
ldr r1, end_ptr @ dst = End of BSS
|
||||
ldr r1, =EXT_C(_end) @ dst = End of BSS
|
||||
ldr r2, grub_total_module_size @ blob size
|
||||
|
||||
add r1, r1, #GRUB_KERNEL_MACHINE_STACK_SIZE
|
||||
@@ -92,7 +83,8 @@ FUNCTION(codestart)
|
||||
sub sp, r1, #8
|
||||
add r1, r1, #1024
|
||||
|
||||
str r1, EXT_C(grub_modbase)
|
||||
ldr r12, =EXT_C(grub_modbase)
|
||||
str r1, [r12]
|
||||
|
||||
add r1, r1, r2
|
||||
add r0, r0, r2
|
||||
@@ -106,14 +98,14 @@ FUNCTION(codestart)
|
||||
|
||||
@ Since we _are_ the C run-time, we need to manually zero the BSS
|
||||
@ region before continuing
|
||||
ldr r0, bss_start_ptr @ zero from here
|
||||
ldr r0, =EXT_C(__bss_start) @ zero from here
|
||||
@ If unaligned, bytewise zero until base address aligned.
|
||||
mov r2, #0
|
||||
1: tst r0, #3
|
||||
beq 2f
|
||||
strb r2, [r0], #1
|
||||
b 1b
|
||||
2: ldr r1, end_ptr @ to here
|
||||
2: ldr r1, =EXT_C(_end) @ to here
|
||||
1: str r2, [r0], #4
|
||||
cmp r0, r1
|
||||
bne 1b
|
||||
@@ -128,39 +120,37 @@ FUNCTION(codestart)
|
||||
* U-Boot (Global Data Pointer) and preserve it for Grub.
|
||||
*/
|
||||
FUNCTION(grub_uboot_syscall)
|
||||
str r8, transition_space
|
||||
str lr, transition_space + 4
|
||||
str r9, transition_space + 8
|
||||
|
||||
ldr r8, gd_backup
|
||||
ldr r9, gd_backup + 4
|
||||
|
||||
ldr ip, =transition_space
|
||||
stm ip, {r8, lr}
|
||||
ldr ip, =gd_backup
|
||||
ldr r8, [ip]
|
||||
ldr ip, =grub_uboot_syscall_ptr
|
||||
mov lr, pc
|
||||
ldr pc, grub_uboot_syscall_ptr
|
||||
|
||||
ldr r8, transition_space
|
||||
ldr lr, transition_space + 4
|
||||
ldr r9, transition_space + 8
|
||||
|
||||
ldr pc, [ip]
|
||||
ldr ip, =gd_backup
|
||||
str r8, [ip]
|
||||
ldr ip, =transition_space
|
||||
ldm ip, {r8, lr}
|
||||
bx lr
|
||||
|
||||
FUNCTION(grub_uboot_return)
|
||||
adr sp, entry_state_end
|
||||
ldr sp, =entry_state_end
|
||||
pop {r4-r12, lr}
|
||||
mov sp, r12
|
||||
bx lr
|
||||
|
||||
|
||||
.align 3
|
||||
.data
|
||||
.align 3 @ 8-byte alignment for stack
|
||||
@ U-boot context stack space
|
||||
entry_state_end:
|
||||
entry_state_end:
|
||||
.long 0 @ r4
|
||||
.long 0 @ r5
|
||||
.long 0 @ r6
|
||||
.long 0 @ r7
|
||||
gd_backup:
|
||||
.long 0 @ r8 - U-Boot global data pointer up to 2013-09-21
|
||||
.long 0 @ r9 - U-Boot global data pointer 2013-09-21 onwards
|
||||
.long 0 @ r8 - U-Boot global data pointer
|
||||
.long 0 @ r9
|
||||
.long 0 @ r10
|
||||
.long 0 @ r11
|
||||
VARIABLE(grub_uboot_search_hint)@ U-Boot stack pointer -
|
||||
@@ -172,9 +162,8 @@ entry_state: @ backup for U-Boot context
|
||||
transition_space:
|
||||
.long 0 @ r8
|
||||
.long 0 @ lr
|
||||
.long 0 @ r9
|
||||
|
||||
VARIABLE(grub_uboot_syscall_ptr)
|
||||
.long 0 @
|
||||
|
||||
END
|
||||
.end
|
||||
|
||||
@@ -229,7 +229,7 @@ grub_dl_load_segments (grub_dl_t mod, const Elf_Ehdr *e)
|
||||
unsigned i;
|
||||
Elf_Shdr *s;
|
||||
grub_size_t tsize = 0, talign = 1;
|
||||
#if defined (__ia64__) || defined (__powerpc__)
|
||||
#if defined (__ia64__) || defined (__alpha__) || defined (__powerpc__)
|
||||
grub_size_t tramp;
|
||||
grub_size_t got;
|
||||
#endif
|
||||
@@ -244,7 +244,7 @@ grub_dl_load_segments (grub_dl_t mod, const Elf_Ehdr *e)
|
||||
talign = s->sh_addralign;
|
||||
}
|
||||
|
||||
#if defined (__ia64__) || defined (__powerpc__)
|
||||
#if defined (__ia64__) || defined (__alpha__) || defined (__powerpc__)
|
||||
grub_arch_dl_get_tramp_got_size (e, &tramp, &got);
|
||||
tramp *= GRUB_ARCH_DL_TRAMP_SIZE;
|
||||
got *= sizeof (grub_uint64_t);
|
||||
@@ -313,7 +313,7 @@ grub_dl_load_segments (grub_dl_t mod, const Elf_Ehdr *e)
|
||||
mod->segment = seg;
|
||||
}
|
||||
}
|
||||
#if defined (__ia64__) || defined (__powerpc__)
|
||||
#if defined (__ia64__) || defined (__alpha__) || defined (__powerpc__)
|
||||
ptr = (char *) ALIGN_UP ((grub_addr_t) ptr, GRUB_ARCH_DL_TRAMP_ALIGN);
|
||||
mod->tramp = ptr;
|
||||
ptr += tramp;
|
||||
@@ -359,7 +359,7 @@ grub_dl_resolve_symbols (grub_dl_t mod, Elf_Ehdr *e)
|
||||
str = (char *) e + s->sh_offset;
|
||||
|
||||
for (i = 0;
|
||||
i < size / entsize;
|
||||
i * entsize < size;
|
||||
i++, sym = (Elf_Sym *) ((char *) sym + entsize))
|
||||
{
|
||||
unsigned char type = ELF_ST_TYPE (sym->st_info);
|
||||
@@ -553,11 +553,15 @@ grub_dl_unref (grub_dl_t mod)
|
||||
}
|
||||
|
||||
static void
|
||||
grub_dl_flush_cache (grub_dl_t mod)
|
||||
grub_dl_flush_cache (grub_dl_t mod __attribute__ ((unused)))
|
||||
{
|
||||
grub_dprintf ("modules", "flushing 0x%lx bytes at %p\n",
|
||||
(unsigned long) mod->sz, mod->base);
|
||||
#ifdef __alpha__
|
||||
grub_arch_sync_all_caches ();
|
||||
#else
|
||||
grub_arch_sync_caches (mod->base, mod->sz);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Load a module from core memory. */
|
||||
|
||||
@@ -35,6 +35,7 @@ grub_efi_handle_t grub_efi_image_handle;
|
||||
grub_efi_system_table_t *grub_efi_system_table;
|
||||
|
||||
static grub_efi_guid_t console_control_guid = GRUB_EFI_CONSOLE_CONTROL_GUID;
|
||||
static grub_efi_guid_t loaded_image_guid = GRUB_EFI_LOADED_IMAGE_GUID;
|
||||
static grub_efi_guid_t device_path_guid = GRUB_EFI_DEVICE_PATH_GUID;
|
||||
|
||||
void *
|
||||
@@ -93,6 +94,28 @@ grub_efi_locate_handle (grub_efi_locate_search_type_t search_type,
|
||||
return buffer;
|
||||
}
|
||||
|
||||
void *
|
||||
grub_efi_open_protocol (grub_efi_handle_t handle,
|
||||
grub_efi_guid_t *protocol,
|
||||
grub_efi_uint32_t attributes)
|
||||
{
|
||||
grub_efi_boot_services_t *b;
|
||||
grub_efi_status_t status;
|
||||
void *interface;
|
||||
|
||||
b = grub_efi_system_table->boot_services;
|
||||
status = efi_call_6 (b->open_protocol, handle,
|
||||
protocol,
|
||||
&interface,
|
||||
grub_efi_image_handle,
|
||||
0,
|
||||
attributes);
|
||||
if (status != GRUB_EFI_SUCCESS)
|
||||
return 0;
|
||||
|
||||
return interface;
|
||||
}
|
||||
|
||||
int
|
||||
grub_efi_set_text_mode (int on)
|
||||
{
|
||||
@@ -122,6 +145,23 @@ grub_efi_stall (grub_efi_uintn_t microseconds)
|
||||
efi_call_1 (grub_efi_system_table->boot_services->stall, microseconds);
|
||||
}
|
||||
|
||||
grub_efi_loaded_image_t *
|
||||
grub_efi_get_loaded_image (grub_efi_handle_t image_handle)
|
||||
{
|
||||
return grub_efi_open_protocol (image_handle,
|
||||
&loaded_image_guid,
|
||||
GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL);
|
||||
}
|
||||
|
||||
void
|
||||
grub_exit (void)
|
||||
{
|
||||
grub_efi_fini ();
|
||||
efi_call_4 (grub_efi_system_table->boot_services->exit,
|
||||
grub_efi_image_handle, GRUB_EFI_SUCCESS, 0, 0);
|
||||
for (;;) ;
|
||||
}
|
||||
|
||||
grub_err_t
|
||||
grub_efi_set_virtual_address_map (grub_efi_uintn_t memory_map_size,
|
||||
grub_efi_uintn_t descriptor_size,
|
||||
@@ -219,14 +259,58 @@ grub_efi_get_variable (const char *var, const grub_efi_guid_t *guid,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#pragma GCC diagnostic ignored "-Wcast-align"
|
||||
|
||||
/* Search the mods section from the PE32/PE32+ image. This code uses
|
||||
a PE32 header, but should work with PE32+ as well. */
|
||||
grub_addr_t
|
||||
grub_efi_modules_addr (void)
|
||||
{
|
||||
grub_efi_loaded_image_t *image;
|
||||
struct grub_pe32_header *header;
|
||||
struct grub_pe32_coff_header *coff_header;
|
||||
struct grub_pe32_section_table *sections;
|
||||
struct grub_pe32_section_table *section;
|
||||
struct grub_module_info *info;
|
||||
grub_uint16_t i;
|
||||
|
||||
image = grub_efi_get_loaded_image (grub_efi_image_handle);
|
||||
if (! image)
|
||||
return 0;
|
||||
|
||||
header = image->image_base;
|
||||
coff_header = &(header->coff_header);
|
||||
sections
|
||||
= (struct grub_pe32_section_table *) ((char *) coff_header
|
||||
+ sizeof (*coff_header)
|
||||
+ coff_header->optional_header_size);
|
||||
|
||||
for (i = 0, section = sections;
|
||||
i < coff_header->num_sections;
|
||||
i++, section++)
|
||||
{
|
||||
if (grub_strcmp (section->name, "mods") == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
if (i == coff_header->num_sections)
|
||||
return 0;
|
||||
|
||||
info = (struct grub_module_info *) ((char *) image->image_base
|
||||
+ section->virtual_address);
|
||||
if (info->magic != GRUB_MODULE_MAGIC)
|
||||
return 0;
|
||||
|
||||
return (grub_addr_t) info;
|
||||
}
|
||||
|
||||
#pragma GCC diagnostic error "-Wcast-align"
|
||||
|
||||
char *
|
||||
grub_efi_get_filename (grub_efi_device_path_t *dp0)
|
||||
grub_efi_get_filename (grub_efi_device_path_t *dp)
|
||||
{
|
||||
char *name = 0, *p;
|
||||
grub_size_t filesize = 0;
|
||||
grub_efi_device_path_t *dp;
|
||||
|
||||
dp = dp0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
@@ -250,8 +334,6 @@ grub_efi_get_filename (grub_efi_device_path_t *dp0)
|
||||
if (!filesize)
|
||||
return NULL;
|
||||
|
||||
dp = dp0;
|
||||
|
||||
p = name = grub_malloc (filesize);
|
||||
if (!name)
|
||||
return NULL;
|
||||
|
||||
@@ -1,172 +0,0 @@
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2006,2007,2008,2009,2010,2013 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GRUB is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <grub/efi/efi.h>
|
||||
#include <grub/efi/pe32.h>
|
||||
|
||||
static grub_efi_guid_t loaded_image_guid = GRUB_EFI_LOADED_IMAGE_GUID;
|
||||
|
||||
void *
|
||||
grub_efi_open_protocol (grub_efi_handle_t handle,
|
||||
grub_efi_guid_t *protocol,
|
||||
grub_efi_uint32_t attributes)
|
||||
{
|
||||
grub_efi_boot_services_t *b;
|
||||
grub_efi_status_t status;
|
||||
void *interface;
|
||||
|
||||
b = grub_efi_system_table->boot_services;
|
||||
status = efi_call_6 (b->open_protocol, handle,
|
||||
protocol,
|
||||
&interface,
|
||||
grub_efi_image_handle,
|
||||
0,
|
||||
attributes);
|
||||
if (status != GRUB_EFI_SUCCESS)
|
||||
return 0;
|
||||
|
||||
return interface;
|
||||
}
|
||||
|
||||
void
|
||||
grub_exit (void)
|
||||
{
|
||||
grub_efi_fini ();
|
||||
efi_call_4 (grub_efi_system_table->boot_services->exit,
|
||||
grub_efi_image_handle, GRUB_EFI_SUCCESS, 0, 0);
|
||||
for (;;) ;
|
||||
}
|
||||
|
||||
grub_efi_loaded_image_t *
|
||||
grub_efi_get_loaded_image (grub_efi_handle_t image_handle)
|
||||
{
|
||||
return grub_efi_open_protocol (image_handle,
|
||||
&loaded_image_guid,
|
||||
GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL);
|
||||
}
|
||||
|
||||
/* Allocate pages. Return the pointer to the first of allocated pages. */
|
||||
void *
|
||||
grub_efi_allocate_pages (grub_efi_physical_address_t address,
|
||||
grub_efi_uintn_t pages)
|
||||
{
|
||||
grub_efi_allocate_type_t type;
|
||||
grub_efi_status_t status;
|
||||
grub_efi_boot_services_t *b;
|
||||
|
||||
#if 1
|
||||
/* Limit the memory access to less than 4GB for 32-bit platforms. */
|
||||
if (address > 0xffffffff)
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
#if 1
|
||||
if (address == 0)
|
||||
{
|
||||
type = GRUB_EFI_ALLOCATE_MAX_ADDRESS;
|
||||
address = 0xffffffff;
|
||||
}
|
||||
else
|
||||
type = GRUB_EFI_ALLOCATE_ADDRESS;
|
||||
#else
|
||||
if (address == 0)
|
||||
type = GRUB_EFI_ALLOCATE_ANY_PAGES;
|
||||
else
|
||||
type = GRUB_EFI_ALLOCATE_ADDRESS;
|
||||
#endif
|
||||
|
||||
b = grub_efi_system_table->boot_services;
|
||||
status = efi_call_4 (b->allocate_pages, type, GRUB_EFI_LOADER_DATA, pages, &address);
|
||||
if (status != GRUB_EFI_SUCCESS)
|
||||
return 0;
|
||||
|
||||
if (address == 0)
|
||||
{
|
||||
/* Uggh, the address 0 was allocated... This is too annoying,
|
||||
so reallocate another one. */
|
||||
address = 0xffffffff;
|
||||
status = efi_call_4 (b->allocate_pages, type, GRUB_EFI_LOADER_DATA, pages, &address);
|
||||
grub_efi_free_pages (0, pages);
|
||||
if (status != GRUB_EFI_SUCCESS)
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (void *) ((grub_addr_t) address);
|
||||
}
|
||||
|
||||
/* Free pages starting from ADDRESS. */
|
||||
void
|
||||
grub_efi_free_pages (grub_efi_physical_address_t address,
|
||||
grub_efi_uintn_t pages)
|
||||
{
|
||||
grub_efi_boot_services_t *b;
|
||||
|
||||
b = grub_efi_system_table->boot_services;
|
||||
efi_call_2 (b->free_pages, address, pages);
|
||||
}
|
||||
|
||||
|
||||
#pragma GCC diagnostic ignored "-Wcast-align"
|
||||
|
||||
/* Search the mods section from the PE32/PE32+ image. This code uses
|
||||
a PE32 header, but should work with PE32+ as well. */
|
||||
int
|
||||
grub_efi_get_section (const char *name,
|
||||
grub_addr_t *start, grub_size_t *sz)
|
||||
{
|
||||
grub_efi_loaded_image_t *image;
|
||||
struct grub_pe32_header *header;
|
||||
struct grub_pe32_coff_header *coff_header;
|
||||
struct grub_pe32_section_table *sections;
|
||||
struct grub_pe32_section_table *section;
|
||||
grub_uint16_t i;
|
||||
|
||||
*start = 0;
|
||||
if (sz)
|
||||
*sz = 0;
|
||||
|
||||
image = grub_efi_get_loaded_image (grub_efi_image_handle);
|
||||
if (! image)
|
||||
return 0;
|
||||
|
||||
header = image->image_base;
|
||||
coff_header = &(header->coff_header);
|
||||
sections
|
||||
= (struct grub_pe32_section_table *) ((char *) coff_header
|
||||
+ sizeof (*coff_header)
|
||||
+ coff_header->optional_header_size);
|
||||
|
||||
for (i = 0, section = sections;
|
||||
i < coff_header->num_sections;
|
||||
i++, section++)
|
||||
{
|
||||
if (grub_strcmp (section->name, name) == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
if (i == coff_header->num_sections)
|
||||
return 0;
|
||||
|
||||
*start = ((grub_addr_t) image->image_base + section->virtual_address);
|
||||
if (sz)
|
||||
*sz = section->virtual_size;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
#pragma GCC diagnostic error "-Wcast-align"
|
||||
@@ -31,10 +31,7 @@ grub_addr_t grub_modbase;
|
||||
void
|
||||
grub_efi_init (void)
|
||||
{
|
||||
if (!grub_efi_get_section ("mods", &grub_modbase, NULL)
|
||||
|| ((struct grub_module_info *) grub_modbase)->magic != GRUB_MODULE_MAGIC)
|
||||
grub_modbase = 0;
|
||||
|
||||
grub_modbase = grub_efi_modules_addr ();
|
||||
/* First of all, initialize the console so that GRUB can display
|
||||
messages. */
|
||||
grub_console_init ();
|
||||
|
||||
@@ -47,6 +47,66 @@ static grub_efi_uintn_t finish_desc_size;
|
||||
static grub_efi_uint32_t finish_desc_version;
|
||||
int grub_efi_is_finished = 0;
|
||||
|
||||
/* Allocate pages. Return the pointer to the first of allocated pages. */
|
||||
void *
|
||||
grub_efi_allocate_pages (grub_efi_physical_address_t address,
|
||||
grub_efi_uintn_t pages)
|
||||
{
|
||||
grub_efi_allocate_type_t type;
|
||||
grub_efi_status_t status;
|
||||
grub_efi_boot_services_t *b;
|
||||
|
||||
#if 1
|
||||
/* Limit the memory access to less than 4GB for 32-bit platforms. */
|
||||
if (address > 0xffffffff)
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
#if 1
|
||||
if (address == 0)
|
||||
{
|
||||
type = GRUB_EFI_ALLOCATE_MAX_ADDRESS;
|
||||
address = 0xffffffff;
|
||||
}
|
||||
else
|
||||
type = GRUB_EFI_ALLOCATE_ADDRESS;
|
||||
#else
|
||||
if (address == 0)
|
||||
type = GRUB_EFI_ALLOCATE_ANY_PAGES;
|
||||
else
|
||||
type = GRUB_EFI_ALLOCATE_ADDRESS;
|
||||
#endif
|
||||
|
||||
b = grub_efi_system_table->boot_services;
|
||||
status = efi_call_4 (b->allocate_pages, type, GRUB_EFI_LOADER_DATA, pages, &address);
|
||||
if (status != GRUB_EFI_SUCCESS)
|
||||
return 0;
|
||||
|
||||
if (address == 0)
|
||||
{
|
||||
/* Uggh, the address 0 was allocated... This is too annoying,
|
||||
so reallocate another one. */
|
||||
address = 0xffffffff;
|
||||
status = efi_call_4 (b->allocate_pages, type, GRUB_EFI_LOADER_DATA, pages, &address);
|
||||
grub_efi_free_pages (0, pages);
|
||||
if (status != GRUB_EFI_SUCCESS)
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (void *) ((grub_addr_t) address);
|
||||
}
|
||||
|
||||
/* Free pages starting from ADDRESS. */
|
||||
void
|
||||
grub_efi_free_pages (grub_efi_physical_address_t address,
|
||||
grub_efi_uintn_t pages)
|
||||
{
|
||||
grub_efi_boot_services_t *b;
|
||||
|
||||
b = grub_efi_system_table->boot_services;
|
||||
efi_call_2 (b->free_pages, address, pages);
|
||||
}
|
||||
|
||||
#if defined (__i386__) || defined (__x86_64__)
|
||||
|
||||
/* Helper for stop_broadcom. */
|
||||
|
||||
@@ -609,78 +609,3 @@ grub_util_biosdisk_get_osdev (grub_disk_t disk)
|
||||
|
||||
return map[disk->id].device;
|
||||
}
|
||||
|
||||
|
||||
static char *
|
||||
grub_util_path_concat_real (size_t n, int ext, va_list ap)
|
||||
{
|
||||
size_t totlen = 0;
|
||||
char **l = xmalloc ((n + ext) * sizeof (l[0]));
|
||||
char *r, *p, *pi;
|
||||
size_t i;
|
||||
int first = 1;
|
||||
|
||||
for (i = 0; i < n + ext; i++)
|
||||
{
|
||||
l[i] = va_arg (ap, char *);
|
||||
if (l[i])
|
||||
totlen += strlen (l[i]) + 1;
|
||||
}
|
||||
|
||||
r = xmalloc (totlen + 10);
|
||||
|
||||
p = r;
|
||||
for (i = 0; i < n; i++)
|
||||
{
|
||||
pi = l[i];
|
||||
if (!pi)
|
||||
continue;
|
||||
while (*pi == '/')
|
||||
pi++;
|
||||
if ((p != r || (pi != l[i] && first)) && (p == r || *(p - 1) != '/'))
|
||||
*p++ = '/';
|
||||
first = 0;
|
||||
p = grub_stpcpy (p, pi);
|
||||
while (p != r && p != r + 1 && *(p - 1) == '/')
|
||||
p--;
|
||||
}
|
||||
|
||||
if (ext && l[i])
|
||||
p = grub_stpcpy (p, l[i]);
|
||||
|
||||
*p = '\0';
|
||||
|
||||
free (l);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
char *
|
||||
grub_util_path_concat (size_t n, ...)
|
||||
{
|
||||
va_list ap;
|
||||
char *r;
|
||||
|
||||
va_start (ap, n);
|
||||
|
||||
r = grub_util_path_concat_real (n, 0, ap);
|
||||
|
||||
va_end (ap);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
char *
|
||||
grub_util_path_concat_ext (size_t n, ...)
|
||||
{
|
||||
va_list ap;
|
||||
char *r;
|
||||
|
||||
va_start (ap, n);
|
||||
|
||||
r = grub_util_path_concat_real (n, 1, ap);
|
||||
|
||||
va_end (ap);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -41,7 +41,6 @@
|
||||
#include <grub/env.h>
|
||||
#include <grub/partition.h>
|
||||
#include <grub/i18n.h>
|
||||
#include <grub/loader.h>
|
||||
#include <grub/util/misc.h>
|
||||
|
||||
#include "progname.h"
|
||||
@@ -76,10 +75,9 @@ grub_machine_get_bootlocation (char **device, char **path)
|
||||
}
|
||||
|
||||
void
|
||||
grub_machine_fini (int flags)
|
||||
grub_machine_fini (void)
|
||||
{
|
||||
if (flags & GRUB_LOADER_FLAG_NORETURN)
|
||||
grub_console_fini ();
|
||||
grub_console_fini ();
|
||||
}
|
||||
|
||||
|
||||
@@ -225,7 +223,7 @@ main (int argc, char *argv[])
|
||||
grub_hostfs_fini ();
|
||||
grub_host_fini ();
|
||||
|
||||
grub_machine_fini (GRUB_LOADER_FLAG_NORETURN);
|
||||
grub_machine_fini ();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -87,6 +87,9 @@ grub_file_open (const char *name)
|
||||
if (! file)
|
||||
goto fail;
|
||||
|
||||
file->name = grub_strdup (name);
|
||||
grub_errno = GRUB_ERR_NONE;
|
||||
|
||||
file->device = device;
|
||||
|
||||
if (device->disk && file_name[0] != '/')
|
||||
@@ -102,9 +105,6 @@ grub_file_open (const char *name)
|
||||
if ((file->fs->open) (file, file_name) != GRUB_ERR_NONE)
|
||||
goto fail;
|
||||
|
||||
file->name = grub_strdup (name);
|
||||
grub_errno = GRUB_ERR_NONE;
|
||||
|
||||
for (filter = 0; file && filter < ARRAY_SIZE (grub_file_filters_enabled);
|
||||
filter++)
|
||||
if (grub_file_filters_enabled[filter])
|
||||
@@ -187,7 +187,6 @@ grub_file_close (grub_file_t file)
|
||||
|
||||
if (file->device)
|
||||
grub_device_close (file->device);
|
||||
grub_free (file->name);
|
||||
grub_free (file);
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
@@ -130,9 +130,8 @@ grub_machine_get_bootlocation (char **device __attribute__ ((unused)),
|
||||
}
|
||||
|
||||
void
|
||||
grub_machine_fini (int flags)
|
||||
grub_machine_fini (void)
|
||||
{
|
||||
if (flags & GRUB_LOADER_FLAG_NORETURN)
|
||||
grub_vga_text_fini ();
|
||||
grub_vga_text_fini ();
|
||||
grub_stop_floppy ();
|
||||
}
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
#include <grub/kernel.h>
|
||||
#include <grub/efi/efi.h>
|
||||
#include <grub/i386/tsc.h>
|
||||
#include <grub/loader.h>
|
||||
|
||||
void
|
||||
grub_machine_init (void)
|
||||
@@ -36,8 +35,7 @@ grub_machine_init (void)
|
||||
}
|
||||
|
||||
void
|
||||
grub_machine_fini (int flags)
|
||||
grub_machine_fini (void)
|
||||
{
|
||||
if (flags & GRUB_LOADER_FLAG_NORETURN)
|
||||
grub_efi_fini ();
|
||||
grub_efi_fini ();
|
||||
}
|
||||
|
||||
@@ -239,9 +239,8 @@ grub_machine_init (void)
|
||||
}
|
||||
|
||||
void
|
||||
grub_machine_fini (int flags)
|
||||
grub_machine_fini (void)
|
||||
{
|
||||
if (flags & GRUB_LOADER_FLAG_NORETURN)
|
||||
grub_console_fini ();
|
||||
grub_console_fini ();
|
||||
grub_stop_floppy ();
|
||||
}
|
||||
|
||||
@@ -277,9 +277,8 @@ grub_machine_get_bootlocation (char **device __attribute__ ((unused)),
|
||||
}
|
||||
|
||||
void
|
||||
grub_machine_fini (int flags)
|
||||
grub_machine_fini (void)
|
||||
{
|
||||
if (flags & GRUB_LOADER_FLAG_NORETURN)
|
||||
grub_vga_text_fini ();
|
||||
grub_vga_text_fini ();
|
||||
grub_stop_floppy ();
|
||||
}
|
||||
|
||||
@@ -25,11 +25,7 @@
|
||||
#include <grub/misc.h>
|
||||
#include <grub/i386/tsc.h>
|
||||
#include <grub/i386/cpuid.h>
|
||||
#ifdef GRUB_MACHINE_XEN
|
||||
#include <grub/xen.h>
|
||||
#else
|
||||
#include <grub/i386/pit.h>
|
||||
#endif
|
||||
#include <grub/cpu/io.h>
|
||||
|
||||
/* This defines the value TSC had at the epoch (that is, when we calibrated it). */
|
||||
@@ -69,8 +65,6 @@ grub_cpu_is_tsc_supported (void)
|
||||
return (d & (1 << 4)) != 0;
|
||||
}
|
||||
|
||||
#ifndef GRUB_MACHINE_XEN
|
||||
|
||||
static void
|
||||
grub_pit_wait (grub_uint16_t tics)
|
||||
{
|
||||
@@ -98,7 +92,6 @@ grub_pit_wait (grub_uint16_t tics)
|
||||
& ~ (GRUB_PIT_SPK_DATA | GRUB_PIT_SPK_TMR2),
|
||||
GRUB_PIT_SPEAKER_PORT);
|
||||
}
|
||||
#endif
|
||||
|
||||
static grub_uint64_t
|
||||
grub_tsc_get_time_ms (void)
|
||||
@@ -110,7 +103,6 @@ grub_tsc_get_time_ms (void)
|
||||
return ((al * grub_tsc_rate) >> 32) + ah * grub_tsc_rate;
|
||||
}
|
||||
|
||||
#ifndef GRUB_MACHINE_XEN
|
||||
/* Calibrate the TSC based on the RTC. */
|
||||
static void
|
||||
calibrate_tsc (void)
|
||||
@@ -124,22 +116,10 @@ calibrate_tsc (void)
|
||||
|
||||
grub_tsc_rate = grub_divmod64 ((55ULL << 32), end_tsc - tsc_boot_time, 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
grub_tsc_init (void)
|
||||
{
|
||||
#ifdef GRUB_MACHINE_XEN
|
||||
grub_uint64_t t;
|
||||
tsc_boot_time = grub_get_tsc ();
|
||||
t = grub_xen_shared_info->vcpu_info[0].time.tsc_to_system_mul;
|
||||
if (grub_xen_shared_info->vcpu_info[0].time.tsc_shift > 0)
|
||||
t <<= grub_xen_shared_info->vcpu_info[0].time.tsc_shift;
|
||||
else
|
||||
t >>= -grub_xen_shared_info->vcpu_info[0].time.tsc_shift;
|
||||
grub_tsc_rate = grub_divmod64 (t, 1000000, 0);
|
||||
grub_install_get_time_ms (grub_tsc_get_time_ms);
|
||||
#else
|
||||
if (grub_cpu_is_tsc_supported ())
|
||||
{
|
||||
calibrate_tsc ();
|
||||
@@ -153,5 +133,4 @@ grub_tsc_init (void)
|
||||
grub_fatal ("no TSC found");
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -1,43 +0,0 @@
|
||||
/* hypercall.S - wrappers for Xen hypercalls */
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GRUB is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <grub/symbol.h>
|
||||
#include <grub/xen.h>
|
||||
|
||||
FUNCTION(grub_xen_hypercall)
|
||||
pushl %ebp
|
||||
movl %esp, %ebp
|
||||
pushl %esi
|
||||
pushl %edi
|
||||
pushl %ebx
|
||||
|
||||
/* call number already in %eax. */
|
||||
/* %edx -> %ebx*/
|
||||
/* %ecx -> %ecx*/
|
||||
movl %edx, %ebx
|
||||
movl 8(%ebp), %edx
|
||||
movl 12(%ebp), %esi
|
||||
movl 16(%ebp), %edi
|
||||
movl 20(%ebp), %ebp
|
||||
int $0x82
|
||||
popl %ebx
|
||||
popl %edi
|
||||
popl %esi
|
||||
popl %ebp
|
||||
retl $16
|
||||
@@ -26,7 +26,6 @@
|
||||
#include <grub/cache.h>
|
||||
#include <grub/kernel.h>
|
||||
#include <grub/efi/efi.h>
|
||||
#include <grub/loader.h>
|
||||
|
||||
static grub_uint64_t divisor = 1;
|
||||
|
||||
@@ -69,10 +68,9 @@ grub_machine_init (void)
|
||||
}
|
||||
|
||||
void
|
||||
grub_machine_fini (int flags)
|
||||
grub_machine_fini (void)
|
||||
{
|
||||
if (flags & GRUB_LOADER_FLAG_NORETURN)
|
||||
grub_efi_fini ();
|
||||
grub_efi_fini ();
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -34,7 +34,6 @@
|
||||
#include <grub/net.h>
|
||||
#include <grub/offsets.h>
|
||||
#include <grub/memory.h>
|
||||
#include <grub/loader.h>
|
||||
#ifdef __i386__
|
||||
#include <grub/cpu/tsc.h>
|
||||
#endif
|
||||
@@ -299,13 +298,10 @@ grub_machine_init (void)
|
||||
}
|
||||
|
||||
void
|
||||
grub_machine_fini (int flags)
|
||||
grub_machine_fini (void)
|
||||
{
|
||||
if (flags & GRUB_LOADER_FLAG_NORETURN)
|
||||
{
|
||||
grub_ofdisk_fini ();
|
||||
grub_console_fini ();
|
||||
}
|
||||
grub_ofdisk_fini ();
|
||||
grub_console_fini ();
|
||||
}
|
||||
|
||||
grub_uint64_t
|
||||
|
||||
@@ -125,21 +125,6 @@ grub_set_prefix_and_root (void)
|
||||
|
||||
grub_register_variable_hook ("root", 0, grub_env_write_root);
|
||||
|
||||
grub_machine_get_bootlocation (&fwdevice, &fwpath);
|
||||
|
||||
if (fwdevice)
|
||||
{
|
||||
char *cmdpath;
|
||||
|
||||
cmdpath = grub_xasprintf ("(%s)%s", fwdevice, fwpath ? : "");
|
||||
if (cmdpath)
|
||||
{
|
||||
grub_env_set ("cmdpath", cmdpath);
|
||||
grub_env_export ("cmdpath");
|
||||
grub_free (cmdpath);
|
||||
}
|
||||
}
|
||||
|
||||
if (prefix)
|
||||
{
|
||||
char *pptr = NULL;
|
||||
@@ -157,6 +142,8 @@ grub_set_prefix_and_root (void)
|
||||
if (pptr[0])
|
||||
path = grub_strdup (pptr);
|
||||
}
|
||||
if ((!device || device[0] == ',' || !device[0]) || !path)
|
||||
grub_machine_get_bootlocation (&fwdevice, &fwpath);
|
||||
|
||||
if (!device && fwdevice)
|
||||
device = fwdevice;
|
||||
|
||||
@@ -259,7 +259,7 @@ grub_machine_init (void)
|
||||
}
|
||||
|
||||
void
|
||||
grub_machine_fini (int flags __attribute__ ((unused)))
|
||||
grub_machine_fini (void)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -355,7 +355,8 @@ get_device_name_iter (grub_disk_t disk __attribute__ ((unused)),
|
||||
}
|
||||
|
||||
void
|
||||
grub_machine_get_bootlocation (char **device, char **path)
|
||||
grub_machine_get_bootlocation (char **device __attribute__ ((unused)),
|
||||
char **path __attribute__ ((unused)))
|
||||
{
|
||||
char *loaddev = boot_location;
|
||||
char *pptr, *partptr;
|
||||
|
||||
@@ -217,7 +217,7 @@ grub_machine_init (void)
|
||||
}
|
||||
|
||||
void
|
||||
grub_machine_fini (int flags __attribute__ ((unused)))
|
||||
grub_machine_fini (void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ grub_machine_init (void)
|
||||
}
|
||||
|
||||
/* FIXME: measure this. */
|
||||
grub_arch_cpuclock = 200000000;
|
||||
grub_arch_cpuclock = 64000000;
|
||||
|
||||
modend = grub_modules_get_end ();
|
||||
grub_mm_init_region ((void *) modend, grub_arch_memsize
|
||||
@@ -70,7 +70,7 @@ grub_machine_init (void)
|
||||
}
|
||||
|
||||
void
|
||||
grub_machine_fini (int flags __attribute__ ((unused)))
|
||||
grub_machine_fini (void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -71,12 +71,12 @@ void *memmove (void *dest, const void *src, grub_size_t n)
|
||||
void *memcpy (void *dest, const void *src, grub_size_t n)
|
||||
__attribute__ ((alias ("grub_memmove")));
|
||||
#else
|
||||
void * GRUB_BUILTIN_ATTR
|
||||
void * __attribute__ ((regparm(0)))
|
||||
memcpy (void *dest, const void *src, grub_size_t n)
|
||||
{
|
||||
return grub_memmove (dest, src, n);
|
||||
}
|
||||
void * GRUB_BUILTIN_ATTR
|
||||
void * __attribute__ ((regparm(0)))
|
||||
memmove (void *dest, const void *src, grub_size_t n)
|
||||
{
|
||||
return grub_memmove (dest, src, n);
|
||||
@@ -225,7 +225,7 @@ grub_memcmp (const void *s1, const void *s2, grub_size_t n)
|
||||
int memcmp (const void *s1, const void *s2, grub_size_t n)
|
||||
__attribute__ ((alias ("grub_memcmp")));
|
||||
#else
|
||||
int GRUB_BUILTIN_ATTR
|
||||
int __attribute__ ((regparm(0)))
|
||||
memcmp (const void *s1, const void *s2, grub_size_t n)
|
||||
{
|
||||
return grub_memcmp (s1, s2, n);
|
||||
@@ -504,18 +504,11 @@ grub_memset (void *s, int c, grub_size_t len)
|
||||
void *memset (void *s, int c, grub_size_t n)
|
||||
__attribute__ ((alias ("grub_memset")));
|
||||
#else
|
||||
void * GRUB_BUILTIN_ATTR
|
||||
void * __attribute__ ((regparm(0)))
|
||||
memset (void *s, int c, grub_size_t n)
|
||||
{
|
||||
return grub_memset (s, c, n);
|
||||
}
|
||||
|
||||
void GRUB_BUILTIN_ATTR
|
||||
__bzero (void *s, grub_size_t n)
|
||||
{
|
||||
grub_memset (s, 0, n);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
grub_size_t
|
||||
@@ -564,6 +557,7 @@ grub_divmod64 (grub_uint64_t n, grub_uint64_t d, grub_uint64_t *r)
|
||||
*/
|
||||
#if !defined (__arm__) && !defined (__ia64__)
|
||||
/* Skip the slow computation if 32-bit arithmetic is possible. */
|
||||
#ifndef __alpha__
|
||||
if (n < 0xffffffff && d < 0xffffffff)
|
||||
{
|
||||
if (r)
|
||||
@@ -596,132 +590,6 @@ grub_divmod64 (grub_uint64_t n, grub_uint64_t d, grub_uint64_t *r)
|
||||
return q;
|
||||
}
|
||||
|
||||
#ifndef GRUB_UTIL
|
||||
|
||||
#if defined (__arm__)
|
||||
|
||||
grub_uint32_t
|
||||
__udivsi3 (grub_uint32_t a, grub_uint32_t b)
|
||||
{
|
||||
return grub_divmod64 (a, b, 0);
|
||||
}
|
||||
|
||||
grub_uint32_t
|
||||
__umodsi3 (grub_uint32_t a, grub_uint32_t b)
|
||||
{
|
||||
grub_uint64_t ret;
|
||||
grub_divmod64 (a, b, &ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef NEED_CTZDI2
|
||||
|
||||
unsigned
|
||||
__ctzdi2 (grub_uint64_t x)
|
||||
{
|
||||
unsigned ret = 0;
|
||||
if (!x)
|
||||
return 64;
|
||||
if (!(x & 0xffffffff))
|
||||
{
|
||||
x >>= 32;
|
||||
ret |= 32;
|
||||
}
|
||||
if (!(x & 0xffff))
|
||||
{
|
||||
x >>= 16;
|
||||
ret |= 16;
|
||||
}
|
||||
if (!(x & 0xff))
|
||||
{
|
||||
x >>= 8;
|
||||
ret |= 8;
|
||||
}
|
||||
if (!(x & 0xf))
|
||||
{
|
||||
x >>= 4;
|
||||
ret |= 4;
|
||||
}
|
||||
if (!(x & 0x3))
|
||||
{
|
||||
x >>= 2;
|
||||
ret |= 2;
|
||||
}
|
||||
if (!(x & 0x1))
|
||||
{
|
||||
x >>= 1;
|
||||
ret |= 1;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef NEED_CTZSI2
|
||||
unsigned
|
||||
__ctzsi2 (grub_uint32_t x)
|
||||
{
|
||||
unsigned ret = 0;
|
||||
if (!x)
|
||||
return 32;
|
||||
|
||||
if (!(x & 0xffff))
|
||||
{
|
||||
x >>= 16;
|
||||
ret |= 16;
|
||||
}
|
||||
if (!(x & 0xff))
|
||||
{
|
||||
x >>= 8;
|
||||
ret |= 8;
|
||||
}
|
||||
if (!(x & 0xf))
|
||||
{
|
||||
x >>= 4;
|
||||
ret |= 4;
|
||||
}
|
||||
if (!(x & 0x3))
|
||||
{
|
||||
x >>= 2;
|
||||
ret |= 2;
|
||||
}
|
||||
if (!(x & 0x1))
|
||||
{
|
||||
x >>= 1;
|
||||
ret |= 1;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __arm__
|
||||
grub_uint32_t
|
||||
__aeabi_uidiv (grub_uint32_t a, grub_uint32_t b)
|
||||
__attribute__ ((alias ("__udivsi3")));
|
||||
#endif
|
||||
|
||||
#if defined (__ia64__)
|
||||
|
||||
grub_uint64_t
|
||||
__udivdi3 (grub_uint64_t a, grub_uint64_t b)
|
||||
{
|
||||
return grub_divmod64 (a, b, 0);
|
||||
}
|
||||
|
||||
grub_uint64_t
|
||||
__umoddi3 (grub_uint64_t a, grub_uint64_t b)
|
||||
{
|
||||
grub_uint64_t ret;
|
||||
grub_divmod64 (a, b, &ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* GRUB_UTIL */
|
||||
|
||||
/* Convert a long long value to a string. This function avoids 64-bit
|
||||
modular arithmetic or divisions. */
|
||||
static char *
|
||||
|
||||
@@ -298,10 +298,7 @@ grub_real_malloc (grub_mm_header_t *first, grub_size_t n, grub_size_t align)
|
||||
/* Mark find as a start marker for next allocation to fasten it.
|
||||
This will have side effect of fragmenting memory as small
|
||||
pieces before this will be un-used. */
|
||||
/* So do it only for chunks under 64K. */
|
||||
if (n < (0x8000 >> GRUB_MM_ALIGN_LOG2)
|
||||
|| *first == p)
|
||||
*first = q;
|
||||
*first = q;
|
||||
|
||||
return p + 1;
|
||||
}
|
||||
|
||||
@@ -35,10 +35,13 @@ extern char __bss_start[];
|
||||
extern char _end[];
|
||||
extern grub_size_t grub_total_module_size;
|
||||
extern int (*grub_uboot_syscall_ptr) (int, int *, ...);
|
||||
static unsigned long timer_start;
|
||||
|
||||
extern grub_uint32_t grub_uboot_machine_type;
|
||||
extern grub_addr_t grub_uboot_boot_data;
|
||||
/* Set to anything other than zero so it lands in .data and not .bss. */
|
||||
grub_addr_t grub_modbase = 0x55aa55aa;
|
||||
grub_uint32_t grub_uboot_machine_type = 0x55aa55aa;
|
||||
grub_addr_t grub_uboot_boot_data = 0x55aa55aa;
|
||||
|
||||
static unsigned long timer_start;
|
||||
|
||||
void
|
||||
grub_exit (void)
|
||||
@@ -110,7 +113,7 @@ grub_machine_init (void)
|
||||
|
||||
|
||||
void
|
||||
grub_machine_fini (int flags __attribute__ ((unused)))
|
||||
grub_machine_fini (void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -30,6 +30,6 @@ _start:
|
||||
movq %rcx, EXT_C(grub_efi_image_handle)(%rip)
|
||||
movq %rdx, EXT_C(grub_efi_system_table)(%rip)
|
||||
|
||||
andq $~0xf, %rsp
|
||||
call EXT_C(grub_main)
|
||||
/* Doesn't return. */
|
||||
ret
|
||||
|
||||
|
||||
@@ -1,53 +0,0 @@
|
||||
/* hypercall.S - wrappers for Xen hypercalls */
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2011 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GRUB is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <grub/symbol.h>
|
||||
#include <grub/xen.h>
|
||||
|
||||
FUNCTION(grub_xen_sched_op)
|
||||
movq $__HYPERVISOR_sched_op, %rax
|
||||
syscall
|
||||
ret
|
||||
|
||||
FUNCTION(grub_xen_event_channel_op)
|
||||
movq $__HYPERVISOR_event_channel_op, %rax
|
||||
syscall
|
||||
ret
|
||||
|
||||
FUNCTION(grub_xen_update_va_mapping)
|
||||
movq $__HYPERVISOR_update_va_mapping, %rax
|
||||
syscall
|
||||
ret
|
||||
|
||||
FUNCTION(grub_xen_mmuext_op)
|
||||
movq %rcx, %r10
|
||||
movq $__HYPERVISOR_mmuext_op, %rax
|
||||
syscall
|
||||
ret
|
||||
|
||||
FUNCTION(grub_xen_grant_table_op)
|
||||
movq $__HYPERVISOR_grant_table_op, %rax
|
||||
syscall
|
||||
ret
|
||||
|
||||
FUNCTION(grub_xen_mmu_update)
|
||||
movq %rcx, %r10
|
||||
movq $__HYPERVISOR_mmu_update, %rax
|
||||
syscall
|
||||
ret
|
||||
@@ -1,570 +0,0 @@
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2011 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GRUB is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <grub/xen.h>
|
||||
#include <grub/term.h>
|
||||
#include <grub/misc.h>
|
||||
#include <grub/env.h>
|
||||
#include <grub/mm.h>
|
||||
#include <grub/kernel.h>
|
||||
#include <grub/offsets.h>
|
||||
#include <grub/memory.h>
|
||||
#include <grub/i386/tsc.h>
|
||||
#include <grub/term.h>
|
||||
#include <grub/loader.h>
|
||||
|
||||
grub_addr_t grub_modbase;
|
||||
struct start_info *grub_xen_start_page_addr;
|
||||
volatile struct xencons_interface *grub_xen_xcons;
|
||||
volatile struct shared_info *grub_xen_shared_info;
|
||||
volatile struct xenstore_domain_interface *grub_xen_xenstore;
|
||||
volatile grant_entry_v2_t *grub_xen_grant_table;
|
||||
static const grub_size_t total_grants =
|
||||
GRUB_XEN_PAGE_SIZE / sizeof (grub_xen_grant_table[0]);
|
||||
grub_size_t grub_xen_n_allocated_shared_pages;
|
||||
|
||||
static grub_xen_mfn_t
|
||||
grub_xen_ptr2mfn (void *ptr)
|
||||
{
|
||||
grub_xen_mfn_t *mfn_list =
|
||||
(grub_xen_mfn_t *) grub_xen_start_page_addr->mfn_list;
|
||||
return mfn_list[(grub_addr_t) ptr >> GRUB_XEN_LOG_PAGE_SIZE];
|
||||
}
|
||||
|
||||
void *
|
||||
grub_xen_alloc_shared_page (domid_t dom, grub_xen_grant_t * grnum)
|
||||
{
|
||||
void *ret;
|
||||
grub_xen_mfn_t mfn;
|
||||
volatile grant_entry_v2_t *entry;
|
||||
|
||||
/* Avoid 0. */
|
||||
for (entry = grub_xen_grant_table;
|
||||
entry < grub_xen_grant_table + total_grants; entry++)
|
||||
if (!entry->hdr.flags)
|
||||
break;
|
||||
|
||||
if (entry == grub_xen_grant_table + total_grants)
|
||||
{
|
||||
grub_error (GRUB_ERR_OUT_OF_MEMORY, "out of grant entries");
|
||||
return NULL;
|
||||
}
|
||||
ret = grub_memalign (GRUB_XEN_PAGE_SIZE, GRUB_XEN_PAGE_SIZE);
|
||||
if (!ret)
|
||||
return NULL;
|
||||
mfn = grub_xen_ptr2mfn (ret);
|
||||
entry->full_page.pad0 = 0;
|
||||
entry->full_page.frame = mfn;
|
||||
entry->full_page.hdr.domid = dom;
|
||||
mb ();
|
||||
entry->full_page.hdr.flags = GTF_permit_access;
|
||||
mb ();
|
||||
*grnum = entry - grub_xen_grant_table;
|
||||
grub_xen_n_allocated_shared_pages++;
|
||||
return ret;
|
||||
}
|
||||
|
||||
void
|
||||
grub_xen_free_shared_page (void *ptr)
|
||||
{
|
||||
grub_xen_mfn_t mfn;
|
||||
volatile grant_entry_v2_t *entry;
|
||||
|
||||
mfn = grub_xen_ptr2mfn (ptr);
|
||||
for (entry = grub_xen_grant_table + 1;
|
||||
entry < grub_xen_grant_table + total_grants; entry++)
|
||||
if (entry->hdr.flags && entry->full_page.frame == mfn)
|
||||
{
|
||||
mb ();
|
||||
entry->hdr.flags = 0;
|
||||
mb ();
|
||||
entry->full_page.frame = 0;
|
||||
mb ();
|
||||
}
|
||||
grub_xen_n_allocated_shared_pages--;
|
||||
}
|
||||
|
||||
void
|
||||
grub_machine_get_bootlocation (char **device __attribute__ ((unused)),
|
||||
char **path __attribute__ ((unused)))
|
||||
{
|
||||
}
|
||||
|
||||
static grub_uint8_t window[GRUB_XEN_PAGE_SIZE]
|
||||
__attribute__ ((aligned (GRUB_XEN_PAGE_SIZE)));
|
||||
|
||||
#ifdef __x86_64__
|
||||
#define NUMBER_OF_LEVELS 4
|
||||
#else
|
||||
#define NUMBER_OF_LEVELS 3
|
||||
#endif
|
||||
|
||||
#define LOG_POINTERS_PER_PAGE 9
|
||||
#define POINTERS_PER_PAGE (1 << LOG_POINTERS_PER_PAGE)
|
||||
|
||||
void
|
||||
grub_xen_store_send (const void *buf_, grub_size_t len)
|
||||
{
|
||||
const grub_uint8_t *buf = buf_;
|
||||
struct evtchn_send send;
|
||||
int event_sent = 0;
|
||||
while (len)
|
||||
{
|
||||
grub_size_t avail, inbuf;
|
||||
grub_size_t prod, cons;
|
||||
mb ();
|
||||
prod = grub_xen_xenstore->req_prod;
|
||||
cons = grub_xen_xenstore->req_cons;
|
||||
if (prod >= cons + sizeof (grub_xen_xenstore->req))
|
||||
{
|
||||
if (!event_sent)
|
||||
{
|
||||
send.port = grub_xen_start_page_addr->store_evtchn;
|
||||
grub_xen_event_channel_op (EVTCHNOP_send, &send);
|
||||
event_sent = 1;
|
||||
}
|
||||
grub_xen_sched_op (SCHEDOP_yield, 0);
|
||||
continue;
|
||||
}
|
||||
event_sent = 0;
|
||||
avail = cons + sizeof (grub_xen_xenstore->req) - prod;
|
||||
inbuf = (~prod & (sizeof (grub_xen_xenstore->req) - 1)) + 1;
|
||||
if (avail > inbuf)
|
||||
avail = inbuf;
|
||||
if (avail > len)
|
||||
avail = len;
|
||||
grub_memcpy ((void *) &grub_xen_xenstore->req[prod & (sizeof (grub_xen_xenstore->req) - 1)],
|
||||
buf, avail);
|
||||
buf += avail;
|
||||
len -= avail;
|
||||
mb ();
|
||||
grub_xen_xenstore->req_prod += avail;
|
||||
mb ();
|
||||
if (!event_sent)
|
||||
{
|
||||
send.port = grub_xen_start_page_addr->store_evtchn;
|
||||
grub_xen_event_channel_op (EVTCHNOP_send, &send);
|
||||
event_sent = 1;
|
||||
}
|
||||
grub_xen_sched_op (SCHEDOP_yield, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
grub_xen_store_recv (void *buf_, grub_size_t len)
|
||||
{
|
||||
grub_uint8_t *buf = buf_;
|
||||
struct evtchn_send send;
|
||||
int event_sent = 0;
|
||||
while (len)
|
||||
{
|
||||
grub_size_t avail, inbuf;
|
||||
grub_size_t prod, cons;
|
||||
mb ();
|
||||
prod = grub_xen_xenstore->rsp_prod;
|
||||
cons = grub_xen_xenstore->rsp_cons;
|
||||
if (prod <= cons)
|
||||
{
|
||||
if (!event_sent)
|
||||
{
|
||||
send.port = grub_xen_start_page_addr->store_evtchn;
|
||||
grub_xen_event_channel_op (EVTCHNOP_send, &send);
|
||||
event_sent = 1;
|
||||
}
|
||||
grub_xen_sched_op (SCHEDOP_yield, 0);
|
||||
continue;
|
||||
}
|
||||
event_sent = 0;
|
||||
avail = prod - cons;
|
||||
inbuf = (~cons & (sizeof (grub_xen_xenstore->req) - 1)) + 1;
|
||||
if (avail > inbuf)
|
||||
avail = inbuf;
|
||||
if (avail > len)
|
||||
avail = len;
|
||||
grub_memcpy (buf,
|
||||
(void *) &grub_xen_xenstore->rsp[cons & (sizeof (grub_xen_xenstore->rsp) - 1)],
|
||||
avail);
|
||||
buf += avail;
|
||||
len -= avail;
|
||||
mb ();
|
||||
grub_xen_xenstore->rsp_cons += avail;
|
||||
mb ();
|
||||
if (!event_sent)
|
||||
{
|
||||
send.port = grub_xen_start_page_addr->store_evtchn;
|
||||
grub_xen_event_channel_op(EVTCHNOP_send, &send);
|
||||
event_sent = 1;
|
||||
}
|
||||
grub_xen_sched_op(SCHEDOP_yield, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void *
|
||||
grub_xenstore_get_file (const char *dir, grub_size_t *len)
|
||||
{
|
||||
struct xsd_sockmsg msg;
|
||||
char *buf;
|
||||
grub_size_t dirlen = grub_strlen (dir) + 1;
|
||||
|
||||
if (len)
|
||||
*len = 0;
|
||||
|
||||
grub_memset (&msg, 0, sizeof (msg));
|
||||
msg.type = XS_READ;
|
||||
msg.len = dirlen;
|
||||
grub_xen_store_send (&msg, sizeof (msg));
|
||||
grub_xen_store_send (dir, dirlen);
|
||||
grub_xen_store_recv (&msg, sizeof (msg));
|
||||
buf = grub_malloc (msg.len + 1);
|
||||
if (!buf)
|
||||
return NULL;
|
||||
grub_dprintf ("xen", "msg type = %d, len = %d\n", msg.type, msg.len);
|
||||
grub_xen_store_recv (buf, msg.len);
|
||||
buf[msg.len] = '\0';
|
||||
if (msg.type == XS_ERROR)
|
||||
{
|
||||
grub_error (GRUB_ERR_IO, "couldn't read xenstorage `%s': %s", dir, buf);
|
||||
grub_free (buf);
|
||||
return NULL;
|
||||
}
|
||||
if (len)
|
||||
*len = msg.len;
|
||||
return buf;
|
||||
}
|
||||
|
||||
grub_err_t
|
||||
grub_xenstore_write_file (const char *dir, const void *buf, grub_size_t len)
|
||||
{
|
||||
struct xsd_sockmsg msg;
|
||||
grub_size_t dirlen = grub_strlen (dir) + 1;
|
||||
char *resp;
|
||||
|
||||
grub_memset (&msg, 0, sizeof (msg));
|
||||
msg.type = XS_WRITE;
|
||||
msg.len = dirlen + len;
|
||||
grub_xen_store_send (&msg, sizeof (msg));
|
||||
grub_xen_store_send (dir, dirlen);
|
||||
grub_xen_store_send (buf, len);
|
||||
grub_xen_store_recv (&msg, sizeof (msg));
|
||||
resp = grub_malloc (msg.len + 1);
|
||||
if (!resp)
|
||||
return grub_errno;
|
||||
grub_dprintf ("xen", "msg type = %d, len = %d\n", msg.type, msg.len);
|
||||
grub_xen_store_recv (resp, msg.len);
|
||||
resp[msg.len] = '\0';
|
||||
if (msg.type == XS_ERROR)
|
||||
{
|
||||
grub_dprintf ("xen", "error = %s\n", resp);
|
||||
grub_error (GRUB_ERR_IO, "couldn't read xenstorage `%s': %s",
|
||||
dir, resp);
|
||||
grub_free (resp);
|
||||
return grub_errno;
|
||||
}
|
||||
grub_free (resp);
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
/* FIXME: error handling. */
|
||||
grub_err_t
|
||||
grub_xenstore_dir (const char *dir,
|
||||
int (*hook) (const char *dir, void *hook_data),
|
||||
void *hook_data)
|
||||
{
|
||||
struct xsd_sockmsg msg;
|
||||
char *buf;
|
||||
char *ptr;
|
||||
grub_size_t dirlen = grub_strlen (dir) + 1;
|
||||
|
||||
grub_memset (&msg, 0, sizeof (msg));
|
||||
msg.type = XS_DIRECTORY;
|
||||
msg.len = dirlen;
|
||||
grub_xen_store_send (&msg, sizeof (msg));
|
||||
grub_xen_store_send (dir, dirlen);
|
||||
grub_xen_store_recv (&msg, sizeof (msg));
|
||||
buf = grub_malloc (msg.len + 1);
|
||||
if (!buf)
|
||||
return grub_errno;
|
||||
grub_dprintf ("xen", "msg type = %d, len = %d\n", msg.type, msg.len);
|
||||
grub_xen_store_recv (buf, msg.len);
|
||||
buf[msg.len] = '\0';
|
||||
if (msg.type == XS_ERROR)
|
||||
{
|
||||
grub_err_t err;
|
||||
err = grub_error (GRUB_ERR_IO, "couldn't read xenstorage `%s': %s",
|
||||
dir, buf);
|
||||
grub_free (buf);
|
||||
return err;
|
||||
}
|
||||
for (ptr = buf; ptr < buf + msg.len; ptr += grub_strlen (ptr) + 1)
|
||||
if (hook (ptr, hook_data))
|
||||
break;
|
||||
grub_free (buf);
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
unsigned long gntframe = 0;
|
||||
|
||||
#define MAX_N_UNUSABLE_PAGES 4
|
||||
|
||||
static int
|
||||
grub_xen_is_page_usable (grub_xen_mfn_t mfn)
|
||||
{
|
||||
if (mfn == grub_xen_start_page_addr->console.domU.mfn)
|
||||
return 0;
|
||||
if (mfn == grub_xen_start_page_addr->shared_info)
|
||||
return 0;
|
||||
if (mfn == grub_xen_start_page_addr->store_mfn)
|
||||
return 0;
|
||||
if (mfn == gntframe)
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static grub_uint64_t
|
||||
page2offset (grub_uint64_t page)
|
||||
{
|
||||
return page << 12;
|
||||
}
|
||||
|
||||
static void
|
||||
map_all_pages (void)
|
||||
{
|
||||
grub_uint64_t total_pages = grub_xen_start_page_addr->nr_pages;
|
||||
grub_uint64_t i, j;
|
||||
grub_xen_mfn_t *mfn_list =
|
||||
(grub_xen_mfn_t *) grub_xen_start_page_addr->mfn_list;
|
||||
grub_uint64_t *pg = (grub_uint64_t *) window;
|
||||
grub_uint64_t oldpgstart, oldpgend;
|
||||
struct gnttab_setup_table gnttab_setup;
|
||||
struct gnttab_set_version gnttab_setver;
|
||||
grub_size_t n_unusable_pages = 0;
|
||||
struct mmu_update m2p_updates[2 * MAX_N_UNUSABLE_PAGES];
|
||||
|
||||
grub_memset (&gnttab_setver, 0, sizeof (gnttab_setver));
|
||||
|
||||
gnttab_setver.version = 2;
|
||||
grub_xen_grant_table_op (GNTTABOP_set_version, &gnttab_setver, 1);
|
||||
|
||||
grub_memset (&gnttab_setup, 0, sizeof (gnttab_setup));
|
||||
gnttab_setup.dom = DOMID_SELF;
|
||||
gnttab_setup.nr_frames = 1;
|
||||
gnttab_setup.frame_list.p = &gntframe;
|
||||
|
||||
grub_xen_grant_table_op (GNTTABOP_setup_table, &gnttab_setup, 1);
|
||||
|
||||
for (j = 0; j < total_pages - n_unusable_pages; j++)
|
||||
while (!grub_xen_is_page_usable (mfn_list[j]))
|
||||
{
|
||||
grub_xen_mfn_t t;
|
||||
if (n_unusable_pages >= MAX_N_UNUSABLE_PAGES)
|
||||
{
|
||||
struct sched_shutdown arg;
|
||||
arg.reason = SHUTDOWN_crash;
|
||||
grub_xen_sched_op (SCHEDOP_shutdown, &arg);
|
||||
while (1);
|
||||
}
|
||||
t = mfn_list[j];
|
||||
mfn_list[j] = mfn_list[total_pages - n_unusable_pages - 1];
|
||||
mfn_list[total_pages - n_unusable_pages - 1] = t;
|
||||
|
||||
m2p_updates[2 * n_unusable_pages].ptr
|
||||
= page2offset (mfn_list[j]) | MMU_MACHPHYS_UPDATE;
|
||||
m2p_updates[2 * n_unusable_pages].val = j;
|
||||
m2p_updates[2 * n_unusable_pages + 1].ptr
|
||||
= page2offset (mfn_list[total_pages - n_unusable_pages - 1])
|
||||
| MMU_MACHPHYS_UPDATE;
|
||||
m2p_updates[2 * n_unusable_pages + 1].val = total_pages
|
||||
- n_unusable_pages - 1;
|
||||
|
||||
n_unusable_pages++;
|
||||
}
|
||||
|
||||
grub_xen_mmu_update (m2p_updates, 2 * n_unusable_pages, NULL, DOMID_SELF);
|
||||
|
||||
total_pages += 4;
|
||||
|
||||
grub_uint64_t lx[NUMBER_OF_LEVELS], nlx;
|
||||
grub_uint64_t paging_start = total_pages - 4 - n_unusable_pages, curpage;
|
||||
|
||||
for (nlx = total_pages, i = 0; i < (unsigned) NUMBER_OF_LEVELS; i++)
|
||||
{
|
||||
nlx = (nlx + POINTERS_PER_PAGE - 1) >> LOG_POINTERS_PER_PAGE;
|
||||
/* PAE wants all 4 root directories present. */
|
||||
#ifdef __i386__
|
||||
if (i == 1)
|
||||
nlx = 4;
|
||||
#endif
|
||||
lx[i] = nlx;
|
||||
paging_start -= nlx;
|
||||
}
|
||||
|
||||
oldpgstart = grub_xen_start_page_addr->pt_base >> 12;
|
||||
oldpgend = oldpgstart + grub_xen_start_page_addr->nr_pt_frames;
|
||||
|
||||
curpage = paging_start;
|
||||
|
||||
int l;
|
||||
|
||||
for (l = NUMBER_OF_LEVELS - 1; l >= 1; l--)
|
||||
{
|
||||
for (i = 0; i < lx[l]; i++)
|
||||
{
|
||||
grub_xen_update_va_mapping (&window,
|
||||
page2offset (mfn_list[curpage + i]) | 7,
|
||||
UVMF_INVLPG);
|
||||
grub_memset (&window, 0, sizeof (window));
|
||||
|
||||
for (j = i * POINTERS_PER_PAGE;
|
||||
j < (i + 1) * POINTERS_PER_PAGE && j < lx[l - 1]; j++)
|
||||
pg[j - i * POINTERS_PER_PAGE] =
|
||||
page2offset (mfn_list[curpage + lx[l] + j])
|
||||
#ifdef __x86_64__
|
||||
| 4
|
||||
#endif
|
||||
| 3;
|
||||
}
|
||||
curpage += lx[l];
|
||||
}
|
||||
|
||||
for (i = 0; i < lx[0]; i++)
|
||||
{
|
||||
grub_xen_update_va_mapping (&window,
|
||||
page2offset (mfn_list[curpage + i]) | 7,
|
||||
UVMF_INVLPG);
|
||||
grub_memset (&window, 0, sizeof (window));
|
||||
|
||||
for (j = i * POINTERS_PER_PAGE;
|
||||
j < (i + 1) * POINTERS_PER_PAGE && j < total_pages; j++)
|
||||
if (j < paging_start && !(j >= oldpgstart && j < oldpgend))
|
||||
pg[j - i * POINTERS_PER_PAGE] = page2offset (mfn_list[j]) | 0x7;
|
||||
else if (j < grub_xen_start_page_addr->nr_pages)
|
||||
pg[j - i * POINTERS_PER_PAGE] = page2offset (mfn_list[j]) | 5;
|
||||
else if (j == grub_xen_start_page_addr->nr_pages)
|
||||
{
|
||||
pg[j - i * POINTERS_PER_PAGE] =
|
||||
page2offset (grub_xen_start_page_addr->console.domU.mfn) | 7;
|
||||
grub_xen_xcons = (void *) (grub_addr_t) page2offset (j);
|
||||
}
|
||||
else if (j == grub_xen_start_page_addr->nr_pages + 1)
|
||||
{
|
||||
pg[j - i * POINTERS_PER_PAGE] =
|
||||
grub_xen_start_page_addr->shared_info | 7;
|
||||
grub_xen_shared_info = (void *) (grub_addr_t) page2offset (j);
|
||||
}
|
||||
else if (j == grub_xen_start_page_addr->nr_pages + 2)
|
||||
{
|
||||
pg[j - i * POINTERS_PER_PAGE] =
|
||||
page2offset (grub_xen_start_page_addr->store_mfn) | 7;
|
||||
grub_xen_xenstore = (void *) (grub_addr_t) page2offset (j);
|
||||
}
|
||||
else if (j == grub_xen_start_page_addr->nr_pages + 3)
|
||||
{
|
||||
pg[j - i * POINTERS_PER_PAGE] = page2offset (gntframe) | 7;
|
||||
grub_xen_grant_table = (void *) (grub_addr_t) page2offset (j);
|
||||
}
|
||||
}
|
||||
|
||||
grub_xen_update_va_mapping (&window, 0, UVMF_INVLPG);
|
||||
|
||||
mmuext_op_t op[3];
|
||||
|
||||
op[0].cmd = MMUEXT_PIN_L1_TABLE + (NUMBER_OF_LEVELS - 1);
|
||||
op[0].arg1.mfn = mfn_list[paging_start];
|
||||
op[1].cmd = MMUEXT_NEW_BASEPTR;
|
||||
op[1].arg1.mfn = mfn_list[paging_start];
|
||||
op[2].cmd = MMUEXT_UNPIN_TABLE;
|
||||
op[2].arg1.mfn = mfn_list[oldpgstart];
|
||||
|
||||
grub_xen_mmuext_op (op, 3, NULL, DOMID_SELF);
|
||||
|
||||
for (i = oldpgstart; i < oldpgend; i++)
|
||||
grub_xen_update_va_mapping ((void *) (grub_addr_t) page2offset (i),
|
||||
page2offset (mfn_list[i]) | 7, UVMF_INVLPG);
|
||||
void *new_start_page, *new_mfn_list;
|
||||
new_start_page = (void *) (grub_addr_t) page2offset (paging_start - 1);
|
||||
grub_memcpy (new_start_page, grub_xen_start_page_addr, 4096);
|
||||
grub_xen_start_page_addr = new_start_page;
|
||||
new_mfn_list = (void *) (grub_addr_t)
|
||||
page2offset (paging_start - 1
|
||||
- ((grub_xen_start_page_addr->nr_pages
|
||||
* sizeof (grub_uint64_t) + 4095) / 4096));
|
||||
grub_memcpy (new_mfn_list, mfn_list, grub_xen_start_page_addr->nr_pages
|
||||
* sizeof (grub_uint64_t));
|
||||
grub_xen_start_page_addr->pt_base = page2offset (paging_start);
|
||||
grub_xen_start_page_addr->mfn_list = (grub_addr_t) new_mfn_list;
|
||||
|
||||
grub_addr_t heap_start = grub_modules_get_end ();
|
||||
grub_addr_t heap_end = (grub_addr_t) new_mfn_list;
|
||||
|
||||
grub_mm_init_region ((void *) heap_start, heap_end - heap_start);
|
||||
}
|
||||
|
||||
extern char _end[];
|
||||
|
||||
void
|
||||
grub_machine_init (void)
|
||||
{
|
||||
#ifdef __i386__
|
||||
grub_xen_vm_assist (VMASST_CMD_enable, VMASST_TYPE_pae_extended_cr3);
|
||||
#endif
|
||||
|
||||
grub_modbase = ALIGN_UP ((grub_addr_t) _end
|
||||
+ GRUB_KERNEL_MACHINE_MOD_GAP,
|
||||
GRUB_KERNEL_MACHINE_MOD_ALIGN);
|
||||
|
||||
map_all_pages ();
|
||||
|
||||
grub_console_init ();
|
||||
|
||||
grub_tsc_init ();
|
||||
|
||||
grub_xendisk_init ();
|
||||
|
||||
grub_boot_init ();
|
||||
}
|
||||
|
||||
void
|
||||
grub_exit (void)
|
||||
{
|
||||
struct sched_shutdown arg;
|
||||
|
||||
arg.reason = SHUTDOWN_poweroff;
|
||||
grub_xen_sched_op (SCHEDOP_shutdown, &arg);
|
||||
while (1);
|
||||
}
|
||||
|
||||
void
|
||||
grub_machine_fini (int flags __attribute__ ((unused)))
|
||||
{
|
||||
grub_xendisk_fini ();
|
||||
grub_boot_fini ();
|
||||
}
|
||||
|
||||
grub_err_t
|
||||
grub_machine_mmap_iterate (grub_memory_hook_t hook, void *hook_data)
|
||||
{
|
||||
grub_uint64_t total_pages = grub_xen_start_page_addr->nr_pages;
|
||||
grub_uint64_t usable_pages = grub_xen_start_page_addr->pt_base >> 12;
|
||||
if (hook (0, page2offset (usable_pages), GRUB_MEMORY_AVAILABLE, hook_data))
|
||||
return GRUB_ERR_NONE;
|
||||
|
||||
hook (page2offset (usable_pages), page2offset (total_pages - usable_pages),
|
||||
GRUB_MEMORY_RESERVED, hook_data);
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
@@ -26,9 +26,7 @@
|
||||
|
||||
#include <grub/lib/LzmaDec.h>
|
||||
|
||||
#pragma GCC diagnostic ignored "-Wshadow"
|
||||
#include <grub/misc.h>
|
||||
#define memcpy grub_memcpy
|
||||
#include <string.h>
|
||||
|
||||
#define kNumTopBits 24
|
||||
#define kTopValue ((UInt32)1 << kNumTopBits)
|
||||
@@ -720,7 +718,7 @@ static void LzmaDec_InitRc(CLzmaDec *p, const Byte *data)
|
||||
p->needFlush = 0;
|
||||
}
|
||||
|
||||
static void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState)
|
||||
void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState)
|
||||
{
|
||||
p->needFlush = 1;
|
||||
p->remainLen = 0;
|
||||
|
||||
195
grub-core/lib/alpha/setjmp.S
Normal file
195
grub-core/lib/alpha/setjmp.S
Normal file
@@ -0,0 +1,195 @@
|
||||
/* Copyright (C) 1992, 1994, 1996, 1997, 2002, 2006, 2013 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <grub/symbol.h>
|
||||
#include <grub/dl.h>
|
||||
|
||||
#define JB_S0 0
|
||||
#define JB_S1 1
|
||||
#define JB_S2 2
|
||||
#define JB_S3 3
|
||||
#define JB_S4 4
|
||||
#define JB_S5 5
|
||||
#define JB_PC 6
|
||||
#define JB_FP 7
|
||||
#define JB_SP 8
|
||||
#define JB_F2 9
|
||||
#define JB_F3 10
|
||||
#define JB_F4 11
|
||||
#define JB_F5 12
|
||||
#define JB_F6 13
|
||||
#define JB_F7 14
|
||||
#define JB_F8 15
|
||||
#define JB_F9 16
|
||||
|
||||
#define v0 $0 /* function return value */
|
||||
|
||||
#define t0 $1 /* temporary registers (caller-saved) */
|
||||
#define t1 $2
|
||||
#define t2 $3
|
||||
#define t3 $4
|
||||
#define t4 $5
|
||||
#define t5 $6
|
||||
#define t6 $7
|
||||
#define t7 $8
|
||||
|
||||
#define s0 $9 /* saved-registers (callee-saved registers) */
|
||||
#define s1 $10
|
||||
#define s2 $11
|
||||
#define s3 $12
|
||||
#define s4 $13
|
||||
#define s5 $14
|
||||
#define s6 $15
|
||||
#define fp s6 /* frame-pointer (s6 in frame-less procedures) */
|
||||
|
||||
#define a0 $16 /* argument registers (caller-saved) */
|
||||
#define a1 $17
|
||||
#define a2 $18
|
||||
#define a3 $19
|
||||
#define a4 $20
|
||||
#define a5 $21
|
||||
|
||||
#define t8 $22 /* more temps (caller-saved) */
|
||||
#define t9 $23
|
||||
#define t10 $24
|
||||
#define t11 $25
|
||||
#define ra $26 /* return address register */
|
||||
#define t12 $27
|
||||
|
||||
#define pv t12 /* procedure-variable register */
|
||||
#define AT $at /* assembler temporary */
|
||||
#define gp $29 /* global pointer */
|
||||
#define sp $30 /* stack pointer */
|
||||
#define zero $31 /* reads as zero, writes are noops */
|
||||
|
||||
#define ENTRY(name) \
|
||||
.globl EXT_C(name); \
|
||||
.align 4; \
|
||||
.ent EXT_C(name), 0; \
|
||||
EXT_C(name): \
|
||||
.frame sp, 0, ra
|
||||
|
||||
|
||||
GRUB_MOD_LICENSE "GPLv3+"
|
||||
|
||||
.text
|
||||
|
||||
ENTRY(grub_setjmp)
|
||||
ldgp gp, 0(pv)
|
||||
|
||||
#ifndef PIC
|
||||
#define FRAME 16
|
||||
subq sp, FRAME, sp
|
||||
.frame sp, FRAME, ra, 0
|
||||
stq ra, 0(sp)
|
||||
.mask 0x04000000, -FRAME
|
||||
#else
|
||||
#define FRAME 0
|
||||
.frame sp, FRAME, ra, 0
|
||||
#endif
|
||||
#ifdef PROF
|
||||
.set noat
|
||||
lda AT, _mcount
|
||||
jsr AT, (AT), _mcount
|
||||
.set at
|
||||
#endif
|
||||
|
||||
.prologue 1
|
||||
mov 0, a1
|
||||
|
||||
stq s0, JB_S0*8(a0)
|
||||
stq s1, JB_S1*8(a0)
|
||||
stq s2, JB_S2*8(a0)
|
||||
stq s3, JB_S3*8(a0)
|
||||
stq s4, JB_S4*8(a0)
|
||||
stq s5, JB_S5*8(a0)
|
||||
#ifdef PTR_MANGLE
|
||||
PTR_MANGLE(t1, ra, t0)
|
||||
stq t1, JB_PC*8(a0)
|
||||
#else
|
||||
stq ra, JB_PC*8(a0)
|
||||
#endif
|
||||
#if defined(PTR_MANGLE) && FRAME == 0
|
||||
PTR_MANGLE2(t1, sp, t0)
|
||||
#else
|
||||
addq sp, FRAME, t1
|
||||
# ifdef PTR_MANGLE
|
||||
PTR_MANGLE2(t1, t1, t0)
|
||||
# endif
|
||||
#endif
|
||||
stq t1, JB_SP*8(a0)
|
||||
#ifdef PTR_MANGLE
|
||||
PTR_MANGLE2(t1, fp, t0)
|
||||
stq t1, JB_FP*8(a0)
|
||||
#else
|
||||
stq fp, JB_FP*8(a0)
|
||||
#endif
|
||||
stt $f2, JB_F2*8(a0)
|
||||
stt $f3, JB_F3*8(a0)
|
||||
stt $f4, JB_F4*8(a0)
|
||||
stt $f5, JB_F5*8(a0)
|
||||
stt $f6, JB_F6*8(a0)
|
||||
stt $f7, JB_F7*8(a0)
|
||||
stt $f8, JB_F8*8(a0)
|
||||
stt $f9, JB_F9*8(a0)
|
||||
|
||||
mov 0, v0
|
||||
ret
|
||||
|
||||
.end grub_setjmp
|
||||
|
||||
ENTRY(grub_longjmp)
|
||||
#ifdef PROF
|
||||
ldgp gp, 0(pv)
|
||||
.set noat
|
||||
lda AT, _mcount
|
||||
jsr AT, (AT), _mcount
|
||||
.set at
|
||||
.prologue 1
|
||||
#else
|
||||
.prologue 0
|
||||
#endif
|
||||
|
||||
mov a1, v0
|
||||
ldq s0, JB_S0*8(a0)
|
||||
ldq s1, JB_S1*8(a0)
|
||||
ldq s2, JB_S2*8(a0)
|
||||
ldq s3, JB_S3*8(a0)
|
||||
ldq s4, JB_S4*8(a0)
|
||||
ldq s5, JB_S5*8(a0)
|
||||
ldq ra, JB_PC*8(a0)
|
||||
ldq fp, JB_FP*8(a0)
|
||||
ldq t0, JB_SP*8(a0)
|
||||
ldt $f2, JB_F2*8(a0)
|
||||
ldt $f3, JB_F3*8(a0)
|
||||
ldt $f4, JB_F4*8(a0)
|
||||
ldt $f5, JB_F5*8(a0)
|
||||
ldt $f6, JB_F6*8(a0)
|
||||
ldt $f7, JB_F7*8(a0)
|
||||
ldt $f8, JB_F8*8(a0)
|
||||
ldt $f9, JB_F9*8(a0)
|
||||
#ifdef PTR_DEMANGLE
|
||||
PTR_DEMANGLE(ra, t1)
|
||||
PTR_DEMANGLE2(t0, t1)
|
||||
PTR_DEMANGLE2(fp, t1)
|
||||
#endif
|
||||
cmoveq v0, 1, v0
|
||||
mov t0, sp
|
||||
ret
|
||||
|
||||
.end EXT_C(grub_longjmp)
|
||||
@@ -19,22 +19,19 @@
|
||||
#include <grub/datetime.h>
|
||||
#include <grub/dl.h>
|
||||
#include <grub/misc.h>
|
||||
#include <grub/xen.h>
|
||||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
grub_err_t
|
||||
grub_get_datetime (struct grub_datetime *datetime)
|
||||
grub_get_datetime (struct grub_datetime *datetime __attribute__ ((unused)))
|
||||
{
|
||||
long long nix;
|
||||
nix = (grub_xen_shared_info->wc_sec
|
||||
+ grub_divmod64 (grub_xen_shared_info->vcpu_info[0].time.system_time, 1000000000, 0));
|
||||
grub_unixtime2datetime (nix, datetime);
|
||||
return GRUB_ERR_NONE;
|
||||
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
|
||||
"getting time isn't supported");
|
||||
}
|
||||
|
||||
grub_err_t
|
||||
grub_set_datetime (struct grub_datetime *datetime __attribute__ ((unused)))
|
||||
{
|
||||
return grub_error (GRUB_ERR_IO, "setting time isn't supported");
|
||||
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
|
||||
"setting time isn't supported");
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
* Copyright (C) 2011 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -16,11 +16,10 @@
|
||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <grub/util/install.h>
|
||||
#include <grub/misc.h>
|
||||
|
||||
const char *
|
||||
grub_install_get_default_x86_platform (void)
|
||||
{
|
||||
return "i386-pc";
|
||||
void
|
||||
grub_halt (void)
|
||||
{
|
||||
while (1);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2011 Free Software Foundation, Inc.
|
||||
* 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
|
||||
@@ -16,17 +16,10 @@
|
||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <grub/mm.h>
|
||||
#include <grub/misc.h>
|
||||
#include <grub/kernel.h>
|
||||
#include <grub/xen.h>
|
||||
|
||||
void
|
||||
grub_reboot (void)
|
||||
{
|
||||
struct sched_shutdown arg;
|
||||
|
||||
arg.reason = SHUTDOWN_reboot;
|
||||
grub_xen_sched_op (SCHEDOP_shutdown, &arg);
|
||||
for (;;);
|
||||
while (1);
|
||||
}
|
||||
@@ -24,11 +24,7 @@
|
||||
GRUB_MOD_LICENSE "GPLv3+"
|
||||
|
||||
.syntax unified
|
||||
#if !defined (__thumb2__)
|
||||
.arm
|
||||
#else
|
||||
.thumb
|
||||
#endif
|
||||
|
||||
.text
|
||||
|
||||
@@ -36,8 +32,7 @@ GRUB_MOD_LICENSE "GPLv3+"
|
||||
* int grub_setjmp (grub_jmp_buf env)
|
||||
*/
|
||||
FUNCTION(grub_setjmp)
|
||||
mov r12, sp
|
||||
stm r0, { r4-r12, lr }
|
||||
stm r0, { r4-r11, sp, lr }
|
||||
mov r0, #0
|
||||
bx lr
|
||||
|
||||
@@ -45,9 +40,7 @@ FUNCTION(grub_setjmp)
|
||||
* int grub_longjmp (grub_jmp_buf env, int val)
|
||||
*/
|
||||
FUNCTION(grub_longjmp)
|
||||
ldm r0, { r4-r12, lr }
|
||||
mov sp, r12
|
||||
ldm r0, { r4-r11, sp, lr }
|
||||
movs r0, r1
|
||||
it eq
|
||||
moveq r0, #1
|
||||
bx lr
|
||||
|
||||
@@ -56,9 +56,6 @@ unsigned int grub_loader_cmdline_size (int argc, char *argv[])
|
||||
size++; /* Separator space or NULL. */
|
||||
}
|
||||
|
||||
if (size == 0)
|
||||
size = 1;
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
|
||||
@@ -261,13 +261,11 @@ grub_crypto_cbc_decrypt (grub_crypto_cipher_handle_t cipher,
|
||||
{
|
||||
const grub_uint8_t *inptr;
|
||||
grub_uint8_t *outptr, *end;
|
||||
grub_uint8_t ivt[GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE];
|
||||
grub_uint8_t ivt[cipher->cipher->blocksize];
|
||||
if (!cipher->cipher->decrypt)
|
||||
return GPG_ERR_NOT_SUPPORTED;
|
||||
if (size % cipher->cipher->blocksize != 0)
|
||||
return GPG_ERR_INV_ARG;
|
||||
if (cipher->cipher->blocksize > GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE)
|
||||
return GPG_ERR_INV_ARG;
|
||||
end = (grub_uint8_t *) in + size;
|
||||
for (inptr = in, outptr = out; inptr < end;
|
||||
inptr += cipher->cipher->blocksize, outptr += cipher->cipher->blocksize)
|
||||
|
||||
@@ -23,12 +23,11 @@
|
||||
#include <grub/mm.h>
|
||||
#include <grub/kernel.h>
|
||||
#include <grub/acpi.h>
|
||||
#include <grub/loader.h>
|
||||
|
||||
void
|
||||
grub_halt (void)
|
||||
{
|
||||
grub_machine_fini (GRUB_LOADER_FLAG_NORETURN);
|
||||
grub_machine_fini ();
|
||||
#if !defined(__ia64__) && !defined(__arm__)
|
||||
grub_acpi_halt ();
|
||||
#endif
|
||||
|
||||
@@ -21,12 +21,11 @@
|
||||
#include <grub/mm.h>
|
||||
#include <grub/misc.h>
|
||||
#include <grub/kernel.h>
|
||||
#include <grub/loader.h>
|
||||
|
||||
void
|
||||
grub_reboot (void)
|
||||
{
|
||||
grub_machine_fini (GRUB_LOADER_FLAG_NORETURN);
|
||||
grub_machine_fini ();
|
||||
efi_call_4 (grub_efi_system_table->runtime_services->reset_system,
|
||||
GRUB_EFI_RESET_COLD, GRUB_EFI_SUCCESS, 0, NULL);
|
||||
for (;;) ;
|
||||
|
||||
@@ -58,3 +58,4 @@ grub_reboot (void)
|
||||
|
||||
while (1);
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user