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