]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[lkrnprefix] Copy command line before installing iPXE
authorMichael Brown <mcb30@ipxe.org>
Wed, 18 Jan 2012 00:02:16 +0000 (00:02 +0000)
committerMichael Brown <mcb30@ipxe.org>
Wed, 18 Jan 2012 00:02:16 +0000 (00:02 +0000)
The command line may be situated in an area of base memory that will
be overwritten by iPXE's real-mode segments, causing the command line
to be corrupted before it can be used.

Fix by creating a copy of the command line on the prefix stack (below
0x7c00) before installing the real-mode segments.

Reported-by: Dave Hansen <dave@sr71.net>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/arch/i386/core/runtime.c
src/arch/i386/prefix/lkrnprefix.S

index 09ba62568443ffd59d0b9f49882025e96d0d1b9a..2ad8c20a40d1037be972f4cb1c7551eee5b1c863 100644 (file)
@@ -132,7 +132,8 @@ static int cmdline_init ( void ) {
        }
        cmdline = cmdline_copy;
        copy_from_user ( cmdline, cmdline_user, 0, len );
-       DBGC ( colour, "RUNTIME found command line \"%s\"\n", cmdline );
+       DBGC ( colour, "RUNTIME found command line \"%s\" at %08x\n",
+              cmdline, cmdline_phys );
 
        /* Strip unwanted cruft from the command line */
        cmdline_strip ( cmdline, "BOOT_IMAGE=" );
index bc1f8bfb7c24e0b305be6e29ab4e05f38f331f63..768903326e4485ed849711cc28bf66f966cd234e 100644 (file)
@@ -188,17 +188,52 @@ setup_code:
        We're now at the beginning of the kernel proper.
  */
 run_ipxe:
-       /* Set up stack just below 0x7c00 */
+       /* Set up stack just below 0x7c00 and clear direction flag */
        xorw    %ax, %ax
        movw    %ax, %ss
        movw    $0x7c00, %sp
+       cld
 
        /* Retrieve command-line pointer */
-       movl    %es:cmd_line_ptr, %edx
+       movl    %ds:cmd_line_ptr, %edx
+       testl   %edx, %edx
+       jz      no_cmd_line
+
+       /* Set up %es:%di to point to command line */
+       movl    %edx, %edi
+       andl    $0xf, %edi
+       rorl    $4, %edx
+       movw    %dx, %es
+
+       /* Find length of command line */
+       pushw   %di
+       movw    $0xffff, %cx
+       repnz scasb
+       notw    %cx
+       popw    %si
+
+       /* Make space for command line on stack */
+       movw    %sp, %di
+       subw    %cx, %di
+       andw    $~0xf, %di
+       movw    %di, %sp
+
+       /* Copy command line to stack */
+       pushw   %ds
+       pushw   %es
+       popw    %ds
+       pushw   %ss
+       popw    %es
+       rep movsb
+       popw    %ds
+
+       /* Store new command-line pointer */
+       movzwl  %sp, %edx
+no_cmd_line:
 
        /* Retrieve initrd pointer and size */
-       movl    %es:ramdisk_image, %ebp
-       movl    %es:ramdisk_size, %ecx
+       movl    %ds:ramdisk_image, %ebp
+       movl    %ds:ramdisk_size, %ecx
 
        /* Install iPXE */
        call    alloc_basemem