mirror of
https://github.com/kenshineto/kern.git
synced 2025-04-21 01:27:24 +00:00
add 64-bit idt/pic and fix paging
This commit is contained in:
parent
af6dce3665
commit
16b7b4c2c0
15 changed files with 1147 additions and 16 deletions
|
@ -24,7 +24,12 @@ const boot_src = &[_][]const u8{"boot/boot.S"};
|
|||
|
||||
const kernel_src = &[_][]const u8{
|
||||
"kernel/entry.S", // must be first
|
||||
"kernel/kernel.c",
|
||||
"kernel/kernel.c", // main function
|
||||
"kernel/cpu/cpu.c",
|
||||
"kernel/cpu/fpu.c",
|
||||
"kernel/cpu/idt.c",
|
||||
"kernel/cpu/idt.S",
|
||||
"kernel/cpu/pic.c",
|
||||
"kernel/io/io.c",
|
||||
"kernel/io/panic.c",
|
||||
"kernel/memory/memory.c",
|
||||
|
|
10
kernel/cpu/cpu.c
Normal file
10
kernel/cpu/cpu.c
Normal file
|
@ -0,0 +1,10 @@
|
|||
|
||||
#include "fpu.h"
|
||||
#include "pic.h"
|
||||
#include "idt.h"
|
||||
|
||||
void cpu_init(void) {
|
||||
pic_remap();
|
||||
idt_init();
|
||||
fpu_init();
|
||||
}
|
12
kernel/cpu/fpu.c
Normal file
12
kernel/cpu/fpu.c
Normal file
|
@ -0,0 +1,12 @@
|
|||
#include <lib.h>
|
||||
|
||||
#include "fpu.h"
|
||||
|
||||
void fpu_init(void) {
|
||||
size_t cr4;
|
||||
uint16_t cw = 0x37F;
|
||||
__asm__ volatile ("mov %%cr4, %0" : "=r"(cr4));
|
||||
cr4 |= 0x200;
|
||||
__asm__ volatile ("mov %0, %%cr4" :: "r"(cr4));
|
||||
__asm__ volatile("fldcw %0" :: "m"(cw));
|
||||
}
|
14
kernel/cpu/fpu.h
Normal file
14
kernel/cpu/fpu.h
Normal file
|
@ -0,0 +1,14 @@
|
|||
/**
|
||||
* @file fpu.h
|
||||
*
|
||||
* @author Freya Murphy <freya@freyacat.org>
|
||||
*
|
||||
* FPU functions
|
||||
*/
|
||||
|
||||
#ifndef FPU_H_
|
||||
#define FPU_H_
|
||||
|
||||
void fpu_init(void);
|
||||
|
||||
#endif /* fpu.h */
|
666
kernel/cpu/idt.S
Normal file
666
kernel/cpu/idt.S
Normal file
|
@ -0,0 +1,666 @@
|
|||
.global isr_stub_table
|
||||
|
||||
.extern idt_exception_handler
|
||||
.extern idt_pic_timer
|
||||
.extern idt_pic_keyboard
|
||||
.extern idt_pic_mouse
|
||||
.extern idt_pic_eoi
|
||||
|
||||
.macro PUSHALL
|
||||
pushq %rax
|
||||
pushq %rbx
|
||||
pushq %rcx
|
||||
pushq %rdx
|
||||
pushq %rsi
|
||||
pushq %rdi
|
||||
pushq %rbp
|
||||
pushq %r8
|
||||
pushq %r9
|
||||
pushq %r10
|
||||
pushq %r11
|
||||
pushq %r12
|
||||
pushq %r13
|
||||
pushq %r14
|
||||
pushq %r15
|
||||
.endm
|
||||
|
||||
.macro POPALL
|
||||
popq %r15
|
||||
popq %r14
|
||||
popq %r13
|
||||
popq %r12
|
||||
popq %r11
|
||||
popq %r10
|
||||
popq %r9
|
||||
popq %r8
|
||||
popq %rbp
|
||||
popq %rdi
|
||||
popq %rsi
|
||||
popq %rdx
|
||||
popq %rcx
|
||||
popq %rbx
|
||||
popq %rax
|
||||
.endm
|
||||
|
||||
# call the exception handler with the interrupt number
|
||||
# args: interrupt number
|
||||
.macro ISRException num
|
||||
.align 8
|
||||
isr_stub_\num:
|
||||
PUSHALL
|
||||
cld
|
||||
movq $\num, %rdi # exception number
|
||||
movq $0, %rsi # placeholder error code
|
||||
movq %rsp, %rdx # top of stack
|
||||
callq idt_exception_handler
|
||||
POPALL
|
||||
iretq
|
||||
.endm
|
||||
|
||||
# call the exception handler with the interrupt number
|
||||
# these exceptions also put an error code on the stack
|
||||
# args: interrupt number
|
||||
.macro ISRExceptionCode num
|
||||
.align 8
|
||||
isr_stub_\num:
|
||||
# retrieve the error code without corrupting registers
|
||||
mov %eax, isr_tmp
|
||||
popq %rax
|
||||
mov %eax, isr_err_code
|
||||
movq isr_tmp, %rax
|
||||
PUSHALL
|
||||
cld
|
||||
movq $\num, %rdi # exception number
|
||||
movq isr_err_code, %rsi # error code
|
||||
movq %rsp, %rdx # top of stack
|
||||
callq idt_exception_handler
|
||||
POPALL
|
||||
iretq
|
||||
.endm
|
||||
|
||||
.macro PICGeneric num
|
||||
.align 8
|
||||
isr_stub_\num:
|
||||
PUSHALL
|
||||
cld
|
||||
movq $\num, %rdi
|
||||
callq idt_pic_eoi
|
||||
POPALL
|
||||
iretq
|
||||
.endm
|
||||
|
||||
.macro PICTimer num
|
||||
.align 8
|
||||
isr_stub_\num:
|
||||
PUSHALL
|
||||
cld
|
||||
callq idt_pic_timer
|
||||
movq $\num, %rdi
|
||||
callq idt_pic_eoi
|
||||
POPALL
|
||||
iretq
|
||||
.endm
|
||||
|
||||
.macro PICKeyboard num
|
||||
.align 8
|
||||
isr_stub_\num:
|
||||
PUSHALL
|
||||
cld
|
||||
callq idt_pic_keyboard
|
||||
movq $\num, %rdi
|
||||
callq idt_pic_eoi
|
||||
POPALL
|
||||
iretq
|
||||
.endm
|
||||
|
||||
.macro PICMouse num
|
||||
.align 8
|
||||
isr_stub_\num:
|
||||
PUSHALL
|
||||
cld
|
||||
callq idt_pic_mouse
|
||||
movq $\num, %rdi
|
||||
callq idt_pic_eoi
|
||||
POPALL
|
||||
iretq
|
||||
.endm
|
||||
|
||||
# do nothing
|
||||
# args: interrupt number
|
||||
.macro ISRIgnore num
|
||||
.align 8
|
||||
isr_stub_\num:
|
||||
iretq
|
||||
.endm
|
||||
|
||||
# isr temp storage
|
||||
.section .data
|
||||
isr_tmp:
|
||||
.quad 0
|
||||
isr_err_code:
|
||||
.quad 0
|
||||
|
||||
# isr stub table
|
||||
.section .rodata
|
||||
.align 16
|
||||
.code64
|
||||
isr_stub_table:
|
||||
.quad isr_stub_0
|
||||
.quad isr_stub_1
|
||||
.quad isr_stub_2
|
||||
.quad isr_stub_3
|
||||
.quad isr_stub_4
|
||||
.quad isr_stub_5
|
||||
.quad isr_stub_6
|
||||
.quad isr_stub_7
|
||||
.quad isr_stub_8
|
||||
.quad isr_stub_9
|
||||
.quad isr_stub_10
|
||||
.quad isr_stub_11
|
||||
.quad isr_stub_12
|
||||
.quad isr_stub_13
|
||||
.quad isr_stub_14
|
||||
.quad isr_stub_15
|
||||
.quad isr_stub_16
|
||||
.quad isr_stub_17
|
||||
.quad isr_stub_18
|
||||
.quad isr_stub_19
|
||||
.quad isr_stub_20
|
||||
.quad isr_stub_21
|
||||
.quad isr_stub_22
|
||||
.quad isr_stub_23
|
||||
.quad isr_stub_24
|
||||
.quad isr_stub_25
|
||||
.quad isr_stub_26
|
||||
.quad isr_stub_27
|
||||
.quad isr_stub_28
|
||||
.quad isr_stub_29
|
||||
.quad isr_stub_30
|
||||
.quad isr_stub_31
|
||||
.quad isr_stub_32
|
||||
.quad isr_stub_33
|
||||
.quad isr_stub_34
|
||||
.quad isr_stub_35
|
||||
.quad isr_stub_36
|
||||
.quad isr_stub_37
|
||||
.quad isr_stub_38
|
||||
.quad isr_stub_39
|
||||
.quad isr_stub_40
|
||||
.quad isr_stub_41
|
||||
.quad isr_stub_42
|
||||
.quad isr_stub_43
|
||||
.quad isr_stub_44
|
||||
.quad isr_stub_45
|
||||
.quad isr_stub_46
|
||||
.quad isr_stub_47
|
||||
.quad isr_stub_48
|
||||
.quad isr_stub_49
|
||||
.quad isr_stub_50
|
||||
.quad isr_stub_51
|
||||
.quad isr_stub_52
|
||||
.quad isr_stub_53
|
||||
.quad isr_stub_54
|
||||
.quad isr_stub_55
|
||||
.quad isr_stub_56
|
||||
.quad isr_stub_57
|
||||
.quad isr_stub_58
|
||||
.quad isr_stub_59
|
||||
.quad isr_stub_60
|
||||
.quad isr_stub_61
|
||||
.quad isr_stub_62
|
||||
.quad isr_stub_63
|
||||
.quad isr_stub_64
|
||||
.quad isr_stub_65
|
||||
.quad isr_stub_66
|
||||
.quad isr_stub_67
|
||||
.quad isr_stub_68
|
||||
.quad isr_stub_69
|
||||
.quad isr_stub_70
|
||||
.quad isr_stub_71
|
||||
.quad isr_stub_72
|
||||
.quad isr_stub_73
|
||||
.quad isr_stub_74
|
||||
.quad isr_stub_75
|
||||
.quad isr_stub_76
|
||||
.quad isr_stub_77
|
||||
.quad isr_stub_78
|
||||
.quad isr_stub_79
|
||||
.quad isr_stub_80
|
||||
.quad isr_stub_81
|
||||
.quad isr_stub_82
|
||||
.quad isr_stub_83
|
||||
.quad isr_stub_84
|
||||
.quad isr_stub_85
|
||||
.quad isr_stub_86
|
||||
.quad isr_stub_87
|
||||
.quad isr_stub_88
|
||||
.quad isr_stub_89
|
||||
.quad isr_stub_90
|
||||
.quad isr_stub_91
|
||||
.quad isr_stub_92
|
||||
.quad isr_stub_93
|
||||
.quad isr_stub_94
|
||||
.quad isr_stub_95
|
||||
.quad isr_stub_96
|
||||
.quad isr_stub_97
|
||||
.quad isr_stub_98
|
||||
.quad isr_stub_99
|
||||
.quad isr_stub_100
|
||||
.quad isr_stub_101
|
||||
.quad isr_stub_102
|
||||
.quad isr_stub_103
|
||||
.quad isr_stub_104
|
||||
.quad isr_stub_105
|
||||
.quad isr_stub_106
|
||||
.quad isr_stub_107
|
||||
.quad isr_stub_108
|
||||
.quad isr_stub_109
|
||||
.quad isr_stub_110
|
||||
.quad isr_stub_111
|
||||
.quad isr_stub_112
|
||||
.quad isr_stub_113
|
||||
.quad isr_stub_114
|
||||
.quad isr_stub_115
|
||||
.quad isr_stub_116
|
||||
.quad isr_stub_117
|
||||
.quad isr_stub_118
|
||||
.quad isr_stub_119
|
||||
.quad isr_stub_120
|
||||
.quad isr_stub_121
|
||||
.quad isr_stub_122
|
||||
.quad isr_stub_123
|
||||
.quad isr_stub_124
|
||||
.quad isr_stub_125
|
||||
.quad isr_stub_126
|
||||
.quad isr_stub_127
|
||||
.quad isr_stub_128
|
||||
.quad isr_stub_129
|
||||
.quad isr_stub_130
|
||||
.quad isr_stub_131
|
||||
.quad isr_stub_132
|
||||
.quad isr_stub_133
|
||||
.quad isr_stub_134
|
||||
.quad isr_stub_135
|
||||
.quad isr_stub_136
|
||||
.quad isr_stub_137
|
||||
.quad isr_stub_138
|
||||
.quad isr_stub_139
|
||||
.quad isr_stub_140
|
||||
.quad isr_stub_141
|
||||
.quad isr_stub_142
|
||||
.quad isr_stub_143
|
||||
.quad isr_stub_144
|
||||
.quad isr_stub_145
|
||||
.quad isr_stub_146
|
||||
.quad isr_stub_147
|
||||
.quad isr_stub_148
|
||||
.quad isr_stub_149
|
||||
.quad isr_stub_150
|
||||
.quad isr_stub_151
|
||||
.quad isr_stub_152
|
||||
.quad isr_stub_153
|
||||
.quad isr_stub_154
|
||||
.quad isr_stub_155
|
||||
.quad isr_stub_156
|
||||
.quad isr_stub_157
|
||||
.quad isr_stub_158
|
||||
.quad isr_stub_159
|
||||
.quad isr_stub_160
|
||||
.quad isr_stub_161
|
||||
.quad isr_stub_162
|
||||
.quad isr_stub_163
|
||||
.quad isr_stub_164
|
||||
.quad isr_stub_165
|
||||
.quad isr_stub_166
|
||||
.quad isr_stub_167
|
||||
.quad isr_stub_168
|
||||
.quad isr_stub_169
|
||||
.quad isr_stub_170
|
||||
.quad isr_stub_171
|
||||
.quad isr_stub_172
|
||||
.quad isr_stub_173
|
||||
.quad isr_stub_174
|
||||
.quad isr_stub_175
|
||||
.quad isr_stub_176
|
||||
.quad isr_stub_177
|
||||
.quad isr_stub_178
|
||||
.quad isr_stub_179
|
||||
.quad isr_stub_180
|
||||
.quad isr_stub_181
|
||||
.quad isr_stub_182
|
||||
.quad isr_stub_183
|
||||
.quad isr_stub_184
|
||||
.quad isr_stub_185
|
||||
.quad isr_stub_186
|
||||
.quad isr_stub_187
|
||||
.quad isr_stub_188
|
||||
.quad isr_stub_189
|
||||
.quad isr_stub_190
|
||||
.quad isr_stub_191
|
||||
.quad isr_stub_192
|
||||
.quad isr_stub_193
|
||||
.quad isr_stub_194
|
||||
.quad isr_stub_195
|
||||
.quad isr_stub_196
|
||||
.quad isr_stub_197
|
||||
.quad isr_stub_198
|
||||
.quad isr_stub_199
|
||||
.quad isr_stub_200
|
||||
.quad isr_stub_201
|
||||
.quad isr_stub_202
|
||||
.quad isr_stub_203
|
||||
.quad isr_stub_204
|
||||
.quad isr_stub_205
|
||||
.quad isr_stub_206
|
||||
.quad isr_stub_207
|
||||
.quad isr_stub_208
|
||||
.quad isr_stub_209
|
||||
.quad isr_stub_210
|
||||
.quad isr_stub_211
|
||||
.quad isr_stub_212
|
||||
.quad isr_stub_213
|
||||
.quad isr_stub_214
|
||||
.quad isr_stub_215
|
||||
.quad isr_stub_216
|
||||
.quad isr_stub_217
|
||||
.quad isr_stub_218
|
||||
.quad isr_stub_219
|
||||
.quad isr_stub_220
|
||||
.quad isr_stub_221
|
||||
.quad isr_stub_222
|
||||
.quad isr_stub_223
|
||||
.quad isr_stub_224
|
||||
.quad isr_stub_225
|
||||
.quad isr_stub_226
|
||||
.quad isr_stub_227
|
||||
.quad isr_stub_228
|
||||
.quad isr_stub_229
|
||||
.quad isr_stub_230
|
||||
.quad isr_stub_231
|
||||
.quad isr_stub_232
|
||||
.quad isr_stub_233
|
||||
.quad isr_stub_234
|
||||
.quad isr_stub_235
|
||||
.quad isr_stub_236
|
||||
.quad isr_stub_237
|
||||
.quad isr_stub_238
|
||||
.quad isr_stub_239
|
||||
.quad isr_stub_240
|
||||
.quad isr_stub_241
|
||||
.quad isr_stub_242
|
||||
.quad isr_stub_243
|
||||
.quad isr_stub_244
|
||||
.quad isr_stub_245
|
||||
.quad isr_stub_246
|
||||
.quad isr_stub_247
|
||||
.quad isr_stub_248
|
||||
.quad isr_stub_249
|
||||
.quad isr_stub_250
|
||||
.quad isr_stub_251
|
||||
.quad isr_stub_252
|
||||
.quad isr_stub_253
|
||||
.quad isr_stub_254
|
||||
.quad isr_stub_255
|
||||
|
||||
# isr stubs
|
||||
.section .text
|
||||
.code64
|
||||
|
||||
ISRException 0
|
||||
ISRException 1
|
||||
ISRException 2
|
||||
ISRException 3
|
||||
ISRException 4
|
||||
ISRException 5
|
||||
ISRException 6
|
||||
ISRException 7
|
||||
ISRExceptionCode 8
|
||||
ISRException 9
|
||||
ISRExceptionCode 10
|
||||
ISRExceptionCode 11
|
||||
ISRExceptionCode 12
|
||||
ISRExceptionCode 13
|
||||
ISRExceptionCode 14
|
||||
ISRException 15
|
||||
ISRException 16
|
||||
ISRExceptionCode 17
|
||||
ISRException 18
|
||||
ISRException 19
|
||||
ISRException 20
|
||||
ISRExceptionCode 21
|
||||
ISRException 22
|
||||
ISRException 23
|
||||
ISRException 24
|
||||
ISRException 25
|
||||
ISRException 26
|
||||
ISRException 27
|
||||
ISRException 28
|
||||
ISRExceptionCode 29
|
||||
ISRExceptionCode 30
|
||||
ISRException 31
|
||||
|
||||
PICTimer 32 # 0
|
||||
PICKeyboard 33 # 1
|
||||
PICGeneric 34 # 2
|
||||
PICGeneric 35 # 3
|
||||
PICGeneric 36 # 4
|
||||
PICGeneric 37 # 5
|
||||
PICGeneric 38 # 6
|
||||
PICGeneric 39 # 7
|
||||
PICGeneric 40 # 8
|
||||
PICGeneric 41 # 9
|
||||
PICGeneric 42 # 10
|
||||
PICGeneric 43 # 11
|
||||
PICMouse 44 # 12
|
||||
PICGeneric 45 # 13
|
||||
PICGeneric 46 # 14
|
||||
PICGeneric 47 # 15
|
||||
|
||||
ISRIgnore 48
|
||||
ISRIgnore 49
|
||||
ISRIgnore 50
|
||||
ISRIgnore 51
|
||||
ISRIgnore 52
|
||||
ISRIgnore 53
|
||||
ISRIgnore 54
|
||||
ISRIgnore 55
|
||||
ISRIgnore 56
|
||||
ISRIgnore 57
|
||||
ISRIgnore 58
|
||||
ISRIgnore 59
|
||||
ISRIgnore 60
|
||||
ISRIgnore 61
|
||||
ISRIgnore 62
|
||||
ISRIgnore 63
|
||||
ISRIgnore 64
|
||||
ISRIgnore 65
|
||||
ISRIgnore 66
|
||||
ISRIgnore 67
|
||||
ISRIgnore 68
|
||||
ISRIgnore 69
|
||||
ISRIgnore 70
|
||||
ISRIgnore 71
|
||||
ISRIgnore 72
|
||||
ISRIgnore 73
|
||||
ISRIgnore 74
|
||||
ISRIgnore 75
|
||||
ISRIgnore 76
|
||||
ISRIgnore 77
|
||||
ISRIgnore 78
|
||||
ISRIgnore 79
|
||||
ISRIgnore 80
|
||||
ISRIgnore 81
|
||||
ISRIgnore 82
|
||||
ISRIgnore 83
|
||||
ISRIgnore 84
|
||||
ISRIgnore 85
|
||||
ISRIgnore 86
|
||||
ISRIgnore 87
|
||||
ISRIgnore 88
|
||||
ISRIgnore 89
|
||||
ISRIgnore 90
|
||||
ISRIgnore 91
|
||||
ISRIgnore 92
|
||||
ISRIgnore 93
|
||||
ISRIgnore 94
|
||||
ISRIgnore 95
|
||||
ISRIgnore 96
|
||||
ISRIgnore 97
|
||||
ISRIgnore 98
|
||||
ISRIgnore 99
|
||||
ISRIgnore 100
|
||||
ISRIgnore 101
|
||||
ISRIgnore 102
|
||||
ISRIgnore 103
|
||||
ISRIgnore 104
|
||||
ISRIgnore 105
|
||||
ISRIgnore 106
|
||||
ISRIgnore 107
|
||||
ISRIgnore 108
|
||||
ISRIgnore 109
|
||||
ISRIgnore 110
|
||||
ISRIgnore 111
|
||||
ISRIgnore 112
|
||||
ISRIgnore 113
|
||||
ISRIgnore 114
|
||||
ISRIgnore 115
|
||||
ISRIgnore 116
|
||||
ISRIgnore 117
|
||||
ISRIgnore 118
|
||||
ISRIgnore 119
|
||||
ISRIgnore 120
|
||||
ISRIgnore 121
|
||||
ISRIgnore 122
|
||||
ISRIgnore 123
|
||||
ISRIgnore 124
|
||||
ISRIgnore 125
|
||||
ISRIgnore 126
|
||||
ISRIgnore 127
|
||||
ISRIgnore 128
|
||||
ISRIgnore 129
|
||||
ISRIgnore 130
|
||||
ISRIgnore 131
|
||||
ISRIgnore 132
|
||||
ISRIgnore 133
|
||||
ISRIgnore 134
|
||||
ISRIgnore 135
|
||||
ISRIgnore 136
|
||||
ISRIgnore 137
|
||||
ISRIgnore 138
|
||||
ISRIgnore 139
|
||||
ISRIgnore 140
|
||||
ISRIgnore 141
|
||||
ISRIgnore 142
|
||||
ISRIgnore 143
|
||||
ISRIgnore 144
|
||||
ISRIgnore 145
|
||||
ISRIgnore 146
|
||||
ISRIgnore 147
|
||||
ISRIgnore 148
|
||||
ISRIgnore 149
|
||||
ISRIgnore 150
|
||||
ISRIgnore 151
|
||||
ISRIgnore 152
|
||||
ISRIgnore 153
|
||||
ISRIgnore 154
|
||||
ISRIgnore 155
|
||||
ISRIgnore 156
|
||||
ISRIgnore 157
|
||||
ISRIgnore 158
|
||||
ISRIgnore 159
|
||||
ISRIgnore 160
|
||||
ISRIgnore 161
|
||||
ISRIgnore 162
|
||||
ISRIgnore 163
|
||||
ISRIgnore 164
|
||||
ISRIgnore 165
|
||||
ISRIgnore 166
|
||||
ISRIgnore 167
|
||||
ISRIgnore 168
|
||||
ISRIgnore 169
|
||||
ISRIgnore 170
|
||||
ISRIgnore 171
|
||||
ISRIgnore 172
|
||||
ISRIgnore 173
|
||||
ISRIgnore 174
|
||||
ISRIgnore 175
|
||||
ISRIgnore 176
|
||||
ISRIgnore 177
|
||||
ISRIgnore 178
|
||||
ISRIgnore 179
|
||||
ISRIgnore 180
|
||||
ISRIgnore 181
|
||||
ISRIgnore 182
|
||||
ISRIgnore 183
|
||||
ISRIgnore 184
|
||||
ISRIgnore 185
|
||||
ISRIgnore 186
|
||||
ISRIgnore 187
|
||||
ISRIgnore 188
|
||||
ISRIgnore 189
|
||||
ISRIgnore 190
|
||||
ISRIgnore 191
|
||||
ISRIgnore 192
|
||||
ISRIgnore 193
|
||||
ISRIgnore 194
|
||||
ISRIgnore 195
|
||||
ISRIgnore 196
|
||||
ISRIgnore 197
|
||||
ISRIgnore 198
|
||||
ISRIgnore 199
|
||||
ISRIgnore 200
|
||||
ISRIgnore 201
|
||||
ISRIgnore 202
|
||||
ISRIgnore 203
|
||||
ISRIgnore 204
|
||||
ISRIgnore 205
|
||||
ISRIgnore 206
|
||||
ISRIgnore 207
|
||||
ISRIgnore 208
|
||||
ISRIgnore 209
|
||||
ISRIgnore 210
|
||||
ISRIgnore 211
|
||||
ISRIgnore 212
|
||||
ISRIgnore 213
|
||||
ISRIgnore 214
|
||||
ISRIgnore 215
|
||||
ISRIgnore 216
|
||||
ISRIgnore 217
|
||||
ISRIgnore 218
|
||||
ISRIgnore 219
|
||||
ISRIgnore 220
|
||||
ISRIgnore 221
|
||||
ISRIgnore 222
|
||||
ISRIgnore 223
|
||||
ISRIgnore 224
|
||||
ISRIgnore 225
|
||||
ISRIgnore 226
|
||||
ISRIgnore 227
|
||||
ISRIgnore 228
|
||||
ISRIgnore 229
|
||||
ISRIgnore 230
|
||||
ISRIgnore 231
|
||||
ISRIgnore 232
|
||||
ISRIgnore 233
|
||||
ISRIgnore 234
|
||||
ISRIgnore 235
|
||||
ISRIgnore 236
|
||||
ISRIgnore 237
|
||||
ISRIgnore 238
|
||||
ISRIgnore 239
|
||||
ISRIgnore 240
|
||||
ISRIgnore 241
|
||||
ISRIgnore 242
|
||||
ISRIgnore 243
|
||||
ISRIgnore 244
|
||||
ISRIgnore 245
|
||||
ISRIgnore 246
|
||||
ISRIgnore 247
|
||||
ISRIgnore 248
|
||||
ISRIgnore 249
|
||||
ISRIgnore 250
|
||||
ISRIgnore 251
|
||||
ISRIgnore 252
|
||||
ISRIgnore 253
|
||||
ISRIgnore 254
|
||||
ISRIgnore 255
|
204
kernel/cpu/idt.c
Normal file
204
kernel/cpu/idt.c
Normal file
|
@ -0,0 +1,204 @@
|
|||
#include "stdlib.h"
|
||||
#include <lib.h>
|
||||
#include <comus/memory.h>
|
||||
#include <comus/asm.h>
|
||||
|
||||
#include "idt.h"
|
||||
#include "pic.h"
|
||||
|
||||
#define IDT_SIZE 256
|
||||
|
||||
struct idt_entry {
|
||||
uint16_t isr_low; // low 16 bits of isr
|
||||
uint16_t kernel_cs; // kernel segment selector
|
||||
uint8_t ist; // interrupt stack table
|
||||
uint8_t flags; // gate type, privilege level, present bit
|
||||
uint16_t isr_mid; // middle 16 bits of isr
|
||||
uint32_t isr_high; // high 32 bits of isr
|
||||
uint32_t reserved;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct idtr {
|
||||
uint16_t size;
|
||||
uint64_t address;
|
||||
} __attribute__((packed));
|
||||
|
||||
// interrupt gate
|
||||
#define GATE_64BIT_INT 0x0E
|
||||
// trap gate
|
||||
#define GATE_64BIT_TRAP 0x0F
|
||||
|
||||
// privilege ring allowed to call interrupt
|
||||
#define RING0 0x00
|
||||
#define RING1 0x20
|
||||
#define RING2 0x40
|
||||
#define RING3 0x60
|
||||
|
||||
// interrupt is present in IDT
|
||||
#define PRESENT 0x80
|
||||
|
||||
__attribute__((aligned(0x10)))
|
||||
static struct idt_entry idt[256];
|
||||
|
||||
static struct idtr idtr;
|
||||
// from idt.S
|
||||
extern void *isr_stub_table[];
|
||||
|
||||
// initialize and load the IDT
|
||||
void idt_init(void) {
|
||||
// initialize idtr
|
||||
idtr.address = (uint64_t)&idt;
|
||||
idtr.size = (uint16_t)sizeof(struct idt_entry) * IDT_SIZE - 1;
|
||||
|
||||
// initialize idt
|
||||
for (size_t vector = 0; vector < IDT_SIZE; vector++) {
|
||||
struct idt_entry *entry = &idt[vector];
|
||||
|
||||
uint64_t isr = (uint64_t)isr_stub_table[vector];
|
||||
// interrupts before 0x20 are for cpu exceptions
|
||||
uint8_t gate_type = (vector < 0x20) ? GATE_64BIT_TRAP : GATE_64BIT_INT;
|
||||
|
||||
entry->kernel_cs = 0x08; // offset of 1 into GDT
|
||||
entry->ist = 0;
|
||||
entry->flags = PRESENT | RING0 | gate_type;
|
||||
entry->isr_low = isr & 0xffff;
|
||||
entry->isr_mid = (isr >> 16) & 0xffff;
|
||||
entry->isr_high = (isr >> 32) & 0xffffffff;
|
||||
entry->reserved = 0;
|
||||
}
|
||||
|
||||
__asm__ volatile ("lidt %0" : : "m"(idtr));
|
||||
}
|
||||
|
||||
static void isr_print_regs(struct isr_regs *regs) {
|
||||
printf("rax: %#016lx (%lu)\n", regs->rax, regs->rax);
|
||||
printf("rbx: %#016lx (%lu)\n", regs->rbx, regs->rbx);
|
||||
printf("rcx: %#016lx (%lu)\n", regs->rcx, regs->rcx);
|
||||
printf("rdx: %#016lx (%lu)\n", regs->rdx, regs->rdx);
|
||||
printf("rsi: %#016lx (%lu)\n", regs->rsi, regs->rsi);
|
||||
printf("rdi: %#016lx (%lu)\n", regs->rdi, regs->rdi);
|
||||
printf("rsp: %#016lx (%lu)\n", regs->rsp, regs->rsp);
|
||||
printf("rbp: %#016lx (%lu)\n", regs->rbp, regs->rbp);
|
||||
printf("r8 : %#016lx (%lu)\n", regs->r8 , regs->r8 );
|
||||
printf("r9 : %#016lx (%lu)\n", regs->r9 , regs->r9 );
|
||||
printf("r10: %#016lx (%lu)\n", regs->r10, regs->r10);
|
||||
printf("r11: %#016lx (%lu)\n", regs->r11, regs->r11);
|
||||
printf("r12: %#016lx (%lu)\n", regs->r12, regs->r12);
|
||||
printf("r13: %#016lx (%lu)\n", regs->r13, regs->r13);
|
||||
printf("r14: %#016lx (%lu)\n", regs->r14, regs->r14);
|
||||
printf("r15: %#016lx (%lu)\n", regs->r15, regs->r15);
|
||||
printf("rip: %#016lx (%lu)\n", regs->rip, regs->rip);
|
||||
printf("rflags: %#016lx (%lu)\n", regs->rflags, regs->rflags);
|
||||
struct rflags *rflags = (struct rflags *)regs->rflags;
|
||||
puts("rflags: ");
|
||||
if (rflags->cf) puts("CF ");
|
||||
if (rflags->pf) puts("PF ");
|
||||
if (rflags->af) puts("AF ");
|
||||
if (rflags->zf) puts("ZF ");
|
||||
if (rflags->sf) puts("SF ");
|
||||
if (rflags->tf) puts("TF ");
|
||||
if (rflags->if_) puts("IF ");
|
||||
if (rflags->df) puts("DF ");
|
||||
if (rflags->of) puts("OF ");
|
||||
if (rflags->iopl) puts("IOPL ");
|
||||
if (rflags->nt) puts("NT ");
|
||||
if (rflags->md) puts("MD ");
|
||||
if (rflags->rf) puts("RF ");
|
||||
if (rflags->vm) puts("VM ");
|
||||
if (rflags->ac) puts("AC ");
|
||||
if (rflags->vif) puts("VIF ");
|
||||
if (rflags->vip) puts("VIP ");
|
||||
if (rflags->id) puts("ID ");
|
||||
puts("\n");
|
||||
}
|
||||
|
||||
#define EX_DEBUG 0x01
|
||||
#define EX_BREAKPOINT 0x03
|
||||
#define EX_PAGE_FAULT 0x0e
|
||||
|
||||
// Intel manual vol 3 ch 6.3.1
|
||||
char *EXCEPTIONS[] = {
|
||||
"Division Error",
|
||||
"Debug",
|
||||
"NMI",
|
||||
"Breakpoint",
|
||||
"Overflow",
|
||||
"BOUND Range Exceeded",
|
||||
"Invalid Opcode",
|
||||
"Device Not Available",
|
||||
"Double Fault",
|
||||
"Coprocessor Segment Overrun",
|
||||
"Invalid TSS",
|
||||
"Segment Not Present",
|
||||
"Stack-Segment Fault",
|
||||
"General Protection Fault",
|
||||
"Page Fault",
|
||||
"Reserved",
|
||||
"x87 Floating-Point Error",
|
||||
"Alignment Check",
|
||||
"Machine Check",
|
||||
"SIMD Floaing-Point Exception",
|
||||
"Virtualization Exception",
|
||||
"Control Protection Exception",
|
||||
"Reserved",
|
||||
"Reserved",
|
||||
"Reserved",
|
||||
"Reserved",
|
||||
"Reserved",
|
||||
"Reserved",
|
||||
"Hypervisor Injection Exception",
|
||||
"VMM Communication Exception",
|
||||
"Security Exception",
|
||||
"Reserved",
|
||||
};
|
||||
|
||||
void idt_exception_handler(uint64_t exception, uint64_t code, struct isr_regs *state) {
|
||||
uint64_t cr2;
|
||||
|
||||
switch (exception) {
|
||||
case EX_PAGE_FAULT:
|
||||
// page faults store the offending address in cr2
|
||||
__asm__ volatile ("mov %%cr2, %0" : "=r"(cr2));
|
||||
if (!load_page((void *)cr2))
|
||||
return;
|
||||
}
|
||||
|
||||
puts("\n\n!!! EXCEPTION !!!\n");
|
||||
printf("%#02lX %s\n", exception, EXCEPTIONS[exception]);
|
||||
printf("Error code %#lX\n", code);
|
||||
|
||||
if (exception == EX_PAGE_FAULT) {
|
||||
printf("Page fault address: %#016lx\n", cr2);
|
||||
}
|
||||
|
||||
puts("\n");
|
||||
|
||||
isr_print_regs(state);
|
||||
|
||||
puts("\n");
|
||||
|
||||
while (1) {
|
||||
halt();
|
||||
}
|
||||
}
|
||||
|
||||
void idt_pic_eoi(uint8_t exception) {
|
||||
pic_eoi(exception - PIC_REMAP_OFFSET);
|
||||
}
|
||||
|
||||
int counter = 0;
|
||||
|
||||
void idt_pic_timer(void) {
|
||||
// print a message once we know the timer works
|
||||
// but avoid spamming the logs
|
||||
if (counter == 3) {
|
||||
//kputs("pic timer!\n");
|
||||
}
|
||||
if (counter <= 3) {
|
||||
counter++;
|
||||
}
|
||||
}
|
||||
|
||||
void idt_pic_keyboard(void) {}
|
||||
|
||||
void idt_pic_mouse(void) {}
|
68
kernel/cpu/idt.h
Normal file
68
kernel/cpu/idt.h
Normal file
|
@ -0,0 +1,68 @@
|
|||
/**
|
||||
* @file idt.h
|
||||
*
|
||||
* @author Freya Murphy <freya@freyacat.org>
|
||||
*
|
||||
* IDT functions
|
||||
*/
|
||||
|
||||
#ifndef IDT_H_
|
||||
#define IDT_H_
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
struct isr_regs {
|
||||
uint64_t r15;
|
||||
uint64_t r14;
|
||||
uint64_t r13;
|
||||
uint64_t r12;
|
||||
uint64_t r11;
|
||||
uint64_t r10;
|
||||
uint64_t r9;
|
||||
uint64_t r8;
|
||||
uint64_t rbp;
|
||||
uint64_t rdi;
|
||||
uint64_t rsi;
|
||||
uint64_t rdx;
|
||||
uint64_t rcx;
|
||||
uint64_t rbx;
|
||||
uint64_t rax;
|
||||
|
||||
uint64_t rip;
|
||||
uint64_t cs;
|
||||
uint64_t rflags;
|
||||
uint64_t rsp;
|
||||
uint64_t ss;
|
||||
};
|
||||
|
||||
struct rflags {
|
||||
uint64_t cf : 1,
|
||||
: 1,
|
||||
pf : 1,
|
||||
: 1,
|
||||
af : 1,
|
||||
: 1,
|
||||
zf : 1,
|
||||
sf : 1,
|
||||
|
||||
tf : 1,
|
||||
if_ : 1,
|
||||
df : 1,
|
||||
of : 1,
|
||||
iopl : 2,
|
||||
nt : 1,
|
||||
md : 1,
|
||||
|
||||
rf : 1,
|
||||
vm : 1,
|
||||
ac : 1,
|
||||
vif : 1,
|
||||
vip : 1,
|
||||
id : 1,
|
||||
: 42;
|
||||
};
|
||||
|
||||
void idt_init(void);
|
||||
|
||||
#endif /* idt.h */
|
||||
|
90
kernel/cpu/pic.c
Normal file
90
kernel/cpu/pic.c
Normal file
|
@ -0,0 +1,90 @@
|
|||
#include <comus/asm.h>
|
||||
|
||||
#include "pic.h"
|
||||
|
||||
#define PIC1 0x20 /* IO base address for master PIC */
|
||||
#define PIC2 0xA0 /* IO base address for slave PIC */
|
||||
#define PIC1_COMMAND PIC1
|
||||
#define PIC1_DATA (PIC1+1)
|
||||
#define PIC2_COMMAND PIC2
|
||||
#define PIC2_DATA (PIC2+1)
|
||||
|
||||
#define PIC_EOI 0x20 /* End-of-interrupt command code */
|
||||
|
||||
#define ICW1_ICW4 0x01 /* Indicates that ICW4 will be present */
|
||||
#define ICW1_SINGLE 0x02 /* Single (cascade) mode */
|
||||
#define ICW1_INTERVAL4 0x04 /* Call address interval 4 (8) */
|
||||
#define ICW1_LEVEL 0x08 /* Level triggered (edge) mode */
|
||||
#define ICW1_INIT 0x10 /* Initialization - required! */
|
||||
|
||||
#define ICW4_8086 0x01 /* 8086/88 (MCS-80/85) mode */
|
||||
#define ICW4_AUTO 0x02 /* Auto (normal) EOI */
|
||||
#define ICW4_BUF_SLAVE 0x08 /* Buffered mode/slave */
|
||||
#define ICW4_BUF_MASTER 0x0C /* Buffered mode/master */
|
||||
#define ICW4_SFNM 0x10 /* Special fully nested (not) */
|
||||
|
||||
void pic_remap(void) {
|
||||
uint8_t a1, a2;
|
||||
|
||||
a1 = inb(PIC1_DATA); // save masks
|
||||
a2 = inb(PIC2_DATA);
|
||||
|
||||
outb(PIC1_COMMAND, ICW1_INIT | ICW1_ICW4); // starts the initialization sequence (in cascade mode)
|
||||
io_wait();
|
||||
outb(PIC2_COMMAND, ICW1_INIT | ICW1_ICW4);
|
||||
io_wait();
|
||||
outb(PIC1_DATA, PIC_REMAP_OFFSET); // ICW2: Master PIC vector offset
|
||||
io_wait();
|
||||
outb(PIC2_DATA, PIC_REMAP_OFFSET + 8); // ICW2: Slave PIC vector offset
|
||||
io_wait();
|
||||
outb(PIC1_DATA, 4); // ICW3: tell Master PIC that there is a slave PIC at IRQ2 (0000 0100)
|
||||
io_wait();
|
||||
outb(PIC2_DATA, 2); // ICW3: tell Slave PIC its cascade identity (0000 0010)
|
||||
io_wait();
|
||||
|
||||
outb(PIC1_DATA, ICW4_8086); // ICW4: have the PICs use 8086 mode (and not 8080 mode)
|
||||
io_wait();
|
||||
outb(PIC2_DATA, ICW4_8086);
|
||||
io_wait();
|
||||
|
||||
outb(PIC1_DATA, a1); // restore saved masks.
|
||||
outb(PIC2_DATA, a2);
|
||||
}
|
||||
|
||||
void pic_mask(int irq) {
|
||||
uint16_t port;
|
||||
uint8_t mask;
|
||||
if (irq < 8) {
|
||||
port = PIC1_DATA;
|
||||
} else {
|
||||
port = PIC2_DATA;
|
||||
irq -= 8;
|
||||
}
|
||||
mask = inb(port) | (1 << irq);
|
||||
outb(port, mask);
|
||||
}
|
||||
|
||||
void pic_unmask(int irq) {
|
||||
uint16_t port;
|
||||
uint8_t mask;
|
||||
if (irq < 8) {
|
||||
port = PIC1_DATA;
|
||||
} else {
|
||||
irq -= 8;
|
||||
port = PIC2_DATA;
|
||||
}
|
||||
mask = inb(port) & ~(1 << irq);
|
||||
outb(port, mask);
|
||||
}
|
||||
|
||||
void pic_disable(void) {
|
||||
outb(PIC1_DATA, 0xff);
|
||||
outb(PIC2_DATA, 0xff);
|
||||
}
|
||||
|
||||
void pic_eoi(int irq) {
|
||||
if (irq >= 8) {
|
||||
outb(PIC2_COMMAND, PIC_EOI);
|
||||
}
|
||||
outb(PIC1_COMMAND, PIC_EOI);
|
||||
}
|
42
kernel/cpu/pic.h
Normal file
42
kernel/cpu/pic.h
Normal file
|
@ -0,0 +1,42 @@
|
|||
/**
|
||||
* @file pic.h
|
||||
*
|
||||
* @author Freya Murphy <freya@freyacat.org>
|
||||
*
|
||||
* PIC functions
|
||||
*/
|
||||
|
||||
#ifndef PIC_H_
|
||||
#define PIC_H_
|
||||
|
||||
#define PIC_REMAP_OFFSET 0x20
|
||||
|
||||
/**
|
||||
* Remaps the pie, i.e. initializes it
|
||||
*/
|
||||
void pic_remap(void);
|
||||
|
||||
/**
|
||||
* Masks an external irq to stop firing until un masked
|
||||
* @param irq - the irq to mask
|
||||
*/
|
||||
void pic_mask(int irq);
|
||||
|
||||
/**
|
||||
* Unmasks an external irq to allow interrupts to continue for that irq
|
||||
* @param irq - the irq to unmask
|
||||
*/
|
||||
void pic_unmask(int irq);
|
||||
|
||||
/**
|
||||
* Disabled the pick
|
||||
*/
|
||||
void pic_disable(void);
|
||||
|
||||
/**
|
||||
* Tells the pick that the interrupt has ended
|
||||
* @param irq - the irq that has ended
|
||||
*/
|
||||
void pic_eoi(int irq);
|
||||
|
||||
#endif /* pic.h */
|
17
kernel/include/comus/cpu.h
Normal file
17
kernel/include/comus/cpu.h
Normal file
|
@ -0,0 +1,17 @@
|
|||
/**
|
||||
* @file cpu.h
|
||||
*
|
||||
* @author Freya Murphy <freya@freyacat.org>
|
||||
*
|
||||
* CPU initalization functions
|
||||
*/
|
||||
|
||||
#ifndef _CPU_H
|
||||
#define _CPU_H
|
||||
|
||||
/**
|
||||
* Initalize current cpu
|
||||
*/
|
||||
void cpu_init(void);
|
||||
|
||||
#endif /* cpu.h */
|
|
@ -1,9 +1,16 @@
|
|||
#include <lib.h>
|
||||
#include <stdio.h>
|
||||
#include <comus/asm.h>
|
||||
|
||||
#define PORT 0x3F8
|
||||
static void serial_out(uint8_t ch) {
|
||||
// wait for output to be free
|
||||
while ((inb(PORT + 5) & 0x20) == 0);
|
||||
outb(PORT, ch);
|
||||
}
|
||||
|
||||
void fputc(FILE *stream, char c) {
|
||||
(void) stream;
|
||||
(void) c;
|
||||
|
||||
// FIXME: !!!
|
||||
serial_out(c);
|
||||
}
|
||||
|
|
|
@ -1,8 +1,12 @@
|
|||
#include <comus/cpu.h>
|
||||
#include <comus/memory.h>
|
||||
#include <lib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
void main(void)
|
||||
{
|
||||
|
||||
while (1)
|
||||
;
|
||||
cpu_init();
|
||||
memory_init(NULL);
|
||||
printf("halting...\n");
|
||||
while(1);
|
||||
}
|
||||
|
|
|
@ -6,8 +6,6 @@ SECTIONS
|
|||
|
||||
kernel_start = .;
|
||||
|
||||
. = ALIGN(0x1000);
|
||||
|
||||
.boot : {
|
||||
*(.multiboot)
|
||||
}
|
||||
|
@ -20,12 +18,6 @@ SECTIONS
|
|||
|
||||
. = ALIGN(0x1000);
|
||||
|
||||
.data : {
|
||||
*(.data .data.*)
|
||||
}
|
||||
|
||||
. = ALIGN(0x1000);
|
||||
|
||||
.text : {
|
||||
*(.text .stub .text.* .gnu.linkonce.t.*)
|
||||
}
|
||||
|
|
|
@ -573,7 +573,7 @@ void free_pages(void *virt)
|
|||
unmap_pages(kernel_pml4, virt, pages);
|
||||
}
|
||||
|
||||
int kload_page(void *virt_addr)
|
||||
int load_page(void *virt_addr)
|
||||
{
|
||||
volatile struct pte *page = get_page(kernel_pml4, virt_addr);
|
||||
if (page == NULL)
|
||||
|
|
|
@ -103,7 +103,7 @@ void virtaddr_init(void)
|
|||
.is_alloc = false,
|
||||
.is_used = true,
|
||||
};
|
||||
memset(bootstrap_nodes, 0, sizeof(bootstrap_nodes));
|
||||
memsetv(bootstrap_nodes, 0, sizeof(bootstrap_nodes));
|
||||
bootstrap_nodes[0] = init;
|
||||
start_node = &bootstrap_nodes[0];
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue