diff options
author | Kristian Høgsberg <krh@redhat.com> | 2008-05-29 18:31:14 -0400 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2008-05-30 20:00:34 -0400 |
commit | 23968f71b26ece45ed52895d41b0208b90a516e7 (patch) | |
tree | 542d30c736329e335fab8e22b0c140685a3e9e91 | |
parent | c7d624d1ee7b77622305bd638755394e4d3f2d2f (diff) |
x86: Use structs instead of hardcoded offsets in x86 boot decompressor.
Replace hardcoded offsets embedded in macros in
arch/x86/boot/compressed with proper structure references.
Signed-off-by: Kristian Høgsberg <krh@redhat.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
-rw-r--r-- | arch/x86/boot/compressed/misc.c | 26 |
1 files changed, 11 insertions, 15 deletions
diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c index 90456cee47c3..74ed3c075ee6 100644 --- a/arch/x86/boot/compressed/misc.c +++ b/arch/x86/boot/compressed/misc.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <asm/io.h> | 30 | #include <asm/io.h> |
31 | #include <asm/page.h> | 31 | #include <asm/page.h> |
32 | #include <asm/boot.h> | 32 | #include <asm/boot.h> |
33 | #include <asm/bootparam.h> | ||
33 | 34 | ||
34 | /* WARNING!! | 35 | /* WARNING!! |
35 | * This code is compiled with -fPIC and it is relocated dynamically | 36 | * This code is compiled with -fPIC and it is relocated dynamically |
@@ -187,13 +188,7 @@ static void gzip_release(void **); | |||
187 | /* | 188 | /* |
188 | * This is set up by the setup-routine at boot-time | 189 | * This is set up by the setup-routine at boot-time |
189 | */ | 190 | */ |
190 | static unsigned char *real_mode; /* Pointer to real-mode data */ | 191 | static struct boot_params *real_mode; /* Pointer to real-mode data */ |
191 | |||
192 | #define RM_EXT_MEM_K (*(unsigned short *)(real_mode + 0x2)) | ||
193 | #ifndef STANDARD_MEMORY_BIOS_CALL | ||
194 | #define RM_ALT_MEM_K (*(unsigned long *)(real_mode + 0x1e0)) | ||
195 | #endif | ||
196 | #define RM_SCREEN_INFO (*(struct screen_info *)(real_mode+0)) | ||
197 | 192 | ||
198 | extern unsigned char input_data[]; | 193 | extern unsigned char input_data[]; |
199 | extern int input_len; | 194 | extern int input_len; |
@@ -276,12 +271,13 @@ static void putstr(const char *s) | |||
276 | char c; | 271 | char c; |
277 | 272 | ||
278 | #ifdef CONFIG_X86_32 | 273 | #ifdef CONFIG_X86_32 |
279 | if (RM_SCREEN_INFO.orig_video_mode == 0 && lines == 0 && cols == 0) | 274 | if (real_mode->screen_info.orig_video_mode == 0 && |
275 | lines == 0 && cols == 0) | ||
280 | return; | 276 | return; |
281 | #endif | 277 | #endif |
282 | 278 | ||
283 | x = RM_SCREEN_INFO.orig_x; | 279 | x = real_mode->screen_info.orig_x; |
284 | y = RM_SCREEN_INFO.orig_y; | 280 | y = real_mode->screen_info.orig_y; |
285 | 281 | ||
286 | while ((c = *s++) != '\0') { | 282 | while ((c = *s++) != '\0') { |
287 | if (c == '\n') { | 283 | if (c == '\n') { |
@@ -302,8 +298,8 @@ static void putstr(const char *s) | |||
302 | } | 298 | } |
303 | } | 299 | } |
304 | 300 | ||
305 | RM_SCREEN_INFO.orig_x = x; | 301 | real_mode->screen_info.orig_x = x; |
306 | RM_SCREEN_INFO.orig_y = y; | 302 | real_mode->screen_info.orig_y = y; |
307 | 303 | ||
308 | pos = (x + cols * y) * 2; /* Update cursor position */ | 304 | pos = (x + cols * y) * 2; /* Update cursor position */ |
309 | outb(14, vidport); | 305 | outb(14, vidport); |
@@ -430,7 +426,7 @@ asmlinkage void decompress_kernel(void *rmode, memptr heap, | |||
430 | { | 426 | { |
431 | real_mode = rmode; | 427 | real_mode = rmode; |
432 | 428 | ||
433 | if (RM_SCREEN_INFO.orig_video_mode == 7) { | 429 | if (real_mode->screen_info.orig_video_mode == 7) { |
434 | vidmem = (char *) 0xb0000; | 430 | vidmem = (char *) 0xb0000; |
435 | vidport = 0x3b4; | 431 | vidport = 0x3b4; |
436 | } else { | 432 | } else { |
@@ -438,8 +434,8 @@ asmlinkage void decompress_kernel(void *rmode, memptr heap, | |||
438 | vidport = 0x3d4; | 434 | vidport = 0x3d4; |
439 | } | 435 | } |
440 | 436 | ||
441 | lines = RM_SCREEN_INFO.orig_video_lines; | 437 | lines = real_mode->screen_info.orig_video_lines; |
442 | cols = RM_SCREEN_INFO.orig_video_cols; | 438 | cols = real_mode->screen_info.orig_video_cols; |
443 | 439 | ||
444 | window = output; /* Output buffer (Normally at 1M) */ | 440 | window = output; /* Output buffer (Normally at 1M) */ |
445 | free_mem_ptr = heap; /* Heap */ | 441 | free_mem_ptr = heap; /* Heap */ |