aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src/exception_handling/assert.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/src/exception_handling/assert.cpp')
-rw-r--r--arch/x86_64/src/exception_handling/assert.cpp24
1 files changed, 24 insertions, 0 deletions
diff --git a/arch/x86_64/src/exception_handling/assert.cpp b/arch/x86_64/src/exception_handling/assert.cpp
new file mode 100644
index 0000000..b55da49
--- /dev/null
+++ b/arch/x86_64/src/exception_handling/assert.cpp
@@ -0,0 +1,24 @@
+#include "arch/video/vga/text.hpp"
+
+namespace teachos::arch::exception_handling
+{
+ auto assert(bool condition, char const * message) -> void
+ {
+ if (condition)
+ {
+ return;
+ }
+
+ video::vga::text::write("Assert failed: ", video::vga::text::common_attributes::green_on_black);
+ video::vga::text::write(message, video::vga::text::common_attributes::green_on_black);
+ for (;;)
+ {
+ // Trick the compiler into thinking the variable is changes at run time,
+ // to prevent the while loop being optimized away
+ // See
+ // https://stackoverflow.com/questions/9495856/how-to-prevent-g-from-optimizing-out-a-loop-controlled-by-a-variable-that-can
+ // for more information.
+ asm volatile("" : "+g"(condition));
+ }
+ }
+} // namespace teachos::arch::exception_handling \ No newline at end of file