KernOS
interrupt.h
Go to the documentation of this file.
1
//
2
// Created on 5/19/20.
3
//
4
5
#ifndef KERNOS_INTERRUPT_H
6
#define KERNOS_INTERRUPT_H
7
8
#include <
common.h
>
9
#include <
utilities.h
>
10
#include <
registers.h
>
11
#include <
ports.h
>
12
#include <
pic.h
>
13
16
namespace
INTRP
// interrupt
17
{
18
enum
IVT
: uint8_t
19
{
20
// reserve exceptions
21
RESERVED_START
= 0x0,
22
DIV_0_FAULT
=
RESERVED_START
,
23
DEBUG_TRAP
= 0x1,
24
NMI_INTERRUPT
= 0x2,
25
BREAKPOINT_TRAP
= 0x3,
26
OVERFLOW_TRAP
= 0x4,
27
OUT_OF_BOUNDS_FAULT
= 0x5,
28
INVALID_OPCODE_FAULT
= 0x6,
29
NO_MATH_COP_FAULT
= 0x7,
30
DOUBLE_FAULT
= 0x8,
31
COP_SEG_OVERRUN_FAULT
= 0x9,
32
INVALID_TSS_FAULT
= 0x0A,
33
SEG_NOT_PRESENT_FAULT
= 0x0B,
34
STACK_SEG_FAULT
= 0x0C,
35
GEN_PROTECTION_FAULT
= 0x0D,
36
PAGE_FAULT
= 0x0E,
37
RESERVED
= 0x0F,
38
MATH_FAULT
= 0x10,
39
ALIGNMENT_CHECK_FAULT
= 0x11,
40
MACHINE_CHECK_ABORT
= 0x12,
41
SIMD_FP_XF_FAULT
= 0x13,
42
RESERVED_END
= 0x1F,
43
44
// user-defined interrupts
45
PIC1_OFFSET
= 0x20,
46
USER_DEFINED_START
=
PIC1_OFFSET
,
47
TIMER
= 0x20,
48
KEYBOARD
= 0x21,
49
PIC2_CASCADE
= 0x22,
50
SERIAL2
= 0x23,
51
SERIAL1
= 0x24,
52
PARALLEL2
= 0x25,
53
DISKETTE
= 0x26,
54
PARALLEL1
= 0x27,
55
56
PIC2_OFFSET
= 0x28,
57
CMOS
= 0x28,
58
CGA
= 0x29,
59
RESERVED1
= 0x2A,
60
RESERVED2
= 0x2B,
61
PS2
= 0x2C,
62
FPU
= 0x2D,
63
HARDDISK
= 0x2E,
64
RESERVED3
= 0x2F,
65
66
USER_DEFINED_END
= 0xFF
67
};
68
69
static_assert(
IVT::USER_DEFINED_START
== (
IVT::RESERVED_END
+ 1));
70
71
const
uint16_t
IDT_ENTRIES
= 256;
72
83
union
[[gnu::packed]]
DescriptorEntry
84
{
85
struct
86
{
87
uint16_t
m_OffsetLow
;
88
uint16_t
m_CS_Selector
;
89
uint8_t
m_Reserve
;
90
uint8_t
m_Access
;
91
uint16_t
m_OffsetHigh
;
92
};
93
struct
94
{
95
uint32_t
Low
;
96
uint32_t
High
;
97
};
98
};
99
103
class
Mask
104
{
105
private
:
106
bool
m_InterruptFlag;
107
108
public
:
109
Mask
() : m_InterruptFlag (FlagsRegister() &
FLAGS
::
IF
)
110
{
111
#ifndef TEST_BUILD // TODO: have cleaner test_build setup
112
cli();
113
#endif
114
}
115
116
~Mask
()
117
{
118
#ifndef TEST_BUILD
119
if
(m_InterruptFlag)
// restore interrupts if enabled previously
120
sti();
121
#endif
122
}
123
124
};
125
126
void
RegisterHandler
(
DescriptorEntry
IdtTable[],
size_t
Idx,
func_ptr
Handler);
127
128
}
// namespace INTRP
129
130
struct
IrqPort
131
{
132
uint16_t m_CsrPort {0};
133
uint16_t m_DataPort {0};
134
uint8_t m_IrqNumber {0};
135
136
consteval
IrqPort
(
const
INTRP::IVT
Irq)
137
{
138
if
(Irq <
INTRP::IVT::PIC1_OFFSET
)
139
{
140
}
141
else
if
(Irq <
INTRP::IVT::PIC2_OFFSET
)
142
{
143
m_CsrPort =
PORTS::PIC1_COMMAND
;
144
m_DataPort =
PORTS::PIC1_DATA
;
145
m_IrqNumber = Irq -
INTRP::IVT::PIC1_OFFSET
;
146
}
147
else
148
{
149
m_CsrPort =
PORTS::PIC2_COMMAND
;
150
m_DataPort =
PORTS::PIC2_DATA
;
151
m_IrqNumber = Irq -
INTRP::IVT::PIC2_OFFSET
;
152
}
153
}
154
};
155
156
inline
void
UnmaskInterrupt
(
const
IrqPort
Irq)
157
{
158
uint8_t Imr = in8(Irq.
m_DataPort
);
159
160
Imr &= ~(1 << Irq.
m_IrqNumber
);
161
162
out8(Irq.
m_DataPort
, Imr);
163
}
164
165
class
IRQScope
166
{
167
private
:
168
const
IrqPort
m_Irq;
169
170
public
:
171
explicit
IRQScope
(
const
IrqPort
IRQNumber) :
172
m_Irq (IRQNumber)
173
{
174
}
175
176
~IRQScope
()
177
{
178
out8(m_Irq.
m_CsrPort
,
PIC::OCW2::NON_SPECIFIC_EOI
);
179
}
180
};
181
182
183
namespace
INIT
184
{
192
void
idt
();
193
}
194
195
196
#endif //KERNOS_INTERRUPT_H
INTRP::DISKETTE
Definition:
interrupt.h:53
PORTS::PIC1_DATA
Definition:
ports.h:14
pic.h
INTRP::USER_DEFINED_END
0xFF
Definition:
interrupt.h:66
INTRP::DescriptorEntry::m_CS_Selector
uint16_t m_CS_Selector
Definition:
interrupt.h:88
INTRP::COP_SEG_OVERRUN_FAULT
0x9
Definition:
interrupt.h:31
FLAGS::IF
interrupt enable flag
Definition:
registers.h:61
IRQScope
Definition:
interrupt.h:165
INTRP::SEG_NOT_PRESENT_FAULT
0x0B
Definition:
interrupt.h:33
INTRP::Mask::Mask
Mask()
Definition:
interrupt.h:109
INTRP::CGA
Definition:
interrupt.h:58
utilities.h
INTRP::PIC1_OFFSET
0x20
Definition:
interrupt.h:45
INTRP::RegisterHandler
void RegisterHandler(DescriptorEntry IdtTable[], size_t Idx, func_ptr Handler)
Creates interrupt descriptor entries in idt_table, and loads into CPU.
Definition:
interrupt.cpp:29
IrqPort
Definition:
interrupt.h:130
INTRP::GEN_PROTECTION_FAULT
0x0D
Definition:
interrupt.h:35
INTRP::DescriptorEntry::High
uint32_t High
Definition:
interrupt.h:96
INTRP::DIV_0_FAULT
0x0
Definition:
interrupt.h:22
INTRP::BREAKPOINT_TRAP
0x3
Definition:
interrupt.h:25
INTRP::DescriptorEntry::m_OffsetHigh
uint16_t m_OffsetHigh
Definition:
interrupt.h:91
INTRP::ALIGNMENT_CHECK_FAULT
0x11
Definition:
interrupt.h:39
PORTS::PIC2_COMMAND
Definition:
ports.h:15
registers.h
INTRP::IVT
IVT
Definition:
interrupt.h:18
IRQScope::IRQScope
IRQScope(const IrqPort IRQNumber)
Definition:
interrupt.h:171
INTRP::INVALID_OPCODE_FAULT
0x6
Definition:
interrupt.h:28
func_ptr
void(*)() func_ptr
Definition:
ktypes.h:16
PIC::NON_SPECIFIC_EOI
0x20
Definition:
pic.h:98
INIT::idt
void idt()
Creates interrupt descriptor table and loads to CPU.
Definition:
interrupt.cpp:126
INTRP
interrupt namespace
Definition:
interrupt.h:16
INTRP::OVERFLOW_TRAP
0x4
Definition:
interrupt.h:26
IRQScope::~IRQScope
~IRQScope()
Definition:
interrupt.h:176
INTRP::Mask
Disables interrupt on construction, restores previous interrupt mask on scope exit.
Definition:
interrupt.h:103
INTRP::DescriptorEntry::m_Access
uint8_t m_Access
Definition:
interrupt.h:90
IrqPort::m_DataPort
uint16_t m_DataPort
Definition:
interrupt.h:133
INTRP::INVALID_TSS_FAULT
0x0A
Definition:
interrupt.h:32
INTRP::MATH_FAULT
0x10
Definition:
interrupt.h:38
INTRP::SIMD_FP_XF_FAULT
0x13
Definition:
interrupt.h:41
INTRP::DescriptorEntry::m_Reserve
uint8_t m_Reserve
Definition:
interrupt.h:89
INTRP::RESERVED3
Definition:
interrupt.h:64
INTRP::PIC2_OFFSET
0x28
Definition:
interrupt.h:56
INTRP::PS2
Definition:
interrupt.h:61
INTRP::IDT_ENTRIES
const uint16_t IDT_ENTRIES
Definition:
interrupt.h:71
INTRP::DescriptorEntry::Low
uint32_t Low
Definition:
interrupt.h:95
INTRP::DOUBLE_FAULT
0x8
Definition:
interrupt.h:30
IrqPort::m_IrqNumber
uint8_t m_IrqNumber
Definition:
interrupt.h:134
INIT
contains all kernel initialization routines
Definition:
cpu.h:10
UnmaskInterrupt
void UnmaskInterrupt(const IrqPort Irq)
Definition:
interrupt.h:156
TIMER
Timer namespace.
Definition:
pit.h:10
INTRP::SERIAL2
Definition:
interrupt.h:50
INTRP::PARALLEL2
Definition:
interrupt.h:52
INTRP::PAGE_FAULT
0x0E
Definition:
interrupt.h:36
FLAGS
CPU Flags register.
Definition:
registers.h:51
INTRP::DescriptorEntry::m_OffsetLow
uint16_t m_OffsetLow
Definition:
interrupt.h:87
INTRP::RESERVED2
Definition:
interrupt.h:60
INTRP::NO_MATH_COP_FAULT
0x7
Definition:
interrupt.h:29
INTRP::RESERVED1
Definition:
interrupt.h:59
ports.h
INTRP::RESERVED_END
0x1F
Definition:
interrupt.h:42
INTRP::DEBUG_TRAP
0x1
Definition:
interrupt.h:23
INTRP::Mask::~Mask
~Mask()
Definition:
interrupt.h:116
INTRP::MACHINE_CHECK_ABORT
0x12
Definition:
interrupt.h:40
INTRP::STACK_SEG_FAULT
0x0C
Definition:
interrupt.h:34
IrqPort::IrqPort
consteval IrqPort(const INTRP::IVT Irq)
Definition:
interrupt.h:136
INTRP::RESERVED
0x0F
Definition:
interrupt.h:37
INTRP::FPU
Definition:
interrupt.h:62
INTRP::KEYBOARD
Definition:
interrupt.h:48
INTRP::DescriptorEntry
Exception and interrupt gate descriptor entry.
Definition:
interrupt.h:83
common.h
INTRP::NMI_INTERRUPT
0x2
Definition:
interrupt.h:24
PORTS::PIC2_DATA
Definition:
ports.h:16
INTRP::SERIAL1
Definition:
interrupt.h:51
INTRP::USER_DEFINED_START
Definition:
interrupt.h:46
IrqPort::m_CsrPort
uint16_t m_CsrPort
Definition:
interrupt.h:132
INTRP::CMOS
Definition:
interrupt.h:57
INTRP::RESERVED_START
0x0
Definition:
interrupt.h:21
INTRP::PARALLEL1
Definition:
interrupt.h:54
INTRP::PIC2_CASCADE
Definition:
interrupt.h:49
PORTS::PIC1_COMMAND
Definition:
ports.h:13
INTRP::OUT_OF_BOUNDS_FAULT
0x5
Definition:
interrupt.h:27
INTRP::HARDDISK
Definition:
interrupt.h:63
OS
include
interrupt.h
Generated by
1.8.13