Bootable kernel skeleton
This commit is contained in:
parent
8f4aff05d5
commit
d5902c5a20
1 changed files with 1702 additions and 3 deletions
105
bootloader/x86/interrupts-i386.asm
Normal file
105
bootloader/x86/interrupts-i386.asm
Normal file
|
|
@ -0,0 +1,105 @@
|
|||
struc IDTEntry
|
||||
.offsetl resw 1
|
||||
.selector resw 1
|
||||
.zero resb 1
|
||||
.attribute resb 1
|
||||
.offseth resw 1
|
||||
endstruc
|
||||
|
||||
SECTION .text
|
||||
USE32
|
||||
|
||||
interrupts:
|
||||
.first:
|
||||
mov [.entry], byte 0
|
||||
jmp dword .handle
|
||||
.second:
|
||||
%assign i 1
|
||||
%rep 255
|
||||
mov [.entry], byte i
|
||||
jmp dword .handle
|
||||
%assign i i+1
|
||||
%endrep
|
||||
.handle:
|
||||
push ebp
|
||||
push esi
|
||||
push edi
|
||||
push edx
|
||||
push ecx
|
||||
push ebx
|
||||
push eax
|
||||
|
||||
push esp
|
||||
push dword [.entry]
|
||||
|
||||
mov eax, gdt.kernel_data
|
||||
mov ds, eax
|
||||
mov es, eax
|
||||
mov fs, eax
|
||||
mov gs, eax
|
||||
|
||||
call dword [.handler]
|
||||
|
||||
mov eax, gdt.user_data | 3
|
||||
mov ds, eax
|
||||
mov es, eax
|
||||
mov fs, eax
|
||||
mov eax, gdt.user_tls | 3
|
||||
mov gs, eax
|
||||
|
||||
add esp, 8 ; Skip interrupt code and reg pointer
|
||||
|
||||
pop eax
|
||||
pop ebx
|
||||
pop ecx
|
||||
pop edx
|
||||
pop edi
|
||||
pop esi
|
||||
pop ebp
|
||||
|
||||
iretd
|
||||
|
||||
.handler: dd 0
|
||||
.entry: dd 0
|
||||
|
||||
idtr:
|
||||
dw (idt.end - idt) + 1
|
||||
dd idt
|
||||
|
||||
idt:
|
||||
%assign i 0
|
||||
|
||||
;Below system call
|
||||
%rep 128
|
||||
istruc IDTEntry
|
||||
at IDTEntry.offsetl, dw interrupts+(interrupts.second-interrupts.first)*i
|
||||
at IDTEntry.selector, dw gdt.kernel_code
|
||||
at IDTEntry.zero, db 0
|
||||
at IDTEntry.attribute, db attrib.present | attrib.interrupt32
|
||||
at IDTEntry.offseth, dw 0
|
||||
iend
|
||||
%assign i i+1
|
||||
%endrep
|
||||
|
||||
;System call
|
||||
istruc IDTEntry
|
||||
at IDTEntry.offsetl, dw interrupts+(interrupts.second-interrupts.first)*i
|
||||
at IDTEntry.selector, dw gdt.kernel_code
|
||||
at IDTEntry.zero, db 0
|
||||
at IDTEntry.attribute, db attrib.present | attrib.ring3 | attrib.interrupt32
|
||||
at IDTEntry.offseth, dw 0
|
||||
iend
|
||||
%assign i i+1
|
||||
|
||||
;Above system call
|
||||
%rep 127
|
||||
istruc IDTEntry
|
||||
at IDTEntry.offsetl, dw interrupts+(interrupts.second-interrupts.first)*i
|
||||
at IDTEntry.selector, dw gdt.kernel_code
|
||||
at IDTEntry.zero, db 0
|
||||
at IDTEntry.attribute, db attrib.present | attrib.interrupt32
|
||||
at IDTEntry.offseth, dw 0
|
||||
iend
|
||||
%assign i i+1
|
||||
%endrep
|
||||
.end:
|
||||
Loading…
Reference in a new issue