diff options
Diffstat (limited to 'include/asm-powerpc/kexec.h')
| -rw-r--r-- | include/asm-powerpc/kexec.h | 91 |
1 files changed, 84 insertions, 7 deletions
diff --git a/include/asm-powerpc/kexec.h b/include/asm-powerpc/kexec.h index c72ffc709ea8..640a6459f2f4 100644 --- a/include/asm-powerpc/kexec.h +++ b/include/asm-powerpc/kexec.h | |||
| @@ -1,5 +1,6 @@ | |||
| 1 | #ifndef _ASM_POWERPC_KEXEC_H | 1 | #ifndef _ASM_POWERPC_KEXEC_H |
| 2 | #define _ASM_POWERPC_KEXEC_H | 2 | #define _ASM_POWERPC_KEXEC_H |
| 3 | #ifdef __KERNEL__ | ||
| 3 | 4 | ||
| 4 | /* | 5 | /* |
| 5 | * Maximum page that is mapped directly into kernel memory. | 6 | * Maximum page that is mapped directly into kernel memory. |
| @@ -30,21 +31,97 @@ | |||
| 30 | #define KEXEC_ARCH KEXEC_ARCH_PPC | 31 | #define KEXEC_ARCH KEXEC_ARCH_PPC |
| 31 | #endif | 32 | #endif |
| 32 | 33 | ||
| 33 | #ifndef __ASSEMBLY__ | 34 | #ifdef CONFIG_KEXEC |
| 34 | 35 | ||
| 35 | #define MAX_NOTE_BYTES 1024 | 36 | #ifdef __powerpc64__ |
| 36 | typedef u32 note_buf_t[MAX_NOTE_BYTES / sizeof(u32)]; | 37 | /* |
| 38 | * This function is responsible for capturing register states if coming | ||
| 39 | * via panic or invoking dump using sysrq-trigger. | ||
| 40 | */ | ||
| 41 | static inline void crash_setup_regs(struct pt_regs *newregs, | ||
| 42 | struct pt_regs *oldregs) | ||
| 43 | { | ||
| 44 | if (oldregs) | ||
| 45 | memcpy(newregs, oldregs, sizeof(*newregs)); | ||
| 46 | else { | ||
| 47 | /* FIXME Merge this with xmon_save_regs ?? */ | ||
| 48 | unsigned long tmp1, tmp2; | ||
| 49 | __asm__ __volatile__ ( | ||
| 50 | "std 0,0(%2)\n" | ||
| 51 | "std 1,8(%2)\n" | ||
| 52 | "std 2,16(%2)\n" | ||
| 53 | "std 3,24(%2)\n" | ||
| 54 | "std 4,32(%2)\n" | ||
| 55 | "std 5,40(%2)\n" | ||
| 56 | "std 6,48(%2)\n" | ||
| 57 | "std 7,56(%2)\n" | ||
| 58 | "std 8,64(%2)\n" | ||
| 59 | "std 9,72(%2)\n" | ||
| 60 | "std 10,80(%2)\n" | ||
| 61 | "std 11,88(%2)\n" | ||
| 62 | "std 12,96(%2)\n" | ||
| 63 | "std 13,104(%2)\n" | ||
| 64 | "std 14,112(%2)\n" | ||
| 65 | "std 15,120(%2)\n" | ||
| 66 | "std 16,128(%2)\n" | ||
| 67 | "std 17,136(%2)\n" | ||
| 68 | "std 18,144(%2)\n" | ||
| 69 | "std 19,152(%2)\n" | ||
| 70 | "std 20,160(%2)\n" | ||
| 71 | "std 21,168(%2)\n" | ||
| 72 | "std 22,176(%2)\n" | ||
| 73 | "std 23,184(%2)\n" | ||
| 74 | "std 24,192(%2)\n" | ||
| 75 | "std 25,200(%2)\n" | ||
| 76 | "std 26,208(%2)\n" | ||
| 77 | "std 27,216(%2)\n" | ||
| 78 | "std 28,224(%2)\n" | ||
| 79 | "std 29,232(%2)\n" | ||
| 80 | "std 30,240(%2)\n" | ||
| 81 | "std 31,248(%2)\n" | ||
| 82 | "mfmsr %0\n" | ||
| 83 | "std %0, 264(%2)\n" | ||
| 84 | "mfctr %0\n" | ||
| 85 | "std %0, 280(%2)\n" | ||
| 86 | "mflr %0\n" | ||
| 87 | "std %0, 288(%2)\n" | ||
| 88 | "bl 1f\n" | ||
| 89 | "1: mflr %1\n" | ||
| 90 | "std %1, 256(%2)\n" | ||
| 91 | "mtlr %0\n" | ||
| 92 | "mfxer %0\n" | ||
| 93 | "std %0, 296(%2)\n" | ||
| 94 | : "=&r" (tmp1), "=&r" (tmp2) | ||
| 95 | : "b" (newregs)); | ||
| 96 | } | ||
| 97 | } | ||
| 98 | #else | ||
| 99 | /* | ||
| 100 | * Provide a dummy definition to avoid build failures. Will remain | ||
| 101 | * empty till crash dump support is enabled. | ||
| 102 | */ | ||
| 103 | static inline void crash_setup_regs(struct pt_regs *newregs, | ||
| 104 | struct pt_regs *oldregs) { } | ||
| 105 | #endif /* !__powerpc64 __ */ | ||
| 37 | 106 | ||
| 38 | extern note_buf_t crash_notes[]; | 107 | #ifndef __ASSEMBLY__ |
| 108 | #define MAX_NOTE_BYTES 1024 | ||
| 39 | 109 | ||
| 40 | #ifdef __powerpc64__ | 110 | #ifdef __powerpc64__ |
| 41 | extern void kexec_smp_wait(void); /* get and clear naca physid, wait for | 111 | extern void kexec_smp_wait(void); /* get and clear naca physid, wait for |
| 42 | master to copy new code to 0 */ | 112 | master to copy new code to 0 */ |
| 43 | extern void __init kexec_setup(void); | 113 | extern void __init kexec_setup(void); |
| 44 | #else | 114 | extern int crashing_cpu; |
| 115 | extern void crash_send_ipi(void (*crash_ipi_callback)(struct pt_regs *)); | ||
| 116 | #endif /* __powerpc64 __ */ | ||
| 117 | |||
| 45 | struct kimage; | 118 | struct kimage; |
| 46 | extern void machine_kexec_simple(struct kimage *image); | 119 | struct pt_regs; |
| 47 | #endif | 120 | extern void default_machine_kexec(struct kimage *image); |
| 121 | extern int default_machine_kexec_prepare(struct kimage *image); | ||
| 122 | extern void default_machine_crash_shutdown(struct pt_regs *regs); | ||
| 48 | 123 | ||
| 49 | #endif /* ! __ASSEMBLY__ */ | 124 | #endif /* ! __ASSEMBLY__ */ |
| 125 | #endif /* CONFIG_KEXEC */ | ||
| 126 | #endif /* __KERNEL__ */ | ||
| 50 | #endif /* _ASM_POWERPC_KEXEC_H */ | 127 | #endif /* _ASM_POWERPC_KEXEC_H */ |
