/*
+ * Copyright (c) 2020 ARM Limited
+ * All rights reserved
+ *
+ * The license below extends only to copyright in the software and shall
+ * not be construed as granting a license to any other intellectual
+ * property including but not limited to intellectual property relating
+ * to a hardware implementation of the functionality of the software
+ * licensed hereunder. You may use the software subject to the license
+ * terms below provided that you ensure that this notice is replicated
+ * unmodified and in its entirety in all distributions of the software,
+ * modified or unmodified, in source code or in binary form.
+ *
* Copyright (c) 2003-2005 The Regents of The University of Michigan
* All rights reserved.
*
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Authors: Nathan Binkert
- * Gabe Black
*/
#ifndef __FAULTS_HH__
#include "base/types.hh"
#include "cpu/static_inst.hh"
+#include "mem/htm.hh"
#include "sim/stats.hh"
class ThreadContext;
-typedef const char * FaultName;
+typedef const char *FaultName;
typedef Stats::Scalar FaultStat;
class FaultBase
{
public:
virtual FaultName name() const = 0;
- virtual void invoke(ThreadContext * tc, const StaticInstPtr &inst =
+ virtual void invoke(ThreadContext * tc, const StaticInstPtr &inst=
StaticInst::nullStaticInstPtr);
-
virtual ~FaultBase() {};
};
private:
std::string panicStr;
public:
- UnimpFault(std::string _str)
- : panicStr(_str)
- { }
+ UnimpFault(std::string _str) : panicStr(_str) {}
+
+ FaultName
+ name() const override
+ {
+ return "Unimplemented simulator feature";
+ }
+ void invoke(ThreadContext *tc, const StaticInstPtr &inst =
+ StaticInst::nullStaticInstPtr) override;
+};
- FaultName name() const { return "Unimplemented simulator feature"; }
- void invoke(ThreadContext * tc, const StaticInstPtr &inst =
- StaticInst::nullStaticInstPtr);
+// A fault to trigger a system call in SE mode.
+class SESyscallFault : public FaultBase
+{
+ const char *name() const override { return "syscall_fault"; }
+
+ void invoke(ThreadContext *tc, const StaticInstPtr &inst=
+ StaticInst::nullStaticInstPtr) override;
};
class ReExec : public FaultBase
{
public:
- virtual FaultName name() const { return "Re-execution fault"; }
- ReExec() {}
- void invoke(ThreadContext *tc, const StaticInstPtr &inst =
- StaticInst::nullStaticInstPtr);
+ virtual FaultName name() const override { return "Re-execution fault"; }
+ void invoke(ThreadContext *tc, const StaticInstPtr &inst=
+ StaticInst::nullStaticInstPtr) override;
};
/*
class SyscallRetryFault : public FaultBase
{
public:
- virtual FaultName name() const { return "System call retry fault"; }
+ FaultName name() const override { return "System call retry fault"; }
SyscallRetryFault() {}
- void invoke(ThreadContext *tc, const StaticInstPtr &inst =
- StaticInst::nullStaticInstPtr);
+ void invoke(ThreadContext *tc, const StaticInstPtr &inst=
+ StaticInst::nullStaticInstPtr) override;
};
class GenericPageTableFault : public FaultBase
private:
Addr vaddr;
public:
- FaultName name() const { return "Generic page table fault"; }
+ FaultName name() const override { return "Generic page table fault"; }
GenericPageTableFault(Addr va) : vaddr(va) {}
- void invoke(ThreadContext * tc, const StaticInstPtr &inst =
- StaticInst::nullStaticInstPtr);
+ void invoke(ThreadContext *tc, const StaticInstPtr &inst=
+ StaticInst::nullStaticInstPtr) override;
Addr getFaultVAddr() const { return vaddr; }
};
private:
Addr vaddr;
public:
- FaultName name() const { return "Generic alignment fault"; }
+ FaultName name() const override { return "Generic alignment fault"; }
GenericAlignmentFault(Addr va) : vaddr(va) {}
- void invoke(ThreadContext * tc, const StaticInstPtr &inst =
- StaticInst::nullStaticInstPtr);
+ void invoke(ThreadContext *tc, const StaticInstPtr &inst=
+ StaticInst::nullStaticInstPtr) override;
Addr getFaultVAddr() const { return vaddr; }
};
+class GenericHtmFailureFault : public FaultBase
+{
+ protected:
+ uint64_t htmUid; // unique identifier used for debugging
+ HtmFailureFaultCause cause;
+
+ public:
+ GenericHtmFailureFault(uint64_t htm_uid, HtmFailureFaultCause _cause)
+ : htmUid(htm_uid), cause(_cause)
+ {}
+
+ FaultName name() const override { return "Generic HTM failure fault"; }
+
+ uint64_t getHtmUid() const { return htmUid; }
+ HtmFailureFaultCause getHtmFailureFaultCause() const { return cause; }
+ void invoke(ThreadContext *tc, const StaticInstPtr &inst =
+ StaticInst::nullStaticInstPtr) override;
+};
+
#endif // __FAULTS_HH__