All of lore.kernel.org
 help / color / mirror / Atom feed
From: Maarten Lankhorst <m.b.lankhorst@gmail.com>
To: Matt Fleming <matt@console-pimps.org>
Cc: "H. Peter Anvin" <hpa@linux.intel.com>,
	Matthew Garrett <mjg@redhat.com>,
	linux-kernel@vger.kernel.org, Ingo Molnar <mingo@elte.hu>,
	Thomas Gleixner <tglx@linutronix.de>,
	x86@kernel.org, Mike Waychison <mikew@google.com>,
	Andi Kleen <andi@firstfloor.org>
Subject: Re: [PATCH v5 10/10] x86, efi: EFI boot stub support
Date: Thu, 24 Nov 2011 17:58:12 +0100	[thread overview]
Message-ID: <4ECE77A4.2040703@gmail.com> (raw)
In-Reply-To: <4ECE5803.3060203@gmail.com>

Hey Matt,

On 11/24/2011 03:43 PM, Maarten Lankhorst wrote:
> Hey Matt,
>
> On 11/23/2011 08:27 PM, Matt Fleming wrote:
>
>> On Wed, 2011-11-23 at 01:44 +0100, Maarten Lankhorst wrote:
>>> When I tested this with v3.2-rc2 it didn't boot, it hung before it
>>> initialized the kernel.
>>> Without initrd it works fine, though.
>> Bah, so this change actually makes booting worse? You said before that
>> you almost made it to userspace but this seems to hang much earlier now.
>> Is that correct?
>>
>> ... back to the drawing board.
> I was looking at why grub2 could boot, seems to be it reads in chunks of
> 256 kilobytes. I seem to be able to get it to boot with chunks of 4 mb
> as well, but didn't test beyond that.
>
> So the fix is to simply read the file in parts, otherwise efi hangs..
> As a nice side effect, short reads are also handled, but the efi
> firmware seems to choke over huge reads and dies.
So after I was encouraged by mjg59 to find out the limit,
I put this patch to test maximum file size with together..

Turns out that it pukes on 4 mb, my printf was fucked,
in the patch below I corrected it, so I don't know for sure
if that included 4 mb being bad or not. I suppose writing
a test for read(fd, addr, 5 * 1024 * 1024) was too hard for
efi to pass. ;)

Just make a file with dd if=/dev/urandom of=initrd.img bs=1M count=99
to find out when/if YOUR efi implementation will die! :D

diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c
index 8627a56..415b875 100644
--- a/arch/x86/boot/compressed/eboot.c
+++ b/arch/x86/boot/compressed/eboot.c
@@ -30,6 +30,19 @@
 #define PIXEL_BLT_ONLY					3
 #define PIXEL_FORMAT_MAX				4
 
