[lkrnprefix] Copy command line before installing iPXE

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>
pull/5/head
Michael Brown 2012-01-18 00:02:16 +00:00
parent 18d2887281
commit f5bbe7ec4a
2 changed files with 41 additions and 5 deletions

View File

@ -132,7 +132,8 @@ static int cmdline_init ( void ) {
} }
cmdline = cmdline_copy; cmdline = cmdline_copy;
copy_from_user ( cmdline, cmdline_user, 0, len ); 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 */ /* Strip unwanted cruft from the command line */
cmdline_strip ( cmdline, "BOOT_IMAGE=" ); cmdline_strip ( cmdline, "BOOT_IMAGE=" );

View File

@ -188,17 +188,52 @@ setup_code:
We're now at the beginning of the kernel proper. We're now at the beginning of the kernel proper.
*/ */
run_ipxe: run_ipxe:
/* Set up stack just below 0x7c00 */ /* Set up stack just below 0x7c00 and clear direction flag */
xorw %ax, %ax xorw %ax, %ax
movw %ax, %ss movw %ax, %ss
movw $0x7c00, %sp movw $0x7c00, %sp
cld
/* Retrieve command-line pointer */ /* 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 */ /* Retrieve initrd pointer and size */
movl %es:ramdisk_image, %ebp movl %ds:ramdisk_image, %ebp
movl %es:ramdisk_size, %ecx movl %ds:ramdisk_size, %ecx
/* Install iPXE */ /* Install iPXE */
call alloc_basemem call alloc_basemem