123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- // SPDX-License-Identifier: GPL-2.0-only
- // Copyright 2022 Google LLC
- // Author: Ard Biesheuvel <[email protected]>
- #include <linux/efi.h>
- #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;
- };
- const struct efi_smbios_record *efi_get_smbios_record(u8 type)
- {
- struct efi_smbios_record *record;
- efi_smbios_protocol_t *smbios;
- efi_status_t status;
- u16 handle = 0xfffe;
- status = efi_bs_call(locate_protocol, &EFI_SMBIOS_PROTOCOL_GUID, NULL,
- (void **)&smbios) ?:
- efi_call_proto(smbios, get_next, &handle, &type, &record, NULL);
- if (status != EFI_SUCCESS)
- return NULL;
- return record;
- }
- const u8 *__efi_get_smbios_string(const struct efi_smbios_record *record,
- u8 type, int offset, int recsize)
- {
- const u8 *strtable;
- if (!record)
- return NULL;
- strtable = (u8 *)record + record->length;
- for (int i = 1; i < ((u8 *)record)[offset]; i++) {
- int len = strlen(strtable);
- if (!len)
- return NULL;
- strtable += len + 1;
- }
- return strtable;
- }
|