Skip to content

Commit

Permalink
x86/efistub: Enable SMBIOS protocol handling for x86
Browse files Browse the repository at this point in the history
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: Lukas Wunner <[email protected]>
Signed-off-by: Ard Biesheuvel <[email protected]>
  • Loading branch information
ardbiesheuvel committed Jul 8, 2024
1 parent 0dad9ee commit cd61938
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 18 deletions.
7 changes: 6 additions & 1 deletion arch/x86/include/asm/efi.h
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,8 @@ static inline bool efi_is_native(void)

static inline void *efi64_zero_upper(void *p)
{
((u32 *)p)[1] = 0;
if (p)
((u32 *)p)[1] = 0;
return p;
}

Expand Down Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion drivers/firmware/efi/libstub/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
39 changes: 25 additions & 14 deletions drivers/firmware/efi/libstub/smbios.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,31 @@

#include "efistub.h"

typedef struct efi_smbios_protocol efi_smbios_protocol_t;

struct efi_smbios_protocol {
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 *,
unsigned long *, u8 *);
efi_status_t (__efiapi *remove)(efi_smbios_protocol_t *, u16);
efi_status_t (__efiapi *get_next)(efi_smbios_protocol_t *, u16 *, u8 *,
struct efi_smbios_record **,
efi_handle_t *);

u8 major_version;
u8 minor_version;
typedef union efi_smbios_protocol efi_smbios_protocol_t;

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 *,
unsigned long *, u8 *);
efi_status_t (__efiapi *remove)(efi_smbios_protocol_t *, u16);
efi_status_t (__efiapi *get_next)(efi_smbios_protocol_t *, u16 *, u8 *,
struct efi_smbios_record **,
efi_handle_t *);

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)
Expand Down
4 changes: 2 additions & 2 deletions include/linux/efi.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit cd61938

Please sign in to comment.