51 lines
1.1 KiB
C++
51 lines
1.1 KiB
C++
/*
|
|
* CrashReport.hpp
|
|
* Structured crash report for userspace process faults
|
|
* Copyright (c) 2026 Daniel Hammer
|
|
*/
|
|
|
|
#pragma once
|
|
#include <cstdint>
|
|
#include <cstddef>
|
|
|
|
namespace CrashReport {
|
|
|
|
static constexpr int MaxReports = 8;
|
|
|
|
struct Report {
|
|
int pid;
|
|
char processName[64];
|
|
uint8_t exceptionVector;
|
|
char exceptionName[32];
|
|
|
|
uint64_t faultingAddress;
|
|
uint64_t instructionPointer;
|
|
uint64_t stackPointer;
|
|
uint64_t codeSegment;
|
|
uint64_t flags;
|
|
uint64_t stackSegment;
|
|
|
|
// Page fault error code bits (vector 0xE / page fault only)
|
|
uint8_t pfPresent : 1;
|
|
uint8_t pfWrite : 1;
|
|
uint8_t pfUser : 1;
|
|
uint8_t pfReservedWrite : 1;
|
|
uint8_t pfInstructionFetch : 1;
|
|
uint8_t pfProtectionKey : 1;
|
|
uint8_t pfShadowStack : 1;
|
|
uint8_t pfSGX : 1;
|
|
|
|
uint64_t timestampTick;
|
|
bool valid;
|
|
};
|
|
|
|
// Kernel-side ring buffer (written by exception handlers, read by SYS_CRASH_REPORT)
|
|
extern Report g_reports[MaxReports];
|
|
extern int g_reportHead;
|
|
extern int g_reportCount;
|
|
|
|
// Add a report to the kernel ring buffer
|
|
void AddReport(const Report& report);
|
|
|
|
} // namespace CrashReport
|