Skip to content

Commit 4d0a438

Browse files
committed
Merge branch 'efi/urgent' into efi/core, to pick up fixes
These fixes missed the v5.9 merge window, pick them up for early v5.10 merge. Signed-off-by: Ingo Molnar <mingo@kernel.org>
2 parents cc383a9 + d32de91 commit 4d0a438

14 files changed

Lines changed: 88 additions & 123 deletions

File tree

Documentation/admin-guide/kernel-parameters.txt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1233,8 +1233,7 @@
12331233
efi= [EFI]
12341234
Format: { "debug", "disable_early_pci_dma",
12351235
"nochunk", "noruntime", "nosoftreserve",
1236-
"novamap", "no_disable_early_pci_dma",
1237-
"old_map" }
1236+
"novamap", "no_disable_early_pci_dma" }
12381237
debug: enable misc debug output.
12391238
disable_early_pci_dma: disable the busmaster bit on all
12401239
PCI bridges while in the EFI boot stub.
@@ -1251,8 +1250,6 @@
12511250
novamap: do not call SetVirtualAddressMap().
12521251
no_disable_early_pci_dma: Leave the busmaster bit set
12531252
on all PCI bridges while in the EFI boot stub
1254-
old_map [X86-64]: switch to the old ioremap-based EFI
1255-
runtime services mapping. [Needs CONFIG_X86_UV=y]
12561253

12571254
efi_no_storage_paranoia [EFI; X86]
12581255
Using this parameter you can use more than 50% of

arch/x86/include/asm/efi.h

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,8 @@ extern unsigned long efi_fw_vendor, efi_config_table;
8181
kernel_fpu_end(); \
8282
})
8383

84-
8584
#define arch_efi_call_virt(p, f, args...) p->f(args)
8685

87-
#define efi_ioremap(addr, size, type, attr) ioremap_cache(addr, size)
88-
8986
#else /* !CONFIG_X86_32 */
9087

9188
#define EFI_LOADER_SIGNATURE "EL64"
@@ -125,9 +122,6 @@ struct efi_scratch {
125122
kernel_fpu_end(); \
126123
})
127124

128-
extern void __iomem *__init efi_ioremap(unsigned long addr, unsigned long size,
129-
u32 type, u64 attribute);
130-
131125
#ifdef CONFIG_KASAN
132126
/*
133127
* CONFIG_KASAN may redefine memset to __memset. __memset function is present
@@ -143,17 +137,13 @@ extern void __iomem *__init efi_ioremap(unsigned long addr, unsigned long size,
143137
#endif /* CONFIG_X86_32 */
144138

145139
extern struct efi_scratch efi_scratch;
146-
extern void __init efi_set_executable(efi_memory_desc_t *md, bool executable);
147140
extern int __init efi_memblock_x86_reserve_range(void);
148141
extern void __init efi_print_memmap(void);
149-
extern void __init efi_memory_uc(u64 addr, unsigned long size);
150142
extern void __init efi_map_region(efi_memory_desc_t *md);
151143
extern void __init efi_map_region_fixed(efi_memory_desc_t *md);
152144
extern void efi_sync_low_kernel_mappings(void);
153145
extern int __init efi_alloc_page_tables(void);
154146
extern int __init efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages);
155-
extern void __init old_map_region(efi_memory_desc_t *md);
156-
extern void __init runtime_code_page_mkexec(void);
157147
extern void __init efi_runtime_update_mappings(void);
158148
extern void __init efi_dump_pagetable(void);
159149
extern void __init efi_apply_memmap_quirks(void);

arch/x86/platform/efi/efi.c

Lines changed: 0 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@
4949
#include <asm/efi.h>
5050
#include <asm/e820/api.h>
5151
#include <asm/time.h>
52-
#include <asm/set_memory.h>
5352
#include <asm/tlbflush.h>
5453
#include <asm/x86_init.h>
5554
#include <asm/uv/uv.h>
@@ -499,74 +498,6 @@ void __init efi_init(void)
499498
efi_print_memmap();
500499
}
501500

