efi: Remove arch specific image headers for RISC-V, ARM64 and ARM

The arch specific image header details are not very useful as most of
the GRUB just looks at the PE/COFF spec parameters (PE32 magic and
header offset).

Remove the arch specific images headers and define a generic arch
headers that provide enough PE/COFF fields for the GRUB to parse
kernel images correctly.

Signed-off-by: Atish Patra <atishp@rivosinc.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
Atish Patra 2023-03-09 15:59:52 -08:00 committed by Daniel Kiper
parent fbce87cd39
commit 067bd35cd4
9 changed files with 31 additions and 162 deletions

View File

@ -25,10 +25,10 @@
#include <grub/i18n.h>
#include <grub/file.h>
#include <grub/elf.h>
#include <grub/efi/efi.h>
#include <grub/xen_file.h>
#include <grub/efi/pe32.h>
#include <grub/arm/linux.h>
#include <grub/arm64/linux.h>
#include <grub/i386/linux.h>
#include <grub/xnu.h>
#include <grub/machoload.h>
@ -391,7 +391,7 @@ grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char **args)
}
case IS_ARM_LINUX:
{
struct linux_arm_kernel_header lh;
struct linux_arch_kernel_header lh;
if (grub_file_read (file, &lh, sizeof (lh)) != sizeof (lh))
break;
@ -412,13 +412,24 @@ grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char **args)
}
case IS_ARM64_LINUX:
{
struct linux_arm64_kernel_header lh;
struct linux_arch_kernel_header lh;
if (grub_file_read (file, &lh, sizeof (lh)) != sizeof (lh))
break;
if (lh.magic ==
grub_cpu_to_le32_compile_time (GRUB_LINUX_ARM64_MAGIC_SIGNATURE))
/*
* The PE/COFF header can be anywhere in the file. Load it from the correct
* offset if it is not where it is expected.
*/
if ((grub_uint8_t *) &lh + lh.hdr_offset != (grub_uint8_t *) &lh.pe_image_header)
{
if (grub_file_seek (file, lh.hdr_offset) == (grub_off_t) -1
|| grub_file_read (file, &lh.pe_image_header, sizeof (struct grub_pe_image_header))
!= sizeof (struct grub_pe_image_header))
return grub_error (GRUB_ERR_FILE_READ_ERROR, "failed to read COFF image header");
}
if (lh.pe_image_header.coff_header.machine == grub_cpu_to_le16_compile_time (GRUB_PE32_MACHINE_ARM64))
{
ret = 1;
break;

View File

@ -26,6 +26,7 @@
#include <grub/command.h>
#include <grub/cache.h>
#include <grub/cpu/linux.h>
#include <grub/efi/efi.h>
#include <grub/lib/cmdline.h>
#include <grub/linux.h>
#include <grub/verify.h>
@ -304,7 +305,7 @@ linux_boot (void)
static grub_err_t
linux_load (const char *filename, grub_file_t file)
{
struct linux_arm_kernel_header *lh;
struct linux_arch_kernel_header *lh;
int size;
size = grub_file_size (file);

View File

@ -27,7 +27,6 @@
#include <grub/misc.h>
#include <grub/mm.h>
#include <grub/types.h>
#include <grub/cpu/linux.h>
#include <grub/efi/efi.h>
#include <grub/efi/fdtload.h>
#include <grub/efi/memory.h>
@ -439,7 +438,7 @@ static grub_err_t
grub_cmd_xen_hypervisor (grub_command_t cmd __attribute__ ((unused)),
int argc, char *argv[])
{
struct linux_arm64_kernel_header lh;
struct linux_arch_kernel_header lh;
grub_file_t file = NULL;
grub_dl_ref (my_mod);

View File

@ -25,7 +25,6 @@
#include <grub/loader.h>
#include <grub/mm.h>
#include <grub/types.h>
#include <grub/cpu/linux.h>
#include <grub/efi/efi.h>
#include <grub/efi/fdtload.h>
#include <grub/efi/memory.h>

View File

@ -24,26 +24,6 @@
#include <grub/efi/pe32.h>
#define GRUB_LINUX_ARM_MAGIC_SIGNATURE 0x016f2818
struct linux_arm_kernel_header {
grub_uint32_t code0;
grub_uint32_t reserved1[8];
grub_uint32_t magic;
grub_uint32_t start; /* _start */
grub_uint32_t end; /* _edata */
grub_uint32_t reserved2[3];
grub_uint32_t hdr_offset;
#if defined GRUB_MACHINE_EFI
struct grub_pe_image_header pe_image_header;
#endif
};
#if defined(__arm__)
# define GRUB_LINUX_ARMXX_MAGIC_SIGNATURE GRUB_LINUX_ARM_MAGIC_SIGNATURE
# define linux_arch_kernel_header linux_arm_kernel_header
#endif
#if defined GRUB_MACHINE_UBOOT
# include <grub/uboot/uboot.h>
# define LINUX_ADDRESS (start_of_ram + 0x8000)

View File

@ -1,48 +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/>.
*/
#ifndef GRUB_ARM64_LINUX_HEADER
#define GRUB_ARM64_LINUX_HEADER 1
#include <grub/types.h>
#include <grub/efi/pe32.h>
#define GRUB_LINUX_ARM64_MAGIC_SIGNATURE 0x644d5241 /* 'ARM\x64' */
/* From linux/Documentation/arm64/booting.txt */
struct linux_arm64_kernel_header
{
grub_uint32_t code0; /* Executable code */
grub_uint32_t code1; /* Executable code */
grub_uint64_t text_offset; /* Image load offset */
grub_uint64_t res0; /* reserved */
grub_uint64_t res1; /* reserved */
grub_uint64_t res2; /* reserved */
grub_uint64_t res3; /* reserved */
grub_uint64_t res4; /* reserved */
grub_uint32_t magic; /* Magic number, little endian, "ARM\x64" */
grub_uint32_t hdr_offset; /* Offset of PE/COFF header */
struct grub_pe_image_header pe_image_header;
};
#if defined(__aarch64__)
# define GRUB_LINUX_ARMXX_MAGIC_SIGNATURE GRUB_LINUX_ARM64_MAGIC_SIGNATURE
# define linux_arch_kernel_header linux_arm64_kernel_header
#endif
#endif /* ! GRUB_ARM64_LINUX_HEADER */

View File

@ -23,6 +23,18 @@
#include <grub/types.h>
#include <grub/dl.h>
#include <grub/efi/api.h>
#include <grub/efi/pe32.h>
#define GRUB_LINUX_ARM_MAGIC_SIGNATURE 0x016f2818
struct linux_arch_kernel_header {
grub_uint32_t code0;
grub_uint32_t code1;
grub_uint64_t reserved[6];
grub_uint32_t magic;
grub_uint32_t hdr_offset; /* Offset of PE/COFF header. */
struct grub_pe_image_header pe_image_header;
};
/* Functions. */
void *EXPORT_FUNC(grub_efi_locate_protocol) (grub_efi_guid_t *protocol,
@ -101,7 +113,6 @@ extern void (*EXPORT_VAR(grub_efi_net_config)) (grub_efi_handle_t hnd,
#if defined(__arm__) || defined(__aarch64__) || defined(__riscv)
void *EXPORT_FUNC(grub_efi_get_firmware_fdt)(void);
grub_err_t EXPORT_FUNC(grub_efi_get_ram_base)(grub_addr_t *);
#include <grub/cpu/linux.h>
#include <grub/file.h>
grub_err_t grub_arch_efi_linux_load_image_header(grub_file_t file,
struct linux_arch_kernel_header *lh);

View File

@ -1,41 +0,0 @@
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2018 Free Software Foundation, Inc.
*
* GRUB is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* GRUB is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef GRUB_RISCV32_LINUX_HEADER
#define GRUB_RISCV32_LINUX_HEADER 1
#define GRUB_LINUX_RISCV_MAGIC_SIGNATURE 0x52534356 /* 'RSCV' */
/* From linux/Documentation/riscv/booting.txt */
struct linux_riscv_kernel_header
{
grub_uint32_t code0; /* Executable code */
grub_uint32_t code1; /* Executable code */
grub_uint64_t text_offset; /* Image load offset */
grub_uint64_t res0; /* reserved */
grub_uint64_t res1; /* reserved */
grub_uint64_t res2; /* reserved */
grub_uint64_t res3; /* reserved */
grub_uint64_t res4; /* reserved */
grub_uint32_t magic; /* Magic number, little endian, "RSCV" */
grub_uint32_t hdr_offset; /* Offset of PE/COFF header */
};
#define linux_arch_kernel_header linux_riscv_kernel_header
#endif /* ! GRUB_RISCV32_LINUX_HEADER */

View File

@ -1,43 +0,0 @@
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2018 Free Software Foundation, Inc.
*
* GRUB is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* GRUB is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef GRUB_RISCV64_LINUX_HEADER
#define GRUB_RISCV64_LINUX_HEADER 1
#define GRUB_LINUX_RISCV_MAGIC_SIGNATURE 0x52534356 /* 'RSCV' */
#define GRUB_EFI_PE_MAGIC 0x5A4D
/* From linux/Documentation/riscv/booting.txt */
struct linux_riscv_kernel_header
{
grub_uint32_t code0; /* Executable code */
grub_uint32_t code1; /* Executable code */
grub_uint64_t text_offset; /* Image load offset */
grub_uint64_t res0; /* reserved */
grub_uint64_t res1; /* reserved */
grub_uint64_t res2; /* reserved */
grub_uint64_t res3; /* reserved */
grub_uint64_t res4; /* reserved */
grub_uint32_t magic; /* Magic number, little endian, "RSCV" */
grub_uint32_t hdr_offset; /* Offset of PE/COFF header */
};
#define linux_arch_kernel_header linux_riscv_kernel_header
#endif /* ! GRUB_RISCV64_LINUX_HEADER */