mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-30 06:10:56 +00:00
x86/efi: Allow invocation of arbitrary runtime services
Provide the ability to perform mixed-mode runtime service calls for x86 in
the same way the following commit provided the ability to invoke for boot
services:
0a637ee612
("x86/efi: Allow invocation of arbitrary boot services")
Suggested-by: Lukas Wunner <lukas@wunner.de>
Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Matt Fleming <matt@codeblueprint.co.uk>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: linux-efi@vger.kernel.org
Link: http://lkml.kernel.org/r/1486380166-31868-2-git-send-email-ard.biesheuvel@linaro.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
87a8d03266
commit
a2cd2f3f29
4 changed files with 13 additions and 7 deletions
|
@ -32,6 +32,7 @@ static void setup_boot_services##bits(struct efi_config *c) \
|
|||
\
|
||||
table = (typeof(table))sys_table; \
|
||||
\
|
||||
c->runtime_services = table->runtime; \
|
||||
c->boot_services = table->boottime; \
|
||||
c->text_output = table->con_out; \
|
||||
}
|
||||
|
|
|
@ -82,7 +82,7 @@ ENTRY(efi_pe_entry)
|
|||
|
||||
/* Relocate efi_config->call() */
|
||||
leal efi32_config(%esi), %eax
|
||||
add %esi, 32(%eax)
|
||||
add %esi, 40(%eax)
|
||||
pushl %eax
|
||||
|
||||
call make_boot_params
|
||||
|
@ -108,7 +108,7 @@ ENTRY(efi32_stub_entry)
|
|||
|
||||
/* Relocate efi_config->call() */
|
||||
leal efi32_config(%esi), %eax
|
||||
add %esi, 32(%eax)
|
||||
add %esi, 40(%eax)
|
||||
pushl %eax
|
||||
2:
|
||||
call efi_main
|
||||
|
@ -264,7 +264,7 @@ relocated:
|
|||
#ifdef CONFIG_EFI_STUB
|
||||
.data
|
||||
efi32_config:
|
||||
.fill 4,8,0
|
||||
.fill 5,8,0
|
||||
.long efi_call_phys
|
||||
.long 0
|
||||
.byte 0
|
||||
|
|
|
@ -264,7 +264,7 @@ ENTRY(efi_pe_entry)
|
|||
/*
|
||||
* Relocate efi_config->call().
|
||||
*/
|
||||
addq %rbp, efi64_config+32(%rip)
|
||||
addq %rbp, efi64_config+40(%rip)
|
||||
|
||||
movq %rax, %rdi
|
||||
call make_boot_params
|
||||
|
@ -284,7 +284,7 @@ handover_entry:
|
|||
* Relocate efi_config->call().
|
||||
*/
|
||||
movq efi_config(%rip), %rax
|
||||
addq %rbp, 32(%rax)
|
||||
addq %rbp, 40(%rax)
|
||||
2:
|
||||
movq efi_config(%rip), %rdi
|
||||
call efi_main
|
||||
|
@ -456,14 +456,14 @@ efi_config:
|
|||
#ifdef CONFIG_EFI_MIXED
|
||||
.global efi32_config
|
||||
efi32_config:
|
||||
.fill 4,8,0
|
||||
.fill 5,8,0
|
||||
.quad efi64_thunk
|
||||
.byte 0
|
||||
#endif
|
||||
|
||||
.global efi64_config
|
||||
efi64_config:
|
||||
.fill 4,8,0
|
||||
.fill 5,8,0
|
||||
.quad efi_call
|
||||
.byte 1
|
||||
#endif /* CONFIG_EFI_STUB */
|
||||
|
|
|
@ -191,6 +191,7 @@ static inline efi_status_t efi_thunk_set_virtual_address_map(
|
|||
struct efi_config {
|
||||
u64 image_handle;
|
||||
u64 table;
|
||||
u64 runtime_services;
|
||||
u64 boot_services;
|
||||
u64 text_output;
|
||||
efi_status_t (*call)(unsigned long, ...);
|
||||
|
@ -226,6 +227,10 @@ static inline bool efi_is_64bit(void)
|
|||
#define __efi_call_early(f, ...) \
|
||||
__efi_early()->call((unsigned long)f, __VA_ARGS__);
|
||||
|
||||
#define efi_call_runtime(f, ...) \
|
||||
__efi_early()->call(efi_table_attr(efi_runtime_services, f, \
|
||||
__efi_early()->runtime_services), __VA_ARGS__)
|
||||
|
||||
extern bool efi_reboot_required(void);
|
||||
|
||||
#else
|
||||
|
|
Loading…
Reference in a new issue