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