Allow space for the kernel's real-mode .bss. Previously we weren't
authorMichael Brown <mcb30@etherboot.org>
Sun, 4 Nov 2007 04:27:38 +0000 (04:27 +0000)
committerMichael Brown <mcb30@etherboot.org>
Sun, 4 Nov 2007 04:27:38 +0000 (04:27 +0000)
allowing any space for this, which makes it surprising that bzImage
loading ever worked.

src/arch/i386/image/bzimage.c
src/arch/i386/include/bzimage.h

index 439153e..f059168 100644 (file)
@@ -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 );
index f443fae..609e836 100644 (file)
@@ -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