From 4af200b00188e02b2c6207dfe494a3dd12556c5f Mon Sep 17 00:00:00 2001 From: Freya Murphy Date: Mon, 30 Sep 2024 18:52:25 -0400 Subject: msim done (ish) --- msim/fault.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 msim/fault.c (limited to 'msim/fault.c') diff --git a/msim/fault.c b/msim/fault.c new file mode 100644 index 0000000..88cd340 --- /dev/null +++ b/msim/fault.c @@ -0,0 +1,56 @@ +#include "fault.h" +#include "sim.h" +#include +#include + +static struct simulator *sim; + +static void sigsegv_handler(int sig, siginfo_t *info, void *ucontext) +{ + (void) sig; + (void) ucontext; + + const char *inner = ""; + switch (info->si_code) { + case SEGV_MAPERR: + inner = ": address not mapped to object"; + break; + case SEGV_ACCERR: + inner = ": invalid premissions for mapped object"; + break; + case SEGV_BNDERR: + inner = ": failed address bound checks"; + break; + case SEGV_PKUERR: + inner = ": access was denied by memory protection"; + break; + } + + sim_dump(sim, "page fault at %p%s", info->si_addr, inner); +} + +static void sigfpe_handler(int sig, siginfo_t *info, void *ucontext) +{ + (void) sig; + (void) info; + (void) ucontext; + + sim_dump(sim, "floating point exception"); + +} + +void init_handlers(struct simulator *s) +{ + struct sigaction act = {0}; + sim = s; + + /* sigsegv */ + act.sa_sigaction = sigsegv_handler; + act.sa_flags = SA_SIGINFO; + sigaction(SIGSEGV, &act, NULL); + + /* sigfpe */ + act.sa_sigaction = sigfpe_handler; + act.sa_flags = SA_SIGINFO; + sigaction(SIGFPE, &act, NULL); +} -- cgit v1.2.3-freya