Interrupt Handlers and initialization

This commit is contained in:
notsomeidiot123 2024-11-06 15:30:49 -05:00
parent c7d5b6f163
commit 728e7884a3
8 changed files with 149 additions and 59 deletions

5
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,5 @@
{
"files.associations": {
"pic.h": "c"
}
}

View File

@ -32,7 +32,7 @@ global _isr30
global _isr31 global _isr31
global load_idt global load_idt
section .text
load_idt: load_idt:
push ebp push ebp
mov ebp, esp mov ebp, esp
@ -249,98 +249,93 @@ global _irq15
global _syscall global _syscall
_irq0: _irq0:
cli cli
push 0 ; jmp $
push 32 push dword 0
push dword 32
jmp _irq_common_stub jmp _irq_common_stub
_irq1: _irq1:
cli cli
push 0 push dword 0
push 33 push dword 33
jmp _irq_common_stub jmp _irq_common_stub
_irq2: _irq2:
cli cli
push 0 push dword 0
push 34 push dword 34
jmp _irq_common_stub jmp _irq_common_stub
_irq3: _irq3:
cli cli
push 0 push dword 0
push 35 push dword 35
jmp _irq_common_stub jmp _irq_common_stub
_irq4: _irq4:
cli cli
push 0 push dword 0
push 36 push dword 36
jmp _irq_common_stub jmp _irq_common_stub
_irq5: _irq5:
cli cli
push 0 push dword 0
push 37 push dword 37
jmp _irq_common_stub jmp _irq_common_stub
_irq6: _irq6:
cli cli
push 0 push dword 0
push 38 push dword 38
jmp _irq_common_stub jmp _irq_common_stub
_irq7: _irq7:
cli cli
push 0 push dword 0
push 39 push dword 39
jmp _irq_common_stub jmp _irq_common_stub
_irq8: _irq8:
cli cli
push 0 push dword 0
push 40 push dword 40
jmp _irq_common_stub jmp _irq_common_stub
_irq9: _irq9:
cli cli
push 0 push dword 0
push 41 push dword 41
jmp _irq_common_stub jmp _irq_common_stub
_irq10: _irq10:
cli cli
push 0 push dword 0
push 42 push dword 42
jmp _irq_common_stub jmp _irq_common_stub
_irq11: _irq11:
cli cli
push 0 push dword 0
push 43 push dword 43
jmp _irq_common_stub jmp _irq_common_stub
_irq12: _irq12:
cli cli
push 0 push dword 0
push 44 push dword 44
jmp _irq_common_stub jmp _irq_common_stub
_irq13: _irq13:
cli cli
push 0 push dword 0
push 45 push dword 45
jmp _irq_common_stub jmp _irq_common_stub
_irq14: _irq14:
cli cli
push 0 push dword 0
push 46 push dword 46
jmp _irq_common_stub jmp _irq_common_stub
_irq15: _irq15:
cli cli
push 0 push dword 0
push 47 push dword 47
jmp _irq_common_stub jmp _irq_common_stub
_syscall: _syscall:
cli cli
push 0 push dword 0
push 0x80 push dword 0x80
_irq_common_stub: _irq_common_stub:
push eax pushad
push ebx
push ecx
push edx
push ebp
push esi
push edi
push ds push ds
push es push es
push fs push fs
@ -354,12 +349,6 @@ _irq_common_stub:
pop fs pop fs
pop es pop es
pop ds pop ds
pop edi popad
pop esi
pop ebp
pop edx
pop ecx
pop ebx
pop eax
add esp, 8 add esp, 8
iret iret

View File

