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