Linux v4.10-rc4
This commit is contained in:
parent
cf4759fc3f
commit
411d3b79f7
@ -1,141 +0,0 @@
|
||||
From c7c7030a020405d5826c03839e38986e0f78f2ea Mon Sep 17 00:00:00 2001
|
||||
From: Peter Jones <pjones@redhat.com>
|
||||
Date: Tue, 13 Dec 2016 10:25:10 +0000
|
||||
Subject: [PATCH] efi: prune invalid memory map entries
|
||||
|
||||
Some machines, such as the Lenovo ThinkPad W541 with firmware GNET80WW
|
||||
(2.28), include memory map entries with phys_addr=0x0 and num_pages=0.
|
||||
|
||||
Currently the log output for this case (with efi=debug) looks like:
|
||||
|
||||
[ 0.000000] efi: mem45: [Reserved | | | | | | | | | | | | ] range=[0x0000000000000000-0xffffffffffffffff] (0MB)
|
||||
|
||||
This is clearly wrong, and also not as informative as it could be. This
|
||||
patch changes it so that if we find obviously invalid memory map
|
||||
entries, we print an error and those entries. It also detects the
|
||||
display of the address range calculation overflow, so the new output is:
|
||||
|
||||
[ 0.000000] efi: [Firmware Bug]: Invalid EFI memory map entries:
|
||||
[ 0.000000] efi: mem45: [Reserved | | | | | | | | | | | | ] range=[0x0000000000000000-0x0000000000000000] (invalid)
|
||||
|
||||
It also detects memory map sizes that would overflow the physical
|
||||
address, for example phys_addr=0xfffffffffffff000 and
|
||||
num_pages=0x0200000000000001, and prints:
|
||||
|
||||
[ 0.000000] efi: [Firmware Bug]: Invalid EFI memory map entries:
|
||||
[ 0.000000] efi: mem45: [Reserved | | | | | | | | | | | | ] range=[phys_addr=0xfffffffffffff000-0x20ffffffffffffffff] (invalid)
|
||||
|
||||
It then removes these entries from the memory map.
|
||||
|
||||
Cc: Matt Fleming <matt@codeblueprint.co.uk>
|
||||
Signed-off-by: Peter Jones <pjones@redhat.com>
|
||||
[ardb: refactor for clarity with no functional changes, avoid PAGE_SHIFT]
|
||||
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
|
||||
---
|
||||
arch/x86/platform/efi/efi.c | 70 +++++++++++++++++++++++++++++++++++++++++++++
|
||||
include/linux/efi.h | 1 +
|
||||
2 files changed, 71 insertions(+)
|
||||
|
||||
diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c
|
||||
index bf99aa7..0a1550b 100644
|
||||
--- a/arch/x86/platform/efi/efi.c
|
||||
+++ b/arch/x86/platform/efi/efi.c
|
||||
@@ -210,6 +210,74 @@ int __init efi_memblock_x86_reserve_range(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+#define OVERFLOW_ADDR_SHIFT (64 - EFI_PAGE_SHIFT)
|
||||
+#define OVERFLOW_ADDR_MASK (U64_MAX << OVERFLOW_ADDR_SHIFT)
|
||||
+#define U64_HIGH_BIT (~(U64_MAX >> 1))
|
||||
+
|
||||
+static bool __init efi_memmap_entry_valid(const efi_memory_desc_t *md, int i)
|
||||
+{
|
||||
+ static __initdata bool once = true;
|
||||
+ u64 end = (md->num_pages << EFI_PAGE_SHIFT) + md->phys_addr - 1;
|
||||
+ u64 end_hi = 0;
|
||||
+ char buf[64];
|
||||
+
|
||||
+ if (md->num_pages == 0) {
|
||||
+ end = 0;
|
||||
+ } else if (md->num_pages > EFI_PAGES_MAX ||
|
||||
+ EFI_PAGES_MAX - md->num_pages <
|
||||
+ (md->phys_addr >> EFI_PAGE_SHIFT)) {
|
||||
+ end_hi = (md->num_pages & OVERFLOW_ADDR_MASK)
|
||||
+ >> OVERFLOW_ADDR_SHIFT;
|
||||
+
|
||||
+ if ((md->phys_addr & U64_HIGH_BIT) && !(end & U64_HIGH_BIT))
|
||||
+ end_hi += 1;
|
||||
+ } else {
|
||||
+ return true;
|
||||
+ }
|
||||
+
|
||||
+ if (once) {
|
||||
+ pr_warn(FW_BUG "Invalid EFI memory map entries:\n");
|
||||
+ once = false;
|
||||
+ }
|
||||
+
|
||||
+ if (end_hi) {
|
||||
+ pr_warn("mem%02u: %s range=[0x%016llx-0x%llx%016llx] (invalid)\n",
|
||||
+ i, efi_md_typeattr_format(buf, sizeof(buf), md),
|
||||
+ md->phys_addr, end_hi, end);
|
||||
+ } else {
|
||||
+ pr_warn("mem%02u: %s range=[0x%016llx-0x%016llx] (invalid)\n",
|
||||
+ i, efi_md_typeattr_format(buf, sizeof(buf), md),
|
||||
+ md->phys_addr, end);
|
||||
+ }
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
+static void __init efi_clean_memmap(void)
|
||||
+{
|
||||
+ efi_memory_desc_t *out = efi.memmap.map;
|
||||
+ const efi_memory_desc_t *in = out;
|
||||
+ const efi_memory_desc_t *end = efi.memmap.map_end;
|
||||
+ int i, n_removal;
|
||||
+
|
||||
+ for (i = n_removal = 0; in < end; i++) {
|
||||
+ if (efi_memmap_entry_valid(in, i)) {
|
||||
+ if (out != in)
|
||||
+ memcpy(out, in, efi.memmap.desc_size);
|
||||
+ out = (void *)out + efi.memmap.desc_size;
|
||||
+ } else {
|
||||
+ n_removal++;
|
||||
+ }
|
||||
+ in = (void *)in + efi.memmap.desc_size;
|
||||
+ }
|
||||
+
|
||||
+ if (n_removal > 0) {
|
||||
+ u64 size = efi.memmap.nr_map - n_removal;
|
||||
+
|
||||
+ pr_warn("Removing %d invalid memory map entries.\n", n_removal);
|
||||
+ efi_memmap_install(efi.memmap.phys_map, size);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
void __init efi_print_memmap(void)
|
||||
{
|
||||
efi_memory_desc_t *md;
|
||||
@@ -472,6 +540,8 @@ void __init efi_init(void)
|
||||
}
|
||||
}
|
||||
|
||||
+ efi_clean_memmap();
|
||||
+
|
||||
if (efi_enabled(EFI_DBG))
|
||||
efi_print_memmap();
|
||||
}
|
||||
diff --git a/include/linux/efi.h b/include/linux/efi.h
|
||||
index 4c1b3ea..712a3aa 100644
|
||||
--- a/include/linux/efi.h
|
||||
+++ b/include/linux/efi.h
|
||||
@@ -103,6 +103,7 @@ typedef struct {
|
||||
|
||||
#define EFI_PAGE_SHIFT 12
|
||||
#define EFI_PAGE_SIZE (1UL << EFI_PAGE_SHIFT)
|
||||
+#define EFI_PAGES_MAX (U64_MAX >> EFI_PAGE_SHIFT)
|
||||
|
||||
typedef struct {
|
||||
u32 type;
|
||||
--
|
||||
2.9.3
|
||||
|
@ -1073,8 +1073,8 @@ index 5bb1985..6441d21 100644
|
||||
return -EFAULT;
|
||||
|
||||
@@ -515,6 +518,9 @@ static ssize_t write_kmem(struct file *file, const char __user *buf,
|
||||
if (!pfn_valid(PFN_DOWN(p)))
|
||||
return -EIO;
|
||||
char *kbuf; /* k-addr because vwrite() takes vmlist_lock rwlock */
|
||||
int err = 0;
|
||||
|
||||
+ if (kernel_is_locked_down())
|
||||
+ return -EPERM;
|
||||
|
2
gitrev
2
gitrev
@ -1 +1 @@
|
||||
557ed56cc75e0a33c15ba438734a280bac23bd32
|
||||
49def1853334396f948dcb4cedb9347abb318df5
|
||||
|
12
kernel.spec
12
kernel.spec
@ -42,7 +42,7 @@ Summary: The Linux kernel
|
||||
# For non-released -rc kernels, this will be appended after the rcX and
|
||||
# gitX tags, so a 3 here would become part of release "0.rcX.gitX.3"
|
||||
#
|
||||
%global baserelease 2
|
||||
%global baserelease 1
|
||||
%global fedora_build %{baserelease}
|
||||
|
||||
# base_sublevel is the kernel version we're starting with and patching
|
||||
@ -67,9 +67,9 @@ Summary: The Linux kernel
|
||||
# The next upstream release sublevel (base_sublevel+1)
|
||||
%define upstream_sublevel %(echo $((%{base_sublevel} + 1)))
|
||||
# The rc snapshot level
|
||||
%global rcrev 3
|
||||
%global rcrev 4
|
||||
# The git snapshot level
|
||||
%define gitrev 4
|
||||
%define gitrev 0
|
||||
# Set rpm version accordingly
|
||||
%define rpmversion 4.%{upstream_sublevel}.0
|
||||
%endif
|
||||
@ -579,9 +579,6 @@ Patch665: netfilter-x_tables-deal-with-bogus-nextoffset-values.patch
|
||||
#ongoing complaint, full discussion delayed until ksummit/plumbers
|
||||
Patch849: 0001-iio-Use-event-header-from-kernel-tree.patch
|
||||
|
||||
# Work around thinkpad firmware memory layout issues and efi_mem_reserve()
|
||||
Patch850: 0001-efi-prune-invalid-memory-map-entries.patch
|
||||
|
||||
# Fix build issue with armada_trace
|
||||
Patch851: Armada-trace-build-fix.patch
|
||||
|
||||
@ -2155,8 +2152,9 @@ fi
|
||||
#
|
||||
#
|
||||
%changelog
|
||||
* Mon Jan 16 2017 Justin M. Forbes <jforbes@fedoraproject.org> - 4.10.0-0.rc3.git4.2
|
||||
* Mon Jan 16 2017 Justin M. Forbes <jforbes@fedoraproject.org> - 4.10.0-0.rc4.git0.1
|
||||
- Disable debugging options.
|
||||
- Linux v4.10-rc4
|
||||
|
||||
* Mon Jan 16 2017 Peter Robinson <pbrobinson@fedoraproject.org>
|
||||
- Minor ARM updates
|
||||
|
3
sources
3
sources
@ -1,4 +1,3 @@
|
||||
SHA512 (linux-4.9.tar.xz) = bf67ff812cc3cb7e5059e82cc5db0d9a7c5637f7ed9a42e4730c715bf7047c81ed3a571225f92a33ef0b6d65f35595bc32d773356646df2627da55e9bc7f1f1a
|
||||
SHA512 (perf-man-4.9.tar.gz) = d23bb3da1eadd6623fddbf4696948de7675f3dcf57c711a7427dd7ae111394f58d8f42752938bbea7cd219f1e7f6f116fc67a1c74f769711063940a065f37b99
|
||||
SHA512 (patch-4.10-rc3.xz) = 3573b198b6ee488d6c573dd09c534548a08bcf8a017a94f74d127a58a018c9e97056006fccd555aa49513cc3f98ad5c1cb6545a7e261d3ccaea21456b53f2dd5
|
||||
SHA512 (patch-4.10-rc3-git4.xz) = bad15249a0e5675fdfa5d628ac4c556e1e4b58c89239a9ae0357277b34738185e2176b5a0510a4e4eff417b2bf9d03f31f98711440961768e275bad04d638f93
|
||||
SHA512 (patch-4.10-rc4.xz) = 89d903d52ff907f3911ac09214d1299c310fd67b7ff36170c6233e6348049fb0f669ba245a8ca310f52c91eb523aa5f91a9b52f4c67ca932b951fe2c60f25ae5
|
||||
|
Loading…
Reference in New Issue
Block a user