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

Commit 1b9f0efd authored by Linus Torvalds's avatar Linus Torvalds
Browse files

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

Pull x86 fixes from Peter Anvin:
 "A couple of key fixes and a few less critical ones.  The main ones
  are:

   - add a .bss section to the PE/COFF headers when building with EFI
     stub

   - invoke the correct paravirt magic when building the espfix page
     tables

  Unfortunately both of these areas also have at least one additional
  fix each still in thie pipeline, but which are not yet ready to push"

* 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86: Remove unused variable "polling"
  x86/espfix/xen: Fix allocation of pages for paravirt page tables
  x86/efi: Include a .bss section within the PE/COFF headers
  efi: fdt: Do not report an error during boot if UEFI is not available
  efi/arm64: efistub: remove local copy of linux_banner
parents b579fcca d3f44fba
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -12,8 +12,6 @@
#include <linux/efi.h>
#include <linux/libfdt.h>
#include <asm/sections.h>
#include <generated/compile.h>
#include <generated/utsrelease.h>

/*
 * AArch64 requires the DTB to be 8-byte aligned in the first 512MiB from
+22 −4
Original line number Diff line number Diff line
@@ -91,8 +91,7 @@ bs_die:

	.section ".bsdata", "a"
bugger_off_msg:
	.ascii	"Direct floppy boot is not supported. "
	.ascii	"Use a boot loader program instead.\r\n"
	.ascii	"Use a boot loader.\r\n"
	.ascii	"\n"
	.ascii	"Remove disk and press any key to reboot...\r\n"
	.byte	0
@@ -108,7 +107,7 @@ coff_header:
#else
	.word	0x8664				# x86-64
#endif
	.word	3				# nr_sections
	.word	4				# nr_sections
	.long	0 				# TimeDateStamp
	.long	0				# PointerToSymbolTable
	.long	1				# NumberOfSymbols
@@ -250,6 +249,25 @@ section_table:
	.word	0				# NumberOfLineNumbers
	.long	0x60500020			# Characteristics (section flags)

	#
	# The offset & size fields are filled in by build.c.
	#
	.ascii	".bss"
	.byte	0
	.byte	0
	.byte	0
	.byte	0
	.long	0
	.long	0x0
	.long	0				# Size of initialized data
						# on disk
	.long	0x0
	.long	0				# PointerToRelocations
	.long	0				# PointerToLineNumbers
	.word	0				# NumberOfRelocations
	.word	0				# NumberOfLineNumbers
	.long	0xc8000080			# Characteristics (section flags)

#endif /* CONFIG_EFI_STUB */

	# Kernel attributes; used by setup.  This is part 1 of the
+30 −8
Original line number Diff line number Diff line
@@ -143,7 +143,7 @@ static void usage(void)

#ifdef CONFIG_EFI_STUB

