258 lines
4.5 KiB
NASM
258 lines
4.5 KiB
NASM
bits 64
|
|
|
|
global load_gdt_and_idt
|
|
|
|
section .rodata
|
|
|
|
;0x28 picked to align with limine choice
|
|
|
|
;0x18 - tss
|
|
;0x28 - kernel code
|
|
;0x30 - kernel data
|
|
;0x38 - user data
|
|
;0x40 - user code
|
|
|
|
tss:
|
|
times 9 dd 0
|
|
dq 0xffffffffffeff000
|
|
times 15 dd 0
|
|
|
|
gdtr:
|
|
dw 0x47
|
|
dq gdt
|
|
|
|
idtr:
|
|
dw 4095
|
|
dq idt
|
|
|
|
section .bss
|
|
|
|
idt:
|
|
resq 512
|
|
|
|
global exception_info
|
|
exception_info:
|
|
.rax:
|
|
resq 1
|
|
.rbx:
|
|
resq 1
|
|
.rcx:
|
|
resq 1
|
|
.rdx:
|
|
resq 1
|
|
.rdi:
|
|
resq 1
|
|
.rsi:
|
|
resq 1
|
|
.rbp:
|
|
resq 1
|
|
.rsp:
|
|
resq 1
|
|
.r8:
|
|
resq 1
|
|
.r9:
|
|
resq 1
|
|
.r10:
|
|
resq 1
|
|
.r11:
|
|
resq 1
|
|
.r12:
|
|
resq 1
|
|
.r13:
|
|
resq 1
|
|
.r14:
|
|
resq 1
|
|
.r15:
|
|
resq 1
|
|
.cr2:
|
|
resq 1
|
|
.cr3:
|
|
resq 1
|
|
.rip:
|
|
resq 1
|
|
.rflags:
|
|
resq 1
|
|
.error:
|
|
resq 1
|
|
.has_error:
|
|
resb 1
|
|
.exception_number:
|
|
resb 1
|
|
|
|
section .rodata
|
|
|
|
has_error_code:
|
|
db 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0
|
|
|
|
exception_isrs:
|
|
dq exception_00, exception_01, exception_02, exception_03
|
|
dq exception_04, exception_05, exception_06, exception_07
|
|
dq exception_08, exception_09, exception_0a, exception_0b
|
|
dq exception_0c, exception_0d, exception_0e, exception_0f
|
|
|
|
section .text
|
|
|
|
extern print_exception
|
|
|
|
exception_00:
|
|
mov byte [exception_info.exception_number], 0x00
|
|
jmp exception_common
|
|
exception_01:
|
|
mov byte [exception_info.exception_number], 0x01
|
|
jmp exception_common
|
|
exception_02:
|
|
mov byte [exception_info.exception_number], 0x02
|
|
jmp exception_common
|
|
exception_03:
|
|
mov byte [exception_info.exception_number], 0x03
|
|
jmp exception_common
|
|
exception_04:
|
|
mov byte [exception_info.exception_number], 0x04
|
|
jmp exception_common
|
|
exception_05:
|
|
mov byte [exception_info.exception_number], 0x05
|
|
jmp exception_common
|
|
exception_06:
|
|
mov byte [exception_info.exception_number], 0x06
|
|
jmp exception_common
|
|
exception_07:
|
|
mov byte [exception_info.exception_number], 0x07
|
|
jmp exception_common
|
|
exception_08:
|
|
mov byte [exception_info.exception_number], 0x08
|
|
jmp exception_common
|
|
exception_09:
|
|
mov byte [exception_info.exception_number], 0x09
|
|
jmp exception_common
|
|
exception_0a:
|
|
mov byte [exception_info.exception_number], 0x0a
|
|
jmp exception_common
|
|
exception_0b:
|
|
mov byte [exception_info.exception_number], 0x0b
|
|
jmp exception_common
|
|
exception_0c:
|
|
mov byte [exception_info.exception_number], 0x0c
|
|
jmp exception_common
|
|
exception_0d:
|
|
mov byte [exception_info.exception_number], 0x0d
|
|
jmp exception_common
|
|
exception_0e:
|
|
mov byte [exception_info.exception_number], 0x0e
|
|
jmp exception_common
|
|
exception_0f:
|
|
mov byte [exception_info.exception_number], 0x0f
|
|
jmp exception_common
|
|
|
|
exception_common:
|
|
mov qword [exception_info.rax], rax
|
|
|
|
movzx rax, byte [exception_info.exception_number]
|
|
mov al, byte [has_error_code + rax]
|
|
test al, al
|
|
jz .no_error_code
|
|
|
|
mov byte [exception_info.has_error], 1
|
|
pop rax
|
|
mov qword [exception_info.error], rax
|
|
jmp .post_error_code
|
|
|
|
.no_error_code:
|
|
mov byte [exception_info.has_error], 0
|
|
|
|
.post_error_code:
|
|
mov qword [exception_info.rbx], rbx
|
|
mov qword [exception_info.rcx], rcx
|
|
mov qword [exception_info.rdx], rdx
|
|
mov qword [exception_info.rdi], rdi
|
|
mov qword [exception_info.rsi], rsi
|
|
mov qword [exception_info.rbp], rbp
|
|
mov qword [exception_info.r8], r8
|
|
mov qword [exception_info.r9], r9
|
|
mov qword [exception_info.r10], r10
|
|
mov qword [exception_info.r11], r11
|
|
mov qword [exception_info.r12], r12
|
|
mov qword [exception_info.r13], r13
|
|
mov qword [exception_info.r14], r14
|
|
mov qword [exception_info.r15], r15
|
|
|
|
pop rax
|
|
mov qword [exception_info.rip], rax
|
|
pop rax
|
|
pop rax
|
|
mov qword [exception_info.rflags], rax
|
|
pop rax
|
|
mov qword [exception_info.rsp], rax
|
|
|
|
mov rax, cr2
|
|
mov qword [exception_info.cr2], rax
|
|
mov rax, cr3
|
|
mov qword [exception_info.cr3], rax
|
|
|
|
jmp print_exception
|
|
|
|
set_isr:
|
|
;rdi - index
|
|
;sil - 1 if this is a trap, 0 if it is an interrupt
|
|
;rdx - isr pointer
|
|
|
|
shl rdi, 4
|
|
add rdi, idt
|
|
|
|
mov word [rdi], dx
|
|
shr rdx, 16
|
|
mov word [rdi + 6], dx
|
|
shr rdx, 16
|
|
mov dword [rdi + 8], edx
|
|
|
|
or sil, 0x8e
|
|
mov byte [rdi + 5], sil
|
|
mov word [rdi + 2], 0x28
|
|
mov byte [rdi + 4], 1
|
|
|
|
ret
|
|
|
|
section .data
|
|
|
|
gdt:
|
|
dq 0
|
|
dq 0
|
|
dq 0
|
|
.tss:
|
|
dq 0x0000e90000000067
|
|
dq 0;tss is 2 qwords wide
|
|
dq 0x00209b0000000000
|
|
dq 0x00009b0000000000
|
|
dq 0x0000fb0000000000
|
|
dq 0x0020fb0000000000
|
|
|
|
section .text
|
|
|
|
load_gdt_and_idt:
|
|
|
|
mov rcx, 16
|
|
|
|
.loop:
|
|
|
|
mov rdi, rcx
|
|
dec rdi
|
|
mov sil, 0
|
|
mov rdx, qword [exception_isrs + rdi * 8]
|
|
call set_isr
|
|
|
|
loop .loop
|
|
|
|
mov rax, tss
|
|
|
|
mov word [gdt.tss + 2], ax
|
|
shr rax, 16
|
|
mov byte [gdt.tss + 4], al
|
|
mov byte [gdt.tss + 7], ah
|
|
shr rax, 16
|
|
mov dword [gdt.tss + 8], eax
|
|
|
|
lgdt [gdtr]
|
|
lidt [idtr]
|
|
mov ax, 0x18
|
|
ltr ax
|
|
|
|
ret
|