faults.hh revision 11723
11689SN/A/*
22316SN/A * Copyright (c) 2016 RISC-V Foundation
31689SN/A * Copyright (c) 2016 The University of Virginia
41689SN/A * All rights reserved.
51689SN/A *
61689SN/A * Redistribution and use in source and binary forms, with or without
71689SN/A * modification, are permitted provided that the following conditions are
81689SN/A * met: redistributions of source code must retain the above copyright
91689SN/A * notice, this list of conditions and the following disclaimer;
101689SN/A * redistributions in binary form must reproduce the above copyright
111689SN/A * notice, this list of conditions and the following disclaimer in the
121689SN/A * documentation and/or other materials provided with the distribution;
131689SN/A * neither the name of the copyright holders nor the names of its
141689SN/A * contributors may be used to endorse or promote products derived from
151689SN/A * this software without specific prior written permission.
161689SN/A *
171689SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
181689SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
191689SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
201689SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
211689SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
221689SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
231689SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
241689SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
251689SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
261689SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
272665SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
282665SN/A *
291689SN/A * Authors: Alec Roelke
301061SN/A */
315953Ssaidi@eecs.umich.edu
325596Sgblack@eecs.umich.edu#ifndef __ARCH_RISCV_FAULTS_HH__
331061SN/A#define __ARCH_RISCV_FAULTS_HH__
341061SN/A
355596Sgblack@eecs.umich.edu#include <string>
365596Sgblack@eecs.umich.edu
375596Sgblack@eecs.umich.edu#include "cpu/thread_context.hh"
385596Sgblack@eecs.umich.edu#include "sim/faults.hh"
395596Sgblack@eecs.umich.edu
404637SN/Anamespace RiscvISA
415596Sgblack@eecs.umich.edu{
424637SN/A
434637SN/Aenum ExceptionCode {
444637SN/A    INST_ADDR_MISALIGNED = 0,
454637SN/A    INST_ACCESS = 1,
464637SN/A    INST_ILLEGAL = 2,
475596Sgblack@eecs.umich.edu    BREAKPOINT = 3,
485596Sgblack@eecs.umich.edu    LOAD_ADDR_MISALIGNED = 4,
495596Sgblack@eecs.umich.edu    LOAD_ACCESS = 5,
505596Sgblack@eecs.umich.edu    STORE_ADDR_MISALIGNED = 6,
515596Sgblack@eecs.umich.edu    AMO_ADDR_MISALIGNED = 6,
524637SN/A    STORE_ACCESS = 7,
535596Sgblack@eecs.umich.edu    AMO_ACCESS = 7,
541061SN/A    ECALL_USER = 8,
552292SN/A    ECALL_SUPER = 9,
561061SN/A    ECALL_HYPER = 10,
571061SN/A    ECALL_MACH = 11
581061SN/A};
595596Sgblack@eecs.umich.edu
601464SN/Aenum InterruptCode {
611061SN/A    SOFTWARE,
622292SN/A    TIMER
632292SN/A};
642292SN/A
652292SN/Aclass RiscvFault : public FaultBase
662292SN/A{
675596Sgblack@eecs.umich.edu  protected:
682292SN/A    const FaultName _name;
691464SN/A    const ExceptionCode _code;
701464SN/A    const InterruptCode _int;
711464SN/A
722292SN/A    RiscvFault(FaultName n, ExceptionCode c, InterruptCode i)
733782SN/A        : _name(n), _code(c), _int(i)
741464SN/A    {}
751464SN/A
762292SN/A    FaultName
773782SN/A    name() const
782292SN/A    {
791464SN/A        return _name;
801061SN/A    }
811061SN/A
822292SN/A    ExceptionCode
832292SN/A    exception() const
845596Sgblack@eecs.umich.edu    {
852292SN/A        return _code;
862348SN/A    }
872680SN/A
882348SN/A    InterruptCode
892680SN/A    interrupt() const
902292SN/A    {
912292SN/A        return _int;
922292SN/A    }
932292SN/A
942292SN/A    virtual void
952292SN/A    invoke_se(ThreadContext *tc, const StaticInstPtr &inst);
962292SN/A
972292SN/A    void
982292SN/A    invoke(ThreadContext *tc, const StaticInstPtr &inst);
992292SN/A};
1002292SN/A
1012292SN/A
1025596Sgblack@eecs.umich.educlass UnknownInstFault : public RiscvFault
1032292SN/A{
1042348SN/A  public:
1052680SN/A    UnknownInstFault() : RiscvFault("Unknown instruction", INST_ILLEGAL,
1062348SN/A            SOFTWARE)
1072680SN/A    {}
1082292SN/A
1092292SN/A    void
1102292SN/A    invoke_se(ThreadContext *tc, const StaticInstPtr &inst);
1112292SN/A};
1122292SN/A
1132292SN/Aclass UnimplementedFault : public RiscvFault
1142292SN/A{
1152292SN/A  private:
1162292SN/A    const std::string instName;
1172292SN/A  public:
1182292SN/A    UnimplementedFault(std::string name)
1192292SN/A        : RiscvFault("Unimplemented instruction", INST_ILLEGAL, SOFTWARE),
1205596Sgblack@eecs.umich.edu        instName(name)
1212292SN/A    {}
1222790SN/A
1232292SN/A    void
1242292SN/A    invoke_se(ThreadContext *tc, const StaticInstPtr &inst);
1252292SN/A};
1262292SN/A
1271858SN/Aclass BreakpointFault : public RiscvFault
1281061SN/A{
1295702Ssaidi@eecs.umich.edu  public:
1305702Ssaidi@eecs.umich.edu    BreakpointFault() : RiscvFault("Breakpoint", BREAKPOINT, SOFTWARE)
1315702Ssaidi@eecs.umich.edu    {}
1325702Ssaidi@eecs.umich.edu
1335702Ssaidi@eecs.umich.edu    void
1345702Ssaidi@eecs.umich.edu    invoke_se(ThreadContext *tc, const StaticInstPtr &inst);
1355702Ssaidi@eecs.umich.edu};
1365702Ssaidi@eecs.umich.edu
1375702Ssaidi@eecs.umich.educlass SyscallFault : public RiscvFault
1385702Ssaidi@eecs.umich.edu{
1395702Ssaidi@eecs.umich.edu  public:
1405953Ssaidi@eecs.umich.edu    // TODO: replace ECALL_USER with the appropriate privilege level of the
1415953Ssaidi@eecs.umich.edu    // caller
1425953Ssaidi@eecs.umich.edu    SyscallFault() : RiscvFault("System call", ECALL_USER, SOFTWARE)
1435953Ssaidi@eecs.umich.edu    {}
1445702Ssaidi@eecs.umich.edu
1455702Ssaidi@eecs.umich.edu    void
1465702Ssaidi@eecs.umich.edu    invoke_se(ThreadContext *tc, const StaticInstPtr &inst);
1475702Ssaidi@eecs.umich.edu};
1485702Ssaidi@eecs.umich.edu
1495702Ssaidi@eecs.umich.edu} // namespace RiscvISA
1505702Ssaidi@eecs.umich.edu
1515702Ssaidi@eecs.umich.edu#endif // __ARCH_RISCV_FAULTS_HH__
1525702Ssaidi@eecs.umich.edu