upd
This commit is contained in:
@@ -39,6 +39,10 @@ typedef struct {
|
|||||||
uint32_t int_no, err_code;
|
uint32_t int_no, err_code;
|
||||||
uint32_t eip, cs, eflags, useresp, ss;
|
uint32_t eip, cs, eflags, useresp, ss;
|
||||||
} INT_registers_t;
|
} INT_registers_t;
|
||||||
|
typedef struct {
|
||||||
|
uint8_t inuse;
|
||||||
|
void* callback;
|
||||||
|
} IRQ_entry_t;
|
||||||
|
|
||||||
inline void PIC_sendEOI(uint8_t irq) {
|
inline void PIC_sendEOI(uint8_t irq) {
|
||||||
if (irq >= 8) { // slave also needs EOI
|
if (irq >= 8) { // slave also needs EOI
|
||||||
@@ -52,6 +56,7 @@ void INT_exhand(INT_registers_t regs);
|
|||||||
void INT_IRQ(uint8_t IRQ, INT_registers_t regs);
|
void INT_IRQ(uint8_t IRQ, INT_registers_t regs);
|
||||||
void idt_set_descriptor(uint8_t vector, void* isr, uint8_t flags);
|
void idt_set_descriptor(uint8_t vector, void* isr, uint8_t flags);
|
||||||
void idt_init();
|
void idt_init();
|
||||||
|
void IRQ_registerhandler(uint8_t vector, void* callback);
|
||||||
|
|
||||||
__attribute__((aligned(0x10)))
|
__attribute__((aligned(0x10)))
|
||||||
extern idt_entry_t idt[256];
|
extern idt_entry_t idt[256];
|
||||||
@@ -59,4 +64,5 @@ extern idtr_t idtr;
|
|||||||
extern void* isr_stub_table[];
|
extern void* isr_stub_table[];
|
||||||
extern void* irq_stub_table[];
|
extern void* irq_stub_table[];
|
||||||
extern uint8_t INT_vectors[IDT_MAX_DESCRIPTORS];
|
extern uint8_t INT_vectors[IDT_MAX_DESCRIPTORS];
|
||||||
extern char *exception_messages[];
|
extern char *exception_messages[];
|
||||||
|
extern IRQ_entry_t IRQ_entries[16];
|
||||||
@@ -73,5 +73,16 @@ void kernel_main(struct multiboot_info* header, uint32_t magic) {
|
|||||||
asm volatile("sti");
|
asm volatile("sti");
|
||||||
kputstr("OK\n");
|
kputstr("OK\n");
|
||||||
|
|
||||||
|
while (1) {}
|
||||||
|
|
||||||
|
kputstr("Initializing Timer: ");
|
||||||
|
uint32_t divisor = 1193180 / 1000;
|
||||||
|
uint8_t low = (uint8_t)(divisor & 0xFF);
|
||||||
|
uint8_t high = (uint8_t)( (divisor >> 8) & 0xFF);
|
||||||
|
outb(0x43, 0x36);
|
||||||
|
outb(0x40, low);
|
||||||
|
outb(0x40, high);
|
||||||
|
kputstr("OK\n");
|
||||||
|
|
||||||
|
while (1) {}
|
||||||
}
|
}
|
||||||
@@ -40,6 +40,7 @@ char *exception_messages[] = {
|
|||||||
"Reserved",
|
"Reserved",
|
||||||
"Reserved"
|
"Reserved"
|
||||||
};
|
};
|
||||||
|
IRQ_entry_t IRQ_entries[16];
|
||||||
|
|
||||||
void PIC_remap(int offset1, int offset2) {
|
void PIC_remap(int offset1, int offset2) {
|
||||||
outb(PIC1_COMMAND, ICW1_INIT | ICW1_ICW4); // starts the initialization sequence (in cascade mode)
|
outb(PIC1_COMMAND, ICW1_INIT | ICW1_ICW4); // starts the initialization sequence (in cascade mode)
|
||||||
@@ -72,8 +73,10 @@ void INT_exhand(INT_registers_t regs) {
|
|||||||
strcon(msg,temp);
|
strcon(msg,temp);
|
||||||
kpanic(msg);
|
kpanic(msg);
|
||||||
}
|
}
|
||||||
void INT_IRQ(uint8_t IRQ, INT_registers_t regs) {
|
void INT_IRQ(INT_registers_t regs) {
|
||||||
|
if (IRQ_entries[regs.int_no].inuse) {
|
||||||
|
(void (*)(INT_registers_t))IRQ_entries[regs.int_no].callback(regs);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
void idt_init() {
|
void idt_init() {
|
||||||
idtr.base = (uint32_t)&idt[0];
|
idtr.base = (uint32_t)&idt[0];
|
||||||
@@ -84,4 +87,8 @@ void idt_init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
__asm__ volatile ("lidt %0" : : "m"(idtr)); // load the new IDT
|
__asm__ volatile ("lidt %0" : : "m"(idtr)); // load the new IDT
|
||||||
|
}
|
||||||
|
void IRQ_registerhandler(uint8_t vector, void* callback) {
|
||||||
|
IRQ_entries[vector].inuse = 1;
|
||||||
|
IRQ_entries[vector].callback = callback;
|
||||||
}
|
}
|
||||||
@@ -26,27 +26,29 @@ uint8_t uitoa32(uint32_t x, char* str) {
|
|||||||
}
|
}
|
||||||
void memcopy(void* dest, void* src, size_t size) {
|
void memcopy(void* dest, void* src, size_t size) {
|
||||||
for (size_t i=0;i<size;i++) {
|
for (size_t i=0;i<size;i++) {
|
||||||
((uint8_t*)dest)[i] = ((uint8_t*)src)[i];
|
((uint8_t*)dest)[i] = *(uint8_t*)src++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void kpanic(char* msg) {
|
void kpanic(char* msg) {
|
||||||
asm volatile("cli");
|
asm volatile("cli");
|
||||||
for (uint16_t x=0;x<VGA_sizex;x++) {
|
|
||||||
|
for (uint16_t x=0;x<VGA_sizex;x++) {
|
||||||
for (uint16_t y=0;y<VGA_sizey;y++) {
|
for (uint16_t y=0;y<VGA_sizey;y++) {
|
||||||
VGA_setpix(x,y,(VGA_pixel){0x00,0xFF,0x00});
|
VGA_setpix(x,y,(VGA_pixel){0x00,0xFF,0x00});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
size_t x=0;
|
size_t x=0;
|
||||||
size_t y=0;
|
size_t y=0;
|
||||||
while (*msg != 0) {
|
while (*msg != 0) {
|
||||||
if (*msg == '\n') {
|
if (*msg == '\n') {
|
||||||
y ++;
|
y ++;
|
||||||
x = 0;
|
x = 0;
|
||||||
msg ++;
|
msg ++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
_VGA_renchar(x++,y,*msg++,(uint8_t[]){0xFF,0xFF,0xFF},(uint8_t[]){0x00,0xFF,0x00});
|
_VGA_renchar(x++,y,*msg++,(uint8_t[]){0xFF,0xFF,0xFF},(uint8_t[]){0x00,0xFF,0x00});
|
||||||
}
|
}
|
||||||
|
|
||||||
while (1) {}
|
while (1) {}
|
||||||
}
|
}
|
||||||
void memset(void* dest, size_t size, uint8_t value) {
|
void memset(void* dest, size_t size, uint8_t value) {
|
||||||
|
|||||||
Reference in New Issue
Block a user