Bugfixes in multiboot for bugs uncovered by solaris kernel.
* loader/i386/multiboot_elfxx.c (grub_multiboot_load_elf): Corrected
limit detection.
Use vaddr of correct segment for entry_point.
* loader/i386/linux.c: Include `<grub/video.h>' and
`<grub/i386/pc/vbe.h>'..
(grub_linux_setup_video): New function. Loosely based on the EFI one.
(grub_linux32_boot): Attempt to configure video settings with
grub_linux_setup_video().
(grub_rescue_cmd_linux): Set noreturn=0 in grub_loader_set, in order
to avoid grub_console_fini() which would step out of graphical mode
unconditionally.
* loader/i386/multiboot.c (code_size): New variable.
(grub_multiboot): Define offsets by adding to `code_size' rather
than substracting from `grub_multiboot_payload_size'. Provide
4-byte alignment to MBI and others by increasing
`boot_loader_name_length' appropiately.
* loader/i386/multiboot_elfxx.c
(CONCAT(grub_multiboot_load_elf, XX)): Initialize `code_size'.
Move more components to the relocation area, and fix mbi pointer
handling to use the destination rather than the origin (thanks to
Vladimir Serbinenko for spotting).
* loader/i386/multiboot.c (mbi_dest): New variable.
(grub_multiboot_boot): Use `mbi_dest' instead of `mbi'.
(grub_multiboot): Put cmdline, boot_loader_name and mbi in the
relocation area.
Factorize elf32 / elf64 code in Multiboot loader. This will
prevent it from getting out of sync again.
* loader/i386/multiboot.c (grub_multiboot_is_elf32,
grub_multiboot_load_elf32, grub_multiboot_is_elf64,
grub_multiboot_load_elf64): Move from here ...
* loader/i386/multiboot_elfxx.c (grub_multiboot_is_elf,
grub_multiboot_load_elf): ... to here (new file).
* include/multiboot.h (MULTIBOOT_INFO_ALIGN): New macro.
* loader/i386/pc/multiboot.c (grub_multiboot): Include the MBI
in our relocation, instead of using it directly from heap. Also
use `MULTIBOOT_INFO_ALIGN' to ensure it is aligned.
* include/grub/i386/coreboot/memory.h (GRUB_MEMORY_MACHINE_LOWER_SIZE):
Redefine to match with GRUB_MEMORY_MACHINE_UPPER_START (0x100000). We
don't want to mess with lower memory, because it is used in the Linux
loader.
* loader/i386/linux.c (allocate_pages): Allocate `real_mode_mem' in
an appropiate place in lower memory, between 0x10000 and 0x90000,
like loader/i386/efi/linux.c does. Linux often panics if real_mode_mem
is in our heap (probably as a result of it being corrupted during
decompression).
* include/multiboot2.h (struct multiboot_header): Add `flags' member as
per specification.
* loader/multiboot2.c (grub_multiboot2): Fix Multiboot2 header check.
* loader/multiboot_loader.c (find_multi_boot2_header): New function
(based on find_multi_boot1_header).
(grub_rescue_cmd_multiboot_loader): Check for Multiboot2 header,
using find_multi_boot2_header(), and abort if neither Multiboot or
Multiboot headers were found.
* loader/i386/pc/multiboot.c (grub_multiboot_load_elf32): Skip
segments when their filesz is zero (grub_file_read() interprets
zero-size as "read untill EOF", which results in memory corruption).
Use `lowest_segment' rather than 0 for calculating the current
segment load address.
* loader/i386/pc/multiboot.c (mmap_addr, mmap_length): Remove
variables.
(grub_multiboot): Move `mbi' allocation upwards, so that mmap address
and length can be stored directly in the `mbi->mmap_addr' and
`mbi->mmap_length' struct fields.
* conf/i386-pc.rmk (kernel_img_SOURCES): Add `kern/i386/pc/mmap.c'.
* include/grub/i386/pc/init.h (GRUB_MACHINE_MEMORY_AVAILABLE)
(GRUB_MACHINE_MEMORY_RESERVED): New macros.
(grub_machine_mmap_iterate): New function declaration.
* include/grub/multiboot.h (struct grub_multiboot_mmap_entry): New
structure.
(GRUB_MMAP_MEMORY_AVAILABLE, GRUB_MMAP_MEMORY_RESERVED): New
macros.
* kern/i386/pc/init.c (grub_machine_init): Replace hardcoded region
type check value with `GRUB_MACHINE_MEMORY_AVAILABLE'.
Move e820 parsing from here ...
* kern/i386/pc/mmap.c: New file.
(grub_machine_mmap_iterate): ... to here.
* include/grub/i386/coreboot/memory.h: Remove `<grub/err.h>'.
(GRUB_LINUXBIOS_MEMORY_AVAILABLE): Rename (for consistency) to ...
(GRUB_MACHINE_MEMORY_AVAILABLE): ... this. Update all users.
(grub_available_iterate): Redeclare to return `void', and redeclare
its hook to use grub_uint64_t as addr and size parameters, and rename
to ...
(grub_machine_mmap_iterate): ... this. Update all users.
* kern/i386/coreboot/mmap.c (grub_mmap_iterate): Simplify parser loop
to make it more readable. Rename to ...
(grub_machine_mmap_iterate): ... this.
* loader/i386/pc/multiboot.c (mmap_addr, mmap_length): New variables.
(grub_get_multiboot_mmap_len, grub_fill_multiboot_mmap): New functions.
(grub_multiboot): Allocate an extra region after the payload, and fill
it with a Multiboot memory map. Adjust a.out loader to calculate size
with the extra space.
(grub_multiboot_load_elf32): Adjust elf32 loader to calculate size
with the extra space.
* loader/i386/pc/multiboot.c (grub_multiboot_load_elf32): Move part
of the relocation code from here ...
(grub_multiboot): ... to here.
(forward_relocator, backward_relocator): Move from here ...
* kern/i386/loader.S (grub_multiboot_forward_relocator)
(grub_multiboot_backward_relocator): ... to here.
(grub_multiboot_real_boot): Use %edx for entry offset. Put Multiboot
magic in %eax. Use %ebp for jumping (so %edx is not trashed).
* include/grub/i386/loader.h (grub_multiboot_forward_relocator)
(grub_multiboot_forward_relocator_end)
(grub_multiboot_backward_relocator)
(grub_multiboot_backward_relocator_end): New variables.
* loader/i386/pc/multiboot.c (playground, forward_relocator)
(backward_relocator): New variables. Used to allocate and relocate
the payload, respectively.
(grub_multiboot_load_elf32): Load into heap instead of requested
address, install the appropiate relocator code in each bound of
the payload, and set the entry point such that
grub_multiboot_real_boot() will jump to one of them.
* kern/i386/loader.S (grub_multiboot_payload_size)
(grub_multiboot_payload_orig, grub_multiboot_payload_dest)
(grub_multiboot_payload_entry_offset): New variables.
(grub_multiboot_real_boot): Set cpu context to what the relocator
expects, and jump to the relocator instead of the payload.
* include/grub/i386/loader.h (grub_multiboot_payload_size)
(grub_multiboot_payload_orig, grub_multiboot_payload_dest)
(grub_multiboot_payload_entry_offset): Export.
* loader/i386/pc/multiboot.c (grub_multiboot_load_elf32): When loading
ELF segments, use a macro for arbitrarily accessing any of them instead
of preparing a pointer that allows access to one at a time.
(grub_multiboot_load_elf64): Likewise.
* Makefile.in (RMKFILES): Add missing arch i386-ieee1275 and
i386-linuxbios.
* commands/hexdump.c (grub_cmd_hexdump): Support dumping of device,
change the buffer size to 4096 for cdrom device.
* conf/i386-ieee1275.rmk (pkglib_MODULES): Add _linux.mod, linux.mod
and nand.mod.
(_linux_mod_SOURCES): New variable.
(_linux_mod_CFLAGS): Likewise.
(_linux_mod_LDFLAGS): Likewise.
(linux_mod_SOURCES): Likewise.
(linux_mod_CFLAGS): Likewise.
(linux_mod_LDFLAGS): Likewise.
(nand_mod_SOURCES): Likewise.
(nand_mod_CFLAGS): Likewise.
(nand_mod_LDFLAGS): Likewise.
* disk/ieee1275/ofdisk.c (grub_ofdisk_open): Return
GRUB_ERR_UNKNOWN_DEVICE instead of GRUB_ERR_BAD_DEVICE if no device
type property. (nand device in olpc don't have this property)
* include/grub/disk.h (grub_disk_dev_id): New macro
GRUB_DISK_DEVICE_NAND_ID.
* include/grub/i386/ieee1275/loader.h (grub_rescue_cmd_linux): New
function prototype.
(grub_rescue_cmd_initrd): Likewise.
* include/grub/i386/linux.h (GRUB_LINUX_OFW_SIGNATURE): New macro.
(linux_kernel_params): Add new member ofw_signature, ofw_num_items,
ofw_cif_handler and ofw_idt, adjust padding number.
* include/grub/i386/pc/memory.h (grub_upper_mem): Export it if
GRUB_MACHINE_IEEE1275 is defined.
* include/grub/ieee1275/ieee1275.h (grub_available_iterate):
Use NESTED_FUNC_ATTR attribute on the hook parameter.
* kern/powerpc/ieee1275/init.c (grub_claim_heap): Use NESTED_FUNC_ATTR
on nested function heap_init.
(grub_upper_mem): New variable for i386-ieee1275.
(grub_get_extended_memory): New function for i386-ieee1275.
(grub_machine_init): Call grub_get_extended_memory for i386-ieee1275.
* kern/powerpc/ieee1275/openfw.c (grub_available_iterate): Use
NESTED_FUNC_ATTR on the hook parameter. Don't quit if no device type
property.
* loader/i386/ieee1275/linux.c: New file.
* loader/i386/ieee1275/linux_normal.c: New file.
* disk/ieee1275/nand.c: New file.
* kern/powerpc/ieee1275/init.c: Move from here ...
* kern/ieee1275/init.c: ... to here. Update all users.
* kern/powerpc/ieee1275/cmain.c: Move from here ...
* kern/ieee1275/cmain.c: ... to here. Update all users.
* kern/powerpc/ieee1275/openfw.c: Move from here ...
* kern/ieee1275/openfw.c: ... to here. Update all users.
* loader/powerpc/ieee1275/multiboot2.c: Move from here ...
* loader/ieee1275/multiboot2.c: ... to here. Update all users.
* loader/i386/pc/multiboot.c (grub_multiboot_get_bootdev): New function.
(grub_multiboot): Set boot device.
* boot/i386/pc/lnxboot.S (real_code_2): Set %dh to 0xFF.