All of lore.kernel.org
 help / color / mirror / Atom feed
From: Matt Fleming <matt@console-pimps.org>
To: Maarten Lankhorst <m.b.lankhorst@gmail.com>
Cc: Matt Domsch <Matt_Domsch@Dell.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"H. Peter Anvin" <hpa@linux.intel.com>,
	Matthew Garrett <mjg@redhat.com>,
	"x86@kernel.org" <x86@kernel.org>, Ingo Molnar <mingo@elte.hu>,
	Thomas Gleixner <tglx@linutronix.de>,
	Mike Waychison <mikew@google.com>,
	Andi Kleen <andi@firstfloor.org>,
	"Hargrave, Jordan" <Jordan_Hargrave@Dell.com>
Subject: Re: [PATCH v2 10/10] x86, efi: EFI boot stub support
Date: Sat, 17 Sep 2011 12:44:26 +0100	[thread overview]
Message-ID: <1316259866.3578.20.camel@mfleming-mobl1.ger.corp.intel.com> (raw)
In-Reply-To: <4E71F33C.2010809@gmail.com>

On Thu, 2011-09-15 at 14:44 +0200, Maarten Lankhorst wrote:
> Thanks, that makes much more sense. The man page makes mention
> of extra arguments, but it kind of looked like the way to pass it was by
> using -u -@ - which didn't work of course. :)
> 
> So for reference:
> efibootmgr -L 'EFI Native Linux Boot' -l '\vmlinuz.efi' -d /dev/sdb -u root=/dev/sdb2 console=ttyS0,115200n8
> 
> or as ASCII (reads much prettier in efibootmgr -v)
> efibootmgr -L 'EFI Native Linux Boot' -l '\vmlinuz.efi' -d /dev/sdb root=/dev/sdb2 console=ttyS0,115200n8
> 
> This is the fixed patch I'm using for booting native linux kernel,
> with passing args tested for UCS-2 and ASCII. It seems that
> options_size can be halved safely, otherwise too much data is
> copied from input.

Thanks for looking at this Maarten. I've been staring at this code for
far too long to notice buglets like this ;-)

