sp1/amd64: Add processor exception handling
Signed-off-by: Ian Moffett <ian@mirocom.org>
This commit is contained in:
@@ -89,6 +89,9 @@ mu_cpu_preinit(struct cpu_info *ci)
|
|||||||
/* Log out some information */
|
/* Log out some information */
|
||||||
cpu_print_info(ci);
|
cpu_print_info(ci);
|
||||||
|
|
||||||
|
/* Set interrupt vectors */
|
||||||
|
md_set_vectors();
|
||||||
|
|
||||||
/* Load the IDT */
|
/* Load the IDT */
|
||||||
md_idt_load();
|
md_idt_load();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2026, Mirocom Laboratories
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* The following sources are CONFIDENTIAL and PROPRIETARY
|
||||||
|
* property of Mirocom Laboratories. Unauthorized copying,
|
||||||
|
* use, distribution or modification of this file, in whole
|
||||||
|
* and in part, is strictly prohibited without the prior written
|
||||||
|
* consent from Mirocom Laboratories.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <os/knot.h>
|
||||||
|
#include <machine/frame.h>
|
||||||
|
#include <machine/trap.h>
|
||||||
|
|
||||||
|
/* Used to convert trap codes to strings */
|
||||||
|
static const char *traptab[] = {
|
||||||
|
[TRAP_DIVERR] = "divide error",
|
||||||
|
[TRAP_DBG] = "debug exception",
|
||||||
|
[TRAP_NMI] = "non-maskable interrupt",
|
||||||
|
[TRAP_BP] = "breakpoint",
|
||||||
|
[TRAP_OF] = "overflow",
|
||||||
|
[TRAP_BR] = "bound range exceeded",
|
||||||
|
[TRAP_UD] = "undefined opcode",
|
||||||
|
[TRAP_NM] = "no math coprocessor",
|
||||||
|
[TRAP_DF] = "double fault",
|
||||||
|
[TRAP_CPR] = "reserved exception",
|
||||||
|
[TRAP_TS] = "invalid TSS",
|
||||||
|
[TRAP_NP] = "segment not present",
|
||||||
|
[TRAP_SS] = "stack segment fault",
|
||||||
|
[TRAP_GP] = "general protection fault",
|
||||||
|
[TRAP_PF] = "page fault"
|
||||||
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
trap_dispatch(struct trapframe *tf)
|
||||||
|
{
|
||||||
|
const char *str;
|
||||||
|
|
||||||
|
if (tf->vector >= NELEM(traptab)) {
|
||||||
|
knot("fatal unknown vector %x\n", tf->vector);
|
||||||
|
}
|
||||||
|
|
||||||
|
knot("fatal %s\n", traptab[tf->vector]);
|
||||||
|
}
|
||||||
@@ -0,0 +1,244 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2026, Mirocom Laboratories
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* The following sources are CONFIDENTIAL and PROPRIETARY
|
||||||
|
* property of Mirocom Laboratories. Unauthorized copying,
|
||||||
|
* use, distribution or modification of this file, in whole
|
||||||
|
* and in part, is strictly prohibited without the prior written
|
||||||
|
* consent from Mirocom Laboratories.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <machine/idt.h>
|
||||||
|
#include <machine/kfence.h>
|
||||||
|
|
||||||
|
.macro set_trap vector, isr, ist
|
||||||
|
mov $\vector, %rdi
|
||||||
|
lea \isr(%rip), %rsi
|
||||||
|
mov $IDT_TRAP_GATE, %rdx
|
||||||
|
mov $\ist, %rcx
|
||||||
|
call md_idt_set_gate
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro push_trapframe vector
|
||||||
|
.if \vector == 10 || \vector == 11 || \vector == 12 || \vector == 13 \
|
||||||
|
|| \vector == 14
|
||||||
|
subq $8, %rsp
|
||||||
|
.endif
|
||||||
|
|
||||||
|
push %rax
|
||||||
|
push %rbx
|
||||||
|
push %rcx
|
||||||
|
push %rdx
|
||||||
|
push %rsi
|
||||||
|
push %rdi
|
||||||
|
push %rbp
|
||||||
|
push %r8
|
||||||
|
push %r9
|
||||||
|
push %r10
|
||||||
|
push %r11
|
||||||
|
push %r12
|
||||||
|
push %r13
|
||||||
|
push %r14
|
||||||
|
push %r15
|
||||||
|
push $\vector
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro pop_trapframe vector
|
||||||
|
.if \vector == 10 || \vector == 11 || \vector == 12 || \vector == 13 \
|
||||||
|
|| \vector == 14
|
||||||
|
addq $8, %rsp
|
||||||
|
.endif
|
||||||
|
|
||||||
|
add $8, %rsp
|
||||||
|
pop %r15
|
||||||
|
pop %r14
|
||||||
|
pop %r13
|
||||||
|
pop %r12
|
||||||
|
pop %r11
|
||||||
|
pop %r10
|
||||||
|
pop %r9
|
||||||
|
pop %r8
|
||||||
|
pop %rbp
|
||||||
|
pop %rdi
|
||||||
|
pop %rsi
|
||||||
|
pop %rdx
|
||||||
|
pop %rcx
|
||||||
|
pop %rbx
|
||||||
|
pop %rax
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.text
|
||||||
|
.globl md_set_vectors
|
||||||
|
md_set_vectors:
|
||||||
|
push %r12
|
||||||
|
push %r13
|
||||||
|
push %r14
|
||||||
|
push %r15
|
||||||
|
push %rbx
|
||||||
|
push %rbp
|
||||||
|
|
||||||
|
set_trap 0x00, diverr, 0
|
||||||
|
set_trap 0x01, debug_except, 0
|
||||||
|
set_trap 0x02, nmi, 0
|
||||||
|
set_trap 0x03, breakpoint, 0
|
||||||
|
set_trap 0x04, overflow, 0
|
||||||
|
set_trap 0x05, bound_range, 0
|
||||||
|
set_trap 0x06, invalid_tss, 0
|
||||||
|
set_trap 0x07, no_coproc, 0
|
||||||
|
set_trap 0x08, double_fault, 0
|
||||||
|
set_trap 0x0A, invalid_tss, 0
|
||||||
|
set_trap 0x0B, seg_np, 0
|
||||||
|
set_trap 0x0C, ss_fault, 0
|
||||||
|
set_trap 0x0D, gpf, 0
|
||||||
|
set_trap 0x0E, page_fault, 0
|
||||||
|
|
||||||
|
pop %rbp
|
||||||
|
pop %rbx
|
||||||
|
pop %r15
|
||||||
|
pop %r14
|
||||||
|
pop %r13
|
||||||
|
pop %r12
|
||||||
|
retq
|
||||||
|
|
||||||
|
.align 8
|
||||||
|
diverr:
|
||||||
|
KFENCE
|
||||||
|
push_trapframe 0x00
|
||||||
|
mov %rsp, %rdi
|
||||||
|
call trap_dispatch
|
||||||
|
KFENCE
|
||||||
|
1: cli
|
||||||
|
hlt
|
||||||
|
jmp 1b
|
||||||
|
|
||||||
|
debug_except:
|
||||||
|
KFENCE
|
||||||
|
push_trapframe 0x1
|
||||||
|
mov %rsp, %rdi
|
||||||
|
call trap_dispatch
|
||||||
|
KFENCE
|
||||||
|
1: cli
|
||||||
|
hlt
|
||||||
|
jmp 1b
|
||||||
|
|
||||||
|
nmi:
|
||||||
|
KFENCE
|
||||||
|
push_trapframe 0x2
|
||||||
|
mov %rsp, %rdi
|
||||||
|
call trap_dispatch
|
||||||
|
KFENCE
|
||||||
|
1: cli
|
||||||
|
hlt
|
||||||
|
jmp 1b
|
||||||
|
|
||||||
|
breakpoint:
|
||||||
|
KFENCE
|
||||||
|
push_trapframe 0x3
|
||||||
|
mov %rsp, %rdi
|
||||||
|
call trap_dispatch
|
||||||
|
KFENCE
|
||||||
|
1: cli
|
||||||
|
hlt
|
||||||
|
jmp 1b
|
||||||
|
|
||||||
|
overflow:
|
||||||
|
KFENCE
|
||||||
|
push_trapframe 0x4
|
||||||
|
mov %rsp, %rdi
|
||||||
|
call trap_dispatch
|
||||||
|
KFENCE
|
||||||
|
1: cli
|
||||||
|
hlt
|
||||||
|
jmp 1b
|
||||||
|
|
||||||
|
bound_range:
|
||||||
|
KFENCE
|
||||||
|
push_trapframe 0x5
|
||||||
|
mov %rsp, %rdi
|
||||||
|
call trap_dispatch
|
||||||
|
KFENCE
|
||||||
|
1: cli
|
||||||
|
hlt
|
||||||
|
jmp 1b
|
||||||
|
|
||||||
|
invl_opc:
|
||||||
|
KFENCE
|
||||||
|
push_trapframe 0x6
|
||||||
|
mov %rsp, %rdi
|
||||||
|
call trap_dispatch
|
||||||
|
KFENCE
|
||||||
|
1: cli
|
||||||
|
hlt
|
||||||
|
jmp 1b
|
||||||
|
|
||||||
|
no_coproc:
|
||||||
|
KFENCE
|
||||||
|
push_trapframe 0x7
|
||||||
|
mov %rsp, %rdi
|
||||||
|
call trap_dispatch
|
||||||
|
KFENCE
|
||||||
|
1: cli
|
||||||
|
hlt
|
||||||
|
jmp 1b
|
||||||
|
|
||||||
|
double_fault:
|
||||||
|
KFENCE_EC
|
||||||
|
push_trapframe 0x8
|
||||||
|
mov %rsp, %rdi
|
||||||
|
call trap_dispatch
|
||||||
|
KFENCE_EC
|
||||||
|
1: cli
|
||||||
|
hlt
|
||||||
|
jmp 1b
|
||||||
|
|
||||||
|
invalid_tss:
|
||||||
|
KFENCE_EC
|
||||||
|
push_trapframe 0xA
|
||||||
|
mov %rsp, %rdi
|
||||||
|
call trap_dispatch
|
||||||
|
KFENCE_EC
|
||||||
|
1: cli
|
||||||
|
hlt
|
||||||
|
jmp 1b
|
||||||
|
|
||||||
|
seg_np:
|
||||||
|
KFENCE_EC
|
||||||
|
push_trapframe 0xB
|
||||||
|
mov %rsp, %rdi
|
||||||
|
call trap_dispatch
|
||||||
|
KFENCE_EC
|
||||||
|
1: cli
|
||||||
|
hlt
|
||||||
|
jmp 1b
|
||||||
|
|
||||||
|
ss_fault:
|
||||||
|
KFENCE_EC
|
||||||
|
push_trapframe 0xC
|
||||||
|
mov %rsp, %rdi
|
||||||
|
call trap_dispatch
|
||||||
|
KFENCE_EC
|
||||||
|
1: cli
|
||||||
|
hlt
|
||||||
|
jmp 1b
|
||||||
|
|
||||||
|
gpf:
|
||||||
|
KFENCE_EC
|
||||||
|
push_trapframe 0xD
|
||||||
|
mov %rsp, %rdi
|
||||||
|
call trap_dispatch
|
||||||
|
KFENCE_EC
|
||||||
|
1: cli
|
||||||
|
hlt
|
||||||
|
jmp 1b
|
||||||
|
|
||||||
|
page_fault:
|
||||||
|
KFENCE_EC
|
||||||
|
push_trapframe 0xE
|
||||||
|
mov %rsp, %rdi
|
||||||
|
call trap_dispatch
|
||||||
|
KFENCE_EC
|
||||||
|
1: cli
|
||||||
|
hlt
|
||||||
|
jmp 1b
|
||||||
|
hlt
|
||||||
@@ -61,5 +61,11 @@ void md_idt_set_gate(uint8_t vector, uintptr_t isr, uint8_t type, uint8_t ist);
|
|||||||
*/
|
*/
|
||||||
void md_idt_load(void);
|
void md_idt_load(void);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set all interrupt vectors
|
||||||
|
*/
|
||||||
|
void md_set_vectors(void);
|
||||||
|
|
||||||
#endif /* !__ASSEMBLER__ */
|
#endif /* !__ASSEMBLER__ */
|
||||||
#endif /* !_MACHINE_IDT_H_ */
|
#endif /* !_MACHINE_IDT_H_ */
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2026, Mirocom Laboratories
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* The following sources are CONFIDENTIAL and PROPRIETARY
|
||||||
|
* property of Mirocom Laboratories. Unauthorized copying,
|
||||||
|
* use, distribution or modification of this file, in whole
|
||||||
|
* and in part, is strictly prohibited without the prior written
|
||||||
|
* consent from Mirocom Laboratories.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _MACHINE_TRAP_H_
|
||||||
|
#define _MACHINE_TRAP_H_ 1
|
||||||
|
|
||||||
|
#define TRAP_DIVERR 0x00 /* Divide error */
|
||||||
|
#define TRAP_DBG 0x01 /* Debug exception */
|
||||||
|
#define TRAP_NMI 0x02 /* Non-maskable interrupt */
|
||||||
|
#define TRAP_BP 0x03 /* Breakpoint */
|
||||||
|
#define TRAP_OF 0x04 /* Overflow */
|
||||||
|
#define TRAP_BR 0x05 /* BOUND range exceeded */
|
||||||
|
#define TRAP_UD 0x06 /* Undefined opcode */
|
||||||
|
#define TRAP_NM 0x07 /* No math coprocessor */
|
||||||
|
#define TRAP_DF 0x08 /* Double fault */
|
||||||
|
#define TRAP_CPR 0x09 /* Reserved */
|
||||||
|
#define TRAP_TS 0x0A /* Invalid TSS */
|
||||||
|
#define TRAP_NP 0x0B /* Segment not present */
|
||||||
|
#define TRAP_SS 0x0C /* Stack segment fault */
|
||||||
|
#define TRAP_GP 0x0D /* General protection fault */
|
||||||
|
#define TRAP_PF 0x0E /* Page fault */
|
||||||
|
|
||||||
|
#endif /* !_MACHINE_TRAP_H_ */
|
||||||
Reference in New Issue
Block a user