kernel
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
26HOT
27void
29 IN int vec_num,
30 IN PTRAP_FRAME trap
31)
32
33/*++
34
35 Routine description : This function handles all traps, exceptions, and interrupts of the processor, and forwards them to the appropriate function.
36
37 Arguments:
38
39 [IN] int vec_num: Vector number that represents the interrupt.
40 [IN] PTRAP_FRAME trap: Pointer to trap frame, saved by the stub.
41
42 Return Values:
43
44 None.
45
46--*/
47
48{
49
51 assert(vec_num < 256, "An interrupt higher than 255 has been encountered, this usually means corruption in stub parameter moves.");
52
54 IRQL oldIrql;
55
56 // 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)
57 bool schedulerEnabled = cpu->schedulerEnabled;
58
59 // Save the PreviousMode to current thread.
60 PITHREAD currentThread = cpu->currentThread;
61 PRIVILEGE_MODE OldMode = KernelMode; // Default safety
62
63 if (currentThread) {
64 OldMode = currentThread->PreviousMode;
65 }
66
67 // Determine the mode for this interrupt context
68 // If we came from User land, we are now entering the kernel for the first time in this stack.
69 // If we came from Kernel mode, we are just nesting.
70 PRIVILEGE_MODE TrapMode;
71 if ((trap->cs & 0x3) == 0x3) {
72 TrapMode = UserMode;
73 }
74 else {
75 TrapMode = KernelMode;
76 }
77
78 // Set the mode for the duration of the ISR
79 if (currentThread) {
80 currentThread->PreviousMode = TrapMode;
81 }
82
83 switch (vec_num) {
85 MiDivideByZero(trap);
86 break;
88 MiDebugTrap(trap);
89 break;
91 _MeSetIrql(HIGH_LEVEL); // Non Maskable Interrupt - basically when the CPU encounters a hardware fault, cannot be masked, very alarming.
93 break;
95 MiBreakpoint(trap);
96 break;
98 MiOverflow(trap);
99 break;
101 MiBoundsCheck(trap);
102 break;
104 MiInvalidOpcode(trap);
105 break;
107 MiNoCoprocessor(trap);
108 break;
111 MiDoubleFault(trap);
112 break;
115 break;
118 break;
120 MiInvalidTss(trap);
121 break;
124 break;
126 MiPageFault(trap);
127 break;
129 // reserved, do not use.
130 break;
133 break;
135 MiAlignmentCheck(trap);
136 break;
138 _MeSetIrql(HIGH_LEVEL); // machine check, like NMI, high irql.
139 MiMachineCheck(trap);
140 break;
141 case VECTOR_CLOCK:
142 MeRaiseIrql(CLOCK_LEVEL, &oldIrql);
143 MiLapicInterrupt(schedulerEnabled, trap);
144 MeLowerIrql(oldIrql);
145 break;
146 case VECTOR_IPI:
147 MeRaiseIrql(IPI_LEVEL, &oldIrql);
149 lapic_eoi();
150 MeLowerIrql(oldIrql);
151 break;
152 case VECTOR_DPC:
153 // To see how is this triggered, check MeInsertQueueDpc or MeLowerIrql
154 assert(MeAreInterruptsEnabled() == false);
155 // Raise IRQL to DISPATCH_LEVEL
156 MeRaiseIrql(DISPATCH_LEVEL, &oldIrql);
157 // Drain DPCs while in DISPATCH
158 MeRetireDPCs();
159 assert(MeAreInterruptsEnabled() == false);
160 // Send EOI, this is called by the APIC Self BIT (so LAPIC)
161 lapic_eoi();
162 // Lower IRQL back.
163 MeLowerIrql(oldIrql);
164 break;
165 case VECTOR_APC:
166 gop_printf(COLOR_RED, "APC Vector hit.\n");
167 break;
169 // just send EOI
170 lapic_eoi();
171 break;
172 default:
173 break;
174 }
175
176 if (currentThread) {
177 currentThread->PreviousMode = OldMode;
178 }
179
180 assert(MeAreInterruptsEnabled() == false);
181 // Send An EOI
182 // TODO KINTERRUPT
183}
184
#define HOT
Definition annotations.h:48
#define USED
Definition annotations.h:39
#define IN
Definition annotations.h:8
#define assert(...)
Definition assert.h:57
GOP_PARAMS gop_local
Definition gop.c:223
@ HIGH_LEVEL
Definition core.h:22
@ DISPATCH_LEVEL
Definition core.h:17
@ IPI_LEVEL
Definition core.h:20
@ CLOCK_LEVEL
Definition core.h:19
@ PASSIVE_LEVEL
Definition core.h:15
PROCESSOR * PPROCESSOR
Definition core.h:48
enum _IRQL IRQL
ITHREAD * PITHREAD
Definition core.h:36
TRAP_FRAME * PTRAP_FRAME
Definition core.h:56
void MeRetireDPCs(void)
Definition dpc.c:223
struct _GOP_PARAMS GOP_PARAMS
void gop_printf(uint32_t color, const char *fmt,...)
Definition gop.c:633
void MiBreakpoint(PTRAP_FRAME trap)
Definition handlers.c:421
void MiNoCoprocessor(PTRAP_FRAME trap)
Definition handlers.c:457
void MiBoundsCheck(PTRAP_FRAME trap)
Definition handlers.c:448
NORETURN void MiNonMaskableInterrupt(PTRAP_FRAME trap)
Definition handlers.c:391
void MiAlignmentCheck(PTRAP_FRAME trap)
Definition handlers.c:529
void MiDebugTrap(PTRAP_FRAME trap)
Definition handlers.c:327
void MiInvalidTss(IN PTRAP_FRAME trap)
Definition handlers.c:467
void MiInvalidOpcode(PTRAP_FRAME trap)
Definition handlers.c:453
void MiCoprocessorSegmentOverrun(PTRAP_FRAME trap)
Definition handlers.c:462
void MiMachineCheck(PTRAP_FRAME trap)
Definition handlers.c:539
void MiPageFault(IN PTRAP_FRAME trap)
Definition handlers.c:155
NORETURN void MiDoubleFault(IN PTRAP_FRAME trap)
Definition handlers.c:254
void MiLapicInterrupt(bool schedulerEnabled, PTRAP_FRAME trap)
Definition handlers.c:66
void MiGeneralProtectionFault(PTRAP_FRAME trap)
Definition handlers.c:485
void MiDivideByZero(PTRAP_FRAME trap)
Definition handlers.c:286
void MiFloatingPointError(PTRAP_FRAME trap)
Definition handlers.c:523
void MiOverflow(PTRAP_FRAME trap)
Definition handlers.c:444
void MiInterprocessorInterrupt(void)
Definition handlers.c:71
void MiSegmentSelectorNotPresent(PTRAP_FRAME trap)
Definition handlers.c:473
void install_idt()
Definition idt.c:24
void MeRaiseIrql(IN IRQL NewIrql, OUT PIRQL OldIrql)
Definition irql.c:62
bool MeAreInterruptsEnabled(void)
Definition irql.c:227
void _MeSetIrql(IN IRQL NewIrql)
Definition irql.c:158
void MeLowerIrql(IN IRQL NewIrql)
Definition irql.c:102
USED HOT void MhHandleInterrupt(IN int vec_num, IN PTRAP_FRAME trap)
Definition isr.c:28
void lapic_eoi(void)
Definition apic.c:136
void init_interrupts()
Definition isr.c:185
const bool has_error_code[]
Definition isr.c:16
FORCEINLINE PPROCESSOR MeGetCurrentProcessor(void)
Definition me.h:369
#define COLOR_RED
Colors definitions for easier access.
Definition mg.h:30
@ EXCEPTION_FLOATING_POINT_ERROR
Definition mh.h:75
@ EXCEPTION_INVALID_TSS
Definition mh.h:69
@ EXCEPTION_INVALID_OPCODE
Definition mh.h:65
@ EXCEPTION_SEVERE_MACHINE_CHECK
Definition mh.h:77
@ EXCEPTION_SINGLE_STEP
Definition mh.h:60
@ EXCEPTION_NON_MASKABLE_INTERRUPT
Definition mh.h:61
@ EXCEPTION_DOUBLE_FAULT
Definition mh.h:67
@ EXCEPTION_NO_COPROCESSOR
Definition mh.h:66
@ EXCEPTION_RESERVED
Definition mh.h:74
@ EXCEPTION_SEGMENT_SELECTOR_NOTPRESENT
Definition mh.h:70
@ EXCEPTION_GENERAL_PROTECTION_FAULT
Definition mh.h:72
@ EXCEPTION_COPROCESSOR_SEGMENT_OVERRUN
Definition mh.h:68
@ EXCEPTION_DIVIDE_BY_ZERO
Definition mh.h:59
@ EXCEPTION_OVERFLOW
Definition mh.h:63
@ EXCEPTION_ALIGNMENT_CHECK
Definition mh.h:76
@ EXCEPTION_BREAKPOINT
Definition mh.h:62
@ EXCEPTION_PAGE_FAULT
Definition mh.h:73
@ EXCEPTION_BOUNDS_CHECK
Definition mh.h:64
#define VECTOR_CLOCK
Definition mh.h:37
#define VECTOR_IPI
Definition mh.h:38
#define VECTOR_DPC
Definition mh.h:36
@ LAPIC_SIV_INTERRUPT
Definition mh.h:85
#define VECTOR_APC
Definition mh.h:35
enum _PRIVILEGE_MODE PRIVILEGE_MODE
@ KernelMode
Definition mm.h:371
@ UserMode
Definition mm.h:372
enum _PRIVILEGE_MODE PreviousMode
Definition me.h:274
volatile bool schedulerEnabled
Definition me.h:284
struct _ITHREAD * currentThread
Definition me.h:285