+typedef struct _EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL {
+  void* Reset;
+  void *OutputString;
+  void *TestString;
+  void *QueryMode;
+  void *SetMode;
+  void *SetAttribute;
+  void *ClearScreen;
+  void *SetCursorPosition;
+  void *EnableCursor;
+  void *Mode;
+} __attribute__((packed)) EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL;
+
 typedef struct {
 	u32 red_mask;
 	u32 green_mask;
@@ -692,17 +705,27 @@ grow:
 
 		addr = initrd_addr;
 		for (j = 0; j < nr_initrds; j++) {
-			u64 size;
-
-			size = initrds[j].size;
-			status = efi_call_phys3(fh->read, initrds[j].handle,
-						&size, addr);
-			if (status != EFI_SUCCESS)
-				goto free_initrd_total;
-
+			u64 size, chunksize;
+			uint16_t str[] = { 'S', 'i', 'z', 'e', ':', ' ', ' ',' ', ' ', '\r', '\n', 0 };
+			EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *output = (void*)sys_table->stderr;
+
+			for (chunksize = 1024 * 1024; chunksize < initrds[j].size; chunksize += 1024 * 1024) {
+				str[5] = ((chunksize / 1024 / 1024) / 10) + '0';
+				str[6] = ((chunksize / 1024 / 1024) % 10) + '0';
+				efi_call_phys2(output->OutputString, sys_table->stderr_handle, str);
+				size = initrds[j].size;
+				efi_call_phys2(fh->set_position, initrds[j].handle, 0);
+				while (size) {
+					u64 toread = size > chunksize ? chunksize : size;
+					status = efi_call_phys3(fh->read, initrds[j].handle,
+							&toread, addr);
+					if (status != EFI_SUCCESS)
+						goto free_initrd_total;
+					size -= toread;
+					addr += toread;
+				}
+			}
 			efi_call_phys1(fh->close, initrds[j].handle);
-
-			addr += size;
 		}
 
 	}



  reply	other threads:[~2011-11-24 16:58 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-10-17 10:40 [PATCH v5 00/10] x86 EFI boot stub Matt Fleming
2011-10-17 10:40 ` [PATCH 01/10] x86: Add missing bzImage fields to struct setup_header Matt Fleming
2011-10-17 10:40 ` [PATCH 02/10] x86, efi: Make efi_call_phys_prelog() CONFIG_RELOCATABLE-aware Matt Fleming
2011-10-17 10:40 ` [PATCH 03/10] x86: Don't use magic strings for EFI loader signature Matt Fleming
2011-10-17 10:40 ` [PATCH 04/10] efi.h: Add struct definition for boot time services Matt Fleming
2011-10-17 10:40 ` [PATCH v2 05/10] efi.h: Add efi_image_loaded_t Matt Fleming
2011-10-17 10:40 ` [PATCH 06/10] efi.h: Add allocation types for boottime->allocate_pages() Matt Fleming
2011-10-17 10:40 ` [PATCH v2 07/10] efi.h: Add graphics protocol guids Matt Fleming
2011-10-17 10:40 ` [PATCH 08/10] efi.h: Add boottime->locate_handle search types Matt Fleming
2011-10-17 10:40 ` [PATCH v2 09/10] efi: Add EFI file I/O data types Matt Fleming
2011-10-17 10:40 ` [PATCH v5 10/10] x86, efi: EFI boot stub support Matt Fleming
2011-10-17 16:39   ` Maarten Lankhorst
2011-10-17 18:28     ` Matt Fleming
2011-10-18  6:09     ` Ingo Molnar
2011-10-17 20:06   ` Maarten Lankhorst
2011-11-15 18:51     ` Matt Fleming
2011-11-23  0:44       ` Maarten Lankhorst
2011-11-23 19:27         ` Matt Fleming
2011-11-24 14:43           ` Maarten Lankhorst
2011-11-24 16:58             ` Maarten Lankhorst [this message]
2011-11-24 20:56             ` Matt Fleming
2011-11-24 21:07               ` Matthew Garrett
2011-11-24 21:31                 ` Matt Fleming
2011-11-25  1:37               ` [PATCH] x86, efi: Break up large initrd reads Maarten Lankhorst
2011-11-25  8:48                 ` Matt Fleming
2011-12-12 23:10                   ` H. Peter Anvin
2011-12-13 18:26                     ` H. Peter Anvin
2011-12-14 23:33                       ` Maarten Lankhorst
2011-12-14 23:36                         ` H. Peter Anvin
2011-12-16 12:30                           ` [PATCH v2] " Maarten Lankhorst
2011-12-16 18:43                             ` [tip:x86/efi] " tip-bot for Maarten Lankhorst
2011-12-10  2:37 ` [tip:x86/efi] x86: Add missing bzImage fields to struct setup_header tip-bot for Matt Fleming
2011-12-10  2:38 ` [tip:x86/efi] x86: Don't use magic strings for EFI loader signature tip-bot for Matt Fleming
2011-12-10  2:38 ` [tip:x86/efi] efi.h: Add struct definition for boot time services tip-bot for Matt Fleming
2011-12-10  2:39 ` [tip:x86/efi] efi.h: Add efi_image_loaded_t tip-bot for Matt Fleming
2011-12-10  2:40 ` [tip:x86/efi] efi.h: Add allocation types for boottime->allocate_pages() tip-bot for Matt Fleming
2011-12-10  2:41 ` [tip:x86/efi] efi.h: Add graphics protocol guids tip-bot for Matt Fleming
2011-12-10  2:42 ` [tip:x86/efi] efi.h: Add boottime->locate_handle search types tip-bot for Matt Fleming
2011-12-10  2:42 ` [tip:x86/efi] efi: Add EFI file I/O data types tip-bot for 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=4ECE77A4.2040703@gmail.com \
    --to=m.b.lankhorst@gmail.com \
    --cc=andi@firstfloor.org \
    --cc=hpa@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=matt@console-pimps.org \
    --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.