jankos/interrupts.c

151 lines
4.8 KiB
C

#include "stlio.h"
#include "interrupts.h"
#include "serial.h"
#include "mem.h"
#include "types.h"
const char* err_msg[] = {
"Divide by zero\n",
"Debug Exception\n",
"Non Maskable Interrupt Exception\n",
"Breakpoint Exception\n",
"Into Detected Overflow Exception\n",
"Out of Bounds Exception\n",
"Invalid Opcode Exception\n",
"No Coprocessor Exception\n",
"Double Fault Exception\n",
"Coprocessor Segment Overrun Exception\n",
"Bad TSS Exception\n",
"Segment Not Present Exception\n",
"Stack Fault Exception\n",
"General Protection Fault Exception\n",
"Page Fault Exception\n",
"Unknown Interrupt Exception\n",
"Coprocessor Fault Exception\n",
"Alignment Check Exception (486+)\n",
"Machine Check Exception (Pentium/586+)\n",
"Reserved Exceptions\n", /* for 19 - 31 */
};
extern void load_idt(); // found in interrupts_entry.s
extern void no_err_handler_1();
extern void no_err_handler_2();
extern void no_err_handler_3();
extern void no_err_handler_4();
extern void no_err_handler_5();
extern void no_err_handler_6();
extern void no_err_handler_7();
extern void err_code_handler_8();
extern void no_err_handler_9();
extern void err_code_handler_10();
extern void err_code_handler_11();
extern void err_code_handler_12();
extern void err_code_handler_13();
extern void err_code_handler_14();
extern void no_err_handler_15();
extern void no_err_handler_16();
extern void err_code_handler_17();
extern void no_err_handler_18();
extern void no_err_handler_19();
extern void no_err_handler_20();
extern void no_err_handler_21();
extern void no_err_handler_22();
extern void no_err_handler_23();
extern void no_err_handler_24();
extern void no_err_handler_25();
extern void no_err_handler_26();
extern void no_err_handler_27();
extern void no_err_handler_28();
extern void no_err_handler_29();
extern void no_err_handler_30();
extern void no_err_handler_31();
extern void no_err_handler_32();
void setup_idt_entry(u32 t_idx, u32 base, u16 sel, u8 type_attrs) {
// Configuring a single given entry in the IDT table
IDT[t_idx].offset_low = (base & 0xffff);
IDT[t_idx].offset_high = ((base >> 16) & 0xffff);
IDT[t_idx].type_attrs = type_attrs;
IDT[t_idx].zero = 0;
IDT[t_idx].selector = sel;
}
void int_keyboard(struct cpu_reg_state* cpu) {
// Get the keycode from the serial buffer
char code = serial_read_buffer(0x60);
if((u8)code < 0x80 || (u8)code > 0x1f) {
putch(code);
}
}
// Generic interrupt handler to be used later on
void interrupt_handler(struct cpu_reg_state* cpu) {
// treating things on the stack like it were a cpu_reg_state
// NOTE: dummy stuff to stop gcc from complaining atm
printf("handled exception\n");
if(cpu->int_no < 32) {
printf(err_msg[cpu->int_no]);
}
for(;;);
//serial_pic_ack(cpu->int_no);
return;
}
void init_idt() {
// setup special idt pointer
idt_ptr.address = (u32)(&IDT);
idt_ptr.limit = (sizeof(struct IDT_Entry) * IDT_SIZE) - 1;
// clear table
memset((u8*)IDT, 0x00, (sizeof(struct IDT_Entry) * IDT_SIZE));
// add interrupt service routines here
setup_idt_entry(0,(u32)no_err_handler_1,0x08, 0x8e);
setup_idt_entry(1,(u32)no_err_handler_2,0x08, 0x8e);
setup_idt_entry(2,(u32)no_err_handler_3,0x08, 0x8e);
setup_idt_entry(3,(u32)no_err_handler_4,0x08, 0x8e);
setup_idt_entry(4,(u32)no_err_handler_5,0x08, 0x8e);
setup_idt_entry(5,(u32)no_err_handler_6,0x08, 0x8e);
setup_idt_entry(6,(u32)no_err_handler_7,0x08, 0x8e);
setup_idt_entry(7,(u32)err_code_handler_8,0x08, 0x8e);
setup_idt_entry(8,(u32)no_err_handler_9,0x08, 0x8e);
setup_idt_entry(9,(u32)err_code_handler_10,0x08, 0x8e);
setup_idt_entry(10,(u32)err_code_handler_11,0x08, 0x8e);
setup_idt_entry(11,(u32)err_code_handler_12,0x08, 0x8e);
setup_idt_entry(12,(u32)err_code_handler_13,0x08, 0x8e);
setup_idt_entry(13,(u32)err_code_handler_14,0x08, 0x8e);
setup_idt_entry(14,(u32)no_err_handler_15,0x08, 0x8e);
setup_idt_entry(15,(u32)no_err_handler_16,0x08, 0x8e);
setup_idt_entry(16,(u32)err_code_handler_17,0x08, 0x8e);
setup_idt_entry(17,(u32)no_err_handler_18,0x08, 0x8e);
setup_idt_entry(18,(u32)no_err_handler_19,0x08, 0x8e);
setup_idt_entry(19,(u32)no_err_handler_20,0x08, 0x8e);
setup_idt_entry(20,(u32)no_err_handler_21,0x08, 0x8e);
setup_idt_entry(21,(u32)no_err_handler_22,0x08, 0x8e);
setup_idt_entry(22,(u32)no_err_handler_23,0x08, 0x8e);
setup_idt_entry(23,(u32)no_err_handler_24,0x08, 0x8e);
setup_idt_entry(24,(u32)no_err_handler_25,0x08, 0x8e);
setup_idt_entry(25,(u32)no_err_handler_26,0x08, 0x8e);
setup_idt_entry(26,(u32)no_err_handler_27,0x08, 0x8e);
setup_idt_entry(27,(u32)no_err_handler_28,0x08, 0x8e);
setup_idt_entry(28,(u32)no_err_handler_29,0x08, 0x8e);
setup_idt_entry(29,(u32)no_err_handler_30,0x08, 0x8e);
setup_idt_entry(30,(u32)no_err_handler_31,0x08, 0x8e);
setup_idt_entry(31,(u32)no_err_handler_32,0x08, 0x8e);
// Load IDT with all the new information in place, ready to use
load_idt();
}