/*
+ * 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;
-// Each class has it's name statically define in _name,
-// and has a virtual function to access it's name.
-// The function is necessary because otherwise, all objects
-// which are being accessed cast as a FaultBase * (namely
-// all faults returned using the Fault type) will use the
-// generic FaultBase name.
-
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() {};
};
class UnimpFault : public 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;
+};
+
+// A fault to trigger a system call in SE mode.
+class SESyscallFault : public FaultBase
+{
+ const char *name() const override { return "syscall_fault"; }
- FaultName name() const {return "Unimplemented simulator feature";}
- void invoke(ThreadContext * tc, const StaticInstPtr &inst =
- StaticInst::nullStaticInstPtr);
+ 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;
+};
+
+/*
+ * This class is needed to allow system call retries to occur for blocking
+ * system calls in SE mode. A retry fault will be generated by the system call
+ * emulation code if blocking conditions arise; the fault is passed up the
+ * function call chain into the CPU model where it is handled by retrying the
+ * syscall instruction on a later tick.
+ */
+class SyscallRetryFault : public FaultBase
+{
+ public:
+ FaultName name() const override { return "System call retry fault"; }
+ SyscallRetryFault() {}
+ 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; }
};
class GenericAlignmentFault : public FaultBase
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__