Files
MontaukOS/kernel/src/Api/CrashReportSyscall.hpp
T
2026-04-07 20:15:56 +02:00

49 lines
1.7 KiB
C++

/*
* CrashReportSyscall.hpp
* SYS_CRASH_REPORT
* Copyright (c) 2026 Daniel Hammer
*/
#pragma once
#include <cstdint>
#include "Syscall.hpp"
#include "../CrashReport.hpp"
namespace Montauk {
static int64_t Sys_CrashReport(CrashReportInfo* out) {
if (!out) return 0;
if (CrashReport::g_reportCount == 0) return 0;
int oldestIdx = (CrashReport::g_reportHead - CrashReport::g_reportCount + CrashReport::MaxReports) % CrashReport::MaxReports;
auto* rep = &CrashReport::g_reports[oldestIdx];
out->pid = rep->pid;
for (int i = 0; i < 64 && rep->processName[i]; i++) out->processName[i] = rep->processName[i];
out->processName[63] = '\0';
out->exceptionVector = rep->exceptionVector;
for (int i = 0; i < 32 && rep->exceptionName[i]; i++) out->exceptionName[i] = rep->exceptionName[i];
out->exceptionName[31] = '\0';
out->faultingAddress = rep->faultingAddress;
out->instructionPointer = rep->instructionPointer;
out->stackPointer = rep->stackPointer;
out->codeSegment = rep->codeSegment;
out->flags = rep->flags;
out->stackSegment = rep->stackSegment;
out->pfPresent = rep->pfPresent;
out->pfWrite = rep->pfWrite;
out->pfUser = rep->pfUser;
out->pfReservedWrite = rep->pfReservedWrite;
out->pfInstructionFetch = rep->pfInstructionFetch;
out->pfProtectionKey = rep->pfProtectionKey;
out->pfShadowStack = rep->pfShadowStack;
out->pfSGX = rep->pfSGX;
out->timestampTick = rep->timestampTick;
rep->valid = false;
CrashReport::g_reportCount--;
return CrashReport::g_reportCount + 1;
}
}