15952Ssaidi@eecs.umich.edu/* 25952Ssaidi@eecs.umich.edu * Copyright (c) 2006-2009 The Regents of The University of Michigan 35952Ssaidi@eecs.umich.edu * All rights reserved. 45952Ssaidi@eecs.umich.edu * 55952Ssaidi@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 65952Ssaidi@eecs.umich.edu * modification, are permitted provided that the following conditions are 75952Ssaidi@eecs.umich.edu * met: redistributions of source code must retain the above copyright 85952Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 95952Ssaidi@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 105952Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 115952Ssaidi@eecs.umich.edu * documentation and/or other materials provided with the distribution; 125952Ssaidi@eecs.umich.edu * neither the name of the copyright holders nor the names of its 135952Ssaidi@eecs.umich.edu * contributors may be used to endorse or promote products derived from 145952Ssaidi@eecs.umich.edu * this software without specific prior written permission. 155952Ssaidi@eecs.umich.edu * 165952Ssaidi@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 175952Ssaidi@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 185952Ssaidi@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 195952Ssaidi@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 205952Ssaidi@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 215952Ssaidi@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 225952Ssaidi@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 235952Ssaidi@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 245952Ssaidi@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255952Ssaidi@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 265952Ssaidi@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275952Ssaidi@eecs.umich.edu * 285952Ssaidi@eecs.umich.edu * Authors: Ali Saidi 295952Ssaidi@eecs.umich.edu */ 305952Ssaidi@eecs.umich.edu 3111793Sbrandon.potter@amd.com#include "base/cp_annotate.hh" 3211793Sbrandon.potter@amd.com 3310377Sandreas.hansson@arm.com#include "arch/generic/linux/threadinfo.hh" 345952Ssaidi@eecs.umich.edu#include "arch/utility.hh" 3511793Sbrandon.potter@amd.com#include "base/callback.hh" 368229Snate@binkert.org#include "base/loader/object_file.hh" 375952Ssaidi@eecs.umich.edu#include "base/output.hh" 385952Ssaidi@eecs.umich.edu#include "base/trace.hh" 396658Snate@binkert.org#include "config/the_isa.hh" 405952Ssaidi@eecs.umich.edu#include "cpu/thread_context.hh" 4110377Sandreas.hansson@arm.com#include "debug/Annotate.hh" 4210377Sandreas.hansson@arm.com#include "debug/AnnotateVerbose.hh" 435952Ssaidi@eecs.umich.edu#include "sim/arguments.hh" 445952Ssaidi@eecs.umich.edu#include "sim/core.hh" 455952Ssaidi@eecs.umich.edu#include "sim/sim_exit.hh" 465952Ssaidi@eecs.umich.edu#include "sim/system.hh" 475952Ssaidi@eecs.umich.edu 485952Ssaidi@eecs.umich.edustruct CPAIgnoreSymbol 495952Ssaidi@eecs.umich.edu{ 505952Ssaidi@eecs.umich.edu const char *symbol; 515952Ssaidi@eecs.umich.edu size_t len; 525952Ssaidi@eecs.umich.edu}; 535952Ssaidi@eecs.umich.edu#define CPA_IGNORE_SYMBOL(sym) { #sym, sizeof(#sym) } 545952Ssaidi@eecs.umich.edu 555952Ssaidi@eecs.umich.eduCPAIgnoreSymbol ignoreSymbols[] = { 565952Ssaidi@eecs.umich.edu CPA_IGNORE_SYMBOL("m5a_"), 575952Ssaidi@eecs.umich.edu CPA_IGNORE_SYMBOL("ret_from_sys_call"), 585952Ssaidi@eecs.umich.edu CPA_IGNORE_SYMBOL("ret_from_reschedule"), 595952Ssaidi@eecs.umich.edu CPA_IGNORE_SYMBOL("_spin_"), 605952Ssaidi@eecs.umich.edu CPA_IGNORE_SYMBOL("local_bh_"), 615952Ssaidi@eecs.umich.edu CPA_IGNORE_SYMBOL("restore_all"), 625952Ssaidi@eecs.umich.edu CPA_IGNORE_SYMBOL("Call_Pal_"), 635952Ssaidi@eecs.umich.edu CPA_IGNORE_SYMBOL("pal_post_interrupt"), 645952Ssaidi@eecs.umich.edu CPA_IGNORE_SYMBOL("rti_to_"), 655952Ssaidi@eecs.umich.edu CPA_IGNORE_SYMBOL("sys_int_2"), 665952Ssaidi@eecs.umich.edu CPA_IGNORE_SYMBOL("sys_interrupt"), 675952Ssaidi@eecs.umich.edu CPA_IGNORE_SYMBOL("normal_int"), 685952Ssaidi@eecs.umich.edu CPA_IGNORE_SYMBOL("TRAP_INTERRUPT_10_"), 695952Ssaidi@eecs.umich.edu CPA_IGNORE_SYMBOL("Trap_Interrupt"), 705952Ssaidi@eecs.umich.edu CPA_IGNORE_SYMBOL("do_entInt"), 715952Ssaidi@eecs.umich.edu CPA_IGNORE_SYMBOL("__do_softirq"), 725952Ssaidi@eecs.umich.edu CPA_IGNORE_SYMBOL("_end"), 735952Ssaidi@eecs.umich.edu CPA_IGNORE_SYMBOL("entInt"), 745952Ssaidi@eecs.umich.edu CPA_IGNORE_SYMBOL("entSys"), 755952Ssaidi@eecs.umich.edu {0,0} 765952Ssaidi@eecs.umich.edu}; 775952Ssaidi@eecs.umich.edu#undef CPA_IGNORE_SYMBOL 785952Ssaidi@eecs.umich.edu 795952Ssaidi@eecs.umich.eduusing namespace std; 805952Ssaidi@eecs.umich.eduusing namespace TheISA; 815952Ssaidi@eecs.umich.edu 825952Ssaidi@eecs.umich.edubool CPA::exists; 835952Ssaidi@eecs.umich.eduCPA *CPA::_cpa; 845952Ssaidi@eecs.umich.edu 855952Ssaidi@eecs.umich.educlass AnnotateDumpCallback : public Callback 865952Ssaidi@eecs.umich.edu{ 875952Ssaidi@eecs.umich.edu 885952Ssaidi@eecs.umich.edu private: 895952Ssaidi@eecs.umich.edu CPA *cpa; 905952Ssaidi@eecs.umich.edu public: 915952Ssaidi@eecs.umich.edu virtual void process(); 925952Ssaidi@eecs.umich.edu AnnotateDumpCallback(CPA *_cpa) 935952Ssaidi@eecs.umich.edu : cpa(_cpa) 945952Ssaidi@eecs.umich.edu {} 955952Ssaidi@eecs.umich.edu}; 965952Ssaidi@eecs.umich.edu 975952Ssaidi@eecs.umich.eduvoid 985952Ssaidi@eecs.umich.eduAnnotateDumpCallback::process() 995952Ssaidi@eecs.umich.edu{ 1005952Ssaidi@eecs.umich.edu cpa->dump(true); 1015952Ssaidi@eecs.umich.edu cpa->dumpKey(); 1025952Ssaidi@eecs.umich.edu} 1035952Ssaidi@eecs.umich.edu 1045952Ssaidi@eecs.umich.edu 1055952Ssaidi@eecs.umich.eduCPA::CPA(Params *p) 1065952Ssaidi@eecs.umich.edu : SimObject(p), numSm(0), numSmt(0), numSys(0), numQs(0), conId(0) 1075952Ssaidi@eecs.umich.edu{ 1085952Ssaidi@eecs.umich.edu if (exists) 1095952Ssaidi@eecs.umich.edu fatal("Multiple annotation objects found in system"); 1105952Ssaidi@eecs.umich.edu exists = true; 1115952Ssaidi@eecs.umich.edu 1125952Ssaidi@eecs.umich.edu _enabled = p->enabled; 1135952Ssaidi@eecs.umich.edu _cpa = this; 1145952Ssaidi@eecs.umich.edu 1155952Ssaidi@eecs.umich.edu vector<string>::iterator i; 1165952Ssaidi@eecs.umich.edu i = p->user_apps.begin(); 1175952Ssaidi@eecs.umich.edu 1185952Ssaidi@eecs.umich.edu while (i != p->user_apps.end()) { 1195952Ssaidi@eecs.umich.edu ObjectFile *of = createObjectFile(*i); 1205952Ssaidi@eecs.umich.edu string sf; 1215952Ssaidi@eecs.umich.edu if (!of) 1225952Ssaidi@eecs.umich.edu fatal("Couldn't load symbols from file: %s\n", *i); 1235952Ssaidi@eecs.umich.edu sf = *i; 1245952Ssaidi@eecs.umich.edu sf.erase(0, sf.rfind('/') + 1);; 1255952Ssaidi@eecs.umich.edu DPRINTFN("file %s short: %s\n", *i, sf); 1265952Ssaidi@eecs.umich.edu userApp[sf] = new SymbolTable; 1275952Ssaidi@eecs.umich.edu bool result1 = of->loadGlobalSymbols(userApp[sf]); 1285952Ssaidi@eecs.umich.edu bool result2 = of->loadLocalSymbols(userApp[sf]); 1295952Ssaidi@eecs.umich.edu if (!result1 || !result2) 1305952Ssaidi@eecs.umich.edu panic("blah"); 1315952Ssaidi@eecs.umich.edu assert(result1 && result2); 1325952Ssaidi@eecs.umich.edu i++; 1335952Ssaidi@eecs.umich.edu } 1345952Ssaidi@eecs.umich.edu} 1355952Ssaidi@eecs.umich.edu 1365952Ssaidi@eecs.umich.eduvoid 1375952Ssaidi@eecs.umich.eduCPA::startup() 1385952Ssaidi@eecs.umich.edu{ 1395952Ssaidi@eecs.umich.edu osbin = simout.create("annotate.bin", true); 1405952Ssaidi@eecs.umich.edu // MAGIC version number 'M''5''A'N' + version/capabilities 1415952Ssaidi@eecs.umich.edu ah.version = 0x4D35414E00000101ULL; 1425952Ssaidi@eecs.umich.edu ah.num_recs = 0; 1435952Ssaidi@eecs.umich.edu ah.key_off = 0; 1445952Ssaidi@eecs.umich.edu osbin->write((char*)&ah, sizeof(AnnotateHeader)); 1455952Ssaidi@eecs.umich.edu 1465952Ssaidi@eecs.umich.edu registerExitCallback(new AnnotateDumpCallback(this)); 1475952Ssaidi@eecs.umich.edu} 14810377Sandreas.hansson@arm.com 14910377Sandreas.hansson@arm.comuint64_t 15010377Sandreas.hansson@arm.comCPA::getFrame(ThreadContext *tc) 15110377Sandreas.hansson@arm.com{ 15210377Sandreas.hansson@arm.com // This code is ISA specific and will need to be changed 15310377Sandreas.hansson@arm.com // if the annotation code is used for something other than Alpha 15410377Sandreas.hansson@arm.com return (tc->readMiscRegNoEffect(TheISA::IPR_PALtemp23) & 15510377Sandreas.hansson@arm.com ~ULL(0x3FFF)); 15610377Sandreas.hansson@arm.com 15710377Sandreas.hansson@arm.com} 15810377Sandreas.hansson@arm.com 1595952Ssaidi@eecs.umich.eduvoid 1605952Ssaidi@eecs.umich.eduCPA::swSmBegin(ThreadContext *tc) 1615952Ssaidi@eecs.umich.edu{ 1625952Ssaidi@eecs.umich.edu if (!enabled()) 1635952Ssaidi@eecs.umich.edu return; 1645952Ssaidi@eecs.umich.edu 1655952Ssaidi@eecs.umich.edu Arguments args(tc); 1665952Ssaidi@eecs.umich.edu std::string st; 1675952Ssaidi@eecs.umich.edu Addr junk; 1685952Ssaidi@eecs.umich.edu char sm[50]; 1695952Ssaidi@eecs.umich.edu if (!TheISA::inUserMode(tc)) 1705952Ssaidi@eecs.umich.edu debugSymbolTable->findNearestSymbol( 1715952Ssaidi@eecs.umich.edu tc->readIntReg(ReturnAddressReg), st, junk); 1725952Ssaidi@eecs.umich.edu 17314018Sgabeblack@google.com tc->getVirtProxy().readString(sm, args[0], 50); 1745952Ssaidi@eecs.umich.edu System *sys = tc->getSystemPtr(); 1755952Ssaidi@eecs.umich.edu StringWrap name(sys->name()); 1765952Ssaidi@eecs.umich.edu 1775952Ssaidi@eecs.umich.edu if (!sm[0]) 1787823Ssteve.reinhardt@amd.com warn("Got null SM at tick %d\n", curTick()); 1795952Ssaidi@eecs.umich.edu 1805952Ssaidi@eecs.umich.edu int sysi = getSys(sys); 1815952Ssaidi@eecs.umich.edu int smi = getSm(sysi, sm, args[1]); 1825952Ssaidi@eecs.umich.edu DPRINTF(Annotate, "Starting machine: %s(%d) sysi: %d id: %#x\n", sm, 1835952Ssaidi@eecs.umich.edu smi, sysi, args[1]); 18411320Ssteve.reinhardt@amd.com DPRINTF(Annotate, "smMap[%d] = %d, %s, %#x\n", smi, 18511320Ssteve.reinhardt@amd.com smMap[smi-1].first, smMap[smi-1].second.first, 1865952Ssaidi@eecs.umich.edu smMap[smi-1].second.second); 1875952Ssaidi@eecs.umich.edu 1885952Ssaidi@eecs.umich.edu uint64_t frame = getFrame(tc); 1895952Ssaidi@eecs.umich.edu StackId sid = StackId(sysi, frame); 1905952Ssaidi@eecs.umich.edu 1915952Ssaidi@eecs.umich.edu // check if we need to link to the previous state machine 1925952Ssaidi@eecs.umich.edu int flags = args[2]; 1935952Ssaidi@eecs.umich.edu if (flags & FL_LINK) { 1945952Ssaidi@eecs.umich.edu if (smStack[sid].size()) { 1955952Ssaidi@eecs.umich.edu int prev_smi = smStack[sid].back(); 1965952Ssaidi@eecs.umich.edu DPRINTF(Annotate, "Linking from %d to state machine %s(%d) [%#x]\n", 1975952Ssaidi@eecs.umich.edu prev_smi, sm, smi, args[1]); 1985952Ssaidi@eecs.umich.edu 1995952Ssaidi@eecs.umich.edu if (lnMap[smi]) 2005952Ssaidi@eecs.umich.edu DPRINTF(Annotate, "LnMap already contains entry for %d of %d\n", 2015952Ssaidi@eecs.umich.edu smi, lnMap[smi]); 2025952Ssaidi@eecs.umich.edu assert(lnMap[smi] == 0); 2035952Ssaidi@eecs.umich.edu lnMap[smi] = prev_smi; 2045952Ssaidi@eecs.umich.edu 2055952Ssaidi@eecs.umich.edu add(OP_LINK, FL_NONE, tc->contextId(), prev_smi, smi); 2065952Ssaidi@eecs.umich.edu } else { 2075952Ssaidi@eecs.umich.edu DPRINTF(Annotate, "Not Linking to state machine %s(%d) [%#x]\n", 2085952Ssaidi@eecs.umich.edu sm, smi, args[1]); 2095952Ssaidi@eecs.umich.edu } 2105952Ssaidi@eecs.umich.edu } 2115952Ssaidi@eecs.umich.edu 2125952Ssaidi@eecs.umich.edu 2135952Ssaidi@eecs.umich.edu smStack[sid].push_back(smi); 2145952Ssaidi@eecs.umich.edu 2155952Ssaidi@eecs.umich.edu DPRINTF(Annotate, "Stack Now (%#X):\n", frame); 2165952Ssaidi@eecs.umich.edu for (int x = smStack[sid].size()-1; x >= 0; x--) 2175952Ssaidi@eecs.umich.edu DPRINTF(Annotate, "-- %d\n", smStack[sid][x]); 2185952Ssaidi@eecs.umich.edu 2195952Ssaidi@eecs.umich.edu // reset the sw state exculsion to false 2205952Ssaidi@eecs.umich.edu if (swExpl[sid]) 2215952Ssaidi@eecs.umich.edu swExpl[sid] = false; 2225952Ssaidi@eecs.umich.edu 2235952Ssaidi@eecs.umich.edu 2245952Ssaidi@eecs.umich.edu Id id = Id(sm, frame); 2255952Ssaidi@eecs.umich.edu if (scLinks[sysi-1][id]) { 2265952Ssaidi@eecs.umich.edu AnnDataPtr an = scLinks[sysi-1][id]; 2275952Ssaidi@eecs.umich.edu scLinks[sysi-1].erase(id); 2285952Ssaidi@eecs.umich.edu an->stq = smi; 2295952Ssaidi@eecs.umich.edu an->dump = true; 23011320Ssteve.reinhardt@amd.com DPRINTF(Annotate, 2315952Ssaidi@eecs.umich.edu "Found prev unknown linking from %d to state machine %s(%d)\n", 2325952Ssaidi@eecs.umich.edu an->sm, sm, smi); 2335952Ssaidi@eecs.umich.edu 2345952Ssaidi@eecs.umich.edu if (lnMap[smi]) 2355952Ssaidi@eecs.umich.edu DPRINTF(Annotate, "LnMap already contains entry for %d of %d\n", 2365952Ssaidi@eecs.umich.edu smi, lnMap[smi]); 2375952Ssaidi@eecs.umich.edu assert(lnMap[smi] == 0); 2385952Ssaidi@eecs.umich.edu lnMap[smi] = an->sm; 2395952Ssaidi@eecs.umich.edu } 2405952Ssaidi@eecs.umich.edu 2415952Ssaidi@eecs.umich.edu // add a new begin ifwe have that info 2425952Ssaidi@eecs.umich.edu if (st != "") { 2435952Ssaidi@eecs.umich.edu DPRINTF(Annotate, "st: %s smi: %d stCache.size %d\n", st, 2445952Ssaidi@eecs.umich.edu smi, stCache.size()); 2455952Ssaidi@eecs.umich.edu int sti = getSt(sm, st); 2465952Ssaidi@eecs.umich.edu lastState[smi] = sti; 2475952Ssaidi@eecs.umich.edu add(OP_BEGIN, FL_NONE, tc->contextId(), smi, sti); 2485952Ssaidi@eecs.umich.edu } 2495952Ssaidi@eecs.umich.edu} 2505952Ssaidi@eecs.umich.edu 2515952Ssaidi@eecs.umich.eduvoid 2525952Ssaidi@eecs.umich.eduCPA::swSmEnd(ThreadContext *tc) 2535952Ssaidi@eecs.umich.edu{ 2545952Ssaidi@eecs.umich.edu if (!enabled()) 2555952Ssaidi@eecs.umich.edu return; 2565952Ssaidi@eecs.umich.edu 2575952Ssaidi@eecs.umich.edu Arguments args(tc); 2585952Ssaidi@eecs.umich.edu char sm[50]; 25914018Sgabeblack@google.com tc->getVirtProxy().readString(sm, args[0], 50); 2605952Ssaidi@eecs.umich.edu System *sys = tc->getSystemPtr(); 2615952Ssaidi@eecs.umich.edu doSwSmEnd(sys, tc->contextId(), sm, getFrame(tc)); 2625952Ssaidi@eecs.umich.edu} 2635952Ssaidi@eecs.umich.edu 2645952Ssaidi@eecs.umich.eduvoid 2655952Ssaidi@eecs.umich.eduCPA::doSwSmEnd(System *sys, int cpuid, string sm, uint64_t frame) 2665952Ssaidi@eecs.umich.edu{ 2675952Ssaidi@eecs.umich.edu int sysi = getSys(sys); 2685952Ssaidi@eecs.umich.edu StackId sid = StackId(sysi, frame); 2695952Ssaidi@eecs.umich.edu 2705952Ssaidi@eecs.umich.edu 2715952Ssaidi@eecs.umich.edu // reset the sw state exculsion to false 2725952Ssaidi@eecs.umich.edu if (swExpl[sid]) 2735952Ssaidi@eecs.umich.edu swExpl[sid] = false; 2745952Ssaidi@eecs.umich.edu 2755952Ssaidi@eecs.umich.edu 2765952Ssaidi@eecs.umich.edu int smib = smStack[sid].back(); 2775952Ssaidi@eecs.umich.edu StringWrap name(sys->name()); 2785952Ssaidi@eecs.umich.edu DPRINTF(Annotate, "Ending machine: %s[%d, %#x] (%d?)\n", sm, sysi, 2795952Ssaidi@eecs.umich.edu frame, smib); 2805952Ssaidi@eecs.umich.edu 2815952Ssaidi@eecs.umich.edu if (!smStack[sid].size() || smMap[smib-1].second.first != sm) { 2825952Ssaidi@eecs.umich.edu DPRINTF(Annotate, "State Machine not unwinding correctly. sid: %d, %#x" 2835952Ssaidi@eecs.umich.edu " top of stack: %s Current Stack:\n", 2845952Ssaidi@eecs.umich.edu sysi, frame, smMap[smib-1].second.first); 2855952Ssaidi@eecs.umich.edu for (int x = smStack[sid].size()-1; x >= 0; x--) 2865952Ssaidi@eecs.umich.edu DPRINTF(Annotate, "-- %d\n", smStack[sid][x]); 2875952Ssaidi@eecs.umich.edu DPRINTF(Annotate, "Ending machine: %s; end stack: %s\n", sm, 2885952Ssaidi@eecs.umich.edu smMap[smib-1].second.first); 2895952Ssaidi@eecs.umich.edu 2907823Ssteve.reinhardt@amd.com warn("State machine stack not unwinding correctly at %d\n", curTick()); 2915952Ssaidi@eecs.umich.edu } else { 29211320Ssteve.reinhardt@amd.com DPRINTF(Annotate, 2935952Ssaidi@eecs.umich.edu "State machine ending:%s sysi:%d id:%#x back:%d getSm:%d\n", 2945952Ssaidi@eecs.umich.edu sm, sysi, smMap[smib-1].second.second, smStack[sid].back(), 2955952Ssaidi@eecs.umich.edu getSm(sysi, sm, smMap[smib-1].second.second)); 29611320Ssteve.reinhardt@amd.com assert(getSm(sysi, sm, smMap[smib-1].second.second) == 2975952Ssaidi@eecs.umich.edu smStack[sid].back()); 2985952Ssaidi@eecs.umich.edu 2995952Ssaidi@eecs.umich.edu int smi = smStack[sid].back(); 3005952Ssaidi@eecs.umich.edu smStack[sid].pop_back(); 3015952Ssaidi@eecs.umich.edu 3025952Ssaidi@eecs.umich.edu if (lnMap[smi]) { 3035952Ssaidi@eecs.umich.edu DPRINTF(Annotate, "Linking %d back to %d\n", smi, lnMap[smi]); 3045952Ssaidi@eecs.umich.edu add(OP_LINK, FL_NONE, cpuid, smi, lnMap[smi]); 3055952Ssaidi@eecs.umich.edu lnMap.erase(smi); 3065952Ssaidi@eecs.umich.edu } 3075952Ssaidi@eecs.umich.edu 3085952Ssaidi@eecs.umich.edu if (smStack[sid].size()) { 3095952Ssaidi@eecs.umich.edu add(OP_BEGIN, FL_NONE, cpuid, smi, lastState[smi]); 3105952Ssaidi@eecs.umich.edu } 3115952Ssaidi@eecs.umich.edu 3125952Ssaidi@eecs.umich.edu DPRINTF(Annotate, "Stack Now:\n"); 3135952Ssaidi@eecs.umich.edu for (int x = smStack[sid].size()-1; x >= 0; x--) 3145952Ssaidi@eecs.umich.edu DPRINTF(Annotate, "-- %d\n", smStack[sid][x]); 3155952Ssaidi@eecs.umich.edu } 3165952Ssaidi@eecs.umich.edu} 3175952Ssaidi@eecs.umich.edu 3185952Ssaidi@eecs.umich.edu 3195952Ssaidi@eecs.umich.eduvoid 3205952Ssaidi@eecs.umich.eduCPA::swExplictBegin(ThreadContext *tc) 3215952Ssaidi@eecs.umich.edu{ 3225952Ssaidi@eecs.umich.edu if (!enabled()) 3235952Ssaidi@eecs.umich.edu return; 3245952Ssaidi@eecs.umich.edu 3255952Ssaidi@eecs.umich.edu Arguments args(tc); 3265952Ssaidi@eecs.umich.edu char st[50]; 32714018Sgabeblack@google.com tc->getVirtProxy().readString(st, args[1], 50); 3285952Ssaidi@eecs.umich.edu 3295952Ssaidi@eecs.umich.edu StringWrap name(tc->getSystemPtr()->name()); 3305952Ssaidi@eecs.umich.edu DPRINTF(Annotate, "Explict begin of state %s\n", st); 3315952Ssaidi@eecs.umich.edu uint32_t flags = args[0]; 3325952Ssaidi@eecs.umich.edu if (flags & FL_BAD) 3337823Ssteve.reinhardt@amd.com warn("BAD state encountered: at cycle %d: %s\n", curTick(), st); 3345952Ssaidi@eecs.umich.edu swBegin(tc->getSystemPtr(), tc->contextId(), st, getFrame(tc), true, args[0]); 3355952Ssaidi@eecs.umich.edu} 3365952Ssaidi@eecs.umich.edu 3375952Ssaidi@eecs.umich.eduvoid 3385952Ssaidi@eecs.umich.eduCPA::swAutoBegin(ThreadContext *tc, Addr next_pc) 3395952Ssaidi@eecs.umich.edu{ 3405952Ssaidi@eecs.umich.edu if (!enabled()) 3415952Ssaidi@eecs.umich.edu return; 3425952Ssaidi@eecs.umich.edu 3435952Ssaidi@eecs.umich.edu string sym; 3445952Ssaidi@eecs.umich.edu Addr sym_addr = 0; 3455952Ssaidi@eecs.umich.edu 3465952Ssaidi@eecs.umich.edu if (!TheISA::inUserMode(tc)) { 3475952Ssaidi@eecs.umich.edu debugSymbolTable->findNearestSymbol(next_pc, sym, sym_addr); 3485952Ssaidi@eecs.umich.edu } else { 3495952Ssaidi@eecs.umich.edu Linux::ThreadInfo ti(tc); 3505952Ssaidi@eecs.umich.edu string app = ti.curTaskName(); 3515952Ssaidi@eecs.umich.edu if (userApp.count(app)) 3525952Ssaidi@eecs.umich.edu userApp[app]->findNearestSymbol(next_pc, sym, sym_addr); 3535952Ssaidi@eecs.umich.edu } 3545952Ssaidi@eecs.umich.edu 3555952Ssaidi@eecs.umich.edu if (sym_addr) 3565952Ssaidi@eecs.umich.edu swBegin(tc->getSystemPtr(), tc->contextId(), sym, getFrame(tc)); 3575952Ssaidi@eecs.umich.edu} 3585952Ssaidi@eecs.umich.edu 3595952Ssaidi@eecs.umich.eduvoid 3605952Ssaidi@eecs.umich.eduCPA::swBegin(System *sys, int cpuid, std::string st, uint64_t frame, bool expl, 3615952Ssaidi@eecs.umich.edu int flags) 3625952Ssaidi@eecs.umich.edu{ 3635952Ssaidi@eecs.umich.edu int x = 0; 3645952Ssaidi@eecs.umich.edu int len; 3655952Ssaidi@eecs.umich.edu while (ignoreSymbols[x].len) 3665952Ssaidi@eecs.umich.edu { 3675952Ssaidi@eecs.umich.edu len = ignoreSymbols[x].len; 3685952Ssaidi@eecs.umich.edu if (!st.compare(0,len, ignoreSymbols[x].symbol, len)) 3695952Ssaidi@eecs.umich.edu return; 3705952Ssaidi@eecs.umich.edu x++; 3715952Ssaidi@eecs.umich.edu } 3725952Ssaidi@eecs.umich.edu 3735952Ssaidi@eecs.umich.edu int sysi = getSys(sys); 3745952Ssaidi@eecs.umich.edu StackId sid = StackId(sysi, frame); 3755952Ssaidi@eecs.umich.edu // if expl is true suspend symbol table based states 3765952Ssaidi@eecs.umich.edu if (!smStack[sid].size()) 3775952Ssaidi@eecs.umich.edu return; 3785952Ssaidi@eecs.umich.edu if (!expl && swExpl[sid]) 3795952Ssaidi@eecs.umich.edu return; 3805952Ssaidi@eecs.umich.edu if (expl) 3815952Ssaidi@eecs.umich.edu swExpl[sid] = true; 3825952Ssaidi@eecs.umich.edu DPRINTFS(AnnotateVerbose, sys, "SwBegin: %s sysi: %d\n", st, sysi); 3835952Ssaidi@eecs.umich.edu int smi = smStack[sid].back(); 3845952Ssaidi@eecs.umich.edu int sti = getSt(smMap[smi-1].second.first, st); 3855952Ssaidi@eecs.umich.edu if (lastState[smi] != sti) { 3865952Ssaidi@eecs.umich.edu lastState[smi] = sti; 3875952Ssaidi@eecs.umich.edu add(OP_BEGIN, flags, cpuid, smi, sti); 3885952Ssaidi@eecs.umich.edu } 3895952Ssaidi@eecs.umich.edu} 3905952Ssaidi@eecs.umich.edu 3915952Ssaidi@eecs.umich.eduvoid 3925952Ssaidi@eecs.umich.eduCPA::swEnd(ThreadContext *tc) 3935952Ssaidi@eecs.umich.edu{ 3945952Ssaidi@eecs.umich.edu if (!enabled()) 3955952Ssaidi@eecs.umich.edu return; 3965952Ssaidi@eecs.umich.edu 3975952Ssaidi@eecs.umich.edu std::string st; 3985952Ssaidi@eecs.umich.edu Addr junk; 3995952Ssaidi@eecs.umich.edu if (!TheISA::inUserMode(tc)) 4005952Ssaidi@eecs.umich.edu debugSymbolTable->findNearestSymbol( 4015952Ssaidi@eecs.umich.edu tc->readIntReg(ReturnAddressReg), st, junk); 4025952Ssaidi@eecs.umich.edu System *sys = tc->getSystemPtr(); 4035952Ssaidi@eecs.umich.edu StringWrap name(sys->name()); 40411320Ssteve.reinhardt@amd.com 4055952Ssaidi@eecs.umich.edu int sysi = getSys(sys); 4065952Ssaidi@eecs.umich.edu StackId sid = StackId(sysi, getFrame(tc)); 4075952Ssaidi@eecs.umich.edu if (!smStack[sid].size()) { 4085952Ssaidi@eecs.umich.edu DPRINTF(Annotate, "Explict end of State: %s IGNORED\n", st); 4095952Ssaidi@eecs.umich.edu return; 4105952Ssaidi@eecs.umich.edu } 4115952Ssaidi@eecs.umich.edu DPRINTF(Annotate, "Explict end of State: %s\n", st); 4125952Ssaidi@eecs.umich.edu // return back to symbol table based states 4135952Ssaidi@eecs.umich.edu swExpl[sid] = false; 4145952Ssaidi@eecs.umich.edu int smi = smStack[sid].back(); 4155952Ssaidi@eecs.umich.edu if (st != "") { 4165952Ssaidi@eecs.umich.edu int sti = getSt(smMap[smi-1].second.first, st); 4175952Ssaidi@eecs.umich.edu lastState[smi] = sti; 4185952Ssaidi@eecs.umich.edu add(OP_BEGIN, FL_NONE, tc->contextId(), smi, sti); 4195952Ssaidi@eecs.umich.edu } 4205952Ssaidi@eecs.umich.edu} 4215952Ssaidi@eecs.umich.edu 4225952Ssaidi@eecs.umich.eduvoid 4235952Ssaidi@eecs.umich.eduCPA::swQ(ThreadContext *tc) 4245952Ssaidi@eecs.umich.edu{ 4255952Ssaidi@eecs.umich.edu if (!enabled()) 4265952Ssaidi@eecs.umich.edu return; 4275952Ssaidi@eecs.umich.edu 4285952Ssaidi@eecs.umich.edu char q[50]; 4295952Ssaidi@eecs.umich.edu Arguments args(tc); 4305952Ssaidi@eecs.umich.edu uint64_t id = args[0]; 43114018Sgabeblack@google.com tc->getVirtProxy().readString(q, args[1], 50); 4325952Ssaidi@eecs.umich.edu int32_t count = args[2]; 4335952Ssaidi@eecs.umich.edu System *sys = tc->getSystemPtr(); 4345952Ssaidi@eecs.umich.edu 4355952Ssaidi@eecs.umich.edu int sysi = getSys(sys); 4365952Ssaidi@eecs.umich.edu StackId sid = StackId(sysi, getFrame(tc)); 4375952Ssaidi@eecs.umich.edu if (!smStack[sid].size()) 4385952Ssaidi@eecs.umich.edu return; 4395952Ssaidi@eecs.umich.edu int smi = smStack[sid].back(); 4405952Ssaidi@eecs.umich.edu if (swExpl[sid]) 4415952Ssaidi@eecs.umich.edu swExpl[sid] = false; 4425952Ssaidi@eecs.umich.edu int qi = getQ(sysi, q, id); 4435952Ssaidi@eecs.umich.edu if (count == 0) { 4445952Ssaidi@eecs.umich.edu //warn("Tried to queue 0 bytes in %s, ignoring\n", q); 4455952Ssaidi@eecs.umich.edu return; 4465952Ssaidi@eecs.umich.edu } 44711320Ssteve.reinhardt@amd.com DPRINTFS(AnnotateQ, sys, 4485952Ssaidi@eecs.umich.edu "swQ: %s[%#x] cur size %d %d bytes: %d adding: %d\n", 4495952Ssaidi@eecs.umich.edu q, id, qSize[qi-1], qData[qi-1].size(), qBytes[qi-1], count); 4505952Ssaidi@eecs.umich.edu doQ(sys, FL_NONE, tc->contextId(), smi, q, qi, count); 4515952Ssaidi@eecs.umich.edu} 4525952Ssaidi@eecs.umich.edu 4535952Ssaidi@eecs.umich.eduvoid 4545952Ssaidi@eecs.umich.eduCPA::swDq(ThreadContext *tc) 4555952Ssaidi@eecs.umich.edu{ 4565952Ssaidi@eecs.umich.edu if (!enabled()) 4575952Ssaidi@eecs.umich.edu return; 4585952Ssaidi@eecs.umich.edu 4595952Ssaidi@eecs.umich.edu char q[50]; 4605952Ssaidi@eecs.umich.edu Arguments args(tc); 4615952Ssaidi@eecs.umich.edu uint64_t id = args[0]; 46214018Sgabeblack@google.com tc->getVirtProxy().readString(q, args[1], 50); 4635952Ssaidi@eecs.umich.edu int32_t count = args[2]; 4645952Ssaidi@eecs.umich.edu System *sys = tc->getSystemPtr(); 4655952Ssaidi@eecs.umich.edu 4665952Ssaidi@eecs.umich.edu int sysi = getSys(sys); 4675952Ssaidi@eecs.umich.edu StackId sid = StackId(sysi, getFrame(tc)); 4685952Ssaidi@eecs.umich.edu if (!smStack[sid].size()) 4695952Ssaidi@eecs.umich.edu return; 4705952Ssaidi@eecs.umich.edu int smi = smStack[sid].back(); 4715952Ssaidi@eecs.umich.edu int qi = getQ(sysi, q, id); 4725952Ssaidi@eecs.umich.edu if (swExpl[sid]) 4735952Ssaidi@eecs.umich.edu swExpl[sid] = false; 47411320Ssteve.reinhardt@amd.com DPRINTFS(AnnotateQ, sys, 4755952Ssaidi@eecs.umich.edu "swDq: %s[%#x] cur size %d %d bytes: %d removing: %d\n", 4765952Ssaidi@eecs.umich.edu q, id, qSize[qi-1], qData[qi-1].size(), qBytes[qi-1], count); 4775952Ssaidi@eecs.umich.edu assert(count != 0); 4785952Ssaidi@eecs.umich.edu 4795952Ssaidi@eecs.umich.edu doDq(sys, FL_NONE, tc->contextId(), smi, q, qi, count); 4805952Ssaidi@eecs.umich.edu} 4815952Ssaidi@eecs.umich.edu 4825952Ssaidi@eecs.umich.eduvoid 4835952Ssaidi@eecs.umich.eduCPA::swPq(ThreadContext *tc) 4845952Ssaidi@eecs.umich.edu{ 4855952Ssaidi@eecs.umich.edu if (!enabled()) 4865952Ssaidi@eecs.umich.edu return; 4875952Ssaidi@eecs.umich.edu 4885952Ssaidi@eecs.umich.edu char q[50]; 4895952Ssaidi@eecs.umich.edu Arguments args(tc); 4905952Ssaidi@eecs.umich.edu uint64_t id = args[0]; 49114018Sgabeblack@google.com tc->getVirtProxy().readString(q, args[1], 50); 4925952Ssaidi@eecs.umich.edu System *sys = tc->getSystemPtr(); 4935952Ssaidi@eecs.umich.edu int32_t count = args[2]; 4945952Ssaidi@eecs.umich.edu 4955952Ssaidi@eecs.umich.edu int sysi = getSys(sys); 4965952Ssaidi@eecs.umich.edu StackId sid = StackId(sysi, getFrame(tc)); 4975952Ssaidi@eecs.umich.edu if (!smStack[sid].size()) 4985952Ssaidi@eecs.umich.edu return; 4995952Ssaidi@eecs.umich.edu int smi = smStack[sid].back(); 5005952Ssaidi@eecs.umich.edu int qi = getQ(sysi, q, id); 5015952Ssaidi@eecs.umich.edu if (swExpl[sid]) 5025952Ssaidi@eecs.umich.edu swExpl[sid] = false; 50311320Ssteve.reinhardt@amd.com DPRINTFS(AnnotateQ, sys, 5045952Ssaidi@eecs.umich.edu "swPq: %s [%#x] cur size %d %d bytes: %d peeking: %d\n", 5055952Ssaidi@eecs.umich.edu q, id, qSize[qi-1], qData[qi-1].size(), qBytes[qi-1], count); 5065952Ssaidi@eecs.umich.edu 5075952Ssaidi@eecs.umich.edu assert(count != 0); 5085952Ssaidi@eecs.umich.edu if (qBytes[qi-1] < count) { 5095952Ssaidi@eecs.umich.edu dump(true); 5105952Ssaidi@eecs.umich.edu dumpKey(); 5115952Ssaidi@eecs.umich.edu fatal("Queue %s peeking with not enough bytes available in queue!\n", q); 5125952Ssaidi@eecs.umich.edu } 5135952Ssaidi@eecs.umich.edu 5145952Ssaidi@eecs.umich.edu add(OP_PEEK, FL_NONE, tc->contextId(), smi, qi, count); 5155952Ssaidi@eecs.umich.edu} 5165952Ssaidi@eecs.umich.edu 5175952Ssaidi@eecs.umich.eduvoid 5185952Ssaidi@eecs.umich.eduCPA::swRq(ThreadContext *tc) 5195952Ssaidi@eecs.umich.edu{ 5205952Ssaidi@eecs.umich.edu if (!enabled()) 5215952Ssaidi@eecs.umich.edu return; 5225952Ssaidi@eecs.umich.edu 5235952Ssaidi@eecs.umich.edu char q[50]; 5245952Ssaidi@eecs.umich.edu Arguments args(tc); 5255952Ssaidi@eecs.umich.edu uint64_t id = args[0]; 52614018Sgabeblack@google.com tc->getVirtProxy().readString(q, args[1], 50); 5275952Ssaidi@eecs.umich.edu System *sys = tc->getSystemPtr(); 5285952Ssaidi@eecs.umich.edu int32_t count = args[2]; 5295952Ssaidi@eecs.umich.edu 5305952Ssaidi@eecs.umich.edu int sysi = getSys(sys); 5315952Ssaidi@eecs.umich.edu StackId sid = StackId(sysi, getFrame(tc)); 5325952Ssaidi@eecs.umich.edu if (!smStack[sid].size()) 5335952Ssaidi@eecs.umich.edu return; 5345952Ssaidi@eecs.umich.edu int smi = smStack[sid].back(); 5355952Ssaidi@eecs.umich.edu int qi = getQ(sysi, q, id); 5365952Ssaidi@eecs.umich.edu if (swExpl[sid]) 5375952Ssaidi@eecs.umich.edu swExpl[sid] = false; 53811320Ssteve.reinhardt@amd.com DPRINTFS(AnnotateQ, sys, 5395952Ssaidi@eecs.umich.edu "swRq: %s [%#x] cur size %d %d bytes: %d reserve: %d\n", 5405952Ssaidi@eecs.umich.edu q, id, qSize[qi-1], qData[qi-1].size(), qBytes[qi-1], count); 5415952Ssaidi@eecs.umich.edu 5425952Ssaidi@eecs.umich.edu assert(count != 0); 5435952Ssaidi@eecs.umich.edu 5445952Ssaidi@eecs.umich.edu add(OP_RESERVE, FL_NONE, tc->contextId(), smi, qi, count); 5455952Ssaidi@eecs.umich.edu} 5465952Ssaidi@eecs.umich.edu 5475952Ssaidi@eecs.umich.edu 5485952Ssaidi@eecs.umich.eduvoid 5495952Ssaidi@eecs.umich.eduCPA::swWf(ThreadContext *tc) 5505952Ssaidi@eecs.umich.edu{ 5515952Ssaidi@eecs.umich.edu if (!enabled()) 5525952Ssaidi@eecs.umich.edu return; 5535952Ssaidi@eecs.umich.edu 5545952Ssaidi@eecs.umich.edu char q[50]; 5555952Ssaidi@eecs.umich.edu Arguments args(tc); 5565952Ssaidi@eecs.umich.edu uint64_t id = args[0]; 55714018Sgabeblack@google.com tc->getVirtProxy().readString(q, args[1], 50); 5585952Ssaidi@eecs.umich.edu System *sys = tc->getSystemPtr(); 5595952Ssaidi@eecs.umich.edu int32_t count = args[3]; 5605952Ssaidi@eecs.umich.edu 5615952Ssaidi@eecs.umich.edu int sysi = getSys(sys); 5625952Ssaidi@eecs.umich.edu StackId sid = StackId(sysi, getFrame(tc)); 5635952Ssaidi@eecs.umich.edu if (!smStack[sid].size()) 5645952Ssaidi@eecs.umich.edu return; 5655952Ssaidi@eecs.umich.edu int smi = smStack[sid].back(); 5665952Ssaidi@eecs.umich.edu int qi = getQ(sysi, q, id); 5675952Ssaidi@eecs.umich.edu add(OP_WAIT_FULL, FL_NONE, tc->contextId(), smi, qi, count); 5685952Ssaidi@eecs.umich.edu 5695952Ssaidi@eecs.umich.edu if (!!args[2]) { 5705952Ssaidi@eecs.umich.edu char sm[50]; 57114018Sgabeblack@google.com tc->getVirtProxy().readString(sm, args[2], 50); 5725952Ssaidi@eecs.umich.edu doSwSmEnd(tc->getSystemPtr(), tc->contextId(), sm, getFrame(tc)); 5735952Ssaidi@eecs.umich.edu } 5745952Ssaidi@eecs.umich.edu} 5755952Ssaidi@eecs.umich.edu 5765952Ssaidi@eecs.umich.eduvoid 5775952Ssaidi@eecs.umich.eduCPA::swWe(ThreadContext *tc) 5785952Ssaidi@eecs.umich.edu{ 5795952Ssaidi@eecs.umich.edu if (!enabled()) 5805952Ssaidi@eecs.umich.edu return; 5815952Ssaidi@eecs.umich.edu 5825952Ssaidi@eecs.umich.edu char q[50]; 5835952Ssaidi@eecs.umich.edu Arguments args(tc); 5845952Ssaidi@eecs.umich.edu uint64_t id = args[0]; 58514018Sgabeblack@google.com tc->getVirtProxy().readString(q, args[1], 50); 5865952Ssaidi@eecs.umich.edu System *sys = tc->getSystemPtr(); 5875952Ssaidi@eecs.umich.edu int32_t count = args[3]; 5885952Ssaidi@eecs.umich.edu 5895952Ssaidi@eecs.umich.edu int sysi = getSys(sys); 5905952Ssaidi@eecs.umich.edu StackId sid = StackId(sysi, getFrame(tc)); 5915952Ssaidi@eecs.umich.edu if (!smStack[sid].size()) 5925952Ssaidi@eecs.umich.edu return; 5935952Ssaidi@eecs.umich.edu int smi = smStack[sid].back(); 5945952Ssaidi@eecs.umich.edu int qi = getQ(sysi, q, id); 5955952Ssaidi@eecs.umich.edu add(OP_WAIT_EMPTY, FL_NONE, tc->contextId(), smi, qi, count); 5965952Ssaidi@eecs.umich.edu 5975952Ssaidi@eecs.umich.edu if (!!args[2]) { 5985952Ssaidi@eecs.umich.edu char sm[50]; 59914018Sgabeblack@google.com tc->getVirtProxy().readString(sm, args[2], 50); 6005952Ssaidi@eecs.umich.edu doSwSmEnd(tc->getSystemPtr(), tc->contextId(), sm, getFrame(tc)); 6015952Ssaidi@eecs.umich.edu } 6025952Ssaidi@eecs.umich.edu} 6035952Ssaidi@eecs.umich.edu 6045952Ssaidi@eecs.umich.eduvoid 6055952Ssaidi@eecs.umich.eduCPA::swSq(ThreadContext *tc) 6065952Ssaidi@eecs.umich.edu{ 6075952Ssaidi@eecs.umich.edu if (!enabled()) 6085952Ssaidi@eecs.umich.edu return; 6095952Ssaidi@eecs.umich.edu 6105952Ssaidi@eecs.umich.edu char q[50]; 6115952Ssaidi@eecs.umich.edu Arguments args(tc); 6125952Ssaidi@eecs.umich.edu uint64_t id = args[0]; 61314018Sgabeblack@google.com tc->getVirtProxy().readString(q, args[1], 50); 6145952Ssaidi@eecs.umich.edu System *sys = tc->getSystemPtr(); 6155952Ssaidi@eecs.umich.edu StringWrap name(sys->name()); 6165952Ssaidi@eecs.umich.edu int32_t size = args[2]; 6175952Ssaidi@eecs.umich.edu int flags = args[3]; 6185952Ssaidi@eecs.umich.edu 6195952Ssaidi@eecs.umich.edu int sysi = getSys(sys); 6205952Ssaidi@eecs.umich.edu StackId sid = StackId(sysi, getFrame(tc)); 6215952Ssaidi@eecs.umich.edu if (!smStack[sid].size()) 6225952Ssaidi@eecs.umich.edu return; 6235952Ssaidi@eecs.umich.edu int smi = smStack[sid].back(); 6245952Ssaidi@eecs.umich.edu int qi = getQ(sysi, q, id); 6255952Ssaidi@eecs.umich.edu DPRINTF(AnnotateQ, "swSq: %s [%#x] cur size: %d bytes: %d, new size: %d\n", 6265952Ssaidi@eecs.umich.edu q, id, qSize[qi-1], qBytes[qi-1], size); 6275952Ssaidi@eecs.umich.edu 6285952Ssaidi@eecs.umich.edu if (FL_RESET & flags) { 6295952Ssaidi@eecs.umich.edu DPRINTF(AnnotateQ, "Resetting Queue %s\n", q); 6305952Ssaidi@eecs.umich.edu add(OP_SIZE_QUEUE, FL_NONE, tc->contextId(), smi, qi, 0); 6315952Ssaidi@eecs.umich.edu qData[qi-1].clear(); 6325952Ssaidi@eecs.umich.edu qSize[qi-1] = 0; 6335952Ssaidi@eecs.umich.edu qBytes[qi-1] = 0; 6345952Ssaidi@eecs.umich.edu } 6355952Ssaidi@eecs.umich.edu 6365952Ssaidi@eecs.umich.edu if (qBytes[qi-1] < size) 6375952Ssaidi@eecs.umich.edu doQ(sys, FL_NONE, tc->contextId(), smi, q, qi, size - qBytes[qi-1]); 6385952Ssaidi@eecs.umich.edu else if (qBytes[qi-1] > size) { 6395952Ssaidi@eecs.umich.edu DPRINTF(AnnotateQ, "removing for resize of queue %s\n", q); 6405952Ssaidi@eecs.umich.edu add(OP_SIZE_QUEUE, FL_NONE, tc->contextId(), smi, qi, size); 6415952Ssaidi@eecs.umich.edu if (size <= 0) { 6425952Ssaidi@eecs.umich.edu qData[qi-1].clear(); 6435952Ssaidi@eecs.umich.edu qSize[qi-1] = 0; 6445952Ssaidi@eecs.umich.edu qBytes[qi-1] = 0; 6455952Ssaidi@eecs.umich.edu return; 6465952Ssaidi@eecs.umich.edu } 6475952Ssaidi@eecs.umich.edu int need = qBytes[qi-1] - size; 6485952Ssaidi@eecs.umich.edu qBytes[qi-1] = size; 6495952Ssaidi@eecs.umich.edu while (need > 0) { 6505952Ssaidi@eecs.umich.edu int32_t tail_bytes = qData[qi-1].back()->data; 6515952Ssaidi@eecs.umich.edu if (qSize[qi-1] <= 0 || qBytes[qi-1] < 0) { 6525952Ssaidi@eecs.umich.edu dump(true); 6535952Ssaidi@eecs.umich.edu dumpKey(); 6545952Ssaidi@eecs.umich.edu fatal("Queue %s had inconsistancy when doing size queue!\n", q); 6555952Ssaidi@eecs.umich.edu } 6565952Ssaidi@eecs.umich.edu if (tail_bytes > need) { 6575952Ssaidi@eecs.umich.edu qData[qi-1].back()->data -= need; 6585952Ssaidi@eecs.umich.edu need = 0; 6595952Ssaidi@eecs.umich.edu } else if (tail_bytes == need) { 6605952Ssaidi@eecs.umich.edu qData[qi-1].pop_back(); 6615952Ssaidi@eecs.umich.edu qSize[qi-1]--; 6625952Ssaidi@eecs.umich.edu need = 0; 6635952Ssaidi@eecs.umich.edu } else { 6645952Ssaidi@eecs.umich.edu qData[qi-1].pop_back(); 6655952Ssaidi@eecs.umich.edu qSize[qi-1]--; 6665952Ssaidi@eecs.umich.edu need -= tail_bytes; 6675952Ssaidi@eecs.umich.edu } 6685952Ssaidi@eecs.umich.edu } 6695952Ssaidi@eecs.umich.edu } 6705952Ssaidi@eecs.umich.edu} 6715952Ssaidi@eecs.umich.edu 6725952Ssaidi@eecs.umich.eduvoid 6735952Ssaidi@eecs.umich.eduCPA::swAq(ThreadContext *tc) 6745952Ssaidi@eecs.umich.edu{ 6755952Ssaidi@eecs.umich.edu if (!enabled()) 6765952Ssaidi@eecs.umich.edu return; 6775952Ssaidi@eecs.umich.edu 6785952Ssaidi@eecs.umich.edu char q[50]; 6795952Ssaidi@eecs.umich.edu Arguments args(tc); 6805952Ssaidi@eecs.umich.edu uint64_t id = args[0]; 68114018Sgabeblack@google.com tc->getVirtProxy().readString(q, args[1], 50); 6825952Ssaidi@eecs.umich.edu System *sys = tc->getSystemPtr(); 6835952Ssaidi@eecs.umich.edu StringWrap name(sys->name()); 6845952Ssaidi@eecs.umich.edu int32_t size = args[2]; 6855952Ssaidi@eecs.umich.edu 6865952Ssaidi@eecs.umich.edu int sysi = getSys(sys); 6875952Ssaidi@eecs.umich.edu int qi = getQ(sysi, q, id); 6885952Ssaidi@eecs.umich.edu if (qBytes[qi-1] != size) { 6895952Ssaidi@eecs.umich.edu DPRINTF(AnnotateQ, "Queue %s [%#x] has inconsintant size\n", q, id); 6905952Ssaidi@eecs.umich.edu //dump(true); 6915952Ssaidi@eecs.umich.edu //dumpKey(); 6925952Ssaidi@eecs.umich.edu std::list<AnnDataPtr>::iterator ai = qData[qi-1].begin(); 6935952Ssaidi@eecs.umich.edu int x = 0; 6945952Ssaidi@eecs.umich.edu while (ai != qData[qi-1].end()) { 6955952Ssaidi@eecs.umich.edu DPRINTF(AnnotateQ, "--Element %d size %d\n", x, (*ai)->data); 6965952Ssaidi@eecs.umich.edu ai++; 6975952Ssaidi@eecs.umich.edu x++; 6985952Ssaidi@eecs.umich.edu } 6995952Ssaidi@eecs.umich.edu 70011320Ssteve.reinhardt@amd.com warn("%d: Queue Assert: SW said there should be %d byte(s) in %s," 7015952Ssaidi@eecs.umich.edu "however there are %d byte(s)\n", 7027823Ssteve.reinhardt@amd.com curTick(), size, q, qBytes[qi-1]); 7035952Ssaidi@eecs.umich.edu DPRINTF(AnnotateQ, "%d: Queue Assert: SW said there should be %d" 7045952Ssaidi@eecs.umich.edu " byte(s) in %s, however there are %d byte(s)\n", 7057823Ssteve.reinhardt@amd.com curTick(), size, q, qBytes[qi-1]); 7065952Ssaidi@eecs.umich.edu } 7075952Ssaidi@eecs.umich.edu} 7085952Ssaidi@eecs.umich.edu 7095952Ssaidi@eecs.umich.eduvoid 7105952Ssaidi@eecs.umich.eduCPA::swLink(ThreadContext *tc) 7115952Ssaidi@eecs.umich.edu{ 7125952Ssaidi@eecs.umich.edu if (!enabled()) 7135952Ssaidi@eecs.umich.edu return; 7145952Ssaidi@eecs.umich.edu 7155952Ssaidi@eecs.umich.edu char lsm[50]; 7165952Ssaidi@eecs.umich.edu Arguments args(tc); 71714018Sgabeblack@google.com tc->getVirtProxy().readString(lsm, args[0], 50); 7185952Ssaidi@eecs.umich.edu System *sys = tc->getSystemPtr(); 7195952Ssaidi@eecs.umich.edu StringWrap name(sys->name()); 7205952Ssaidi@eecs.umich.edu 7215952Ssaidi@eecs.umich.edu int sysi = getSys(sys); 7225952Ssaidi@eecs.umich.edu StackId sid = StackId(sysi, getFrame(tc)); 7235952Ssaidi@eecs.umich.edu if (!smStack[sid].size()) 7245952Ssaidi@eecs.umich.edu return; 7255952Ssaidi@eecs.umich.edu int smi = smStack[sid].back(); 7265952Ssaidi@eecs.umich.edu int lsmi = getSm(sysi, lsm, args[1]); 7275952Ssaidi@eecs.umich.edu 7285952Ssaidi@eecs.umich.edu DPRINTF(Annotate, "Linking from %d to state machine %s(%d) [%#x]\n", 7295952Ssaidi@eecs.umich.edu smi, lsm, lsmi, args[1]); 7305952Ssaidi@eecs.umich.edu 7315952Ssaidi@eecs.umich.edu if (lnMap[lsmi]) 7325952Ssaidi@eecs.umich.edu DPRINTF(Annotate, "LnMap already contains entry for %d of %d\n", 7335952Ssaidi@eecs.umich.edu lsmi, lnMap[lsmi]); 7345952Ssaidi@eecs.umich.edu assert(lnMap[lsmi] == 0); 7355952Ssaidi@eecs.umich.edu lnMap[lsmi] = smi; 7365952Ssaidi@eecs.umich.edu 7375952Ssaidi@eecs.umich.edu add(OP_LINK, FL_NONE, tc->contextId(), smi, lsmi); 7385952Ssaidi@eecs.umich.edu 7395952Ssaidi@eecs.umich.edu if (!!args[2]) { 7405952Ssaidi@eecs.umich.edu char sm[50]; 74114018Sgabeblack@google.com tc->getVirtProxy().readString(sm, args[2], 50); 7425952Ssaidi@eecs.umich.edu doSwSmEnd(tc->getSystemPtr(), tc->contextId(), sm, getFrame(tc)); 7435952Ssaidi@eecs.umich.edu } 7445952Ssaidi@eecs.umich.edu} 7455952Ssaidi@eecs.umich.edu 7465952Ssaidi@eecs.umich.eduvoid 7475952Ssaidi@eecs.umich.eduCPA::swIdentify(ThreadContext *tc) 7485952Ssaidi@eecs.umich.edu{ 7495952Ssaidi@eecs.umich.edu if (!enabled()) 7505952Ssaidi@eecs.umich.edu return; 7515952Ssaidi@eecs.umich.edu 7525952Ssaidi@eecs.umich.edu Arguments args(tc); 7535952Ssaidi@eecs.umich.edu int sysi = getSys(tc->getSystemPtr()); 7545952Ssaidi@eecs.umich.edu StackId sid = StackId(sysi, getFrame(tc)); 7555952Ssaidi@eecs.umich.edu if (!smStack[sid].size()) 7565952Ssaidi@eecs.umich.edu return; 7575952Ssaidi@eecs.umich.edu int smi = smStack[sid].back(); 7585952Ssaidi@eecs.umich.edu 7595952Ssaidi@eecs.umich.edu DPRINTFS(Annotate, tc->getSystemPtr(), "swIdentify: id %#X\n", args[0]); 7605952Ssaidi@eecs.umich.edu 7615952Ssaidi@eecs.umich.edu add(OP_IDENT, FL_NONE, tc->contextId(), smi, 0, args[0]); 7625952Ssaidi@eecs.umich.edu} 7635952Ssaidi@eecs.umich.edu 7645952Ssaidi@eecs.umich.eduuint64_t 7655952Ssaidi@eecs.umich.eduCPA::swGetId(ThreadContext *tc) 7665952Ssaidi@eecs.umich.edu{ 7675952Ssaidi@eecs.umich.edu if (!enabled()) 7685952Ssaidi@eecs.umich.edu return 0; 7695952Ssaidi@eecs.umich.edu 7705952Ssaidi@eecs.umich.edu uint64_t id = ++conId; 7715952Ssaidi@eecs.umich.edu int sysi = getSys(tc->getSystemPtr()); 7725952Ssaidi@eecs.umich.edu StackId sid = StackId(sysi, getFrame(tc)); 7735952Ssaidi@eecs.umich.edu if (!smStack[sid].size()) 7745952Ssaidi@eecs.umich.edu panic("swGetId called without a state machine stack!"); 7755952Ssaidi@eecs.umich.edu int smi = smStack[sid].back(); 7765952Ssaidi@eecs.umich.edu 7775952Ssaidi@eecs.umich.edu DPRINTFS(Annotate, tc->getSystemPtr(), "swGetId: id %#X\n", id); 7785952Ssaidi@eecs.umich.edu 7795952Ssaidi@eecs.umich.edu add(OP_IDENT, FL_NONE, tc->contextId(), smi, 0, id); 7805952Ssaidi@eecs.umich.edu return id; 7815952Ssaidi@eecs.umich.edu} 7825952Ssaidi@eecs.umich.edu 7835952Ssaidi@eecs.umich.edu 7845952Ssaidi@eecs.umich.eduvoid 7855952Ssaidi@eecs.umich.eduCPA::swSyscallLink(ThreadContext *tc) 7865952Ssaidi@eecs.umich.edu{ 7875952Ssaidi@eecs.umich.edu if (!enabled()) 7885952Ssaidi@eecs.umich.edu return; 7895952Ssaidi@eecs.umich.edu 7905952Ssaidi@eecs.umich.edu char lsm[50]; 7915952Ssaidi@eecs.umich.edu Arguments args(tc); 79214018Sgabeblack@google.com tc->getVirtProxy().readString(lsm, args[0], 50); 7935952Ssaidi@eecs.umich.edu System *sys = tc->getSystemPtr(); 7945952Ssaidi@eecs.umich.edu StringWrap name(sys->name()); 7955952Ssaidi@eecs.umich.edu int sysi = getSys(sys); 7965952Ssaidi@eecs.umich.edu 7975952Ssaidi@eecs.umich.edu Id id = Id(lsm, getFrame(tc)); 7985952Ssaidi@eecs.umich.edu StackId sid = StackId(sysi, getFrame(tc)); 7995952Ssaidi@eecs.umich.edu 8005952Ssaidi@eecs.umich.edu if (!smStack[sid].size()) 8015952Ssaidi@eecs.umich.edu return; 8025952Ssaidi@eecs.umich.edu 8035952Ssaidi@eecs.umich.edu int smi = smStack[sid].back(); 8045952Ssaidi@eecs.umich.edu 8055952Ssaidi@eecs.umich.edu DPRINTF(Annotate, "Linking from %d to state machine %s(UNKNOWN)\n", 8065952Ssaidi@eecs.umich.edu smi, lsm); 8075952Ssaidi@eecs.umich.edu 8085952Ssaidi@eecs.umich.edu if (scLinks[sysi-1][id]) 80911320Ssteve.reinhardt@amd.com DPRINTF(Annotate, 8105952Ssaidi@eecs.umich.edu "scLinks already contains entry for system %d %s[%x] of %d\n", 8115952Ssaidi@eecs.umich.edu sysi, lsm, getFrame(tc), scLinks[sysi-1][id]); 8125952Ssaidi@eecs.umich.edu assert(scLinks[sysi-1][id] == 0); 8135952Ssaidi@eecs.umich.edu scLinks[sysi-1][id] = add(OP_LINK, FL_NONE, tc->contextId(), smi, 0xFFFF); 8145952Ssaidi@eecs.umich.edu scLinks[sysi-1][id]->dump = false; 8155952Ssaidi@eecs.umich.edu 8165952Ssaidi@eecs.umich.edu if (!!args[1]) { 8175952Ssaidi@eecs.umich.edu char sm[50]; 81814018Sgabeblack@google.com tc->getVirtProxy().readString(sm, args[1], 50); 8195952Ssaidi@eecs.umich.edu doSwSmEnd(tc->getSystemPtr(), tc->contextId(), sm, getFrame(tc)); 8205952Ssaidi@eecs.umich.edu } 8215952Ssaidi@eecs.umich.edu} 8225952Ssaidi@eecs.umich.edu 8235952Ssaidi@eecs.umich.eduCPA::AnnDataPtr 8245952Ssaidi@eecs.umich.eduCPA::add(int t, int f, int c, int sm, int stq, int32_t d) 8255952Ssaidi@eecs.umich.edu{ 82610470Sandreas.hansson@arm.com AnnDataPtr an = std::make_shared<AnnotateData>(); 8277823Ssteve.reinhardt@amd.com an->time = curTick(); 8285952Ssaidi@eecs.umich.edu an->data = d; 8295952Ssaidi@eecs.umich.edu an->orig_data = d; 8305952Ssaidi@eecs.umich.edu an->op = t; 8315952Ssaidi@eecs.umich.edu an->flag = f; 8325952Ssaidi@eecs.umich.edu an->sm = sm; 8335952Ssaidi@eecs.umich.edu an->stq = stq; 8345952Ssaidi@eecs.umich.edu an->cpu = c; 8355952Ssaidi@eecs.umich.edu an->dump = true; 8365952Ssaidi@eecs.umich.edu 8375952Ssaidi@eecs.umich.edu data.push_back(an); 8385952Ssaidi@eecs.umich.edu 8395952Ssaidi@eecs.umich.edu DPRINTF(AnnotateVerbose, "Annotate: op: %d flags: 0x%x sm: %d state: %d time: %d, data: %d\n", 8405952Ssaidi@eecs.umich.edu an->op, an->flag, an->sm, an->stq, an->time, an->data); 84111320Ssteve.reinhardt@amd.com 8425952Ssaidi@eecs.umich.edu // Don't dump Links because we might be setting no-dump on it 8435952Ssaidi@eecs.umich.edu if (an->op != OP_LINK) 8445952Ssaidi@eecs.umich.edu dump(false); 8455952Ssaidi@eecs.umich.edu 8465952Ssaidi@eecs.umich.edu return an; 8475952Ssaidi@eecs.umich.edu} 8485952Ssaidi@eecs.umich.edu 8495952Ssaidi@eecs.umich.eduvoid 8505952Ssaidi@eecs.umich.eduCPA::dumpKey() 8515952Ssaidi@eecs.umich.edu{ 8525952Ssaidi@eecs.umich.edu std::streampos curpos = osbin->tellp(); 8535952Ssaidi@eecs.umich.edu ah.key_off = curpos; 8545952Ssaidi@eecs.umich.edu 8555952Ssaidi@eecs.umich.edu // Output the various state machines and their corresponding states 8565952Ssaidi@eecs.umich.edu *osbin << "# Automatically generated state machine descriptor file" << endl; 8575952Ssaidi@eecs.umich.edu 8585952Ssaidi@eecs.umich.edu *osbin << "sms = {}" << endl << endl; 8595952Ssaidi@eecs.umich.edu vector<string> state_machines; 8605952Ssaidi@eecs.umich.edu state_machines.resize(numSmt+1); 8615952Ssaidi@eecs.umich.edu 8625952Ssaidi@eecs.umich.edu // State machines, id -> states 8635952Ssaidi@eecs.umich.edu SCache::iterator i = smtCache.begin(); 8645952Ssaidi@eecs.umich.edu while (i != smtCache.end()) { 8655952Ssaidi@eecs.umich.edu state_machines[i->second] = i->first; 8665952Ssaidi@eecs.umich.edu i++; 8675952Ssaidi@eecs.umich.edu } 8685952Ssaidi@eecs.umich.edu 8695952Ssaidi@eecs.umich.edu for (int x = 1; x < state_machines.size(); x++) { 8705952Ssaidi@eecs.umich.edu vector<string> states; 8715952Ssaidi@eecs.umich.edu states.resize(numSt[x-1]+1); 8725952Ssaidi@eecs.umich.edu assert(x-1 < stCache.size()); 8735952Ssaidi@eecs.umich.edu SCache::iterator i = stCache[x-1].begin(); 8745952Ssaidi@eecs.umich.edu while (i != stCache[x-1].end()) { 8755952Ssaidi@eecs.umich.edu states[i->second] = i->first; 8765952Ssaidi@eecs.umich.edu i++; 8775952Ssaidi@eecs.umich.edu } 8785952Ssaidi@eecs.umich.edu *osbin << "sms[\"" << state_machines[x] << "\"] = [\"NULL\""; 8795952Ssaidi@eecs.umich.edu for (int y = 1; y < states.size(); y++) 8805952Ssaidi@eecs.umich.edu *osbin << ", \"" << states[y] << "\""; 8815952Ssaidi@eecs.umich.edu *osbin << "]" << endl; 8825952Ssaidi@eecs.umich.edu } 8835952Ssaidi@eecs.umich.edu 8845952Ssaidi@eecs.umich.edu *osbin << endl << endl << endl; 8855952Ssaidi@eecs.umich.edu 8865952Ssaidi@eecs.umich.edu // state machine number -> system, name, id 8875952Ssaidi@eecs.umich.edu *osbin << "smNum = [\"NULL\""; 8885952Ssaidi@eecs.umich.edu for (int x = 0; x < smMap.size(); x++) 8895952Ssaidi@eecs.umich.edu *osbin << ", (" << smMap[x].first << ", \"" << smMap[x].second.first << 8905952Ssaidi@eecs.umich.edu "\", " << smMap[x].second.second << ")"; 8915952Ssaidi@eecs.umich.edu *osbin << "]" << endl; 8925952Ssaidi@eecs.umich.edu 8935952Ssaidi@eecs.umich.edu *osbin << endl << endl << endl; 8945952Ssaidi@eecs.umich.edu 8955952Ssaidi@eecs.umich.edu // Output the systems 8965952Ssaidi@eecs.umich.edu vector<string> systems; 8975952Ssaidi@eecs.umich.edu systems.resize(numSys+1); 8985952Ssaidi@eecs.umich.edu NameCache::iterator i2 = nameCache.begin(); 8995952Ssaidi@eecs.umich.edu while (i2 != nameCache.end()) { 9005952Ssaidi@eecs.umich.edu systems[i2->second.second] = i2->second.first; 9015952Ssaidi@eecs.umich.edu i2++; 9025952Ssaidi@eecs.umich.edu } 9035952Ssaidi@eecs.umich.edu 9045952Ssaidi@eecs.umich.edu *osbin << "sysNum = [\"NULL\""; 9055952Ssaidi@eecs.umich.edu for (int x = 1; x < systems.size(); x++) { 9065952Ssaidi@eecs.umich.edu *osbin << ", \"" << systems[x] << "\""; 9075952Ssaidi@eecs.umich.edu } 9085952Ssaidi@eecs.umich.edu *osbin << "]" << endl; 9095952Ssaidi@eecs.umich.edu 9105952Ssaidi@eecs.umich.edu // queue number -> system, qname, qid 9115952Ssaidi@eecs.umich.edu *osbin << "queues = [\"NULL\""; 9125952Ssaidi@eecs.umich.edu for (int x = 0; x < qMap.size(); x++) 9135952Ssaidi@eecs.umich.edu *osbin << ", (" << qMap[x].first << ", \"" << qMap[x].second.first << 9145952Ssaidi@eecs.umich.edu "\", " << qMap[x].second.second << ")"; 9155952Ssaidi@eecs.umich.edu *osbin << "]" << endl; 9165952Ssaidi@eecs.umich.edu 9175952Ssaidi@eecs.umich.edu *osbin << "smComb = [s for s in [(i,r) for i in xrange(1,len(sysNum)) " 9185952Ssaidi@eecs.umich.edu << "for r in xrange (1,len(smNum))]]" << endl; 9195952Ssaidi@eecs.umich.edu ah.key_len = osbin->tellp() - curpos; 9205952Ssaidi@eecs.umich.edu 9215952Ssaidi@eecs.umich.edu // output index 9225952Ssaidi@eecs.umich.edu curpos = osbin->tellp(); 9235952Ssaidi@eecs.umich.edu ah.idx_off = curpos; 9245952Ssaidi@eecs.umich.edu 9255952Ssaidi@eecs.umich.edu for (int x = 0; x < annotateIdx.size(); x++) 9265952Ssaidi@eecs.umich.edu osbin->write((char*)&annotateIdx[x], sizeof(uint64_t)); 9275952Ssaidi@eecs.umich.edu ah.idx_len = osbin->tellp() - curpos; 9285952Ssaidi@eecs.umich.edu 9295952Ssaidi@eecs.umich.edu osbin->seekp(0); 9305952Ssaidi@eecs.umich.edu osbin->write((char*)&ah, sizeof(AnnotateHeader)); 9315952Ssaidi@eecs.umich.edu osbin->flush(); 9325952Ssaidi@eecs.umich.edu 9335952Ssaidi@eecs.umich.edu} 9345952Ssaidi@eecs.umich.edu 9355952Ssaidi@eecs.umich.eduvoid 9365952Ssaidi@eecs.umich.eduCPA::dump(bool all) 9375952Ssaidi@eecs.umich.edu{ 9385952Ssaidi@eecs.umich.edu 9395952Ssaidi@eecs.umich.edu list<AnnDataPtr>::iterator i; 9405952Ssaidi@eecs.umich.edu 9415952Ssaidi@eecs.umich.edu i = data.begin(); 9425952Ssaidi@eecs.umich.edu 9435952Ssaidi@eecs.umich.edu if (i == data.end()) 9445952Ssaidi@eecs.umich.edu return; 9455952Ssaidi@eecs.umich.edu 9465952Ssaidi@eecs.umich.edu // Dump the data every 9475952Ssaidi@eecs.umich.edu if (!all && data.size() < 10000) 9485952Ssaidi@eecs.umich.edu return; 9495952Ssaidi@eecs.umich.edu 9505952Ssaidi@eecs.umich.edu DPRINTF(Annotate, "Writing %d\n", data.size()); 9515952Ssaidi@eecs.umich.edu while (i != data.end()) { 9525952Ssaidi@eecs.umich.edu AnnDataPtr an = *i; 9535952Ssaidi@eecs.umich.edu 9545952Ssaidi@eecs.umich.edu // If we can't dump this record, hold here 9555952Ssaidi@eecs.umich.edu if (!an->dump && !all) 9565952Ssaidi@eecs.umich.edu break; 9575952Ssaidi@eecs.umich.edu 9585952Ssaidi@eecs.umich.edu ah.num_recs++; 9595952Ssaidi@eecs.umich.edu if (ah.num_recs % 100000 == 0) 9605952Ssaidi@eecs.umich.edu annotateIdx.push_back(osbin->tellp()); 9615952Ssaidi@eecs.umich.edu 9625952Ssaidi@eecs.umich.edu 9635952Ssaidi@eecs.umich.edu osbin->write((char*)&(an->time), sizeof(an->time)); 9645952Ssaidi@eecs.umich.edu osbin->write((char*)&(an->orig_data), sizeof(an->orig_data)); 9655952Ssaidi@eecs.umich.edu osbin->write((char*)&(an->sm), sizeof(an->sm)); 9665952Ssaidi@eecs.umich.edu osbin->write((char*)&(an->stq), sizeof(an->stq)); 9675952Ssaidi@eecs.umich.edu osbin->write((char*)&(an->op), sizeof(an->op)); 9685952Ssaidi@eecs.umich.edu osbin->write((char*)&(an->flag), sizeof(an->flag)); 9695952Ssaidi@eecs.umich.edu osbin->write((char*)&(an->cpu), sizeof(an->cpu)); 9705952Ssaidi@eecs.umich.edu i++; 9715952Ssaidi@eecs.umich.edu } 9725952Ssaidi@eecs.umich.edu if (data.begin() != i) 9735952Ssaidi@eecs.umich.edu data.erase(data.begin(), i); 9745952Ssaidi@eecs.umich.edu 9755952Ssaidi@eecs.umich.edu if (all) 9765952Ssaidi@eecs.umich.edu osbin->flush(); 9775952Ssaidi@eecs.umich.edu} 9785952Ssaidi@eecs.umich.edu 9795952Ssaidi@eecs.umich.eduvoid 9805952Ssaidi@eecs.umich.eduCPA::doQ(System *sys, int flags, int cpuid, int sm, 9815952Ssaidi@eecs.umich.edu string q, int qi, int count) 9825952Ssaidi@eecs.umich.edu{ 9835952Ssaidi@eecs.umich.edu qSize[qi-1]++; 9845952Ssaidi@eecs.umich.edu qBytes[qi-1] += count; 9855952Ssaidi@eecs.umich.edu if (qSize[qi-1] > 2501 || qBytes[qi-1] > 2000000000) 9865952Ssaidi@eecs.umich.edu warn("Queue %s is %d elements/%d bytes, " 9875952Ssaidi@eecs.umich.edu "maybe things aren't being removed?\n", 9885952Ssaidi@eecs.umich.edu q, qSize[qi-1], qBytes[qi-1]); 9895952Ssaidi@eecs.umich.edu if (flags & FL_QOPP) 9905952Ssaidi@eecs.umich.edu qData[qi-1].push_front(add(OP_QUEUE, flags, cpuid, sm, qi, count)); 9915952Ssaidi@eecs.umich.edu else 9925952Ssaidi@eecs.umich.edu qData[qi-1].push_back(add(OP_QUEUE, flags, cpuid, sm, qi, count)); 9935952Ssaidi@eecs.umich.edu DPRINTFS(AnnotateQ, sys, "Queing in queue %s size now %d/%d\n", 9945952Ssaidi@eecs.umich.edu q, qSize[qi-1], qBytes[qi-1]); 9955952Ssaidi@eecs.umich.edu assert(qSize[qi-1] >= 0); 9965952Ssaidi@eecs.umich.edu assert(qBytes[qi-1] >= 0); 9975952Ssaidi@eecs.umich.edu} 9985952Ssaidi@eecs.umich.edu 9995952Ssaidi@eecs.umich.edu 10005952Ssaidi@eecs.umich.eduvoid 10015952Ssaidi@eecs.umich.eduCPA::doDq(System *sys, int flags, int cpuid, int sm, 10025952Ssaidi@eecs.umich.edu string q, int qi, int count) 10035952Ssaidi@eecs.umich.edu{ 10045952Ssaidi@eecs.umich.edu 10055952Ssaidi@eecs.umich.edu StringWrap name(sys->name()); 10065952Ssaidi@eecs.umich.edu if (count == -1) { 10075952Ssaidi@eecs.umich.edu add(OP_DEQUEUE, flags, cpuid, sm, qi, count); 10085952Ssaidi@eecs.umich.edu qData[qi-1].clear(); 10095952Ssaidi@eecs.umich.edu qSize[qi-1] = 0; 10105952Ssaidi@eecs.umich.edu qBytes[qi-1] = 0; 10115952Ssaidi@eecs.umich.edu DPRINTF(AnnotateQ, "Dequeing all data in queue %s size now %d/%d\n", 10125952Ssaidi@eecs.umich.edu q, qSize[qi-1], qBytes[qi-1]); 10135952Ssaidi@eecs.umich.edu return; 10145952Ssaidi@eecs.umich.edu } 10155952Ssaidi@eecs.umich.edu 10165952Ssaidi@eecs.umich.edu assert(count > 0); 10175952Ssaidi@eecs.umich.edu if (qSize[qi-1] <= 0 || qBytes[qi-1] <= 0 || !qData[qi-1].size()) { 10185952Ssaidi@eecs.umich.edu dump(true); 10195952Ssaidi@eecs.umich.edu dumpKey(); 10205952Ssaidi@eecs.umich.edu fatal("Queue %s dequing with no data available in queue!\n", 10215952Ssaidi@eecs.umich.edu q); 10225952Ssaidi@eecs.umich.edu } 10235952Ssaidi@eecs.umich.edu assert(qSize[qi-1] >= 0); 10245952Ssaidi@eecs.umich.edu assert(qBytes[qi-1] >= 0); 10255952Ssaidi@eecs.umich.edu assert(qData[qi-1].size()); 10265952Ssaidi@eecs.umich.edu 10275952Ssaidi@eecs.umich.edu int32_t need = count; 10285952Ssaidi@eecs.umich.edu qBytes[qi-1] -= count; 10295952Ssaidi@eecs.umich.edu if (qBytes[qi-1] < 0) { 10305952Ssaidi@eecs.umich.edu dump(true); 10315952Ssaidi@eecs.umich.edu dumpKey(); 10325952Ssaidi@eecs.umich.edu fatal("Queue %s dequing with no bytes available in queue!\n", 10335952Ssaidi@eecs.umich.edu q); 10345952Ssaidi@eecs.umich.edu } 10355952Ssaidi@eecs.umich.edu 10365952Ssaidi@eecs.umich.edu while (need > 0) { 10375952Ssaidi@eecs.umich.edu int32_t head_bytes = qData[qi-1].front()->data; 10385952Ssaidi@eecs.umich.edu if (qSize[qi-1] <= 0 || qBytes[qi-1] < 0) { 10395952Ssaidi@eecs.umich.edu dump(true); 10405952Ssaidi@eecs.umich.edu dumpKey(); 10415952Ssaidi@eecs.umich.edu fatal("Queue %s dequing with nothing in queue!\n", 10425952Ssaidi@eecs.umich.edu q); 10435952Ssaidi@eecs.umich.edu } 10445952Ssaidi@eecs.umich.edu 10455952Ssaidi@eecs.umich.edu if (head_bytes > need) { 10465952Ssaidi@eecs.umich.edu qData[qi-1].front()->data -= need; 10475952Ssaidi@eecs.umich.edu need = 0; 10485952Ssaidi@eecs.umich.edu } else if (head_bytes == need) { 10495952Ssaidi@eecs.umich.edu qData[qi-1].pop_front(); 10505952Ssaidi@eecs.umich.edu qSize[qi-1]--; 10515952Ssaidi@eecs.umich.edu need = 0; 10525952Ssaidi@eecs.umich.edu } else { 10535952Ssaidi@eecs.umich.edu qData[qi-1].pop_front(); 10545952Ssaidi@eecs.umich.edu qSize[qi-1]--; 10555952Ssaidi@eecs.umich.edu need -= head_bytes; 10565952Ssaidi@eecs.umich.edu } 10575952Ssaidi@eecs.umich.edu } 10585952Ssaidi@eecs.umich.edu 10595952Ssaidi@eecs.umich.edu add(OP_DEQUEUE, flags, cpuid, sm, qi, count); 10605952Ssaidi@eecs.umich.edu DPRINTF(AnnotateQ, "Dequeing in queue %s size now %d/%d\n", 10615952Ssaidi@eecs.umich.edu q, qSize[qi-1], qBytes[qi-1]); 10625952Ssaidi@eecs.umich.edu} 10635952Ssaidi@eecs.umich.edu 10645952Ssaidi@eecs.umich.edu 10655952Ssaidi@eecs.umich.edu 10665952Ssaidi@eecs.umich.eduvoid 106710905Sandreas.sandberg@arm.comCPA::serialize(CheckpointOut &cp) const 10685952Ssaidi@eecs.umich.edu{ 10695952Ssaidi@eecs.umich.edu 10705952Ssaidi@eecs.umich.edu SERIALIZE_SCALAR(numSm); 10715952Ssaidi@eecs.umich.edu SERIALIZE_SCALAR(numSmt); 10725952Ssaidi@eecs.umich.edu arrayParamOut(os, "numSt", numSt); 10735952Ssaidi@eecs.umich.edu arrayParamOut(os, "numQ", numQ); 10745952Ssaidi@eecs.umich.edu SERIALIZE_SCALAR(numSys); 10755952Ssaidi@eecs.umich.edu SERIALIZE_SCALAR(numQs); 10765952Ssaidi@eecs.umich.edu SERIALIZE_SCALAR(conId); 10775952Ssaidi@eecs.umich.edu arrayParamOut(os, "qSize", qSize); 10785952Ssaidi@eecs.umich.edu arrayParamOut(os, "qSize", qSize); 10795952Ssaidi@eecs.umich.edu arrayParamOut(os, "qBytes", qBytes); 10805952Ssaidi@eecs.umich.edu 10815952Ssaidi@eecs.umich.edu SCache::iterator i; 10825952Ssaidi@eecs.umich.edu int x = 0, y = 0; 10835952Ssaidi@eecs.umich.edu 10845952Ssaidi@eecs.umich.edu // smtCache (SCache) 10855952Ssaidi@eecs.umich.edu x = 0; 10865952Ssaidi@eecs.umich.edu y = 0; 10875952Ssaidi@eecs.umich.edu i = smtCache.begin(); 10885952Ssaidi@eecs.umich.edu while (i != smtCache.end()) { 10895952Ssaidi@eecs.umich.edu paramOut(os, csprintf("smtCache%d.str", x), i->first); 10905952Ssaidi@eecs.umich.edu paramOut(os, csprintf("smtCache%d.int", x), i->second); 10915952Ssaidi@eecs.umich.edu x++; i++; 10925952Ssaidi@eecs.umich.edu } 10935952Ssaidi@eecs.umich.edu 10945952Ssaidi@eecs.umich.edu // stCache (StCache) 10955952Ssaidi@eecs.umich.edu for (x = 0; x < stCache.size(); x++) { 10965952Ssaidi@eecs.umich.edu i = stCache[x].begin(); 10975952Ssaidi@eecs.umich.edu y = 0; 10985952Ssaidi@eecs.umich.edu while (i != stCache[x].end()) { 10995952Ssaidi@eecs.umich.edu paramOut(os, csprintf("stCache%d_%d.str", x, y), i->first); 11005952Ssaidi@eecs.umich.edu paramOut(os, csprintf("stCache%d_%d.int", x, y), i->second); 11015952Ssaidi@eecs.umich.edu y++; i++; 11025952Ssaidi@eecs.umich.edu } 11035952Ssaidi@eecs.umich.edu } 11045952Ssaidi@eecs.umich.edu 11055952Ssaidi@eecs.umich.edu // qCache (IdCache) 11065952Ssaidi@eecs.umich.edu IdHCache::iterator idi; 11075952Ssaidi@eecs.umich.edu for (x = 0; x < qCache.size(); x++) { 11085952Ssaidi@eecs.umich.edu idi = qCache[x].begin(); 11095952Ssaidi@eecs.umich.edu y = 0; 11105952Ssaidi@eecs.umich.edu while (idi != qCache[x].end()) { 11115952Ssaidi@eecs.umich.edu paramOut(os, csprintf("qCache%d_%d.str", x, y), idi->first.first); 11125952Ssaidi@eecs.umich.edu paramOut(os, csprintf("qCache%d_%d.id", x, y), idi->first.second); 11135952Ssaidi@eecs.umich.edu paramOut(os, csprintf("qCache%d_%d.int", x, y), idi->second); 11145952Ssaidi@eecs.umich.edu y++; idi++; 11155952Ssaidi@eecs.umich.edu } 11165952Ssaidi@eecs.umich.edu } 11175952Ssaidi@eecs.umich.edu 11185952Ssaidi@eecs.umich.edu // smCache (IdCache) 11195952Ssaidi@eecs.umich.edu for (x = 0; x < smCache.size(); x++) { 11205952Ssaidi@eecs.umich.edu idi = smCache[x].begin(); 11215952Ssaidi@eecs.umich.edu y = 0; 11225952Ssaidi@eecs.umich.edu paramOut(os, csprintf("smCache%d", x), smCache[x].size()); 11235952Ssaidi@eecs.umich.edu while (idi != smCache[x].end()) { 11245952Ssaidi@eecs.umich.edu paramOut(os, csprintf("smCache%d_%d.str", x, y), idi->first.first); 11255952Ssaidi@eecs.umich.edu paramOut(os, csprintf("smCache%d_%d.id", x, y), idi->first.second); 11265952Ssaidi@eecs.umich.edu paramOut(os, csprintf("smCache%d_%d.int", x, y), idi->second); 11275952Ssaidi@eecs.umich.edu y++; idi++; 11285952Ssaidi@eecs.umich.edu } 11295952Ssaidi@eecs.umich.edu } 11305952Ssaidi@eecs.umich.edu 11315952Ssaidi@eecs.umich.edu // scLinks (ScCache) -- data not serialize 11325952Ssaidi@eecs.umich.edu 11335952Ssaidi@eecs.umich.edu 11345952Ssaidi@eecs.umich.edu // namecache (NameCache) 11355952Ssaidi@eecs.umich.edu NameCache::iterator ni; 11365952Ssaidi@eecs.umich.edu 11375952Ssaidi@eecs.umich.edu ni = nameCache.begin(); 11385952Ssaidi@eecs.umich.edu x = 0; 11395952Ssaidi@eecs.umich.edu while (ni != nameCache.end()) { 11405952Ssaidi@eecs.umich.edu paramOut(os, csprintf("nameCache%d.name", x), ni->first->name()); 11415952Ssaidi@eecs.umich.edu paramOut(os, csprintf("nameCache%d.str", x), ni->second.first); 11425952Ssaidi@eecs.umich.edu paramOut(os, csprintf("nameCache%d.int", x), ni->second.second); 11435952Ssaidi@eecs.umich.edu x++; ni++; 11445952Ssaidi@eecs.umich.edu } 11455952Ssaidi@eecs.umich.edu 11465952Ssaidi@eecs.umich.edu // smStack (SmStack) 11475952Ssaidi@eecs.umich.edu SmStack::iterator si; 11485952Ssaidi@eecs.umich.edu si = smStack.begin(); 11495952Ssaidi@eecs.umich.edu x = 0; 11505952Ssaidi@eecs.umich.edu paramOut(os, "smStackIdCount", smStack.size()); 11515952Ssaidi@eecs.umich.edu while (si != smStack.end()) { 11525952Ssaidi@eecs.umich.edu paramOut(os, csprintf("smStackId%d.sys", x), si->first.first); 11535952Ssaidi@eecs.umich.edu paramOut(os, csprintf("smStackId%d.frame", x), si->first.second); 11545952Ssaidi@eecs.umich.edu paramOut(os, csprintf("smStackId%d.count", x), si->second.size()); 11555952Ssaidi@eecs.umich.edu for (y = 0; y < si->second.size(); y++) 11565952Ssaidi@eecs.umich.edu paramOut(os, csprintf("smStackId%d_%d", x, y), si->second[y]); 11575952Ssaidi@eecs.umich.edu x++; si++; 11585952Ssaidi@eecs.umich.edu } 11595952Ssaidi@eecs.umich.edu 11605952Ssaidi@eecs.umich.edu // lnMap (LinkMap) 11615952Ssaidi@eecs.umich.edu x = 0; 11625952Ssaidi@eecs.umich.edu LinkMap::iterator li; 11635952Ssaidi@eecs.umich.edu li = lnMap.begin(); 11645952Ssaidi@eecs.umich.edu paramOut(os, "lnMapSize", lnMap.size()); 11655952Ssaidi@eecs.umich.edu while (li != lnMap.end()) { 11665952Ssaidi@eecs.umich.edu paramOut(os, csprintf("lnMap%d.smi", x), li->first); 11675952Ssaidi@eecs.umich.edu paramOut(os, csprintf("lnMap%d.lsmi", x), li->second); 11685952Ssaidi@eecs.umich.edu x++; li++; 11695952Ssaidi@eecs.umich.edu } 11705952Ssaidi@eecs.umich.edu 11715952Ssaidi@eecs.umich.edu // swExpl (vector) 11725952Ssaidi@eecs.umich.edu SwExpl::iterator swexpli; 11735952Ssaidi@eecs.umich.edu swexpli = swExpl.begin(); 11745952Ssaidi@eecs.umich.edu x = 0; 11755952Ssaidi@eecs.umich.edu paramOut(os, "swExplCount", swExpl.size()); 11765952Ssaidi@eecs.umich.edu while (swexpli != swExpl.end()) { 11775952Ssaidi@eecs.umich.edu paramOut(os, csprintf("swExpl%d.sys", x), swexpli->first.first); 11785952Ssaidi@eecs.umich.edu paramOut(os, csprintf("swExpl%d.frame", x), swexpli->first.second); 11795952Ssaidi@eecs.umich.edu paramOut(os, csprintf("swExpl%d.swexpl", x), swexpli->second); 11805952Ssaidi@eecs.umich.edu x++; swexpli++; 11815952Ssaidi@eecs.umich.edu } 11825952Ssaidi@eecs.umich.edu 11835952Ssaidi@eecs.umich.edu // lastState (IMap) 11845952Ssaidi@eecs.umich.edu x = 0; 11855952Ssaidi@eecs.umich.edu IMap::iterator ii; 11865952Ssaidi@eecs.umich.edu ii = lastState.begin(); 11875952Ssaidi@eecs.umich.edu paramOut(os, "lastStateSize", lastState.size()); 11885952Ssaidi@eecs.umich.edu while (ii != lastState.end()) { 11895952Ssaidi@eecs.umich.edu paramOut(os, csprintf("lastState%d.smi", x), ii->first); 11905952Ssaidi@eecs.umich.edu paramOut(os, csprintf("lastState%d.sti", x), ii->second); 11915952Ssaidi@eecs.umich.edu x++; ii++; 11925952Ssaidi@eecs.umich.edu } 11935952Ssaidi@eecs.umich.edu 11945952Ssaidi@eecs.umich.edu // smMap (IdMap) 11955952Ssaidi@eecs.umich.edu for (x = 0; x < smMap.size(); x++) { 11965952Ssaidi@eecs.umich.edu paramOut(os, csprintf("smMap%d.sys", x), smMap[x].first); 11975952Ssaidi@eecs.umich.edu paramOut(os, csprintf("smMap%d.smname", x), smMap[x].second.first); 11985952Ssaidi@eecs.umich.edu paramOut(os, csprintf("smMap%d.id", x), smMap[x].second.second); 11995952Ssaidi@eecs.umich.edu } 12005952Ssaidi@eecs.umich.edu 12015952Ssaidi@eecs.umich.edu // qMap (IdMap) 12025952Ssaidi@eecs.umich.edu for (x = 0; x < qMap.size(); x++) { 12035952Ssaidi@eecs.umich.edu paramOut(os, csprintf("qMap%d.sys", x), qMap[x].first); 12045952Ssaidi@eecs.umich.edu paramOut(os, csprintf("qMap%d.qname", x), qMap[x].second.first); 12055952Ssaidi@eecs.umich.edu paramOut(os, csprintf("qMap%d.id", x), qMap[x].second.second); 12065952Ssaidi@eecs.umich.edu } 12075952Ssaidi@eecs.umich.edu 12085952Ssaidi@eecs.umich.edu // qData (vector<AnnotateList>) 120911321Ssteve.reinhardt@amd.com for (x = 0; x < qData.size(); x++) { 12105952Ssaidi@eecs.umich.edu if (!qData[x].size()) 12115952Ssaidi@eecs.umich.edu continue; 12125952Ssaidi@eecs.umich.edu y = 0; 121310905Sandreas.sandberg@arm.com for (auto &ann : qData[x]) { 121410905Sandreas.sandberg@arm.com ann->serializeSection(os, csprintf("Q%d_%d", x, y)); 12155952Ssaidi@eecs.umich.edu y++; 12165952Ssaidi@eecs.umich.edu } 12175952Ssaidi@eecs.umich.edu } 12185952Ssaidi@eecs.umich.edu} 12195952Ssaidi@eecs.umich.edu 12205952Ssaidi@eecs.umich.eduvoid 122110905Sandreas.sandberg@arm.comCPA::unserialize(CheckpointIn &cp) 12225952Ssaidi@eecs.umich.edu{ 12235952Ssaidi@eecs.umich.edu UNSERIALIZE_SCALAR(numSm); 12245952Ssaidi@eecs.umich.edu UNSERIALIZE_SCALAR(numSmt); 122510905Sandreas.sandberg@arm.com UNSERIALIZE_CONTAINER(numSt); 122610905Sandreas.sandberg@arm.com UNSERIALIZE_CONTAINER(numQ); 12275952Ssaidi@eecs.umich.edu UNSERIALIZE_SCALAR(numSys); 12285952Ssaidi@eecs.umich.edu UNSERIALIZE_SCALAR(numQs); 12295952Ssaidi@eecs.umich.edu UNSERIALIZE_SCALAR(conId); 123010905Sandreas.sandberg@arm.com UNSERIALIZE_CONTAINER(qSize); 123110905Sandreas.sandberg@arm.com UNSERIALIZE_CONTAINER(qBytes); 12325952Ssaidi@eecs.umich.edu 12335952Ssaidi@eecs.umich.edu 12345952Ssaidi@eecs.umich.edu // smtCache (SCache 12355952Ssaidi@eecs.umich.edu string str; 12365952Ssaidi@eecs.umich.edu int smi; 12375952Ssaidi@eecs.umich.edu for (int x = 0; x < numSmt; x++) { 123810905Sandreas.sandberg@arm.com paramIn(cp, csprintf("smtCache%d.str", x), str); 123910905Sandreas.sandberg@arm.com paramIn(cp, csprintf("smtCache%d.int", x), smi); 12405952Ssaidi@eecs.umich.edu smtCache[str] = smi; 12415952Ssaidi@eecs.umich.edu } 12425952Ssaidi@eecs.umich.edu 12435952Ssaidi@eecs.umich.edu // stCache (StCache) 12445952Ssaidi@eecs.umich.edu stCache.resize(numSmt); 12455952Ssaidi@eecs.umich.edu for (int x = 0; x < numSmt; x++) { 12465952Ssaidi@eecs.umich.edu for (int y = 0; y < numSt[x]; y++) { 124710905Sandreas.sandberg@arm.com paramIn(cp, csprintf("stCache%d_%d.str", x,y), str); 124810905Sandreas.sandberg@arm.com paramIn(cp, csprintf("stCache%d_%d.int", x,y), smi); 12495952Ssaidi@eecs.umich.edu stCache[x][str] = smi; 12505952Ssaidi@eecs.umich.edu } 12515952Ssaidi@eecs.umich.edu } 12525952Ssaidi@eecs.umich.edu 12535952Ssaidi@eecs.umich.edu // qCache (IdCache) 12545952Ssaidi@eecs.umich.edu uint64_t id; 12555952Ssaidi@eecs.umich.edu qCache.resize(numSys); 12565952Ssaidi@eecs.umich.edu for (int x = 0; x < numSys; x++) { 12575952Ssaidi@eecs.umich.edu for (int y = 0; y < numQ[x]; y++) { 125810905Sandreas.sandberg@arm.com paramIn(cp, csprintf("qCache%d_%d.str", x,y), str); 125910905Sandreas.sandberg@arm.com paramIn(cp, csprintf("qCache%d_%d.id", x,y), id); 126010905Sandreas.sandberg@arm.com paramIn(cp, csprintf("qCache%d_%d.int", x,y), smi); 12615952Ssaidi@eecs.umich.edu qCache[x][Id(str,id)] = smi; 12625952Ssaidi@eecs.umich.edu } 12635952Ssaidi@eecs.umich.edu } 12645952Ssaidi@eecs.umich.edu 12655952Ssaidi@eecs.umich.edu // smCache (IdCache) 12665952Ssaidi@eecs.umich.edu smCache.resize(numSys); 12675952Ssaidi@eecs.umich.edu for (int x = 0; x < numSys; x++) { 12685952Ssaidi@eecs.umich.edu int size; 126910905Sandreas.sandberg@arm.com paramIn(cp, csprintf("smCache%d", x), size); 12705952Ssaidi@eecs.umich.edu for (int y = 0; y < size; y++) { 127110905Sandreas.sandberg@arm.com paramIn(cp, csprintf("smCache%d_%d.str", x,y), str); 127210905Sandreas.sandberg@arm.com paramIn(cp, csprintf("smCache%d_%d.id", x,y), id); 127310905Sandreas.sandberg@arm.com paramIn(cp, csprintf("smCache%d_%d.int", x,y), smi); 12745952Ssaidi@eecs.umich.edu smCache[x][Id(str,id)] = smi; 12755952Ssaidi@eecs.umich.edu } 12765952Ssaidi@eecs.umich.edu } 12775952Ssaidi@eecs.umich.edu 12785952Ssaidi@eecs.umich.edu // scLinks (ScCache) -- data not serialized, just creating one per sys 12795952Ssaidi@eecs.umich.edu for (int x = 0; x < numSys; x++) 12805952Ssaidi@eecs.umich.edu scLinks.push_back(ScHCache()); 12815952Ssaidi@eecs.umich.edu 12825952Ssaidi@eecs.umich.edu // nameCache (NameCache) 12835952Ssaidi@eecs.umich.edu for (int x = 0; x < numSys; x++) { 12845952Ssaidi@eecs.umich.edu System *sys; 12855952Ssaidi@eecs.umich.edu SimObject *sptr; 12865952Ssaidi@eecs.umich.edu string str; 12875952Ssaidi@eecs.umich.edu int sysi; 12885952Ssaidi@eecs.umich.edu 128910905Sandreas.sandberg@arm.com objParamIn(cp, csprintf("nameCache%d.name", x), sptr); 12905952Ssaidi@eecs.umich.edu sys = dynamic_cast<System*>(sptr); 12915952Ssaidi@eecs.umich.edu 129210905Sandreas.sandberg@arm.com paramIn(cp, csprintf("nameCache%d.str", x), str); 129310905Sandreas.sandberg@arm.com paramIn(cp, csprintf("nameCache%d.int", x), sysi); 129410377Sandreas.hansson@arm.com nameCache[sys] = std::make_pair(str, sysi); 12955952Ssaidi@eecs.umich.edu } 12965952Ssaidi@eecs.umich.edu 12975952Ssaidi@eecs.umich.edu //smStack (SmStack) 12985952Ssaidi@eecs.umich.edu int smStack_size; 129910905Sandreas.sandberg@arm.com paramIn(cp, "smStackIdCount", smStack_size); 13005952Ssaidi@eecs.umich.edu for (int x = 0; x < smStack_size; x++) { 13015952Ssaidi@eecs.umich.edu int sysi; 13025952Ssaidi@eecs.umich.edu uint64_t frame; 13035952Ssaidi@eecs.umich.edu int count; 130410905Sandreas.sandberg@arm.com paramIn(cp, csprintf("smStackId%d.sys", x), sysi); 130510905Sandreas.sandberg@arm.com paramIn(cp, csprintf("smStackId%d.frame", x), frame); 130610905Sandreas.sandberg@arm.com paramIn(cp, csprintf("smStackId%d.count", x), count); 13075952Ssaidi@eecs.umich.edu StackId sid = StackId(sysi, frame); 13085952Ssaidi@eecs.umich.edu for (int y = 0; y < count; y++) { 130910905Sandreas.sandberg@arm.com paramIn(cp, csprintf("smStackId%d_%d", x, y), smi); 13105952Ssaidi@eecs.umich.edu smStack[sid].push_back(smi); 13115952Ssaidi@eecs.umich.edu } 13125952Ssaidi@eecs.umich.edu } 13135952Ssaidi@eecs.umich.edu 13145952Ssaidi@eecs.umich.edu // lnMap (LinkMap) 13155952Ssaidi@eecs.umich.edu int lsmi; 13165952Ssaidi@eecs.umich.edu int lnMap_size; 131710905Sandreas.sandberg@arm.com paramIn(cp, "lnMapSize", lnMap_size); 13185952Ssaidi@eecs.umich.edu for (int x = 0; x < lnMap_size; x++) { 131910905Sandreas.sandberg@arm.com paramIn(cp, csprintf("lnMap%d.smi", x), smi); 132010905Sandreas.sandberg@arm.com paramIn(cp, csprintf("lnMap%d.lsmi", x), lsmi); 13215952Ssaidi@eecs.umich.edu lnMap[smi] = lsmi; 13225952Ssaidi@eecs.umich.edu } 13235952Ssaidi@eecs.umich.edu 13245952Ssaidi@eecs.umich.edu // swExpl (vector) 13255952Ssaidi@eecs.umich.edu int swExpl_size; 132610905Sandreas.sandberg@arm.com paramIn(cp, "swExplCount", swExpl_size); 13275952Ssaidi@eecs.umich.edu for (int x = 0; x < swExpl_size; x++) { 13285952Ssaidi@eecs.umich.edu int sysi; 13295952Ssaidi@eecs.umich.edu uint64_t frame; 13305952Ssaidi@eecs.umich.edu bool b; 133110905Sandreas.sandberg@arm.com paramIn(cp, csprintf("swExpl%d.sys", x), sysi); 133210905Sandreas.sandberg@arm.com paramIn(cp, csprintf("swExpl%d.frame", x), frame); 133310905Sandreas.sandberg@arm.com paramIn(cp, csprintf("swExpl%d.swexpl", x), b); 13345952Ssaidi@eecs.umich.edu StackId sid = StackId(sysi, frame); 13355952Ssaidi@eecs.umich.edu swExpl[sid] = b; 13365952Ssaidi@eecs.umich.edu } 13375952Ssaidi@eecs.umich.edu 13385952Ssaidi@eecs.umich.edu // lastState (IMap) 13395952Ssaidi@eecs.umich.edu int sti; 13405952Ssaidi@eecs.umich.edu int lastState_size; 134110905Sandreas.sandberg@arm.com paramIn(cp, "lastStateSize", lastState_size); 13425952Ssaidi@eecs.umich.edu for (int x = 0; x < lastState_size; x++) { 134310905Sandreas.sandberg@arm.com paramIn(cp, csprintf("lastState%d.smi", x), smi); 134410905Sandreas.sandberg@arm.com paramIn(cp, csprintf("lastState%d.sti", x), sti); 13455952Ssaidi@eecs.umich.edu lastState[smi] = sti; 13465952Ssaidi@eecs.umich.edu } 13475952Ssaidi@eecs.umich.edu 13485952Ssaidi@eecs.umich.edu 13495952Ssaidi@eecs.umich.edu //smMap (IdMap) 13505952Ssaidi@eecs.umich.edu smMap.resize(numSm); 13515952Ssaidi@eecs.umich.edu for (int x = 0; x < smMap.size(); x++) { 135210905Sandreas.sandberg@arm.com paramIn(cp, csprintf("smMap%d.sys", x), smMap[x].first); 135310905Sandreas.sandberg@arm.com paramIn(cp, csprintf("smMap%d.smname", x), smMap[x].second.first); 135410905Sandreas.sandberg@arm.com paramIn(cp, csprintf("smMap%d.id", x), smMap[x].second.second); 13555952Ssaidi@eecs.umich.edu } 13565952Ssaidi@eecs.umich.edu 13575952Ssaidi@eecs.umich.edu //qMap (IdMap) 13585952Ssaidi@eecs.umich.edu qMap.resize(numQs); 13595952Ssaidi@eecs.umich.edu for (int x = 0; x < qMap.size(); x++) { 136010905Sandreas.sandberg@arm.com paramIn(cp, csprintf("qMap%d.sys", x), qMap[x].first); 136110905Sandreas.sandberg@arm.com paramIn(cp, csprintf("qMap%d.qname", x), qMap[x].second.first); 136210905Sandreas.sandberg@arm.com paramIn(cp, csprintf("qMap%d.id", x), qMap[x].second.second); 13635952Ssaidi@eecs.umich.edu } 13645952Ssaidi@eecs.umich.edu 13655952Ssaidi@eecs.umich.edu 13665952Ssaidi@eecs.umich.edu // qData (vector<AnnotateList>) 13675952Ssaidi@eecs.umich.edu qData.resize(qSize.size()); 13685952Ssaidi@eecs.umich.edu for (int x = 0; x < qSize.size(); x++) { 13695952Ssaidi@eecs.umich.edu if (!qSize[x]) 13705952Ssaidi@eecs.umich.edu continue; 13715952Ssaidi@eecs.umich.edu for (int y = 0; y < qSize[x]; y++) { 137210470Sandreas.hansson@arm.com AnnDataPtr a = std::make_shared<AnnotateData>(); 137310905Sandreas.sandberg@arm.com a->unserializeSection(cp, csprintf("Q%d_%d", x, y)); 13745952Ssaidi@eecs.umich.edu data.push_back(a); 13755952Ssaidi@eecs.umich.edu qData[x].push_back(a); 13765952Ssaidi@eecs.umich.edu } 13775952Ssaidi@eecs.umich.edu } 13785952Ssaidi@eecs.umich.edu} 13795952Ssaidi@eecs.umich.edu 13805952Ssaidi@eecs.umich.eduvoid 138110905Sandreas.sandberg@arm.comCPA::AnnotateData::serialize(CheckpointOut &cp) const 13825952Ssaidi@eecs.umich.edu{ 13835952Ssaidi@eecs.umich.edu SERIALIZE_SCALAR(time); 13845952Ssaidi@eecs.umich.edu SERIALIZE_SCALAR(data); 13855952Ssaidi@eecs.umich.edu SERIALIZE_SCALAR(sm); 13865952Ssaidi@eecs.umich.edu SERIALIZE_SCALAR(stq); 13875952Ssaidi@eecs.umich.edu SERIALIZE_SCALAR(op); 13885952Ssaidi@eecs.umich.edu SERIALIZE_SCALAR(flag); 13895952Ssaidi@eecs.umich.edu SERIALIZE_SCALAR(cpu); 13905952Ssaidi@eecs.umich.edu} 13915952Ssaidi@eecs.umich.edu 13925952Ssaidi@eecs.umich.eduvoid 139310905Sandreas.sandberg@arm.comCPA::AnnotateData::unserialize(CheckpointIn &cp) 13945952Ssaidi@eecs.umich.edu{ 13955952Ssaidi@eecs.umich.edu UNSERIALIZE_SCALAR(time); 13965952Ssaidi@eecs.umich.edu UNSERIALIZE_SCALAR(data); 13975952Ssaidi@eecs.umich.edu orig_data = data; 13985952Ssaidi@eecs.umich.edu UNSERIALIZE_SCALAR(sm); 13995952Ssaidi@eecs.umich.edu UNSERIALIZE_SCALAR(stq); 14005952Ssaidi@eecs.umich.edu UNSERIALIZE_SCALAR(op); 14015952Ssaidi@eecs.umich.edu UNSERIALIZE_SCALAR(flag); 14025952Ssaidi@eecs.umich.edu UNSERIALIZE_SCALAR(cpu); 14035952Ssaidi@eecs.umich.edu dump = true; 14045952Ssaidi@eecs.umich.edu} 14055952Ssaidi@eecs.umich.edu 14065952Ssaidi@eecs.umich.eduCPA* 14075952Ssaidi@eecs.umich.eduCPAParams::create() 14085952Ssaidi@eecs.umich.edu{ 14095952Ssaidi@eecs.umich.edu return new CPA(this); 14105952Ssaidi@eecs.umich.edu} 14115952Ssaidi@eecs.umich.edu 1412