aboutsummaryrefslogtreecommitdiff
path: root/qtmips_machine/qtmipsexception.h
diff options
context:
space:
mode:
authorKarel Kočí <cynerd@email.cz>2017-08-30 21:37:53 +0200
committerKarel Kočí <cynerd@email.cz>2017-08-30 21:42:02 +0200
commit9cf92379d5fcf0076c25dae0935daab446c992cd (patch)
treedd09a2e996db1e5a8117f01bec76f1e93eaca6e1 /qtmips_machine/qtmipsexception.h
downloadqtmips-9cf92379d5fcf0076c25dae0935daab446c992cd.tar.gz
qtmips-9cf92379d5fcf0076c25dae0935daab446c992cd.tar.bz2
qtmips-9cf92379d5fcf0076c25dae0935daab446c992cd.zip
Initial commit
Adding work done so far.
Diffstat (limited to 'qtmips_machine/qtmipsexception.h')
-rw-r--r--qtmips_machine/qtmipsexception.h63
1 files changed, 63 insertions, 0 deletions
diff --git a/qtmips_machine/qtmipsexception.h b/qtmips_machine/qtmipsexception.h
new file mode 100644
index 0000000..bfaa788
--- /dev/null
+++ b/qtmips_machine/qtmipsexception.h
@@ -0,0 +1,63 @@
+#ifndef QTMIPSEXCEPTION_H
+#define QTMIPSEXCEPTION_H
+
+#include <exception>
+#include <string>
+
+#define QTMIPS_EXCEPTION(TYPE, REASON, EXT) (QtMipsException ## TYPE (std::string(REASON), std::string(EXT), std::string(__FILE__), __LINE__))
+#define QTMIPS_ARGS_COMMON std::string reason, std::string ext, std::string file, int line
+
+// Base exception for all machine ones
+class QtMipsException : public std::exception {
+public:
+ QtMipsException(QTMIPS_ARGS_COMMON);
+ const char *what() const throw();
+ std::string msg(bool pos) const;
+protected:
+ std::string 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);
+};
+
+// 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);
+};
+
+// 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);
+};
+
+#define SANITY_ASSERT(COND, MSG) do { if (!(COND)) throw QTMIPS_EXCEPTION(Sanity, "Sanity check failed (" #COND ")", MSG); } while (false)
+
+#endif // QTMIPSEXCEPTION_H