smbios.hh revision 6216
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
946216Snate@binkert.org#include "base/types.hh"
955615Sgblack@eecs.umich.edu#include "enums/Characteristic.hh"
965615Sgblack@eecs.umich.edu#include "enums/ExtCharacteristic.hh"
975615Sgblack@eecs.umich.edu#include "sim/sim_object.hh"
985615Sgblack@eecs.umich.edu
995615Sgblack@eecs.umich.educlass FunctionalPort;
1005615Sgblack@eecs.umich.educlass X86SMBiosBiosInformationParams;
1015615Sgblack@eecs.umich.educlass X86SMBiosSMBiosStructureParams;
1025615Sgblack@eecs.umich.educlass X86SMBiosSMBiosTableParams;
1035612Sgblack@eecs.umich.edu
1045612Sgblack@eecs.umich.edunamespace X86ISA
1055612Sgblack@eecs.umich.edu{
1065612Sgblack@eecs.umich.edu
1075612Sgblack@eecs.umich.edunamespace SMBios
1085612Sgblack@eecs.umich.edu{
1095612Sgblack@eecs.umich.edu
1105615Sgblack@eecs.umich.educlass SMBiosStructure : public SimObject
1115612Sgblack@eecs.umich.edu{
1125615Sgblack@eecs.umich.edu  protected:
1135615Sgblack@eecs.umich.edu    typedef X86SMBiosSMBiosStructureParams Params;
1145615Sgblack@eecs.umich.edu
1155612Sgblack@eecs.umich.edu  public:
1165612Sgblack@eecs.umich.edu
1175612Sgblack@eecs.umich.edu    virtual
1185612Sgblack@eecs.umich.edu    ~SMBiosStructure()
1195612Sgblack@eecs.umich.edu    {}
1205612Sgblack@eecs.umich.edu
1215612Sgblack@eecs.umich.edu    // Offset 00h, 1 byte
1225612Sgblack@eecs.umich.edu    uint8_t type;
1235612Sgblack@eecs.umich.edu
1245612Sgblack@eecs.umich.edu    // Offset 01h, 1 byte
1255612Sgblack@eecs.umich.edu    //Length: computed when written to memory.
1265612Sgblack@eecs.umich.edu
1275612Sgblack@eecs.umich.edu    // Offset 02h, 2 bytes
1285612Sgblack@eecs.umich.edu    uint16_t handle;
1295612Sgblack@eecs.umich.edu
1305612Sgblack@eecs.umich.edu    virtual uint8_t
1315612Sgblack@eecs.umich.edu    getLength()
1325612Sgblack@eecs.umich.edu    {
1335612Sgblack@eecs.umich.edu        // This is the size of a structure with nothing but the header
1345612Sgblack@eecs.umich.edu        return 4;
1355612Sgblack@eecs.umich.edu    }
1365612Sgblack@eecs.umich.edu
1375615Sgblack@eecs.umich.edu    virtual uint16_t writeOut(FunctionalPort * port, Addr addr);
1385612Sgblack@eecs.umich.edu
1395612Sgblack@eecs.umich.edu  protected:
1405615Sgblack@eecs.umich.edu    bool stringFields;
1415615Sgblack@eecs.umich.edu
1425615Sgblack@eecs.umich.edu    SMBiosStructure(Params * p, uint8_t _type);
1435615Sgblack@eecs.umich.edu
1445612Sgblack@eecs.umich.edu    std::vector<std::string> strings;
1455612Sgblack@eecs.umich.edu
1465615Sgblack@eecs.umich.edu    void writeOutStrings(FunctionalPort * port, Addr addr);
1475612Sgblack@eecs.umich.edu
1485615Sgblack@eecs.umich.edu    int getStringLength();
1495612Sgblack@eecs.umich.edu
1505612Sgblack@eecs.umich.edu  public:
1515612Sgblack@eecs.umich.edu
1525615Sgblack@eecs.umich.edu    int addString(std::string & newString);
1535615Sgblack@eecs.umich.edu    std::string readString(int n);
1545615Sgblack@eecs.umich.edu    void setString(int n, std::string & newString);
1555612Sgblack@eecs.umich.edu};
1565612Sgblack@eecs.umich.edu
1575612Sgblack@eecs.umich.educlass BiosInformation : public SMBiosStructure
1585612Sgblack@eecs.umich.edu{
1595615Sgblack@eecs.umich.edu  protected:
1605615Sgblack@eecs.umich.edu    const static uint8_t Type = 0;
1615615Sgblack@eecs.umich.edu
1625615Sgblack@eecs.umich.edu    typedef X86SMBiosBiosInformationParams Params;
1635615Sgblack@eecs.umich.edu
1645612Sgblack@eecs.umich.edu  public:
1655612Sgblack@eecs.umich.edu    // Offset 04h, 1 byte
1665612Sgblack@eecs.umich.edu    uint8_t vendor;
1675612Sgblack@eecs.umich.edu    // Offset 05h, 1 byte
1685612Sgblack@eecs.umich.edu    uint8_t version;
1695612Sgblack@eecs.umich.edu    // Offset 06h, 2 bytes
1705612Sgblack@eecs.umich.edu    uint16_t startingAddrSegment;
1715612Sgblack@eecs.umich.edu    // Offset 08h, 1 byte
1725612Sgblack@eecs.umich.edu    uint8_t releaseDate;
1735612Sgblack@eecs.umich.edu    // Offset 09h, 1 byte
1745612Sgblack@eecs.umich.edu    uint8_t romSize;
1755612Sgblack@eecs.umich.edu    // Offset 0Ah, 8 bytes
1765612Sgblack@eecs.umich.edu    //See tables in 3.3.1 in the SMBios 2.5 spec from the DMTF for
1775612Sgblack@eecs.umich.edu    //bit definitions.
1785612Sgblack@eecs.umich.edu    uint64_t characteristics;
1795612Sgblack@eecs.umich.edu    // Offset 12h, 2 bytes
1805612Sgblack@eecs.umich.edu    uint16_t characteristicExtBytes;
1815612Sgblack@eecs.umich.edu    // Offset 14h, 1 byte
1825615Sgblack@eecs.umich.edu    uint8_t majorVer;
1835612Sgblack@eecs.umich.edu    // Offset 15h, 1 byte
1845615Sgblack@eecs.umich.edu    uint8_t minorVer;
1855612Sgblack@eecs.umich.edu    // Offset 16h, 1 byte
1865612Sgblack@eecs.umich.edu    uint8_t embContFirmwareMajor;
1875612Sgblack@eecs.umich.edu    // Offset 17h, 1 byte
1885612Sgblack@eecs.umich.edu    uint8_t embContFirmwareMinor;
1895612Sgblack@eecs.umich.edu
1905615Sgblack@eecs.umich.edu    BiosInformation(Params * p);
1915615Sgblack@eecs.umich.edu
1925612Sgblack@eecs.umich.edu    uint8_t getLength() { return 0x18; }
1935612Sgblack@eecs.umich.edu    uint16_t writeOut(FunctionalPort * port, Addr addr);
1945612Sgblack@eecs.umich.edu};
1955612Sgblack@eecs.umich.edu
1965615Sgblack@eecs.umich.educlass SMBiosTable : public SimObject
1975612Sgblack@eecs.umich.edu{
1985615Sgblack@eecs.umich.edu  protected:
1995615Sgblack@eecs.umich.edu    typedef X86SMBiosSMBiosTableParams Params;
2005615Sgblack@eecs.umich.edu
2015612Sgblack@eecs.umich.edu    struct SMBiosHeader
2025612Sgblack@eecs.umich.edu    {
2035612Sgblack@eecs.umich.edu        SMBiosHeader()
2045612Sgblack@eecs.umich.edu        {}
2055612Sgblack@eecs.umich.edu
2065612Sgblack@eecs.umich.edu        // Offset 00h, 4 bytes
2075612Sgblack@eecs.umich.edu        static const char anchorString[];
2085612Sgblack@eecs.umich.edu
2095612Sgblack@eecs.umich.edu        // Offset 04h, 1 byte
2105612Sgblack@eecs.umich.edu        //Checksum: computed when written to memory.
2115612Sgblack@eecs.umich.edu
2125612Sgblack@eecs.umich.edu        // Offset 05h, 1 byte
2135612Sgblack@eecs.umich.edu        static const uint8_t entryPointLength;
2145612Sgblack@eecs.umich.edu
2155612Sgblack@eecs.umich.edu        // Offset 06h, 1 byte
2165612Sgblack@eecs.umich.edu        uint8_t majorVersion;
2175612Sgblack@eecs.umich.edu
2185612Sgblack@eecs.umich.edu        // Offset 07h, 1 byte
2195612Sgblack@eecs.umich.edu        uint8_t minorVersion;
2205612Sgblack@eecs.umich.edu
2215612Sgblack@eecs.umich.edu        // Offset 08h, 2 bytes
2225612Sgblack@eecs.umich.edu        //Maximum structure size: computed when written to memory.
2235612Sgblack@eecs.umich.edu
2245612Sgblack@eecs.umich.edu        // Offset 0Ah, 1 byte
2255612Sgblack@eecs.umich.edu        static const uint8_t entryPointRevision;
2265612Sgblack@eecs.umich.edu
2275612Sgblack@eecs.umich.edu        // Offset 0Bh, 5 bytes
2285612Sgblack@eecs.umich.edu        static const uint8_t formattedArea[5];
2295612Sgblack@eecs.umich.edu
2305612Sgblack@eecs.umich.edu        // Offset 10h, 15 bytes
2315612Sgblack@eecs.umich.edu        struct IntermediateHeader
2325612Sgblack@eecs.umich.edu        {
2335612Sgblack@eecs.umich.edu            IntermediateHeader() : tableAddr(0)
2345612Sgblack@eecs.umich.edu            {}
2355612Sgblack@eecs.umich.edu            // Offset 10h, 5 bytes
2365612Sgblack@eecs.umich.edu            static const char anchorString[];
2375612Sgblack@eecs.umich.edu
2385612Sgblack@eecs.umich.edu            // Offset 15h, 1 byte
2395612Sgblack@eecs.umich.edu            //Checksum: computed when written to memory.
2405612Sgblack@eecs.umich.edu
2415612Sgblack@eecs.umich.edu            // Offset 16h, 2 bytes
2425612Sgblack@eecs.umich.edu            //Length of the structure table in bytes: computed when
2435612Sgblack@eecs.umich.edu            //written to memory.
2445612Sgblack@eecs.umich.edu
2455612Sgblack@eecs.umich.edu            // Offset 18h, 4 bytes
2465612Sgblack@eecs.umich.edu            uint32_t tableAddr;
2475612Sgblack@eecs.umich.edu
2485612Sgblack@eecs.umich.edu            // Offset 1Ch, 2 bytes
2495612Sgblack@eecs.umich.edu            //Number of structures: computed when written to memory
2505612Sgblack@eecs.umich.edu
2515612Sgblack@eecs.umich.edu            // Offset 1Eh, 1 byte
2525612Sgblack@eecs.umich.edu            uint8_t smbiosBCDRevision;
2535612Sgblack@eecs.umich.edu        } intermediateHeader;
2545612Sgblack@eecs.umich.edu    } smbiosHeader;
2555612Sgblack@eecs.umich.edu
2565615Sgblack@eecs.umich.edu    std::vector<SMBiosStructure *> structures;
2575612Sgblack@eecs.umich.edu
2585615Sgblack@eecs.umich.edu  public:
2595615Sgblack@eecs.umich.edu    SMBiosTable(Params * p);
2605615Sgblack@eecs.umich.edu
2615615Sgblack@eecs.umich.edu    Addr getTableAddr()
2625615Sgblack@eecs.umich.edu    {
2635615Sgblack@eecs.umich.edu        return smbiosHeader.intermediateHeader.tableAddr;
2645615Sgblack@eecs.umich.edu    }
2655615Sgblack@eecs.umich.edu
2665615Sgblack@eecs.umich.edu    void setTableAddr(Addr addr)
2675615Sgblack@eecs.umich.edu    {
2685615Sgblack@eecs.umich.edu        smbiosHeader.intermediateHeader.tableAddr = addr;
2695615Sgblack@eecs.umich.edu    }
2705615Sgblack@eecs.umich.edu
2715615Sgblack@eecs.umich.edu    void writeOut(FunctionalPort * port, Addr addr,
2725615Sgblack@eecs.umich.edu            Addr &headerSize, Addr &structSize);
2735612Sgblack@eecs.umich.edu};
2745612Sgblack@eecs.umich.edu
2755612Sgblack@eecs.umich.edu} //SMBios
2765612Sgblack@eecs.umich.edu} //X86ISA
2775612Sgblack@eecs.umich.edu
2785612Sgblack@eecs.umich.edu#endif
279