From: Matt Fleming <matt.fleming@intel.com>
To: Matthew Garrett <matthew.garrett@nebula.com>
Cc: rja@sgi.com, mingo@kernel.org, torvalds@linux-foundation.org,
bp@alien8.de, jkosina@suse.cz, jlee@suse.com,
linux-efi@vger.kernel.org, x86@kernel.org,
linux-kernel@vger.kernel.org, tglx@linutronix.de,
hpa@linux.intel.com, akpm@linux-foundation.org
Subject: Re: [PATCH] Modify UEFI anti-bricking code
Date: Mon, 03 Jun 2013 13:17:56 +0100 [thread overview]
Message-ID: <51AC8974.4010102@intel.com> (raw)
In-Reply-To: <1370117180-1712-1-git-send-email-matthew.garrett@nebula.com>
On 01/06/13 21:06, Matthew Garrett wrote:
> This patch reworks the UEFI anti-bricking code, including an effective
> reversion of cc5a080c and 31ff2f20. It turns out that calling
> QueryVariableInfo() from boot services results in some firmware
> implementations jumping to physical addresses even after entering virtual
> mode, so until we have 1:1 mappings for UEFI runtime space this isn't
> going to work so well.
>
> Reverting these gets us back to the situation where we'd refuse to create
> variables on some systems because they classify deleted variables as "used"
> until the firmware triggers a garbage collection run, which they won't do
> until they reach a lower threshold. This results in it being impossible to
> install a bootloader, which is unhelpful.
>
> Feedback from Samsung indicates that the firmware doesn't need more than
> 5KB of storage space for its own purposes, so that seems like a reasonable
> threshold. However, there's still no guarantee that a platform will attempt
> garbage collection merely because it drops below this threshold. It seems
> that this is often only triggered if an attempt to write generates a
> genuine EFI_OUT_OF_RESOURCES error. We can force that by attempting to
> create a variable larger than the remaining space. This should fail, but if
> it somehow succeeds we can then immediately delete it.
>
> I've tested this on the UEFI machines I have available, but I don't have
> a Samsung and so can't verify that it avoids the bricking problem.
This patch works on my ASUS machine, which suffers from the "you need to
write more than 50% to initiate garbage collection" issue. So that's
good news. I'm trying to find someone with one of the vulnerable Samsung
laptops, but this patch does look like a step in the right direction,
seeing as it solves Russ' boot issue.
[...]
> @@ -1141,28 +1037,53 @@ efi_status_t efi_query_variable_store(u32 attributes, unsigned long size)
> if (status != EFI_SUCCESS)
> return status;
>
> - if (!max_size && remaining_size > size)
> - printk_once(KERN_ERR FW_BUG "Broken EFI implementation"
> - " is returning MaxVariableSize=0\n");
Do we really want to drop this hunk? The point of this code was to
inform firmware vendors that their implementation is returning funky
results, and that they should look into why it's doing that.
> /*
> * Some firmware implementations refuse to boot if there's insufficient
> * space in the variable store. We account for that by refusing the
> * write if permitting it would reduce the available space to under
> - * 50%. However, some firmware won't reclaim variable space until
> - * after the used (not merely the actively used) space drops below
> - * a threshold. We can approximate that case with the value calculated
> - * above. If both the firmware and our calculations indicate that the
> - * available space would drop below 50%, refuse the write.
> + * 5KB. This figure was provided by Samsung, so should be safe.
> */
> + if ((remaining_size - size < 5120) && !efi_no_storage_paranoia) {
> + /*
> + * Triggering garbage collection may require that the firmware
> + * generate a real EFI_OUT_OF_RESOURCES error. We can force
> + * that by attempting to use more space than is available.
> + */
> + unsigned long dummy_size = remaining_size + 1024;
> + void *dummy = kmalloc(dummy_size, GFP_ATOMIC);
> + efi_char16_t efi_name[6] = { 'D', 'U', 'M', 'M', 'Y', 0 };
> + efi_guid_t guid = EFI_GUID(0x4424ac57, 0xbe4b, 0x47dd, 0x9e,
> + 0x97, 0xed, 0x50, 0xf0, 0x9f, 0x92,
> + 0xa9);
What's the origin of this guid? And should we be adding it to
include/linux/efi.h?
next prev parent reply other threads:[~2013-06-03 12:17 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-06-01 20:06 [PATCH] Modify UEFI anti-bricking code Matthew Garrett
[not found] ` <1370117180-1712-1-git-send-email-matthew.garrett-05XSO3Yj/JvQT0dZR+AlfA@public.gmane.org>
2013-06-02 15:48 ` Russ Anderson
2013-06-04 5:29 ` Lingzhu Xiang
2013-06-03 12:17 ` Matt Fleming [this message]
2013-06-03 14:58 ` Matthew Garrett
2013-06-03 16:13 ` joeyli
2013-06-03 16:31 ` Matthew Garrett
[not found] ` <1370277079.6315.14.camel-+5W/JHIUVxg@public.gmane.org>
2013-06-04 3:35 ` joeyli
2013-06-05 14:49 ` Fleming, Matt
[not found] ` <CAL01qptzxe5L6Vq+nBZLq+bQNxbe_i_2OdKMNJGZQDfMihaHOw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-06-05 14:53 ` Matthew Garrett
[not found] ` <1370444007.6315.32.camel-+5W/JHIUVxg@public.gmane.org>
2013-06-05 15:59 ` Matt Fleming
[not found] ` <20130605155904.GC30420-HNK1S37rvNbeXh+fF434Mdi2O/JbrIOy@public.gmane.org>
2013-06-05 16:08 ` Matthew Garrett
[not found] ` <1370448519.6315.36.camel-+5W/JHIUVxg@public.gmane.org>
2013-06-05 19:59 ` Matt Fleming
2013-06-06 2:24 ` joeyli
2013-06-05 20:19 ` H. Peter Anvin
2013-06-06 5:05 ` joeyli
2013-06-06 5:41 ` joeyli
2013-06-06 5:42 ` Matthew Garrett
[not found] ` <1370497321.6315.44.camel-+5W/JHIUVxg@public.gmane.org>
2013-06-06 7:40 ` joeyli
[not found] ` <1370504426.6523.49.camel-ONCj+Eqt86TasUa73XJKwA@public.gmane.org>
2013-06-06 9:25 ` Matt Fleming
[not found] ` <20130606092542.GE30420-HNK1S37rvNbeXh+fF434Mdi2O/JbrIOy@public.gmane.org>
2013-06-06 14:48 ` Russ Anderson
[not found] ` <20130606144846.GA10393-sJ/iWh9BUns@public.gmane.org>
2013-06-06 15:00 ` Matt Fleming
[not found] ` <20130606150039.GL30420-HNK1S37rvNbeXh+fF434Mdi2O/JbrIOy@public.gmane.org>
2013-06-06 15:28 ` Russ Anderson
2013-06-10 18:54 ` Russ Anderson
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=51AC8974.4010102@intel.com \
--to=matt.fleming@intel.com \
--cc=akpm@linux-foundation.org \
--cc=bp@alien8.de \
--cc=hpa@linux.intel.com \
--cc=jkosina@suse.cz \
--cc=jlee@suse.com \
--cc=linux-efi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=matthew.garrett@nebula.com \
--cc=mingo@kernel.org \
--cc=rja@sgi.com \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox