Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b03acc4c authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'efi-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull EFI updates from Thomas Gleixner:

 - A fix for a add_efi_memmap parameter regression which ensures that
   the parameter is parsed before it is used.

 - Reinstate the virtual capsule mapping as the cached copy turned out
   to break Quark and other things

 - Remove Matt Fleming as EFI co-maintainer. He stepped back a few days
   ago. Thanks Matt for all your great work!

* 'efi-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  MAINTAINERS: Remove Matt Fleming as EFI co-maintainer
  efi/capsule-loader: Reinstate virtual capsule mapping
  x86/efi: Fix kernel param add_efi_memmap regression
parents 3eac6903 81b60dbf
Loading
Loading
Loading
Loading
+3 −4
Original line number Diff line number Diff line
@@ -5149,15 +5149,15 @@ F: sound/usb/misc/ua101.c
EFI TEST DRIVER
L:	linux-efi@vger.kernel.org
M:	Ivan Hu <ivan.hu@canonical.com>
M:	Matt Fleming <matt@codeblueprint.co.uk>
M:	Ard Biesheuvel <ard.biesheuvel@linaro.org>
S:	Maintained
F:	drivers/firmware/efi/test/

EFI VARIABLE FILESYSTEM
M:	Matthew Garrett <matthew.garrett@nebula.com>
M:	Jeremy Kerr <jk@ozlabs.org>
M:	Matt Fleming <matt@codeblueprint.co.uk>
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/mfleming/efi.git
M:	Ard Biesheuvel <ard.biesheuvel@linaro.org>
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/efi/efi.git
L:	linux-efi@vger.kernel.org
S:	Maintained
F:	fs/efivarfs/
@@ -5318,7 +5318,6 @@ S: Supported
F:	security/integrity/evm/

EXTENSIBLE FIRMWARE INTERFACE (EFI)
M:	Matt Fleming <matt@codeblueprint.co.uk>
M:	Ard Biesheuvel <ard.biesheuvel@linaro.org>
L:	linux-efi@vger.kernel.org
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/efi/efi.git
+2 −3
Original line number Diff line number Diff line
@@ -906,9 +906,6 @@ void __init setup_arch(char **cmdline_p)
		set_bit(EFI_BOOT, &efi.flags);
		set_bit(EFI_64BIT, &efi.flags);
	}

	if (efi_enabled(EFI_BOOT))
		efi_memblock_x86_reserve_range();
#endif

	x86_init.oem.arch_setup();
@@ -962,6 +959,8 @@ void __init setup_arch(char **cmdline_p)

	parse_early_param();

	if (efi_enabled(EFI_BOOT))
		efi_memblock_x86_reserve_range();
#ifdef CONFIG_MEMORY_HOTPLUG
	/*
	 * Memory used by the kernel cannot be hot-removed because Linux
+12 −1
Original line number Diff line number Diff line
@@ -592,7 +592,18 @@ static int qrk_capsule_setup_info(struct capsule_info *cap_info, void **pkbuff,
	/*
	 * Update the first page pointer to skip over the CSH header.
	 */
	cap_info->pages[0] += csh->headersize;
	cap_info->phys[0] += csh->headersize;

	/*
	 * cap_info->capsule should point at a virtual mapping of the entire
	 * capsule, starting at the capsule header. Our image has the Quark
	 * security header prepended, so we cannot rely on the default vmap()
	 * mapping created by the generic capsule code.
	 * Given that the Quark firmware does not appear to care about the
	 * virtual mapping, let's just point cap_info->capsule at our copy
	 * of the capsule header.
	 */
	cap_info->capsule = &cap_info->header;

	return 1;
}
+37 −8
Original line number Diff line number Diff line
@@ -20,10 +20,6 @@

#define NO_FURTHER_WRITE_ACTION -1

#ifndef phys_to_page
#define phys_to_page(x)		pfn_to_page((x) >> PAGE_SHIFT)
#endif

/**
 * efi_free_all_buff_pages - free all previous allocated buffer pages
 * @cap_info: pointer to current instance of capsule_info structure
@@ -35,7 +31,7 @@
static void efi_free_all_buff_pages(struct capsule_info *cap_info)
{
	while (cap_info->index > 0)
		__free_page(phys_to_page(cap_info->pages[--cap_info->index]));
		__free_page(cap_info->pages[--cap_info->index]);

	cap_info->index = NO_FURTHER_WRITE_ACTION;
}
@@ -71,6 +67,14 @@ int __efi_capsule_setup_info(struct capsule_info *cap_info)

	cap_info->pages = temp_page;

	temp_page = krealloc(cap_info->phys,
			     pages_needed * sizeof(phys_addr_t *),
			     GFP_KERNEL | __GFP_ZERO);
	if (!temp_page)
		return -ENOMEM;

	cap_info->phys = temp_page;

	return 0;
}

@@ -105,9 +109,24 @@ int __weak efi_capsule_setup_info(struct capsule_info *cap_info, void *kbuff,
 **/
static ssize_t efi_capsule_submit_update(struct capsule_info *cap_info)
{
	bool do_vunmap = false;
	int ret;

	ret = efi_capsule_update(&cap_info->header, cap_info->pages);
	/*
	 * cap_info->capsule may have been assigned already by a quirk
	 * handler, so only overwrite it if it is NULL
	 */
	if (!cap_info->capsule) {
		cap_info->capsule = vmap(cap_info->pages, cap_info->index,
					 VM_MAP, PAGE_KERNEL);
		if (!cap_info->capsule)
			return -ENOMEM;
		do_vunmap = true;
	}

	ret = efi_capsule_update(cap_info->capsule, cap_info->phys);
	if (do_vunmap)
		vunmap(cap_info->capsule);
	if (ret) {
		pr_err("capsule update failed\n");
		return ret;
@@ -165,10 +184,12 @@ static ssize_t efi_capsule_write(struct file *file, const char __user *buff,
			goto failed;
		}

		cap_info->pages[cap_info->index++] = page_to_phys(page);
		cap_info->pages[cap_info->index] = page;
		cap_info->phys[cap_info->index] = page_to_phys(page);
		cap_info->page_bytes_remain = PAGE_SIZE;
		cap_info->index++;
	} else {
		page = phys_to_page(cap_info->pages[cap_info->index - 1]);
		page = cap_info->pages[cap_info->index - 1];
	}

	kbuff = kmap(page);
@@ -252,6 +273,7 @@ static int efi_capsule_release(struct inode *inode, struct file *file)
	struct capsule_info *cap_info = file->private_data;

	kfree(cap_info->pages);
	kfree(cap_info->phys);
	kfree(file->private_data);
	file->private_data = NULL;
	return 0;
@@ -281,6 +303,13 @@ static int efi_capsule_open(struct inode *inode, struct file *file)
		return -ENOMEM;
	}

	cap_info->phys = kzalloc(sizeof(void *), GFP_KERNEL);
	if (!cap_info->phys) {
		kfree(cap_info->pages);
		kfree(cap_info);
		return -ENOMEM;
	}

	file->private_data = cap_info;

	return 0;
+3 −1
Original line number Diff line number Diff line
@@ -140,11 +140,13 @@ struct efi_boot_memmap {

struct capsule_info {
	efi_capsule_header_t	header;
	efi_capsule_header_t	*capsule;
	int			reset_type;
	long			index;
	size_t			count;
	size_t			total_size;
	phys_addr_t		*pages;
	struct page		**pages;
	phys_addr_t		*phys;
	size_t			page_bytes_remain;
};