pseudo_inst.cc revision 1973
111507SCurtis.Dunham@arm.com/*
211507SCurtis.Dunham@arm.com * Copyright (c) 2003-2005 The Regents of The University of Michigan
311860Sandreas.hansson@arm.com * All rights reserved.
411860Sandreas.hansson@arm.com *
511860Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without
611507SCurtis.Dunham@arm.com * modification, are permitted provided that the following conditions are
711860Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright
811860Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer;
911860Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright
1011860Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the
1111860Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution;
1211507SCurtis.Dunham@arm.com * neither the name of the copyright holders nor the names of its
1311507SCurtis.Dunham@arm.com * contributors may be used to endorse or promote products derived from
1411507SCurtis.Dunham@arm.com * this software without specific prior written permission.
1511507SCurtis.Dunham@arm.com *
1611860Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1711606Sandreas.sandberg@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1811860Sandreas.hansson@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1911860Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2011606Sandreas.sandberg@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2111606Sandreas.sandberg@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2211860Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2311860Sandreas.hansson@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2411606Sandreas.sandberg@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2511860Sandreas.hansson@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2611860Sandreas.hansson@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2711860Sandreas.hansson@arm.com */
2811860Sandreas.hansson@arm.com
2911860Sandreas.hansson@arm.com#include <errno.h>
3011860Sandreas.hansson@arm.com#include <fcntl.h>
3111860Sandreas.hansson@arm.com#include <unistd.h>
3211860Sandreas.hansson@arm.com#include <cstdio>
3311860Sandreas.hansson@arm.com
3411860Sandreas.hansson@arm.com#include <string>
3511860Sandreas.hansson@arm.com
3611860Sandreas.hansson@arm.com#include "arch/alpha/pseudo_inst.hh"
3711860Sandreas.hansson@arm.com#include "arch/alpha/vtophys.hh"
3811860Sandreas.hansson@arm.com#include "cpu/base.hh"
3911860Sandreas.hansson@arm.com#include "cpu/sampler/sampler.hh"
4011860Sandreas.hansson@arm.com#include "cpu/exec_context.hh"
4111860Sandreas.hansson@arm.com#include "kern/kernel_stats.hh"
4211860Sandreas.hansson@arm.com#include "sim/param.hh"
4311860Sandreas.hansson@arm.com#include "sim/serialize.hh"
4411860Sandreas.hansson@arm.com#include "sim/sim_exit.hh"
4511860Sandreas.hansson@arm.com#include "sim/stat_control.hh"
4611860Sandreas.hansson@arm.com#include "sim/stats.hh"
4711860Sandreas.hansson@arm.com#include "sim/system.hh"
4811860Sandreas.hansson@arm.com#include "sim/debug.hh"
4911860Sandreas.hansson@arm.com#include "targetarch/vptr.hh"
5011507SCurtis.Dunham@arm.com
5111507SCurtis.Dunham@arm.comusing namespace std;
5211860Sandreas.hansson@arm.com
5311860Sandreas.hansson@arm.comextern Sampler *SampCPU;
5411860Sandreas.hansson@arm.com
5511860Sandreas.hansson@arm.comusing namespace Stats;
5611860Sandreas.hansson@arm.com
5711860Sandreas.hansson@arm.comnamespace AlphaPseudo
5811860Sandreas.hansson@arm.com{
5911680SCurtis.Dunham@arm.com    bool doStatisticsInsts;
6011860Sandreas.hansson@arm.com    bool doCheckpointInsts;
6111860Sandreas.hansson@arm.com    bool doQuiesce;
6211860Sandreas.hansson@arm.com
6311680SCurtis.Dunham@arm.com    void
6411860Sandreas.hansson@arm.com    arm(ExecContext *xc)
6511860Sandreas.hansson@arm.com    {
6611860Sandreas.hansson@arm.com        xc->kernelStats->arm();
6711860Sandreas.hansson@arm.com    }
6811860Sandreas.hansson@arm.com
6911860Sandreas.hansson@arm.com    void
7011860Sandreas.hansson@arm.com    quiesce(ExecContext *xc)
7111860Sandreas.hansson@arm.com    {
7211860Sandreas.hansson@arm.com        if (!doQuiesce)
7311860Sandreas.hansson@arm.com            return;
7411860Sandreas.hansson@arm.com
7511860Sandreas.hansson@arm.com        xc->suspend();
7611860Sandreas.hansson@arm.com        xc->kernelStats->quiesce();
7711860Sandreas.hansson@arm.com    }
7811860Sandreas.hansson@arm.com
7911860Sandreas.hansson@arm.com    void
8011860Sandreas.hansson@arm.com    ivlb(ExecContext *xc)
8111860Sandreas.hansson@arm.com    {
8211860Sandreas.hansson@arm.com        xc->kernelStats->ivlb();
8311606Sandreas.sandberg@arm.com    }
8411507SCurtis.Dunham@arm.com
8511507SCurtis.Dunham@arm.com    void
8611860Sandreas.hansson@arm.com    ivle(ExecContext *xc)
8711507SCurtis.Dunham@arm.com    {
8811507SCurtis.Dunham@arm.com    }
8911507SCurtis.Dunham@arm.com
9011507SCurtis.Dunham@arm.com    void
9111507SCurtis.Dunham@arm.com    m5exit_old(ExecContext *xc)
9211507SCurtis.Dunham@arm.com    {
9311860Sandreas.hansson@arm.com        SimExit(curTick, "m5_exit_old instruction encountered");
9411507SCurtis.Dunham@arm.com    }
9511507SCurtis.Dunham@arm.com
9611507SCurtis.Dunham@arm.com    void
9711507SCurtis.Dunham@arm.com    m5exit(ExecContext *xc)
9811507SCurtis.Dunham@arm.com    {
9911507SCurtis.Dunham@arm.com        Tick delay = xc->regs.intRegFile[16];
10011860Sandreas.hansson@arm.com        Tick when = curTick + delay * Clock::Int::ns;
10111860Sandreas.hansson@arm.com        SimExit(when, "m5_exit instruction encountered");
10211860Sandreas.hansson@arm.com    }
10311570SCurtis.Dunham@arm.com
10411507SCurtis.Dunham@arm.com    void
10511507SCurtis.Dunham@arm.com    resetstats(ExecContext *xc)
10611507SCurtis.Dunham@arm.com    {
10711507SCurtis.Dunham@arm.com        if (!doStatisticsInsts)
10811507SCurtis.Dunham@arm.com            return;
10911507SCurtis.Dunham@arm.com
11011507SCurtis.Dunham@arm.com        Tick delay = xc->regs.intRegFile[16];
11111507SCurtis.Dunham@arm.com        Tick period = xc->regs.intRegFile[17];
11211507SCurtis.Dunham@arm.com
11311507SCurtis.Dunham@arm.com        Tick when = curTick + delay * Clock::Int::ns;
11411507SCurtis.Dunham@arm.com        Tick repeat = period * Clock::Int::ns;
11511507SCurtis.Dunham@arm.com
11611507SCurtis.Dunham@arm.com        using namespace Stats;
11711507SCurtis.Dunham@arm.com        SetupEvent(Reset, when, repeat);
11811507SCurtis.Dunham@arm.com    }
11911507SCurtis.Dunham@arm.com
12011507SCurtis.Dunham@arm.com    void
12111507SCurtis.Dunham@arm.com    dumpstats(ExecContext *xc)
12211507SCurtis.Dunham@arm.com    {
12311507SCurtis.Dunham@arm.com        if (!doStatisticsInsts)
12411507SCurtis.Dunham@arm.com            return;
12511507SCurtis.Dunham@arm.com
12611507SCurtis.Dunham@arm.com        Tick delay = xc->regs.intRegFile[16];
12711507SCurtis.Dunham@arm.com        Tick period = xc->regs.intRegFile[17];
12811507SCurtis.Dunham@arm.com
12911507SCurtis.Dunham@arm.com        Tick when = curTick + delay * Clock::Int::ns;
13011507SCurtis.Dunham@arm.com        Tick repeat = period * Clock::Int::ns;
13111507SCurtis.Dunham@arm.com
13211507SCurtis.Dunham@arm.com        using namespace Stats;
13311507SCurtis.Dunham@arm.com        SetupEvent(Dump, when, repeat);
13411507SCurtis.Dunham@arm.com    }
13511507SCurtis.Dunham@arm.com
13611507SCurtis.Dunham@arm.com    void
13711507SCurtis.Dunham@arm.com    addsymbol(ExecContext *xc)
13811507SCurtis.Dunham@arm.com    {
13911507SCurtis.Dunham@arm.com        Addr addr = xc->regs.intRegFile[16];
14011507SCurtis.Dunham@arm.com        char symb[100];
14111507SCurtis.Dunham@arm.com        CopyString(xc, symb, xc->regs.intRegFile[17], 100);
14211507SCurtis.Dunham@arm.com        std::string symbol(symb);
14311507SCurtis.Dunham@arm.com
14411507SCurtis.Dunham@arm.com        DPRINTF(Loader, "Loaded symbol: %s @ %#llx\n", symbol, addr);
14511507SCurtis.Dunham@arm.com
14611507SCurtis.Dunham@arm.com        xc->system->kernelSymtab->insert(addr,symbol);
14711507SCurtis.Dunham@arm.com    }
14811860Sandreas.hansson@arm.com
14911860Sandreas.hansson@arm.com    void
15011860Sandreas.hansson@arm.com    dumpresetstats(ExecContext *xc)
15111860Sandreas.hansson@arm.com    {
15211860Sandreas.hansson@arm.com        if (!doStatisticsInsts)
15311860Sandreas.hansson@arm.com            return;
15411860Sandreas.hansson@arm.com
15511860Sandreas.hansson@arm.com        Tick delay = xc->regs.intRegFile[16];
15611754Sandreas.hansson@arm.com        Tick period = xc->regs.intRegFile[17];
15711860Sandreas.hansson@arm.com
15811860Sandreas.hansson@arm.com        Tick when = curTick + delay * Clock::Int::ns;
15911860Sandreas.hansson@arm.com        Tick repeat = period * Clock::Int::ns;
16011860Sandreas.hansson@arm.com
16111860Sandreas.hansson@arm.com        using namespace Stats;
16211860Sandreas.hansson@arm.com        SetupEvent(Dump|Reset, when, repeat);
16311860Sandreas.hansson@arm.com    }
16411860Sandreas.hansson@arm.com
16511860Sandreas.hansson@arm.com    void
16611860Sandreas.hansson@arm.com    m5checkpoint(ExecContext *xc)
16711860Sandreas.hansson@arm.com    {
16811606Sandreas.sandberg@arm.com        if (!doCheckpointInsts)
16911570SCurtis.Dunham@arm.com            return;
17011570SCurtis.Dunham@arm.com
17111570SCurtis.Dunham@arm.com        Tick delay = xc->regs.intRegFile[16];
17211507SCurtis.Dunham@arm.com        Tick period = xc->regs.intRegFile[17];
17311507SCurtis.Dunham@arm.com
17411507SCurtis.Dunham@arm.com        Tick when = curTick + delay * Clock::Int::ns;
17511507SCurtis.Dunham@arm.com        Tick repeat = period * Clock::Int::ns;
17611507SCurtis.Dunham@arm.com
17711507SCurtis.Dunham@arm.com        Checkpoint::setup(when, repeat);
17811507SCurtis.Dunham@arm.com    }
17911507SCurtis.Dunham@arm.com
18011507SCurtis.Dunham@arm.com    void
18111507SCurtis.Dunham@arm.com    readfile(ExecContext *xc)
18211507SCurtis.Dunham@arm.com    {
18311507SCurtis.Dunham@arm.com        const string &file = xc->cpu->system->params->readfile;
18411507SCurtis.Dunham@arm.com        if (file.empty()) {
18511507SCurtis.Dunham@arm.com            xc->regs.intRegFile[0] = ULL(0);
18611507SCurtis.Dunham@arm.com            return;
18711507SCurtis.Dunham@arm.com        }
18811507SCurtis.Dunham@arm.com
18911507SCurtis.Dunham@arm.com        Addr vaddr = xc->regs.intRegFile[16];
19011507SCurtis.Dunham@arm.com        uint64_t len = xc->regs.intRegFile[17];
19111507SCurtis.Dunham@arm.com        uint64_t offset = xc->regs.intRegFile[18];
19211507SCurtis.Dunham@arm.com        uint64_t result = 0;
19311507SCurtis.Dunham@arm.com
19411507SCurtis.Dunham@arm.com        int fd = ::open(file.c_str(), O_RDONLY, 0);
19511507SCurtis.Dunham@arm.com        if (fd < 0)
19611507SCurtis.Dunham@arm.com            panic("could not open file %s\n", file);
19711860Sandreas.hansson@arm.com
19811860Sandreas.hansson@arm.com        if (::lseek(fd, offset, SEEK_SET) < 0)
19911860Sandreas.hansson@arm.com            panic("could not seek: %s", strerror(errno));
20011860Sandreas.hansson@arm.com
20111860Sandreas.hansson@arm.com        char *buf = new char[len];
20211860Sandreas.hansson@arm.com        char *p = buf;
20311860Sandreas.hansson@arm.com        while (len > 0) {
20411860Sandreas.hansson@arm.com            int bytes = ::read(fd, p, len);
20511754Sandreas.hansson@arm.com            if (bytes <= 0)
20611860Sandreas.hansson@arm.com                break;
20711860Sandreas.hansson@arm.com
20811860Sandreas.hansson@arm.com            p += bytes;
20911860Sandreas.hansson@arm.com            result += bytes;
21011860Sandreas.hansson@arm.com            len -= bytes;
21111860Sandreas.hansson@arm.com        }
21211860Sandreas.hansson@arm.com
21311860Sandreas.hansson@arm.com        close(fd);
21411860Sandreas.hansson@arm.com        CopyIn(xc, vaddr, buf, result);
21511860Sandreas.hansson@arm.com        delete [] buf;
21611680SCurtis.Dunham@arm.com        xc->regs.intRegFile[0] = result;
21711606Sandreas.sandberg@arm.com    }
21811860Sandreas.hansson@arm.com
21911860Sandreas.hansson@arm.com    class Context : public ParamContext
22011680SCurtis.Dunham@arm.com    {
22111680SCurtis.Dunham@arm.com      public:
22211860Sandreas.hansson@arm.com        Context(const string &section) : ParamContext(section) {}
22311507SCurtis.Dunham@arm.com        void checkParams();
22411680SCurtis.Dunham@arm.com    };
22511860Sandreas.hansson@arm.com
22611860Sandreas.hansson@arm.com    Context context("pseudo_inst");
22711860Sandreas.hansson@arm.com
22811860Sandreas.hansson@arm.com    Param<bool> __quiesce(&context, "quiesce",
22911860Sandreas.hansson@arm.com                          "enable quiesce instructions",
23011860Sandreas.hansson@arm.com                          true);
23111860Sandreas.hansson@arm.com    Param<bool> __statistics(&context, "statistics",
23211860Sandreas.hansson@arm.com                             "enable statistics pseudo instructions",
23311860Sandreas.hansson@arm.com                             true);
23411860Sandreas.hansson@arm.com    Param<bool> __checkpoint(&context, "checkpoint",
23511860Sandreas.hansson@arm.com                             "enable checkpoint pseudo instructions",
23611860Sandreas.hansson@arm.com                             true);
23711860Sandreas.hansson@arm.com
23811860Sandreas.hansson@arm.com    void
23911860Sandreas.hansson@arm.com    Context::checkParams()
24011860Sandreas.hansson@arm.com    {
24111507SCurtis.Dunham@arm.com        doQuiesce = __quiesce;
24211860Sandreas.hansson@arm.com        doStatisticsInsts = __statistics;
24311860Sandreas.hansson@arm.com        doCheckpointInsts = __checkpoint;
24411860Sandreas.hansson@arm.com    }
24511860Sandreas.hansson@arm.com
24611860Sandreas.hansson@arm.com    void debugbreak(ExecContext *xc)
24711507SCurtis.Dunham@arm.com    {
24811680SCurtis.Dunham@arm.com        debug_break();
24911680SCurtis.Dunham@arm.com    }
25011680SCurtis.Dunham@arm.com
25111507SCurtis.Dunham@arm.com    void switchcpu(ExecContext *xc)
25211860Sandreas.hansson@arm.com    {
25311860Sandreas.hansson@arm.com        if (SampCPU)
25411860Sandreas.hansson@arm.com            SampCPU->switchCPUs();
25511860Sandreas.hansson@arm.com    }
25611860Sandreas.hansson@arm.com}
25711860Sandreas.hansson@arm.com