smbios.hh revision 5612
15612Sgblack@eecs.umich.edu/* 25612Sgblack@eecs.umich.edu * Copyright (c) 2008 The Regents of The University of Michigan 35612Sgblack@eecs.umich.edu * All rights reserved. 45612Sgblack@eecs.umich.edu * 55612Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 65612Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 75612Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 85612Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 95612Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 105612Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 115612Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 125612Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 135612Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 145612Sgblack@eecs.umich.edu * this software without specific prior written permission. 155612Sgblack@eecs.umich.edu * 165612Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 175612Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 185612Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 195612Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 205612Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 215612Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 225612Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 235612Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 245612Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255612Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 265612Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275612Sgblack@eecs.umich.edu * 285612Sgblack@eecs.umich.edu * Authors: Gabe Black 295612Sgblack@eecs.umich.edu */ 305612Sgblack@eecs.umich.edu 315612Sgblack@eecs.umich.edu/* 325612Sgblack@eecs.umich.edu * Copyright (c) 2008 The Hewlett-Packard Development Company 335612Sgblack@eecs.umich.edu * All rights reserved. 345612Sgblack@eecs.umich.edu * 355612Sgblack@eecs.umich.edu * Redistribution and use of this software in source and binary forms, 365612Sgblack@eecs.umich.edu * with or without modification, are permitted provided that the 375612Sgblack@eecs.umich.edu * following conditions are met: 385612Sgblack@eecs.umich.edu * 395612Sgblack@eecs.umich.edu * The software must be used only for Non-Commercial Use which means any 405612Sgblack@eecs.umich.edu * use which is NOT directed to receiving any direct monetary 415612Sgblack@eecs.umich.edu * compensation for, or commercial advantage from such use. Illustrative 425612Sgblack@eecs.umich.edu * examples of non-commercial use are academic research, personal study, 435612Sgblack@eecs.umich.edu * teaching, education and corporate research & development. 445612Sgblack@eecs.umich.edu * Illustrative examples of commercial use are distributing products for 455612Sgblack@eecs.umich.edu * commercial advantage and providing services using the software for 465612Sgblack@eecs.umich.edu * commercial advantage. 475612Sgblack@eecs.umich.edu * 485612Sgblack@eecs.umich.edu * If you wish to use this software or functionality therein that may be 495612Sgblack@eecs.umich.edu * covered by patents for commercial use, please contact: 505612Sgblack@eecs.umich.edu * Director of Intellectual Property Licensing 515612Sgblack@eecs.umich.edu * Office of Strategy and Technology 525612Sgblack@eecs.umich.edu * Hewlett-Packard Company 535612Sgblack@eecs.umich.edu * 1501 Page Mill Road 545612Sgblack@eecs.umich.edu * Palo Alto, California 94304 555612Sgblack@eecs.umich.edu * 565612Sgblack@eecs.umich.edu * Redistributions of source code must retain the above copyright notice, 575612Sgblack@eecs.umich.edu * this list of conditions and the following disclaimer. Redistributions 585612Sgblack@eecs.umich.edu * in binary form must reproduce the above copyright notice, this list of 595612Sgblack@eecs.umich.edu * conditions and the following disclaimer in the documentation and/or 605612Sgblack@eecs.umich.edu * other materials provided with the distribution. Neither the name of 615612Sgblack@eecs.umich.edu * the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its 625612Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 635612Sgblack@eecs.umich.edu * this software without specific prior written permission. No right of 645612Sgblack@eecs.umich.edu * sublicense is granted herewith. Derivatives of the software and 655612Sgblack@eecs.umich.edu * output created using the software may be prepared, but only for 665612Sgblack@eecs.umich.edu * Non-Commercial Uses. Derivatives of the software may be shared with 675612Sgblack@eecs.umich.edu * others provided: (i) the others agree to abide by the list of 685612Sgblack@eecs.umich.edu * conditions herein which includes the Non-Commercial Use restrictions; 695612Sgblack@eecs.umich.edu * and (ii) such Derivatives of the software include the above copyright 705612Sgblack@eecs.umich.edu * notice to acknowledge the contribution from this software where 715612Sgblack@eecs.umich.edu * applicable, this list of conditions and the disclaimer below. 725612Sgblack@eecs.umich.edu * 735612Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 745612Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 755612Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 765612Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 775612Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 785612Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 795612Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 805612Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 815612Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 825612Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 835612Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 845612Sgblack@eecs.umich.edu * 855612Sgblack@eecs.umich.edu * Authors: Gabe Black 865612Sgblack@eecs.umich.edu */ 875612Sgblack@eecs.umich.edu 885612Sgblack@eecs.umich.edu#ifndef __ARCH_X86_BIOS_SMBIOS_HH__ 895612Sgblack@eecs.umich.edu#define __ARCH_X86_BIOS_SMBIOS_HH__ 905612Sgblack@eecs.umich.edu 915612Sgblack@eecs.umich.edu#include <string> 925612Sgblack@eecs.umich.edu#include <vector> 935612Sgblack@eecs.umich.edu 945612Sgblack@eecs.umich.edu#include "arch/x86/isa_traits.hh" 955612Sgblack@eecs.umich.edu#include "mem/port.hh" 965612Sgblack@eecs.umich.edu#include "sim/byteswap.hh" 975612Sgblack@eecs.umich.edu#include "sim/host.hh" 985612Sgblack@eecs.umich.edu 995612Sgblack@eecs.umich.edunamespace X86ISA 1005612Sgblack@eecs.umich.edu{ 1015612Sgblack@eecs.umich.edu 1025612Sgblack@eecs.umich.edunamespace SMBios 1035612Sgblack@eecs.umich.edu{ 1045612Sgblack@eecs.umich.edu 1055612Sgblack@eecs.umich.educlass SMBiosStructure 1065612Sgblack@eecs.umich.edu{ 1075612Sgblack@eecs.umich.edu public: 1085612Sgblack@eecs.umich.edu 1095612Sgblack@eecs.umich.edu virtual 1105612Sgblack@eecs.umich.edu ~SMBiosStructure() 1115612Sgblack@eecs.umich.edu {} 1125612Sgblack@eecs.umich.edu 1135612Sgblack@eecs.umich.edu // Offset 00h, 1 byte 1145612Sgblack@eecs.umich.edu uint8_t type; 1155612Sgblack@eecs.umich.edu 1165612Sgblack@eecs.umich.edu // Offset 01h, 1 byte 1175612Sgblack@eecs.umich.edu //Length: computed when written to memory. 1185612Sgblack@eecs.umich.edu 1195612Sgblack@eecs.umich.edu // Offset 02h, 2 bytes 1205612Sgblack@eecs.umich.edu uint16_t handle; 1215612Sgblack@eecs.umich.edu 1225612Sgblack@eecs.umich.edu virtual uint8_t 1235612Sgblack@eecs.umich.edu getLength() 1245612Sgblack@eecs.umich.edu { 1255612Sgblack@eecs.umich.edu // This is the size of a structure with nothing but the header 1265612Sgblack@eecs.umich.edu return 4; 1275612Sgblack@eecs.umich.edu } 1285612Sgblack@eecs.umich.edu 1295612Sgblack@eecs.umich.edu virtual uint16_t 1305612Sgblack@eecs.umich.edu writeOut(FunctionalPort * port, Addr addr) 1315612Sgblack@eecs.umich.edu { 1325612Sgblack@eecs.umich.edu port->writeBlob(addr, (uint8_t *)(&type), 1); 1335612Sgblack@eecs.umich.edu 1345612Sgblack@eecs.umich.edu uint8_t length = getLength(); 1355612Sgblack@eecs.umich.edu port->writeBlob(addr + 1, (uint8_t *)(&length), 1); 1365612Sgblack@eecs.umich.edu 1375612Sgblack@eecs.umich.edu uint16_t handleGuest = X86ISA::htog(handle); 1385612Sgblack@eecs.umich.edu port->writeBlob(addr + 2, (uint8_t *)(&handleGuest), 2); 1395612Sgblack@eecs.umich.edu 1405612Sgblack@eecs.umich.edu return length + getStringLength(); 1415612Sgblack@eecs.umich.edu } 1425612Sgblack@eecs.umich.edu 1435612Sgblack@eecs.umich.edu protected: 1445612Sgblack@eecs.umich.edu std::vector<std::string> strings; 1455612Sgblack@eecs.umich.edu 1465612Sgblack@eecs.umich.edu void writeOutStrings(FunctionalPort * port, Addr addr) 1475612Sgblack@eecs.umich.edu { 1485612Sgblack@eecs.umich.edu std::vector<std::string>::iterator it; 1495612Sgblack@eecs.umich.edu Addr offset = 0; 1505612Sgblack@eecs.umich.edu 1515612Sgblack@eecs.umich.edu for (it = strings.begin(); it != strings.end(); it++) { 1525612Sgblack@eecs.umich.edu port->writeBlob(addr + offset, 1535612Sgblack@eecs.umich.edu (uint8_t *)it->c_str(), it->length() + 1); 1545612Sgblack@eecs.umich.edu offset += it->length() + 1; 1555612Sgblack@eecs.umich.edu } 1565612Sgblack@eecs.umich.edu 1575612Sgblack@eecs.umich.edu const uint8_t nullTerminator = 0; 1585612Sgblack@eecs.umich.edu port->writeBlob(addr + offset, (uint8_t *)(&nullTerminator), 1); 1595612Sgblack@eecs.umich.edu } 1605612Sgblack@eecs.umich.edu 1615612Sgblack@eecs.umich.edu int getStringLength() 1625612Sgblack@eecs.umich.edu { 1635612Sgblack@eecs.umich.edu int size = 0; 1645612Sgblack@eecs.umich.edu std::vector<std::string>::iterator it; 1655612Sgblack@eecs.umich.edu 1665612Sgblack@eecs.umich.edu for (it = strings.begin(); it != strings.end(); it++) { 1675612Sgblack@eecs.umich.edu size += it->length() + 1; 1685612Sgblack@eecs.umich.edu } 1695612Sgblack@eecs.umich.edu 1705612Sgblack@eecs.umich.edu return size + 1; 1715612Sgblack@eecs.umich.edu } 1725612Sgblack@eecs.umich.edu 1735612Sgblack@eecs.umich.edu public: 1745612Sgblack@eecs.umich.edu 1755612Sgblack@eecs.umich.edu int addString(std::string & newString) 1765612Sgblack@eecs.umich.edu { 1775612Sgblack@eecs.umich.edu strings.push_back(newString); 1785612Sgblack@eecs.umich.edu return strings.size(); 1795612Sgblack@eecs.umich.edu } 1805612Sgblack@eecs.umich.edu 1815612Sgblack@eecs.umich.edu std::string readString(int n) 1825612Sgblack@eecs.umich.edu { 1835612Sgblack@eecs.umich.edu assert(n > 0 && n <= strings.size()); 1845612Sgblack@eecs.umich.edu return strings[n - 1]; 1855612Sgblack@eecs.umich.edu } 1865612Sgblack@eecs.umich.edu 1875612Sgblack@eecs.umich.edu void setString(int n, std::string & newString) 1885612Sgblack@eecs.umich.edu { 1895612Sgblack@eecs.umich.edu assert(n > 0 && n <= strings.size()); 1905612Sgblack@eecs.umich.edu strings[n - 1] = newString; 1915612Sgblack@eecs.umich.edu } 1925612Sgblack@eecs.umich.edu}; 1935612Sgblack@eecs.umich.edu 1945612Sgblack@eecs.umich.educlass BiosInformation : public SMBiosStructure 1955612Sgblack@eecs.umich.edu{ 1965612Sgblack@eecs.umich.edu public: 1975612Sgblack@eecs.umich.edu // Offset 04h, 1 byte 1985612Sgblack@eecs.umich.edu uint8_t vendor; 1995612Sgblack@eecs.umich.edu // Offset 05h, 1 byte 2005612Sgblack@eecs.umich.edu uint8_t version; 2015612Sgblack@eecs.umich.edu // Offset 06h, 2 bytes 2025612Sgblack@eecs.umich.edu uint16_t startingAddrSegment; 2035612Sgblack@eecs.umich.edu // Offset 08h, 1 byte 2045612Sgblack@eecs.umich.edu uint8_t releaseDate; 2055612Sgblack@eecs.umich.edu // Offset 09h, 1 byte 2065612Sgblack@eecs.umich.edu uint8_t romSize; 2075612Sgblack@eecs.umich.edu // Offset 0Ah, 8 bytes 2085612Sgblack@eecs.umich.edu //See tables in 3.3.1 in the SMBios 2.5 spec from the DMTF for 2095612Sgblack@eecs.umich.edu //bit definitions. 2105612Sgblack@eecs.umich.edu uint64_t characteristics; 2115612Sgblack@eecs.umich.edu // Offset 12h, 2 bytes 2125612Sgblack@eecs.umich.edu uint16_t characteristicExtBytes; 2135612Sgblack@eecs.umich.edu // Offset 14h, 1 byte 2145612Sgblack@eecs.umich.edu uint8_t major; 2155612Sgblack@eecs.umich.edu // Offset 15h, 1 byte 2165612Sgblack@eecs.umich.edu uint8_t minor; 2175612Sgblack@eecs.umich.edu // Offset 16h, 1 byte 2185612Sgblack@eecs.umich.edu uint8_t embContFirmwareMajor; 2195612Sgblack@eecs.umich.edu // Offset 17h, 1 byte 2205612Sgblack@eecs.umich.edu uint8_t embContFirmwareMinor; 2215612Sgblack@eecs.umich.edu 2225612Sgblack@eecs.umich.edu uint8_t getLength() { return 0x18; } 2235612Sgblack@eecs.umich.edu uint16_t writeOut(FunctionalPort * port, Addr addr); 2245612Sgblack@eecs.umich.edu}; 2255612Sgblack@eecs.umich.edu 2265612Sgblack@eecs.umich.educlass SMBiosTable 2275612Sgblack@eecs.umich.edu{ 2285612Sgblack@eecs.umich.edu public: 2295612Sgblack@eecs.umich.edu struct SMBiosHeader 2305612Sgblack@eecs.umich.edu { 2315612Sgblack@eecs.umich.edu SMBiosHeader() 2325612Sgblack@eecs.umich.edu {} 2335612Sgblack@eecs.umich.edu 2345612Sgblack@eecs.umich.edu // Offset 00h, 4 bytes 2355612Sgblack@eecs.umich.edu static const char anchorString[]; 2365612Sgblack@eecs.umich.edu 2375612Sgblack@eecs.umich.edu // Offset 04h, 1 byte 2385612Sgblack@eecs.umich.edu //Checksum: computed when written to memory. 2395612Sgblack@eecs.umich.edu 2405612Sgblack@eecs.umich.edu // Offset 05h, 1 byte 2415612Sgblack@eecs.umich.edu static const uint8_t entryPointLength; 2425612Sgblack@eecs.umich.edu 2435612Sgblack@eecs.umich.edu // Offset 06h, 1 byte 2445612Sgblack@eecs.umich.edu uint8_t majorVersion; 2455612Sgblack@eecs.umich.edu 2465612Sgblack@eecs.umich.edu // Offset 07h, 1 byte 2475612Sgblack@eecs.umich.edu uint8_t minorVersion; 2485612Sgblack@eecs.umich.edu 2495612Sgblack@eecs.umich.edu // Offset 08h, 2 bytes 2505612Sgblack@eecs.umich.edu //Maximum structure size: computed when written to memory. 2515612Sgblack@eecs.umich.edu 2525612Sgblack@eecs.umich.edu // Offset 0Ah, 1 byte 2535612Sgblack@eecs.umich.edu static const uint8_t entryPointRevision; 2545612Sgblack@eecs.umich.edu 2555612Sgblack@eecs.umich.edu // Offset 0Bh, 5 bytes 2565612Sgblack@eecs.umich.edu static const uint8_t formattedArea[5]; 2575612Sgblack@eecs.umich.edu 2585612Sgblack@eecs.umich.edu // Offset 10h, 15 bytes 2595612Sgblack@eecs.umich.edu struct IntermediateHeader 2605612Sgblack@eecs.umich.edu { 2615612Sgblack@eecs.umich.edu IntermediateHeader() : tableAddr(0) 2625612Sgblack@eecs.umich.edu {} 2635612Sgblack@eecs.umich.edu // Offset 10h, 5 bytes 2645612Sgblack@eecs.umich.edu static const char anchorString[]; 2655612Sgblack@eecs.umich.edu 2665612Sgblack@eecs.umich.edu // Offset 15h, 1 byte 2675612Sgblack@eecs.umich.edu //Checksum: computed when written to memory. 2685612Sgblack@eecs.umich.edu 2695612Sgblack@eecs.umich.edu // Offset 16h, 2 bytes 2705612Sgblack@eecs.umich.edu //Length of the structure table in bytes: computed when 2715612Sgblack@eecs.umich.edu //written to memory. 2725612Sgblack@eecs.umich.edu 2735612Sgblack@eecs.umich.edu // Offset 18h, 4 bytes 2745612Sgblack@eecs.umich.edu uint32_t tableAddr; 2755612Sgblack@eecs.umich.edu 2765612Sgblack@eecs.umich.edu // Offset 1Ch, 2 bytes 2775612Sgblack@eecs.umich.edu //Number of structures: computed when written to memory 2785612Sgblack@eecs.umich.edu 2795612Sgblack@eecs.umich.edu // Offset 1Eh, 1 byte 2805612Sgblack@eecs.umich.edu uint8_t smbiosBCDRevision; 2815612Sgblack@eecs.umich.edu } intermediateHeader; 2825612Sgblack@eecs.umich.edu } smbiosHeader; 2835612Sgblack@eecs.umich.edu 2845612Sgblack@eecs.umich.edu void writeOut(FunctionalPort * port, Addr addr); 2855612Sgblack@eecs.umich.edu 2865612Sgblack@eecs.umich.edu std::vector<SMBiosStructure> structures; 2875612Sgblack@eecs.umich.edu}; 2885612Sgblack@eecs.umich.edu 2895612Sgblack@eecs.umich.edu} //SMBios 2905612Sgblack@eecs.umich.edu} //X86ISA 2915612Sgblack@eecs.umich.edu 2925612Sgblack@eecs.umich.edu#endif 293