smbios.hh revision 8706
12929Sktlim@umich.edu/* 211504Sandreas.sandberg@arm.com * Copyright (c) 2008 The Hewlett-Packard Development Company 311504Sandreas.sandberg@arm.com * All rights reserved. 411504Sandreas.sandberg@arm.com * 511504Sandreas.sandberg@arm.com * The license below extends only to copyright in the software and shall 611504Sandreas.sandberg@arm.com * not be construed as granting a license to any other intellectual 711504Sandreas.sandberg@arm.com * property including but not limited to intellectual property relating 811504Sandreas.sandberg@arm.com * to a hardware implementation of the functionality of the software 911504Sandreas.sandberg@arm.com * licensed hereunder. You may use the software subject to the license 1011504Sandreas.sandberg@arm.com * terms below provided that you ensure that this notice is replicated 1111504Sandreas.sandberg@arm.com * unmodified and in its entirety in all distributions of the software, 1211504Sandreas.sandberg@arm.com * modified or unmodified, in source code or in binary form. 1311504Sandreas.sandberg@arm.com * 1411504Sandreas.sandberg@arm.com * Copyright (c) 2008 The Regents of The University of Michigan 152932Sktlim@umich.edu * All rights reserved. 162929Sktlim@umich.edu * 172929Sktlim@umich.edu * Redistribution and use in source and binary forms, with or without 182929Sktlim@umich.edu * modification, are permitted provided that the following conditions are 192929Sktlim@umich.edu * met: redistributions of source code must retain the above copyright 202929Sktlim@umich.edu * notice, this list of conditions and the following disclaimer; 212929Sktlim@umich.edu * redistributions in binary form must reproduce the above copyright 222929Sktlim@umich.edu * notice, this list of conditions and the following disclaimer in the 232929Sktlim@umich.edu * documentation and/or other materials provided with the distribution; 242929Sktlim@umich.edu * neither the name of the copyright holders nor the names of its 252929Sktlim@umich.edu * contributors may be used to endorse or promote products derived from 262929Sktlim@umich.edu * this software without specific prior written permission. 272929Sktlim@umich.edu * 282929Sktlim@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 292929Sktlim@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 302929Sktlim@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 312929Sktlim@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 322929Sktlim@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 332929Sktlim@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 342929Sktlim@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 352929Sktlim@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 362929Sktlim@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 372929Sktlim@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 382929Sktlim@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 392929Sktlim@umich.edu * 402932Sktlim@umich.edu * Authors: Gabe Black 412932Sktlim@umich.edu */ 422932Sktlim@umich.edu 4311504Sandreas.sandberg@arm.com#ifndef __ARCH_X86_BIOS_SMBIOS_HH__ 442929Sktlim@umich.edu#define __ARCH_X86_BIOS_SMBIOS_HH__ 4512563Sgabeblack@google.com 4612563Sgabeblack@google.com#include <string> 472929Sktlim@umich.edu#include <vector> 4811504Sandreas.sandberg@arm.com 4911504Sandreas.sandberg@arm.com#include "base/types.hh" 5011504Sandreas.sandberg@arm.com#include "enums/Characteristic.hh" 5111504Sandreas.sandberg@arm.com#include "enums/ExtCharacteristic.hh" 5211504Sandreas.sandberg@arm.com#include "sim/sim_object.hh" 5311504Sandreas.sandberg@arm.com 5411504Sandreas.sandberg@arm.comclass PortProxy; 5512246Sgabeblack@google.comclass X86SMBiosBiosInformationParams; 562929Sktlim@umich.educlass X86SMBiosSMBiosStructureParams; 572929Sktlim@umich.educlass X86SMBiosSMBiosTableParams; 582929Sktlim@umich.edu 598947Sandreas.hansson@arm.comnamespace X86ISA 6012246Sgabeblack@google.com{ 618947Sandreas.hansson@arm.com 622929Sktlim@umich.edunamespace SMBios 632929Sktlim@umich.edu{ 6411504Sandreas.sandberg@arm.com 6511504Sandreas.sandberg@arm.comclass SMBiosStructure : public SimObject 6611504Sandreas.sandberg@arm.com{ 6711504Sandreas.sandberg@arm.com protected: 6811504Sandreas.sandberg@arm.com typedef X86SMBiosSMBiosStructureParams Params; 6911504Sandreas.sandberg@arm.com 7011504Sandreas.sandberg@arm.com public: 712929Sktlim@umich.edu 7211504Sandreas.sandberg@arm.com virtual 7311504Sandreas.sandberg@arm.com ~SMBiosStructure() 746007Ssteve.reinhardt@amd.com {} 756007Ssteve.reinhardt@amd.com 7611504Sandreas.sandberg@arm.com // Offset 00h, 1 byte 772929Sktlim@umich.edu uint8_t type; 782929Sktlim@umich.edu 7911504Sandreas.sandberg@arm.com // Offset 01h, 1 byte 806007Ssteve.reinhardt@amd.com //Length: computed when written to memory. 816007Ssteve.reinhardt@amd.com 829781Sandreas.hansson@arm.com // Offset 02h, 2 bytes 836007Ssteve.reinhardt@amd.com uint16_t handle; 8411504Sandreas.sandberg@arm.com 852929Sktlim@umich.edu virtual uint8_t 862929Sktlim@umich.edu getLength() 8711504Sandreas.sandberg@arm.com { 8811504Sandreas.sandberg@arm.com // This is the size of a structure with nothing but the header 8911504Sandreas.sandberg@arm.com return 4; 9011504Sandreas.sandberg@arm.com } 9111504Sandreas.sandberg@arm.com 926007Ssteve.reinhardt@amd.com virtual uint16_t writeOut(PortProxy* proxy, Addr addr); 9311504Sandreas.sandberg@arm.com 9411504Sandreas.sandberg@arm.com protected: 9511504Sandreas.sandberg@arm.com bool stringFields; 9611504Sandreas.sandberg@arm.com 976007Ssteve.reinhardt@amd.com SMBiosStructure(Params * p, uint8_t _type); 9811504Sandreas.sandberg@arm.com 9911504Sandreas.sandberg@arm.com std::vector<std::string> strings; 10011504Sandreas.sandberg@arm.com 1016007Ssteve.reinhardt@amd.com void writeOutStrings(PortProxy* proxy, Addr addr); 1022929Sktlim@umich.edu 1032929Sktlim@umich.edu int getStringLength(); 1046007Ssteve.reinhardt@amd.com 1056007Ssteve.reinhardt@amd.com public: 1062929Sktlim@umich.edu 1072929Sktlim@umich.edu int addString(std::string & newString); 1086007Ssteve.reinhardt@amd.com std::string readString(int n); 1092929Sktlim@umich.edu void setString(int n, std::string & newString); 1102929Sktlim@umich.edu}; 11111504Sandreas.sandberg@arm.com 1128947Sandreas.hansson@arm.comclass BiosInformation : public SMBiosStructure 11311504Sandreas.sandberg@arm.com{ 11411504Sandreas.sandberg@arm.com protected: 1158947Sandreas.hansson@arm.com const static uint8_t Type = 0; 11611504Sandreas.sandberg@arm.com 11711504Sandreas.sandberg@arm.com typedef X86SMBiosBiosInformationParams Params; 1188947Sandreas.hansson@arm.com 11911504Sandreas.sandberg@arm.com public: 12011504Sandreas.sandberg@arm.com // Offset 04h, 1 byte 12111504Sandreas.sandberg@arm.com uint8_t vendor; 1228947Sandreas.hansson@arm.com // Offset 05h, 1 byte 12311504Sandreas.sandberg@arm.com uint8_t version; 12411504Sandreas.sandberg@arm.com // Offset 06h, 2 bytes 12511504Sandreas.sandberg@arm.com uint16_t startingAddrSegment; 12611504Sandreas.sandberg@arm.com // Offset 08h, 1 byte 12711542Sandreas.sandberg@arm.com uint8_t releaseDate; 12811542Sandreas.sandberg@arm.com // Offset 09h, 1 byte 12911542Sandreas.sandberg@arm.com uint8_t romSize; 13011542Sandreas.sandberg@arm.com // Offset 0Ah, 8 bytes 13111504Sandreas.sandberg@arm.com //See tables in 3.3.1 in the SMBios 2.5 spec from the DMTF for 13211504Sandreas.sandberg@arm.com //bit definitions. 13311504Sandreas.sandberg@arm.com uint64_t characteristics; 13411504Sandreas.sandberg@arm.com // Offset 12h, 2 bytes 13511542Sandreas.sandberg@arm.com uint16_t characteristicExtBytes; 13611504Sandreas.sandberg@arm.com // Offset 14h, 1 byte 13711504Sandreas.sandberg@arm.com uint8_t majorVer; 13811504Sandreas.sandberg@arm.com // Offset 15h, 1 byte 13911504Sandreas.sandberg@arm.com uint8_t minorVer; 14011504Sandreas.sandberg@arm.com // Offset 16h, 1 byte 14112563Sgabeblack@google.com uint8_t embContFirmwareMajor; 1422929Sktlim@umich.edu // Offset 17h, 1 byte 1432929Sktlim@umich.edu uint8_t embContFirmwareMinor; 14411504Sandreas.sandberg@arm.com 1454937Sstever@gmail.com BiosInformation(Params * p); 1462929Sktlim@umich.edu 14711504Sandreas.sandberg@arm.com uint8_t getLength() { return 0x18; } 1482929Sktlim@umich.edu uint16_t writeOut(PortProxy* proxy, Addr addr); 14911504Sandreas.sandberg@arm.com}; 15011504Sandreas.sandberg@arm.com 1512929Sktlim@umich.educlass SMBiosTable : public SimObject 15211504Sandreas.sandberg@arm.com{ 15311504Sandreas.sandberg@arm.com protected: 1542929Sktlim@umich.edu typedef X86SMBiosSMBiosTableParams Params; 15511504Sandreas.sandberg@arm.com 15611504Sandreas.sandberg@arm.com struct SMBiosHeader 15711504Sandreas.sandberg@arm.com { 15811504Sandreas.sandberg@arm.com SMBiosHeader() 15911504Sandreas.sandberg@arm.com {} 16011504Sandreas.sandberg@arm.com 16111504Sandreas.sandberg@arm.com // Offset 00h, 4 bytes 16211504Sandreas.sandberg@arm.com static const char anchorString[]; 16311504Sandreas.sandberg@arm.com 16411504Sandreas.sandberg@arm.com // Offset 04h, 1 byte 16511504Sandreas.sandberg@arm.com //Checksum: computed when written to memory. 16611504Sandreas.sandberg@arm.com 16711542Sandreas.sandberg@arm.com // Offset 05h, 1 byte 16812563Sgabeblack@google.com static const uint8_t entryPointLength; 16912563Sgabeblack@google.com 17011504Sandreas.sandberg@arm.com // Offset 06h, 1 byte 17111504Sandreas.sandberg@arm.com uint8_t majorVersion; 17212563Sgabeblack@google.com 17312563Sgabeblack@google.com // Offset 07h, 1 byte 17411504Sandreas.sandberg@arm.com uint8_t minorVersion; 17511542Sandreas.sandberg@arm.com 17612563Sgabeblack@google.com // Offset 08h, 2 bytes 17712563Sgabeblack@google.com //Maximum structure size: computed when written to memory. 17811504Sandreas.sandberg@arm.com 17911504Sandreas.sandberg@arm.com // Offset 0Ah, 1 byte 18012563Sgabeblack@google.com static const uint8_t entryPointRevision; 18111504Sandreas.sandberg@arm.com 18211504Sandreas.sandberg@arm.com // Offset 0Bh, 5 bytes 1832929Sktlim@umich.edu static const uint8_t formattedArea[5]; 1842929Sktlim@umich.edu 1852929Sktlim@umich.edu // Offset 10h, 15 bytes 18611504Sandreas.sandberg@arm.com struct IntermediateHeader 1872929Sktlim@umich.edu { 1882929Sktlim@umich.edu IntermediateHeader() : tableAddr(0) 1892929Sktlim@umich.edu {} 1902929Sktlim@umich.edu // Offset 10h, 5 bytes 19111504Sandreas.sandberg@arm.com static const char anchorString[]; 1922997Sstever@eecs.umich.edu 1932929Sktlim@umich.edu // Offset 15h, 1 byte 19411504Sandreas.sandberg@arm.com //Checksum: computed when written to memory. 19511504Sandreas.sandberg@arm.com 19611504Sandreas.sandberg@arm.com // Offset 16h, 2 bytes 1972929Sktlim@umich.edu //Length of the structure table in bytes: computed when 19811504Sandreas.sandberg@arm.com //written to memory. 19911504Sandreas.sandberg@arm.com 2002929Sktlim@umich.edu // Offset 18h, 4 bytes 20111504Sandreas.sandberg@arm.com uint32_t tableAddr; 20211504Sandreas.sandberg@arm.com 2032997Sstever@eecs.umich.edu // Offset 1Ch, 2 bytes 20411504Sandreas.sandberg@arm.com //Number of structures: computed when written to memory 20511504Sandreas.sandberg@arm.com 20611504Sandreas.sandberg@arm.com // Offset 1Eh, 1 byte 20711504Sandreas.sandberg@arm.com uint8_t smbiosBCDRevision; 2082997Sstever@eecs.umich.edu } intermediateHeader; 20911504Sandreas.sandberg@arm.com } smbiosHeader; 21011504Sandreas.sandberg@arm.com 21111504Sandreas.sandberg@arm.com std::vector<SMBiosStructure *> structures; 21211504Sandreas.sandberg@arm.com 21311504Sandreas.sandberg@arm.com public: 21411504Sandreas.sandberg@arm.com SMBiosTable(Params * p); 2152929Sktlim@umich.edu 2162997Sstever@eecs.umich.edu Addr getTableAddr() 2178120Sgblack@eecs.umich.edu { 21811504Sandreas.sandberg@arm.com return smbiosHeader.intermediateHeader.tableAddr; 2192997Sstever@eecs.umich.edu } 22011504Sandreas.sandberg@arm.com 2212929Sktlim@umich.edu void setTableAddr(Addr addr) 2222997Sstever@eecs.umich.edu { 2232929Sktlim@umich.edu smbiosHeader.intermediateHeader.tableAddr = addr; 22411504Sandreas.sandberg@arm.com } 22511504Sandreas.sandberg@arm.com 2262929Sktlim@umich.edu void writeOut(PortProxy* proxy, Addr addr, 22711504Sandreas.sandberg@arm.com Addr &headerSize, Addr &structSize); 22811504Sandreas.sandberg@arm.com}; 2293691Shsul@eecs.umich.edu 23011504Sandreas.sandberg@arm.com} //SMBios 2313005Sstever@eecs.umich.edu} //X86ISA 23211504Sandreas.sandberg@arm.com 23311105Spower.jg@gmail.com#endif 23411504Sandreas.sandberg@arm.com