aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src/exception_handling/assert.cpp
blob: b55da493ae272d8f7735a3ac21180224d9e3157e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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