45c45
< class MicroDebugBase : public X86ISA::X86MicroopBase
---
> class MicroDebug : public X86ISA::X86MicroopBase
48,51c48
< typedef GenericISA::M5DebugFault::DebugFunc DebugFunc;
< DebugFunc func;
< std::string message;
< uint8_t cc;
---
> std::shared_ptr<GenericISA::M5DebugFault> fault;
54,59c51,53
< MicroDebugBase(ExtMachInst machInst, const char * mnem,
< const char * instMnem, uint64_t setFlags,
< DebugFunc _func, std::string _message, uint8_t _cc) :
< X86MicroopBase(machInst, mnem, instMnem, setFlags, No_OpClass),
< func(_func), message(_message), cc(_cc)
< {}
---
> MicroDebug(ExtMachInst _machInst, const char *mnem,
> const char *instMnem, uint64_t setFlags,
> GenericISA::M5DebugFault *_fault);
60a55,60
> Fault
> execute(ExecContext *xc, Trace::InstRecord *traceData) const
> {
> return fault;
> }
>
67c67
< response << "\"" << message << "\"";
---
> response << "\"" << fault->message() << "\"";
72d71
< }};
74,75c73
< def template MicroDebugDeclare {{
< class %(class_name)s : public %(base_class)s
---
> class MicroDebugFlags : public MicroDebug
76a75,77
> protected:
> uint8_t cc;
>
78,79c79,81
< %(class_name)s(ExtMachInst _machInst, const char * instMnem,
< uint64_t setFlags, std::string _message, uint8_t _cc);
---
> MicroDebugFlags(ExtMachInst _machInst, const char *mnem,
> const char *instMnem, uint64_t setFlags,
> GenericISA::M5DebugFault *_fault, uint8_t _cc);
85c87,97
< def template MicroDebugExecute {{
---
> output decoder {{
> MicroDebug::MicroDebug(ExtMachInst _machInst, const char *mnem,
> const char *instMnem, uint64_t setFlags,
> GenericISA::M5DebugFault *_fault) :
> X86ISA::X86MicroopBase(_machInst, mnem, instMnem,
> setFlags, No_OpClass),
> fault(_fault)
> {}
> }};
>
> def template MicroDebugFlagsExecute {{
93,94c105
< return std::make_shared<GenericISA::M5DebugFault>(func,
< message);
---
> return %(base_class)s::execute(xc, traceData);
101c112
< def template MicroDebugConstructor {{
---
> def template MicroDebugFlagsConstructor {{
103,106c114,118
< ExtMachInst machInst, const char * instMnem, uint64_t setFlags,
< std::string _message, uint8_t _cc) :
< %(base_class)s(machInst, "%(func)s", instMnem,
< setFlags, %(func_num)s, _message, _cc)
---
> ExtMachInst machInst, const char *mnem,
> const char *instMnem, uint64_t setFlags,
> GenericISA::M5DebugFault *_fault, uint8_t _cc) :
> %(base_class)s(machInst, mnem, instMnem, setFlags, _fault),
> cc(_cc)
112a125,133
> iop = InstObjParams("", "MicroDebugFlags", "MicroDebug",
> {"code": "",
> "cond_test": "checkCondition(ccFlagBits | cfofBits | \
> dfBit | ecfBit | ezfBit, cc)"})
> exec_output = MicroDebugFlagsExecute.subst(iop)
> decoder_output = MicroDebugFlagsConstructor.subst(iop)
> }};
>
> let {{
114c135,137
< def __init__(self, message, flags=None):
---
> def __init__(self, name, fault, message, once, flags):
> self.name = name
> self.fault = fault
116,122c139,142
< if flags:
< if not isinstance(flags, (list, tuple)):
< raise Exception, "flags must be a list or tuple of flags"
< self.cond = " | ".join(flags)
< self.className += "Flags"
< else:
< self.cond = "0"
---
> self.once = once
> self.flags = flags
> if flags and not isinstance(flags, (list, tuple)):
> raise Exception, "flags must be a list or tuple of flags"
123a144,145
> self.className = "MicroDebugFlags" if flags else "MicroDebug"
>
125,131c147,157
< allocator = '''new %(class_name)s(machInst, macrocodeBlock,
< %(flags)s, "%(message)s", %(cc)s)''' % {
< "class_name" : self.className,
< "flags" : self.microFlagsText(microFlags),
< "message" : self.message,
< "cc" : self.cond}
< return allocator
---
> if self.once:
> fault_allocator_template = \
> "new %(fault_type)s(%(token)s, %(message)s)"
> else:
> fault_allocator_template = \
> "new %(fault_type)s(%(message)s)"
> fault_allocator = fault_allocator_template % {
> "fault_type": self.fault,
> "token": "std::string(\"%s\")" % self.message,
> "message": "\"%s\"" % self.message
> }
133,135c159,160
< exec_output = ""
< header_output = ""
< decoder_output = ""
---
> args = ["machInst", "\"%s\"" % self.name, "macrocodeBlock",
> self.microFlagsText(microFlags), fault_allocator]
137,138c162,163
< def buildDebugMicro(func, func_num):
< global exec_output, header_output, decoder_output
---
> if self.flags:
> args.append(" | ".join(self.flags))
140,149c165
< iop = InstObjParams(func, "Micro%sFlags" % func.capitalize(),
< "MicroDebugBase",
< {"code": "",
< "func": func,
< "func_num": "GenericISA::M5DebugFault::%s" % func_num,
< "cond_test": "checkCondition(ccFlagBits | cfofBits | \
< dfBit | ecfBit | ezfBit, cc)"})
< exec_output += MicroDebugExecute.subst(iop)
< header_output += MicroDebugDeclare.subst(iop)
< decoder_output += MicroDebugConstructor.subst(iop)
---
> return "new " + self.className + "(" + ", ".join(args) + ")"
151,159c167,168
< iop = InstObjParams(func, "Micro%s" % func.capitalize(),
< "MicroDebugBase",
< {"code": "",
< "func": func,
< "func_num": "GenericISA::M5DebugFault::%s" % func_num,
< "cond_test": "true"})
< exec_output += MicroDebugExecute.subst(iop)
< header_output += MicroDebugDeclare.subst(iop)
< decoder_output += MicroDebugConstructor.subst(iop)
---
> def buildDebugMicro(name, with_once=False):
> global microopClasses
160a170,171
> fault_class = "GenericISA::M5" + name.capitalize() + "Fault"
>
162c173,175
< className = "Micro%s" % func.capitalize()
---
> def __init__(self, message, flags=None):
> super(MicroDebugChild, self).__init__(
> name, fault_class, message, False, flags)
164,165c177
< global microopClasses
< microopClasses[func] = MicroDebugChild
---
> microopClasses[name] = MicroDebugChild
167,170c179,195
< buildDebugMicro("panic", "PanicFunc")
< buildDebugMicro("fatal", "FatalFunc")
< buildDebugMicro("warn", "WarnFunc")
< buildDebugMicro("warn_once", "WarnOnceFunc")
---
> if with_once:
> fault_once_class = \
> "GenericISA::M5" + name.capitalize() + "OnceFault"
> name_once = name + "_once"
>
> class MicroDebugOnceChild(MicroDebug):
> def __init__(self, message, flags=None):
> super(MicroDebugOnceChild, self).__init__(
> name_once, fault_once_class, message, True, flags)
>
> microopClasses[name_once] = MicroDebugOnceChild
>
> buildDebugMicro("panic")
> buildDebugMicro("fatal")
> buildDebugMicro("hack", True)
> buildDebugMicro("inform", True)
> buildDebugMicro("warn", True)