 868d172b8a
			
		
	
	
	868d172b8a
	
	
	
		
			
			Provide the option to call a machine-specific function before kexec'ing a new kernel. Signed-off-by: Eric Cooper <ecc@cmu.edu> Signed-off-by: Nicolas Pitre <nico@fluxnic.net>
		
			
				
	
	
		
			60 lines
		
	
	
	
		
			1.6 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
	
		
			1.6 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef _ARM_KEXEC_H
 | |
| #define _ARM_KEXEC_H
 | |
| 
 | |
| #ifdef CONFIG_KEXEC
 | |
| 
 | |
| /* 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)
 | |
| 
 | |
| #define KEXEC_CONTROL_PAGE_SIZE	4096
 | |
| 
 | |
| #define KEXEC_ARCH KEXEC_ARCH_ARM
 | |
| 
 | |
| #define KEXEC_ARM_ATAGS_OFFSET  0x1000
 | |
| #define KEXEC_ARM_ZIMAGE_OFFSET 0x8000
 | |
| 
 | |
| #ifndef __ASSEMBLY__
 | |
| 
 | |
| /**
 | |
|  * crash_setup_regs() - save registers for the panic kernel
 | |
|  * @newregs: registers are saved here
 | |
|  * @oldregs: registers to be saved (may be %NULL)
 | |
|  *
 | |
|  * Function copies machine registers from @oldregs to @newregs. If @oldregs is
 | |
|  * %NULL then current registers are stored there.
 | |
|  */
 | |
| static inline void crash_setup_regs(struct pt_regs *newregs,
 | |
| 				    struct pt_regs *oldregs)
 | |
| {
 | |
| 	if (oldregs) {
 | |
| 		memcpy(newregs, oldregs, sizeof(*newregs));
 | |
| 	} else {
 | |
| 		__asm__ __volatile__ (
 | |
| 			"stmia	%[regs_base], {r0-r12}\n\t"
 | |
| 			"mov	%[_ARM_sp], sp\n\t"
 | |
| 			"str	lr, %[_ARM_lr]\n\t"
 | |
| 			"adr	%[_ARM_pc], 1f\n\t"
 | |
| 			"mrs	%[_ARM_cpsr], cpsr\n\t"
 | |
| 		"1:"
 | |
| 			: [_ARM_pc] "=r" (newregs->ARM_pc),
 | |
| 			  [_ARM_cpsr] "=r" (newregs->ARM_cpsr),
 | |
| 			  [_ARM_sp] "=r" (newregs->ARM_sp),
 | |
| 			  [_ARM_lr] "=o" (newregs->ARM_lr)
 | |
| 			: [regs_base] "r" (&newregs->ARM_r0)
 | |
| 			: "memory"
 | |
| 		);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| /* Function pointer to optional machine-specific reinitialization */
 | |
| extern void (*kexec_reinit)(void);
 | |
| 
 | |
| #endif /* __ASSEMBLY__ */
 | |
| 
 | |
| #endif /* CONFIG_KEXEC */
 | |
| 
 | |
| #endif /* _ARM_KEXEC_H */
 |