debugfaults.hh (12334:e0ab29a34764) debugfaults.hh (14277:73d5e60b3a7c)
1/*
2 * Copyright (c) 2010 Advanced Micro Devices, Inc.
3 * All rights reserved.
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software

--- 36 unchanged lines hidden (view full) ---

45#include "base/logging.hh"
46#include "sim/faults.hh"
47
48namespace GenericISA
49{
50
51class M5DebugFault : public FaultBase
52{
1/*
2 * Copyright (c) 2010 Advanced Micro Devices, Inc.
3 * All rights reserved.
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software

--- 36 unchanged lines hidden (view full) ---

45#include "base/logging.hh"
46#include "sim/faults.hh"
47
48namespace GenericISA
49{
50
51class M5DebugFault : public FaultBase
52{
53 public:
54 enum DebugFunc
53 protected:
54 std::string _message;
55 virtual void debugFunc() = 0;
56 void
57 advancePC(ThreadContext *tc, const StaticInstPtr &inst)
55 {
58 {
56 PanicFunc,
57 FatalFunc,
58 WarnFunc,
59 WarnOnceFunc
60 };
59 if (inst) {
60 auto pc = tc->pcState();
61 inst->advancePC(pc);
62 tc->pcState(pc);
63 }
64 }
61
65
62 protected:
63 std::string message;
64 DebugFunc func;
65
66 public:
66 public:
67 M5DebugFault(DebugFunc _func, std::string _message) :
68 message(_message), func(_func)
67 M5DebugFault(std::string _m) : _message(_m) {}
68
69 template <class ...Args>
70 M5DebugFault(const std::string &format, const Args &...args) :
71 _message(csprintf(format, args...))
69 {}
70
72 {}
73
71 FaultName
72 name() const
74 std::string message() { return _message; }
75
76 void
77 invoke(ThreadContext *tc, const StaticInstPtr &inst =
78 StaticInst::nullStaticInstPtr) override
73 {
79 {
74 switch (func) {
75 case PanicFunc:
76 return "panic fault";
77 case FatalFunc:
78 return "fatal fault";
79 case WarnFunc:
80 return "warn fault";
81 case WarnOnceFunc:
82 return "warn_once fault";
83 default:
84 panic("unrecognized debug function number\n");
85 }
80 debugFunc();
81 advancePC(tc, inst);
86 }
82 }
83};
87
84
85// The "Flavor" template parameter is to keep warn, hack or inform messages
86// with the same token from blocking each other.
87template <class Flavor>
88class M5DebugOnceFault : public M5DebugFault
89{
90 protected:
91 bool &once;
92
93 template <class F, class OnceToken>
94 static bool &
95 lookUpToken(const OnceToken &token)
96 {
97 static std::map<OnceToken, bool> tokenMap;
98 return tokenMap[token];
99 }
100
101 public:
102 template <class OnceToken, class ...Args>
103 M5DebugOnceFault(const OnceToken &token, const std::string &format,
104 const Args &...args) :
105 M5DebugFault(format, args...), once(lookUpToken<Flavor>(token))
106 {}
107
88 void
89 invoke(ThreadContext *tc, const StaticInstPtr &inst =
108 void
109 invoke(ThreadContext *tc, const StaticInstPtr &inst =
90 StaticInst::nullStaticInstPtr)
110 StaticInst::nullStaticInstPtr) override
91 {
111 {
92 switch (func) {
93 case PanicFunc:
94 panic(message);
95 break;
96 case FatalFunc:
97 fatal(message);
98 break;
99 case WarnFunc:
100 warn(message);
101 break;
102 case WarnOnceFunc:
103 warn_once(message);
104 break;
105 default:
106 panic("unrecognized debug function number\n");
112 if (!once) {
113 once = true;
114 debugFunc();
107 }
115 }
116 advancePC(tc, inst);
108 }
109};
110
117 }
118};
119
111template <int Func>
112class M5VarArgsFault : public M5DebugFault
120class M5PanicFault : public M5DebugFault
113{
114 public:
121{
122 public:
115 template<typename ...Args>
116 M5VarArgsFault(const std::string &format, const Args &...args) :
117 M5DebugFault((DebugFunc)Func, csprintf(format, args...))
118 {}
123 using M5DebugFault::M5DebugFault;
124 void debugFunc() override { panic(message()); }
125 FaultName name() const override { return "panic fault"; }
119};
120
126};
127
121typedef M5VarArgsFault<M5DebugFault::PanicFunc> M5PanicFault;
122typedef M5VarArgsFault<M5DebugFault::FatalFunc> M5FatalFault;
123typedef M5VarArgsFault<M5DebugFault::WarnFunc> M5WarnFault;
124typedef M5VarArgsFault<M5DebugFault::WarnOnceFunc> M5WarnOnceFault;
128class M5FatalFault : public M5DebugFault
129{
130 public:
131 using M5DebugFault::M5DebugFault;
132 void debugFunc() override { fatal(message()); }
133 FaultName name() const override { return "fatal fault"; }
134};
125
135
136template <class Base>
137class M5WarnFaultBase : public Base
138{
139 public:
140 using Base::Base;
141 void debugFunc() override { warn(this->message()); }
142 FaultName name() const override { return "warn fault"; }
143};
144
145using M5WarnFault = M5WarnFaultBase<M5DebugFault>;
146using M5WarnOnceFault = M5WarnFaultBase<M5DebugOnceFault<M5WarnFault>>;
147
148template <class Base>
149class M5HackFaultBase : public Base
150{
151 public:
152 using Base::Base;
153 void debugFunc() override { hack(this->message()); }
154 FaultName name() const override { return "hack fault"; }
155};
156
157using M5HackFault = M5HackFaultBase<M5DebugFault>;
158using M5HackOnceFault = M5HackFaultBase<M5DebugOnceFault<M5HackFault>>;
159
160template <class Base>
161class M5InformFaultBase : public Base
162{
163 public:
164 using Base::Base;
165 void debugFunc() override { inform(this->message()); }
166 FaultName name() const override { return "inform fault"; }
167};
168
169using M5InformFault = M5InformFaultBase<M5DebugFault>;
170using M5InformOnceFault =
171 M5InformFaultBase<M5DebugOnceFault<M5InformFault>>;
172
126} // namespace GenericISA
127
128#endif // __ARCH_GENERIC_DEBUGFAULTS_HH__
173} // namespace GenericISA
174
175#endif // __ARCH_GENERIC_DEBUGFAULTS_HH__