diff --git a/fusee_cpp/program/source/fusee_crt0.cpp b/fusee_cpp/program/source/fusee_crt0.cpp index 791faa796..58cad7488 100644 --- a/fusee_cpp/program/source/fusee_crt0.cpp +++ b/fusee_cpp/program/source/fusee_crt0.cpp @@ -14,14 +14,35 @@ * along with this program. If not, see . */ #include +#include "fusee_exception_handler.hpp" extern "C" void __libc_init_array(); namespace ams::nxboot::crt0 { + namespace { + + ALWAYS_INLINE void SetExceptionVector(u32 which, uintptr_t impl) { + reg::Write(secmon::MemoryRegionPhysicalDeviceExceptionVectors.GetAddress() + 0x200 + sizeof(u32) * which, static_cast(impl)); + } + + } + void Initialize(uintptr_t bss_start, uintptr_t bss_end) { /* TODO: Collect timing information? */ + /* Setup exception vectors. */ + { + SetExceptionVector(0, reinterpret_cast(::ams::nxboot::ExceptionHandler0)); + SetExceptionVector(1, reinterpret_cast(::ams::nxboot::ExceptionHandler1)); + SetExceptionVector(2, reinterpret_cast(::ams::nxboot::ExceptionHandler2)); + SetExceptionVector(3, reinterpret_cast(::ams::nxboot::ExceptionHandler3)); + SetExceptionVector(4, reinterpret_cast(::ams::nxboot::ExceptionHandler4)); + SetExceptionVector(5, reinterpret_cast(::ams::nxboot::ExceptionHandler5)); + SetExceptionVector(6, reinterpret_cast(::ams::nxboot::ExceptionHandler6)); + SetExceptionVector(7, reinterpret_cast(::ams::nxboot::ExceptionHandler7)); + } + /* Clear bss. */ std::memset(reinterpret_cast(bss_start), 0, bss_end - bss_start); diff --git a/fusee_cpp/program/source/fusee_exception_handler.hpp b/fusee_cpp/program/source/fusee_exception_handler.hpp index 6695f1e5f..168edc206 100644 --- a/fusee_cpp/program/source/fusee_exception_handler.hpp +++ b/fusee_cpp/program/source/fusee_exception_handler.hpp @@ -16,7 +16,7 @@ #include #pragma once -namespace ams::nxboot::loader { +namespace ams::nxboot { NORETURN void ExceptionHandler();