Commit cd619387 authored by Ard Biesheuvel's avatar Ard Biesheuvel
Browse files

x86/efistub: Enable SMBIOS protocol handling for x86



The smbios.c source file is not currently included in the x86 build, and
before we can do so, it needs some tweaks to build correctly in
combination with the EFI mixed mode support.

Reviewed-by: default avatarLukas Wunner <lukas@wunner.de>
Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
parent 0dad9ee3
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -229,6 +229,7 @@ static inline bool efi_is_native(void)

static inline void *efi64_zero_upper(void *p)
{
	if (p)
		((u32 *)p)[1] = 0;
	return p;
}
@@ -315,6 +316,10 @@ static inline u32 efi64_convert_status(efi_status_t status)
#define __efi64_argmap_clear_memory_attributes(protocol, phys, size, flags) \
	((protocol), __efi64_split(phys), __efi64_split(size), __efi64_split(flags))

/* EFI SMBIOS protocol */
#define __efi64_argmap_get_next(protocol, smbioshandle, type, record, phandle) \
	((protocol), (smbioshandle), (type), efi64_zero_upper(record), \
	 efi64_zero_upper(phandle))
/*
 * The macros below handle the plumbing for the argument mapping. To add a
 * mapping for a specific EFI method, simply define a macro
+1 −1
Original line number Diff line number Diff line
@@ -76,7 +76,7 @@ lib-$(CONFIG_EFI_GENERIC_STUB) += efi-stub.o string.o intrinsics.o systable.o \

lib-$(CONFIG_ARM)		+= arm32-stub.o
lib-$(CONFIG_ARM64)		+= kaslr.o arm64.o arm64-stub.o smbios.o
lib-$(CONFIG_X86)		+= x86-stub.o
lib-$(CONFIG_X86)		+= x86-stub.o smbios.o
lib-$(CONFIG_X86_64)		+= x86-5lvl.o
lib-$(CONFIG_RISCV)		+= kaslr.o riscv.o riscv-stub.o
lib-$(CONFIG_LOONGARCH)		+= loongarch.o loongarch-stub.o
+25 −14
Original line number Diff line number Diff line
@@ -6,9 +6,10 @@

#include "efistub.h"

typedef struct efi_smbios_protocol efi_smbios_protocol_t;
typedef union efi_smbios_protocol efi_smbios_protocol_t;

struct efi_smbios_protocol {
union efi_smbios_protocol {
	struct {
		efi_status_t (__efiapi *add)(efi_smbios_protocol_t *, efi_handle_t,
					     u16 *, struct efi_smbios_record *);
		efi_status_t (__efiapi *update_string)(efi_smbios_protocol_t *, u16 *,
@@ -21,6 +22,16 @@ struct efi_smbios_protocol {
		u8 major_version;
		u8 minor_version;
	};
	struct {
		u32 add;
		u32 update_string;
		u32 remove;
		u32 get_next;

		u8 major_version;
		u8 minor_version;
	} mixed_mode;
};

const struct efi_smbios_record *efi_get_smbios_record(u8 type)
{
+2 −2
Original line number Diff line number Diff line
@@ -74,10 +74,10 @@ typedef void *efi_handle_t;
 */
typedef guid_t efi_guid_t __aligned(__alignof__(u32));

#define EFI_GUID(a, b, c, d...) (efi_guid_t){ {					\
#define EFI_GUID(a, b, c, d...) ((efi_guid_t){ {				\
	(a) & 0xff, ((a) >> 8) & 0xff, ((a) >> 16) & 0xff, ((a) >> 24) & 0xff,	\
	(b) & 0xff, ((b) >> 8) & 0xff,						\
	(c) & 0xff, ((c) >> 8) & 0xff, d } }
	(c) & 0xff, ((c) >> 8) & 0xff, d } })

/*
 * Generic EFI table header