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 | |
Russell King | 0719392 | 2016-08-02 14:06:10 -0700 | [diff] [blame] | 56 | static inline unsigned long phys_to_boot_phys(phys_addr_t phys) |
| 57 | { |
| 58 | return phys_to_idmap(phys); |
| 59 | } |
| 60 | #define phys_to_boot_phys phys_to_boot_phys |
| 61 | |
| 62 | static inline phys_addr_t boot_phys_to_phys(unsigned long entry) |
| 63 | { |
| 64 | return idmap_to_phys(entry); |
| 65 | } |
| 66 | #define boot_phys_to_phys boot_phys_to_phys |
| 67 | |
| 68 | static inline unsigned long page_to_boot_pfn(struct page *page) |
| 69 | { |
| 70 | return page_to_pfn(page) + (arch_phys_to_idmap_offset >> PAGE_SHIFT); |
| 71 | } |
| 72 | #define page_to_boot_pfn page_to_boot_pfn |
| 73 | |
| 74 | static inline struct page *boot_pfn_to_page(unsigned long boot_pfn) |
| 75 | { |
| 76 | return pfn_to_page(boot_pfn - (arch_phys_to_idmap_offset >> PAGE_SHIFT)); |
| 77 | } |
| 78 | #define boot_pfn_to_page boot_pfn_to_page |
| 79 | |
Richard Purdie | c587e4a | 2007-02-06 21:29:00 +0100 | [diff] [blame] | 80 | #endif /* __ASSEMBLY__ */ |
| 81 | |
| 82 | #endif /* CONFIG_KEXEC */ |
| 83 | |
| 84 | #endif /* _ARM_KEXEC_H */ |