intelmp.cc revision 5625
15625Sgblack@eecs.umich.edu/* 25625Sgblack@eecs.umich.edu * Copyright (c) 2008 The Hewlett-Packard Development Company 35625Sgblack@eecs.umich.edu * All rights reserved. 45625Sgblack@eecs.umich.edu * 55625Sgblack@eecs.umich.edu * Redistribution and use of this software in source and binary forms, 65625Sgblack@eecs.umich.edu * with or without modification, are permitted provided that the 75625Sgblack@eecs.umich.edu * following conditions are met: 85625Sgblack@eecs.umich.edu * 95625Sgblack@eecs.umich.edu * The software must be used only for Non-Commercial Use which means any 105625Sgblack@eecs.umich.edu * use which is NOT directed to receiving any direct monetary 115625Sgblack@eecs.umich.edu * compensation for, or commercial advantage from such use. Illustrative 125625Sgblack@eecs.umich.edu * examples of non-commercial use are academic research, personal study, 135625Sgblack@eecs.umich.edu * teaching, education and corporate research & development. 145625Sgblack@eecs.umich.edu * Illustrative examples of commercial use are distributing products for 155625Sgblack@eecs.umich.edu * commercial advantage and providing services using the software for 165625Sgblack@eecs.umich.edu * commercial advantage. 175625Sgblack@eecs.umich.edu * 185625Sgblack@eecs.umich.edu * If you wish to use this software or functionality therein that may be 195625Sgblack@eecs.umich.edu * covered by patents for commercial use, please contact: 205625Sgblack@eecs.umich.edu * Director of Intellectual Property Licensing 215625Sgblack@eecs.umich.edu * Office of Strategy and Technology 225625Sgblack@eecs.umich.edu * Hewlett-Packard Company 235625Sgblack@eecs.umich.edu * 1501 Page Mill Road 245625Sgblack@eecs.umich.edu * Palo Alto, California 94304 255625Sgblack@eecs.umich.edu * 265625Sgblack@eecs.umich.edu * Redistributions of source code must retain the above copyright notice, 275625Sgblack@eecs.umich.edu * this list of conditions and the following disclaimer. Redistributions 285625Sgblack@eecs.umich.edu * in binary form must reproduce the above copyright notice, this list of 295625Sgblack@eecs.umich.edu * conditions and the following disclaimer in the documentation and/or 305625Sgblack@eecs.umich.edu * other materials provided with the distribution. Neither the name of 315625Sgblack@eecs.umich.edu * the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its 325625Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 335625Sgblack@eecs.umich.edu * this software without specific prior written permission. No right of 345625Sgblack@eecs.umich.edu * sublicense is granted herewith. Derivatives of the software and 355625Sgblack@eecs.umich.edu * output created using the software may be prepared, but only for 365625Sgblack@eecs.umich.edu * Non-Commercial Uses. Derivatives of the software may be shared with 375625Sgblack@eecs.umich.edu * others provided: (i) the others agree to abide by the list of 385625Sgblack@eecs.umich.edu * conditions herein which includes the Non-Commercial Use restrictions; 395625Sgblack@eecs.umich.edu * and (ii) such Derivatives of the software include the above copyright 405625Sgblack@eecs.umich.edu * notice to acknowledge the contribution from this software where 415625Sgblack@eecs.umich.edu * applicable, this list of conditions and the disclaimer below. 425625Sgblack@eecs.umich.edu * 435625Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 445625Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 455625Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 465625Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 475625Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 485625Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 495625Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 505625Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 515625Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 525625Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 535625Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 545625Sgblack@eecs.umich.edu * 555625Sgblack@eecs.umich.edu * Authors: Gabe Black 565625Sgblack@eecs.umich.edu */ 575625Sgblack@eecs.umich.edu 585625Sgblack@eecs.umich.edu#include "arch/x86/bios/intelmp.hh" 595625Sgblack@eecs.umich.edu#include "arch/x86/isa_traits.hh" 605625Sgblack@eecs.umich.edu#include "base/misc.hh" 615625Sgblack@eecs.umich.edu#include "mem/port.hh" 625625Sgblack@eecs.umich.edu#include "sim/byteswap.hh" 635625Sgblack@eecs.umich.edu#include "sim/host.hh" 645625Sgblack@eecs.umich.edu 655625Sgblack@eecs.umich.edu// Config entry types 665625Sgblack@eecs.umich.edu#include "params/X86IntelMPBaseConfigEntry.hh" 675625Sgblack@eecs.umich.edu#include "params/X86IntelMPExtConfigEntry.hh" 685625Sgblack@eecs.umich.edu 695625Sgblack@eecs.umich.edu// General table structures 705625Sgblack@eecs.umich.edu#include "params/X86IntelMPConfigTable.hh" 715625Sgblack@eecs.umich.edu#include "params/X86IntelMPFloatingPointer.hh" 725625Sgblack@eecs.umich.edu 735625Sgblack@eecs.umich.edu// Base entry types 745625Sgblack@eecs.umich.edu#include "params/X86IntelMPBus.hh" 755625Sgblack@eecs.umich.edu#include "params/X86IntelMPIOAPIC.hh" 765625Sgblack@eecs.umich.edu#include "params/X86IntelMPIOIntAssignment.hh" 775625Sgblack@eecs.umich.edu#include "params/X86IntelMPLocalIntAssignment.hh" 785625Sgblack@eecs.umich.edu#include "params/X86IntelMPProcessor.hh" 795625Sgblack@eecs.umich.edu 805625Sgblack@eecs.umich.edu// Extended entry types 815625Sgblack@eecs.umich.edu#include "params/X86IntelMPAddrSpaceMapping.hh" 825625Sgblack@eecs.umich.edu#include "params/X86IntelMPBusHierarchy.hh" 835625Sgblack@eecs.umich.edu#include "params/X86IntelMPCompatAddrSpaceMod.hh" 845625Sgblack@eecs.umich.edu 855625Sgblack@eecs.umich.eduusing namespace std; 865625Sgblack@eecs.umich.edu 875625Sgblack@eecs.umich.educonst char X86ISA::IntelMP::FloatingPointer::signature[] = "_MP_"; 885625Sgblack@eecs.umich.edu 895625Sgblack@eecs.umich.edutemplate<class T> 905625Sgblack@eecs.umich.eduuint8_t 915625Sgblack@eecs.umich.eduwriteOutField(FunctionalPort * port, Addr addr, T val) 925625Sgblack@eecs.umich.edu{ 935625Sgblack@eecs.umich.edu T guestVal = X86ISA::htog(val); 945625Sgblack@eecs.umich.edu port->writeBlob(addr, (uint8_t *)(&guestVal), sizeof(T)); 955625Sgblack@eecs.umich.edu 965625Sgblack@eecs.umich.edu uint8_t checkSum = 0; 975625Sgblack@eecs.umich.edu while(guestVal) { 985625Sgblack@eecs.umich.edu checkSum += guestVal; 995625Sgblack@eecs.umich.edu guestVal >>= 8; 1005625Sgblack@eecs.umich.edu } 1015625Sgblack@eecs.umich.edu return checkSum; 1025625Sgblack@eecs.umich.edu} 1035625Sgblack@eecs.umich.edu 1045625Sgblack@eecs.umich.eduuint8_t 1055625Sgblack@eecs.umich.eduwriteOutString(FunctionalPort * port, Addr addr, string str, int length) 1065625Sgblack@eecs.umich.edu{ 1075625Sgblack@eecs.umich.edu char cleanedString[length + 1]; 1085625Sgblack@eecs.umich.edu cleanedString[length] = 0; 1095625Sgblack@eecs.umich.edu 1105625Sgblack@eecs.umich.edu if (str.length() > length) { 1115625Sgblack@eecs.umich.edu memcpy(cleanedString, str.c_str(), length); 1125625Sgblack@eecs.umich.edu warn("Intel MP configuration table string \"%s\" " 1135625Sgblack@eecs.umich.edu "will be truncated to \"%s\".\n", str, cleanedString); 1145625Sgblack@eecs.umich.edu } else { 1155625Sgblack@eecs.umich.edu memcpy(cleanedString, str.c_str(), str.length()); 1165625Sgblack@eecs.umich.edu memset(cleanedString + str.length(), 0, length - str.length()); 1175625Sgblack@eecs.umich.edu } 1185625Sgblack@eecs.umich.edu port->writeBlob(addr, (uint8_t *)(&cleanedString), length); 1195625Sgblack@eecs.umich.edu 1205625Sgblack@eecs.umich.edu uint8_t checkSum = 0; 1215625Sgblack@eecs.umich.edu for (int i = 0; i < length; i++) 1225625Sgblack@eecs.umich.edu checkSum += cleanedString[i]; 1235625Sgblack@eecs.umich.edu 1245625Sgblack@eecs.umich.edu return checkSum; 1255625Sgblack@eecs.umich.edu} 1265625Sgblack@eecs.umich.edu 1275625Sgblack@eecs.umich.eduAddr 1285625Sgblack@eecs.umich.eduX86ISA::IntelMP::FloatingPointer::writeOut(FunctionalPort * port, Addr addr) 1295625Sgblack@eecs.umich.edu{ 1305625Sgblack@eecs.umich.edu // Make sure that either a config table is present or a default 1315625Sgblack@eecs.umich.edu // configuration was found but not both. 1325625Sgblack@eecs.umich.edu if (!tableAddr && !defaultConfig) 1335625Sgblack@eecs.umich.edu fatal("Either an MP configuration table or a default configuration " 1345625Sgblack@eecs.umich.edu "must be used."); 1355625Sgblack@eecs.umich.edu if (tableAddr && defaultConfig) 1365625Sgblack@eecs.umich.edu fatal("Both an MP configuration table and a default configuration " 1375625Sgblack@eecs.umich.edu "were set."); 1385625Sgblack@eecs.umich.edu 1395625Sgblack@eecs.umich.edu uint8_t checkSum = 0; 1405625Sgblack@eecs.umich.edu 1415625Sgblack@eecs.umich.edu port->writeBlob(addr, (uint8_t *)signature, 4); 1425625Sgblack@eecs.umich.edu for (int i = 0; i < 4; i++) 1435625Sgblack@eecs.umich.edu checkSum += signature[i]; 1445625Sgblack@eecs.umich.edu 1455625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 4, tableAddr); 1465625Sgblack@eecs.umich.edu 1475625Sgblack@eecs.umich.edu // The length of the structure in paragraphs, aka 16 byte chunks. 1485625Sgblack@eecs.umich.edu uint8_t length = 1; 1495625Sgblack@eecs.umich.edu port->writeBlob(addr + 8, &length, 1); 1505625Sgblack@eecs.umich.edu checkSum += length; 1515625Sgblack@eecs.umich.edu 1525625Sgblack@eecs.umich.edu port->writeBlob(addr + 9, &specRev, 1); 1535625Sgblack@eecs.umich.edu checkSum += specRev; 1545625Sgblack@eecs.umich.edu 1555625Sgblack@eecs.umich.edu port->writeBlob(addr + 11, &defaultConfig, 1); 1565625Sgblack@eecs.umich.edu checkSum += defaultConfig; 1575625Sgblack@eecs.umich.edu 1585625Sgblack@eecs.umich.edu uint32_t features2_5 = imcrPresent ? (1 << 7) : 0; 1595625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 12, features2_5); 1605625Sgblack@eecs.umich.edu 1615625Sgblack@eecs.umich.edu checkSum = -checkSum; 1625625Sgblack@eecs.umich.edu port->writeBlob(addr + 10, &checkSum, 1); 1635625Sgblack@eecs.umich.edu 1645625Sgblack@eecs.umich.edu return 16; 1655625Sgblack@eecs.umich.edu} 1665625Sgblack@eecs.umich.edu 1675625Sgblack@eecs.umich.eduX86ISA::IntelMP::FloatingPointer::FloatingPointer(Params * p) : 1685625Sgblack@eecs.umich.edu SimObject(p), tableAddr(0), specRev(p->spec_rev), 1695625Sgblack@eecs.umich.edu defaultConfig(p->default_config), imcrPresent(p->imcr_present) 1705625Sgblack@eecs.umich.edu{} 1715625Sgblack@eecs.umich.edu 1725625Sgblack@eecs.umich.eduX86ISA::IntelMP::FloatingPointer * 1735625Sgblack@eecs.umich.eduX86IntelMPFloatingPointerParams::create() 1745625Sgblack@eecs.umich.edu{ 1755625Sgblack@eecs.umich.edu return new X86ISA::IntelMP::FloatingPointer(this); 1765625Sgblack@eecs.umich.edu} 1775625Sgblack@eecs.umich.edu 1785625Sgblack@eecs.umich.eduAddr 1795625Sgblack@eecs.umich.eduX86ISA::IntelMP::BaseConfigEntry::writeOut(FunctionalPort * port, 1805625Sgblack@eecs.umich.edu Addr addr, uint8_t &checkSum) 1815625Sgblack@eecs.umich.edu{ 1825625Sgblack@eecs.umich.edu port->writeBlob(addr, &type, 1); 1835625Sgblack@eecs.umich.edu checkSum += type; 1845625Sgblack@eecs.umich.edu return 1; 1855625Sgblack@eecs.umich.edu} 1865625Sgblack@eecs.umich.edu 1875625Sgblack@eecs.umich.eduX86ISA::IntelMP::BaseConfigEntry::BaseConfigEntry(Params * p, uint8_t _type) : 1885625Sgblack@eecs.umich.edu SimObject(p), type(_type) 1895625Sgblack@eecs.umich.edu{} 1905625Sgblack@eecs.umich.edu 1915625Sgblack@eecs.umich.eduAddr 1925625Sgblack@eecs.umich.eduX86ISA::IntelMP::ExtConfigEntry::writeOut(FunctionalPort * port, 1935625Sgblack@eecs.umich.edu Addr addr, uint8_t &checkSum) 1945625Sgblack@eecs.umich.edu{ 1955625Sgblack@eecs.umich.edu port->writeBlob(addr, &type, 1); 1965625Sgblack@eecs.umich.edu checkSum += type; 1975625Sgblack@eecs.umich.edu port->writeBlob(addr + 1, &length, 1); 1985625Sgblack@eecs.umich.edu checkSum += length; 1995625Sgblack@eecs.umich.edu return 1; 2005625Sgblack@eecs.umich.edu} 2015625Sgblack@eecs.umich.edu 2025625Sgblack@eecs.umich.eduX86ISA::IntelMP::ExtConfigEntry::ExtConfigEntry(Params * p, 2035625Sgblack@eecs.umich.edu uint8_t _type, uint8_t _length) : 2045625Sgblack@eecs.umich.edu SimObject(p), type(_type), length(_length) 2055625Sgblack@eecs.umich.edu{} 2065625Sgblack@eecs.umich.edu 2075625Sgblack@eecs.umich.educonst char X86ISA::IntelMP::ConfigTable::signature[] = "PCMP"; 2085625Sgblack@eecs.umich.edu 2095625Sgblack@eecs.umich.eduAddr 2105625Sgblack@eecs.umich.eduX86ISA::IntelMP::ConfigTable::writeOut(FunctionalPort * port, Addr addr) 2115625Sgblack@eecs.umich.edu{ 2125625Sgblack@eecs.umich.edu uint8_t checkSum = 0; 2135625Sgblack@eecs.umich.edu 2145625Sgblack@eecs.umich.edu port->writeBlob(addr, (uint8_t *)signature, 4); 2155625Sgblack@eecs.umich.edu for (int i = 0; i < 4; i++) 2165625Sgblack@eecs.umich.edu checkSum += signature[i]; 2175625Sgblack@eecs.umich.edu 2185625Sgblack@eecs.umich.edu // Base table length goes here but will be calculated later. 2195625Sgblack@eecs.umich.edu 2205625Sgblack@eecs.umich.edu port->writeBlob(addr + 6, (uint8_t *)(&specRev), 1); 2215625Sgblack@eecs.umich.edu checkSum += specRev; 2225625Sgblack@eecs.umich.edu 2235625Sgblack@eecs.umich.edu // The checksum goes here but is still being calculated. 2245625Sgblack@eecs.umich.edu 2255625Sgblack@eecs.umich.edu checkSum += writeOutString(port, addr + 8, oemID, 8); 2265625Sgblack@eecs.umich.edu checkSum += writeOutString(port, addr + 16, productID, 12); 2275625Sgblack@eecs.umich.edu 2285625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 28, oemTableAddr); 2295625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 32, oemTableSize); 2305625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 34, (uint16_t)baseEntries.size()); 2315625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 36, localApic); 2325625Sgblack@eecs.umich.edu 2335625Sgblack@eecs.umich.edu uint8_t reserved = 0; 2345625Sgblack@eecs.umich.edu port->writeBlob(addr + 43, &reserved, 1); 2355625Sgblack@eecs.umich.edu checkSum += reserved; 2365625Sgblack@eecs.umich.edu 2375625Sgblack@eecs.umich.edu vector<BaseConfigEntry *>::iterator baseEnt; 2385625Sgblack@eecs.umich.edu uint16_t offset = 44; 2395625Sgblack@eecs.umich.edu for (baseEnt = baseEntries.begin(); 2405625Sgblack@eecs.umich.edu baseEnt != baseEntries.end(); baseEnt++) { 2415625Sgblack@eecs.umich.edu offset += (*baseEnt)->writeOut(port, addr + offset, checkSum); 2425625Sgblack@eecs.umich.edu } 2435625Sgblack@eecs.umich.edu 2445625Sgblack@eecs.umich.edu // We've found the end of the base table this point. 2455625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 4, offset); 2465625Sgblack@eecs.umich.edu 2475625Sgblack@eecs.umich.edu vector<ExtConfigEntry *>::iterator extEnt; 2485625Sgblack@eecs.umich.edu uint16_t extOffset = 0; 2495625Sgblack@eecs.umich.edu uint8_t extCheckSum = 0; 2505625Sgblack@eecs.umich.edu for (extEnt = extEntries.begin(); 2515625Sgblack@eecs.umich.edu extEnt != extEntries.end(); extEnt++) { 2525625Sgblack@eecs.umich.edu extOffset += (*extEnt)->writeOut(port, 2535625Sgblack@eecs.umich.edu addr + offset + extOffset, extCheckSum); 2545625Sgblack@eecs.umich.edu } 2555625Sgblack@eecs.umich.edu 2565625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 40, extOffset); 2575625Sgblack@eecs.umich.edu extCheckSum = -extCheckSum; 2585625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 42, extCheckSum); 2595625Sgblack@eecs.umich.edu 2605625Sgblack@eecs.umich.edu // And now, we finally have the whole check sum completed. 2615625Sgblack@eecs.umich.edu checkSum = -checkSum; 2625625Sgblack@eecs.umich.edu writeOutField(port, addr + 7, checkSum); 2635625Sgblack@eecs.umich.edu 2645625Sgblack@eecs.umich.edu return offset + extOffset; 2655625Sgblack@eecs.umich.edu}; 2665625Sgblack@eecs.umich.edu 2675625Sgblack@eecs.umich.eduX86ISA::IntelMP::ConfigTable::ConfigTable(Params * p) : SimObject(p), 2685625Sgblack@eecs.umich.edu specRev(p->spec_rev), oemID(p->oem_id), productID(p->product_id), 2695625Sgblack@eecs.umich.edu oemTableAddr(p->oem_table_addr), oemTableSize(p->oem_table_size), 2705625Sgblack@eecs.umich.edu localApic(p->local_apic), 2715625Sgblack@eecs.umich.edu baseEntries(p->base_entries), extEntries(p->ext_entries) 2725625Sgblack@eecs.umich.edu{} 2735625Sgblack@eecs.umich.edu 2745625Sgblack@eecs.umich.eduX86ISA::IntelMP::ConfigTable * 2755625Sgblack@eecs.umich.eduX86IntelMPConfigTableParams::create() 2765625Sgblack@eecs.umich.edu{ 2775625Sgblack@eecs.umich.edu return new X86ISA::IntelMP::ConfigTable(this); 2785625Sgblack@eecs.umich.edu} 2795625Sgblack@eecs.umich.edu 2805625Sgblack@eecs.umich.eduAddr 2815625Sgblack@eecs.umich.eduX86ISA::IntelMP::Processor::writeOut( 2825625Sgblack@eecs.umich.edu FunctionalPort * port, Addr addr, uint8_t &checkSum) 2835625Sgblack@eecs.umich.edu{ 2845625Sgblack@eecs.umich.edu BaseConfigEntry::writeOut(port, addr, checkSum); 2855625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 1, localApicID); 2865625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 2, localApicVersion); 2875625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 3, cpuFlags); 2885625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 4, cpuSignature); 2895625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 8, featureFlags); 2905625Sgblack@eecs.umich.edu 2915625Sgblack@eecs.umich.edu uint32_t reserved = 0; 2925625Sgblack@eecs.umich.edu port->writeBlob(addr + 12, (uint8_t *)(&reserved), 4); 2935625Sgblack@eecs.umich.edu port->writeBlob(addr + 16, (uint8_t *)(&reserved), 4); 2945625Sgblack@eecs.umich.edu return 20; 2955625Sgblack@eecs.umich.edu} 2965625Sgblack@eecs.umich.edu 2975625Sgblack@eecs.umich.eduX86ISA::IntelMP::Processor::Processor(Params * p) : BaseConfigEntry(p, 0), 2985625Sgblack@eecs.umich.edu localApicID(p->local_apic_id), localApicVersion(p->local_apic_version), 2995625Sgblack@eecs.umich.edu cpuFlags(0), cpuSignature(0), featureFlags(p->feature_flags) 3005625Sgblack@eecs.umich.edu{ 3015625Sgblack@eecs.umich.edu if (p->enable) 3025625Sgblack@eecs.umich.edu cpuFlags |= (1 << 0); 3035625Sgblack@eecs.umich.edu if (p->bootstrap) 3045625Sgblack@eecs.umich.edu cpuFlags |= (1 << 1); 3055625Sgblack@eecs.umich.edu 3065625Sgblack@eecs.umich.edu replaceBits(cpuSignature, 0, 3, p->stepping); 3075625Sgblack@eecs.umich.edu replaceBits(cpuSignature, 4, 7, p->model); 3085625Sgblack@eecs.umich.edu replaceBits(cpuSignature, 8, 11, p->family); 3095625Sgblack@eecs.umich.edu} 3105625Sgblack@eecs.umich.edu 3115625Sgblack@eecs.umich.eduX86ISA::IntelMP::Processor * 3125625Sgblack@eecs.umich.eduX86IntelMPProcessorParams::create() 3135625Sgblack@eecs.umich.edu{ 3145625Sgblack@eecs.umich.edu return new X86ISA::IntelMP::Processor(this); 3155625Sgblack@eecs.umich.edu} 3165625Sgblack@eecs.umich.edu 3175625Sgblack@eecs.umich.eduAddr 3185625Sgblack@eecs.umich.eduX86ISA::IntelMP::Bus::writeOut( 3195625Sgblack@eecs.umich.edu FunctionalPort * port, Addr addr, uint8_t &checkSum) 3205625Sgblack@eecs.umich.edu{ 3215625Sgblack@eecs.umich.edu BaseConfigEntry::writeOut(port, addr, checkSum); 3225625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 1, busID); 3235625Sgblack@eecs.umich.edu checkSum += writeOutString(port, addr + 2, busType, 6); 3245625Sgblack@eecs.umich.edu return 8; 3255625Sgblack@eecs.umich.edu} 3265625Sgblack@eecs.umich.edu 3275625Sgblack@eecs.umich.eduX86ISA::IntelMP::Bus::Bus(Params * p) : BaseConfigEntry(p, 1), 3285625Sgblack@eecs.umich.edu busID(p->bus_id), busType(p->bus_type) 3295625Sgblack@eecs.umich.edu{} 3305625Sgblack@eecs.umich.edu 3315625Sgblack@eecs.umich.eduX86ISA::IntelMP::Bus * 3325625Sgblack@eecs.umich.eduX86IntelMPBusParams::create() 3335625Sgblack@eecs.umich.edu{ 3345625Sgblack@eecs.umich.edu return new X86ISA::IntelMP::Bus(this); 3355625Sgblack@eecs.umich.edu} 3365625Sgblack@eecs.umich.edu 3375625Sgblack@eecs.umich.eduAddr 3385625Sgblack@eecs.umich.eduX86ISA::IntelMP::IOAPIC::writeOut( 3395625Sgblack@eecs.umich.edu FunctionalPort * port, Addr addr, uint8_t &checkSum) 3405625Sgblack@eecs.umich.edu{ 3415625Sgblack@eecs.umich.edu BaseConfigEntry::writeOut(port, addr, checkSum); 3425625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 1, id); 3435625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 2, version); 3445625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 3, flags); 3455625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 4, address); 3465625Sgblack@eecs.umich.edu return 8; 3475625Sgblack@eecs.umich.edu} 3485625Sgblack@eecs.umich.edu 3495625Sgblack@eecs.umich.eduX86ISA::IntelMP::IOAPIC::IOAPIC(Params * p) : BaseConfigEntry(p, 2), 3505625Sgblack@eecs.umich.edu id(p->id), version(p->version), flags(0), address(p->address) 3515625Sgblack@eecs.umich.edu{ 3525625Sgblack@eecs.umich.edu if (p->enable) 3535625Sgblack@eecs.umich.edu flags |= 1; 3545625Sgblack@eecs.umich.edu} 3555625Sgblack@eecs.umich.edu 3565625Sgblack@eecs.umich.eduX86ISA::IntelMP::IOAPIC * 3575625Sgblack@eecs.umich.eduX86IntelMPIOAPICParams::create() 3585625Sgblack@eecs.umich.edu{ 3595625Sgblack@eecs.umich.edu return new X86ISA::IntelMP::IOAPIC(this); 3605625Sgblack@eecs.umich.edu} 3615625Sgblack@eecs.umich.edu 3625625Sgblack@eecs.umich.eduAddr 3635625Sgblack@eecs.umich.eduX86ISA::IntelMP::IntAssignment::writeOut( 3645625Sgblack@eecs.umich.edu FunctionalPort * port, Addr addr, uint8_t &checkSum) 3655625Sgblack@eecs.umich.edu{ 3665625Sgblack@eecs.umich.edu BaseConfigEntry::writeOut(port, addr, checkSum); 3675625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 1, interruptType); 3685625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 2, flags); 3695625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 4, sourceBusID); 3705625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 5, sourceBusIRQ); 3715625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 6, destApicID); 3725625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 7, destApicIntIn); 3735625Sgblack@eecs.umich.edu return 8; 3745625Sgblack@eecs.umich.edu} 3755625Sgblack@eecs.umich.edu 3765625Sgblack@eecs.umich.eduX86ISA::IntelMP::IOIntAssignment::IOIntAssignment(Params * p) : 3775625Sgblack@eecs.umich.edu IntAssignment(p, p->interrupt_type, p->polarity, p->trigger, 3, 3785625Sgblack@eecs.umich.edu p->source_bus_id, p->source_bus_irq, 3795625Sgblack@eecs.umich.edu p->dest_io_apic_id, p->dest_io_apic_intin) 3805625Sgblack@eecs.umich.edu{} 3815625Sgblack@eecs.umich.edu 3825625Sgblack@eecs.umich.eduX86ISA::IntelMP::IOIntAssignment * 3835625Sgblack@eecs.umich.eduX86IntelMPIOIntAssignmentParams::create() 3845625Sgblack@eecs.umich.edu{ 3855625Sgblack@eecs.umich.edu return new X86ISA::IntelMP::IOIntAssignment(this); 3865625Sgblack@eecs.umich.edu} 3875625Sgblack@eecs.umich.edu 3885625Sgblack@eecs.umich.eduX86ISA::IntelMP::LocalIntAssignment::LocalIntAssignment(Params * p) : 3895625Sgblack@eecs.umich.edu IntAssignment(p, p->interrupt_type, p->polarity, p->trigger, 4, 3905625Sgblack@eecs.umich.edu p->source_bus_id, p->source_bus_irq, 3915625Sgblack@eecs.umich.edu p->dest_local_apic_id, p->dest_local_apic_intin) 3925625Sgblack@eecs.umich.edu{} 3935625Sgblack@eecs.umich.edu 3945625Sgblack@eecs.umich.eduX86ISA::IntelMP::LocalIntAssignment * 3955625Sgblack@eecs.umich.eduX86IntelMPLocalIntAssignmentParams::create() 3965625Sgblack@eecs.umich.edu{ 3975625Sgblack@eecs.umich.edu return new X86ISA::IntelMP::LocalIntAssignment(this); 3985625Sgblack@eecs.umich.edu} 3995625Sgblack@eecs.umich.edu 4005625Sgblack@eecs.umich.eduAddr 4015625Sgblack@eecs.umich.eduX86ISA::IntelMP::AddrSpaceMapping::writeOut( 4025625Sgblack@eecs.umich.edu FunctionalPort * port, Addr addr, uint8_t &checkSum) 4035625Sgblack@eecs.umich.edu{ 4045625Sgblack@eecs.umich.edu ExtConfigEntry::writeOut(port, addr, checkSum); 4055625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 2, busID); 4065625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 3, addrType); 4075625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 4, addr); 4085625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 12, addrLength); 4095625Sgblack@eecs.umich.edu return length; 4105625Sgblack@eecs.umich.edu} 4115625Sgblack@eecs.umich.edu 4125625Sgblack@eecs.umich.eduX86ISA::IntelMP::AddrSpaceMapping::AddrSpaceMapping(Params * p) : 4135625Sgblack@eecs.umich.edu ExtConfigEntry(p, 128, 20), 4145625Sgblack@eecs.umich.edu busID(p->bus_id), addrType(p->address_type), 4155625Sgblack@eecs.umich.edu addr(p->address), addrLength(p->length) 4165625Sgblack@eecs.umich.edu{} 4175625Sgblack@eecs.umich.edu 4185625Sgblack@eecs.umich.eduX86ISA::IntelMP::AddrSpaceMapping * 4195625Sgblack@eecs.umich.eduX86IntelMPAddrSpaceMappingParams::create() 4205625Sgblack@eecs.umich.edu{ 4215625Sgblack@eecs.umich.edu return new X86ISA::IntelMP::AddrSpaceMapping(this); 4225625Sgblack@eecs.umich.edu} 4235625Sgblack@eecs.umich.edu 4245625Sgblack@eecs.umich.eduAddr 4255625Sgblack@eecs.umich.eduX86ISA::IntelMP::BusHierarchy::writeOut( 4265625Sgblack@eecs.umich.edu FunctionalPort * port, Addr addr, uint8_t &checkSum) 4275625Sgblack@eecs.umich.edu{ 4285625Sgblack@eecs.umich.edu ExtConfigEntry::writeOut(port, addr, checkSum); 4295625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 2, busID); 4305625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 3, info); 4315625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 4, parentBus); 4325625Sgblack@eecs.umich.edu 4335625Sgblack@eecs.umich.edu uint32_t reserved = 0; 4345625Sgblack@eecs.umich.edu port->writeBlob(addr + 5, (uint8_t *)(&reserved), 3); 4355625Sgblack@eecs.umich.edu 4365625Sgblack@eecs.umich.edu return length; 4375625Sgblack@eecs.umich.edu} 4385625Sgblack@eecs.umich.edu 4395625Sgblack@eecs.umich.eduX86ISA::IntelMP::BusHierarchy::BusHierarchy(Params * p) : 4405625Sgblack@eecs.umich.edu ExtConfigEntry(p, 129, 8), 4415625Sgblack@eecs.umich.edu busID(p->bus_id), info(0), parentBus(p->parent_bus) 4425625Sgblack@eecs.umich.edu{ 4435625Sgblack@eecs.umich.edu if (p->subtractive_decode) 4445625Sgblack@eecs.umich.edu info |= 1; 4455625Sgblack@eecs.umich.edu} 4465625Sgblack@eecs.umich.edu 4475625Sgblack@eecs.umich.eduX86ISA::IntelMP::BusHierarchy * 4485625Sgblack@eecs.umich.eduX86IntelMPBusHierarchyParams::create() 4495625Sgblack@eecs.umich.edu{ 4505625Sgblack@eecs.umich.edu return new X86ISA::IntelMP::BusHierarchy(this); 4515625Sgblack@eecs.umich.edu} 4525625Sgblack@eecs.umich.edu 4535625Sgblack@eecs.umich.eduAddr 4545625Sgblack@eecs.umich.eduX86ISA::IntelMP::CompatAddrSpaceMod::writeOut( 4555625Sgblack@eecs.umich.edu FunctionalPort * port, Addr addr, uint8_t &checkSum) 4565625Sgblack@eecs.umich.edu{ 4575625Sgblack@eecs.umich.edu ExtConfigEntry::writeOut(port, addr, checkSum); 4585625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 2, busID); 4595625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 3, mod); 4605625Sgblack@eecs.umich.edu checkSum += writeOutField(port, addr + 4, rangeList); 4615625Sgblack@eecs.umich.edu return length; 4625625Sgblack@eecs.umich.edu} 4635625Sgblack@eecs.umich.edu 4645625Sgblack@eecs.umich.eduX86ISA::IntelMP::CompatAddrSpaceMod::CompatAddrSpaceMod(Params * p) : 4655625Sgblack@eecs.umich.edu ExtConfigEntry(p, 130, 8), 4665625Sgblack@eecs.umich.edu busID(p->bus_id), mod(0), rangeList(p->range_list) 4675625Sgblack@eecs.umich.edu{ 4685625Sgblack@eecs.umich.edu if (p->add) 4695625Sgblack@eecs.umich.edu mod |= 1; 4705625Sgblack@eecs.umich.edu} 4715625Sgblack@eecs.umich.edu 4725625Sgblack@eecs.umich.eduX86ISA::IntelMP::CompatAddrSpaceMod * 4735625Sgblack@eecs.umich.eduX86IntelMPCompatAddrSpaceModParams::create() 4745625Sgblack@eecs.umich.edu{ 4755625Sgblack@eecs.umich.edu return new X86ISA::IntelMP::CompatAddrSpaceMod(this); 4765625Sgblack@eecs.umich.edu} 477