aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86_64/boot
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2005-06-25 17:57:52 -0400
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-06-25 19:24:48 -0400
commitd0537508a9921efced238b20967e50e519ac34af (patch)
tree80f2743e9299da07c07625af45807e16a7d7f85a /arch/x86_64/boot
parent8a9190853c34289d9181acd9c620c76143bf88ca (diff)
[PATCH] kexec: x86_64: add CONFIG_PHYSICAL_START
For one kernel to report a crash another kernel has created we need to have 2 kernels loaded simultaneously in memory. To accomplish this the two kernels need to built to run at different physical addresses. This patch adds the CONFIG_PHYSICAL_START option to the x86_64 kernel so we can do just that. You need to know what you are doing and the ramifications are before changing this value, and most users won't care so I have made it depend on CONFIG_EMBEDDED bzImage kernels will work and run at a different address when compiled with this option but they will still load at 1MB. If you need a kernel loaded at a different address as well you need to boot a vmlinux. Signed-off-by: Eric Biederman <ebiederm@xmission.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/x86_64/boot')
-rw-r--r--arch/x86_64/boot/compressed/head.S7
-rw-r--r--arch/x86_64/boot/compressed/misc.c7
2 files changed, 8 insertions, 6 deletions
diff --git a/arch/x86_64/boot/compressed/head.S b/arch/x86_64/boot/compressed/head.S
index 27264dbd575c..b0df2aeff5dc 100644
--- a/arch/x86_64/boot/compressed/head.S
+++ b/arch/x86_64/boot/compressed/head.S
@@ -28,6 +28,7 @@
28 28
29#include <linux/linkage.h> 29#include <linux/linkage.h>
30#include <asm/segment.h> 30#include <asm/segment.h>
31#include <asm/page.h>
31 32
32 .code32 33 .code32
33 .globl startup_32 34 .globl startup_32
@@ -77,7 +78,7 @@ startup_32:
77 jnz 3f 78 jnz 3f
78 addl $8,%esp 79 addl $8,%esp
79 xorl %ebx,%ebx 80 xorl %ebx,%ebx
80 ljmp $(__KERNEL_CS), $0x100000 81 ljmp $(__KERNEL_CS), $__PHYSICAL_START
81 82
82/* 83/*
83 * We come here, if we were loaded high. 84 * We come here, if we were loaded high.
@@ -103,7 +104,7 @@ startup_32:
103 popl %ecx # lcount 104 popl %ecx # lcount
104 popl %edx # high_buffer_start 105 popl %edx # high_buffer_start
105 popl %eax # hcount 106 popl %eax # hcount
106 movl $0x100000,%edi 107 movl $__PHYSICAL_START,%edi
107 cli # make sure we don't get interrupted 108 cli # make sure we don't get interrupted
108 ljmp $(__KERNEL_CS), $0x1000 # and jump to the move routine 109 ljmp $(__KERNEL_CS), $0x1000 # and jump to the move routine
109 110
@@ -128,7 +129,7 @@ move_routine_start:
128 movsl 129 movsl
129 movl %ebx,%esi # Restore setup pointer 130 movl %ebx,%esi # Restore setup pointer
130 xorl %ebx,%ebx 131 xorl %ebx,%ebx
131 ljmp $(__KERNEL_CS), $0x100000 132 ljmp $(__KERNEL_CS), $__PHYSICAL_START
132move_routine_end: 133move_routine_end:
133 134
134 135
diff --git a/arch/x86_64/boot/compressed/misc.c b/arch/x86_64/boot/compressed/misc.c
index c8b9216f9e63..c43cedb5c1d7 100644
--- a/arch/x86_64/boot/compressed/misc.c
+++ b/arch/x86_64/boot/compressed/misc.c
@@ -11,6 +11,7 @@
11 11
12#include "miscsetup.h" 12#include "miscsetup.h"
13#include <asm/io.h> 13#include <asm/io.h>
14#include <asm/page.h>
14 15
15/* 16/*
16 * gzip declarations 17 * gzip declarations
@@ -284,7 +285,7 @@ void setup_normal_output_buffer(void)
284#else 285#else
285 if ((ALT_MEM_K > EXT_MEM_K ? ALT_MEM_K : EXT_MEM_K) < 1024) error("Less than 2MB of memory"); 286 if ((ALT_MEM_K > EXT_MEM_K ? ALT_MEM_K : EXT_MEM_K) < 1024) error("Less than 2MB of memory");
286#endif 287#endif
287 output_data = (char *)0x100000; /* Points to 1M */ 288 output_data = (char *)__PHYSICAL_START; /* Normally Points to 1M */
288 free_mem_end_ptr = (long)real_mode; 289 free_mem_end_ptr = (long)real_mode;
289} 290}
290 291
@@ -307,8 +308,8 @@ void setup_output_buffer_if_we_run_high(struct moveparams *mv)
307 low_buffer_size = low_buffer_end - LOW_BUFFER_START; 308 low_buffer_size = low_buffer_end - LOW_BUFFER_START;
308 high_loaded = 1; 309 high_loaded = 1;
309 free_mem_end_ptr = (long)high_buffer_start; 310 free_mem_end_ptr = (long)high_buffer_start;
310 if ( (0x100000 + low_buffer_size) > ((ulg)high_buffer_start)) { 311 if ( (__PHYSICAL_START + low_buffer_size) > ((ulg)high_buffer_start)) {
311 high_buffer_start = (uch *)(0x100000 + low_buffer_size); 312 high_buffer_start = (uch *)(__PHYSICAL_START + low_buffer_size);
312 mv->hcount = 0; /* say: we need not to move high_buffer */ 313 mv->hcount = 0; /* say: we need not to move high_buffer */
313 } 314 }
314 else mv->hcount = -1; 315 else mv->hcount = -1;