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;
|
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=" );
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue