1fba8a867SNick Kossifidis /* SPDX-License-Identifier: GPL-2.0 */ 2fba8a867SNick Kossifidis /* 3fba8a867SNick Kossifidis * Copyright (C) 2019 FORTH-ICS/CARV 4fba8a867SNick Kossifidis * Nick Kossifidis <mick@ics.forth.gr> 5fba8a867SNick Kossifidis */ 6fba8a867SNick Kossifidis 7fba8a867SNick Kossifidis #ifndef _RISCV_KEXEC_H 8fba8a867SNick Kossifidis #define _RISCV_KEXEC_H 9fba8a867SNick Kossifidis 10fba8a867SNick Kossifidis #include <asm/page.h> /* For PAGE_SIZE */ 11fba8a867SNick Kossifidis 12fba8a867SNick Kossifidis /* Maximum physical address we can use pages from */ 13fba8a867SNick Kossifidis #define KEXEC_SOURCE_MEMORY_LIMIT (-1UL) 14fba8a867SNick Kossifidis 15fba8a867SNick Kossifidis /* Maximum address we can reach in physical address mode */ 16fba8a867SNick Kossifidis #define KEXEC_DESTINATION_MEMORY_LIMIT (-1UL) 17fba8a867SNick Kossifidis 18fba8a867SNick Kossifidis /* Maximum address we can use for the control code buffer */ 19fba8a867SNick Kossifidis #define KEXEC_CONTROL_MEMORY_LIMIT (-1UL) 20fba8a867SNick Kossifidis 21fba8a867SNick Kossifidis /* Reserve a page for the control code buffer */ 22fba8a867SNick Kossifidis #define KEXEC_CONTROL_PAGE_SIZE PAGE_SIZE 23fba8a867SNick Kossifidis 24fba8a867SNick Kossifidis #define KEXEC_ARCH KEXEC_ARCH_RISCV 25fba8a867SNick Kossifidis 26e53d2818SNick Kossifidis extern void riscv_crash_save_regs(struct pt_regs *newregs); 27e53d2818SNick Kossifidis 28fba8a867SNick Kossifidis static inline void 29fba8a867SNick Kossifidis crash_setup_regs(struct pt_regs *newregs, 30fba8a867SNick Kossifidis struct pt_regs *oldregs) 31fba8a867SNick Kossifidis { 32e53d2818SNick Kossifidis if (oldregs) 33e53d2818SNick Kossifidis memcpy(newregs, oldregs, sizeof(struct pt_regs)); 34e53d2818SNick Kossifidis else 35e53d2818SNick Kossifidis riscv_crash_save_regs(newregs); 36fba8a867SNick Kossifidis } 37fba8a867SNick Kossifidis 38fba8a867SNick Kossifidis 39fba8a867SNick Kossifidis #define ARCH_HAS_KIMAGE_ARCH 40fba8a867SNick Kossifidis 41fba8a867SNick Kossifidis struct kimage_arch { 42fba8a867SNick Kossifidis unsigned long fdt_addr; 43fba8a867SNick Kossifidis }; 44fba8a867SNick Kossifidis 45bab0d47cSJisheng Zhang extern const unsigned char riscv_kexec_relocate[]; 46bab0d47cSJisheng Zhang extern const unsigned int riscv_kexec_relocate_size; 47fba8a867SNick Kossifidis 48e53d2818SNick Kossifidis typedef void (*riscv_kexec_method)(unsigned long first_ind_entry, 49fba8a867SNick Kossifidis unsigned long jump_addr, 50fba8a867SNick Kossifidis unsigned long fdt_addr, 51fba8a867SNick Kossifidis unsigned long hartid, 52fba8a867SNick Kossifidis unsigned long va_pa_off); 53fba8a867SNick Kossifidis 54e53d2818SNick Kossifidis extern riscv_kexec_method riscv_kexec_norelocate; 55e53d2818SNick Kossifidis 566261586eSLiao Chang #ifdef CONFIG_KEXEC_FILE 576261586eSLiao Chang extern const struct kexec_file_ops elf_kexec_ops; 58*7699f7aaSUwe Kleine-König 59*7699f7aaSUwe Kleine-König struct purgatory_info; 60*7699f7aaSUwe Kleine-König int arch_kexec_apply_relocations_add(struct purgatory_info *pi, 61*7699f7aaSUwe Kleine-König Elf_Shdr *section, 62*7699f7aaSUwe Kleine-König const Elf_Shdr *relsec, 63*7699f7aaSUwe Kleine-König const Elf_Shdr *symtab); 64*7699f7aaSUwe Kleine-König #define arch_kexec_apply_relocations_add arch_kexec_apply_relocations_add 656261586eSLiao Chang #endif 666261586eSLiao Chang 67fba8a867SNick Kossifidis #endif 68