mirror of
https://github.com/justinian/jsix.git
synced 2025-12-10 00:14:32 -08:00
Add an implicit __LINE__ to the try_or_raise macro, which gets set in r11 on cpu_assert. Also made status lines smarter about when to call cpu_assert.
71 lines
1.4 KiB
C++
71 lines
1.4 KiB
C++
#include "error.h"
|
|
#include "console.h"
|
|
#include "kernel_args.h"
|
|
#include "status.h"
|
|
|
|
namespace boot {
|
|
namespace error {
|
|
|
|
struct error_code_desc {
|
|
uefi::status code;
|
|
const wchar_t *name;
|
|
};
|
|
|
|
struct error_code_desc error_table[] = {
|
|
#define STATUS_ERROR(name, num) { uefi::status::name, L#name },
|
|
#define STATUS_WARNING(name, num) { uefi::status::name, L#name },
|
|
#include "uefi/errors.inc"
|
|
#undef STATUS_ERROR
|
|
#undef STATUS_WARNING
|
|
{ uefi::status::success, nullptr }
|
|
};
|
|
|
|
const wchar_t *
|
|
message(uefi::status status)
|
|
{
|
|
int32_t i = -1;
|
|
while (error_table[++i].name != nullptr) {
|
|
if (error_table[i].code == status) return error_table[i].name;
|
|
}
|
|
|
|
if (uefi::is_error(status))
|
|
return L"Unknown Error";
|
|
else
|
|
return L"Unknown Warning";
|
|
}
|
|
|
|
[[ noreturn ]] static void
|
|
cpu_assert(uefi::status s, const wchar_t *message, size_t line)
|
|
{
|
|
asm volatile (
|
|
"movq $0xeeeeeeebadbadbad, %%r8;"
|
|
"movq %0, %%r9;"
|
|
"movq %1, %%r10;"
|
|
"movq %2, %%r11;"
|
|
"movq $0, %%rdx;"
|
|
"divq %%rdx;"
|
|
:
|
|
: "r"((uint64_t)s), "r"(message), "r"(line)
|
|
: "rax", "rdx", "r8", "r9", "r10");
|
|
while (1) asm("hlt");
|
|
}
|
|
|
|
[[ noreturn ]] void
|
|
raise(uefi::status status, const wchar_t *message, size_t line)
|
|
{
|
|
if(status_line::fail(message, status))
|
|
while (1) asm("hlt");
|
|
else
|
|
cpu_assert(status, message, line);
|
|
}
|
|
|
|
|
|
} // namespace error
|
|
} // namespace boot
|
|
|
|
void debug_break()
|
|
{
|
|
volatile int go = 0;
|
|
while (!go);
|
|
}
|