interrupts.hh revision 13628
111723Sar4jc@virginia.edu/* 211723Sar4jc@virginia.edu * Copyright (c) 2011 Google 311723Sar4jc@virginia.edu * All rights reserved. 411723Sar4jc@virginia.edu * 511723Sar4jc@virginia.edu * Redistribution and use in source and binary forms, with or without 611723Sar4jc@virginia.edu * modification, are permitted provided that the following conditions are 711723Sar4jc@virginia.edu * met: redistributions of source code must retain the above copyright 811723Sar4jc@virginia.edu * notice, this list of conditions and the following disclaimer; 911723Sar4jc@virginia.edu * redistributions in binary form must reproduce the above copyright 1011723Sar4jc@virginia.edu * notice, this list of conditions and the following disclaimer in the 1111723Sar4jc@virginia.edu * documentation and/or other materials provided with the distribution; 1211723Sar4jc@virginia.edu * neither the name of the copyright holders nor the names of its 1311723Sar4jc@virginia.edu * contributors may be used to endorse or promote products derived from 1411723Sar4jc@virginia.edu * this software without specific prior written permission. 1511723Sar4jc@virginia.edu * 1611723Sar4jc@virginia.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1711723Sar4jc@virginia.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1811723Sar4jc@virginia.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1911723Sar4jc@virginia.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2011723Sar4jc@virginia.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2111723Sar4jc@virginia.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2211723Sar4jc@virginia.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2311723Sar4jc@virginia.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2411723Sar4jc@virginia.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2511723Sar4jc@virginia.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2611723Sar4jc@virginia.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2711723Sar4jc@virginia.edu * 2811723Sar4jc@virginia.edu * Authors: Gabe Black 2911723Sar4jc@virginia.edu */ 3011723Sar4jc@virginia.edu 3111723Sar4jc@virginia.edu#ifndef __ARCH_RISCV_INTERRUPT_HH__ 3211723Sar4jc@virginia.edu#define __ARCH_RISCV_INTERRUPT_HH__ 3311723Sar4jc@virginia.edu 3413548Salec.roelke@gmail.com#include <bitset> 3513548Salec.roelke@gmail.com#include <memory> 3613548Salec.roelke@gmail.com 3713548Salec.roelke@gmail.com#include "arch/riscv/faults.hh" 3813548Salec.roelke@gmail.com#include "arch/riscv/registers.hh" 3912334Sgabeblack@google.com#include "base/logging.hh" 4012808Srobert.scheffel1@tu-dresden.de#include "cpu/thread_context.hh" 4113548Salec.roelke@gmail.com#include "debug/Interrupt.hh" 4211723Sar4jc@virginia.edu#include "params/RiscvInterrupts.hh" 4311723Sar4jc@virginia.edu#include "sim/sim_object.hh" 4411723Sar4jc@virginia.edu 4511800Sbrandon.potter@amd.comclass BaseCPU; 4611723Sar4jc@virginia.educlass ThreadContext; 4711723Sar4jc@virginia.edu 4811723Sar4jc@virginia.edunamespace RiscvISA { 4911723Sar4jc@virginia.edu 5013548Salec.roelke@gmail.com/* 5113548Salec.roelke@gmail.com * This is based on version 1.10 of the RISC-V privileged ISA reference, 5213548Salec.roelke@gmail.com * chapter 3.1.14. 5313548Salec.roelke@gmail.com */ 5411723Sar4jc@virginia.educlass Interrupts : public SimObject 5511723Sar4jc@virginia.edu{ 5611723Sar4jc@virginia.edu private: 5711723Sar4jc@virginia.edu BaseCPU * cpu; 5813548Salec.roelke@gmail.com std::bitset<NumInterruptTypes> ip; 5913548Salec.roelke@gmail.com std::bitset<NumInterruptTypes> ie; 6011723Sar4jc@virginia.edu 6111723Sar4jc@virginia.edu public: 6211723Sar4jc@virginia.edu typedef RiscvInterruptsParams Params; 6311723Sar4jc@virginia.edu 6411723Sar4jc@virginia.edu const Params * 6511723Sar4jc@virginia.edu params() const 6611723Sar4jc@virginia.edu { 6711723Sar4jc@virginia.edu return dynamic_cast<const Params *>(_params); 6811723Sar4jc@virginia.edu } 6911723Sar4jc@virginia.edu 7013548Salec.roelke@gmail.com Interrupts(Params * p) : SimObject(p), cpu(nullptr), ip(0), ie(0) {} 7111723Sar4jc@virginia.edu 7213548Salec.roelke@gmail.com void setCPU(BaseCPU * _cpu) { cpu = _cpu; } 7313548Salec.roelke@gmail.com 7413548Salec.roelke@gmail.com std::bitset<NumInterruptTypes> 7513548Salec.roelke@gmail.com globalMask(ThreadContext *tc) const 7611723Sar4jc@virginia.edu { 7713548Salec.roelke@gmail.com INTERRUPT mask; 7813548Salec.roelke@gmail.com STATUS status = tc->readMiscReg(MISCREG_STATUS); 7913548Salec.roelke@gmail.com if (status.mie) 8013548Salec.roelke@gmail.com mask.mei = mask.mti = mask.msi = 1; 8113548Salec.roelke@gmail.com if (status.sie) 8213548Salec.roelke@gmail.com mask.sei = mask.sti = mask.ssi = 1; 8313548Salec.roelke@gmail.com if (status.uie) 8413548Salec.roelke@gmail.com mask.uei = mask.uti = mask.usi = 1; 8513548Salec.roelke@gmail.com return std::bitset<NumInterruptTypes>(mask); 8611723Sar4jc@virginia.edu } 8711723Sar4jc@virginia.edu 8813548Salec.roelke@gmail.com bool checkInterrupt(int num) const { return ip[num] && ie[num]; } 8913548Salec.roelke@gmail.com bool checkInterrupts(ThreadContext *tc) const 9013548Salec.roelke@gmail.com { 9113548Salec.roelke@gmail.com return (ip & ie & globalMask(tc)).any(); 9213548Salec.roelke@gmail.com } 9313548Salec.roelke@gmail.com 9413548Salec.roelke@gmail.com Fault 9513548Salec.roelke@gmail.com getInterrupt(ThreadContext *tc) const 9613548Salec.roelke@gmail.com { 9713548Salec.roelke@gmail.com assert(checkInterrupts(tc)); 9813548Salec.roelke@gmail.com std::bitset<NumInterruptTypes> mask = globalMask(tc); 9913548Salec.roelke@gmail.com for (int c = 0; c < NumInterruptTypes; c++) 10013548Salec.roelke@gmail.com if (checkInterrupt(c) && mask[c]) 10113548Salec.roelke@gmail.com return std::make_shared<InterruptFault>(c); 10213548Salec.roelke@gmail.com return NoFault; 10313548Salec.roelke@gmail.com } 10413548Salec.roelke@gmail.com 10513548Salec.roelke@gmail.com void updateIntrInfo(ThreadContext *tc) {} 10613548Salec.roelke@gmail.com 10711723Sar4jc@virginia.edu void 10811723Sar4jc@virginia.edu post(int int_num, int index) 10911723Sar4jc@virginia.edu { 11013548Salec.roelke@gmail.com DPRINTF(Interrupt, "Interrupt %d:%d posted\n", int_num, index); 11113548Salec.roelke@gmail.com ip[int_num] = true; 11211723Sar4jc@virginia.edu } 11311723Sar4jc@virginia.edu 11411723Sar4jc@virginia.edu void 11511723Sar4jc@virginia.edu clear(int int_num, int index) 11611723Sar4jc@virginia.edu { 11713548Salec.roelke@gmail.com DPRINTF(Interrupt, "Interrupt %d:%d cleared\n", int_num, index); 11813548Salec.roelke@gmail.com ip[int_num] = false; 11911723Sar4jc@virginia.edu } 12011723Sar4jc@virginia.edu 12111723Sar4jc@virginia.edu void 12211723Sar4jc@virginia.edu clearAll() 12311723Sar4jc@virginia.edu { 12413548Salec.roelke@gmail.com DPRINTF(Interrupt, "All interrupts cleared\n"); 12513548Salec.roelke@gmail.com ip = 0; 12611723Sar4jc@virginia.edu } 12711723Sar4jc@virginia.edu 12813625Saustinharris@utexas.edu uint64_t readIP() const { return (uint64_t)ip.to_ulong(); } 12913625Saustinharris@utexas.edu uint64_t readIE() const { return (uint64_t)ie.to_ulong(); } 13013625Saustinharris@utexas.edu void setIP(const uint64_t& val) { ip = val; } 13113625Saustinharris@utexas.edu void setIE(const uint64_t& val) { ie = val; } 13213548Salec.roelke@gmail.com 13313548Salec.roelke@gmail.com void 13413628SAndrea.Mondelli@ucf.edu serialize(CheckpointOut &cp) const 13511723Sar4jc@virginia.edu { 13613548Salec.roelke@gmail.com SERIALIZE_SCALAR(ip.to_ulong()); 13713548Salec.roelke@gmail.com SERIALIZE_SCALAR(ie.to_ulong()); 13811723Sar4jc@virginia.edu } 13911723Sar4jc@virginia.edu 14011723Sar4jc@virginia.edu void 14113548Salec.roelke@gmail.com unserialize(CheckpointIn &cp) 14211723Sar4jc@virginia.edu { 14313548Salec.roelke@gmail.com long reg; 14413548Salec.roelke@gmail.com UNSERIALIZE_SCALAR(reg); 14513548Salec.roelke@gmail.com ip = reg; 14613548Salec.roelke@gmail.com UNSERIALIZE_SCALAR(reg); 14713548Salec.roelke@gmail.com ie = reg; 14811723Sar4jc@virginia.edu } 14911723Sar4jc@virginia.edu}; 15011723Sar4jc@virginia.edu 15111723Sar4jc@virginia.edu} // namespace RiscvISA 15211723Sar4jc@virginia.edu 15313625Saustinharris@utexas.edu#endif // __ARCH_RISCV_INTERRUPT_HH__ 154