[kernel] r19840 - in dists/sid/linux/debian: . patches patches/bugfix/x86
Ben Hutchings
benh at alioth.debian.org
Sat Feb 23 05:54:20 UTC 2013
Author: benh
Date: Sat Feb 23 05:54:19 2013
New Revision: 19840
Log:
[x86] efi: Make "noefi" really disable EFI runtime serivces
Added:
dists/sid/linux/debian/patches/bugfix/x86/x86-efi-Make-noefi-really-disable-EFI-runtime-serivc.patch
Modified:
dists/sid/linux/debian/changelog
dists/sid/linux/debian/patches/series
Modified: dists/sid/linux/debian/changelog
==============================================================================
--- dists/sid/linux/debian/changelog Sat Feb 23 04:50:30 2013 (r19839)
+++ dists/sid/linux/debian/changelog Sat Feb 23 05:54:19 2013 (r19840)
@@ -174,6 +174,7 @@
- possible bugfix, au_lkup_by_ino() returns ESTALE
* [x86] efi: Clear EFI_RUNTIME_SERVICES rather than EFI_BOOT by "noefi" boot
parameter
+ * [x86] efi: Make "noefi" really disable EFI runtime serivces
* drm, agp: Update to 3.4.32
- drm/radeon: add WAIT_UNTIL to the non-VM safe regs list for cayman/TN
- drm/radeon: prevent crash in the ring space allocation
Added: dists/sid/linux/debian/patches/bugfix/x86/x86-efi-Make-noefi-really-disable-EFI-runtime-serivc.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/sid/linux/debian/patches/bugfix/x86/x86-efi-Make-noefi-really-disable-EFI-runtime-serivc.patch Sat Feb 23 05:54:19 2013 (r19840)
@@ -0,0 +1,105 @@
+From: Matt Fleming <matt.fleming at intel.com>
+Date: Wed, 20 Feb 2013 20:36:12 +0000
+Subject: x86, efi: Make "noefi" really disable EFI runtime serivces
+
+commit fb834c7acc5e140cf4f9e86da93a66de8c0514da upstream.
+
+commit 1de63d60cd5b ("efi: Clear EFI_RUNTIME_SERVICES rather than
+EFI_BOOT by "noefi" boot parameter") attempted to make "noefi" true to
+its documentation and disable EFI runtime services to prevent the
+bricking bug described in commit e0094244e41c ("samsung-laptop:
+Disable on EFI hardware"). However, it's not possible to clear
+EFI_RUNTIME_SERVICES from an early param function because
+EFI_RUNTIME_SERVICES is set in efi_init() *after* parse_early_param().
+
+This resulted in "noefi" effectively becoming a no-op and no longer
+providing users with a way to disable EFI, which is bad for those
+users that have buggy machines.
+
+Reported-by: Walt Nelson Jr <walt0924 at gmail.com>
+Cc: Satoru Takeuchi <takeuchi_satoru at jp.fujitsu.com>
+Signed-off-by: Matt Fleming <matt.fleming at intel.com>
+Link: http://lkml.kernel.org/r/1361392572-25657-1-git-send-email-matt@console-pimps.org
+Signed-off-by: H. Peter Anvin <hpa at linux.intel.com>
+[bwh: Backported to 3.2: efi_runtime_init() is not a separate function,
+ so put a whole set of statements in an if (!disable_runtime) block]
+---
+--- a/arch/x86/platform/efi/efi.c
++++ b/arch/x86/platform/efi/efi.c
+@@ -83,9 +83,10 @@ int efi_enabled(int facility)
+ }
+ EXPORT_SYMBOL(efi_enabled);
+
++static bool disable_runtime = false;
+ static int __init setup_noefi(char *arg)
+ {
+- clear_bit(EFI_RUNTIME_SERVICES, &x86_efi_facility);
++ disable_runtime = true;
+ return 0;
+ }
+ early_param("noefi", setup_noefi);
+@@ -549,35 +550,37 @@ void __init efi_init(void)
+
+ set_bit(EFI_CONFIG_TABLES, &x86_efi_facility);
+
+- /*
+- * Check out the runtime services table. We need to map
+- * the runtime services table so that we can grab the physical
+- * address of several of the EFI runtime functions, needed to
+- * set the firmware into virtual mode.
+- */
+- runtime = early_ioremap((unsigned long)efi.systab->runtime,
+- sizeof(efi_runtime_services_t));
+- if (runtime != NULL) {
+- /*
+- * We will only need *early* access to the following
+- * two EFI runtime services before set_virtual_address_map
+- * is invoked.
+- */
+- efi_phys.get_time = (efi_get_time_t *)runtime->get_time;
+- efi_phys.set_virtual_address_map =
+- (efi_set_virtual_address_map_t *)
+- runtime->set_virtual_address_map;
++ if (!disable_runtime) {
+ /*
+- * Make efi_get_time can be called before entering
+- * virtual mode.
++ * Check out the runtime services table. We need to map
++ * the runtime services table so that we can grab the physical
++ * address of several of the EFI runtime functions, needed to
++ * set the firmware into virtual mode.
+ */
+- efi.get_time = phys_efi_get_time;
+-
+- set_bit(EFI_RUNTIME_SERVICES, &x86_efi_facility);
+- } else
+- printk(KERN_ERR "Could not map the EFI runtime service "
+- "table!\n");
+- early_iounmap(runtime, sizeof(efi_runtime_services_t));
++ runtime = early_ioremap((unsigned long)efi.systab->runtime,
++ sizeof(efi_runtime_services_t));
++ if (runtime != NULL) {
++ /*
++ * We will only need *early* access to the following
++ * two EFI runtime services before set_virtual_address_map
++ * is invoked.
++ */
++ efi_phys.get_time = (efi_get_time_t *)runtime->get_time;
++ efi_phys.set_virtual_address_map =
++ (efi_set_virtual_address_map_t *)
++ runtime->set_virtual_address_map;
++ /*
++ * Make efi_get_time can be called before entering
++ * virtual mode.
++ */
++ efi.get_time = phys_efi_get_time;
++
++ set_bit(EFI_RUNTIME_SERVICES, &x86_efi_facility);
++ } else
++ printk(KERN_ERR "Could not map the EFI runtime service "
++ "table!\n");
++ early_iounmap(runtime, sizeof(efi_runtime_services_t));
++ }
+
+ /* Map the EFI memory map */
+ memmap.map = early_ioremap((unsigned long)memmap.phys_map,
Modified: dists/sid/linux/debian/patches/series
==============================================================================
--- dists/sid/linux/debian/patches/series Sat Feb 23 04:50:30 2013 (r19839)
+++ dists/sid/linux/debian/patches/series Sat Feb 23 05:54:19 2013 (r19840)
@@ -625,3 +625,4 @@
features/all/line6/0106-staging-line6-drop-unused-dumprequest-code.patch
bugfix/all/mm-Try-harder-to-allocate-vmemmap-blocks.patch
bugfix/x86/efi-Clear-EFI_RUNTIME_SERVICES-rather-than-EFI_BOOT-.patch
+bugfix/x86/x86-efi-Make-noefi-really-disable-EFI-runtime-serivc.patch
More information about the Kernel-svn-changes
mailing list