RISC-V: Add kexec support

This patch adds support for kexec on RISC-V. On SMP systems it depends
on HOTPLUG_CPU in order to be able to bring up all harts after kexec.
It also needs a recent OpenSBI version that supports the HSM extension.
I tested it on riscv64 QEMU on both an smp and a non-smp system.

Signed-off-by: Nick Kossifidis <mick@ics.forth.gr>
Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>
This commit is contained in:
Nick Kossifidis
2021-04-19 03:55:36 +03:00
committed by Palmer Dabbelt
parent d83e682e30
commit fba8a8674f
5 changed files with 412 additions and 0 deletions

View File

@@ -0,0 +1,49 @@
/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (C) 2019 FORTH-ICS/CARV
* Nick Kossifidis <mick@ics.forth.gr>
*/
#ifndef _RISCV_KEXEC_H
#define _RISCV_KEXEC_H
#include <asm/page.h> /* For PAGE_SIZE */
/* Maximum physical address we can use pages from */
#define KEXEC_SOURCE_MEMORY_LIMIT (-1UL)
/* Maximum address we can reach in physical address mode */
#define KEXEC_DESTINATION_MEMORY_LIMIT (-1UL)
/* Maximum address we can use for the control code buffer */
#define KEXEC_CONTROL_MEMORY_LIMIT (-1UL)
/* Reserve a page for the control code buffer */
#define KEXEC_CONTROL_PAGE_SIZE PAGE_SIZE
#define KEXEC_ARCH KEXEC_ARCH_RISCV
static inline void
crash_setup_regs(struct pt_regs *newregs,
struct pt_regs *oldregs)
{
/* Dummy implementation for now */
}
#define ARCH_HAS_KIMAGE_ARCH
struct kimage_arch {
unsigned long fdt_addr;
};
const extern unsigned char riscv_kexec_relocate[];
const extern unsigned int riscv_kexec_relocate_size;
typedef void (*riscv_kexec_do_relocate)(unsigned long first_ind_entry,
unsigned long jump_addr,
unsigned long fdt_addr,
unsigned long hartid,
unsigned long va_pa_off);
#endif