Add grub_relocator64_efi relocator. It will be used on EFI 64-bit platforms
when multiboot2 compatible image requests MULTIBOOT_TAG_TYPE_EFI_BS. Relocator
will set lower parts of %rax and %rbx accordingly to multiboot2 specification.
On the other hand processor mode, just before jumping into loaded image, will
be set accordingly to Unified Extensible Firmware Interface Specification,
Version 2.4 Errata B, section 2.3.4, x64 Platforms, boot services. This way
loaded image will be able to use EFI boot services without any issues.
Signed-off-by: Daniel Kiper <daniel.kiper@oracle.com>
Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Reviewed-by: Vladimir Serbinenko <phcoder@gmail.com>
PIT isn't available on some of new hardware including Hyper-V. So
use pmtimer for calibration. Moreover pmtimer calibration is faster, so
use it on coreboor where booting time is important.
Based on patch by Michael Chang.
GRUB_MEMORY_MACHINE_SCRATCH_SIZE and increase
GRUB_MEMORY_MACHINE_PROT_STACK_SIZE.
The binary doesn't change (checked). It's more to better reflect actual
usage.
* include/grub/i386/relocator.h (grub_relocator16_state):
New member ebp.
* grub-core/lib/i386/relocator.c (grub_relocator16_ebp): New extern
variable.
(grub_relocator16_boot): Handle %ebp.
* grub-core/lib/i386/relocator16.S: Likewise.
* grub-core/loader/i386/pc/freedos.c:
Load BPB to pass kernel which partition to load from.
Check that kernel file is not too large.
Set register dl to BIOS unit number as well.
on some qemu versions with GRUB.
* include/grub/i386/openbsd_bootarg.h (OPENBSD_BOOTARG_PCIBIOS): New
define.
(grub_openbsd_bootarg_pcibios): New struct.
* grub-core/loader/i386/bsd.c (grub_openbsd_boot) [GRUB_MACHINE_PCBIOS]:
Add PCIINFO.
* grub-core/loader/i386/linux.c (GRUB_LINUX_CL_OFFSET): Removed.
(real_mode_mem): Likewise.
(real_mode_target): Likewise.
(real_mode_pages): Likewise.
(prot_mode_pages): Likewise.
(linux_params): New var.
(linux_cmdline): Likewise.
(free_pages): Don't set real mode variables.
(allocate_pages): Don't allocate real mode memory.
(grub_e820_add_region): Remove the limit.
(grub_linux_boot): Allocate and copy real mode memory.
(grub_linux_unload): Free linux_cmdline.
(grub_cmd_linux): Use temporary storage for parameters.
(grub_cmd_initrd): Likewise.
* include/grub/i386/linux.h (GRUB_E820_MAX_ENTRY): Removed.
(linux_kernel_params): Make it 1K big.
* grub-core/loader/i386/xnu.c (grub_cpu_xnu_fill_devicetree):
New argument fsbfreq_out.
(grub_xnu_set_video): Receive an argument grub_xnu_boot_params_common.
(grub_xnu_boot): Support v2 arguments. Disable PIC so that APIC can
be used.
* grub-core/loader/machoXX.c (grub_macho_load): New argument
darwin_version.
* grub-core/loader/xnu.c (grub_xnu_darwin_version): New variable.
* include/grub/i386/xnu.h (grub_xnu_boot_params_common): New struct.
(grub_xnu_boot_params): Rename to ...
(grub_xnu_boot_params_v1): ...this. Use grub_xnu_boot_params_common.
(grub_xnu_boot_params_v2): New struct.
* include/grub/i386/pc/int.h (grub_i386_idt): New struct.
(grub_realidt): New var.
* grub-core/lib/i386/relocator16.S (grub_relocator16_idt): New variable
Load idt.
* grub-core/lib/i386/relocator.c (grub_relocator16_idt):
New declaration.
(grub_relocator16_boot): Set grub_relocator16_idt.
* grub-core/kern/i386/realmode.S (realidt): Renamed to ...
(LOCAL(realidt)): ... this.
* grub-core/boot/i386/pc/startup_raw.S: Pass pointer to realidt in eax.
* grub-core/kern/i386/pc/startup.S: Save pointer to realidt.
(grub_realidt): New variable.
part. Instead setup the correct stack in RM.
* grub-core/lib/i386/relocator.c (grub_relocator16_boot): Reserve place
for stack.
* include/grub/i386/relocator_private.h: New file.
* grub-core/loader/i386/pc/pxechainloader.c: New file.
* grub-core/net/drivers/i386/pc/pxe.c (grub_pxe_get_cached): New
function.
(grub_pc_net_config_real): Use grub_pxe_get_cached.
* include/grub/i386/pc/pxe.h (grub_pxe_get_cached): New proto.