diff options
author | Benji Dial <benji@benjidial.net> | 2024-05-18 21:53:38 -0400 |
---|---|---|
committer | Benji Dial <benji@benjidial.net> | 2024-05-18 21:53:38 -0400 |
commit | b1a912a8a6ff472a49b2e0a09cfd433adfc2cb24 (patch) | |
tree | 5009d4415ba13e4baa37f3d0271852528130fd3b /kernel/interrupts.asm | |
parent | a8a80d326de9550b2a25b1255a2093ab43219ede (diff) | |
download | hilbert-os-b1a912a8a6ff472a49b2e0a09cfd433adfc2cb24.tar.gz |
reorganization, cross compiler
Diffstat (limited to 'kernel/interrupts.asm')
-rw-r--r-- | kernel/interrupts.asm | 344 |
1 files changed, 0 insertions, 344 deletions
diff --git a/kernel/interrupts.asm b/kernel/interrupts.asm deleted file mode 100644 index c096ddb..0000000 --- a/kernel/interrupts.asm +++ /dev/null @@ -1,344 +0,0 @@ -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 0x002f98000000ffff - dq 0x002f92000000ffff - dq 0x002ff2000000ffff - dq 0x002ff8000000ffff - -section .bss - -section .text - -write_keyboard_byte: - in al, 0x64 - test al, 0x02 - jnz write_keyboard_byte - mov al, dil - out 0x60, al - ret - -extern on_keyboard_interrupt - -keyboard_isr: - - push r11 - push r10 - push r9 - push r8 - push rsi - push rdi - push rdx - push rcx - push rax - - in al, 0x60 - mov dil, al - - call on_keyboard_interrupt - - mov al, 0x20 - out 0x20, al - - pop rax - pop rcx - pop rdx - pop rdi - pop rsi - pop r8 - pop r9 - pop r10 - pop r11 - - iretq - -load_gdt_and_idt: - - ;fill exception entries in idt - - mov rcx, 16 - -.loop: - - mov rdi, rcx - dec rdi - mov sil, 1 - mov rdx, qword [exception_isrs + rdi * 8] - call set_isr - - loop .loop - - ;reset pic and map irqs to 0x20 - 0x2f - - mov al, 0x11 - out 0x20, al - mov al, 0x20 - out 0x21, al - mov al, 0x04 - out 0x21, al - mov al, 0x01 - out 0x21, al - mov al, 0xfd ;mask all but irq 1 - out 0x21, al - - mov al, 0x11 - out 0xa0, al - mov al, 0x28 - out 0xa1, al - mov al, 0x02 - out 0xa1, al - mov al, 0x01 - out 0xa1, al - mov al, 0xff ;mask all - out 0xa1, al - - mov rdi, 0x21 - xor sil, sil - mov rdx, keyboard_isr - call set_isr - - ;set keyboard config - - mov al, 0x60 - out 0x64, al - mov dil, 0x01 - call write_keyboard_byte - - ;make tss entry in gdt - - 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 - - ;load gdt, idt, tss - - lgdt [gdtr] - lidt [idtr] - mov ax, 0x18 - ltr ax - - ret |