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