summaryrefslogtreecommitdiff
path: root/kc/core/cpu/exceptions.h
blob: 8f7add2fd41f3fbb889cf893ea5b8599f7c7c510 (plain)
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