diff options
-rw-r--r-- | arch/powerpc/kernel/crash_dump.c | 11 | ||||
-rw-r--r-- | arch/powerpc/kernel/prom.c | 4 | ||||
-rw-r--r-- | arch/powerpc/kernel/setup_64.c | 4 | ||||
-rw-r--r-- | include/asm-powerpc/kdump.h | 29 | ||||
-rw-r--r-- | include/asm-powerpc/page.h | 8 |
5 files changed, 38 insertions, 18 deletions
diff --git a/arch/powerpc/kernel/crash_dump.c b/arch/powerpc/kernel/crash_dump.c index 764d07329716..371973be8d71 100644 --- a/arch/powerpc/kernel/crash_dump.c +++ b/arch/powerpc/kernel/crash_dump.c | |||
@@ -25,6 +25,11 @@ | |||
25 | #define DBG(fmt...) | 25 | #define DBG(fmt...) |
26 | #endif | 26 | #endif |
27 | 27 | ||
28 | void reserve_kdump_trampoline(void) | ||
29 | { | ||
30 | lmb_reserve(0, KDUMP_RESERVE_LIMIT); | ||
31 | } | ||
32 | |||
28 | static void __init create_trampoline(unsigned long addr) | 33 | static void __init create_trampoline(unsigned long addr) |
29 | { | 34 | { |
30 | /* The maximum range of a single instruction branch, is the current | 35 | /* The maximum range of a single instruction branch, is the current |
@@ -39,11 +44,11 @@ static void __init create_trampoline(unsigned long addr) | |||
39 | create_branch(addr + 4, addr + PHYSICAL_START, 0); | 44 | create_branch(addr + 4, addr + PHYSICAL_START, 0); |
40 | } | 45 | } |
41 | 46 | ||
42 | void __init kdump_setup(void) | 47 | void __init setup_kdump_trampoline(void) |
43 | { | 48 | { |
44 | unsigned long i; | 49 | unsigned long i; |
45 | 50 | ||
46 | DBG(" -> kdump_setup()\n"); | 51 | DBG(" -> setup_kdump_trampoline()\n"); |
47 | 52 | ||
48 | for (i = KDUMP_TRAMPOLINE_START; i < KDUMP_TRAMPOLINE_END; i += 8) { | 53 | for (i = KDUMP_TRAMPOLINE_START; i < KDUMP_TRAMPOLINE_END; i += 8) { |
49 | create_trampoline(i); | 54 | create_trampoline(i); |
@@ -52,7 +57,7 @@ void __init kdump_setup(void) | |||
52 | create_trampoline(__pa(system_reset_fwnmi) - PHYSICAL_START); | 57 | create_trampoline(__pa(system_reset_fwnmi) - PHYSICAL_START); |
53 | create_trampoline(__pa(machine_check_fwnmi) - PHYSICAL_START); | 58 | create_trampoline(__pa(machine_check_fwnmi) - PHYSICAL_START); |
54 | 59 | ||
55 | DBG(" <- kdump_setup()\n"); | 60 | DBG(" <- setup_kdump_trampoline()\n"); |
56 | } | 61 | } |
57 | 62 | ||
58 | #ifdef CONFIG_PROC_VMCORE | 63 | #ifdef CONFIG_PROC_VMCORE |
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index a04f726d3bab..2498afeef291 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c | |||
@@ -1326,9 +1326,7 @@ void __init early_init_devtree(void *params) | |||
1326 | 1326 | ||
1327 | /* Reserve LMB regions used by kernel, initrd, dt, etc... */ | 1327 | /* Reserve LMB regions used by kernel, initrd, dt, etc... */ |
1328 | lmb_reserve(PHYSICAL_START, __pa(klimit) - PHYSICAL_START); | 1328 | lmb_reserve(PHYSICAL_START, __pa(klimit) - PHYSICAL_START); |
1329 | #ifdef CONFIG_CRASH_DUMP | 1329 | reserve_kdump_trampoline(); |
1330 | lmb_reserve(0, KDUMP_RESERVE_LIMIT); | ||
1331 | #endif | ||
1332 | early_reserve_mem(); | 1330 | early_reserve_mem(); |
1333 | 1331 | ||
1334 | lmb_enforce_memory_limit(memory_limit); | 1332 | lmb_enforce_memory_limit(memory_limit); |
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c index 59773d9044ba..78f3a5fd43f6 100644 --- a/arch/powerpc/kernel/setup_64.c +++ b/arch/powerpc/kernel/setup_64.c | |||
@@ -193,9 +193,7 @@ void __init early_setup(unsigned long dt_ptr) | |||
193 | /* Probe the machine type */ | 193 | /* Probe the machine type */ |
194 | probe_machine(); | 194 | probe_machine(); |
195 | 195 | ||
196 | #ifdef CONFIG_CRASH_DUMP | 196 | setup_kdump_trampoline(); |
197 | kdump_setup(); | ||
198 | #endif | ||
199 | 197 | ||
200 | DBG("Found, Initializing memory management...\n"); | 198 | DBG("Found, Initializing memory management...\n"); |
201 | 199 | ||
diff --git a/include/asm-powerpc/kdump.h b/include/asm-powerpc/kdump.h index a87aed00d61f..5a5c3b5ab1e0 100644 --- a/include/asm-powerpc/kdump.h +++ b/include/asm-powerpc/kdump.h | |||
@@ -1,13 +1,38 @@ | |||
1 | #ifndef _PPC64_KDUMP_H | 1 | #ifndef _PPC64_KDUMP_H |
2 | #define _PPC64_KDUMP_H | 2 | #define _PPC64_KDUMP_H |
3 | 3 | ||
4 | /* Kdump kernel runs at 32 MB, change at your peril. */ | ||
5 | #define KDUMP_KERNELBASE 0x2000000 | ||
6 | |||
4 | /* How many bytes to reserve at zero for kdump. The reserve limit should | 7 | /* How many bytes to reserve at zero for kdump. The reserve limit should |
5 | * be greater or equal to the trampoline's end address. */ | 8 | * be greater or equal to the trampoline's end address. |
9 | * Reserve to the end of the FWNMI area, see head_64.S */ | ||
6 | #define KDUMP_RESERVE_LIMIT 0x8000 | 10 | #define KDUMP_RESERVE_LIMIT 0x8000 |
7 | 11 | ||
12 | #ifdef CONFIG_CRASH_DUMP | ||
13 | |||
14 | #define PHYSICAL_START KDUMP_KERNELBASE | ||
8 | #define KDUMP_TRAMPOLINE_START 0x0100 | 15 | #define KDUMP_TRAMPOLINE_START 0x0100 |
9 | #define KDUMP_TRAMPOLINE_END 0x3000 | 16 | #define KDUMP_TRAMPOLINE_END 0x3000 |
10 | 17 | ||
11 | extern void kdump_setup(void); | 18 | #else /* !CONFIG_CRASH_DUMP */ |
19 | |||
20 | #define PHYSICAL_START 0x0 | ||
21 | |||
22 | #endif /* CONFIG_CRASH_DUMP */ | ||
23 | |||
24 | #ifndef __ASSEMBLY__ | ||
25 | #ifdef CONFIG_CRASH_DUMP | ||
26 | |||
27 | extern void reserve_kdump_trampoline(void); | ||
28 | extern void setup_kdump_trampoline(void); | ||
29 | |||
30 | #else /* !CONFIG_CRASH_DUMP */ | ||
31 | |||
32 | static inline void reserve_kdump_trampoline(void) { ; } | ||
33 | static inline void setup_kdump_trampoline(void) { ; } | ||
34 | |||
35 | #endif /* CONFIG_CRASH_DUMP */ | ||
36 | #endif /* __ASSEMBLY__ */ | ||
12 | 37 | ||
13 | #endif /* __PPC64_KDUMP_H */ | 38 | #endif /* __PPC64_KDUMP_H */ |
diff --git a/include/asm-powerpc/page.h b/include/asm-powerpc/page.h index 2fbecebe1c92..ae610b620487 100644 --- a/include/asm-powerpc/page.h +++ b/include/asm-powerpc/page.h | |||
@@ -13,6 +13,7 @@ | |||
13 | #ifdef __KERNEL__ | 13 | #ifdef __KERNEL__ |
14 | #include <linux/config.h> | 14 | #include <linux/config.h> |
15 | #include <asm/asm-compat.h> | 15 | #include <asm/asm-compat.h> |
16 | #include <asm/kdump.h> | ||
16 | 17 | ||
17 | /* | 18 | /* |
18 | * On PPC32 page size is 4K. For PPC64 we support either 4K or 64K software | 19 | * On PPC32 page size is 4K. For PPC64 we support either 4K or 64K software |
@@ -52,13 +53,6 @@ | |||
52 | * If you want to test if something's a kernel address, use is_kernel_addr(). | 53 | * If you want to test if something's a kernel address, use is_kernel_addr(). |
53 | */ | 54 | */ |
54 | 55 | ||
55 | #ifdef CONFIG_CRASH_DUMP | ||
56 | /* Kdump kernel runs at 32 MB, change at your peril. */ | ||
57 | #define PHYSICAL_START 0x2000000 | ||
58 | #else | ||
59 | #define PHYSICAL_START 0x0 | ||
60 | #endif | ||
61 | |||
62 | #define PAGE_OFFSET ASM_CONST(CONFIG_KERNEL_START) | 56 | #define PAGE_OFFSET ASM_CONST(CONFIG_KERNEL_START) |
63 | #define KERNELBASE (PAGE_OFFSET + PHYSICAL_START) | 57 | #define KERNELBASE (PAGE_OFFSET + PHYSICAL_START) |
64 | 58 | ||