static void update_pecoff_section_header(char *section_name, u32 offset, u32 size)
static void update_pecoff_section_header_fields(char *section_name, u32 vma, u32 size, u32 datasz, u32 offset)
{
	unsigned int pe_header;
	unsigned short num_sections;
@@ -164,10 +164,10 @@ static void update_pecoff_section_header(char *section_name, u32 offset, u32 siz
			put_unaligned_le32(size, section + 0x8);

			/* section header vma field */
			put_unaligned_le32(offset, section + 0xc);
			put_unaligned_le32(vma, section + 0xc);

			/* section header 'size of initialised data' field */
			put_unaligned_le32(size, section + 0x10);
			put_unaligned_le32(datasz, section + 0x10);

			/* section header 'file offset' field */
			put_unaligned_le32(offset, section + 0x14);
@@ -179,6 +179,11 @@ static void update_pecoff_section_header(char *section_name, u32 offset, u32 siz
	}
}

static void update_pecoff_section_header(char *section_name, u32 offset, u32 size)
{
	update_pecoff_section_header_fields(section_name, offset, size, size, offset);
}

static void update_pecoff_setup_and_reloc(unsigned int size)
{
	u32 setup_offset = 0x200;
@@ -203,9 +208,6 @@ static void update_pecoff_text(unsigned int text_start, unsigned int file_sz)

	pe_header = get_unaligned_le32(&buf[0x3c]);

	/* Size of image */
	put_unaligned_le32(file_sz, &buf[pe_header + 0x50]);

	/*
	 * Size of code: Subtract the size of the first sector (512 bytes)
	 * which includes the header.
@@ -220,6 +222,22 @@ static void update_pecoff_text(unsigned int text_start, unsigned int file_sz)
	update_pecoff_section_header(".text", text_start, text_sz);
}

static void update_pecoff_bss(unsigned int file_sz, unsigned int init_sz)
{
	unsigned int pe_header;
	unsigned int bss_sz = init_sz - file_sz;

	pe_header = get_unaligned_le32(&buf[0x3c]);

	/* Size of uninitialized data */
	put_unaligned_le32(bss_sz, &buf[pe_header + 0x24]);

	/* Size of image */
	put_unaligned_le32(init_sz, &buf[pe_header + 0x50]);

	update_pecoff_section_header_fields(".bss", file_sz, bss_sz, 0, 0);
}

static int reserve_pecoff_reloc_section(int c)
{
	/* Reserve 0x20 bytes for .reloc section */
@@ -259,6 +277,8 @@ static void efi_stub_entry_update(void)
static inline void update_pecoff_setup_and_reloc(unsigned int size) {}
static inline void update_pecoff_text(unsigned int text_start,
				      unsigned int file_sz) {}
static inline void update_pecoff_bss(unsigned int file_sz,
				     unsigned int init_sz) {}
static inline void efi_stub_defaults(void) {}
static inline void efi_stub_entry_update(void) {}

@@ -310,7 +330,7 @@ static void parse_zoffset(char *fname)

int main(int argc, char ** argv)
{
	unsigned int i, sz, setup_sectors;
	unsigned int i, sz, setup_sectors, init_sz;
	int c;
	u32 sys_size;
	struct stat sb;
@@ -376,7 +396,9 @@ int main(int argc, char ** argv)
	buf[0x1f1] = setup_sectors-1;
	put_unaligned_le32(sys_size, &buf[0x1f4]);

	update_pecoff_text(setup_sectors * 512, sz + i + ((sys_size * 16) - sz));
	update_pecoff_text(setup_sectors * 512, i + (sys_size * 16));
	init_sz = get_unaligned_le32(&buf[0x260]);
	update_pecoff_bss(i + (sys_size * 16), init_sz);

	efi_stub_entry_update();

+0 −1
Original line number Diff line number Diff line
@@ -841,7 +841,6 @@ static int apm_do_idle(void)
	u32 eax;
	u8 ret = 0;
	int idled = 0;
	int polling;
	int err = 0;

	if (!need_resched()) {
+2 −3
Original line number Diff line number Diff line
@@ -175,7 +175,7 @@ void init_espfix_ap(void)
	if (!pud_present(pud)) {
		pmd_p = (pmd_t *)__get_free_page(PGALLOC_GFP);
		pud = __pud(__pa(pmd_p) | (PGTABLE_PROT & ptemask));
		paravirt_alloc_pud(&init_mm, __pa(pmd_p) >> PAGE_SHIFT);
		paravirt_alloc_pmd(&init_mm, __pa(pmd_p) >> PAGE_SHIFT);
		for (n = 0; n < ESPFIX_PUD_CLONES; n++)
			set_pud(&pud_p[n], pud);
	}
@@ -185,7 +185,7 @@ void init_espfix_ap(void)
	if (!pmd_present(pmd)) {
		pte_p = (pte_t *)__get_free_page(PGALLOC_GFP);
		pmd = __pmd(__pa(pte_p) | (PGTABLE_PROT & ptemask));
		paravirt_alloc_pmd(&init_mm, __pa(pte_p) >> PAGE_SHIFT);
		paravirt_alloc_pte(&init_mm, __pa(pte_p) >> PAGE_SHIFT);
		for (n = 0; n < ESPFIX_PMD_CLONES; n++)
			set_pmd(&pmd_p[n], pmd);
	}
@@ -193,7 +193,6 @@ void init_espfix_ap(void)
	pte_p = pte_offset_kernel(&pmd, addr);
	stack_page = (void *)__get_free_page(GFP_KERNEL);
	pte = __pte(__pa(stack_page) | (__PAGE_KERNEL_RO & ptemask));
	paravirt_alloc_pte(&init_mm, __pa(stack_page) >> PAGE_SHIFT);
	for (n = 0; n < ESPFIX_PTE_CLONES; n++)
		set_pte(&pte_p[n*PTE_STRIDE], pte);

Loading