Files
SoraOS/boot/kernel.asm
T

81 lines
1.5 KiB
NASM

; File: kernel.asm
; Assembly entry point for the kernel
[bits 64]
[extern kmain] ; kmain is defined in kernel.c
[extern __keyboard_handle_scancode]
[extern __bss_start]
[extern __bss_end]
global _start ; Make _start visible to linker
_start:
call fill_idt
; IMPORTANT
; Zero out the .bss section
cld
mov rdi, __bss_start
mov rcx, __bss_end
sub rcx, rdi
xor rax, rax
rep stosb
; We're already in 64-bit mode with stack set up
; Just call the C kernel
sti
call kmain
; If kmain returns, hang
jmp $
hlt
; Set up a minimal IDT
fill_idt:
; Fill IDT with different handlers for different exceptions
mov rdi, 0x4210 ; IDT location
mov rax, keyboard_handler
mov word [rdi], ax ; Offset low
mov word [rdi + 2], 0x18 ; Code segment
mov byte [rdi + 4], 0 ; IST
mov byte [rdi + 5], 0x8E ; Present, interrupt gate
shr rax, 16
mov word [rdi + 6], ax ; Offset middle
shr rax, 16
mov dword [rdi + 8], eax ; Offset high
mov dword [rdi + 12], 0 ; Reserved
ret
; keyboard handler - Catch PIC interrupt
keyboard_handler:
push rax
push rdx
push rdi
push rcx
push rsi
push r8
push r9
push r10
push r11
mov dx, 0x60
in al, dx
mov dil, al
call __keyboard_handle_scancode
mov al, 0x20
out 0x20, al
pop r11
pop r10
pop r9
pop r8
pop rsi
pop rcx
pop rdi
pop rdx
pop rax
iretq