aboutsummaryrefslogtreecommitdiff
path: root/qtmips_machine/qtmipsexception.h
diff options
context:
space:
mode:
Diffstat (limited to 'qtmips_machine/qtmipsexception.h')
-rw-r--r--qtmips_machine/qtmipsexception.h115
1 files changed, 50 insertions, 65 deletions
diff --git a/qtmips_machine/qtmipsexception.h b/qtmips_machine/qtmipsexception.h
index 8cfc9be..db8cf5e 100644
--- a/qtmips_machine/qtmipsexception.h
+++ b/qtmips_machine/qtmipsexception.h
@@ -6,81 +6,66 @@
namespace machine {
-#define QTMIPS_EXCEPTION(TYPE, REASON, EXT) (machine::QtMipsException ## TYPE (QString(REASON), QString(EXT), QString(__FILE__), __LINE__))
-#define QTMIPS_ARGS_COMMON QString reason, QString ext, QString file, int line
+#define QTMIPS_EXCEPTION(TYPE, REASON, EXT) (machine::QtMipsException##TYPE (QString(REASON), QString(EXT), QString(__FILE__), __LINE__))
// Base exception for all machine ones
class QtMipsException : public std::exception {
public:
- QtMipsException(QTMIPS_ARGS_COMMON);
+ QtMipsException(QString reason, QString ext, QString file, int line);
const char *what() const throw();
QString msg(bool pos) const;
protected:
- QString reason, ext, file;
+ QString name, reason, ext, file;
int line;
};
-// Exception durring input loading
-class QtMipsExceptionInput : public QtMipsException {
-public:
- QtMipsExceptionInput(QTMIPS_ARGS_COMMON);
-};
-
-// Exceptions caused by machine invalid input or unsupported action
-class QtMipsExceptionRuntime : public QtMipsException {
-public:
- QtMipsExceptionRuntime(QTMIPS_ARGS_COMMON);
-};
-
-// Decoded instruction is not supported.
-// This can be cause by really using some unimplemented instruction or because of problems in instruction decode.
-class QtMipsExceptionUnsupportedInstruction : public QtMipsExceptionRuntime {
-public:
- QtMipsExceptionUnsupportedInstruction(QTMIPS_ARGS_COMMON);
-};
-
-// Decoded ALU operation is not supported
-// This is basically same exception as QtMipsExceptionUnsupportedInstruction but it is emmited from ALU when executed and not before that.
-class QtMipsExceptionUnsupportedAluOperation : public QtMipsExceptionRuntime {
-public:
- QtMipsExceptionUnsupportedAluOperation(QTMIPS_ARGS_COMMON);
-};
-
-// Integer operation resulted to overflow (or underflow as we are working with unsigned values)
-// This is for sure caused by program it self.
-class QtMipsExceptionOverflow : public QtMipsExceptionRuntime {
-public:
- QtMipsExceptionOverflow(QTMIPS_ARGS_COMMON);
-};
-
-// Instruction is jumping to unaligned address (ADDR%4!=0)
-// This can be caused by bug or by user program as it can be jumping relative to register
-// This shouldn't be happening with non-register jumps as those should be verified by compiler
-class QtMipsExceptionUnalignedJump : public QtMipsExceptionRuntime {
-public:
- QtMipsExceptionUnalignedJump(QTMIPS_ARGS_COMMON);
-};
-
-// Used unknown MemoryAccess control value (write_ctl or read_ctl)
-// This can be raised by invalid instruction but in such case we shoul raise UnknownInstruction instead
-// So this should signal just some QtMips bug.
-class QtMipsExceptionUnknownMemoryControl : public QtMipsExceptionRuntime {
-public:
- QtMipsExceptionUnknownMemoryControl(QTMIPS_ARGS_COMMON);
-};
-
-// Trying to access address outside of the memory
-// As we are simulating whole 32bit memory address space then this is most probably QtMips bug if raised not program.
-class QtMipsExceptionOutOfMemoryAccess : public QtMipsExceptionRuntime {
-public:
- QtMipsExceptionOutOfMemoryAccess(QTMIPS_ARGS_COMMON);
-};
-
-// This is sanity check exception
-class QtMipsExceptionSanity : public QtMipsException {
-public:
- QtMipsExceptionSanity(QTMIPS_ARGS_COMMON);
-};
+/* This is list of all QtMips specific exceptions
+ *
+ * Input:
+ * Exception durring input loading
+ * Runtime:
+ * Exceptions caused by machine invalid input or unsupported action
+ * UnsupportedInstruction:
+ * Decoded instruction is not supported.
+ * This can be cause by really using some unimplemented instruction or because of problems in instruction decode.
+ * UnsupportedAluOperation:
+ * Decoded ALU operation is not supported
+ * This is basically same exception as QtMipsExceptionUnsupportedInstruction but it is emmited from ALU when executed and not before that.
+ * Overflow:
+ * Integer operation resulted to overflow (or underflow as we are working with unsigned values)
+ * This is for sure caused by program it self.
+ * UnalignedJump:
+ * Instruction is jumping to unaligned address (ADDR % 4 != 0)
+ * This can be caused by bug or by user program as it can be jumping relative to register
+ * This shouldn't be happening with non-register jumps as those should be verified by compiler
+ * UnknownMemoryControl:
+ * Used unknown MemoryAccess control value (write_ctl or read_ctl)
+ * This can be raised by invalid instruction but in such case we shoul raise UnknownInstruction instead
+ * So this should signal just some QtMips bug.
+ * OutOfMemoryAccess:
+ * Trying to access address outside of the memory
+ * As we are simulating whole 32bit memory address space then this is most probably QtMips bug if raised not program.
+ * Sanity:
+ * This is sanity check exception
+ */
+#define QTMIPS_EXCEPTIONS \
+ EXCEPTION(Input,) \
+ EXCEPTION(Runtime,) \
+ EXCEPTION(UnsupportedInstruction, Runtime) \
+ EXCEPTION(UnsupportedAluOperation, Runtime) \
+ EXCEPTION(Overflow, Runtime) \
+ EXCEPTION(UnalignedJump, Runtime) \
+ EXCEPTION(UnknownMemoryControl, Runtime) \
+ EXCEPTION(OutOfMemoryAccess, Runtime) \
+ EXCEPTION(Sanity,)
+
+#define EXCEPTION(NAME, PARENT) \
+ class QtMipsException##NAME : public QtMipsException##PARENT { \
+ public: \
+ QtMipsException##NAME(QString reason, QString ext, QString file, int line); \
+ };
+QTMIPS_EXCEPTIONS
+#undef EXCEPTION
#define SANITY_ASSERT(COND, MSG) do { if (!(COND)) throw QTMIPS_EXCEPTION(Sanity, "Sanity check failed (" #COND ")", MSG); } while (false)