xref: /OK3568_Linux_fs/kernel/arch/sh/include/asm/kexec.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef __ASM_SH_KEXEC_H
3*4882a593Smuzhiyun #define __ASM_SH_KEXEC_H
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #include <asm/ptrace.h>
6*4882a593Smuzhiyun #include <asm/string.h>
7*4882a593Smuzhiyun #include <linux/kernel.h>
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun /*
10*4882a593Smuzhiyun  * KEXEC_SOURCE_MEMORY_LIMIT maximum page get_free_page can return.
11*4882a593Smuzhiyun  * I.e. Maximum page that is mapped directly into kernel memory,
12*4882a593Smuzhiyun  * and kmap is not required.
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  * Someone correct me if FIXADDR_START - PAGEOFFSET is not the correct
15*4882a593Smuzhiyun  * calculation for the amount of memory directly mappable into the
16*4882a593Smuzhiyun  * kernel memory space.
17*4882a593Smuzhiyun  */
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun /* Maximum physical address we can use pages from */
20*4882a593Smuzhiyun #define KEXEC_SOURCE_MEMORY_LIMIT (-1UL)
21*4882a593Smuzhiyun /* Maximum address we can reach in physical address mode */
22*4882a593Smuzhiyun #define KEXEC_DESTINATION_MEMORY_LIMIT (-1UL)
23*4882a593Smuzhiyun /* Maximum address we can use for the control code buffer */
24*4882a593Smuzhiyun #define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun #define KEXEC_CONTROL_PAGE_SIZE	4096
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun /* The native architecture */
29*4882a593Smuzhiyun #define KEXEC_ARCH KEXEC_ARCH_SH
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun #ifdef CONFIG_KEXEC
32*4882a593Smuzhiyun /* arch/sh/kernel/machine_kexec.c */
33*4882a593Smuzhiyun void reserve_crashkernel(void);
34*4882a593Smuzhiyun 
crash_setup_regs(struct pt_regs * newregs,struct pt_regs * oldregs)35*4882a593Smuzhiyun static inline void crash_setup_regs(struct pt_regs *newregs,
36*4882a593Smuzhiyun 				    struct pt_regs *oldregs)
37*4882a593Smuzhiyun {
38*4882a593Smuzhiyun 	if (oldregs)
39*4882a593Smuzhiyun 		memcpy(newregs, oldregs, sizeof(*newregs));
40*4882a593Smuzhiyun 	else {
41*4882a593Smuzhiyun 		__asm__ __volatile__ ("mov r0, %0" : "=r" (newregs->regs[0]));
42*4882a593Smuzhiyun 		__asm__ __volatile__ ("mov r1, %0" : "=r" (newregs->regs[1]));
43*4882a593Smuzhiyun 		__asm__ __volatile__ ("mov r2, %0" : "=r" (newregs->regs[2]));
44*4882a593Smuzhiyun 		__asm__ __volatile__ ("mov r3, %0" : "=r" (newregs->regs[3]));
45*4882a593Smuzhiyun 		__asm__ __volatile__ ("mov r4, %0" : "=r" (newregs->regs[4]));
46*4882a593Smuzhiyun 		__asm__ __volatile__ ("mov r5, %0" : "=r" (newregs->regs[5]));
47*4882a593Smuzhiyun 		__asm__ __volatile__ ("mov r6, %0" : "=r" (newregs->regs[6]));
48*4882a593Smuzhiyun 		__asm__ __volatile__ ("mov r7, %0" : "=r" (newregs->regs[7]));
49*4882a593Smuzhiyun 		__asm__ __volatile__ ("mov r8, %0" : "=r" (newregs->regs[8]));
50*4882a593Smuzhiyun 		__asm__ __volatile__ ("mov r9, %0" : "=r" (newregs->regs[9]));
51*4882a593Smuzhiyun 		__asm__ __volatile__ ("mov r10, %0" : "=r" (newregs->regs[10]));
52*4882a593Smuzhiyun 		__asm__ __volatile__ ("mov r11, %0" : "=r" (newregs->regs[11]));
53*4882a593Smuzhiyun 		__asm__ __volatile__ ("mov r12, %0" : "=r" (newregs->regs[12]));
54*4882a593Smuzhiyun 		__asm__ __volatile__ ("mov r13, %0" : "=r" (newregs->regs[13]));
55*4882a593Smuzhiyun 		__asm__ __volatile__ ("mov r14, %0" : "=r" (newregs->regs[14]));
56*4882a593Smuzhiyun 		__asm__ __volatile__ ("mov r15, %0" : "=r" (newregs->regs[15]));
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun 		__asm__ __volatile__ ("sts pr, %0" : "=r" (newregs->pr));
59*4882a593Smuzhiyun 		__asm__ __volatile__ ("sts macl, %0" : "=r" (newregs->macl));
60*4882a593Smuzhiyun 		__asm__ __volatile__ ("sts mach, %0" : "=r" (newregs->mach));
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun 		__asm__ __volatile__ ("stc gbr, %0" : "=r" (newregs->gbr));
63*4882a593Smuzhiyun 		__asm__ __volatile__ ("stc sr, %0" : "=r" (newregs->sr));
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun 		newregs->pc = _THIS_IP_;
66*4882a593Smuzhiyun 	}
67*4882a593Smuzhiyun }
68*4882a593Smuzhiyun #else
reserve_crashkernel(void)69*4882a593Smuzhiyun static inline void reserve_crashkernel(void) { }
70*4882a593Smuzhiyun #endif /* CONFIG_KEXEC */
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun #endif /* __ASM_SH_KEXEC_H */
73