mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-15 11:06:43 +07:00
efi/libstub: Get rid of 'sys_table_arg' macro parameter
The efi_call macros on ARM have a dependency on a variable 'sys_table_arg' existing in the scope of the macro instantiation. Since this variable always points to the same data structure, let's create a global getter for it and use that instead. Note that the use of a global variable with external linkage is avoided, given the problems we had in the past with early processing of the GOT tables. While at it, drop the redundant casts in the efi_table_attr and efi_call_proto macros. Signed-off-by: Ard Biesheuvel <ardb@kernel.org> Cc: Arvind Sankar <nivedita@alum.mit.edu> Cc: Borislav Petkov <bp@alien8.de> Cc: James Morse <james.morse@arm.com> Cc: Matt Fleming <matt@codeblueprint.co.uk> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: linux-efi@vger.kernel.org Link: https://lkml.kernel.org/r/20191224151025.32482-16-ardb@kernel.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
14e900c7e4
commit
2fcdad2a80
@ -50,15 +50,15 @@ void efi_virtmap_unload(void);
|
|||||||
|
|
||||||
/* arch specific definitions used by the stub code */
|
/* arch specific definitions used by the stub code */
|
||||||
|
|
||||||
#define efi_call_early(f, ...) sys_table_arg->boottime->f(__VA_ARGS__)
|
#define efi_call_early(f, ...) efi_system_table()->boottime->f(__VA_ARGS__)
|
||||||
#define efi_call_runtime(f, ...) sys_table_arg->runtime->f(__VA_ARGS__)
|
#define efi_call_runtime(f, ...) efi_system_table()->runtime->f(__VA_ARGS__)
|
||||||
#define efi_is_native() (true)
|
#define efi_is_native() (true)
|
||||||
|
|
||||||
#define efi_table_attr(table, attr, instance) \
|
#define efi_table_attr(table, attr, instance) \
|
||||||
((table##_t *)instance)->attr
|
instance->attr
|
||||||
|
|
||||||
#define efi_call_proto(protocol, f, instance, ...) \
|
#define efi_call_proto(protocol, f, instance, ...) \
|
||||||
((protocol##_t *)instance)->f(instance, ##__VA_ARGS__)
|
instance->f(instance, ##__VA_ARGS__)
|
||||||
|
|
||||||
struct screen_info *alloc_screen_info(efi_system_table_t *sys_table_arg);
|
struct screen_info *alloc_screen_info(efi_system_table_t *sys_table_arg);
|
||||||
void free_screen_info(efi_system_table_t *sys_table, struct screen_info *si);
|
void free_screen_info(efi_system_table_t *sys_table, struct screen_info *si);
|
||||||
|
@ -93,15 +93,15 @@ static inline unsigned long efi_get_max_initrd_addr(unsigned long dram_base,
|
|||||||
return (image_addr & ~(SZ_1G - 1UL)) + (1UL << (VA_BITS_MIN - 1));
|
return (image_addr & ~(SZ_1G - 1UL)) + (1UL << (VA_BITS_MIN - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
#define efi_call_early(f, ...) sys_table_arg->boottime->f(__VA_ARGS__)
|
#define efi_call_early(f, ...) efi_system_table()->boottime->f(__VA_ARGS__)
|
||||||
#define efi_call_runtime(f, ...) sys_table_arg->runtime->f(__VA_ARGS__)
|
#define efi_call_runtime(f, ...) efi_system_table()->runtime->f(__VA_ARGS__)
|
||||||
#define efi_is_native() (true)
|
#define efi_is_native() (true)
|
||||||
|
|
||||||
#define efi_table_attr(table, attr, instance) \
|
#define efi_table_attr(table, attr, instance) \
|
||||||
((table##_t *)instance)->attr
|
instance->attr
|
||||||
|
|
||||||
#define efi_call_proto(protocol, f, instance, ...) \
|
#define efi_call_proto(protocol, f, instance, ...) \
|
||||||
((protocol##_t *)instance)->f(instance, ##__VA_ARGS__)
|
instance->f(instance, ##__VA_ARGS__)
|
||||||
|
|
||||||
#define alloc_screen_info(x...) &screen_info
|
#define alloc_screen_info(x...) &screen_info
|
||||||
|
|
||||||
|
@ -27,6 +27,11 @@ __pure const struct efi_config *__efi_early(void)
|
|||||||
return efi_early;
|
return efi_early;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__pure efi_system_table_t *efi_system_table(void)
|
||||||
|
{
|
||||||
|
return sys_table;
|
||||||
|
}
|
||||||
|
|
||||||
#define BOOT_SERVICES(bits) \
|
#define BOOT_SERVICES(bits) \
|
||||||
static void setup_boot_services##bits(struct efi_config *c) \
|
static void setup_boot_services##bits(struct efi_config *c) \
|
||||||
{ \
|
{ \
|
||||||
|
@ -37,6 +37,13 @@
|
|||||||
|
|
||||||
static u64 virtmap_base = EFI_RT_VIRTUAL_BASE;
|
static u64 virtmap_base = EFI_RT_VIRTUAL_BASE;
|
||||||
|
|
||||||
|
static efi_system_table_t *__section(.data) sys_table;
|
||||||
|
|
||||||
|
__pure efi_system_table_t *efi_system_table(void)
|
||||||
|
{
|
||||||
|
return sys_table;
|
||||||
|
}
|
||||||
|
|
||||||
void efi_char16_printk(efi_system_table_t *sys_table_arg,
|
void efi_char16_printk(efi_system_table_t *sys_table_arg,
|
||||||
efi_char16_t *str)
|
efi_char16_t *str)
|
||||||
{
|
{
|
||||||
@ -110,7 +117,7 @@ efi_status_t handle_kernel_image(efi_system_table_t *sys_table,
|
|||||||
* for both archictectures, with the arch-specific code provided in the
|
* for both archictectures, with the arch-specific code provided in the
|
||||||
* handle_kernel_image() function.
|
* handle_kernel_image() function.
|
||||||
*/
|
*/
|
||||||
unsigned long efi_entry(void *handle, efi_system_table_t *sys_table,
|
unsigned long efi_entry(void *handle, efi_system_table_t *sys_table_arg,
|
||||||
unsigned long *image_addr)
|
unsigned long *image_addr)
|
||||||
{
|
{
|
||||||
efi_loaded_image_t *image;
|
efi_loaded_image_t *image;
|
||||||
@ -131,6 +138,8 @@ unsigned long efi_entry(void *handle, efi_system_table_t *sys_table,
|
|||||||
enum efi_secureboot_mode secure_boot;
|
enum efi_secureboot_mode secure_boot;
|
||||||
struct screen_info *si;
|
struct screen_info *si;
|
||||||
|
|
||||||
|
sys_table = sys_table_arg;
|
||||||
|
|
||||||
/* Check if we were booted by the EFI firmware */
|
/* Check if we were booted by the EFI firmware */
|
||||||
if (sys_table->hdr.signature != EFI_SYSTEM_TABLE_SIGNATURE)
|
if (sys_table->hdr.signature != EFI_SYSTEM_TABLE_SIGNATURE)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -29,6 +29,8 @@ extern int __pure nokaslr(void);
|
|||||||
extern int __pure is_quiet(void);
|
extern int __pure is_quiet(void);
|
||||||
extern int __pure novamap(void);
|
extern int __pure novamap(void);
|
||||||
|
|
||||||
|
extern __pure efi_system_table_t *efi_system_table(void);
|
||||||
|
|
||||||
#define pr_efi(sys_table, msg) do { \
|
#define pr_efi(sys_table, msg) do { \
|
||||||
if (!is_quiet()) efi_printk(sys_table, "EFI stub: "msg); \
|
if (!is_quiet()) efi_printk(sys_table, "EFI stub: "msg); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
@ -10,6 +10,8 @@
|
|||||||
#include <asm/efi.h>
|
#include <asm/efi.h>
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
|
|
||||||
|
#include "efistub.h"
|
||||||
|
|
||||||
static void find_bits(unsigned long mask, u8 *pos, u8 *size)
|
static void find_bits(unsigned long mask, u8 *pos, u8 *size)
|
||||||
{
|
{
|
||||||
u8 first, len;
|
u8 first, len;
|
||||||
|
Loading…
Reference in New Issue
Block a user