Skip to content

Commit

Permalink
efi/libstub: x86/mixed: increase supported argument count
Browse files Browse the repository at this point in the history
Increase the number of arguments supported by mixed mode calls, so that
we will be able to call into the TCG2 protocol to measure the initrd
and extend the associated PCR. This involves the TCG2 protocol's
hash_log_extend_event() method, which takes five arguments, three of
which are u64 and need to be split, producing a total of 8 outgoing

Signed-off-by: Ard Biesheuvel <[email protected]>
Signed-off-by: Ilias Apalodimas <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Ard Biesheuvel <[email protected]>
  • Loading branch information
ardbiesheuvel committed Nov 21, 2021
1 parent 4da87c5 commit 44f155b
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 9 deletions.
14 changes: 11 additions & 3 deletions arch/x86/boot/compressed/efi_thunk_64.S
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,18 @@ SYM_FUNC_START(__efi64_thunk)
push %rbp
push %rbx

leaq 1f(%rip), %rbp

movl %ds, %eax
push %rax
movl %es, %eax
push %rax
movl %ss, %eax
push %rax

/* Copy args passed on stack */
movq 0x30(%rsp), %rbp
movq 0x38(%rsp), %rbx
movq 0x40(%rsp), %rax

/*
* Convert x86-64 ABI params to i386 ABI
*/
Expand All @@ -44,13 +47,18 @@ SYM_FUNC_START(__efi64_thunk)
movl %ecx, 0x8(%rsp)
movl %r8d, 0xc(%rsp)
movl %r9d, 0x10(%rsp)
movl %ebp, 0x14(%rsp)
movl %ebx, 0x18(%rsp)
movl %eax, 0x1c(%rsp)

leaq 0x14(%rsp), %rbx
leaq 0x20(%rsp), %rbx
sgdt (%rbx)

addq $16, %rbx
sidt (%rbx)

leaq 1f(%rip), %rbp

/*
* Switch to IDT and GDT with 32-bit segments. This is the firmware GDT
* and IDT that was installed when the kernel started executing. The
Expand Down
10 changes: 6 additions & 4 deletions arch/x86/include/asm/efi.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,13 +46,14 @@ extern unsigned long efi_mixed_mode_stack_pa;

#define __efi_nargs(...) __efi_nargs_(__VA_ARGS__)
#define __efi_nargs_(...) __efi_nargs__(0, ##__VA_ARGS__, \
__efi_arg_sentinel(9), __efi_arg_sentinel(8), \
__efi_arg_sentinel(7), __efi_arg_sentinel(6), \
__efi_arg_sentinel(5), __efi_arg_sentinel(4), \
__efi_arg_sentinel(3), __efi_arg_sentinel(2), \
__efi_arg_sentinel(1), __efi_arg_sentinel(0))
#define __efi_nargs__(_0, _1, _2, _3, _4, _5, _6, _7, n, ...) \
#define __efi_nargs__(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, n, ...) \
__take_second_arg(n, \
({ BUILD_BUG_ON_MSG(1, "__efi_nargs limit exceeded"); 8; }))
({ BUILD_BUG_ON_MSG(1, "__efi_nargs limit exceeded"); 10; }))
#define __efi_arg_sentinel(n) , n

/*
Expand Down Expand Up @@ -176,8 +177,9 @@ extern u64 efi_setup;
extern efi_status_t __efi64_thunk(u32, ...);

#define efi64_thunk(...) ({ \
__efi_nargs_check(efi64_thunk, 6, __VA_ARGS__); \
__efi64_thunk(__VA_ARGS__); \
u64 __pad[3]; /* must have space for 3 args on the stack */ \
__efi_nargs_check(efi64_thunk, 9, __VA_ARGS__); \
__efi64_thunk(__VA_ARGS__, __pad); \
})

static inline bool efi_is_mixed(void)
Expand Down
14 changes: 12 additions & 2 deletions arch/x86/platform/efi/efi_thunk_64.S
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,17 @@ SYM_CODE_START(__efi64_thunk)
movq efi_mixed_mode_stack_pa(%rip), %rsp
push %rax

/*
* Copy args passed via the stack
*/
subq $0x24, %rsp
movq 0x18(%rax), %rbp
movq 0x20(%rax), %rbx
movq 0x28(%rax), %rax
movl %ebp, 0x18(%rsp)
movl %ebx, 0x1c(%rsp)
movl %eax, 0x20(%rsp)

/*
* Calculate the physical address of the kernel text.
*/
Expand All @@ -47,7 +58,6 @@ SYM_CODE_START(__efi64_thunk)
subq %rax, %rbp
subq %rax, %rbx

subq $28, %rsp
movl %ebx, 0x0(%rsp) /* return address */
movl %esi, 0x4(%rsp)
movl %edx, 0x8(%rsp)
Expand All @@ -60,7 +70,7 @@ SYM_CODE_START(__efi64_thunk)
pushq %rdi /* EFI runtime service address */
lretq

1: movq 24(%rsp), %rsp
1: movq 0x20(%rsp), %rsp
pop %rbx
pop %rbp
retq
Expand Down

0 comments on commit 44f155b

Please sign in to comment.