@ -1,5 +1,6 @@
#include "../shared/interrupts.h" #include "../shared/interrupts.h"
#include "../drivers/serial.h" #include "../drivers/serial.h"
#include "../drivers/cpuio.h"
#include <stdint.h> #include <stdint.h>
extern void _isr0(); extern void _isr0();
@ -8,16 +9,31 @@ extern void _isr1();
extern void _irq0(); extern void _irq0();
extern void _irq1(); extern void _irq1();
extern void _syscall(); extern void _syscall();
extern void load_idt(void*);
typedef struct idt_entry{
uint16_t offset_low;
uint16_t code_seg;
uint8_t reserved;
uint8_t flags;
uint16_t offset_high;
}__attribute__((packed)) idt_entry_t;
cpu_registers_t *(*interrupt_handlers[16])(cpu_registers_t *regs) = {0};
idt_t idt_desc; idt_t idt_desc;
uint64_t idt_table[256];
idt_entry_t idt_table[256];
inline void set_idt_entry(uint32_t index, void *ptr, uint8_t flags, uint16_t segment){ inline void set_idt_entry(uint32_t index, void *ptr, uint8_t flags, uint16_t segment){
uint32_t offset = (uint32_t) ptr; uint32_t offset = (uint32_t) ptr;
idt_table[index] = ((uint64_t)(offset >> 16) << 48) | ((uint64_t)(flags | 0x80) << 40) | (segment << 16) | (offset & 0xffff); idt_table[index].offset_high = offset >> 16;
idt_table[index].offset_low = offset & 0xffff;
idt_table[index].code_seg = segment;
idt_table[index].flags = flags | 0x80;
// idt_table[index] = (segment << 16) | (offset & 0xffff);
// idt_table[index+1] = (offset >> 16) | ((flags | 0x80) << 8);
// idt_table[index] = ((uint64_t)(offset >> 16) << 48) | ((uint64_t)(flags | 0x80) << 40) | (segment << 16) | (offset & 0xffff);
} }
cpu_registers_t *(*interrupt_handlers[16])(cpu_registers_t *regs) = {0};
void _irq_handler(cpu_registers_t *regs){ void _irq_handler(cpu_registers_t *regs){
if(regs->int_no == 0x80){ if(regs->int_no == 0x80){
@ -25,11 +41,20 @@ void _irq_handler(cpu_registers_t *regs){
} }
else if(interrupt_handlers[regs->int_no - 32]) else if(interrupt_handlers[regs->int_no - 32])
{ {
if(regs->int_no == 32){
// printf("Tick\n");
// printf("%x\n", regs->int_no);
}
regs = interrupt_handlers[regs->int_no - 32](regs); regs = interrupt_handlers[regs->int_no - 32](regs);
// printf("eip: %x", regs->eip);
outb(0x20, 0x20);
if(regs->int_no >= 0x28){
outb(0xa0, 0x20);
}
} }
} }
void _isr_handler(cpu_registers_t *regs){ void _isr_handler(cpu_registers_t *regs){
printf("Error!!\n"); printf("Error!! %x\n", regs->eip);
for(;;); for(;;);
} }
@ -39,13 +64,34 @@ cpu_registers_t *syscall(cpu_registers_t *regs){
void init_idt(){ void init_idt(){
for(uint32_t i = 0; i < 32; i++){ for(uint32_t i = 0; i < 32; i++){
set_idt_entry(i, (_isr0 + (_isr1 - _isr0) * i), IDT_GATE_TRAP, 0x10); set_idt_entry(i, (_isr0 + ((_isr1 - _isr0) * i)), IDT_GATE_INT, 0x10);
// printf("int %d: address: %x\n", i, _isr0 + (_isr1 - _isr0) * i);
} }
// printf("last ")
for(uint32_t i = 0; i < 16; i++){ for(uint32_t i = 0; i < 16; i++){
set_idt_entry(i + 32, (_irq0 + (_irq1 - _irq0) * i), IDT_GATE_INT, 0x10); set_idt_entry(i + 32, (_irq0 + ((_irq1 - _irq0) * i)), IDT_GATE_INT, 0x10);
printf("int %d: address: %x\n", i + 32, _irq0 + (_irq1 - _irq0) * i);
} }
idt_desc.pointer = (uint32_t)idt_table; idt_desc.pointer = (uint32_t)&idt_table;
idt_desc.size = sizeof(idt_table); idt_desc.size = sizeof(idt_entry_t) * 256 - 1;
asm volatile("lidt (%0)" : : "m"(idt_desc)); for(int i = 0; i < 16; i++){
interrupt_handlers[i] = 0;
}
// asm volatile("lidt (%0)" : : "m"(&idt_desc));
// outb(0x20, 0x11 );
// outb(0xa0, 0x11);
// outb(0x21, 0x20);
// outb(0xa1, 0x28);
// outb(0x21, 4);
// outb(0xa1, 2);
// outb(0x21, 1);
// outb(0xa1, 1);
// outb(0x21, 0);
// outb(0xa1, 0);
//set pic masks
// outb(0x21, 0);
// outb(0xa1, 0);
load_idt(&idt_desc);
} }

View File

@ -1,5 +1,34 @@
#include "pic.h" #include "pic.h"
#include "cpuio.h"
void init_pic(uint8_t idt_index){ void init_pic(uint8_t idt_index){
uint8_t a1 = inb(PIC1_DATA);
uint8_t a2 = inb(PIC2_DATA);
outb(PIC1_COMMAND, PIC_ICW1_INIT | PIC_ICW1_ICW4);
outb(PIC2_COMMAND, PIC_ICW1_INIT | PIC_ICW1_ICW4);
outb(PIC1_DATA, 32);
outb(PIC2_DATA, 40);
outb(PIC1_DATA, 4);
outb(PIC2_DATA, 2);
outb(PIC1_DATA, PIC_ICW4_8086);
outb(PIC2_DATA, PIC_ICW4_8086);
outb(PIC1_DATA, a1);
outb(PIC2_DATA, a2);
}
void pic_disable(){
outb(PIC1_DATA, 0xff);
outb(PIC2_DATA, 0xff);
}
void pic_setmask(uint8_t mask, uint16_t pic){
// if(pic != PIC1_DATA || pic != PIC2_DATA) return;
outb(pic, mask);
}
uint8_t pic_getmask(uint16_t pic){
// if(pic != PIC1_DATA || pic != PIC2_DATA) return 0;
return inb(pic);
} }

View File

@ -15,4 +15,12 @@
#define PIC_ICW1_INIT 0x10 #define PIC_ICW1_INIT 0x10
#define PIC_ICW4_8086 0x01 #define PIC_ICW4_8086 0x01
#define P #define PIC_ICW4_AUTO 0x02
#define PIC_ICW4_BUF_S 0x08
#define PIC_ICW4_BUF_M 0x0c
#define PIC_ICW4_SFNM 0x10
void init_pic(uint8_t idt_index);
void pic_disable();
void pic_setmask(uint8_t mask, uint16_t pic);
uint8_t pic_getmask(uint16_t pic);

View File

@ -4,6 +4,7 @@ extern kmain
section .text section .text
global _start global _start
_start: _start:
cld
mov esp, stack_top mov esp, stack_top
mov ebp, stack_top mov ebp, stack_top
push esi push esi

View File

@ -3,10 +3,17 @@
#include "shared/kstdlib.h" #include "shared/kstdlib.h"
#include "shared/interrupts.h" #include "shared/interrupts.h"
#include "drivers/serial.h" #include "drivers/serial.h"
#include "drivers/pic.h"
extern void kmain(kernel_info_t *kernel_info){ extern void kmain(kernel_info_t *kernel_info){
init_serial(); init_serial();
pm_init(kernel_info); pm_init(kernel_info);
init_idt(); init_idt();
init_pic(32);
pic_disable();
pic_setmask(0xfe, PIC1_DATA);
enable_interrupts();
printf("done\n");
for(;;);
return; return;
} }

View File

@ -5,6 +5,11 @@ void itoa(int64_t data, char *res, uint8_t base){
char carr[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char carr[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char negative = 0; char negative = 0;
if(res == 0) return; if(res == 0) return;
if(data == 0){
res[0] = '0';
res[1] = 0;
return;
}
if(data < 0 && base == 10){ if(data < 0 && base == 10){
data *= -1; data *= -1;
negative = 1; negative = 1;