Richard Purdie | c587e4a | 2007-02-06 21:29:00 +0100 | [diff] [blame] | 1 | #ifndef _ARM_KEXEC_H |
| 2 | #define _ARM_KEXEC_H |
| 3 | |
| 4 | #ifdef CONFIG_KEXEC |
| 5 | |
| 6 | /* Maximum physical address we can use pages from */ |
| 7 | #define KEXEC_SOURCE_MEMORY_LIMIT (-1UL) |
| 8 | /* Maximum address we can reach in physical address mode */ |
| 9 | #define KEXEC_DESTINATION_MEMORY_LIMIT (-1UL) |
| 10 | /* Maximum address we can use for the control code buffer */ |
Thomas Kunze | 5ce94e9 | 2008-02-24 17:59:34 +0100 | [diff] [blame] | 11 | #define KEXEC_CONTROL_MEMORY_LIMIT (-1UL) |
Richard Purdie | c587e4a | 2007-02-06 21:29:00 +0100 | [diff] [blame] | 12 | |
Huang Ying | 163f687 | 2008-08-15 00:40:22 -0700 | [diff] [blame] | 13 | #define KEXEC_CONTROL_PAGE_SIZE 4096 |
Richard Purdie | c587e4a | 2007-02-06 21:29:00 +0100 | [diff] [blame] | 14 | |
| 15 | #define KEXEC_ARCH KEXEC_ARCH_ARM |
| 16 | |
Richard Purdie | 4cd9d6f | 2008-01-02 00:56:46 +0100 | [diff] [blame] | 17 | #define KEXEC_ARM_ATAGS_OFFSET 0x1000 |
| 18 | #define KEXEC_ARM_ZIMAGE_OFFSET 0x8000 |
| 19 | |
Richard Purdie | c587e4a | 2007-02-06 21:29:00 +0100 | [diff] [blame] | 20 | #ifndef __ASSEMBLY__ |
| 21 | |
Mika Westerberg | 24b776b | 2010-05-10 09:22:14 +0100 | [diff] [blame] | 22 | /** |
| 23 | * crash_setup_regs() - save registers for the panic kernel |
| 24 | * @newregs: registers are saved here |
| 25 | * @oldregs: registers to be saved (may be %NULL) |
| 26 | * |
| 27 | * Function copies machine registers from @oldregs to @newregs. If @oldregs is |
| 28 | * %NULL then current registers are stored there. |
| 29 | */ |
Richard Purdie | c587e4a | 2007-02-06 21:29:00 +0100 | [diff] [blame] | 30 | static inline void crash_setup_regs(struct pt_regs *newregs, |
Mika Westerberg | 24b776b | 2010-05-10 09:22:14 +0100 | [diff] [blame] | 31 | struct pt_regs *oldregs) |
| 32 | { |
| 33 | if (oldregs) { |
| 34 | memcpy(newregs, oldregs, sizeof(*newregs)); |
| 35 | } else { |
Dave Martin | cd849ae | 2010-12-01 18:05:14 +0100 | [diff] [blame] | 36 | __asm__ __volatile__ ( |
| 37 | "stmia %[regs_base], {r0-r12}\n\t" |
| 38 | "mov %[_ARM_sp], sp\n\t" |
| 39 | "str lr, %[_ARM_lr]\n\t" |
| 40 | "adr %[_ARM_pc], 1f\n\t" |
| 41 | "mrs %[_ARM_cpsr], cpsr\n\t" |
| 42 | "1:" |
| 43 | : [_ARM_pc] "=r" (newregs->ARM_pc), |
| 44 | [_ARM_cpsr] "=r" (newregs->ARM_cpsr), |
| 45 | [_ARM_sp] "=r" (newregs->ARM_sp), |
| 46 | [_ARM_lr] "=o" (newregs->ARM_lr) |
| 47 | : [regs_base] "r" (&newregs->ARM_r0) |
| 48 | : "memory" |
| 49 | ); |
Mika Westerberg | 24b776b | 2010-05-10 09:22:14 +0100 | [diff] [blame] | 50 | } |
| 51 | } |
Richard Purdie | c587e4a | 2007-02-06 21:29:00 +0100 | [diff] [blame] | 52 | |
Eric Cooper | 868d172b | 2011-02-02 17:16:09 -0500 | [diff] [blame] | 53 | /* Function pointer to optional machine-specific reinitialization */ |
| 54 | extern void (*kexec_reinit)(void); |
| 55 | |
Richard Purdie | c587e4a | 2007-02-06 21:29:00 +0100 | [diff] [blame] | 56 | #endif /* __ASSEMBLY__ */ |
| 57 | |
| 58 | #endif /* CONFIG_KEXEC */ |
| 59 | |
| 60 | #endif /* _ARM_KEXEC_H */ |