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