summaryrefslogtreecommitdiff
path: root/kernel/boot.s
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/boot.s')
-rw-r--r--kernel/boot.s127
1 files changed, 127 insertions, 0 deletions
diff --git a/kernel/boot.s b/kernel/boot.s
new file mode 100644
index 0000000..be68109
--- /dev/null
+++ b/kernel/boot.s
@@ -0,0 +1,127 @@
+global kboot
+extern kmain
+
+; Multiboot header
+section .mboothdr
+mboot_hdr:
+ align 4
+ dd 0x1BADB002
+ dd 0x00
+ dd - (0x1BADB002 + 0x00)
+
+section .text
+
+kboot:
+ cli
+ call flush_gdt
+ call flush_idt
+ call kmain
+ cli
+ hlt
+
+gdt:
+ ; null descriptor
+ dq 0
+ ; kernel code segment
+ dw 0xFFFF ; limit (bits 0-15)
+ dw 0x0000 ; base (bits 0-15)
+ db 0x00 ; base (bits 16-23)
+ db 0x9A ; access byte
+ db 0xCF ; flags / limit (bits 16-19)
+ db 0x00 ; base (bits 24-31)
+ ; kernel data segment
+ dw 0xFFFF
+ dw 0x0000
+ db 0x00
+ db 0x92
+ db 0xCF
+ db 0x00
+ ; userspace code segment
+ dw 0xFFFF
+ dw 0x0000
+ db 0x00
+ db 0xFA
+ db 0xCF
+ db 0x00
+ ; userspace data segment
+ dw 0xFFFF
+ dw 0x0000
+ db 0x00
+ db 0xF2
+ db 0xCF
+ db 0x00
+
+gdtp:
+ dw ($-gdt-1)
+ dd gdt
+
+flush_gdt:
+ push ebp
+ mov ebp, esp
+ lgdt [gdtp]
+ mov ax, 0x10
+ mov ds, ax
+ mov es, ax
+ mov fs, ax
+ mov gs, ax
+ mov ss, ax
+ jmp 0x08:.end
+.end:
+ pop ebp
+ ret
+
+idt:
+ times (256*8) db 0
+
+idtp:
+ dw ($-idt-1)
+ dd idt
+
+int_handler:
+ iret
+
+flush_idt:
+ push ebp
+ mov ebp, esp
+ mov ecx, 256
+ mov edx, idt
+.loop:
+ mov eax, int_handler
+ mov [edx], ax
+ mov word [edx+2], 0x08
+ mov byte [edx+4], 0
+ mov byte [edx+5], 0x8E
+ shr eax, 16
+ mov [edx+6], ax
+ add edx, 8
+ dec ecx
+ jz .end
+ jmp .loop
+.end:
+ lidt [idtp]
+ call pic_init
+ sti
+ pop ebp
+ ret
+
+pic_init:
+ push ebp
+ mov ebp, esp
+ mov al, 0x11
+ out 0x20, al
+ out 0xA0, al
+ mov al, 0x20
+ out 0x21, al
+ out 0xA1, al
+ mov al, 0x04
+ out 0x21, al
+ mov al, 0x02
+ out 0xA1, al
+ mov al, 0x01
+ out 0x21, al
+ out 0xA1, al
+ mov al, 0xFF
+ out 0x21, al
+ out 0xA1, al
+ pop ebp
+ ret