isa.cc revision 11963
111723Sar4jc@virginia.edu/*
211723Sar4jc@virginia.edu * Copyright (c) 2016 RISC-V Foundation
311723Sar4jc@virginia.edu * Copyright (c) 2016 The University of Virginia
411723Sar4jc@virginia.edu * All rights reserved.
511723Sar4jc@virginia.edu *
611723Sar4jc@virginia.edu * Redistribution and use in source and binary forms, with or without
711723Sar4jc@virginia.edu * modification, are permitted provided that the following conditions are
811723Sar4jc@virginia.edu * met: redistributions of source code must retain the above copyright
911723Sar4jc@virginia.edu * notice, this list of conditions and the following disclaimer;
1011723Sar4jc@virginia.edu * redistributions in binary form must reproduce the above copyright
1111723Sar4jc@virginia.edu * notice, this list of conditions and the following disclaimer in the
1211723Sar4jc@virginia.edu * documentation and/or other materials provided with the distribution;
1311723Sar4jc@virginia.edu * neither the name of the copyright holders nor the names of its
1411723Sar4jc@virginia.edu * contributors may be used to endorse or promote products derived from
1511723Sar4jc@virginia.edu * this software without specific prior written permission.
1611723Sar4jc@virginia.edu *
1711723Sar4jc@virginia.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1811723Sar4jc@virginia.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1911723Sar4jc@virginia.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2011723Sar4jc@virginia.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2111723Sar4jc@virginia.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2211723Sar4jc@virginia.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2311723Sar4jc@virginia.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2411723Sar4jc@virginia.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2511723Sar4jc@virginia.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2611723Sar4jc@virginia.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2711723Sar4jc@virginia.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2811723Sar4jc@virginia.edu *
2911723Sar4jc@virginia.edu * Authors: Alec Roelke
3011723Sar4jc@virginia.edu */
3111723Sar4jc@virginia.edu#include "arch/riscv/isa.hh"
3211723Sar4jc@virginia.edu
3311723Sar4jc@virginia.edu#include <ctime>
3411723Sar4jc@virginia.edu#include <set>
3511963Sar4jc@virginia.edu#include <sstream>
3611723Sar4jc@virginia.edu
3711723Sar4jc@virginia.edu#include "arch/riscv/registers.hh"
3811723Sar4jc@virginia.edu#include "base/bitfield.hh"
3911723Sar4jc@virginia.edu#include "cpu/base.hh"
4011723Sar4jc@virginia.edu#include "debug/RiscvMisc.hh"
4111723Sar4jc@virginia.edu#include "params/RiscvISA.hh"
4211723Sar4jc@virginia.edu#include "sim/core.hh"
4311723Sar4jc@virginia.edu#include "sim/pseudo_inst.hh"
4411723Sar4jc@virginia.edu
4511723Sar4jc@virginia.edunamespace RiscvISA
4611723Sar4jc@virginia.edu{
4711723Sar4jc@virginia.edu
4811723Sar4jc@virginia.eduISA::ISA(Params *p) : SimObject(p)
4911723Sar4jc@virginia.edu{
5011963Sar4jc@virginia.edu    miscRegNames = {
5111963Sar4jc@virginia.edu        {MISCREG_USTATUS, "ustatus"},
5211963Sar4jc@virginia.edu        {MISCREG_UIE, "uie"},
5311963Sar4jc@virginia.edu        {MISCREG_UTVEC, "utvec"},
5411963Sar4jc@virginia.edu        {MISCREG_USCRATCH, "uscratch"},
5511963Sar4jc@virginia.edu        {MISCREG_UEPC, "uepc"},
5611963Sar4jc@virginia.edu        {MISCREG_UCAUSE, "ucause"},
5711963Sar4jc@virginia.edu        {MISCREG_UBADADDR, "ubadaddr"},
5811963Sar4jc@virginia.edu        {MISCREG_UIP, "uip"},
5911963Sar4jc@virginia.edu        {MISCREG_FFLAGS, "fflags"},
6011963Sar4jc@virginia.edu        {MISCREG_FRM, "frm"},
6111963Sar4jc@virginia.edu        {MISCREG_FCSR, "fcsr"},
6211963Sar4jc@virginia.edu        {MISCREG_CYCLE, "cycle"},
6311963Sar4jc@virginia.edu        {MISCREG_TIME, "time"},
6411963Sar4jc@virginia.edu        {MISCREG_INSTRET, "instret"},
6511963Sar4jc@virginia.edu        {MISCREG_CYCLEH, "cycleh"},
6611963Sar4jc@virginia.edu        {MISCREG_TIMEH, "timeh"},
6711963Sar4jc@virginia.edu        {MISCREG_INSTRETH, "instreth"},
6811963Sar4jc@virginia.edu
6911963Sar4jc@virginia.edu        {MISCREG_SSTATUS, "sstatus"},
7011963Sar4jc@virginia.edu        {MISCREG_SEDELEG, "sedeleg"},
7111963Sar4jc@virginia.edu        {MISCREG_SIDELEG, "sideleg"},
7211963Sar4jc@virginia.edu        {MISCREG_SIE, "sie"},
7311963Sar4jc@virginia.edu        {MISCREG_STVEC, "stvec"},
7411963Sar4jc@virginia.edu        {MISCREG_SSCRATCH, "sscratch"},
7511963Sar4jc@virginia.edu        {MISCREG_SEPC, "sepc"},
7611963Sar4jc@virginia.edu        {MISCREG_SCAUSE, "scause"},
7711963Sar4jc@virginia.edu        {MISCREG_SBADADDR, "sbadaddr"},
7811963Sar4jc@virginia.edu        {MISCREG_SIP, "sip"},
7911963Sar4jc@virginia.edu        {MISCREG_SPTBR, "sptbr"},
8011963Sar4jc@virginia.edu
8111963Sar4jc@virginia.edu        {MISCREG_HSTATUS, "hstatus"},
8211963Sar4jc@virginia.edu        {MISCREG_HEDELEG, "hedeleg"},
8311963Sar4jc@virginia.edu        {MISCREG_HIDELEG, "hideleg"},
8411963Sar4jc@virginia.edu        {MISCREG_HIE, "hie"},
8511963Sar4jc@virginia.edu        {MISCREG_HTVEC, "htvec"},
8611963Sar4jc@virginia.edu        {MISCREG_HSCRATCH, "hscratch"},
8711963Sar4jc@virginia.edu        {MISCREG_HEPC, "hepc"},
8811963Sar4jc@virginia.edu        {MISCREG_HCAUSE, "hcause"},
8911963Sar4jc@virginia.edu        {MISCREG_HBADADDR, "hbadaddr"},
9011963Sar4jc@virginia.edu        {MISCREG_HIP, "hip"},
9111963Sar4jc@virginia.edu
9211963Sar4jc@virginia.edu        {MISCREG_MVENDORID, "mvendorid"},
9311963Sar4jc@virginia.edu        {MISCREG_MARCHID, "marchid"},
9411963Sar4jc@virginia.edu        {MISCREG_MIMPID, "mimpid"},
9511963Sar4jc@virginia.edu        {MISCREG_MHARTID, "mhartid"},
9611963Sar4jc@virginia.edu        {MISCREG_MSTATUS, "mstatus"},
9711963Sar4jc@virginia.edu        {MISCREG_MISA, "misa"},
9811963Sar4jc@virginia.edu        {MISCREG_MEDELEG, "medeleg"},
9911963Sar4jc@virginia.edu        {MISCREG_MIDELEG, "mideleg"},
10011963Sar4jc@virginia.edu        {MISCREG_MIE, "mie"},
10111963Sar4jc@virginia.edu        {MISCREG_MTVEC, "mtvec"},
10211963Sar4jc@virginia.edu        {MISCREG_MSCRATCH, "mscratch"},
10311963Sar4jc@virginia.edu        {MISCREG_MEPC, "mepc"},
10411963Sar4jc@virginia.edu        {MISCREG_MCAUSE, "mcause"},
10511963Sar4jc@virginia.edu        {MISCREG_MBADADDR, "mbadaddr"},
10611963Sar4jc@virginia.edu        {MISCREG_MIP, "mip"},
10711963Sar4jc@virginia.edu        {MISCREG_MBASE, "mbase"},
10811963Sar4jc@virginia.edu        {MISCREG_MBOUND, "mbound"},
10911963Sar4jc@virginia.edu        {MISCREG_MIBASE, "mibase"},
11011963Sar4jc@virginia.edu        {MISCREG_MIBOUND, "mibound"},
11111963Sar4jc@virginia.edu        {MISCREG_MDBASE, "mdbase"},
11211963Sar4jc@virginia.edu        {MISCREG_MDBOUND, "mdbound"},
11311963Sar4jc@virginia.edu        {MISCREG_MCYCLE, "mcycle"},
11411963Sar4jc@virginia.edu        {MISCREG_MINSTRET, "minstret"},
11511963Sar4jc@virginia.edu        {MISCREG_MUCOUNTEREN, "mucounteren"},
11611963Sar4jc@virginia.edu        {MISCREG_MSCOUNTEREN, "mscounteren"},
11711963Sar4jc@virginia.edu        {MISCREG_MHCOUNTEREN, "mhcounteren"},
11811963Sar4jc@virginia.edu
11911963Sar4jc@virginia.edu        {MISCREG_TSELECT, "tselect"},
12011963Sar4jc@virginia.edu        {MISCREG_TDATA1, "tdata1"},
12111963Sar4jc@virginia.edu        {MISCREG_TDATA2, "tdata2"},
12211963Sar4jc@virginia.edu        {MISCREG_TDATA3, "tdata3"},
12311963Sar4jc@virginia.edu        {MISCREG_DCSR, "dcsr"},
12411963Sar4jc@virginia.edu        {MISCREG_DPC, "dpc"},
12511963Sar4jc@virginia.edu        {MISCREG_DSCRATCH, "dscratch"}
12611963Sar4jc@virginia.edu    };
12711963Sar4jc@virginia.edu    for (int i = 0; i < NumHpmcounter; i++)
12811963Sar4jc@virginia.edu    {
12911963Sar4jc@virginia.edu        int hpmcounter = MISCREG_HPMCOUNTER_BASE + i;
13011963Sar4jc@virginia.edu        std::stringstream ss;
13111963Sar4jc@virginia.edu        ss << "hpmcounter" << hpmcounter;
13211963Sar4jc@virginia.edu        miscRegNames[hpmcounter] = ss.str();
13311963Sar4jc@virginia.edu    }
13411963Sar4jc@virginia.edu    for (int i = 0; i < NumHpmcounterh; i++)
13511963Sar4jc@virginia.edu    {
13611963Sar4jc@virginia.edu        int hpmcounterh = MISCREG_HPMCOUNTERH_BASE + i;
13711963Sar4jc@virginia.edu        std::stringstream ss;
13811963Sar4jc@virginia.edu        ss << "hpmcounterh" << hpmcounterh;
13911963Sar4jc@virginia.edu        miscRegNames[hpmcounterh] = ss.str();
14011963Sar4jc@virginia.edu    }
14111963Sar4jc@virginia.edu    for (int i = 0; i < NumMhpmcounter; i++)
14211963Sar4jc@virginia.edu    {
14311963Sar4jc@virginia.edu        int mhpmcounter = MISCREG_MHPMCOUNTER_BASE + i;
14411963Sar4jc@virginia.edu        std::stringstream ss;
14511963Sar4jc@virginia.edu        ss << "mhpmcounter" << mhpmcounter;
14611963Sar4jc@virginia.edu        miscRegNames[mhpmcounter] = ss.str();
14711963Sar4jc@virginia.edu    }
14811963Sar4jc@virginia.edu    for (int i = 0; i < NumMhpmevent; i++)
14911963Sar4jc@virginia.edu    {
15011963Sar4jc@virginia.edu        int mhpmevent = MISCREG_MHPMEVENT_BASE + i;
15111963Sar4jc@virginia.edu        std::stringstream ss;
15211963Sar4jc@virginia.edu        ss << "mhpmcounterh" << mhpmevent;
15311963Sar4jc@virginia.edu        miscRegNames[mhpmevent] = ss.str();
15411963Sar4jc@virginia.edu    }
15511963Sar4jc@virginia.edu
15611723Sar4jc@virginia.edu    miscRegFile.resize(NumMiscRegs);
15711723Sar4jc@virginia.edu    clear();
15811723Sar4jc@virginia.edu}
15911723Sar4jc@virginia.edu
16011723Sar4jc@virginia.educonst RiscvISAParams *
16111723Sar4jc@virginia.eduISA::params() const
16211723Sar4jc@virginia.edu{
16311723Sar4jc@virginia.edu    return dynamic_cast<const Params *>(_params);
16411723Sar4jc@virginia.edu}
16511723Sar4jc@virginia.edu
16611723Sar4jc@virginia.eduvoid ISA::clear()
16711723Sar4jc@virginia.edu{
16811723Sar4jc@virginia.edu    std::fill(miscRegFile.begin(), miscRegFile.end(), 0);
16911963Sar4jc@virginia.edu
17011963Sar4jc@virginia.edu    miscRegFile[MISCREG_MVENDORID] = 0;
17111963Sar4jc@virginia.edu    miscRegFile[MISCREG_MARCHID] = 0;
17211963Sar4jc@virginia.edu    miscRegFile[MISCREG_MIMPID] = 0;
17311963Sar4jc@virginia.edu    miscRegFile[MISCREG_MISA] = 0x8000000000101129ULL;
17411723Sar4jc@virginia.edu}
17511723Sar4jc@virginia.edu
17611723Sar4jc@virginia.edu
17711723Sar4jc@virginia.eduMiscReg
17811723Sar4jc@virginia.eduISA::readMiscRegNoEffect(int misc_reg) const
17911723Sar4jc@virginia.edu{
18011963Sar4jc@virginia.edu    DPRINTF(RiscvMisc, "Reading CSR %s (0x%016llx).\n",
18111963Sar4jc@virginia.edu        miscRegNames.at(misc_reg), miscRegFile[misc_reg]);
18211723Sar4jc@virginia.edu    switch (misc_reg) {
18311723Sar4jc@virginia.edu      case MISCREG_FFLAGS:
18411723Sar4jc@virginia.edu        return bits(miscRegFile[MISCREG_FCSR], 4, 0);
18511723Sar4jc@virginia.edu      case MISCREG_FRM:
18611723Sar4jc@virginia.edu        return bits(miscRegFile[MISCREG_FCSR], 7, 5);
18711723Sar4jc@virginia.edu      case MISCREG_FCSR:
18811723Sar4jc@virginia.edu        return bits(miscRegFile[MISCREG_FCSR], 31, 0);
18911723Sar4jc@virginia.edu      case MISCREG_CYCLE:
19011723Sar4jc@virginia.edu        warn("Use readMiscReg to read the cycle CSR.");
19111723Sar4jc@virginia.edu        return 0;
19211723Sar4jc@virginia.edu      case MISCREG_TIME:
19311723Sar4jc@virginia.edu        return std::time(nullptr);
19411723Sar4jc@virginia.edu      case MISCREG_INSTRET:
19511723Sar4jc@virginia.edu        warn("Use readMiscReg to read the instret CSR.");
19611723Sar4jc@virginia.edu        return 0;
19711723Sar4jc@virginia.edu      case MISCREG_CYCLEH:
19811723Sar4jc@virginia.edu        warn("Use readMiscReg to read the cycleh CSR.");
19911723Sar4jc@virginia.edu        return 0;
20011723Sar4jc@virginia.edu      case MISCREG_TIMEH:
20111723Sar4jc@virginia.edu        return std::time(nullptr) >> 32;
20211723Sar4jc@virginia.edu      case MISCREG_INSTRETH:
20311723Sar4jc@virginia.edu        warn("Use readMiscReg to read the instreth CSR.");
20411723Sar4jc@virginia.edu        return 0;
20511963Sar4jc@virginia.edu      case MISCREG_MHARTID:
20611963Sar4jc@virginia.edu        warn("Use readMiscReg to read the mhartid CSR.");
20711963Sar4jc@virginia.edu        return 0;
20811723Sar4jc@virginia.edu      default:
20911723Sar4jc@virginia.edu        return miscRegFile[misc_reg];
21011723Sar4jc@virginia.edu    }
21111723Sar4jc@virginia.edu}
21211723Sar4jc@virginia.edu
21311723Sar4jc@virginia.eduMiscReg
21411723Sar4jc@virginia.eduISA::readMiscReg(int misc_reg, ThreadContext *tc)
21511723Sar4jc@virginia.edu{
21611723Sar4jc@virginia.edu    switch (misc_reg) {
21711723Sar4jc@virginia.edu      case MISCREG_INSTRET:
21811723Sar4jc@virginia.edu        DPRINTF(RiscvMisc, "Reading CSR %s (0x%016llx).\n",
21911723Sar4jc@virginia.edu            miscRegNames[misc_reg], miscRegFile[misc_reg]);
22011723Sar4jc@virginia.edu        return tc->getCpuPtr()->totalInsts();
22111723Sar4jc@virginia.edu      case MISCREG_CYCLE:
22211723Sar4jc@virginia.edu        DPRINTF(RiscvMisc, "Reading CSR %s (0x%016llx).\n",
22311723Sar4jc@virginia.edu            miscRegNames[misc_reg], miscRegFile[misc_reg]);
22411723Sar4jc@virginia.edu        return tc->getCpuPtr()->curCycle();
22511723Sar4jc@virginia.edu      case MISCREG_INSTRETH:
22611723Sar4jc@virginia.edu        DPRINTF(RiscvMisc, "Reading CSR %s (0x%016llx).\n",
22711723Sar4jc@virginia.edu            miscRegNames[misc_reg], miscRegFile[misc_reg]);
22811723Sar4jc@virginia.edu        return tc->getCpuPtr()->totalInsts() >> 32;
22911723Sar4jc@virginia.edu      case MISCREG_CYCLEH:
23011723Sar4jc@virginia.edu        DPRINTF(RiscvMisc, "Reading CSR %s (0x%016llx).\n",
23111723Sar4jc@virginia.edu            miscRegNames[misc_reg], miscRegFile[misc_reg]);
23211723Sar4jc@virginia.edu        return tc->getCpuPtr()->curCycle() >> 32;
23311963Sar4jc@virginia.edu      case MISCREG_MHARTID:
23411963Sar4jc@virginia.edu        return 0; // TODO: make this the hardware thread or cpu id
23511723Sar4jc@virginia.edu      default:
23611723Sar4jc@virginia.edu        return readMiscRegNoEffect(misc_reg);
23711723Sar4jc@virginia.edu    }
23811723Sar4jc@virginia.edu}
23911723Sar4jc@virginia.edu
24011723Sar4jc@virginia.eduvoid
24111723Sar4jc@virginia.eduISA::setMiscRegNoEffect(int misc_reg, const MiscReg &val)
24211723Sar4jc@virginia.edu{
24311723Sar4jc@virginia.edu    DPRINTF(RiscvMisc, "Setting CSR %s to 0x%016llx.\n",
24411963Sar4jc@virginia.edu        miscRegNames[misc_reg], val);
24511723Sar4jc@virginia.edu    switch (misc_reg) {
24611723Sar4jc@virginia.edu      case MISCREG_FFLAGS:
24711723Sar4jc@virginia.edu        miscRegFile[MISCREG_FCSR] &= ~0x1F;
24811723Sar4jc@virginia.edu        miscRegFile[MISCREG_FCSR] |= bits(val, 4, 0);
24911723Sar4jc@virginia.edu        break;
25011723Sar4jc@virginia.edu      case MISCREG_FRM:
25111723Sar4jc@virginia.edu        miscRegFile[MISCREG_FCSR] &= ~0x70;
25211723Sar4jc@virginia.edu        miscRegFile[MISCREG_FCSR] |= bits(val, 2, 0) << 5;
25311723Sar4jc@virginia.edu        break;
25411723Sar4jc@virginia.edu      case MISCREG_FCSR:
25511723Sar4jc@virginia.edu        miscRegFile[MISCREG_FCSR] = bits(val, 7, 0);
25611723Sar4jc@virginia.edu        break;
25711723Sar4jc@virginia.edu      default:
25811723Sar4jc@virginia.edu        miscRegFile[misc_reg] = val;
25911723Sar4jc@virginia.edu        break;
26011723Sar4jc@virginia.edu    }
26111723Sar4jc@virginia.edu}
26211723Sar4jc@virginia.edu
26311723Sar4jc@virginia.eduvoid
26411723Sar4jc@virginia.eduISA::setMiscReg(int misc_reg, const MiscReg &val, ThreadContext *tc)
26511723Sar4jc@virginia.edu{
26611723Sar4jc@virginia.edu    if (bits((unsigned)misc_reg, 11, 10) == 0x3) {
26711723Sar4jc@virginia.edu        warn("Ignoring write to read-only CSR.");
26811723Sar4jc@virginia.edu        return;
26911723Sar4jc@virginia.edu    }
27011723Sar4jc@virginia.edu    setMiscRegNoEffect(misc_reg, val);
27111723Sar4jc@virginia.edu}
27211723Sar4jc@virginia.edu
27311723Sar4jc@virginia.edu}
27411723Sar4jc@virginia.edu
27511723Sar4jc@virginia.eduRiscvISA::ISA *
27611723Sar4jc@virginia.eduRiscvISAParams::create()
27711723Sar4jc@virginia.edu{
27811723Sar4jc@virginia.edu    return new RiscvISA::ISA(this);
27911723Sar4jc@virginia.edu}
280