Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
// 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();
    }
}
Exemplo n.º 3
0
/* 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]);
    }
}
Exemplo n.º 4
0
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;
}