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    {
7713631Sqtt2@cornell.edu        INTERRUPT mask = 0;
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