RISC-V: Add Linux load logic
We currently only support to run grub on RISC-V as UEFI payload. Ideally, we also only want to support running Linux underneath as UEFI payload. Prepare that with some Linux boot stub code. Once the arm64 target is generalized, we can hook into that one and gain boot functionality. Signed-off-by: Alexander Graf <agraf@suse.de> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
parent
da45838120
commit
b3213ec755
3 changed files with 143 additions and 0 deletions
59
grub-core/loader/riscv/linux.c
Normal file
59
grub-core/loader/riscv/linux.c
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
/*
|
||||||
|
* 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/command.h>
|
||||||
|
#include <grub/dl.h>
|
||||||
|
#include <grub/lib/cmdline.h>
|
||||||
|
|
||||||
|
GRUB_MOD_LICENSE ("GPLv3+");
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
||||||
|
int argc __attribute__ ((unused)),
|
||||||
|
char *argv[] __attribute__ ((unused)))
|
||||||
|
{
|
||||||
|
grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, N_("Linux not supported yet"));
|
||||||
|
|
||||||
|
return grub_errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
|
||||||
|
int argc __attribute__ ((unused)),
|
||||||
|
char *argv[] __attribute__ ((unused)))
|
||||||
|
{
|
||||||
|
grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, N_("Linux not supported yet"));
|
||||||
|
|
||||||
|
return grub_errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_command_t cmd_linux, cmd_initrd;
|
||||||
|
|
||||||
|
GRUB_MOD_INIT (linux)
|
||||||
|
{
|
||||||
|
cmd_linux = grub_register_command ("linux", grub_cmd_linux, 0,
|
||||||
|
N_("Load Linux."));
|
||||||
|
cmd_initrd = grub_register_command ("initrd", grub_cmd_initrd, 0,
|
||||||
|
N_("Load initrd."));
|
||||||
|
}
|
||||||
|
|
||||||
|
GRUB_MOD_FINI (linux)
|
||||||
|
{
|
||||||
|
grub_unregister_command (cmd_linux);
|
||||||
|
grub_unregister_command (cmd_initrd);
|
||||||
|
}
|
41
include/grub/riscv32/linux.h
Normal file
41
include/grub/riscv32/linux.h
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
/*
|
||||||
|
* 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 */
|
43
include/grub/riscv64/linux.h
Normal file
43
include/grub/riscv64/linux.h
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
* 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 */
|
Loading…
Reference in a new issue