| 
									
										
										
										
											2007-02-06 21:29:00 +01:00
										 |  |  | #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 */ | 
					
						
							| 
									
										
										
										
											2008-02-24 17:59:34 +01:00
										 |  |  | #define KEXEC_CONTROL_MEMORY_LIMIT (-1UL)
 | 
					
						
							| 
									
										
										
										
											2007-02-06 21:29:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-15 00:40:22 -07:00
										 |  |  | #define KEXEC_CONTROL_PAGE_SIZE	4096
 | 
					
						
							| 
									
										
										
										
											2007-02-06 21:29:00 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define KEXEC_ARCH KEXEC_ARCH_ARM
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-02 00:56:46 +01:00
										 |  |  | #define KEXEC_ARM_ATAGS_OFFSET  0x1000
 | 
					
						
							|  |  |  | #define KEXEC_ARM_ZIMAGE_OFFSET 0x8000
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-02-06 21:29:00 +01:00
										 |  |  | #ifndef __ASSEMBLY__
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-10 09:22:14 +01:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * 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. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2007-02-06 21:29:00 +01:00
										 |  |  | static inline void crash_setup_regs(struct pt_regs *newregs, | 
					
						
							| 
									
										
										
										
											2010-05-10 09:22:14 +01:00
										 |  |  | 				    struct pt_regs *oldregs) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (oldregs) { | 
					
						
							|  |  |  | 		memcpy(newregs, oldregs, sizeof(*newregs)); | 
					
						
							|  |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2010-12-01 18:05:14 +01:00
										 |  |  | 		__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" | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2010-05-10 09:22:14 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2007-02-06 21:29:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-02 17:16:09 -05:00
										 |  |  | /* Function pointer to optional machine-specific reinitialization */ | 
					
						
							|  |  |  | extern void (*kexec_reinit)(void); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-02-06 21:29:00 +01:00
										 |  |  | #endif /* __ASSEMBLY__ */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* CONFIG_KEXEC */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* _ARM_KEXEC_H */
 |