> I keep the first word, since otherwise the first argument is stripped off,
> and it's probably harmless for the kernel to read something like
> \vmlinuz.efi when you don't do a direct boot.
> 
> Signed-off-by: Maarten Lankhorst <m.b.lankhorst@gmail.com>
> 
> diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c
> index 6c34828..f77f9f5 100644
> --- a/arch/x86/boot/compressed/eboot.c
> +++ b/arch/x86/boot/compressed/eboot.c
> @@ -619,12 +619,12 @@ static efi_status_t make_boot_params(struct boot_params *boot_params,
>  	unsigned long cmdline;
>  	u8 nr_entries;
>  	u16 *s2;
> -	u8 *s1;
> +	u8 *s1, *s2_8;
>  	int i;
>  
>  	hdr->type_of_loader = 0x21;
>  
> -	status = low_alloc(options_size, 1, &cmdline);
> +	status = low_alloc(options_size+1, 1, &cmdline);
>  	if (status != EFI_SUCCESS)
>  		goto fail;

If no options were passed to the stub then we really don't want to do
the allocation at all. Speaking of 'options_size', have you tested the
values that get passed in from image->load_options? Running with the
OVMF firmware under qemu I get sizes that are always larger than the
NUL-byte in the argument string. For example, executing "bzImage foo"
results in image->load_options being 38!

Remember that ->options_size represents 16-bit characters and cmdline is
going to be ASCII. options_size will always be larger than the value we
need, so there's no need for the +1. At the moment we're actually
allocating too much memory and that needs to be fixed.

> @@ -633,27 +633,29 @@ static efi_status_t make_boot_params(struct boot_params *boot_params,
>  	/* Convert unicode cmdline to ascii */
>  	s1 = (u8 *)(unsigned long)hdr->cmd_line_ptr;
>  	s2 = (u16 *)options;
> +	s2_8 = (u8*)options;
>  
> -	if (s2 && options_size) {
> -		/* Skip first word, that's the kernel name */
> -		while (*s2 && *s2 != ' ' && *s2 != '\n') {
> -			options_size--;
> -			s2++;
> -		}
> -
> -		/* skip space */
> -		if (*s2 == ' ') {
> -			options_size--;
> -			s2++;
> -		}
> -
> -		while (options_size-- != 0) {
> +	if (options_size < 2 || !s2) {
> +		*s1 = '\0';
> +	} else if (s2_8[1] && s2_8[1] < 0x80 && s2_8[0] < 0x80) {
> +		/* Passed as ASCII */
> +		s2 = NULL;
> +		memcpy(s1, s2_8, options_size);
> +		hdr->cmdline_size = options_size;
> +	} else {
> +		options_size /= 2; /* Passed as UCS-2 */
> +		while (options_size-- != 0 && *s2) {
>  			*s1++ = *s2++;
>  			hdr->cmdline_size++;
>  		}
> -
>  		*s1 = '\0';
> +		s1 = (u8 *)(unsigned long)hdr->cmd_line_ptr;
>  	}
> +	if (hdr->cmdline_size && s1[hdr->cmdline_size - 1] == '\0')
> +		hdr->cmdline_size--;
> +	if (hdr->cmdline_size && s1[hdr->cmdline_size - 1] == '\n')
> +		hdr->cmdline_size--;
> +	s1[hdr->cmdline_size] = '\0';
>  
>  	hdr->ramdisk_image = 0;
>  	hdr->ramdisk_size = 0;

Hmm... I'm really not convinced that we need to support ASCII cmdline
arguments, sorry. efibootmgr has support for UCS-2, so that's what
should be used.

Thanks for the review!

-- 
Matt Fleming, Intel Open Source Technology Center


  reply	other threads:[~2011-09-17 11:44 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-09-12 14:34 [PATCH v2 00/10] x86 EFI boot stub Matt Fleming
2011-09-12 14:34 ` [PATCH 01/10] x86: Add missing bzImage fields to struct setup_header Matt Fleming
2011-09-12 14:34 ` [PATCH 02/10] x86, efi: Make efi_call_phys_prelog() CONFIG_RELOCATABLE-aware Matt Fleming
2011-09-12 14:34 ` [PATCH 03/10] x86: Don't use magic strings for EFI loader signature Matt Fleming
2011-09-12 14:34 ` [PATCH 04/10] efi.h: Add struct definition for boot time services Matt Fleming
2011-09-12 14:34 ` [PATCH v2 05/10] efi.h: Add efi_image_loaded_t Matt Fleming
2011-09-12 14:34 ` [PATCH 06/10] efi.h: Add allocation types for boottime->allocate_pages() Matt Fleming
2011-09-12 14:34 ` [PATCH v2 07/10] efi.h: Add graphics protocol guids Matt Fleming
2011-09-12 14:34 ` [PATCH 08/10] efi.h: Add boottime->locate_handle search types Matt Fleming
2011-09-12 14:34 ` [PATCH v2 09/10] efi: Add EFI file I/O data types Matt Fleming
2011-09-12 14:34 ` [PATCH v2 10/10] x86, efi: EFI boot stub support Matt Fleming
2011-09-13 13:29   ` Matthew Garrett
2011-09-13 14:01     ` Matt Fleming
2011-09-13 14:33   ` Maarten Lankhorst
2011-09-14 16:07     ` Matt Fleming
     [not found]       ` <20110915045231.GA32136@emperor.us.dell.com>
2011-09-15  8:04         ` Maarten Lankhorst
2011-09-15  9:08           ` Maarten Lankhorst
     [not found]           ` <20110915115255.GA4669@emperor.us.dell.com>
2011-09-15 12:44             ` Maarten Lankhorst
2011-09-17 11:44               ` Matt Fleming [this message]
2011-09-17 12:12                 ` Maarten Lankhorst
2011-09-21 11:57                   ` Matt Fleming
2011-09-21 12:10   ` [PATCH v3 " Matt Fleming
2011-09-22 11:43     ` Maarten Lankhorst
2011-09-22 11:55       ` Matt Fleming
2011-09-29 10:14     ` Henrik Rydberg
2011-09-30  7:41       ` Matt Fleming
2011-09-30 11:13         ` Henrik Rydberg
2011-10-03 16:53           ` Matthew Garrett
2011-10-03 18:32             ` Henrik Rydberg
2011-09-30  8:51     ` [PATCH v4 " Matt Fleming
2011-09-30 16:24       ` Shea Levy
2011-09-30 20:11         ` Matt Fleming
2011-10-01  7:50           ` Maarten Lankhorst
2011-10-01  9:19             ` Matt Fleming

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1316259866.3578.20.camel@mfleming-mobl1.ger.corp.intel.com \
    --to=matt@console-pimps.org \
    --cc=Jordan_Hargrave@Dell.com \
    --cc=Matt_Domsch@Dell.com \
    --cc=andi@firstfloor.org \
    --cc=hpa@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=m.b.lankhorst@gmail.com \
    --cc=mikew@google.com \
    --cc=mingo@elte.hu \
    --cc=mjg@redhat.com \
    --cc=tglx@linutronix.de \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.