static bool isr13(registers_t regs){ console_printErr("GPF: Error code: 0x"); console_printNum(regs.err_code,16); // print the error code, broken down into human-readable values // format: [reserved=FOO, index=BAR, table=BAZ; external/internal] console_print(": [reserved="); console_printNum((regs.err_code&0xFFFF0000) >> 16, 16); console_print(", index=0x"); console_printNum((regs.err_code&0xFFF8) >> 3, 16); console_print(", table="); uint8_t tbl = (regs.err_code&0x6) >> 1; switch(tbl){ case 0: console_print("GDT"); break; case 1: case 3: console_print("IDT"); break; case 2: console_print("LDT"); break; } if(regs.err_code & 1) console_print("; external]\n"); else console_print("; internal]\n"); console_print("Offending address (CS:EIP) = 0x"); console_printNum(regs.cs,16); console_print(":0x"); console_printNum(regs.eip,16); console_putChar('\n'); hang(); return false; }
// This is the function that handles all interrupt service routines. void desctab_isrHandler(registers_t regs){ statusbar_clearMsg(); statusbar_printMsg("90Interrupt #"); statusbar_printNum(regs.int_no, 10); if(doesIntHaveErrCode(regs.int_no)){ statusbar_printMsg(" E:0x"); statusbar_printNum(regs.err_code, 16); } statusbar_setInterruptFlag(UNHANDLED); bool handled; if(_interrupt_handlers[regs.int_no] == NULL){ handled = false; }else handled = _interrupt_handlers[regs.int_no](regs); if(handled) statusbar_setInterruptFlag(HANDLED); else{ console_printWarn("Interrupt #"); console_printNum(regs.int_no, 10); console_print(" raised but unhandled."); if(doesIntHaveErrCode(regs.int_no)){ console_print(" Error code: 0x"); console_printNum(regs.err_code,16); } console_putChar('\n'); //console_printWarn("04THIS DAMAGES MY CALM.\n"); hang(); } }
/* Handles the keyboard interrupt */ void keyboard_handler(struct regs *r){ (void) r; unsigned char scancode; /* Read from the keyboard's data buffer */ scancode = inportb(0x60); /* If the top bit of the byte we read from the keyboard is * set, that means that a key has just been released */ if (scancode & 0x80) { /* You can use this one to see if the user released the * shift, alt, or control keys... */ } else { /* Here, a key was just pressed. Please note that if you * hold a key down, you will get repeated key press * interrupts. */ /* Just to show you how this works, we simply translate * the keyboard scancode into an ASCII value, and then * display it to the screen. You can get creative and * use some flags to see if a shift is pressed and use a * different layout, or you can add another 128 entries * to the above layout to correspond to 'shift' being * held. If shift is held using the larger lookup table, * you would add 128 to the scancode when you look for it */ console_putChar(kbdus[scancode]); } }
static bool isr1(registers_t regs){ console_printInfo("Dumping state. Printing passed registers:"); console_print("\n\teax: 0x"); console_printNum(regs.eax,16); console_print("\tebx: 0x"); console_printNum(regs.ebx,16); console_print("\tecx: 0x"); console_printNum(regs.ecx,16); console_print("\tedx: 0x"); console_printNum(regs.edx,16); console_print("\n\tss: 0x"); console_printNum(regs.ss,16); console_print("\tds: 0x"); console_printNum(regs.ds,16); console_print("\tcs: 0x"); console_printNum(regs.cs,16); console_print("\n\tedi: 0x"); console_printNum(regs.edi,16); console_print("\tesi: 0x"); console_printNum(regs.esi,16); console_print("\tebp: 0x"); console_printNum(regs.ebp,16); console_print("\tesp: 0x"); console_printNum(regs.esp,16); console_print("\n\teip: 0x"); console_printNum(regs.eip,16); console_print("\teflags: 0x"); console_printNum(regs.eflags,16); console_print("\tuseresp: 0x"); console_printNum(regs.useresp,16); console_putChar('\n'); return true; }