Skip to content

Commit

Permalink
[lkrnprefix] Copy command line before installing iPXE
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
mcb30 committed Jan 18, 2012
1 parent 18d2887 commit f5bbe7e
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 5 deletions.
3 changes: 2 additions & 1 deletion src/arch/i386/core/runtime.c
Expand Up @@ -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=" );
Expand Down
43 changes: 39 additions & 4 deletions src/arch/i386/prefix/lkrnprefix.S
Expand Up @@ -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
Expand Down

0 comments on commit f5bbe7e

Please sign in to comment.