mirror of https://github.com/ipxe/ipxe.git
[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
parent
18d2887281
commit
f5bbe7ec4a
|
@ -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=" );
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue