Skip to content

Commit a776c27

Browse files
committed
Merge branch 'efi-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull EFI updates from Ingo Molnar: "The EFI changes in this cycle are much larger than usual, for two (positive) reasons: - The GRUB project is showing signs of life again, resulting in the introduction of the generic Linux/UEFI boot protocol, instead of x86 specific hacks which are increasingly difficult to maintain. There's hope that all future extensions will now go through that boot protocol. - Preparatory work for RISC-V EFI support. The main changes are: - Boot time GDT handling changes - Simplify handling of EFI properties table on arm64 - Generic EFI stub cleanups, to improve command line handling, file I/O, memory allocation, etc. - Introduce a generic initrd loading method based on calling back into the firmware, instead of relying on the x86 EFI handover protocol or device tree. - Introduce a mixed mode boot method that does not rely on the x86 EFI handover protocol either, and could potentially be adopted by other architectures (if another one ever surfaces where one execution mode is a superset of another) - Clean up the contents of 'struct efi', and move out everything that doesn't need to be stored there. - Incorporate support for UEFI spec v2.8A changes that permit firmware implementations to return EFI_UNSUPPORTED from UEFI runtime services at OS runtime, and expose a mask of which ones are supported or unsupported via a configuration table. - Partial fix for the lack of by-VA cache maintenance in the decompressor on 32-bit ARM. - Changes to load device firmware from EFI boot service memory regions - Various documentation updates and minor code cleanups and fixes" * 'efi-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (114 commits) efi/libstub/arm: Fix spurious message that an initrd was loaded efi/libstub/arm64: Avoid image_base value from efi_loaded_image partitions/efi: Fix partition name parsing in GUID partition entry efi/x86: Fix cast of image argument efi/libstub/x86: Use ULONG_MAX as upper bound for all allocations efi: Fix a mistype in comments mentioning efivar_entry_iter_begin() efi/libstub: Avoid linking libstub/lib-ksyms.o into vmlinux efi/x86: Preserve %ebx correctly in efi_set_virtual_address_map() efi/x86: Ignore the memory attributes table on i386 efi/x86: Don't relocate the kernel unless necessary efi/x86: Remove extra headroom for setup block efi/x86: Add kernel preferred address to PE header efi/x86: Decompress at start of PE image load address x86/boot/compressed/32: Save the output address instead of recalculating it efi/libstub/x86: Deal with exit() boot service returning x86/boot: Use unsigned comparison for addresses efi/x86: Avoid using code32_start efi/x86: Make efi32_pe_entry() more readable efi/x86: Respect 32-bit ABI in efi32_pe_entry() efi/x86: Annotate the LOADED_IMAGE_PROTOCOL_GUID with SYM_DATA ...
2 parents 7c4fa15 + 594e576 commit a776c27

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

73 files changed

+2933
-2685
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
.. SPDX-License-Identifier: GPL-2.0
2+
3+
============
4+
UEFI Support
5+
============
6+
7+
UEFI stub library functions
8+
===========================
9+
10+
.. kernel-doc:: drivers/firmware/efi/libstub/mem.c
11+
:internal:

Documentation/driver-api/firmware/index.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Linux Firmware API
66

77
introduction
88
core
9+
efi/index
910
request_firmware
1011
other_interfaces
1112

Documentation/x86/boot.rst

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -490,15 +490,11 @@ Protocol: 2.00+
490490
kernel) to not write early messages that require
491491
accessing the display hardware directly.
492492

493-
Bit 6 (write): KEEP_SEGMENTS
493+
Bit 6 (obsolete): KEEP_SEGMENTS
494494

495495
Protocol: 2.07+
496496

497-
- If 0, reload the segment registers in the 32bit entry point.
498-
- If 1, do not reload the segment registers in the 32bit entry point.
499-
500-
Assume that %cs %ds %ss %es are all set to flat segments with
501-
a base of 0 (or the equivalent for their environment).
497+
- This flag is obsolete.
502498

503499
Bit 7 (write): CAN_USE_HEAP
504500

MAINTAINERS

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6363,7 +6363,6 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/efi/efi.git
63636363
S: Maintained
63646364
F: Documentation/admin-guide/efi-stub.rst
63656365
F: arch/*/kernel/efi.c
6366-
F: arch/x86/boot/compressed/eboot.[ch]
63676366
F: arch/*/include/asm/efi.h
63686367
F: arch/x86/platform/efi/
63696368
F: drivers/firmware/efi/

arch/arm/boot/compressed/efi-header.S

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ optional_header:
6060
.long __pecoff_code_size @ SizeOfCode
6161
.long __pecoff_data_size @ SizeOfInitializedData
6262
.long 0 @ SizeOfUninitializedData
63-
.long efi_stub_entry - start @ AddressOfEntryPoint
63+
.long efi_entry - start @ AddressOfEntryPoint
6464
.long start_offset @ BaseOfCode
6565
.long __pecoff_data_start - start @ BaseOfData
6666

@@ -70,8 +70,8 @@ extra_header_fields:
7070
.long SZ_512 @ FileAlignment
7171
.short 0 @ MajorOsVersion
7272
.short 0 @ MinorOsVersion
73-
.short 0 @ MajorImageVersion
74-
.short 0 @ MinorImageVersion
73+
.short LINUX_EFISTUB_MAJOR_VERSION @ MajorImageVersion
74+
.short LINUX_EFISTUB_MINOR_VERSION @ MinorImageVersion
7575
.short 0 @ MajorSubsystemVersion
7676
.short 0 @ MinorSubsystemVersion
7777
.long 0 @ Win32VersionValue

arch/arm/boot/compressed/head.S

Lines changed: 23 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1437,29 +1437,25 @@ __enter_kernel:
14371437
reloc_code_end:
14381438

14391439
#ifdef CONFIG_EFI_STUB
1440-
.align 2
1441-
_start: .long start - .
1442-
1443-
ENTRY(efi_stub_entry)
1444-
@ allocate space on stack for passing current zImage address
1445-
@ and for the EFI stub to return of new entry point of
1446-
@ zImage, as EFI stub may copy the kernel. Pointer address
1447-
@ is passed in r2. r0 and r1 are passed through from the
1448-
@ EFI firmware to efi_entry
1449-
adr ip, _start
1450-
ldr r3, [ip]
1451-
add r3, r3, ip
1452-
stmfd sp!, {r3, lr}
1453-
mov r2, sp @ pass zImage address in r2
1454-
bl efi_entry
1455-
1456-
@ Check for error return from EFI stub. r0 has FDT address
1457-
@ or error code.
1458-
cmn r0, #1
1459-
beq efi_load_fail
1460-
1461-
@ Preserve return value of efi_entry() in r4
1462-
mov r4, r0
1440+
ENTRY(efi_enter_kernel)
1441+
mov r7, r0 @ preserve image base
1442+
mov r4, r1 @ preserve DT pointer
1443+
1444+
mov r0, r4 @ DT start
1445+
add r1, r4, r2 @ DT end
1446+
bl cache_clean_flush
1447+
1448+
mov r0, r7 @ relocated zImage
1449+
ldr r1, =_edata @ size of zImage
1450+
add r1, r1, r0 @ end of zImage
1451+
bl cache_clean_flush
1452+
1453+
@ The PE/COFF loader might not have cleaned the code we are
1454+
@ running beyond the PoU, and so calling cache_off below from
1455+
@ inside the PE/COFF loader allocated region is unsafe unless
1456+
@ we explicitly clean it to the PoC.
1457+
adr r0, call_cache_fn @ region of code we will
1458+
adr r1, 0f @ run with MMU off
14631459
bl cache_clean_flush
14641460
bl cache_off
14651461

@@ -1469,18 +1465,10 @@ ENTRY(efi_stub_entry)
14691465
mov r0, #0
14701466
mov r1, #0xFFFFFFFF
14711467
mov r2, r4
1472-
1473-
@ Branch to (possibly) relocated zImage that is in [sp]
1474-
ldr lr, [sp]
1475-
ldr ip, =start_offset
1476-
add lr, lr, ip
1477-
mov pc, lr @ no mode switch
1478-
1479-
efi_load_fail:
1480-
@ Return EFI_LOAD_ERROR to EFI firmware on error.
1481-
ldr r0, =0x80000001
1482-
ldmfd sp!, {ip, pc}
1483-
ENDPROC(efi_stub_entry)
1468+
add r7, r7, #(__efi_start - start)
1469+
mov pc, r7 @ no mode switch
1470+
ENDPROC(efi_enter_kernel)
1471+
0:
14841472
#endif
14851473

14861474
.align

arch/arm64/include/asm/efi.h

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,6 @@ efi_status_t __efi_rt_asm_wrapper(void *, const char *, ...);
5757

5858
/* arch specific definitions used by the stub code */
5959

60-
/*
61-
* AArch64 requires the DTB to be 8-byte aligned in the first 512MiB from
62-
* start of kernel and may not cross a 2MiB boundary. We set alignment to
63-
* 2MiB so we know it won't cross a 2MiB boundary.
64-
*/
65-
#define EFI_FDT_ALIGN SZ_2M /* used by allocate_new_fdt_and_exit_boot() */
66-
6760
/*
6861
* In some configurations (e.g. VMAP_STACK && 64K pages), stacks built into the
6962
* kernel need greater alignment than we require the segments to be padded to.
@@ -107,9 +100,6 @@ static inline void free_screen_info(struct screen_info *si)
107100
{
108101
}
109102

110-
/* redeclare as 'hidden' so the compiler will generate relative references */
111-
extern struct screen_info screen_info __attribute__((__visibility__("hidden")));
112-
113103
static inline void efifb_setup_from_dmi(struct screen_info *si, const char *opt)
114104
{
115105
}

arch/arm64/kernel/efi-entry.S

Lines changed: 19 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -10,81 +10,35 @@
1010

1111
#include <asm/assembler.h>
1212

13-
#define EFI_LOAD_ERROR 0x8000000000000001
14-
1513
__INIT
1614

17-
/*
18-
* We arrive here from the EFI boot manager with:
19-
*
20-
* * CPU in little-endian mode
21-
* * MMU on with identity-mapped RAM
22-
* * Icache and Dcache on
23-
*
24-
* We will most likely be running from some place other than where
25-
* we want to be. The kernel image wants to be placed at TEXT_OFFSET
26-
* from start of RAM.
27-
*/
28-
ENTRY(entry)
29-
/*
30-
* Create a stack frame to save FP/LR with extra space
31-
* for image_addr variable passed to efi_entry().
32-
*/
33-
stp x29, x30, [sp, #-32]!
34-
mov x29, sp
35-
36-
/*
37-
* Call efi_entry to do the real work.
38-
* x0 and x1 are already set up by firmware. Current runtime
39-
* address of image is calculated and passed via *image_addr.
40-
*
41-
* unsigned long efi_entry(void *handle,
42-
* efi_system_table_t *sys_table,
43-
* unsigned long *image_addr) ;
44-
*/
45-
adr_l x8, _text
46-
add x2, sp, 16
47-
str x8, [x2]
48-
bl efi_entry
49-
cmn x0, #1
50-
b.eq efi_load_fail
51-
15+
SYM_CODE_START(efi_enter_kernel)
5216
/*
5317
* efi_entry() will have copied the kernel image if necessary and we
54-
* return here with device tree address in x0 and the kernel entry
55-
* point stored at *image_addr. Save those values in registers which
56-
* are callee preserved.
57-
*/
58-
mov x20, x0 // DTB address
59-
ldr x0, [sp, #16] // relocated _text address
60-
ldr w21, =stext_offset
61-
add x21, x0, x21
62-
63-
/*
64-
* Calculate size of the kernel Image (same for original and copy).
18+
* end up here with device tree address in x1 and the kernel entry
19+
* point stored in x0. Save those values in registers which are
20+
* callee preserved.
6521
*/
66-
adr_l x1, _text
67-
adr_l x2, _edata
68-
sub x1, x2, x1
22+
ldr w2, =stext_offset
23+
add x19, x0, x2 // relocated Image entrypoint
24+
mov x20, x1 // DTB address
6925

7026
/*
71-
* Flush the copied Image to the PoC, and ensure it is not shadowed by
27+
* Clean the copied Image to the PoC, and ensure it is not shadowed by
7228
* stale icache entries from before relocation.
7329
*/
74-
bl __flush_dcache_area
30+
ldr w1, =kernel_size
31+
bl __clean_dcache_area_poc
7532
ic ialluis
7633

7734
/*
78-
* Ensure that the rest of this function (in the original Image) is
79-
* visible when the caches are disabled. The I-cache can't have stale
80-
* entries for the VA range of the current image, so no maintenance is
81-
* necessary.
35+
* Clean the remainder of this routine to the PoC
36+
* so that we can safely disable the MMU and caches.
8237
*/
83-
adr x0, entry
84-
adr x1, entry_end
85-
sub x1, x1, x0
86-
bl __flush_dcache_area
87-
38+
adr x0, 0f
39+
ldr w1, 3f
40+
bl __clean_dcache_area_poc
41+
0:
8842
/* Turn off Dcache and MMU */
8943
mrs x0, CurrentEL
9044
cmp x0, #CurrentEL_EL2
@@ -109,12 +63,6 @@ ENTRY(entry)
10963
mov x1, xzr
11064
mov x2, xzr
11165
mov x3, xzr
112-
br x21
113-
114-
efi_load_fail:
115-
mov x0, #EFI_LOAD_ERROR
116-
ldp x29, x30, [sp], #32
117-
ret
118-
119-
entry_end:
120-
ENDPROC(entry)
66+
br x19
67+
SYM_CODE_END(efi_enter_kernel)
68+
3: .long . - 0b

arch/arm64/kernel/efi-header.S

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ optional_header:
2727
.long __initdata_begin - efi_header_end // SizeOfCode
2828
.long __pecoff_data_size // SizeOfInitializedData
2929
.long 0 // SizeOfUninitializedData
30-
.long __efistub_entry - _head // AddressOfEntryPoint
30+
.long __efistub_efi_entry - _head // AddressOfEntryPoint
3131
.long efi_header_end - _head // BaseOfCode
3232

3333
extra_header_fields:
@@ -36,8 +36,8 @@ extra_header_fields:
3636
.long PECOFF_FILE_ALIGNMENT // FileAlignment
3737
.short 0 // MajorOperatingSystemVersion
3838
.short 0 // MinorOperatingSystemVersion
39-
.short 0 // MajorImageVersion
40-
.short 0 // MinorImageVersion
39+
.short LINUX_EFISTUB_MAJOR_VERSION // MajorImageVersion
40+
.short LINUX_EFISTUB_MINOR_VERSION // MinorImageVersion
4141
.short 0 // MajorSubsystemVersion
4242
.short 0 // MinorSubsystemVersion
4343
.long 0 // Win32VersionValue

arch/arm64/kernel/image-vars.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212

1313
#ifdef CONFIG_EFI
1414

15-
__efistub_stext_offset = stext - _text;
15+
__efistub_kernel_size = _edata - _text;
16+
__efistub_stext_offset = stext - _text;
17+
1618

1719
/*
1820
* The EFI stub has its own symbol namespace prefixed by __efistub_, to
@@ -33,7 +35,7 @@ __efistub_strnlen = __pi_strnlen;
3335
__efistub_strcmp = __pi_strcmp;
3436
__efistub_strncmp = __pi_strncmp;
3537
__efistub_strrchr = __pi_strrchr;
36-
__efistub___flush_dcache_area = __pi___flush_dcache_area;
38+
__efistub___clean_dcache_area_poc = __pi___clean_dcache_area_poc;
3739

3840
#ifdef CONFIG_KASAN
3941
__efistub___memcpy = __pi_memcpy;
@@ -45,6 +47,7 @@ __efistub__text = _text;
4547
__efistub__end = _end;
4648
__efistub__edata = _edata;
4749
__efistub_screen_info = screen_info;
50+
__efistub__ctype = _ctype;
4851

4952
#endif
5053

0 commit comments

Comments
 (0)