iPXE
efi_smbios.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2008 Michael Brown <mbrown@fensystems.co.uk>.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of the
7  * License, or any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17  * 02110-1301, USA.
18  */
19 
20 FILE_LICENCE ( GPL2_OR_LATER );
21 FILE_SECBOOT ( PERMITTED );
22 
23 #include <errno.h>
24 #include <ipxe/uaccess.h>
25 #include <ipxe/smbios.h>
26 #include <ipxe/efi/efi.h>
27 #include <ipxe/efi/Guid/SmBios.h>
28 
29 /** @file
30  *
31  * iPXE SMBIOS API for EFI
32  *
33  */
34 
35 /** SMBIOS configuration table */
36 static struct smbios_entry *smbios_entry;
37 EFI_USE_TABLE ( SMBIOS_TABLE, &smbios_entry, 0 );
38 
39 /** SMBIOS configuration table */
41 EFI_USE_TABLE ( SMBIOS3_TABLE, &smbios3_entry, 0 );
42 
43 /**
44  * Find SMBIOS
45  *
46  * @v smbios SMBIOS entry point descriptor structure to fill in
47  * @ret rc Return status code
48  */
49 static int efi_find_smbios ( struct smbios *smbios ) {
50 
51  /* Use 64-bit table if present */
53  smbios->address = phys_to_virt ( smbios3_entry->smbios_address );
55  smbios->count = 0;
56  smbios->version =
58  DBG ( "Found 64-bit SMBIOS v%d.%d entry point at %p (%lx+%zx)\n",
60  virt_to_phys ( smbios->address ), smbios->len );
61  return 0;
62  }
63 
64  /* Otherwise, use 32-bit table if present */
66  smbios->address = phys_to_virt ( smbios_entry->smbios_address );
69  smbios->version =
71  DBG ( "Found 32-bit SMBIOS v%d.%d entry point at %p (%lx+%zx)\n",
73  virt_to_phys ( smbios->address ), smbios->len );
74  return 0;
75  }
76 
77  DBG ( "No SMBIOS table provided\n" );
78  return -ENODEV;
79 }
80 
uint32_t signature
Signature.
Definition: smbios.h:55
#define SMBIOS_SIGNATURE
Signature for 32-bit SMBIOS entry point.
Definition: smbios.h:36
unsigned int count
Number of SMBIOS structures.
Definition: smbios.h:204
Error codes.
size_t len
Length of SMBIOS structures.
Definition: smbios.h:202
SMBIOS entry point descriptor.
Definition: smbios.h:198
#define SMBIOS3_SIGNATURE
Signature for 64-bit SMBIOS entry point.
Definition: smbios.h:40
int find_smbios(struct smbios *smbios)
uint16_t version
SMBIOS version.
Definition: smbios.h:206
PROVIDE_SMBIOS(efi, find_smbios, efi_find_smbios)
uint16_t smbios_len
Structure table length.
Definition: smbios.h:75
Access to external ("user") memory.
uint32_t signature
Signature.
Definition: smbios.h:96
SMBIOS 32-bit entry point.
Definition: smbios.h:50
uint32_t smbios_address
Structure table address.
Definition: smbios.h:77
#define SMBIOS_VERSION(major, minor)
Calculate SMBIOS version.
Definition: smbios.h:216
static struct smbios_entry * smbios_entry
SMBIOS configuration table.
Definition: efi_smbios.c:36
const void * address
Start of SMBIOS structures.
Definition: smbios.h:200
#define ENODEV
No such device.
Definition: errno.h:510
FILE_SECBOOT(PERMITTED)
EFI_USE_TABLE(SMBIOS_TABLE, &smbios_entry, 0)
FILE_LICENCE(GPL2_OR_LATER)
uint16_t smbios_count
Number of SMBIOS structures.
Definition: smbios.h:79
EFI API.
System Management BIOS.
static int efi_find_smbios(struct smbios *smbios)
Find SMBIOS.
Definition: efi_smbios.c:49
uint8_t minor
Minor version.
Definition: smbios.h:63
GUIDs used to locate the SMBIOS tables in the UEFI 2.5 system table.
uint8_t minor
Minor version.
Definition: smbios.h:106
uint32_t smbios_len
Structure table length.
Definition: smbios.h:114
uint64_t smbios_address
Structure table address.
Definition: smbios.h:116
static struct smbios3_entry * smbios3_entry
SMBIOS configuration table.
Definition: efi_smbios.c:40
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
uint8_t major
Major version.
Definition: smbios.h:61
uint8_t major
Major version.
Definition: smbios.h:104
SMBIOS 64-bit entry point.
Definition: smbios.h:91