From 755cb8379d9bd139af6d8fd9d67e8b764418c4ad Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Sun, 4 Nov 2007 04:27:38 +0000 Subject: [PATCH] Allow space for the kernel's real-mode .bss. Previously we weren't allowing any space for this, which makes it surprising that bzImage loading ever worked. --- src/arch/i386/image/bzimage.c | 8 +++++++- src/arch/i386/include/bzimage.h | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/arch/i386/image/bzimage.c b/src/arch/i386/image/bzimage.c index 439153e2..f0591681 100644 --- a/src/arch/i386/image/bzimage.c +++ b/src/arch/i386/image/bzimage.c @@ -343,6 +343,11 @@ static int bzimage_exec ( struct image *image ) { /* Prepare for exiting */ shutdown(); + DBGC ( image, "bzImage %p jumping to RM kernel at %04x:0000 " + "(stack %04x:%04x)\n", image, + ( exec_ctx.rm_kernel_seg + 0x20 ), + exec_ctx.rm_kernel_seg, exec_ctx.rm_heap ); + /* Jump to the kernel */ __asm__ __volatile__ ( REAL_CODE ( "movw %w0, %%ds\n\t" "movw %w0, %%es\n\t" @@ -403,8 +408,9 @@ static int bzimage_load_header ( struct image *image, /* Calculate load address and size of real-mode portion */ load_ctx->rm_kernel_seg = 0x1000; /* place RM kernel at 1000:0000 */ load_ctx->rm_kernel = real_to_user ( load_ctx->rm_kernel_seg, 0 ); - load_ctx->rm_filesz = load_ctx->rm_memsz = + load_ctx->rm_filesz = ( ( bzhdr->setup_sects ? bzhdr->setup_sects : 4 ) + 1 ) << 9; + load_ctx->rm_memsz = BZI_ASSUMED_RM_SIZE; if ( load_ctx->rm_filesz > image->len ) { DBGC ( image, "bzImage %p too short for %zd byte of setup\n", image, load_ctx->rm_filesz ); diff --git a/src/arch/i386/include/bzimage.h b/src/arch/i386/include/bzimage.h index f443fae7..609e8362 100644 --- a/src/arch/i386/include/bzimage.h +++ b/src/arch/i386/include/bzimage.h @@ -117,6 +117,8 @@ struct bzimage_cmdline { /** bzImage command line present magic marker value */ #define BZI_CMDLINE_MAGIC 0xa33f +/** Assumed size of real-mode portion (including .bss) */ +#define BZI_ASSUMED_RM_SIZE 0x8000 /** Amount of stack space to provide */ #define BZI_STACK_SIZE 0x1000