502-
#if defined(CONFIG_X86_32)
503-
504-
void __init efi_set_executable(efi_memory_desc_t *md, bool executable)
505-
{
506-
u64 addr, npages;
507-
508-
addr = md->virt_addr;
509-
npages = md->num_pages;
510-
511-
memrange_efi_to_native(&addr, &npages);
512-
513-
if (executable)
514-
set_memory_x(addr, npages);
515-
else
516-
set_memory_nx(addr, npages);
517-
}
518-
519-
void __init runtime_code_page_mkexec(void)
520-
{
521-
efi_memory_desc_t *md;
522-
523-
/* Make EFI runtime service code area executable */
524-
for_each_efi_memory_desc(md) {
525-
if (md->type != EFI_RUNTIME_SERVICES_CODE)
526-
continue;
527-
528-
efi_set_executable(md, true);
529-
}
530-
}
531-
532-
void __init efi_memory_uc(u64 addr, unsigned long size)
533-
{
534-
unsigned long page_shift = 1UL << EFI_PAGE_SHIFT;
535-
u64 npages;
536-
537-
npages = round_up(size, page_shift) / page_shift;
538-
memrange_efi_to_native(&addr, &npages);
539-
set_memory_uc(addr, npages);
540-
}
541-
542-
void __init old_map_region(efi_memory_desc_t *md)
543-
{
544-
u64 start_pfn, end_pfn, end;
545-
unsigned long size;
546-
void *va;
547-
548-
start_pfn = PFN_DOWN(md->phys_addr);
549-
size = md->num_pages << PAGE_SHIFT;
550-
end = md->phys_addr + size;
551-
end_pfn = PFN_UP(end);
552-
553-
if (pfn_range_is_mapped(start_pfn, end_pfn)) {
554-
va = __va(md->phys_addr);
555-
556-
if (!(md->attribute & EFI_MEMORY_WB))
557-
efi_memory_uc((u64)(unsigned long)va, size);
558-
} else
559-
va = efi_ioremap(md->phys_addr, size,
560-
md->type, md->attribute);
561-
562-
md->virt_addr = (u64) (unsigned long) va;
563-
if (!va)
564-
pr_err("ioremap of 0x%llX failed!\n",
565-
(unsigned long long)md->phys_addr);
566-
}
567-
568-
#endif
569-
570501
/* Merge contiguous regions of the same type and attribute */
571502
static void __init efi_merge_regions(void)
572503
{

arch/x86/platform/efi/efi_32.c

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,35 @@
2929
#include <asm/io.h>
3030
#include <asm/desc.h>
3131
#include <asm/page.h>
32+
#include <asm/set_memory.h>
3233
#include <asm/tlbflush.h>
3334
#include <asm/efi.h>
3435

36+
void __init efi_map_region(efi_memory_desc_t *md)
37+
{
38+
u64 start_pfn, end_pfn, end;
39+
unsigned long size;
40+
void *va;
41+
42+
start_pfn = PFN_DOWN(md->phys_addr);
43+
size = md->num_pages << PAGE_SHIFT;
44+
end = md->phys_addr + size;
45+
end_pfn = PFN_UP(end);
46+
47+
if (pfn_range_is_mapped(start_pfn, end_pfn)) {
48+
va = __va(md->phys_addr);
49+
50+
if (!(md->attribute & EFI_MEMORY_WB))
51+
set_memory_uc((unsigned long)va, md->num_pages);
52+
} else {
53+
va = ioremap_cache(md->phys_addr, size);
54+
}
55+
56+
md->virt_addr = (unsigned long)va;
57+
if (!va)
58+
pr_err("ioremap of 0x%llX failed!\n", md->phys_addr);
59+
}
60+
3561
/*
3662
* To make EFI call EFI runtime service in physical addressing mode we need
3763
* prolog/epilog before/after the invocation to claim the EFI runtime service
@@ -58,11 +84,6 @@ int __init efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages)
5884
return 0;
5985
}
6086

61-
void __init efi_map_region(efi_memory_desc_t *md)
62-
{
63-
old_map_region(md);
64-
}
65-
6687
void __init efi_map_region_fixed(efi_memory_desc_t *md) {}
6788
void __init parse_efi_setup(u64 phys_addr, u32 data_len) {}
6889

@@ -107,6 +128,15 @@ efi_status_t __init efi_set_virtual_address_map(unsigned long memory_map_size,
107128

108129
void __init efi_runtime_update_mappings(void)
109130
{
110-
if (__supported_pte_mask & _PAGE_NX)
111-
runtime_code_page_mkexec();
131+
if (__supported_pte_mask & _PAGE_NX) {
132+
efi_memory_desc_t *md;
133+
134+
/* Make EFI runtime service code area executable */
135+
for_each_efi_memory_desc(md) {
136+
if (md->type != EFI_RUNTIME_SERVICES_CODE)
137+
continue;
138+
139+
set_memory_x(md->virt_addr, md->num_pages);
140+
}
141+
}
112142
}

