Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
[efi] Use EFI-native mechanism for accessing SMBIOS table
EFI provides a copy of the SMBIOS table accessible via the EFI system table, which we should use instead of manually scanning through the F000:0000 segment.
- Loading branch information
Michael Brown
committed
Dec 4, 2008
1 parent
045a227
commit 29480dd
Showing
15 changed files
with
376 additions
and
180 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
#ifndef _BITS_SMBIOS_H | ||
#define _BITS_SMBIOS_H | ||
|
||
/** @file | ||
* | ||
* i386-specific SMBIOS API implementations | ||
* | ||
*/ | ||
|
||
#include <gpxe/bios_smbios.h> | ||
|
||
#endif /* _BITS_SMBIOS_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
#ifndef _GPXE_BIOS_SMBIOS_H | ||
#define _GPXE_BIOS_SMBIOS_H | ||
|
||
/** @file | ||
* | ||
* Standard PC-BIOS SMBIOS interface | ||
* | ||
*/ | ||
|
||
#ifdef SMBIOS_PCBIOS | ||
#define SMBIOS_PREFIX_pcbios | ||
#else | ||
#define SMBIOS_PREFIX_pcbios __pcbios_ | ||
#endif | ||
|
||
#endif /* _GPXE_BIOS_SMBIOS_H */ |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
/* | ||
* Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>. | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License as | ||
* published by the Free Software Foundation; either version 2 of the | ||
* License, or any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, but | ||
* WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
* General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, write to the Free Software | ||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
*/ | ||
|
||
#include <stdint.h> | ||
#include <string.h> | ||
#include <errno.h> | ||
#include <assert.h> | ||
#include <gpxe/uaccess.h> | ||
#include <gpxe/smbios.h> | ||
#include <realmode.h> | ||
#include <pnpbios.h> | ||
|
||
/** @file | ||
* | ||
* System Management BIOS | ||
* | ||
*/ | ||
|
||
/** | ||
* Find SMBIOS | ||
* | ||
* @v smbios SMBIOS entry point descriptor structure to fill in | ||
* @ret rc Return status code | ||
*/ | ||
static int bios_find_smbios ( struct smbios *smbios ) { | ||
union { | ||
struct smbios_entry entry; | ||
uint8_t bytes[256]; /* 256 is maximum length possible */ | ||
} u; | ||
static unsigned int offset = 0; | ||
size_t len; | ||
unsigned int i; | ||
uint8_t sum; | ||
|
||
/* Try to find SMBIOS */ | ||
for ( ; offset < 0x10000 ; offset += 0x10 ) { | ||
|
||
/* Read start of header and verify signature */ | ||
copy_from_real ( &u.entry, BIOS_SEG, offset, | ||
sizeof ( u.entry )); | ||
if ( u.entry.signature != SMBIOS_SIGNATURE ) | ||
continue; | ||
|
||
/* Read whole header and verify checksum */ | ||
len = u.entry.len; | ||
copy_from_real ( &u.bytes, BIOS_SEG, offset, len ); | ||
for ( i = 0 , sum = 0 ; i < len ; i++ ) { | ||
sum += u.bytes[i]; | ||
} | ||
if ( sum != 0 ) { | ||
DBG ( "SMBIOS at %04x:%04x has bad checksum %02x\n", | ||
BIOS_SEG, offset, sum ); | ||
continue; | ||
} | ||
|
||
/* Fill result structure */ | ||
DBG ( "Found SMBIOS v%d.%d entry point at %04x:%04x\n", | ||
u.entry.major, u.entry.minor, BIOS_SEG, offset ); | ||
smbios->address = phys_to_user ( u.entry.smbios_address ); | ||
smbios->len = u.entry.smbios_len; | ||
smbios->count = u.entry.smbios_count; | ||
return 0; | ||
} | ||
|
||
DBG ( "No SMBIOS found\n" ); | ||
return -ENODEV; | ||
} | ||
|
||
PROVIDE_SMBIOS ( pcbios, find_smbios, bios_find_smbios ); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
/** @file | ||
GUIDs used to locate the SMBIOS tables in the UEFI 2.0 system table. | ||
This GUID in the system table is the only legal way to search for and | ||
locate the SMBIOS tables. Do not search the 0xF0000 segment to find SMBIOS | ||
tables. | ||
Copyright (c) 2006, Intel Corporation | ||
All rights reserved. This program and the accompanying materials | ||
are licensed and made available under the terms and conditions of the BSD License | ||
which accompanies this distribution. The full text of the license may be found at | ||
http://opensource.org/licenses/bsd-license.php | ||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | ||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | ||
@par Revision Reference: | ||
GUIDs defined in UEFI 2.0 spec. | ||
**/ | ||
|
||
#ifndef __SMBIOS_GUID_H__ | ||
#define __SMBIOS_GUID_H__ | ||
|
||
#define EFI_SMBIOS_TABLE_GUID \ | ||
{ \ | ||
0xeb9d2d31, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } \ | ||
} | ||
|
||
#define SMBIOS_TABLE_GUID EFI_SMBIOS_TABLE_GUID | ||
|
||
extern EFI_GUID gEfiSmbiosTableGuid; | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
#ifndef _GPXE_EFI_SMBIOS_H | ||
#define _GPXE_EFI_SMBIOS_H | ||
|
||
/** @file | ||
* | ||
* gPXE SMBIOS API for EFI | ||
* | ||
*/ | ||
|
||
#ifdef SMBIOS_EFI | ||
#define SMBIOS_PREFIX_efi | ||
#else | ||
#define SMBIOS_PREFIX_efi __efi_ | ||
#endif | ||
|
||
#endif /* _GPXE_EFI_SMBIOS_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.