1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
#pragma once
#define DIVIDE_ZER0_EXCEPTION 0x0
#define DEBUG_EXCEPTION 0x1
#define NONMASKABLE_EXCEPTION 0x2
#define BREAKPOINT_EXCEPTION 0x3
#define OVERFLOW_EXCEPTION 0x4
#define BOUND_RANGE_EXCEPTION 0x5
#define INVALID_OPCODE_EXCEPTION 0x6
#define DEVICE_NOT_AVAILABLE_EXCEPTION 0x7
#define DOUBLE_FAULT_EXCEPTION 0x8
#define INVALID_TSS_EXCEPTION 0x10
#define SEGMENT_NOT_PRESENT_EXCEPTION 0x11
#define STACK_EXCEPTION 0xc
#define GENERAL_PROTECTION_EXCEPTION 0xd
#define PAGE_FAULT_EXCEPTION 0xe
#define X87_FLOAT_EXCEPTION 0x10
#define ALIGNMENT_CHECK_EXCEPTION 0x11
#define MACHINE_CHECK_EXCEPTION 0x12
#define SIMD_FLOAT_EXCEPTION 0x13
#ifndef __ASSEMBLER__
#include "kprint.h"
struct isr_context_param_regs
{
uint64_t r9, r8, rcx, rdx, rsi, rdi;
};
struct isr_context_caller_regs
{
uint64_t r11, r10, rax;
};
struct isr_context_callee_regs
{
uint64_t r15, r14, r13, r12, rbp, rbx;
};
struct isr_context_entry_state
{
uint64_t vector, code, rip, cs, rflags;
};
struct isr_context
{
struct isr_context_callee_regs callee_regs;
struct isr_context_caller_regs caller_regs;
struct isr_context_param_regs param_regs;
struct isr_context_entry_state entry_state;
};
static inline void print_exception_context(struct isr_context *context)
{
kprintf(
"exception %#hhx:%x context:\n"
"interrupt entry state:\n"
"rip: %#hx:%p rflags: %#0.16lx\n"
"parameter registers:\n"
"rdi: %#0.16lx rsi: %#0.16lx rdx: %#0.16lx\n"
"rcx: %#0.16lx r8: %#0.16lx r9: %#0.16lx\n"
"caller registers:\n"
"rax: %#0.16lx r10: %#0.16lx r11: %#0.16lx\n"
"callee registers:\n"
"rbx: %#0.16lx rbp: %#0.16lx r12: %#0.16lx\n"
"r13: %#0.16lx r14: %#0.16lx r15: %#0.16lx\n",
context->entry_state.vector, context->entry_state.code,
context->entry_state.cs, context->entry_state.rip,
context->entry_state.rflags,
context->param_regs.rdi, context->param_regs.rsi,
context->param_regs.rdx, context->param_regs.rcx,
context->param_regs.r8,context->param_regs.r9,
context->caller_regs.rax, context->caller_regs.r10,
context->caller_regs.r11,
context->callee_regs.rbx, context->callee_regs.rbp,
context->callee_regs.r12, context->callee_regs.r13,
context->callee_regs.r14, context->callee_regs.r15);
}
void general_protection_isr(void);
void general_protection_handler(struct isr_context *context);
void page_fault_isr(void);
void page_fault_handler(struct isr_context *context);
void exceptions_init(void);
#else
.macro EXCEPTION_DECLARE name:req, vec:req
.hidden \name\()_isr
.global \name\()_isr
.extern \name\()_handler
.type \name\()_isr, @function
.endm
#endif
|