arch/x86/platform/efi/efi_64.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,8 @@ int __init efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages)
259259
npages = (__end_rodata - __start_rodata) >> PAGE_SHIFT;
260260
rodata = __pa(__start_rodata);
261261
pfn = rodata >> PAGE_SHIFT;
262+
263+
pf = _PAGE_NX | _PAGE_ENC;
262264
if (kernel_map_pages_in_pgd(pgd, pfn, rodata, npages, pf)) {
263265
pr_err("Failed to map kernel rodata 1:1\n");
264266
return 1;

drivers/firmware/efi/efi.c

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,7 @@ static int __init efisubsys_init(void)
384384
efi_kobj = kobject_create_and_add("efi", firmware_kobj);
385385
if (!efi_kobj) {
386386
pr_err("efi: Firmware registration failed.\n");
387+
destroy_workqueue(efi_rts_wq);
387388
return -ENOMEM;
388389
}
389390

@@ -427,6 +428,7 @@ static int __init efisubsys_init(void)
427428
generic_ops_unregister();
428429
err_put:
429430
kobject_put(efi_kobj);
431+
destroy_workqueue(efi_rts_wq);
430432
return error;
431433
}
432434

@@ -718,22 +720,22 @@ void __init efi_systab_report_header(const efi_table_hdr_t *systab_hdr,
718720
vendor);
719721
}
720722

