upd
This commit is contained in:
@@ -39,6 +39,10 @@ typedef struct {
|
||||
uint32_t int_no, err_code;
|
||||
uint32_t eip, cs, eflags, useresp, ss;
|
||||
} INT_registers_t;
|
||||
typedef struct {
|
||||
uint8_t inuse;
|
||||
void* callback;
|
||||
} IRQ_entry_t;
|
||||
|
||||
inline void PIC_sendEOI(uint8_t irq) {
|
||||
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 idt_set_descriptor(uint8_t vector, void* isr, uint8_t flags);
|
||||
void idt_init();
|
||||
void IRQ_registerhandler(uint8_t vector, void* callback);
|
||||
|
||||
__attribute__((aligned(0x10)))
|
||||
extern idt_entry_t idt[256];
|
||||
@@ -60,3 +65,4 @@ extern void* isr_stub_table[];
|
||||
extern void* irq_stub_table[];
|
||||
extern uint8_t INT_vectors[IDT_MAX_DESCRIPTORS];
|
||||
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");
|
||||
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"
|
||||
};
|
||||
IRQ_entry_t IRQ_entries[16];
|
||||
|
||||
void PIC_remap(int offset1, int offset2) {
|
||||
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);
|
||||
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() {
|
||||
idtr.base = (uint32_t)&idt[0];
|
||||
@@ -85,3 +88,7 @@ void idt_init() {
|
||||
|
||||
__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) {
|
||||
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) {
|
||||
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++) {
|
||||
VGA_setpix(x,y,(VGA_pixel){0x00,0xFF,0x00});
|
||||
}
|
||||
}
|
||||
size_t x=0;
|
||||
size_t y=0;
|
||||
while (*msg != 0) {
|
||||
if (*msg == '\n') {
|
||||
y ++;
|
||||
x = 0;
|
||||
msg ++;
|
||||
continue;
|
||||
}
|
||||
_VGA_renchar(x++,y,*msg++,(uint8_t[]){0xFF,0xFF,0xFF},(uint8_t[]){0x00,0xFF,0x00});
|
||||
}
|
||||
size_t x=0;
|
||||
size_t y=0;
|
||||
while (*msg != 0) {
|
||||
if (*msg == '\n') {
|
||||
y ++;
|
||||
x = 0;
|
||||
msg ++;
|
||||
continue;
|
||||
}
|
||||
_VGA_renchar(x++,y,*msg++,(uint8_t[]){0xFF,0xFF,0xFF},(uint8_t[]){0x00,0xFF,0x00});
|
||||
}
|
||||
|
||||
while (1) {}
|
||||
}
|
||||
void memset(void* dest, size_t size, uint8_t value) {
|
||||
|
||||
Reference in New Issue
Block a user