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

Commit a2cd2f3f authored by David Howells's avatar David Howells Committed by Ingo Molnar
Browse files

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:

  0a637ee6 ("x86/efi: Allow invocation of arbitrary boot services")

Suggested-by: default avatarLukas Wunner <lukas@wunner.de>
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
Signed-off-by: default avatarArd 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: default avatarIngo Molnar <mingo@kernel.org>
parent 87a8d032
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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;				\
}
+3 −3
Original line number Diff line number Diff line
@@ -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
+4 −4
Original line number Diff line number Diff line
@@ -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 */
+5 −0
Original line number Diff line number Diff line
@@ -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