hos/kernel.asm

63 lines
1.1 KiB
NASM

%include "bootdef.inc"
%define GDT 0x140000
%define IDT 0x150000
[global start]
[extern _isr]
[extern _k_init]
bits 32
start:
cli ;if they weren't already off
mov edi, GDT
mov esi, gdt
mov ecx, gdt_end-gdt
copy_gdt:
lodsb
stosb
loop copy_gdt
mov edi, IDT ;destination
mov esi, isr_0 ;address of isr0
mov edx, isr_1-isr_0 ;distance between isr labels
mov ecx, 50 ;number of isrlabels
fill_idt:
mov ebx, esi
mov ax, si
stosw ;0 offset 15:0
mov ax, KERNEL_CODE
stosw ;2 selector 15:0
mov ax, 0x8E00
stosw ;4 [P][DPL][0][TYPE][0][0][0][0][0][0][0][0]
shr esi, 16
mov ax, si
stosw ;6 offset 31:16
mov esi, ebx
add esi, edx
loop fill_idt
lgdt [gdtr] ;load gdt
jmp KERNEL_CODE:newgdtcontinue
newgdtcontinue:
mov ax, KERNEL_DATA
mov es, ax
mov ds, ax
mov gs, ax
mov fs, ax
mov ss, ax
mov esp, 0x1ffffc ;stack just under 2mb, moves downward
lidt [idtr] ;load idt
call _k_init
hlt ;halt processor when k_init is done
jmp $ ;shouldn't get here...
%include "gdt.inc"
%include "idt.inc"