xref: /OK3568_Linux_fs/kernel/arch/s390/include/asm/kexec.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright IBM Corp. 2005
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Author(s): Rolf Adelsberger <adelsberger@de.ibm.com>
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  */
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #ifndef _S390_KEXEC_H
10*4882a593Smuzhiyun #define _S390_KEXEC_H
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #include <linux/module.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #include <asm/processor.h>
15*4882a593Smuzhiyun #include <asm/page.h>
16*4882a593Smuzhiyun #include <asm/setup.h>
17*4882a593Smuzhiyun /*
18*4882a593Smuzhiyun  * KEXEC_SOURCE_MEMORY_LIMIT maximum page get_free_page can return.
19*4882a593Smuzhiyun  * I.e. Maximum page that is mapped directly into kernel memory,
20*4882a593Smuzhiyun  * and kmap is not required.
21*4882a593Smuzhiyun  */
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun /* Maximum physical address we can use pages from */
24*4882a593Smuzhiyun #define KEXEC_SOURCE_MEMORY_LIMIT (-1UL)
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun /* Maximum address we can reach in physical address mode */
27*4882a593Smuzhiyun #define KEXEC_DESTINATION_MEMORY_LIMIT (-1UL)
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun /* Maximum address we can use for the control pages */
30*4882a593Smuzhiyun /* Not more than 2GB */
31*4882a593Smuzhiyun #define KEXEC_CONTROL_MEMORY_LIMIT (1UL<<31)
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun /* Allocate control page with GFP_DMA */
34*4882a593Smuzhiyun #define KEXEC_CONTROL_MEMORY_GFP GFP_DMA
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun /* Maximum address we can use for the crash control pages */
37*4882a593Smuzhiyun #define KEXEC_CRASH_CONTROL_MEMORY_LIMIT (-1UL)
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun /* Allocate one page for the pdp and the second for the code */
40*4882a593Smuzhiyun #define KEXEC_CONTROL_PAGE_SIZE 4096
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun /* Alignment of crashkernel memory */
43*4882a593Smuzhiyun #define KEXEC_CRASH_MEM_ALIGN HPAGE_SIZE
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun /* The native architecture */
46*4882a593Smuzhiyun #define KEXEC_ARCH KEXEC_ARCH_S390
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun /* Allow kexec_file to load a segment to 0 */
49*4882a593Smuzhiyun #define KEXEC_BUF_MEM_UNKNOWN -1
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun /* Provide a dummy definition to avoid build failures. */
crash_setup_regs(struct pt_regs * newregs,struct pt_regs * oldregs)52*4882a593Smuzhiyun static inline void crash_setup_regs(struct pt_regs *newregs,
53*4882a593Smuzhiyun 					struct pt_regs *oldregs) { }
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun struct kimage;
56*4882a593Smuzhiyun struct s390_load_data {
57*4882a593Smuzhiyun 	/* Pointer to the kernel buffer. Used to register cmdline etc.. */
58*4882a593Smuzhiyun 	void *kernel_buf;
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun 	/* Load address of the kernel_buf. */
61*4882a593Smuzhiyun 	unsigned long kernel_mem;
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun 	/* Parmarea in the kernel buffer. */
64*4882a593Smuzhiyun 	struct parmarea *parm;
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun 	/* Total size of loaded segments in memory. Used as an offset. */
67*4882a593Smuzhiyun 	size_t memsz;
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun 	struct ipl_report *report;
70*4882a593Smuzhiyun };
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun int s390_verify_sig(const char *kernel, unsigned long kernel_len);
73*4882a593Smuzhiyun void *kexec_file_add_components(struct kimage *image,
74*4882a593Smuzhiyun 				int (*add_kernel)(struct kimage *image,
75*4882a593Smuzhiyun 						  struct s390_load_data *data));
76*4882a593Smuzhiyun int arch_kexec_do_relocs(int r_type, void *loc, unsigned long val,
77*4882a593Smuzhiyun 			 unsigned long addr);
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun #define ARCH_HAS_KIMAGE_ARCH
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun struct kimage_arch {
82*4882a593Smuzhiyun 	void *ipl_buf;
83*4882a593Smuzhiyun };
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun extern const struct kexec_file_ops s390_kexec_image_ops;
86*4882a593Smuzhiyun extern const struct kexec_file_ops s390_kexec_elf_ops;
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun #ifdef CONFIG_KEXEC_FILE
89*4882a593Smuzhiyun struct purgatory_info;
90*4882a593Smuzhiyun int arch_kexec_apply_relocations_add(struct purgatory_info *pi,
91*4882a593Smuzhiyun 				     Elf_Shdr *section,
92*4882a593Smuzhiyun 				     const Elf_Shdr *relsec,
93*4882a593Smuzhiyun 				     const Elf_Shdr *symtab);
94*4882a593Smuzhiyun #define arch_kexec_apply_relocations_add arch_kexec_apply_relocations_add
95*4882a593Smuzhiyun #endif
96*4882a593Smuzhiyun #endif /*_S390_KEXEC_H */
97