cp_annotate.cc revision 10905
16019Shines@cs.fsu.edu/* 212259Sgiacomo.travaglini@arm.com * Copyright (c) 2006-2009 The Regents of The University of Michigan 37093Sgblack@eecs.umich.edu * All rights reserved. 47093Sgblack@eecs.umich.edu * 57093Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 67093Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 77093Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 87093Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 97093Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 107093Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 117093Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 127093Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 137093Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 146019Shines@cs.fsu.edu * this software without specific prior written permission. 156019Shines@cs.fsu.edu * 166019Shines@cs.fsu.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 176019Shines@cs.fsu.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 186019Shines@cs.fsu.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 196019Shines@cs.fsu.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 206019Shines@cs.fsu.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 216019Shines@cs.fsu.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 226019Shines@cs.fsu.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 236019Shines@cs.fsu.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 246019Shines@cs.fsu.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 256019Shines@cs.fsu.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 266019Shines@cs.fsu.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 276019Shines@cs.fsu.edu * 286019Shines@cs.fsu.edu * Authors: Ali Saidi 296019Shines@cs.fsu.edu */ 306019Shines@cs.fsu.edu 316019Shines@cs.fsu.edu#include "arch/generic/linux/threadinfo.hh" 326019Shines@cs.fsu.edu#include "arch/utility.hh" 336019Shines@cs.fsu.edu#include "base/loader/object_file.hh" 346019Shines@cs.fsu.edu#include "base/callback.hh" 356019Shines@cs.fsu.edu#include "base/cp_annotate.hh" 366019Shines@cs.fsu.edu#include "base/output.hh" 376019Shines@cs.fsu.edu#include "base/trace.hh" 386019Shines@cs.fsu.edu#include "config/the_isa.hh" 396019Shines@cs.fsu.edu#include "cpu/thread_context.hh" 406019Shines@cs.fsu.edu#include "debug/Annotate.hh" 416735Sgblack@eecs.umich.edu#include "debug/AnnotateVerbose.hh" 426735Sgblack@eecs.umich.edu#include "sim/arguments.hh" 4310037SARM gem5 Developers#include "sim/core.hh" 4410037SARM gem5 Developers#include "sim/sim_exit.hh" 456019Shines@cs.fsu.edu#include "sim/system.hh" 466019Shines@cs.fsu.edu 476019Shines@cs.fsu.edustruct CPAIgnoreSymbol 4811793Sbrandon.potter@amd.com{ 4911793Sbrandon.potter@amd.com const char *symbol; 5010037SARM gem5 Developers size_t len; 5110037SARM gem5 Developers}; 5210037SARM gem5 Developers#define CPA_IGNORE_SYMBOL(sym) { #sym, sizeof(#sym) } 538229Snate@binkert.org 548229Snate@binkert.orgCPAIgnoreSymbol ignoreSymbols[] = { 556019Shines@cs.fsu.edu CPA_IGNORE_SYMBOL("m5a_"), 568232Snate@binkert.org CPA_IGNORE_SYMBOL("ret_from_sys_call"), 578782Sgblack@eecs.umich.edu CPA_IGNORE_SYMBOL("ret_from_reschedule"), 586019Shines@cs.fsu.edu CPA_IGNORE_SYMBOL("_spin_"), 596019Shines@cs.fsu.edu CPA_IGNORE_SYMBOL("local_bh_"), 606019Shines@cs.fsu.edu CPA_IGNORE_SYMBOL("restore_all"), 616019Shines@cs.fsu.edu CPA_IGNORE_SYMBOL("Call_Pal_"), 6210037SARM gem5 Developers CPA_IGNORE_SYMBOL("pal_post_interrupt"), 6310037SARM gem5 Developers CPA_IGNORE_SYMBOL("rti_to_"), 6410037SARM gem5 Developers CPA_IGNORE_SYMBOL("sys_int_2"), 6510037SARM gem5 Developers CPA_IGNORE_SYMBOL("sys_interrupt"), 6610037SARM gem5 Developers CPA_IGNORE_SYMBOL("normal_int"), 6710037SARM gem5 Developers CPA_IGNORE_SYMBOL("TRAP_INTERRUPT_10_"), 6810037SARM gem5 Developers CPA_IGNORE_SYMBOL("Trap_Interrupt"), 6910037SARM gem5 Developers CPA_IGNORE_SYMBOL("do_entInt"), 7010037SARM gem5 Developers CPA_IGNORE_SYMBOL("__do_softirq"), 7110037SARM gem5 Developers CPA_IGNORE_SYMBOL("_end"), 7210037SARM gem5 Developers CPA_IGNORE_SYMBOL("entInt"), 7310037SARM gem5 Developers CPA_IGNORE_SYMBOL("entSys"), 7410037SARM gem5 Developers {0,0} 7510037SARM gem5 Developers}; 7610037SARM gem5 Developers#undef CPA_IGNORE_SYMBOL 7710037SARM gem5 Developers 7810037SARM gem5 Developersusing namespace std; 7910037SARM gem5 Developersusing namespace TheISA; 8010037SARM gem5 Developers 8110037SARM gem5 Developersbool CPA::exists; 8210037SARM gem5 DevelopersCPA *CPA::_cpa; 8310037SARM gem5 Developers 8410037SARM gem5 Developersclass AnnotateDumpCallback : public Callback 8510037SARM gem5 Developers{ 8610037SARM gem5 Developers 8710037SARM gem5 Developers private: 8810037SARM gem5 Developers CPA *cpa; 8910037SARM gem5 Developers public: 9010037SARM gem5 Developers virtual void process(); 9110037SARM gem5 Developers AnnotateDumpCallback(CPA *_cpa) 9210037SARM gem5 Developers : cpa(_cpa) 9310037SARM gem5 Developers {} 9410037SARM gem5 Developers}; 9510037SARM gem5 Developers 9610037SARM gem5 Developersvoid 9710037SARM gem5 DevelopersAnnotateDumpCallback::process() 9810037SARM gem5 Developers{ 9910037SARM gem5 Developers cpa->dump(true); 10010037SARM gem5 Developers cpa->dumpKey(); 10110037SARM gem5 Developers} 1026019Shines@cs.fsu.edu 10310037SARM gem5 Developers 10410037SARM gem5 DevelopersCPA::CPA(Params *p) 10510037SARM gem5 Developers : SimObject(p), numSm(0), numSmt(0), numSys(0), numQs(0), conId(0) 1066019Shines@cs.fsu.edu{ 10710037SARM gem5 Developers if (exists) 10810037SARM gem5 Developers fatal("Multiple annotation objects found in system"); 10910037SARM gem5 Developers exists = true; 11010037SARM gem5 Developers 11110037SARM gem5 Developers _enabled = p->enabled; 11210037SARM gem5 Developers _cpa = this; 11310037SARM gem5 Developers 11410037SARM gem5 Developers vector<string>::iterator i; 11510037SARM gem5 Developers i = p->user_apps.begin(); 11610037SARM gem5 Developers 11710037SARM gem5 Developers while (i != p->user_apps.end()) { 11810037SARM gem5 Developers ObjectFile *of = createObjectFile(*i); 11910037SARM gem5 Developers string sf; 12010037SARM gem5 Developers if (!of) 12110037SARM gem5 Developers fatal("Couldn't load symbols from file: %s\n", *i); 12210037SARM gem5 Developers sf = *i; 12310037SARM gem5 Developers sf.erase(0, sf.rfind('/') + 1);; 12410037SARM gem5 Developers DPRINTFN("file %s short: %s\n", *i, sf); 12510037SARM gem5 Developers userApp[sf] = new SymbolTable; 12610037SARM gem5 Developers bool result1 = of->loadGlobalSymbols(userApp[sf]); 12710037SARM gem5 Developers bool result2 = of->loadLocalSymbols(userApp[sf]); 12810037SARM gem5 Developers if (!result1 || !result2) 12910037SARM gem5 Developers panic("blah"); 13010037SARM gem5 Developers assert(result1 && result2); 13110037SARM gem5 Developers i++; 13210037SARM gem5 Developers } 13310037SARM gem5 Developers} 13410037SARM gem5 Developers 13510037SARM gem5 Developersvoid 13610037SARM gem5 DevelopersCPA::startup() 13710037SARM gem5 Developers{ 13810037SARM gem5 Developers osbin = simout.create("annotate.bin", true); 13910037SARM gem5 Developers // MAGIC version number 'M''5''A'N' + version/capabilities 14010037SARM gem5 Developers ah.version = 0x4D35414E00000101ULL; 14110037SARM gem5 Developers ah.num_recs = 0; 14210037SARM gem5 Developers ah.key_off = 0; 14310037SARM gem5 Developers osbin->write((char*)&ah, sizeof(AnnotateHeader)); 14410037SARM gem5 Developers 14510037SARM gem5 Developers registerExitCallback(new AnnotateDumpCallback(this)); 14610037SARM gem5 Developers} 1476019Shines@cs.fsu.edu 14810037SARM gem5 Developersuint64_t 14910037SARM gem5 DevelopersCPA::getFrame(ThreadContext *tc) 15010037SARM gem5 Developers{ 1516019Shines@cs.fsu.edu // This code is ISA specific and will need to be changed 15210037SARM gem5 Developers // if the annotation code is used for something other than Alpha 15310037SARM gem5 Developers return (tc->readMiscRegNoEffect(TheISA::IPR_PALtemp23) & 15410037SARM gem5 Developers ~ULL(0x3FFF)); 15510037SARM gem5 Developers 15610037SARM gem5 Developers} 15710037SARM gem5 Developers 15810037SARM gem5 Developersvoid 15910037SARM gem5 DevelopersCPA::swSmBegin(ThreadContext *tc) 16010037SARM gem5 Developers{ 16110037SARM gem5 Developers if (!enabled()) 16210037SARM gem5 Developers return; 16310037SARM gem5 Developers 16410037SARM gem5 Developers Arguments args(tc); 16510037SARM gem5 Developers std::string st; 16610037SARM gem5 Developers Addr junk; 16710037SARM gem5 Developers char sm[50]; 16810037SARM gem5 Developers if (!TheISA::inUserMode(tc)) 16910037SARM gem5 Developers debugSymbolTable->findNearestSymbol( 17010037SARM gem5 Developers tc->readIntReg(ReturnAddressReg), st, junk); 17110037SARM gem5 Developers 17210037SARM gem5 Developers CopyStringOut(tc, sm, args[0], 50); 17310037SARM gem5 Developers System *sys = tc->getSystemPtr(); 17410037SARM gem5 Developers StringWrap name(sys->name()); 17510037SARM gem5 Developers 17610037SARM gem5 Developers if (!sm[0]) 17710037SARM gem5 Developers warn("Got null SM at tick %d\n", curTick()); 17810037SARM gem5 Developers 17910037SARM gem5 Developers int sysi = getSys(sys); 18010037SARM gem5 Developers int smi = getSm(sysi, sm, args[1]); 18110037SARM gem5 Developers DPRINTF(Annotate, "Starting machine: %s(%d) sysi: %d id: %#x\n", sm, 18210037SARM gem5 Developers smi, sysi, args[1]); 18310037SARM gem5 Developers DPRINTF(Annotate, "smMap[%d] = %d, %s, %#x\n", smi, 18410037SARM gem5 Developers smMap[smi-1].first, smMap[smi-1].second.first, 18510037SARM gem5 Developers smMap[smi-1].second.second); 18610037SARM gem5 Developers 18710037SARM gem5 Developers uint64_t frame = getFrame(tc); 18810037SARM gem5 Developers StackId sid = StackId(sysi, frame); 18910037SARM gem5 Developers 19010037SARM gem5 Developers // check if we need to link to the previous state machine 19110037SARM gem5 Developers int flags = args[2]; 19210037SARM gem5 Developers if (flags & FL_LINK) { 1936019Shines@cs.fsu.edu if (smStack[sid].size()) { 19410037SARM gem5 Developers int prev_smi = smStack[sid].back(); 19510037SARM gem5 Developers DPRINTF(Annotate, "Linking from %d to state machine %s(%d) [%#x]\n", 19610037SARM gem5 Developers prev_smi, sm, smi, args[1]); 1976019Shines@cs.fsu.edu 19810037SARM gem5 Developers if (lnMap[smi]) 19910037SARM gem5 Developers DPRINTF(Annotate, "LnMap already contains entry for %d of %d\n", 20010037SARM gem5 Developers smi, lnMap[smi]); 20110037SARM gem5 Developers assert(lnMap[smi] == 0); 20210037SARM gem5 Developers lnMap[smi] = prev_smi; 20310037SARM gem5 Developers 20410037SARM gem5 Developers add(OP_LINK, FL_NONE, tc->contextId(), prev_smi, smi); 20510037SARM gem5 Developers } else { 20610037SARM gem5 Developers DPRINTF(Annotate, "Not Linking to state machine %s(%d) [%#x]\n", 20710037SARM gem5 Developers sm, smi, args[1]); 20810037SARM gem5 Developers } 20910037SARM gem5 Developers } 21010037SARM gem5 Developers 21110037SARM gem5 Developers 21210037SARM gem5 Developers smStack[sid].push_back(smi); 21310037SARM gem5 Developers 21410037SARM gem5 Developers DPRINTF(Annotate, "Stack Now (%#X):\n", frame); 21510037SARM gem5 Developers for (int x = smStack[sid].size()-1; x >= 0; x--) 21610037SARM gem5 Developers DPRINTF(Annotate, "-- %d\n", smStack[sid][x]); 21710037SARM gem5 Developers 21810037SARM gem5 Developers // reset the sw state exculsion to false 21910037SARM gem5 Developers if (swExpl[sid]) 22010037SARM gem5 Developers swExpl[sid] = false; 22110037SARM gem5 Developers 22210037SARM gem5 Developers 22310037SARM gem5 Developers Id id = Id(sm, frame); 22410037SARM gem5 Developers if (scLinks[sysi-1][id]) { 22510037SARM gem5 Developers AnnDataPtr an = scLinks[sysi-1][id]; 22610037SARM gem5 Developers scLinks[sysi-1].erase(id); 22710037SARM gem5 Developers an->stq = smi; 22810037SARM gem5 Developers an->dump = true; 22910037SARM gem5 Developers DPRINTF(Annotate, 23010037SARM gem5 Developers "Found prev unknown linking from %d to state machine %s(%d)\n", 23110037SARM gem5 Developers an->sm, sm, smi); 23210037SARM gem5 Developers 23310037SARM gem5 Developers if (lnMap[smi]) 23410037SARM gem5 Developers DPRINTF(Annotate, "LnMap already contains entry for %d of %d\n", 23510037SARM gem5 Developers smi, lnMap[smi]); 23610037SARM gem5 Developers assert(lnMap[smi] == 0); 23710037SARM gem5 Developers lnMap[smi] = an->sm; 23810037SARM gem5 Developers } 23910037SARM gem5 Developers 24010037SARM gem5 Developers // add a new begin ifwe have that info 24110037SARM gem5 Developers if (st != "") { 24210037SARM gem5 Developers DPRINTF(Annotate, "st: %s smi: %d stCache.size %d\n", st, 24310037SARM gem5 Developers smi, stCache.size()); 24410037SARM gem5 Developers int sti = getSt(sm, st); 24510037SARM gem5 Developers lastState[smi] = sti; 24610037SARM gem5 Developers add(OP_BEGIN, FL_NONE, tc->contextId(), smi, sti); 24710037SARM gem5 Developers } 24810037SARM gem5 Developers} 24910037SARM gem5 Developers 25010037SARM gem5 Developersvoid 25110037SARM gem5 DevelopersCPA::swSmEnd(ThreadContext *tc) 25210037SARM gem5 Developers{ 25310037SARM gem5 Developers if (!enabled()) 25410037SARM gem5 Developers return; 25510037SARM gem5 Developers 25610037SARM gem5 Developers Arguments args(tc); 25710037SARM gem5 Developers char sm[50]; 25810037SARM gem5 Developers CopyStringOut(tc, sm, args[0], 50); 25910037SARM gem5 Developers System *sys = tc->getSystemPtr(); 26010037SARM gem5 Developers doSwSmEnd(sys, tc->contextId(), sm, getFrame(tc)); 26110037SARM gem5 Developers} 26210037SARM gem5 Developers 26310037SARM gem5 Developersvoid 26410037SARM gem5 DevelopersCPA::doSwSmEnd(System *sys, int cpuid, string sm, uint64_t frame) 26510037SARM gem5 Developers{ 26610037SARM gem5 Developers int sysi = getSys(sys); 26710037SARM gem5 Developers StackId sid = StackId(sysi, frame); 26810037SARM gem5 Developers 26910037SARM gem5 Developers 27010037SARM gem5 Developers // reset the sw state exculsion to false 27110037SARM gem5 Developers if (swExpl[sid]) 27210037SARM gem5 Developers swExpl[sid] = false; 27310037SARM gem5 Developers 27410037SARM gem5 Developers 27510037SARM gem5 Developers int smib = smStack[sid].back(); 27610037SARM gem5 Developers StringWrap name(sys->name()); 27710037SARM gem5 Developers DPRINTF(Annotate, "Ending machine: %s[%d, %#x] (%d?)\n", sm, sysi, 27810037SARM gem5 Developers frame, smib); 27910037SARM gem5 Developers 28010037SARM gem5 Developers if (!smStack[sid].size() || smMap[smib-1].second.first != sm) { 28112299Sandreas.sandberg@arm.com DPRINTF(Annotate, "State Machine not unwinding correctly. sid: %d, %#x" 28212299Sandreas.sandberg@arm.com " top of stack: %s Current Stack:\n", 28312299Sandreas.sandberg@arm.com sysi, frame, smMap[smib-1].second.first); 28412299Sandreas.sandberg@arm.com for (int x = smStack[sid].size()-1; x >= 0; x--) 28512299Sandreas.sandberg@arm.com DPRINTF(Annotate, "-- %d\n", smStack[sid][x]); 28610037SARM gem5 Developers DPRINTF(Annotate, "Ending machine: %s; end stack: %s\n", sm, 28710037SARM gem5 Developers smMap[smib-1].second.first); 28810037SARM gem5 Developers 28910037SARM gem5 Developers warn("State machine stack not unwinding correctly at %d\n", curTick()); 29010037SARM gem5 Developers } else { 29110037SARM gem5 Developers DPRINTF(Annotate, 29210037SARM gem5 Developers "State machine ending:%s sysi:%d id:%#x back:%d getSm:%d\n", 29310037SARM gem5 Developers sm, sysi, smMap[smib-1].second.second, smStack[sid].back(), 29410037SARM gem5 Developers getSm(sysi, sm, smMap[smib-1].second.second)); 29510037SARM gem5 Developers assert(getSm(sysi, sm, smMap[smib-1].second.second) == 2966019Shines@cs.fsu.edu smStack[sid].back()); 29710037SARM gem5 Developers 2987362Sgblack@eecs.umich.edu int smi = smStack[sid].back(); 2996735Sgblack@eecs.umich.edu smStack[sid].pop_back(); 30010037SARM gem5 Developers 3016019Shines@cs.fsu.edu if (lnMap[smi]) { 30210037SARM gem5 Developers DPRINTF(Annotate, "Linking %d back to %d\n", smi, lnMap[smi]); 30310037SARM gem5 Developers add(OP_LINK, FL_NONE, cpuid, smi, lnMap[smi]); 3047400SAli.Saidi@ARM.com lnMap.erase(smi); 3056735Sgblack@eecs.umich.edu } 3066735Sgblack@eecs.umich.edu 30710037SARM gem5 Developers if (smStack[sid].size()) { 3086735Sgblack@eecs.umich.edu add(OP_BEGIN, FL_NONE, cpuid, smi, lastState[smi]); 30910037SARM gem5 Developers } 31010037SARM gem5 Developers 31110037SARM gem5 Developers DPRINTF(Annotate, "Stack Now:\n"); 31210037SARM gem5 Developers for (int x = smStack[sid].size()-1; x >= 0; x--) 3137400SAli.Saidi@ARM.com DPRINTF(Annotate, "-- %d\n", smStack[sid][x]); 31410037SARM gem5 Developers } 31510037SARM gem5 Developers} 31610037SARM gem5 Developers 31710037SARM gem5 Developers 31810037SARM gem5 Developersvoid 31910037SARM gem5 DevelopersCPA::swExplictBegin(ThreadContext *tc) 32010037SARM gem5 Developers{ 32110037SARM gem5 Developers if (!enabled()) 32210037SARM gem5 Developers return; 32310037SARM gem5 Developers 32410037SARM gem5 Developers Arguments args(tc); 32510037SARM gem5 Developers char st[50]; 32610037SARM gem5 Developers CopyStringOut(tc, st, args[1], 50); 32710037SARM gem5 Developers 32810037SARM gem5 Developers StringWrap name(tc->getSystemPtr()->name()); 32910037SARM gem5 Developers DPRINTF(Annotate, "Explict begin of state %s\n", st); 33010037SARM gem5 Developers uint32_t flags = args[0]; 3316019Shines@cs.fsu.edu if (flags & FL_BAD) 3326019Shines@cs.fsu.edu warn("BAD state encountered: at cycle %d: %s\n", curTick(), st); 33310037SARM gem5 Developers swBegin(tc->getSystemPtr(), tc->contextId(), st, getFrame(tc), true, args[0]); 33410037SARM gem5 Developers} 33510037SARM gem5 Developers 33610037SARM gem5 Developersvoid 33710037SARM gem5 DevelopersCPA::swAutoBegin(ThreadContext *tc, Addr next_pc) 33810037SARM gem5 Developers{ 33910037SARM gem5 Developers if (!enabled()) 34010037SARM gem5 Developers return; 34110037SARM gem5 Developers 34211574SCurtis.Dunham@arm.com string sym; 34311574SCurtis.Dunham@arm.com Addr sym_addr = 0; 34411574SCurtis.Dunham@arm.com 34511574SCurtis.Dunham@arm.com if (!TheISA::inUserMode(tc)) { 34610037SARM gem5 Developers debugSymbolTable->findNearestSymbol(next_pc, sym, sym_addr); 34710037SARM gem5 Developers } else { 34810037SARM gem5 Developers Linux::ThreadInfo ti(tc); 34910037SARM gem5 Developers string app = ti.curTaskName(); 35010037SARM gem5 Developers if (userApp.count(app)) 35110037SARM gem5 Developers userApp[app]->findNearestSymbol(next_pc, sym, sym_addr); 35210037SARM gem5 Developers } 35310037SARM gem5 Developers 35410037SARM gem5 Developers if (sym_addr) 35510037SARM gem5 Developers swBegin(tc->getSystemPtr(), tc->contextId(), sym, getFrame(tc)); 35610037SARM gem5 Developers} 35710037SARM gem5 Developers 35810037SARM gem5 Developersvoid 35910037SARM gem5 DevelopersCPA::swBegin(System *sys, int cpuid, std::string st, uint64_t frame, bool expl, 36010037SARM gem5 Developers int flags) 36110037SARM gem5 Developers{ 36210037SARM gem5 Developers int x = 0; 36310037SARM gem5 Developers int len; 36410037SARM gem5 Developers while (ignoreSymbols[x].len) 36510037SARM gem5 Developers { 36610037SARM gem5 Developers len = ignoreSymbols[x].len; 36710037SARM gem5 Developers if (!st.compare(0,len, ignoreSymbols[x].symbol, len)) 36810037SARM gem5 Developers return; 36910037SARM gem5 Developers x++; 37010037SARM gem5 Developers } 37110037SARM gem5 Developers 37210037SARM gem5 Developers int sysi = getSys(sys); 37310037SARM gem5 Developers StackId sid = StackId(sysi, frame); 37410037SARM gem5 Developers // if expl is true suspend symbol table based states 37510037SARM gem5 Developers if (!smStack[sid].size()) 37610037SARM gem5 Developers return; 37710037SARM gem5 Developers if (!expl && swExpl[sid]) 37810037SARM gem5 Developers return; 37910037SARM gem5 Developers if (expl) 38010037SARM gem5 Developers swExpl[sid] = true; 38110037SARM gem5 Developers DPRINTFS(AnnotateVerbose, sys, "SwBegin: %s sysi: %d\n", st, sysi); 38210037SARM gem5 Developers int smi = smStack[sid].back(); 38310037SARM gem5 Developers int sti = getSt(smMap[smi-1].second.first, st); 38410037SARM gem5 Developers if (lastState[smi] != sti) { 38510037SARM gem5 Developers lastState[smi] = sti; 38610037SARM gem5 Developers add(OP_BEGIN, flags, cpuid, smi, sti); 38710037SARM gem5 Developers } 38810037SARM gem5 Developers} 38910037SARM gem5 Developers 39010037SARM gem5 Developersvoid 39110037SARM gem5 DevelopersCPA::swEnd(ThreadContext *tc) 39210037SARM gem5 Developers{ 39310037SARM gem5 Developers if (!enabled()) 39410037SARM gem5 Developers return; 39510037SARM gem5 Developers 39610037SARM gem5 Developers std::string st; 39710037SARM gem5 Developers Addr junk; 39810037SARM gem5 Developers if (!TheISA::inUserMode(tc)) 39910037SARM gem5 Developers debugSymbolTable->findNearestSymbol( 40010037SARM gem5 Developers tc->readIntReg(ReturnAddressReg), st, junk); 40110037SARM gem5 Developers System *sys = tc->getSystemPtr(); 40210037SARM gem5 Developers StringWrap name(sys->name()); 40310037SARM gem5 Developers 40410037SARM gem5 Developers int sysi = getSys(sys); 40510037SARM gem5 Developers StackId sid = StackId(sysi, getFrame(tc)); 40610037SARM gem5 Developers if (!smStack[sid].size()) { 40710037SARM gem5 Developers DPRINTF(Annotate, "Explict end of State: %s IGNORED\n", st); 40810037SARM gem5 Developers return; 40910037SARM gem5 Developers } 41010037SARM gem5 Developers DPRINTF(Annotate, "Explict end of State: %s\n", st); 41110037SARM gem5 Developers // return back to symbol table based states 41210037SARM gem5 Developers swExpl[sid] = false; 41310037SARM gem5 Developers int smi = smStack[sid].back(); 41410037SARM gem5 Developers if (st != "") { 41510037SARM gem5 Developers int sti = getSt(smMap[smi-1].second.first, st); 41610037SARM gem5 Developers lastState[smi] = sti; 41710037SARM gem5 Developers add(OP_BEGIN, FL_NONE, tc->contextId(), smi, sti); 41810037SARM gem5 Developers } 41910037SARM gem5 Developers} 42010037SARM gem5 Developers 42110037SARM gem5 Developersvoid 42210037SARM gem5 DevelopersCPA::swQ(ThreadContext *tc) 42310037SARM gem5 Developers{ 42410037SARM gem5 Developers if (!enabled()) 42510037SARM gem5 Developers return; 42610037SARM gem5 Developers 42710037SARM gem5 Developers char q[50]; 42810037SARM gem5 Developers Arguments args(tc); 42910417Sandreas.hansson@arm.com uint64_t id = args[0]; 4306019Shines@cs.fsu.edu CopyStringOut(tc, q, args[1], 50); 43110037SARM gem5 Developers int32_t count = args[2]; 43210037SARM gem5 Developers System *sys = tc->getSystemPtr(); 43310037SARM gem5 Developers 43410037SARM gem5 Developers int sysi = getSys(sys); 43510037SARM gem5 Developers StackId sid = StackId(sysi, getFrame(tc)); 43610037SARM gem5 Developers if (!smStack[sid].size()) 43710037SARM gem5 Developers return; 43810037SARM gem5 Developers int smi = smStack[sid].back(); 43910037SARM gem5 Developers if (swExpl[sid]) 44010037SARM gem5 Developers swExpl[sid] = false; 44110037SARM gem5 Developers int qi = getQ(sysi, q, id); 44210037SARM gem5 Developers if (count == 0) { 44311578SDylan.Johnson@ARM.com //warn("Tried to queue 0 bytes in %s, ignoring\n", q); 44411578SDylan.Johnson@ARM.com return; 44510037SARM gem5 Developers } 44610037SARM gem5 Developers DPRINTFS(AnnotateQ, sys, 44710037SARM gem5 Developers "swQ: %s[%#x] cur size %d %d bytes: %d adding: %d\n", 44810037SARM gem5 Developers q, id, qSize[qi-1], qData[qi-1].size(), qBytes[qi-1], count); 44910037SARM gem5 Developers doQ(sys, FL_NONE, tc->contextId(), smi, q, qi, count); 45010037SARM gem5 Developers} 45110037SARM gem5 Developers 45210037SARM gem5 Developersvoid 45310037SARM gem5 DevelopersCPA::swDq(ThreadContext *tc) 45410037SARM gem5 Developers{ 45510037SARM gem5 Developers if (!enabled()) 45610037SARM gem5 Developers return; 45710037SARM gem5 Developers 45810037SARM gem5 Developers char q[50]; 45910037SARM gem5 Developers Arguments args(tc); 46010037SARM gem5 Developers uint64_t id = args[0]; 46110037SARM gem5 Developers CopyStringOut(tc, q, args[1], 50); 46210037SARM gem5 Developers int32_t count = args[2]; 4636735Sgblack@eecs.umich.edu System *sys = tc->getSystemPtr(); 4648782Sgblack@eecs.umich.edu 4658782Sgblack@eecs.umich.edu int sysi = getSys(sys); 4666735Sgblack@eecs.umich.edu StackId sid = StackId(sysi, getFrame(tc)); 4676019Shines@cs.fsu.edu if (!smStack[sid].size()) 4686735Sgblack@eecs.umich.edu return; 46910037SARM gem5 Developers int smi = smStack[sid].back(); 4708303SAli.Saidi@ARM.com int qi = getQ(sysi, q, id); 47110338SCurtis.Dunham@arm.com if (swExpl[sid]) 47210338SCurtis.Dunham@arm.com swExpl[sid] = false; 47310338SCurtis.Dunham@arm.com DPRINTFS(AnnotateQ, sys, 47410338SCurtis.Dunham@arm.com "swDq: %s[%#x] cur size %d %d bytes: %d removing: %d\n", 4758303SAli.Saidi@ARM.com q, id, qSize[qi-1], qData[qi-1].size(), qBytes[qi-1], count); 4767720Sgblack@eecs.umich.edu assert(count != 0); 4778205SAli.Saidi@ARM.com 4788205SAli.Saidi@ARM.com doDq(sys, FL_NONE, tc->contextId(), smi, q, qi, count); 4798205SAli.Saidi@ARM.com} 4806735Sgblack@eecs.umich.edu 48110037SARM gem5 Developersvoid 48210037SARM gem5 DevelopersCPA::swPq(ThreadContext *tc) 48310037SARM gem5 Developers{ 48410037SARM gem5 Developers if (!enabled()) 48510037SARM gem5 Developers return; 48610037SARM gem5 Developers 48710037SARM gem5 Developers char q[50]; 48810037SARM gem5 Developers Arguments args(tc); 48910037SARM gem5 Developers uint64_t id = args[0]; 49010037SARM gem5 Developers CopyStringOut(tc, q, args[1], 50); 49110037SARM gem5 Developers System *sys = tc->getSystemPtr(); 49210037SARM gem5 Developers int32_t count = args[2]; 49310037SARM gem5 Developers 49410037SARM gem5 Developers int sysi = getSys(sys); 49510037SARM gem5 Developers StackId sid = StackId(sysi, getFrame(tc)); 49610037SARM gem5 Developers if (!smStack[sid].size()) 49710037SARM gem5 Developers return; 49810037SARM gem5 Developers int smi = smStack[sid].back(); 49910037SARM gem5 Developers int qi = getQ(sysi, q, id); 50010037SARM gem5 Developers if (swExpl[sid]) 50110037SARM gem5 Developers swExpl[sid] = false; 50210037SARM gem5 Developers DPRINTFS(AnnotateQ, sys, 50310037SARM gem5 Developers "swPq: %s [%#x] cur size %d %d bytes: %d peeking: %d\n", 50410037SARM gem5 Developers q, id, qSize[qi-1], qData[qi-1].size(), qBytes[qi-1], count); 50510037SARM gem5 Developers 50610037SARM gem5 Developers assert(count != 0); 50710037SARM gem5 Developers if (qBytes[qi-1] < count) { 50810037SARM gem5 Developers dump(true); 50910037SARM gem5 Developers dumpKey(); 51010037SARM gem5 Developers fatal("Queue %s peeking with not enough bytes available in queue!\n", q); 51110037SARM gem5 Developers } 51210037SARM gem5 Developers 51310037SARM gem5 Developers add(OP_PEEK, FL_NONE, tc->contextId(), smi, qi, count); 51410037SARM gem5 Developers} 51510037SARM gem5 Developers 51610037SARM gem5 Developersvoid 51710037SARM gem5 DevelopersCPA::swRq(ThreadContext *tc) 51810037SARM gem5 Developers{ 51910037SARM gem5 Developers if (!enabled()) 52010037SARM gem5 Developers return; 52110037SARM gem5 Developers 52210037SARM gem5 Developers char q[50]; 52310037SARM gem5 Developers Arguments args(tc); 52410037SARM gem5 Developers uint64_t id = args[0]; 52510037SARM gem5 Developers CopyStringOut(tc, q, args[1], 50); 52610037SARM gem5 Developers System *sys = tc->getSystemPtr(); 52710037SARM gem5 Developers int32_t count = args[2]; 52810037SARM gem5 Developers 5296735Sgblack@eecs.umich.edu int sysi = getSys(sys); 5306735Sgblack@eecs.umich.edu StackId sid = StackId(sysi, getFrame(tc)); 5316735Sgblack@eecs.umich.edu if (!smStack[sid].size()) 53210037SARM gem5 Developers return; 5338518Sgeoffrey.blake@arm.com int smi = smStack[sid].back(); 5348518Sgeoffrey.blake@arm.com int qi = getQ(sysi, q, id); 5356735Sgblack@eecs.umich.edu if (swExpl[sid]) 53610037SARM gem5 Developers swExpl[sid] = false; 53710037SARM gem5 Developers DPRINTFS(AnnotateQ, sys, 53810037SARM gem5 Developers "swRq: %s [%#x] cur size %d %d bytes: %d reserve: %d\n", 53910037SARM gem5 Developers q, id, qSize[qi-1], qData[qi-1].size(), qBytes[qi-1], count); 54010037SARM gem5 Developers 54110037SARM gem5 Developers assert(count != 0); 54210037SARM gem5 Developers 54310037SARM gem5 Developers add(OP_RESERVE, FL_NONE, tc->contextId(), smi, qi, count); 54410037SARM gem5 Developers} 54510037SARM gem5 Developers 54610037SARM gem5 Developers 54710037SARM gem5 Developersvoid 5486735Sgblack@eecs.umich.eduCPA::swWf(ThreadContext *tc) 5496735Sgblack@eecs.umich.edu{ 5506735Sgblack@eecs.umich.edu if (!enabled()) 5516735Sgblack@eecs.umich.edu return; 5526735Sgblack@eecs.umich.edu 5536735Sgblack@eecs.umich.edu char q[50]; 5546735Sgblack@eecs.umich.edu Arguments args(tc); 5556735Sgblack@eecs.umich.edu uint64_t id = args[0]; 5566735Sgblack@eecs.umich.edu CopyStringOut(tc, q, args[1], 50); 55710037SARM gem5 Developers System *sys = tc->getSystemPtr(); 55810037SARM gem5 Developers int32_t count = args[3]; 55910037SARM gem5 Developers 5606735Sgblack@eecs.umich.edu int sysi = getSys(sys); 5616735Sgblack@eecs.umich.edu StackId sid = StackId(sysi, getFrame(tc)); 5626735Sgblack@eecs.umich.edu if (!smStack[sid].size()) 5636735Sgblack@eecs.umich.edu return; 56410037SARM gem5 Developers int smi = smStack[sid].back(); 56510037SARM gem5 Developers int qi = getQ(sysi, q, id); 56610037SARM gem5 Developers add(OP_WAIT_FULL, FL_NONE, tc->contextId(), smi, qi, count); 56710037SARM gem5 Developers 56810037SARM gem5 Developers if (!!args[2]) { 56910037SARM gem5 Developers char sm[50]; 57010037SARM gem5 Developers CopyStringOut(tc, sm, args[2], 50); 57110037SARM gem5 Developers doSwSmEnd(tc->getSystemPtr(), tc->contextId(), sm, getFrame(tc)); 57210037SARM gem5 Developers } 57310037SARM gem5 Developers} 5746735Sgblack@eecs.umich.edu 5756735Sgblack@eecs.umich.eduvoid 5767093Sgblack@eecs.umich.eduCPA::swWe(ThreadContext *tc) 5777093Sgblack@eecs.umich.edu{ 5787720Sgblack@eecs.umich.edu if (!enabled()) 5797585SAli.Saidi@arm.com return; 5807720Sgblack@eecs.umich.edu 5817720Sgblack@eecs.umich.edu char q[50]; 5827720Sgblack@eecs.umich.edu Arguments args(tc); 5837720Sgblack@eecs.umich.edu uint64_t id = args[0]; 5847720Sgblack@eecs.umich.edu CopyStringOut(tc, q, args[1], 50); 5857720Sgblack@eecs.umich.edu System *sys = tc->getSystemPtr(); 58610037SARM gem5 Developers int32_t count = args[3]; 58710037SARM gem5 Developers 5887720Sgblack@eecs.umich.edu int sysi = getSys(sys); 5896019Shines@cs.fsu.edu StackId sid = StackId(sysi, getFrame(tc)); 5907189Sgblack@eecs.umich.edu if (!smStack[sid].size()) 5917400SAli.Saidi@ARM.com return; 59210417Sandreas.hansson@arm.com int smi = smStack[sid].back(); 59310037SARM gem5 Developers int qi = getQ(sysi, q, id); 59410037SARM gem5 Developers add(OP_WAIT_EMPTY, FL_NONE, tc->contextId(), smi, qi, count); 59510037SARM gem5 Developers 59610037SARM gem5 Developers if (!!args[2]) { 59710037SARM gem5 Developers char sm[50]; 59810037SARM gem5 Developers CopyStringOut(tc, sm, args[2], 50); 59910037SARM gem5 Developers doSwSmEnd(tc->getSystemPtr(), tc->contextId(), sm, getFrame(tc)); 60010037SARM gem5 Developers } 60111574SCurtis.Dunham@arm.com} 60211574SCurtis.Dunham@arm.com 60311574SCurtis.Dunham@arm.comvoid 60411574SCurtis.Dunham@arm.comCPA::swSq(ThreadContext *tc) 60511574SCurtis.Dunham@arm.com{ 60610037SARM gem5 Developers if (!enabled()) 60710037SARM gem5 Developers return; 60810037SARM gem5 Developers 60910037SARM gem5 Developers char q[50]; 61010037SARM gem5 Developers Arguments args(tc); 61110037SARM gem5 Developers uint64_t id = args[0]; 61210037SARM gem5 Developers CopyStringOut(tc, q, args[1], 50); 61310037SARM gem5 Developers System *sys = tc->getSystemPtr(); 61410037SARM gem5 Developers StringWrap name(sys->name()); 61510037SARM gem5 Developers int32_t size = args[2]; 61610037SARM gem5 Developers int flags = args[3]; 61710037SARM gem5 Developers 61810037SARM gem5 Developers int sysi = getSys(sys); 61910338SCurtis.Dunham@arm.com StackId sid = StackId(sysi, getFrame(tc)); 62010338SCurtis.Dunham@arm.com if (!smStack[sid].size()) 62110338SCurtis.Dunham@arm.com return; 62210037SARM gem5 Developers int smi = smStack[sid].back(); 62310037SARM gem5 Developers int qi = getQ(sysi, q, id); 62410037SARM gem5 Developers DPRINTF(AnnotateQ, "swSq: %s [%#x] cur size: %d bytes: %d, new size: %d\n", 62510037SARM gem5 Developers q, id, qSize[qi-1], qBytes[qi-1], size); 62610037SARM gem5 Developers 62710037SARM gem5 Developers if (FL_RESET & flags) { 62810037SARM gem5 Developers DPRINTF(AnnotateQ, "Resetting Queue %s\n", q); 62910037SARM gem5 Developers add(OP_SIZE_QUEUE, FL_NONE, tc->contextId(), smi, qi, 0); 63010037SARM gem5 Developers qData[qi-1].clear(); 63110037SARM gem5 Developers qSize[qi-1] = 0; 63210338SCurtis.Dunham@arm.com qBytes[qi-1] = 0; 63310037SARM gem5 Developers } 63410037SARM gem5 Developers 63510037SARM gem5 Developers if (qBytes[qi-1] < size) 63610037SARM gem5 Developers doQ(sys, FL_NONE, tc->contextId(), smi, q, qi, size - qBytes[qi-1]); 63710037SARM gem5 Developers else if (qBytes[qi-1] > size) { 63810037SARM gem5 Developers DPRINTF(AnnotateQ, "removing for resize of queue %s\n", q); 63910037SARM gem5 Developers add(OP_SIZE_QUEUE, FL_NONE, tc->contextId(), smi, qi, size); 64010037SARM gem5 Developers if (size <= 0) { 64110037SARM gem5 Developers qData[qi-1].clear(); 64210037SARM gem5 Developers qSize[qi-1] = 0; 64310037SARM gem5 Developers qBytes[qi-1] = 0; 64410037SARM gem5 Developers return; 64510037SARM gem5 Developers } 64610037SARM gem5 Developers int need = qBytes[qi-1] - size; 64710037SARM gem5 Developers qBytes[qi-1] = size; 64810037SARM gem5 Developers while (need > 0) { 64910037SARM gem5 Developers int32_t tail_bytes = qData[qi-1].back()->data; 65010037SARM gem5 Developers if (qSize[qi-1] <= 0 || qBytes[qi-1] < 0) { 65110037SARM gem5 Developers dump(true); 65210037SARM gem5 Developers dumpKey(); 65310037SARM gem5 Developers fatal("Queue %s had inconsistancy when doing size queue!\n", q); 65410037SARM gem5 Developers } 65510037SARM gem5 Developers if (tail_bytes > need) { 65610037SARM gem5 Developers qData[qi-1].back()->data -= need; 65710037SARM gem5 Developers need = 0; 65810037SARM gem5 Developers } else if (tail_bytes == need) { 65910037SARM gem5 Developers qData[qi-1].pop_back(); 66010037SARM gem5 Developers qSize[qi-1]--; 66110037SARM gem5 Developers need = 0; 66210037SARM gem5 Developers } else { 66310037SARM gem5 Developers qData[qi-1].pop_back(); 66410037SARM gem5 Developers qSize[qi-1]--; 66510037SARM gem5 Developers need -= tail_bytes; 66610037SARM gem5 Developers } 66710037SARM gem5 Developers } 66810037SARM gem5 Developers } 66910037SARM gem5 Developers} 67010037SARM gem5 Developers 67110037SARM gem5 Developersvoid 67210037SARM gem5 DevelopersCPA::swAq(ThreadContext *tc) 67310037SARM gem5 Developers{ 67410037SARM gem5 Developers if (!enabled()) 67510037SARM gem5 Developers return; 67610037SARM gem5 Developers 67710037SARM gem5 Developers char q[50]; 67810037SARM gem5 Developers Arguments args(tc); 67910037SARM gem5 Developers uint64_t id = args[0]; 68010037SARM gem5 Developers CopyStringOut(tc, q, args[1], 50); 68110037SARM gem5 Developers System *sys = tc->getSystemPtr(); 68210417Sandreas.hansson@arm.com StringWrap name(sys->name()); 6837400SAli.Saidi@ARM.com int32_t size = args[2]; 6848782Sgblack@eecs.umich.edu 68511150Smitch.hayenga@arm.com int sysi = getSys(sys); 6868782Sgblack@eecs.umich.edu int qi = getQ(sysi, q, id); 6878782Sgblack@eecs.umich.edu if (qBytes[qi-1] != size) { 68810037SARM gem5 Developers DPRINTF(AnnotateQ, "Queue %s [%#x] has inconsintant size\n", q, id); 68910037SARM gem5 Developers //dump(true); 69010037SARM gem5 Developers //dumpKey(); 69110037SARM gem5 Developers std::list<AnnDataPtr>::iterator ai = qData[qi-1].begin(); 69210037SARM gem5 Developers int x = 0; 69310037SARM gem5 Developers while (ai != qData[qi-1].end()) { 69410037SARM gem5 Developers DPRINTF(AnnotateQ, "--Element %d size %d\n", x, (*ai)->data); 69510037SARM gem5 Developers ai++; 69610037SARM gem5 Developers x++; 69710037SARM gem5 Developers } 69810037SARM gem5 Developers 69910037SARM gem5 Developers warn("%d: Queue Assert: SW said there should be %d byte(s) in %s," 70010037SARM gem5 Developers "however there are %d byte(s)\n", 70110037SARM gem5 Developers curTick(), size, q, qBytes[qi-1]); 70210037SARM gem5 Developers DPRINTF(AnnotateQ, "%d: Queue Assert: SW said there should be %d" 70310037SARM gem5 Developers " byte(s) in %s, however there are %d byte(s)\n", 70410037SARM gem5 Developers curTick(), size, q, qBytes[qi-1]); 70510037SARM gem5 Developers } 70610037SARM gem5 Developers} 7077400SAli.Saidi@ARM.com 7087400SAli.Saidi@ARM.comvoid 7097189Sgblack@eecs.umich.eduCPA::swLink(ThreadContext *tc) 71010417Sandreas.hansson@arm.com{ 7117189Sgblack@eecs.umich.edu if (!enabled()) 7128782Sgblack@eecs.umich.edu return; 7138782Sgblack@eecs.umich.edu 7148806Sgblack@eecs.umich.edu char lsm[50]; 7158806Sgblack@eecs.umich.edu Arguments args(tc); 7168806Sgblack@eecs.umich.edu CopyStringOut(tc, lsm, args[0], 50); 7178806Sgblack@eecs.umich.edu System *sys = tc->getSystemPtr(); 7188806Sgblack@eecs.umich.edu StringWrap name(sys->name()); 7198806Sgblack@eecs.umich.edu 7208806Sgblack@eecs.umich.edu int sysi = getSys(sys); 7218806Sgblack@eecs.umich.edu StackId sid = StackId(sysi, getFrame(tc)); 7228806Sgblack@eecs.umich.edu if (!smStack[sid].size()) 7238806Sgblack@eecs.umich.edu return; 7248806Sgblack@eecs.umich.edu int smi = smStack[sid].back(); 7257189Sgblack@eecs.umich.edu int lsmi = getSm(sysi, lsm, args[1]); 7268806Sgblack@eecs.umich.edu 7278806Sgblack@eecs.umich.edu DPRINTF(Annotate, "Linking from %d to state machine %s(%d) [%#x]\n", 7287189Sgblack@eecs.umich.edu smi, lsm, lsmi, args[1]); 7297189Sgblack@eecs.umich.edu 7307189Sgblack@eecs.umich.edu if (lnMap[lsmi]) 73110037SARM gem5 Developers DPRINTF(Annotate, "LnMap already contains entry for %d of %d\n", 73210037SARM gem5 Developers lsmi, lnMap[lsmi]); 73310037SARM gem5 Developers assert(lnMap[lsmi] == 0); 73410037SARM gem5 Developers lnMap[lsmi] = smi; 73510037SARM gem5 Developers 73610037SARM gem5 Developers add(OP_LINK, FL_NONE, tc->contextId(), smi, lsmi); 73710037SARM gem5 Developers 73810037SARM gem5 Developers if (!!args[2]) { 73910037SARM gem5 Developers char sm[50]; 74010037SARM gem5 Developers CopyStringOut(tc, sm, args[2], 50); 74110037SARM gem5 Developers doSwSmEnd(tc->getSystemPtr(), tc->contextId(), sm, getFrame(tc)); 74210037SARM gem5 Developers } 74310037SARM gem5 Developers} 74410037SARM gem5 Developers 74510037SARM gem5 Developersvoid 74610037SARM gem5 DevelopersCPA::swIdentify(ThreadContext *tc) 74710037SARM gem5 Developers{ 74810037SARM gem5 Developers if (!enabled()) 74910037SARM gem5 Developers return; 75010037SARM gem5 Developers 75110037SARM gem5 Developers Arguments args(tc); 75210037SARM gem5 Developers int sysi = getSys(tc->getSystemPtr()); 75310037SARM gem5 Developers StackId sid = StackId(sysi, getFrame(tc)); 75410037SARM gem5 Developers if (!smStack[sid].size()) 75510037SARM gem5 Developers return; 75610037SARM gem5 Developers int smi = smStack[sid].back(); 75710037SARM gem5 Developers 75810037SARM gem5 Developers DPRINTFS(Annotate, tc->getSystemPtr(), "swIdentify: id %#X\n", args[0]); 75910037SARM gem5 Developers 76010037SARM gem5 Developers add(OP_IDENT, FL_NONE, tc->contextId(), smi, 0, args[0]); 76110037SARM gem5 Developers} 76210037SARM gem5 Developers 76310037SARM gem5 Developersuint64_t 76410037SARM gem5 DevelopersCPA::swGetId(ThreadContext *tc) 76510037SARM gem5 Developers{ 76610037SARM gem5 Developers if (!enabled()) 76710037SARM gem5 Developers return 0; 76810037SARM gem5 Developers 76910037SARM gem5 Developers uint64_t id = ++conId; 7707197Sgblack@eecs.umich.edu int sysi = getSys(tc->getSystemPtr()); 77110417Sandreas.hansson@arm.com StackId sid = StackId(sysi, getFrame(tc)); 7727197Sgblack@eecs.umich.edu if (!smStack[sid].size()) 7738782Sgblack@eecs.umich.edu panic("swGetId called without a state machine stack!"); 7748782Sgblack@eecs.umich.edu int smi = smStack[sid].back(); 7758806Sgblack@eecs.umich.edu 7768806Sgblack@eecs.umich.edu DPRINTFS(Annotate, tc->getSystemPtr(), "swGetId: id %#X\n", id); 7777197Sgblack@eecs.umich.edu 7788806Sgblack@eecs.umich.edu add(OP_IDENT, FL_NONE, tc->contextId(), smi, 0, id); 7798806Sgblack@eecs.umich.edu return id; 7808806Sgblack@eecs.umich.edu} 78110037SARM gem5 Developers 78210037SARM gem5 Developers 78310037SARM gem5 Developersvoid 78410037SARM gem5 DevelopersCPA::swSyscallLink(ThreadContext *tc) 78510037SARM gem5 Developers{ 78610037SARM gem5 Developers if (!enabled()) 78711877Sbrandon.potter@amd.com return; 78811877Sbrandon.potter@amd.com 7898806Sgblack@eecs.umich.edu char lsm[50]; 7908806Sgblack@eecs.umich.edu Arguments args(tc); 7918806Sgblack@eecs.umich.edu CopyStringOut(tc, lsm, args[0], 50); 7928806Sgblack@eecs.umich.edu System *sys = tc->getSystemPtr(); 7938806Sgblack@eecs.umich.edu StringWrap name(sys->name()); 7948806Sgblack@eecs.umich.edu int sysi = getSys(sys); 7957197Sgblack@eecs.umich.edu 7967197Sgblack@eecs.umich.edu Id id = Id(lsm, getFrame(tc)); 79710037SARM gem5 Developers StackId sid = StackId(sysi, getFrame(tc)); 79810037SARM gem5 Developers 79910037SARM gem5 Developers if (!smStack[sid].size()) 80010037SARM gem5 Developers return; 80110037SARM gem5 Developers 80210037SARM gem5 Developers int smi = smStack[sid].back(); 80310037SARM gem5 Developers 80410037SARM gem5 Developers DPRINTF(Annotate, "Linking from %d to state machine %s(UNKNOWN)\n", 80510037SARM gem5 Developers smi, lsm); 80610037SARM gem5 Developers 80710037SARM gem5 Developers if (scLinks[sysi-1][id]) 80810037SARM gem5 Developers DPRINTF(Annotate, 80910037SARM gem5 Developers "scLinks already contains entry for system %d %s[%x] of %d\n", 81010037SARM gem5 Developers sysi, lsm, getFrame(tc), scLinks[sysi-1][id]); 81110037SARM gem5 Developers assert(scLinks[sysi-1][id] == 0); 81210037SARM gem5 Developers scLinks[sysi-1][id] = add(OP_LINK, FL_NONE, tc->contextId(), smi, 0xFFFF); 81310037SARM gem5 Developers scLinks[sysi-1][id]->dump = false; 81410037SARM gem5 Developers 81510037SARM gem5 Developers if (!!args[1]) { 81610037SARM gem5 Developers char sm[50]; 81710037SARM gem5 Developers CopyStringOut(tc, sm, args[1], 50); 81810037SARM gem5 Developers doSwSmEnd(tc->getSystemPtr(), tc->contextId(), sm, getFrame(tc)); 81910037SARM gem5 Developers } 82010037SARM gem5 Developers} 82110037SARM gem5 Developers 82210037SARM gem5 DevelopersCPA::AnnDataPtr 82310037SARM gem5 DevelopersCPA::add(int t, int f, int c, int sm, int stq, int32_t d) 82410037SARM gem5 Developers{ 82510037SARM gem5 Developers AnnDataPtr an = std::make_shared<AnnotateData>(); 82610037SARM gem5 Developers an->time = curTick(); 82710037SARM gem5 Developers an->data = d; 82810037SARM gem5 Developers an->orig_data = d; 82910037SARM gem5 Developers an->op = t; 83010037SARM gem5 Developers an->flag = f; 83110037SARM gem5 Developers an->sm = sm; 83210037SARM gem5 Developers an->stq = stq; 83310037SARM gem5 Developers an->cpu = c; 83410037SARM gem5 Developers an->dump = true; 83510037SARM gem5 Developers 83610037SARM gem5 Developers data.push_back(an); 83710037SARM gem5 Developers 83810037SARM gem5 Developers DPRINTF(AnnotateVerbose, "Annotate: op: %d flags: 0x%x sm: %d state: %d time: %d, data: %d\n", 83910037SARM gem5 Developers an->op, an->flag, an->sm, an->stq, an->time, an->data); 84010037SARM gem5 Developers 84110037SARM gem5 Developers // Don't dump Links because we might be setting no-dump on it 84210037SARM gem5 Developers if (an->op != OP_LINK) 84310037SARM gem5 Developers dump(false); 84410037SARM gem5 Developers 84510037SARM gem5 Developers return an; 84610037SARM gem5 Developers} 84710037SARM gem5 Developers 84811576SDylan.Johnson@ARM.comvoid 84911576SDylan.Johnson@ARM.comCPA::dumpKey() 85011576SDylan.Johnson@ARM.com{ 85111576SDylan.Johnson@ARM.com std::streampos curpos = osbin->tellp(); 85211576SDylan.Johnson@ARM.com ah.key_off = curpos; 85311576SDylan.Johnson@ARM.com 85410037SARM gem5 Developers // Output the various state machines and their corresponding states 85510037SARM gem5 Developers *osbin << "# Automatically generated state machine descriptor file" << endl; 85610037SARM gem5 Developers 85710037SARM gem5 Developers *osbin << "sms = {}" << endl << endl; 85810037SARM gem5 Developers vector<string> state_machines; 85910037SARM gem5 Developers state_machines.resize(numSmt+1); 86010037SARM gem5 Developers 86110037SARM gem5 Developers // State machines, id -> states 86210037SARM gem5 Developers SCache::iterator i = smtCache.begin(); 86310037SARM gem5 Developers while (i != smtCache.end()) { 86410037SARM gem5 Developers state_machines[i->second] = i->first; 86510037SARM gem5 Developers i++; 86610037SARM gem5 Developers } 86710037SARM gem5 Developers 86810037SARM gem5 Developers for (int x = 1; x < state_machines.size(); x++) { 86910037SARM gem5 Developers vector<string> states; 87010037SARM gem5 Developers states.resize(numSt[x-1]+1); 87110037SARM gem5 Developers assert(x-1 < stCache.size()); 87210037SARM gem5 Developers SCache::iterator i = stCache[x-1].begin(); 87310037SARM gem5 Developers while (i != stCache[x-1].end()) { 87410037SARM gem5 Developers states[i->second] = i->first; 87510037SARM gem5 Developers i++; 87610037SARM gem5 Developers } 87710037SARM gem5 Developers *osbin << "sms[\"" << state_machines[x] << "\"] = [\"NULL\""; 87810037SARM gem5 Developers for (int y = 1; y < states.size(); y++) 87910037SARM gem5 Developers *osbin << ", \"" << states[y] << "\""; 88010037SARM gem5 Developers *osbin << "]" << endl; 88110037SARM gem5 Developers } 88210037SARM gem5 Developers 88310037SARM gem5 Developers *osbin << endl << endl << endl; 88410037SARM gem5 Developers 88510037SARM gem5 Developers // state machine number -> system, name, id 88610037SARM gem5 Developers *osbin << "smNum = [\"NULL\""; 88710037SARM gem5 Developers for (int x = 0; x < smMap.size(); x++) 88810037SARM gem5 Developers *osbin << ", (" << smMap[x].first << ", \"" << smMap[x].second.first << 88910037SARM gem5 Developers "\", " << smMap[x].second.second << ")"; 89010037SARM gem5 Developers *osbin << "]" << endl; 89110037SARM gem5 Developers 89210037SARM gem5 Developers *osbin << endl << endl << endl; 89310037SARM gem5 Developers 89410037SARM gem5 Developers // Output the systems 89510417Sandreas.hansson@arm.com vector<string> systems; 89610037SARM gem5 Developers systems.resize(numSys+1); 89710037SARM gem5 Developers NameCache::iterator i2 = nameCache.begin(); 89810037SARM gem5 Developers while (i2 != nameCache.end()) { 89910037SARM gem5 Developers systems[i2->second.second] = i2->second.first; 90010037SARM gem5 Developers i2++; 90110037SARM gem5 Developers } 90210037SARM gem5 Developers 90310037SARM gem5 Developers *osbin << "sysNum = [\"NULL\""; 90410037SARM gem5 Developers for (int x = 1; x < systems.size(); x++) { 90510037SARM gem5 Developers *osbin << ", \"" << systems[x] << "\""; 90610037SARM gem5 Developers } 90710037SARM gem5 Developers *osbin << "]" << endl; 90810037SARM gem5 Developers 90910037SARM gem5 Developers // queue number -> system, qname, qid 91010037SARM gem5 Developers *osbin << "queues = [\"NULL\""; 91110037SARM gem5 Developers for (int x = 0; x < qMap.size(); x++) 91210037SARM gem5 Developers *osbin << ", (" << qMap[x].first << ", \"" << qMap[x].second.first << 91310037SARM gem5 Developers "\", " << qMap[x].second.second << ")"; 91410037SARM gem5 Developers *osbin << "]" << endl; 91510037SARM gem5 Developers 91610037SARM gem5 Developers *osbin << "smComb = [s for s in [(i,r) for i in xrange(1,len(sysNum)) " 91710037SARM gem5 Developers << "for r in xrange (1,len(smNum))]]" << endl; 91810037SARM gem5 Developers ah.key_len = osbin->tellp() - curpos; 91910037SARM gem5 Developers 92010037SARM gem5 Developers // output index 92110037SARM gem5 Developers curpos = osbin->tellp(); 9227362Sgblack@eecs.umich.edu ah.idx_off = curpos; 9237362Sgblack@eecs.umich.edu 92410417Sandreas.hansson@arm.com for (int x = 0; x < annotateIdx.size(); x++) 9257362Sgblack@eecs.umich.edu osbin->write((char*)&annotateIdx[x], sizeof(uint64_t)); 92610037SARM gem5 Developers ah.idx_len = osbin->tellp() - curpos; 92710037SARM gem5 Developers 92810037SARM gem5 Developers osbin->seekp(0); 92910037SARM gem5 Developers osbin->write((char*)&ah, sizeof(AnnotateHeader)); 93010037SARM gem5 Developers osbin->flush(); 93110037SARM gem5 Developers 93210037SARM gem5 Developers} 93310037SARM gem5 Developers 93410037SARM gem5 Developersvoid 93510037SARM gem5 DevelopersCPA::dump(bool all) 93610037SARM gem5 Developers{ 93710037SARM gem5 Developers 93810037SARM gem5 Developers list<AnnDataPtr>::iterator i; 93910037SARM gem5 Developers 94010037SARM gem5 Developers i = data.begin(); 94110037SARM gem5 Developers 94210037SARM gem5 Developers if (i == data.end()) 94310037SARM gem5 Developers return; 94410037SARM gem5 Developers 94510037SARM gem5 Developers // Dump the data every 94610037SARM gem5 Developers if (!all && data.size() < 10000) 94710037SARM gem5 Developers return; 94810037SARM gem5 Developers 94911150Smitch.hayenga@arm.com DPRINTF(Annotate, "Writing %d\n", data.size()); 95010037SARM gem5 Developers while (i != data.end()) { 95110037SARM gem5 Developers AnnDataPtr an = *i; 95210037SARM gem5 Developers 95310037SARM gem5 Developers // If we can't dump this record, hold here 95410037SARM gem5 Developers if (!an->dump && !all) 95510037SARM gem5 Developers break; 95610037SARM gem5 Developers 9578205SAli.Saidi@ARM.com ah.num_recs++; 95810037SARM gem5 Developers if (ah.num_recs % 100000 == 0) 95911496Sandreas.sandberg@arm.com annotateIdx.push_back(osbin->tellp()); 96010037SARM gem5 Developers 96110037SARM gem5 Developers 96210037SARM gem5 Developers osbin->write((char*)&(an->time), sizeof(an->time)); 96310037SARM gem5 Developers osbin->write((char*)&(an->orig_data), sizeof(an->orig_data)); 96410037SARM gem5 Developers osbin->write((char*)&(an->sm), sizeof(an->sm)); 96510037SARM gem5 Developers osbin->write((char*)&(an->stq), sizeof(an->stq)); 96610037SARM gem5 Developers osbin->write((char*)&(an->op), sizeof(an->op)); 96710037SARM gem5 Developers osbin->write((char*)&(an->flag), sizeof(an->flag)); 96810037SARM gem5 Developers osbin->write((char*)&(an->cpu), sizeof(an->cpu)); 96910037SARM gem5 Developers i++; 97010037SARM gem5 Developers } 97110037SARM gem5 Developers if (data.begin() != i) 97210037SARM gem5 Developers data.erase(data.begin(), i); 97310037SARM gem5 Developers 97411585SDylan.Johnson@ARM.com if (all) 97511585SDylan.Johnson@ARM.com osbin->flush(); 97611585SDylan.Johnson@ARM.com} 97711585SDylan.Johnson@ARM.com 97811585SDylan.Johnson@ARM.comvoid 97911585SDylan.Johnson@ARM.comCPA::doQ(System *sys, int flags, int cpuid, int sm, 98011585SDylan.Johnson@ARM.com string q, int qi, int count) 98111585SDylan.Johnson@ARM.com{ 98211585SDylan.Johnson@ARM.com qSize[qi-1]++; 98311585SDylan.Johnson@ARM.com qBytes[qi-1] += count; 98411585SDylan.Johnson@ARM.com if (qSize[qi-1] > 2501 || qBytes[qi-1] > 2000000000) 98510037SARM gem5 Developers warn("Queue %s is %d elements/%d bytes, " 98610037SARM gem5 Developers "maybe things aren't being removed?\n", 98710037SARM gem5 Developers q, qSize[qi-1], qBytes[qi-1]); 98810037SARM gem5 Developers if (flags & FL_QOPP) 98910037SARM gem5 Developers qData[qi-1].push_front(add(OP_QUEUE, flags, cpuid, sm, qi, count)); 99010037SARM gem5 Developers else 99110037SARM gem5 Developers qData[qi-1].push_back(add(OP_QUEUE, flags, cpuid, sm, qi, count)); 9927362Sgblack@eecs.umich.edu DPRINTFS(AnnotateQ, sys, "Queing in queue %s size now %d/%d\n", 9938314Sgeoffrey.blake@arm.com q, qSize[qi-1], qBytes[qi-1]); 99410037SARM gem5 Developers assert(qSize[qi-1] >= 0); 99510037SARM gem5 Developers assert(qBytes[qi-1] >= 0); 99610037SARM gem5 Developers} 99710037SARM gem5 Developers 99810037SARM gem5 Developers 99910037SARM gem5 Developersvoid 100010037SARM gem5 DevelopersCPA::doDq(System *sys, int flags, int cpuid, int sm, 100110037SARM gem5 Developers string q, int qi, int count) 100210037SARM gem5 Developers{ 100310037SARM gem5 Developers 100410037SARM gem5 Developers StringWrap name(sys->name()); 100510037SARM gem5 Developers if (count == -1) { 100610037SARM gem5 Developers add(OP_DEQUEUE, flags, cpuid, sm, qi, count); 100710037SARM gem5 Developers qData[qi-1].clear(); 100810037SARM gem5 Developers qSize[qi-1] = 0; 100910037SARM gem5 Developers qBytes[qi-1] = 0; 101010037SARM gem5 Developers DPRINTF(AnnotateQ, "Dequeing all data in queue %s size now %d/%d\n", 101110037SARM gem5 Developers q, qSize[qi-1], qBytes[qi-1]); 101210037SARM gem5 Developers return; 101310037SARM gem5 Developers } 101410037SARM gem5 Developers 101510037SARM gem5 Developers assert(count > 0); 101610037SARM gem5 Developers if (qSize[qi-1] <= 0 || qBytes[qi-1] <= 0 || !qData[qi-1].size()) { 101710037SARM gem5 Developers dump(true); 101810037SARM gem5 Developers dumpKey(); 101910037SARM gem5 Developers fatal("Queue %s dequing with no data available in queue!\n", 102010037SARM gem5 Developers q); 102110037SARM gem5 Developers } 102210037SARM gem5 Developers assert(qSize[qi-1] >= 0); 102310037SARM gem5 Developers assert(qBytes[qi-1] >= 0); 102410037SARM gem5 Developers assert(qData[qi-1].size()); 102510037SARM gem5 Developers 102610037SARM gem5 Developers int32_t need = count; 102710037SARM gem5 Developers qBytes[qi-1] -= count; 102810037SARM gem5 Developers if (qBytes[qi-1] < 0) { 102910037SARM gem5 Developers dump(true); 103010037SARM gem5 Developers dumpKey(); 103110037SARM gem5 Developers fatal("Queue %s dequing with no bytes available in queue!\n", 103210037SARM gem5 Developers q); 103310037SARM gem5 Developers } 103410037SARM gem5 Developers 103510037SARM gem5 Developers while (need > 0) { 103610037SARM gem5 Developers int32_t head_bytes = qData[qi-1].front()->data; 103710037SARM gem5 Developers if (qSize[qi-1] <= 0 || qBytes[qi-1] < 0) { 103810037SARM gem5 Developers dump(true); 103910037SARM gem5 Developers dumpKey(); 104010037SARM gem5 Developers fatal("Queue %s dequing with nothing in queue!\n", 104110037SARM gem5 Developers q); 104210037SARM gem5 Developers } 104310037SARM gem5 Developers 104410037SARM gem5 Developers if (head_bytes > need) { 104510037SARM gem5 Developers qData[qi-1].front()->data -= need; 104610037SARM gem5 Developers need = 0; 104710037SARM gem5 Developers } else if (head_bytes == need) { 104810037SARM gem5 Developers qData[qi-1].pop_front(); 104910037SARM gem5 Developers qSize[qi-1]--; 105010037SARM gem5 Developers need = 0; 105110037SARM gem5 Developers } else { 105210037SARM gem5 Developers qData[qi-1].pop_front(); 105310037SARM gem5 Developers qSize[qi-1]--; 105410037SARM gem5 Developers need -= head_bytes; 105510037SARM gem5 Developers } 105610037SARM gem5 Developers } 105710037SARM gem5 Developers 105810037SARM gem5 Developers add(OP_DEQUEUE, flags, cpuid, sm, qi, count); 105910037SARM gem5 Developers DPRINTF(AnnotateQ, "Dequeing in queue %s size now %d/%d\n", 106010037SARM gem5 Developers q, qSize[qi-1], qBytes[qi-1]); 106110037SARM gem5 Developers} 106210037SARM gem5 Developers 106310037SARM gem5 Developers 106410037SARM gem5 Developers 106510037SARM gem5 Developersvoid 106610037SARM gem5 DevelopersCPA::serialize(CheckpointOut &cp) const 106710037SARM gem5 Developers{ 106810037SARM gem5 Developers 106910037SARM gem5 Developers SERIALIZE_SCALAR(numSm); 107010037SARM gem5 Developers SERIALIZE_SCALAR(numSmt); 107110037SARM gem5 Developers arrayParamOut(os, "numSt", numSt); 107210037SARM gem5 Developers arrayParamOut(os, "numQ", numQ); 107310037SARM gem5 Developers SERIALIZE_SCALAR(numSys); 107410037SARM gem5 Developers SERIALIZE_SCALAR(numQs); 107510037SARM gem5 Developers SERIALIZE_SCALAR(conId); 107610037SARM gem5 Developers arrayParamOut(os, "qSize", qSize); 107710037SARM gem5 Developers arrayParamOut(os, "qSize", qSize); 107810037SARM gem5 Developers arrayParamOut(os, "qBytes", qBytes); 107910037SARM gem5 Developers 108010037SARM gem5 Developers SCache::iterator i; 108110037SARM gem5 Developers int x = 0, y = 0; 108210037SARM gem5 Developers 108310037SARM gem5 Developers // smtCache (SCache) 108410037SARM gem5 Developers x = 0; 108510037SARM gem5 Developers y = 0; 108610037SARM gem5 Developers i = smtCache.begin(); 108710037SARM gem5 Developers while (i != smtCache.end()) { 108810037SARM gem5 Developers paramOut(os, csprintf("smtCache%d.str", x), i->first); 108910037SARM gem5 Developers paramOut(os, csprintf("smtCache%d.int", x), i->second); 109010037SARM gem5 Developers x++; i++; 109110037SARM gem5 Developers } 109210037SARM gem5 Developers 109310037SARM gem5 Developers // stCache (StCache) 109410037SARM gem5 Developers for (x = 0; x < stCache.size(); x++) { 109510037SARM gem5 Developers i = stCache[x].begin(); 109610037SARM gem5 Developers y = 0; 109710037SARM gem5 Developers while (i != stCache[x].end()) { 109810037SARM gem5 Developers paramOut(os, csprintf("stCache%d_%d.str", x, y), i->first); 109910037SARM gem5 Developers paramOut(os, csprintf("stCache%d_%d.int", x, y), i->second); 110010037SARM gem5 Developers y++; i++; 110110037SARM gem5 Developers } 110210037SARM gem5 Developers } 110310037SARM gem5 Developers 110410037SARM gem5 Developers // qCache (IdCache) 110510037SARM gem5 Developers IdHCache::iterator idi; 110610037SARM gem5 Developers for (x = 0; x < qCache.size(); x++) { 110710037SARM gem5 Developers idi = qCache[x].begin(); 110810037SARM gem5 Developers y = 0; 110910037SARM gem5 Developers while (idi != qCache[x].end()) { 111010037SARM gem5 Developers paramOut(os, csprintf("qCache%d_%d.str", x, y), idi->first.first); 111110037SARM gem5 Developers paramOut(os, csprintf("qCache%d_%d.id", x, y), idi->first.second); 111210037SARM gem5 Developers paramOut(os, csprintf("qCache%d_%d.int", x, y), idi->second); 111310037SARM gem5 Developers y++; idi++; 111410037SARM gem5 Developers } 111510037SARM gem5 Developers } 111610037SARM gem5 Developers 111710037SARM gem5 Developers // smCache (IdCache) 111810037SARM gem5 Developers for (x = 0; x < smCache.size(); x++) { 111910037SARM gem5 Developers idi = smCache[x].begin(); 112010037SARM gem5 Developers y = 0; 112110037SARM gem5 Developers paramOut(os, csprintf("smCache%d", x), smCache[x].size()); 112210037SARM gem5 Developers while (idi != smCache[x].end()) { 112310037SARM gem5 Developers paramOut(os, csprintf("smCache%d_%d.str", x, y), idi->first.first); 112410037SARM gem5 Developers paramOut(os, csprintf("smCache%d_%d.id", x, y), idi->first.second); 112510037SARM gem5 Developers paramOut(os, csprintf("smCache%d_%d.int", x, y), idi->second); 112610037SARM gem5 Developers y++; idi++; 112710037SARM gem5 Developers } 112810037SARM gem5 Developers } 112910037SARM gem5 Developers 113010037SARM gem5 Developers // scLinks (ScCache) -- data not serialize 113111581SDylan.Johnson@ARM.com 113210037SARM gem5 Developers 113310037SARM gem5 Developers // namecache (NameCache) 113410037SARM gem5 Developers NameCache::iterator ni; 113510037SARM gem5 Developers 113610037SARM gem5 Developers ni = nameCache.begin(); 113710037SARM gem5 Developers x = 0; 113810037SARM gem5 Developers while (ni != nameCache.end()) { 113910037SARM gem5 Developers paramOut(os, csprintf("nameCache%d.name", x), ni->first->name()); 114010037SARM gem5 Developers paramOut(os, csprintf("nameCache%d.str", x), ni->second.first); 114110367SAndrew.Bardsley@arm.com paramOut(os, csprintf("nameCache%d.int", x), ni->second.second); 114210367SAndrew.Bardsley@arm.com x++; ni++; 114310037SARM gem5 Developers } 114410037SARM gem5 Developers 114510037SARM gem5 Developers // smStack (SmStack) 114610037SARM gem5 Developers SmStack::iterator si; 114710037SARM gem5 Developers si = smStack.begin(); 114810037SARM gem5 Developers x = 0; 114910037SARM gem5 Developers paramOut(os, "smStackIdCount", smStack.size()); 115010037SARM gem5 Developers while (si != smStack.end()) { 115110037SARM gem5 Developers paramOut(os, csprintf("smStackId%d.sys", x), si->first.first); 115210037SARM gem5 Developers paramOut(os, csprintf("smStackId%d.frame", x), si->first.second); 115310037SARM gem5 Developers paramOut(os, csprintf("smStackId%d.count", x), si->second.size()); 115410037SARM gem5 Developers for (y = 0; y < si->second.size(); y++) 115510037SARM gem5 Developers paramOut(os, csprintf("smStackId%d_%d", x, y), si->second[y]); 115610037SARM gem5 Developers x++; si++; 115710037SARM gem5 Developers } 115810037SARM gem5 Developers 115910037SARM gem5 Developers // lnMap (LinkMap) 116010037SARM gem5 Developers x = 0; 116110037SARM gem5 Developers LinkMap::iterator li; 116210037SARM gem5 Developers li = lnMap.begin(); 116310037SARM gem5 Developers paramOut(os, "lnMapSize", lnMap.size()); 116410037SARM gem5 Developers while (li != lnMap.end()) { 116510037SARM gem5 Developers paramOut(os, csprintf("lnMap%d.smi", x), li->first); 116610037SARM gem5 Developers paramOut(os, csprintf("lnMap%d.lsmi", x), li->second); 116710037SARM gem5 Developers x++; li++; 116810037SARM gem5 Developers } 116910037SARM gem5 Developers 117010037SARM gem5 Developers // swExpl (vector) 117110037SARM gem5 Developers SwExpl::iterator swexpli; 117210037SARM gem5 Developers swexpli = swExpl.begin(); 117310037SARM gem5 Developers x = 0; 117410037SARM gem5 Developers paramOut(os, "swExplCount", swExpl.size()); 117510037SARM gem5 Developers while (swexpli != swExpl.end()) { 117610037SARM gem5 Developers paramOut(os, csprintf("swExpl%d.sys", x), swexpli->first.first); 117710037SARM gem5 Developers paramOut(os, csprintf("swExpl%d.frame", x), swexpli->first.second); 117810037SARM gem5 Developers paramOut(os, csprintf("swExpl%d.swexpl", x), swexpli->second); 117910037SARM gem5 Developers x++; swexpli++; 118010037SARM gem5 Developers } 118110037SARM gem5 Developers 118210037SARM gem5 Developers // lastState (IMap) 118310037SARM gem5 Developers x = 0; 118410037SARM gem5 Developers IMap::iterator ii; 118510037SARM gem5 Developers ii = lastState.begin(); 118610037SARM gem5 Developers paramOut(os, "lastStateSize", lastState.size()); 118710037SARM gem5 Developers while (ii != lastState.end()) { 118810037SARM gem5 Developers paramOut(os, csprintf("lastState%d.smi", x), ii->first); 118910037SARM gem5 Developers paramOut(os, csprintf("lastState%d.sti", x), ii->second); 119010037SARM gem5 Developers x++; ii++; 119110037SARM gem5 Developers } 119210037SARM gem5 Developers 119310037SARM gem5 Developers // smMap (IdMap) 119410037SARM gem5 Developers for (x = 0; x < smMap.size(); x++) { 119510037SARM gem5 Developers paramOut(os, csprintf("smMap%d.sys", x), smMap[x].first); 119610037SARM gem5 Developers paramOut(os, csprintf("smMap%d.smname", x), smMap[x].second.first); 119711581SDylan.Johnson@ARM.com paramOut(os, csprintf("smMap%d.id", x), smMap[x].second.second); 119810037SARM gem5 Developers } 119910037SARM gem5 Developers 120010037SARM gem5 Developers // qMap (IdMap) 120110037SARM gem5 Developers for (x = 0; x < qMap.size(); x++) { 120210037SARM gem5 Developers paramOut(os, csprintf("qMap%d.sys", x), qMap[x].first); 120310037SARM gem5 Developers paramOut(os, csprintf("qMap%d.qname", x), qMap[x].second.first); 120410037SARM gem5 Developers paramOut(os, csprintf("qMap%d.id", x), qMap[x].second.second); 120510037SARM gem5 Developers } 120610037SARM gem5 Developers 120710037SARM gem5 Developers // qData (vector<AnnotateList>) 120810037SARM gem5 Developers for(x = 0; x < qData.size(); x++) { 120910037SARM gem5 Developers if (!qData[x].size()) 121010037SARM gem5 Developers continue; 121110037SARM gem5 Developers y = 0; 121210037SARM gem5 Developers for (auto &ann : qData[x]) { 121310037SARM gem5 Developers ann->serializeSection(os, csprintf("Q%d_%d", x, y)); 121410037SARM gem5 Developers y++; 121510037SARM gem5 Developers } 121610037SARM gem5 Developers } 121710037SARM gem5 Developers} 121810037SARM gem5 Developers 121910037SARM gem5 Developersvoid 122010037SARM gem5 DevelopersCPA::unserialize(CheckpointIn &cp) 122110037SARM gem5 Developers{ 122210037SARM gem5 Developers UNSERIALIZE_SCALAR(numSm); 122310037SARM gem5 Developers UNSERIALIZE_SCALAR(numSmt); 122410037SARM gem5 Developers UNSERIALIZE_CONTAINER(numSt); 122510037SARM gem5 Developers UNSERIALIZE_CONTAINER(numQ); 122610037SARM gem5 Developers UNSERIALIZE_SCALAR(numSys); 122710037SARM gem5 Developers UNSERIALIZE_SCALAR(numQs); 122810037SARM gem5 Developers UNSERIALIZE_SCALAR(conId); 122910037SARM gem5 Developers UNSERIALIZE_CONTAINER(qSize); 123010037SARM gem5 Developers UNSERIALIZE_CONTAINER(qBytes); 123110037SARM gem5 Developers 123210037SARM gem5 Developers 123310037SARM gem5 Developers // smtCache (SCache 123410037SARM gem5 Developers string str; 123510037SARM gem5 Developers int smi; 123610037SARM gem5 Developers for (int x = 0; x < numSmt; x++) { 123710037SARM gem5 Developers paramIn(cp, csprintf("smtCache%d.str", x), str); 123810037SARM gem5 Developers paramIn(cp, csprintf("smtCache%d.int", x), smi); 123910037SARM gem5 Developers smtCache[str] = smi; 124010037SARM gem5 Developers } 124110037SARM gem5 Developers 124210037SARM gem5 Developers // stCache (StCache) 124310037SARM gem5 Developers stCache.resize(numSmt); 124410037SARM gem5 Developers for (int x = 0; x < numSmt; x++) { 124510037SARM gem5 Developers for (int y = 0; y < numSt[x]; y++) { 124610037SARM gem5 Developers paramIn(cp, csprintf("stCache%d_%d.str", x,y), str); 124710037SARM gem5 Developers paramIn(cp, csprintf("stCache%d_%d.int", x,y), smi); 124810037SARM gem5 Developers stCache[x][str] = smi; 124910037SARM gem5 Developers } 125010037SARM gem5 Developers } 125110037SARM gem5 Developers 125210037SARM gem5 Developers // qCache (IdCache) 125310037SARM gem5 Developers uint64_t id; 125410037SARM gem5 Developers qCache.resize(numSys); 125510037SARM gem5 Developers for (int x = 0; x < numSys; x++) { 125610037SARM gem5 Developers for (int y = 0; y < numQ[x]; y++) { 125710037SARM gem5 Developers paramIn(cp, csprintf("qCache%d_%d.str", x,y), str); 125810417Sandreas.hansson@arm.com paramIn(cp, csprintf("qCache%d_%d.id", x,y), id); 125910037SARM gem5 Developers paramIn(cp, csprintf("qCache%d_%d.int", x,y), smi); 126010037SARM gem5 Developers qCache[x][Id(str,id)] = smi; 126110037SARM gem5 Developers } 126210037SARM gem5 Developers } 126310037SARM gem5 Developers 126410037SARM gem5 Developers // smCache (IdCache) 126510037SARM gem5 Developers smCache.resize(numSys); 126610037SARM gem5 Developers for (int x = 0; x < numSys; x++) { 126710037SARM gem5 Developers int size; 126810037SARM gem5 Developers paramIn(cp, csprintf("smCache%d", x), size); 126910037SARM gem5 Developers for (int y = 0; y < size; y++) { 127010037SARM gem5 Developers paramIn(cp, csprintf("smCache%d_%d.str", x,y), str); 127110037SARM gem5 Developers paramIn(cp, csprintf("smCache%d_%d.id", x,y), id); 127210037SARM gem5 Developers paramIn(cp, csprintf("smCache%d_%d.int", x,y), smi); 127310037SARM gem5 Developers smCache[x][Id(str,id)] = smi; 127410037SARM gem5 Developers } 127510037SARM gem5 Developers } 127610037SARM gem5 Developers 127710037SARM gem5 Developers // scLinks (ScCache) -- data not serialized, just creating one per sys 127810037SARM gem5 Developers for (int x = 0; x < numSys; x++) 127910037SARM gem5 Developers scLinks.push_back(ScHCache()); 128010037SARM gem5 Developers 128110037SARM gem5 Developers // nameCache (NameCache) 128210037SARM gem5 Developers for (int x = 0; x < numSys; x++) { 128310037SARM gem5 Developers System *sys; 128410037SARM gem5 Developers SimObject *sptr; 128510037SARM gem5 Developers string str; 128610037SARM gem5 Developers int sysi; 128711581SDylan.Johnson@ARM.com 128810037SARM gem5 Developers objParamIn(cp, csprintf("nameCache%d.name", x), sptr); 128910037SARM gem5 Developers sys = dynamic_cast<System*>(sptr); 129010037SARM gem5 Developers 129110037SARM gem5 Developers paramIn(cp, csprintf("nameCache%d.str", x), str); 129210037SARM gem5 Developers paramIn(cp, csprintf("nameCache%d.int", x), sysi); 129310037SARM gem5 Developers nameCache[sys] = std::make_pair(str, sysi); 129410037SARM gem5 Developers } 129510037SARM gem5 Developers 129610037SARM gem5 Developers //smStack (SmStack) 129710037SARM gem5 Developers int smStack_size; 129810037SARM gem5 Developers paramIn(cp, "smStackIdCount", smStack_size); 129910037SARM gem5 Developers for (int x = 0; x < smStack_size; x++) { 130010037SARM gem5 Developers int sysi; 130110037SARM gem5 Developers uint64_t frame; 130210037SARM gem5 Developers int count; 130310037SARM gem5 Developers paramIn(cp, csprintf("smStackId%d.sys", x), sysi); 130410037SARM gem5 Developers paramIn(cp, csprintf("smStackId%d.frame", x), frame); 130510037SARM gem5 Developers paramIn(cp, csprintf("smStackId%d.count", x), count); 130610037SARM gem5 Developers StackId sid = StackId(sysi, frame); 130710037SARM gem5 Developers for (int y = 0; y < count; y++) { 130810037SARM gem5 Developers paramIn(cp, csprintf("smStackId%d_%d", x, y), smi); 130910037SARM gem5 Developers smStack[sid].push_back(smi); 131010037SARM gem5 Developers } 131110037SARM gem5 Developers } 131210037SARM gem5 Developers 131310037SARM gem5 Developers // lnMap (LinkMap) 131410037SARM gem5 Developers int lsmi; 131510037SARM gem5 Developers int lnMap_size; 131610037SARM gem5 Developers paramIn(cp, "lnMapSize", lnMap_size); 131710037SARM gem5 Developers for (int x = 0; x < lnMap_size; x++) { 131810037SARM gem5 Developers paramIn(cp, csprintf("lnMap%d.smi", x), smi); 131910037SARM gem5 Developers paramIn(cp, csprintf("lnMap%d.lsmi", x), lsmi); 132010037SARM gem5 Developers lnMap[smi] = lsmi; 132110037SARM gem5 Developers } 132210037SARM gem5 Developers 132310037SARM gem5 Developers // swExpl (vector) 132410037SARM gem5 Developers int swExpl_size; 132510037SARM gem5 Developers paramIn(cp, "swExplCount", swExpl_size); 132611581SDylan.Johnson@ARM.com for (int x = 0; x < swExpl_size; x++) { 132710037SARM gem5 Developers int sysi; 132810037SARM gem5 Developers uint64_t frame; 132910037SARM gem5 Developers bool b; 133010037SARM gem5 Developers paramIn(cp, csprintf("swExpl%d.sys", x), sysi); 133110037SARM gem5 Developers paramIn(cp, csprintf("swExpl%d.frame", x), frame); 133210037SARM gem5 Developers paramIn(cp, csprintf("swExpl%d.swexpl", x), b); 133310037SARM gem5 Developers StackId sid = StackId(sysi, frame); 133410037SARM gem5 Developers swExpl[sid] = b; 133510037SARM gem5 Developers } 133610037SARM gem5 Developers 133710037SARM gem5 Developers // lastState (IMap) 133810037SARM gem5 Developers int sti; 133910037SARM gem5 Developers int lastState_size; 134010037SARM gem5 Developers paramIn(cp, "lastStateSize", lastState_size); 134110037SARM gem5 Developers for (int x = 0; x < lastState_size; x++) { 134210037SARM gem5 Developers paramIn(cp, csprintf("lastState%d.smi", x), smi); 134310037SARM gem5 Developers paramIn(cp, csprintf("lastState%d.sti", x), sti); 134410037SARM gem5 Developers lastState[smi] = sti; 134510037SARM gem5 Developers } 134610037SARM gem5 Developers 134710037SARM gem5 Developers 134810037SARM gem5 Developers //smMap (IdMap) 134910037SARM gem5 Developers smMap.resize(numSm); 135010037SARM gem5 Developers for (int x = 0; x < smMap.size(); x++) { 135110037SARM gem5 Developers paramIn(cp, csprintf("smMap%d.sys", x), smMap[x].first); 135210037SARM gem5 Developers paramIn(cp, csprintf("smMap%d.smname", x), smMap[x].second.first); 135310037SARM gem5 Developers paramIn(cp, csprintf("smMap%d.id", x), smMap[x].second.second); 135410037SARM gem5 Developers } 135510037SARM gem5 Developers 135610037SARM gem5 Developers //qMap (IdMap) 135710417Sandreas.hansson@arm.com qMap.resize(numQs); 135810037SARM gem5 Developers for (int x = 0; x < qMap.size(); x++) { 135910037SARM gem5 Developers paramIn(cp, csprintf("qMap%d.sys", x), qMap[x].first); 136010037SARM gem5 Developers paramIn(cp, csprintf("qMap%d.qname", x), qMap[x].second.first); 136110037SARM gem5 Developers paramIn(cp, csprintf("qMap%d.id", x), qMap[x].second.second); 136210037SARM gem5 Developers } 136310037SARM gem5 Developers 136410037SARM gem5 Developers 136510037SARM gem5 Developers // qData (vector<AnnotateList>) 136610037SARM gem5 Developers qData.resize(qSize.size()); 136710037SARM gem5 Developers for (int x = 0; x < qSize.size(); x++) { 136810037SARM gem5 Developers if (!qSize[x]) 136910037SARM gem5 Developers continue; 137010037SARM gem5 Developers for (int y = 0; y < qSize[x]; y++) { 137110037SARM gem5 Developers AnnDataPtr a = std::make_shared<AnnotateData>(); 137210417Sandreas.hansson@arm.com a->unserializeSection(cp, csprintf("Q%d_%d", x, y)); 137310037SARM gem5 Developers data.push_back(a); 137411150Smitch.hayenga@arm.com qData[x].push_back(a); 137510037SARM gem5 Developers } 137610037SARM gem5 Developers } 137710037SARM gem5 Developers} 137810037SARM gem5 Developers 137910037SARM gem5 Developersvoid 138010037SARM gem5 DevelopersCPA::AnnotateData::serialize(CheckpointOut &cp) const 138110037SARM gem5 Developers{ 138210037SARM gem5 Developers SERIALIZE_SCALAR(time); 138310037SARM gem5 Developers SERIALIZE_SCALAR(data); 138410037SARM gem5 Developers SERIALIZE_SCALAR(sm); 138510037SARM gem5 Developers SERIALIZE_SCALAR(stq); 138610037SARM gem5 Developers SERIALIZE_SCALAR(op); 138710037SARM gem5 Developers SERIALIZE_SCALAR(flag); 138810037SARM gem5 Developers SERIALIZE_SCALAR(cpu); 138910037SARM gem5 Developers} 139010037SARM gem5 Developers 139110037SARM gem5 Developersvoid 139210037SARM gem5 DevelopersCPA::AnnotateData::unserialize(CheckpointIn &cp) 139310037SARM gem5 Developers{ 139410037SARM gem5 Developers UNSERIALIZE_SCALAR(time); 139510037SARM gem5 Developers UNSERIALIZE_SCALAR(data); 139611581SDylan.Johnson@ARM.com orig_data = data; 139711581SDylan.Johnson@ARM.com UNSERIALIZE_SCALAR(sm); 139810037SARM gem5 Developers UNSERIALIZE_SCALAR(stq); 13997362Sgblack@eecs.umich.edu UNSERIALIZE_SCALAR(op); 14007362Sgblack@eecs.umich.edu UNSERIALIZE_SCALAR(flag); 140112299Sandreas.sandberg@arm.com UNSERIALIZE_SCALAR(cpu); 140212299Sandreas.sandberg@arm.com dump = true; 140312299Sandreas.sandberg@arm.com} 140412299Sandreas.sandberg@arm.com 140512299Sandreas.sandberg@arm.comCPA* 140612299Sandreas.sandberg@arm.comCPAParams::create() 140712299Sandreas.sandberg@arm.com{ 140812299Sandreas.sandberg@arm.com return new CPA(this); 140912299Sandreas.sandberg@arm.com} 141012299Sandreas.sandberg@arm.com 141112299Sandreas.sandberg@arm.com