starting point for interrupt handlers though some of this code isn't ready to be used, it serves as a reference point for later
This commit is contained in:
parent
c84997dea0
commit
7d9800f1eb
7
idt.s
Normal file
7
idt.s
Normal file
@ -0,0 +1,7 @@
|
||||
global load_idt
|
||||
|
||||
load_idt:
|
||||
; takes the address of the first element in the Interrupt descriptor table
|
||||
mov eax, [esp+4]
|
||||
lidt eax
|
||||
ret
|
96
interrupt_entry.s
Normal file
96
interrupt_entry.s
Normal file
@ -0,0 +1,96 @@
|
||||
; Dispatching to our interrupt handler code from assembly because some of this is
|
||||
; enourmous pain in C
|
||||
|
||||
; Save the register state
|
||||
; call the C handler
|
||||
; executes iret(expects the stack to look like struct stack_state)
|
||||
|
||||
|
||||
; If the interrupt we need to handle doesn't produce an error code then must provide a 0
|
||||
; for consistency
|
||||
|
||||
extern interrupt_handler
|
||||
|
||||
%macro no_err_handler 1
|
||||
global interrupt_handler_%1 ; defined in interrupts.h
|
||||
interrupt_handler_%1:
|
||||
push dword 0
|
||||
push dword %1
|
||||
jmp common_int_handler
|
||||
%endmacro
|
||||
|
||||
; deals with the intterrupts that do give us an error code
|
||||
%macro err_code_handler 1
|
||||
global interrupt_handler_%1
|
||||
interrupt_handler_%1:
|
||||
push dword %1
|
||||
jmp common_int_handler
|
||||
%endmacro
|
||||
|
||||
common_int_handler:
|
||||
; save thigns before do our C-call
|
||||
push eax
|
||||
push ebx
|
||||
push ecx
|
||||
push edx
|
||||
|
||||
push cs
|
||||
push ds
|
||||
push es
|
||||
push fs
|
||||
push gs
|
||||
push ss
|
||||
|
||||
push esi
|
||||
push edi
|
||||
push ebp
|
||||
push esp
|
||||
|
||||
call interrupt_handler
|
||||
; restore state to the function
|
||||
pop eax
|
||||
pop ebx
|
||||
pop ecx
|
||||
pop edx
|
||||
|
||||
pop cs
|
||||
pop ds
|
||||
pop es
|
||||
pop fs
|
||||
pop gs
|
||||
pop ss
|
||||
|
||||
pop esi
|
||||
pop edi
|
||||
pop ebp
|
||||
pop esp
|
||||
|
||||
add esp, 8
|
||||
; special instruction which lets us jump back to code
|
||||
; which was previously interrupted
|
||||
iret
|
||||
|
||||
|
||||
no_err_handler 1
|
||||
no_err_handler 2
|
||||
no_err_handler 3
|
||||
no_err_handler 4
|
||||
no_err_handler 5
|
||||
no_err_handler 6
|
||||
no_err_handler 7
|
||||
|
||||
err_code_handler 8
|
||||
|
||||
no_err_handler 9
|
||||
|
||||
err_code_handler 10
|
||||
err_code_handler 11
|
||||
err_code_handler 12
|
||||
err_code_handler 13
|
||||
err_code_handler 14
|
||||
|
||||
no_err_handler 15
|
||||
no_err_handler 16
|
||||
|
||||
err_code_handler 17
|
||||
|
5
interrupts.c
Normal file
5
interrupts.c
Normal file
@ -0,0 +1,5 @@
|
||||
#include "interrupts.h"
|
||||
#include "types.h"
|
||||
|
||||
void interrupt_handler(struct cpu_reg_state cpu, struct stack_state stack, u32 interrupt_code) {
|
||||
}
|
34
interrupts.h
Normal file
34
interrupts.h
Normal file
@ -0,0 +1,34 @@
|
||||
#include "types.h"
|
||||
|
||||
struct cpu_reg_state {
|
||||
u32 eax;
|
||||
u32 ebx;
|
||||
u32 ecx;
|
||||
u32 edx;
|
||||
|
||||
u16 cs;
|
||||
u16 ds;
|
||||
u16 es;
|
||||
u16 fs;
|
||||
u16 gs;
|
||||
u16 ss;
|
||||
|
||||
u32 esi;
|
||||
u32 edi;
|
||||
u32 ebp;
|
||||
u32 eip;
|
||||
u32 esp;
|
||||
|
||||
u32 eflags;
|
||||
}__attribute__((packed));
|
||||
|
||||
// Populated by the interrupt handler itself
|
||||
struct stack_state {
|
||||
u32 error_code; // 8 10 11 12 13 14 17 <= ony interrupts that actually use the error code
|
||||
u32 eip;
|
||||
u16 cs;
|
||||
u32 eflags;
|
||||
};
|
||||
|
||||
|
||||
void interrupt_handler(struct cpu_reg_state, struct stack_state, u32);
|
14
kernel.c
Normal file
14
kernel.c
Normal file
@ -0,0 +1,14 @@
|
||||
#include "kernel.h"
|
||||
#include "types.h"
|
||||
#include "gdt.h"
|
||||
#include "idt.h"
|
||||
|
||||
GDT GDT_PTR;
|
||||
GDT _GDT[6]; // because there are only 6 segments we care about
|
||||
|
||||
u32 kinit() {
|
||||
init_segment_selectors(); // found in gdt.s
|
||||
}
|
||||
void kmain() {
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user