summaryrefslogtreecommitdiff
path: root/src/sys/arch/amd64/cpu
diff options
context:
space:
mode:
Diffstat (limited to 'src/sys/arch/amd64/cpu')
-rw-r--r--src/sys/arch/amd64/cpu/cpu_conf.c3
-rw-r--r--src/sys/arch/amd64/cpu/trap.c24
2 files changed, 26 insertions, 1 deletions
diff --git a/src/sys/arch/amd64/cpu/cpu_conf.c b/src/sys/arch/amd64/cpu/cpu_conf.c
index da2d747..8a3b4e6 100644
--- a/src/sys/arch/amd64/cpu/cpu_conf.c
+++ b/src/sys/arch/amd64/cpu/cpu_conf.c
@@ -44,7 +44,9 @@
extern void syscall_isr(void);
extern void core_halt_isr(void);
+
void core_halt_handler(void);
+int simd_init(void);
void
core_halt_handler(void)
@@ -193,6 +195,7 @@ cpu_conf(struct pcore *pcore)
pcore->self = pcore;
wrmsr(IA32_GS_BASE, (uintptr_t)pcore);
+ simd_init();
init_vectors();
idt_load();
cpu_identify(mdcore);
diff --git a/src/sys/arch/amd64/cpu/trap.c b/src/sys/arch/amd64/cpu/trap.c
index ae3a0cc..94c6e83 100644
--- a/src/sys/arch/amd64/cpu/trap.c
+++ b/src/sys/arch/amd64/cpu/trap.c
@@ -34,6 +34,7 @@
#include <sys/param.h>
#include <sys/cdefs.h>
+#include <sys/errno.h>
#include <sys/panic.h>
#include <sys/cpuvar.h>
#include <sys/syslog.h>
@@ -148,6 +149,26 @@ trapframe_dump(struct trapframe *tf)
tf->rbp, tf->rsp, tf->rip);
}
+/*
+ * Handle user faults
+ */
+static void
+handle_ufault(void)
+{
+ struct proc *self = proc_self();
+
+ if (__unlikely(self == NULL)) {
+ panic("could not get self on fault\n");
+ }
+
+ syslog_toggle(true);
+ printf("** hardware violation **\n");
+ syslog_toggle(false);
+
+ proc_kill(self, -EFAULT);
+ __builtin_unreachable();
+}
+
void
trap_syscall(struct trapframe *tf)
{
@@ -194,7 +215,8 @@ trap_handler(struct trapframe *tf)
{
trapframe_dump(tf);
if (ISSET(tf->cs, 3)) {
- panic("fatal user trap\n");
+ handle_ufault();
+ __builtin_unreachable();
}
panic("fatal trap\n");