diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2005-06-25 17:57:49 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-25 19:24:48 -0400 |
commit | 3d345e3fc9e9177deb7c82e5c79e32d77eb63cce (patch) | |
tree | 4c9ecef7b3baf0f9649933510d2645a50665c2d6 /arch/i386/boot/compressed | |
parent | 5ded01e83ec3b60191b03b9f88f53acd4e6112f5 (diff) |
[PATCH] kexec: x86: add CONFIG_PYSICAL_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 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/i386/boot/compressed')
-rw-r--r-- | arch/i386/boot/compressed/head.S | 7 | ||||
-rw-r--r-- | arch/i386/boot/compressed/misc.c | 7 |
2 files changed, 8 insertions, 6 deletions
diff --git a/arch/i386/boot/compressed/head.S b/arch/i386/boot/compressed/head.S index c5e80b69e7d4..b5893e4ecd37 100644 --- a/arch/i386/boot/compressed/head.S +++ b/arch/i386/boot/compressed/head.S | |||
@@ -25,6 +25,7 @@ | |||
25 | 25 | ||
26 | #include <linux/linkage.h> | 26 | #include <linux/linkage.h> |
27 | #include <asm/segment.h> | 27 | #include <asm/segment.h> |
28 | #include <asm/page.h> | ||
28 | 29 | ||
29 | .globl startup_32 | 30 | .globl startup_32 |
30 | 31 | ||
@@ -74,7 +75,7 @@ startup_32: | |||
74 | popl %esi # discard address | 75 | popl %esi # discard address |
75 | popl %esi # real mode pointer | 76 | popl %esi # real mode pointer |
76 | xorl %ebx,%ebx | 77 | xorl %ebx,%ebx |
77 | ljmp $(__BOOT_CS), $0x100000 | 78 | ljmp $(__BOOT_CS), $__PHYSICAL_START |
78 | 79 | ||
79 | /* | 80 | /* |
80 | * We come here, if we were loaded high. | 81 | * We come here, if we were loaded high. |
@@ -99,7 +100,7 @@ startup_32: | |||
99 | popl %ecx # lcount | 100 | popl %ecx # lcount |
100 | popl %edx # high_buffer_start | 101 | popl %edx # high_buffer_start |
101 | popl %eax # hcount | 102 | popl %eax # hcount |
102 | movl $0x100000,%edi | 103 | movl $__PHYSICAL_START,%edi |
103 | cli # make sure we don't get interrupted | 104 | cli # make sure we don't get interrupted |
104 | ljmp $(__BOOT_CS), $0x1000 # and jump to the move routine | 105 | ljmp $(__BOOT_CS), $0x1000 # and jump to the move routine |
105 | 106 | ||
@@ -124,5 +125,5 @@ move_routine_start: | |||
124 | movsl | 125 | movsl |
125 | movl %ebx,%esi # Restore setup pointer | 126 | movl %ebx,%esi # Restore setup pointer |
126 | xorl %ebx,%ebx | 127 | xorl %ebx,%ebx |
127 | ljmp $(__BOOT_CS), $0x100000 | 128 | ljmp $(__BOOT_CS), $__PHYSICAL_START |
128 | move_routine_end: | 129 | move_routine_end: |
diff --git a/arch/i386/boot/compressed/misc.c b/arch/i386/boot/compressed/misc.c index cedc55cc47de..e1330766965c 100644 --- a/arch/i386/boot/compressed/misc.c +++ b/arch/i386/boot/compressed/misc.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/vmalloc.h> | 13 | #include <linux/vmalloc.h> |
14 | #include <linux/tty.h> | 14 | #include <linux/tty.h> |
15 | #include <asm/io.h> | 15 | #include <asm/io.h> |
16 | #include <asm/page.h> | ||
16 | 17 | ||
17 | /* | 18 | /* |
18 | * gzip declarations | 19 | * gzip declarations |
@@ -308,7 +309,7 @@ static void setup_normal_output_buffer(void) | |||
308 | #else | 309 | #else |
309 | if ((RM_ALT_MEM_K > RM_EXT_MEM_K ? RM_ALT_MEM_K : RM_EXT_MEM_K) < 1024) error("Less than 2MB of memory"); | 310 | if ((RM_ALT_MEM_K > RM_EXT_MEM_K ? RM_ALT_MEM_K : RM_EXT_MEM_K) < 1024) error("Less than 2MB of memory"); |
310 | #endif | 311 | #endif |
311 | output_data = (char *)0x100000; /* Points to 1M */ | 312 | output_data = (char *)__PHYSICAL_START; /* Normally Points to 1M */ |
312 | free_mem_end_ptr = (long)real_mode; | 313 | free_mem_end_ptr = (long)real_mode; |
313 | } | 314 | } |
314 | 315 | ||
@@ -333,8 +334,8 @@ static void setup_output_buffer_if_we_run_high(struct moveparams *mv) | |||
333 | low_buffer_size = low_buffer_end - LOW_BUFFER_START; | 334 | low_buffer_size = low_buffer_end - LOW_BUFFER_START; |
334 | high_loaded = 1; | 335 | high_loaded = 1; |
335 | free_mem_end_ptr = (long)high_buffer_start; | 336 | free_mem_end_ptr = (long)high_buffer_start; |
336 | if ( (0x100000 + low_buffer_size) > ((ulg)high_buffer_start)) { | 337 | if ( (__PHYSICAL_START + low_buffer_size) > ((ulg)high_buffer_start)) { |
337 | high_buffer_start = (uch *)(0x100000 + low_buffer_size); | 338 | high_buffer_start = (uch *)(__PHYSICAL_START + low_buffer_size); |
338 | mv->hcount = 0; /* say: we need not to move high_buffer */ | 339 | mv->hcount = 0; /* say: we need not to move high_buffer */ |
339 | } | 340 | } |
340 | else mv->hcount = -1; | 341 | else mv->hcount = -1; |