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();