smbios.cc 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#include "arch/x86/bios/smbios.hh" 895612Sgblack@eecs.umich.edu#include "arch/x86/isa_traits.hh" 906216Snate@binkert.org#include "base/types.hh" 915612Sgblack@eecs.umich.edu#include "mem/port.hh" 925615Sgblack@eecs.umich.edu#include "params/X86SMBiosBiosInformation.hh" 935615Sgblack@eecs.umich.edu#include "params/X86SMBiosSMBiosStructure.hh" 945615Sgblack@eecs.umich.edu#include "params/X86SMBiosSMBiosTable.hh" 955612Sgblack@eecs.umich.edu#include "sim/byteswap.hh" 965612Sgblack@eecs.umich.edu 975615Sgblack@eecs.umich.eduusing namespace std; 985615Sgblack@eecs.umich.edu 995612Sgblack@eecs.umich.educonst char X86ISA::SMBios::SMBiosTable::SMBiosHeader::anchorString[] = "_SM_"; 1005612Sgblack@eecs.umich.educonst uint8_t X86ISA::SMBios::SMBiosTable:: 1015612Sgblack@eecs.umich.edu SMBiosHeader::formattedArea[] = {0,0,0,0,0}; 1025612Sgblack@eecs.umich.educonst uint8_t X86ISA::SMBios::SMBiosTable:: 1035612Sgblack@eecs.umich.edu SMBiosHeader::entryPointLength = 0x1F; 1045612Sgblack@eecs.umich.educonst uint8_t X86ISA::SMBios::SMBiosTable:: 1055612Sgblack@eecs.umich.edu SMBiosHeader::entryPointRevision = 0; 1065612Sgblack@eecs.umich.educonst char X86ISA::SMBios::SMBiosTable:: 1075612Sgblack@eecs.umich.edu SMBiosHeader::IntermediateHeader::anchorString[] = "_DMI_"; 1085612Sgblack@eecs.umich.edu 1095615Sgblack@eecs.umich.edutemplate <class T> 1105615Sgblack@eecs.umich.eduuint64_t 1115615Sgblack@eecs.umich.educomposeBitVector(T vec) 1125615Sgblack@eecs.umich.edu{ 1135615Sgblack@eecs.umich.edu uint64_t val = 0; 1145615Sgblack@eecs.umich.edu typename T::iterator vecIt; 1155615Sgblack@eecs.umich.edu for (vecIt = vec.begin(); vecIt != vec.end(); vecIt++) { 1165615Sgblack@eecs.umich.edu val |= (1 << (*vecIt)); 1175615Sgblack@eecs.umich.edu } 1185615Sgblack@eecs.umich.edu return val; 1195615Sgblack@eecs.umich.edu} 1205615Sgblack@eecs.umich.edu 1215615Sgblack@eecs.umich.eduuint16_t 1225615Sgblack@eecs.umich.eduX86ISA::SMBios::SMBiosStructure::writeOut(FunctionalPort * port, Addr addr) 1235615Sgblack@eecs.umich.edu{ 1245615Sgblack@eecs.umich.edu port->writeBlob(addr, (uint8_t *)(&type), 1); 1255615Sgblack@eecs.umich.edu 1265615Sgblack@eecs.umich.edu uint8_t length = getLength(); 1275615Sgblack@eecs.umich.edu port->writeBlob(addr + 1, (uint8_t *)(&length), 1); 1285615Sgblack@eecs.umich.edu 1295615Sgblack@eecs.umich.edu uint16_t handleGuest = X86ISA::htog(handle); 1305615Sgblack@eecs.umich.edu port->writeBlob(addr + 2, (uint8_t *)(&handleGuest), 2); 1315615Sgblack@eecs.umich.edu 1325615Sgblack@eecs.umich.edu return length + getStringLength(); 1335615Sgblack@eecs.umich.edu} 1345615Sgblack@eecs.umich.edu 1355615Sgblack@eecs.umich.eduX86ISA::SMBios::SMBiosStructure::SMBiosStructure(Params * p, uint8_t _type) : 1365615Sgblack@eecs.umich.edu SimObject(p), type(_type), handle(0), stringFields(false) 1375615Sgblack@eecs.umich.edu{} 1385615Sgblack@eecs.umich.edu 1395615Sgblack@eecs.umich.eduvoid 1405615Sgblack@eecs.umich.eduX86ISA::SMBios::SMBiosStructure::writeOutStrings( 1415615Sgblack@eecs.umich.edu FunctionalPort * port, Addr addr) 1425615Sgblack@eecs.umich.edu{ 1435615Sgblack@eecs.umich.edu std::vector<std::string>::iterator it; 1445615Sgblack@eecs.umich.edu Addr offset = 0; 1455615Sgblack@eecs.umich.edu 1465615Sgblack@eecs.umich.edu const uint8_t nullTerminator = 0; 1475615Sgblack@eecs.umich.edu 1485615Sgblack@eecs.umich.edu // If there are string fields but none of them are used, that's a 1495615Sgblack@eecs.umich.edu // special case which is handled by this if. 1505615Sgblack@eecs.umich.edu if (strings.size() == 0 && stringFields) { 1515615Sgblack@eecs.umich.edu port->writeBlob(addr + offset, (uint8_t *)(&nullTerminator), 1); 1525615Sgblack@eecs.umich.edu offset++; 1535615Sgblack@eecs.umich.edu } else { 1545615Sgblack@eecs.umich.edu for (it = strings.begin(); it != strings.end(); it++) { 1555615Sgblack@eecs.umich.edu port->writeBlob(addr + offset, 1565615Sgblack@eecs.umich.edu (uint8_t *)it->c_str(), it->length() + 1); 1575615Sgblack@eecs.umich.edu offset += it->length() + 1; 1585615Sgblack@eecs.umich.edu } 1595615Sgblack@eecs.umich.edu } 1605615Sgblack@eecs.umich.edu port->writeBlob(addr + offset, (uint8_t *)(&nullTerminator), 1); 1615615Sgblack@eecs.umich.edu} 1625615Sgblack@eecs.umich.edu 1635615Sgblack@eecs.umich.eduint 1645615Sgblack@eecs.umich.eduX86ISA::SMBios::SMBiosStructure::getStringLength() 1655615Sgblack@eecs.umich.edu{ 1665615Sgblack@eecs.umich.edu int size = 0; 1675615Sgblack@eecs.umich.edu std::vector<std::string>::iterator it; 1685615Sgblack@eecs.umich.edu 1695615Sgblack@eecs.umich.edu for (it = strings.begin(); it != strings.end(); it++) { 1705615Sgblack@eecs.umich.edu size += it->length() + 1; 1715615Sgblack@eecs.umich.edu } 1725615Sgblack@eecs.umich.edu 1735615Sgblack@eecs.umich.edu return size + 1; 1745615Sgblack@eecs.umich.edu} 1755615Sgblack@eecs.umich.edu 1765615Sgblack@eecs.umich.eduint 1775615Sgblack@eecs.umich.eduX86ISA::SMBios::SMBiosStructure::addString(string & newString) 1785615Sgblack@eecs.umich.edu{ 1795615Sgblack@eecs.umich.edu stringFields = true; 1805615Sgblack@eecs.umich.edu // If a string is empty, treat it as not existing. The index for empty 1815615Sgblack@eecs.umich.edu // strings is 0. 1825615Sgblack@eecs.umich.edu if (newString.length() == 0) 1835615Sgblack@eecs.umich.edu return 0; 1845615Sgblack@eecs.umich.edu strings.push_back(newString); 1855615Sgblack@eecs.umich.edu return strings.size(); 1865615Sgblack@eecs.umich.edu} 1875615Sgblack@eecs.umich.edu 1885615Sgblack@eecs.umich.edustring 1895615Sgblack@eecs.umich.eduX86ISA::SMBios::SMBiosStructure::readString(int n) 1905615Sgblack@eecs.umich.edu{ 1915615Sgblack@eecs.umich.edu assert(n > 0 && n <= strings.size()); 1925615Sgblack@eecs.umich.edu return strings[n - 1]; 1935615Sgblack@eecs.umich.edu} 1945615Sgblack@eecs.umich.edu 1955615Sgblack@eecs.umich.eduvoid 1965615Sgblack@eecs.umich.eduX86ISA::SMBios::SMBiosStructure::setString(int n, std::string & newString) 1975615Sgblack@eecs.umich.edu{ 1985615Sgblack@eecs.umich.edu assert(n > 0 && n <= strings.size()); 1995615Sgblack@eecs.umich.edu strings[n - 1] = newString; 2005615Sgblack@eecs.umich.edu} 2015615Sgblack@eecs.umich.edu 2025615Sgblack@eecs.umich.eduX86ISA::SMBios::BiosInformation::BiosInformation(Params * p) : 2035615Sgblack@eecs.umich.edu SMBiosStructure(p, Type), 2045615Sgblack@eecs.umich.edu startingAddrSegment(p->starting_addr_segment), 2055615Sgblack@eecs.umich.edu romSize(p->rom_size), 2065615Sgblack@eecs.umich.edu majorVer(p->major), minorVer(p->minor), 2075615Sgblack@eecs.umich.edu embContFirmwareMajor(p->emb_cont_firmware_major), 2085615Sgblack@eecs.umich.edu embContFirmwareMinor(p->emb_cont_firmware_minor) 2095615Sgblack@eecs.umich.edu { 2105615Sgblack@eecs.umich.edu vendor = addString(p->vendor); 2115615Sgblack@eecs.umich.edu version = addString(p->version); 2125615Sgblack@eecs.umich.edu releaseDate = addString(p->release_date); 2135615Sgblack@eecs.umich.edu 2145615Sgblack@eecs.umich.edu characteristics = composeBitVector(p->characteristics); 2155615Sgblack@eecs.umich.edu characteristicExtBytes = 2165615Sgblack@eecs.umich.edu composeBitVector(p->characteristic_ext_bytes); 2175615Sgblack@eecs.umich.edu } 2185615Sgblack@eecs.umich.edu 2195612Sgblack@eecs.umich.eduuint16_t 2205612Sgblack@eecs.umich.eduX86ISA::SMBios::BiosInformation::writeOut(FunctionalPort * port, Addr addr) 2215612Sgblack@eecs.umich.edu{ 2225612Sgblack@eecs.umich.edu uint8_t size = SMBiosStructure::writeOut(port, addr); 2235612Sgblack@eecs.umich.edu 2245612Sgblack@eecs.umich.edu port->writeBlob(addr + 0x4, (uint8_t *)(&vendor), 1); 2255612Sgblack@eecs.umich.edu port->writeBlob(addr + 0x5, (uint8_t *)(&version), 1); 2265612Sgblack@eecs.umich.edu 2275612Sgblack@eecs.umich.edu uint16_t startingAddrSegmentGuest = X86ISA::htog(startingAddrSegment); 2285612Sgblack@eecs.umich.edu port->writeBlob(addr + 0x6, (uint8_t *)(&startingAddrSegmentGuest), 2); 2295612Sgblack@eecs.umich.edu 2305612Sgblack@eecs.umich.edu port->writeBlob(addr + 0x8, (uint8_t *)(&releaseDate), 1); 2315612Sgblack@eecs.umich.edu port->writeBlob(addr + 0x9, (uint8_t *)(&romSize), 1); 2325612Sgblack@eecs.umich.edu 2335612Sgblack@eecs.umich.edu uint64_t characteristicsGuest = X86ISA::htog(characteristics); 2345612Sgblack@eecs.umich.edu port->writeBlob(addr + 0xA, (uint8_t *)(&characteristicsGuest), 8); 2355612Sgblack@eecs.umich.edu 2365612Sgblack@eecs.umich.edu uint16_t characteristicExtBytesGuest = 2375612Sgblack@eecs.umich.edu X86ISA::htog(characteristicExtBytes); 2385612Sgblack@eecs.umich.edu port->writeBlob(addr + 0x12, (uint8_t *)(&characteristicExtBytesGuest), 2); 2395612Sgblack@eecs.umich.edu 2405615Sgblack@eecs.umich.edu port->writeBlob(addr + 0x14, (uint8_t *)(&majorVer), 1); 2415615Sgblack@eecs.umich.edu port->writeBlob(addr + 0x15, (uint8_t *)(&minorVer), 1); 2425612Sgblack@eecs.umich.edu port->writeBlob(addr + 0x16, (uint8_t *)(&embContFirmwareMajor), 1); 2435612Sgblack@eecs.umich.edu port->writeBlob(addr + 0x17, (uint8_t *)(&embContFirmwareMinor), 1); 2445612Sgblack@eecs.umich.edu 2455612Sgblack@eecs.umich.edu writeOutStrings(port, addr + getLength()); 2465612Sgblack@eecs.umich.edu 2475612Sgblack@eecs.umich.edu return size; 2485612Sgblack@eecs.umich.edu} 2495612Sgblack@eecs.umich.edu 2505615Sgblack@eecs.umich.eduX86ISA::SMBios::SMBiosTable::SMBiosTable(Params * p) : 2515615Sgblack@eecs.umich.edu SimObject(p), structures(p->structures) 2525615Sgblack@eecs.umich.edu{ 2535615Sgblack@eecs.umich.edu smbiosHeader.majorVersion = p->major_version; 2545615Sgblack@eecs.umich.edu smbiosHeader.minorVersion = p->minor_version; 2555615Sgblack@eecs.umich.edu assert(p->major_version <= 9); 2565615Sgblack@eecs.umich.edu assert(p->minor_version <= 9); 2575615Sgblack@eecs.umich.edu smbiosHeader.intermediateHeader.smbiosBCDRevision = 2585615Sgblack@eecs.umich.edu (p->major_version << 4) | p->minor_version; 2595615Sgblack@eecs.umich.edu} 2605615Sgblack@eecs.umich.edu 2615612Sgblack@eecs.umich.eduvoid 2625615Sgblack@eecs.umich.eduX86ISA::SMBios::SMBiosTable::writeOut(FunctionalPort * port, Addr addr, 2635615Sgblack@eecs.umich.edu Addr &headerSize, Addr &structSize) 2645612Sgblack@eecs.umich.edu{ 2655615Sgblack@eecs.umich.edu headerSize = 0x1F; 2665612Sgblack@eecs.umich.edu 2675612Sgblack@eecs.umich.edu /* 2685612Sgblack@eecs.umich.edu * The main header 2695612Sgblack@eecs.umich.edu */ 2705612Sgblack@eecs.umich.edu uint8_t mainChecksum = 0; 2715612Sgblack@eecs.umich.edu 2725612Sgblack@eecs.umich.edu port->writeBlob(addr, (uint8_t *)smbiosHeader.anchorString, 4); 2735612Sgblack@eecs.umich.edu for (int i = 0; i < 4; i++) 2745612Sgblack@eecs.umich.edu mainChecksum += smbiosHeader.anchorString[i]; 2755612Sgblack@eecs.umich.edu 2765612Sgblack@eecs.umich.edu // The checksum goes here, but we're figuring it out as we go. 2775612Sgblack@eecs.umich.edu 2785612Sgblack@eecs.umich.edu port->writeBlob(addr + 0x5, 2795612Sgblack@eecs.umich.edu (uint8_t *)(&smbiosHeader.entryPointLength), 1); 2805612Sgblack@eecs.umich.edu mainChecksum += smbiosHeader.entryPointLength; 2815612Sgblack@eecs.umich.edu port->writeBlob(addr + 0x6, 2825612Sgblack@eecs.umich.edu (uint8_t *)(&smbiosHeader.majorVersion), 1); 2835612Sgblack@eecs.umich.edu mainChecksum += smbiosHeader.majorVersion; 2845612Sgblack@eecs.umich.edu port->writeBlob(addr + 0x7, 2855612Sgblack@eecs.umich.edu (uint8_t *)(&smbiosHeader.minorVersion), 1); 2865612Sgblack@eecs.umich.edu mainChecksum += smbiosHeader.minorVersion; 2875612Sgblack@eecs.umich.edu // Maximum structure size goes here, but we'll figure it out later. 2885612Sgblack@eecs.umich.edu port->writeBlob(addr + 0xA, 2895612Sgblack@eecs.umich.edu (uint8_t *)(&smbiosHeader.entryPointRevision), 1); 2905612Sgblack@eecs.umich.edu mainChecksum += smbiosHeader.entryPointRevision; 2915612Sgblack@eecs.umich.edu port->writeBlob(addr + 0xB, 2925612Sgblack@eecs.umich.edu (uint8_t *)(&smbiosHeader.formattedArea), 5); 2935612Sgblack@eecs.umich.edu for (int i = 0; i < 5; i++) 2945612Sgblack@eecs.umich.edu mainChecksum += smbiosHeader.formattedArea[i]; 2955612Sgblack@eecs.umich.edu 2965612Sgblack@eecs.umich.edu /* 2975612Sgblack@eecs.umich.edu * The intermediate header 2985612Sgblack@eecs.umich.edu */ 2995612Sgblack@eecs.umich.edu uint8_t intChecksum = 0; 3005612Sgblack@eecs.umich.edu 3015612Sgblack@eecs.umich.edu port->writeBlob(addr + 0x10, 3025612Sgblack@eecs.umich.edu (uint8_t *)smbiosHeader.intermediateHeader.anchorString, 5); 3035612Sgblack@eecs.umich.edu for (int i = 0; i < 5; i++) 3045612Sgblack@eecs.umich.edu intChecksum += smbiosHeader.intermediateHeader.anchorString[i]; 3055612Sgblack@eecs.umich.edu 3065612Sgblack@eecs.umich.edu // The checksum goes here, but we're figuring it out as we go. 3075612Sgblack@eecs.umich.edu // Then the length of the structure table which we'll find later 3085612Sgblack@eecs.umich.edu 3095612Sgblack@eecs.umich.edu uint32_t tableAddrGuest = 3105612Sgblack@eecs.umich.edu X86ISA::htog(smbiosHeader.intermediateHeader.tableAddr); 3115612Sgblack@eecs.umich.edu port->writeBlob(addr + 0x18, (uint8_t *)(&tableAddrGuest), 4); 3125612Sgblack@eecs.umich.edu for (int i = 0; i < 4; i++) { 3135612Sgblack@eecs.umich.edu intChecksum += tableAddrGuest; 3145612Sgblack@eecs.umich.edu tableAddrGuest >>= 8; 3155612Sgblack@eecs.umich.edu } 3165612Sgblack@eecs.umich.edu 3175612Sgblack@eecs.umich.edu uint16_t numStructs = X86ISA::gtoh(structures.size()); 3185612Sgblack@eecs.umich.edu port->writeBlob(addr + 0x1C, (uint8_t *)(&numStructs), 2); 3195612Sgblack@eecs.umich.edu for (int i = 0; i < 2; i++) { 3205612Sgblack@eecs.umich.edu intChecksum += numStructs; 3215612Sgblack@eecs.umich.edu numStructs >>= 8; 3225612Sgblack@eecs.umich.edu } 3235612Sgblack@eecs.umich.edu 3245612Sgblack@eecs.umich.edu port->writeBlob(addr + 0x1E, 3255612Sgblack@eecs.umich.edu (uint8_t *)(&smbiosHeader.intermediateHeader.smbiosBCDRevision), 3265612Sgblack@eecs.umich.edu 1); 3275612Sgblack@eecs.umich.edu intChecksum += smbiosHeader.intermediateHeader.smbiosBCDRevision; 3285612Sgblack@eecs.umich.edu 3295612Sgblack@eecs.umich.edu /* 3305612Sgblack@eecs.umich.edu * Structure table 3315612Sgblack@eecs.umich.edu */ 3325612Sgblack@eecs.umich.edu 3335612Sgblack@eecs.umich.edu Addr base = smbiosHeader.intermediateHeader.tableAddr; 3345612Sgblack@eecs.umich.edu Addr offset = 0; 3355612Sgblack@eecs.umich.edu uint16_t maxSize = 0; 3365615Sgblack@eecs.umich.edu std::vector<SMBiosStructure *>::iterator it; 3375612Sgblack@eecs.umich.edu for (it = structures.begin(); it != structures.end(); it++) { 3385615Sgblack@eecs.umich.edu uint16_t size = (*it)->writeOut(port, base + offset); 3395612Sgblack@eecs.umich.edu if (size > maxSize) 3405612Sgblack@eecs.umich.edu maxSize = size; 3415612Sgblack@eecs.umich.edu offset += size; 3425612Sgblack@eecs.umich.edu } 3435612Sgblack@eecs.umich.edu 3445615Sgblack@eecs.umich.edu structSize = offset; 3455615Sgblack@eecs.umich.edu 3465612Sgblack@eecs.umich.edu /* 3475612Sgblack@eecs.umich.edu * Header 3485612Sgblack@eecs.umich.edu */ 3495612Sgblack@eecs.umich.edu 3505612Sgblack@eecs.umich.edu maxSize = X86ISA::htog(maxSize); 3515612Sgblack@eecs.umich.edu port->writeBlob(addr + 0x8, (uint8_t *)(&maxSize), 2); 3525612Sgblack@eecs.umich.edu for (int i = 0; i < 2; i++) { 3535612Sgblack@eecs.umich.edu mainChecksum += maxSize; 3545612Sgblack@eecs.umich.edu maxSize >>= 8; 3555612Sgblack@eecs.umich.edu } 3565612Sgblack@eecs.umich.edu 3575612Sgblack@eecs.umich.edu // Set the checksum 3585612Sgblack@eecs.umich.edu mainChecksum = -mainChecksum; 3595612Sgblack@eecs.umich.edu port->writeBlob(addr + 0x4, (uint8_t *)(&mainChecksum), 1); 3605612Sgblack@eecs.umich.edu 3615612Sgblack@eecs.umich.edu /* 3625612Sgblack@eecs.umich.edu * Intermediate header 3635612Sgblack@eecs.umich.edu */ 3645612Sgblack@eecs.umich.edu 3655612Sgblack@eecs.umich.edu uint16_t tableSize = offset; 3665612Sgblack@eecs.umich.edu tableSize = X86ISA::htog(tableSize); 3675612Sgblack@eecs.umich.edu port->writeBlob(addr + 0x16, (uint8_t *)(&tableSize), 2); 3685612Sgblack@eecs.umich.edu for (int i = 0; i < 2; i++) { 3695612Sgblack@eecs.umich.edu intChecksum += tableSize; 3705612Sgblack@eecs.umich.edu tableSize >>= 8; 3715612Sgblack@eecs.umich.edu } 3725612Sgblack@eecs.umich.edu 3735612Sgblack@eecs.umich.edu intChecksum = -intChecksum; 3745612Sgblack@eecs.umich.edu port->writeBlob(addr + 0x15, (uint8_t *)(&intChecksum), 1); 3755612Sgblack@eecs.umich.edu} 3765615Sgblack@eecs.umich.edu 3775615Sgblack@eecs.umich.eduX86ISA::SMBios::BiosInformation * 3785615Sgblack@eecs.umich.eduX86SMBiosBiosInformationParams::create() 3795615Sgblack@eecs.umich.edu{ 3805615Sgblack@eecs.umich.edu return new X86ISA::SMBios::BiosInformation(this); 3815615Sgblack@eecs.umich.edu} 3825615Sgblack@eecs.umich.edu 3835615Sgblack@eecs.umich.eduX86ISA::SMBios::SMBiosTable * 3845615Sgblack@eecs.umich.eduX86SMBiosSMBiosTableParams::create() 3855615Sgblack@eecs.umich.edu{ 3865615Sgblack@eecs.umich.edu return new X86ISA::SMBios::SMBiosTable(this); 3875615Sgblack@eecs.umich.edu} 388