My Project
Loading...
Searching...
No Matches
isr.c
Go to the documentation of this file.
1/*
2 * PROJECT: MatanelOS Kernel
3 * LICENSE: NONE
4 * PURPOSE: IMPLEMENTATION To SETUP ISR Handler.
5 * EXPLANATION: An ISR is what handles the interrupts that gets sent from the CPU (after interrupt is sent to ISR itself), it will do stuff based if it's an exception, or a normal interrupt.
6 */
7
9#include "../../includes/mh.h"
10#include "../../includes/mg.h"
11#include "../../includes/me.h"
12#include "../../assert.h"
13
15
16const bool has_error_code[] = {
17 false, false, false, false, false, false, false, false, // 0-7
18 true, false, true, true, true, true, true, false, // 8-15
19 false, false, false, false, false, false, false, false, // 16-23
20 false, false, false, false, false, false, false, false // 24-31
21};
22
23extern void lapic_eoi(void);
24
25USED
26void
28 IN int vec_num,
29 IN PTRAP_FRAME trap
30)
31
32/*++
33
34 Routine description : This function handles all traps, exceptions, and interrupts of the processor, and forwards them to the appropriate function.
35
36 Arguments:
37
38 [IN] int vec_num: Vector number that represents the interrupt.
39 [IN] PTRAP_FRAME trap: Pointer to trap frame, saved by the stub.
40
41 Return Values:
42
43 None.
44
45--*/
46
47{
48
50
52 IRQL oldIrql;
53
54 // Save if the scheduler was enabled or not before raising to >= DISPATCH_LEVEL (because in dispatch_level and above the scheduler gets disabled to disable pre-emption)
55 bool schedulerEnabled = cpu->schedulerEnabled;
56
57 // Save the PreviousMode to current thread.
58 PRIVILEGE_MODE PreviousMode;
59
60 if ((trap->cs & 0x3) == 0x3) {
61 PreviousMode = UserMode;
62 }
63 else {
64 PreviousMode = KernelMode;
65 }
66
67 if (cpu->currentThread) {
68 cpu->currentThread->PreviousMode = PreviousMode;
69 }
70
71 switch (vec_num) {
73 MiDivideByZero(trap);
74 break;
76 MiDebugTrap(trap);
77 break;
79 _MeSetIrql(HIGH_LEVEL); // Non Maskable Interrupt - basically when the CPU encounters a hardware fault, cannot be masked, very alarming.
81 break;
83 MiBreakpoint(trap);
84 break;
86 MiOverflow(trap);
87 break;
89 MiBoundsCheck(trap);
90 break;
92 MiInvalidOpcode(trap);
93 break;
95 MiNoCoprocessor(trap);
96 break;
99 MiDoubleFault(trap);
100 break;
103 break;
106 break;
108 MiInvalidTss(trap);
109 break;
112 break;
114 MiPageFault(trap);
115 break;
117 // reserved, do not use.
118 break;
121 break;
123 MiAlignmentCheck(trap);
124 break;
126 _MeSetIrql(HIGH_LEVEL); // machine check, like NMI, high irql.
127 MiMachineCheck(trap);
128 break;
129 case LAPIC_INTERRUPT:
130 MeRaiseIrql(CLOCK_LEVEL, &oldIrql);
131 MiLapicInterrupt(schedulerEnabled, trap);
132 MeLowerIrql(oldIrql);
133 break;
134 case VECTOR_IPI:
135 MeRaiseIrql(IPI_LEVEL, &oldIrql);
137 lapic_eoi();
138 MeLowerIrql(oldIrql);
139 break;
140 case VECTOR_DPC:
141 // To see how is this triggered, check MeInsertQueueDpc or MeLowerIrql
142 assert(MeAreInterruptsEnabled() == false);
143 // Raise IRQL to DISPATCH_LEVEL
144 MeRaiseIrql(DISPATCH_LEVEL, &oldIrql);
145 // Drain DPCs while in DISPATCH
146 MeRetireDPCs();
147 // Send EOI, this is called by the APIC Self BIT (so LAPIC)
148 lapic_eoi();
149 // Lower IRQL back.
150 MeLowerIrql(oldIrql);
151 break;
152 case VECTOR_APC:
153 gop_printf(COLOR_RED, "APC Vector hit.\n");
154 break;
156 // just send EOI
157 lapic_eoi();
158 break;
159 default:
160 break;
161 }
162
163 assert(MeAreInterruptsEnabled() == false);
164 // Send An EOI
165 // TODO KINTERRUPT
166}
167
#define USED
Definition annotations.h:38
#define IN
Definition annotations.h:7
#define assert(...)
Definition assert.h:57
GOP_PARAMS gop_local
Definition gop.c:247
@ HIGH_LEVEL
Definition core.h:20
@ DISPATCH_LEVEL
Definition core.h:15
@ IPI_LEVEL
Definition core.h:18
@ CLOCK_LEVEL
Definition core.h:17
@ PASSIVE_LEVEL
Definition core.h:13
PROCESSOR * PPROCESSOR
Definition core.h:46
enum _IRQL IRQL
TRAP_FRAME * PTRAP_FRAME
Definition core.h:54
void MeRetireDPCs(void)
Definition dpc.c:222
struct _GOP_PARAMS GOP_PARAMS
void gop_printf(uint32_t color, const char *fmt,...)
Definition gop.c:694
void MiBreakpoint(PTRAP_FRAME trap)
Definition handlers.c:392
void MiNoCoprocessor(PTRAP_FRAME trap)
Definition handlers.c:429
void MiBoundsCheck(PTRAP_FRAME trap)
Definition handlers.c:420
NORETURN void MiNonMaskableInterrupt(PTRAP_FRAME trap)
Definition handlers.c:362
void MiAlignmentCheck(PTRAP_FRAME trap)
Definition handlers.c:468
void MiDebugTrap(PTRAP_FRAME trap)
Definition handlers.c:298
void MiInvalidTss(IN PTRAP_FRAME trap)
Definition handlers.c:439
void MiInvalidOpcode(PTRAP_FRAME trap)
Definition handlers.c:425
void MiCoprocessorSegmentOverrun(PTRAP_FRAME trap)
Definition handlers.c:434
void MiMachineCheck(PTRAP_FRAME trap)
Definition handlers.c:478
void MiPageFault(IN PTRAP_FRAME trap)
Definition handlers.c:155
NORETURN void MiDoubleFault(IN PTRAP_FRAME trap)
Definition handlers.c:226
void MiLapicInterrupt(bool schedulerEnabled, PTRAP_FRAME trap)
Definition handlers.c:65
void MiGeneralProtectionFault(PTRAP_FRAME trap)
Definition handlers.c:457
void MiDivideByZero(PTRAP_FRAME trap)
Definition handlers.c:258
void MiFloatingPointError(PTRAP_FRAME trap)
Definition handlers.c:462
void MiOverflow(PTRAP_FRAME trap)
Definition handlers.c:416
void MiInterprocessorInterrupt(void)
Definition handlers.c:70
void MiSegmentSelectorNotPresent(PTRAP_FRAME trap)
Definition handlers.c:445
void install_idt()
Definition idt.c:24
void MeRaiseIrql(IN IRQL NewIrql, OUT PIRQL OldIrql)
Definition irql.c:57
bool MeAreInterruptsEnabled(void)
Definition irql.c:210
void _MeSetIrql(IN IRQL NewIrql)
Definition irql.c:153
void MeLowerIrql(IN IRQL NewIrql)
Definition irql.c:97
USED void MhHandleInterrupt(IN int vec_num, IN PTRAP_FRAME trap)
Definition isr.c:27
void lapic_eoi(void)
Definition apic.c:136
void init_interrupts()
Definition isr.c:168
const bool has_error_code[]
Definition isr.c:16
FORCEINLINE PPROCESSOR MeGetCurrentProcessor(void)
Definition me.h:356
#define COLOR_RED
Colors definitions for easier access.
Definition mg.h:29
@ EXCEPTION_FLOATING_POINT_ERROR
Definition mh.h:77
@ EXCEPTION_INVALID_TSS
Definition mh.h:71
@ EXCEPTION_INVALID_OPCODE
Definition mh.h:67
@ EXCEPTION_SEVERE_MACHINE_CHECK
Definition mh.h:79
@ EXCEPTION_SINGLE_STEP
Definition mh.h:62
@ EXCEPTION_NON_MASKABLE_INTERRUPT
Definition mh.h:63
@ EXCEPTION_DOUBLE_FAULT
Definition mh.h:69
@ EXCEPTION_NO_COPROCESSOR
Definition mh.h:68
@ EXCEPTION_RESERVED
Definition mh.h:76
@ EXCEPTION_SEGMENT_SELECTOR_NOTPRESENT
Definition mh.h:72
@ EXCEPTION_GENERAL_PROTECTION_FAULT
Definition mh.h:74
@ EXCEPTION_COPROCESSOR_SEGMENT_OVERRUN
Definition mh.h:70
@ EXCEPTION_DIVIDE_BY_ZERO
Definition mh.h:61
@ EXCEPTION_OVERFLOW
Definition mh.h:65
@ EXCEPTION_ALIGNMENT_CHECK
Definition mh.h:78
@ EXCEPTION_BREAKPOINT
Definition mh.h:64
@ EXCEPTION_PAGE_FAULT
Definition mh.h:75
@ EXCEPTION_BOUNDS_CHECK
Definition mh.h:66
#define VECTOR_IPI
Definition mh.h:49
#define VECTOR_DPC
Definition mh.h:47
@ LAPIC_SIV_INTERRUPT
Definition mh.h:88
@ LAPIC_INTERRUPT
Definition mh.h:87
#define VECTOR_APC
Definition mh.h:48
enum _PRIVILEGE_MODE PRIVILEGE_MODE
@ KernelMode
Definition mm.h:333
@ UserMode
Definition mm.h:334
enum _PRIVILEGE_MODE PreviousMode
Definition me.h:269
volatile bool schedulerEnabled
Definition me.h:277
struct _ITHREAD * currentThread
Definition me.h:278