721-
static __initdata char memory_type_name[][20] = {
723+
static __initdata char memory_type_name[][13] = {
722724
"Reserved",
723725
"Loader Code",
724726
"Loader Data",
725727
"Boot Code",
726728
"Boot Data",
727729
"Runtime Code",
728730
"Runtime Data",
729-
"Conventional Memory",
730-
"Unusable Memory",
731-
"ACPI Reclaim Memory",
732-
"ACPI Memory NVS",
733-
"Memory Mapped I/O",
734-
"MMIO Port Space",
731+
"Conventional",
732+
"Unusable",
733+
"ACPI Reclaim",
734+
"ACPI Mem NVS",
735+
"MMIO",
736+
"MMIO Port",
735737
"PAL Code",
736-
"Persistent Memory",
738+
"Persistent",
737739
};
738740

739741
char * __init efi_md_typeattr_format(char *buf, size_t size,
@@ -760,26 +762,27 @@ char * __init efi_md_typeattr_format(char *buf, size_t size,
760762
if (attr & ~(EFI_MEMORY_UC | EFI_MEMORY_WC | EFI_MEMORY_WT |
761763
EFI_MEMORY_WB | EFI_MEMORY_UCE | EFI_MEMORY_RO |
762764
EFI_MEMORY_WP | EFI_MEMORY_RP | EFI_MEMORY_XP |
763-
EFI_MEMORY_NV | EFI_MEMORY_SP |
765+
EFI_MEMORY_NV | EFI_MEMORY_SP | EFI_MEMORY_CPU_CRYPTO |
764766
EFI_MEMORY_RUNTIME | EFI_MEMORY_MORE_RELIABLE))
765767
snprintf(pos, size, "|attr=0x%016llx]",
766768
(unsigned long long)attr);
767769
else
768770
snprintf(pos, size,
769-
"|%3s|%2s|%2s|%2s|%2s|%2s|%2s|%2s|%3s|%2s|%2s|%2s|%2s]",
770-
attr & EFI_MEMORY_RUNTIME ? "RUN" : "",
771-
attr & EFI_MEMORY_MORE_RELIABLE ? "MR" : "",
772-
attr & EFI_MEMORY_SP ? "SP" : "",
773-
attr & EFI_MEMORY_NV ? "NV" : "",
774-
attr & EFI_MEMORY_XP ? "XP" : "",
775-
attr & EFI_MEMORY_RP ? "RP" : "",
776-
attr & EFI_MEMORY_WP ? "WP" : "",
777-
attr & EFI_MEMORY_RO ? "RO" : "",
778-
attr & EFI_MEMORY_UCE ? "UCE" : "",
779-
attr & EFI_MEMORY_WB ? "WB" : "",
780-
attr & EFI_MEMORY_WT ? "WT" : "",
781-
attr & EFI_MEMORY_WC ? "WC" : "",
782-
attr & EFI_MEMORY_UC ? "UC" : "");
771+
"|%3s|%2s|%2s|%2s|%2s|%2s|%2s|%2s|%2s|%3s|%2s|%2s|%2s|%2s]",
772+
attr & EFI_MEMORY_RUNTIME ? "RUN" : "",
773+
attr & EFI_MEMORY_MORE_RELIABLE ? "MR" : "",
774+
attr & EFI_MEMORY_CPU_CRYPTO ? "CC" : "",
775+
attr & EFI_MEMORY_SP ? "SP" : "",
776+
attr & EFI_MEMORY_NV ? "NV" : "",
777+
attr & EFI_MEMORY_XP ? "XP" : "",
778+
attr & EFI_MEMORY_RP ? "RP" : "",
779+
attr & EFI_MEMORY_WP ? "WP" : "",
780+
attr & EFI_MEMORY_RO ? "RO" : "",
781+
attr & EFI_MEMORY_UCE ? "UCE" : "",
782+
attr & EFI_MEMORY_WB ? "WB" : "",
783+
attr & EFI_MEMORY_WT ? "WT" : "",
784+
attr & EFI_MEMORY_WC ? "WC" : "",
785+
attr & EFI_MEMORY_UC ? "UC" : "");
783786
return buf;
784787
}
785788

drivers/firmware/efi/efibc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ static int __init efibc_init(void)
8484
{
8585
int ret;
8686

87-
if (!efi_enabled(EFI_RUNTIME_SERVICES))
87+
if (!efivars_kobject() || !efivar_supports_writes())
8888
return -ENODEV;
8989

9090
ret = register_reboot_notifier(&efibc_reboot_notifier);

drivers/firmware/efi/libstub/arm64-stub.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,12 @@ efi_status_t handle_kernel_image(unsigned long *image_addr,
6161
status = efi_get_random_bytes(sizeof(phys_seed),
6262
(u8 *)&phys_seed);
6363
if (status == EFI_NOT_FOUND) {
64-
efi_info("EFI_RNG_PROTOCOL unavailable, no randomness supplied\n");
64+
efi_info("EFI_RNG_PROTOCOL unavailable, KASLR will be disabled\n");
65+
efi_nokaslr = true;
6566
} else if (status != EFI_SUCCESS) {
66-
efi_err("efi_get_random_bytes() failed\n");
67-
return status;
67+
efi_err("efi_get_random_bytes() failed (0x%lx), KASLR will be disabled\n",
68+
status);
69+
efi_nokaslr = true;
6870
}
6971
} else {
7072
efi_info("KASLR disabled on kernel command line\n");

drivers/firmware/efi/libstub/efi-stub-helper.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,20 +187,28 @@ int efi_printk(const char *fmt, ...)
187187
*/
188188
efi_status_t efi_parse_options(char const *cmdline)
189189
{
190-
size_t len = strlen(cmdline) + 1;
190+
size_t len;
191191
efi_status_t status;
192192
char *str, *buf;
193193

194+
if (!cmdline)
195+
return EFI_SUCCESS;
196+
197+
len = strnlen(cmdline, COMMAND_LINE_SIZE - 1) + 1;
194198
status = efi_bs_call(allocate_pool, EFI_LOADER_DATA, len, (void **)&buf);
195199
if (status != EFI_SUCCESS)
196200
return status;
197201

198-
str = skip_spaces(memcpy(buf, cmdline, len));
202+
memcpy(buf, cmdline, len - 1);
203+
buf[len - 1] = '\0';
204+
str = skip_spaces(buf);
199205

200206
while (*str) {
201207
char *param, *val;
202208

203209
str = next_arg(str, &param, &val);
210+
if (!val && !strcmp(param, "--"))
211+
break;
204212

205213
if (!strcmp(param, "nokaslr")) {
206214
efi_nokaslr = true;

drivers/firmware/efi/libstub/fdt.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ static efi_status_t update_fdt(void *orig_fdt, unsigned long orig_fdt_size,
136136
if (status)
137137
goto fdt_set_fail;
138138

139-
if (IS_ENABLED(CONFIG_RANDOMIZE_BASE)) {
139+
if (IS_ENABLED(CONFIG_RANDOMIZE_BASE) && !efi_nokaslr) {
140140
efi_status_t efi_status;
141141

142142
efi_status = efi_get_random_bytes(sizeof(fdt_val64),
@@ -145,8 +145,6 @@ static efi_status_t update_fdt(void *orig_fdt, unsigned long orig_fdt_size,
145145
status = fdt_setprop_var(fdt, node, "kaslr-seed", fdt_val64);
146146
if (status)
147147
goto fdt_set_fail;
148-
} else if (efi_status != EFI_NOT_FOUND) {
149-
return efi_status;
150148
}
151149
}
152150

0 commit comments

Comments
 (0)