diff cos/kernel/handlers.c @ 14:a58904747019

Added asm interrupt handler things, not yet working
author windel
date Mon, 14 Nov 2011 22:45:55 +0100
parents
children f3e3e0e9c4bc
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cos/kernel/handlers.c	Mon Nov 14 22:45:55 2011 +0100
@@ -0,0 +1,296 @@
+#include "kernel.h"
+
+void panic(char *msg) {
+  printf("Kernel panic: ");
+  printf(msg);
+  halt();
+}
+
+// Assembler wrapper prototypes:
+void INTDEF(void);
+void INT0(void);
+void INT1(void);
+void INT2(void);
+void INT3(void);
+void INT4(void);
+void INT5(void);
+void INT6(void);
+void INT7(void);
+void INT8(void);
+void INT9(void);
+void INT10(void);
+void INT11(void);
+void INT12(void);
+void INT13(void);
+void INT14(void);
+void INT15(void);
+void INT16(void);
+void INT17(void);
+void INT18(void);
+void INT19(void);
+// Remapped handlers:
+void INT32(void);
+void INT33(void);
+void INT34(void);
+
+// THE interrupt descriptor table:
+static struct IDT_entry idt[256];
+
+void setIDTentry(int num, void (*handler)())
+{
+  // Fill one entry with IDT info:
+  uint64_t offset;
+  unsigned short selector = 0x8; // Code selector
+  unsigned char type = 0x8E; // 32 bits interrupt gate. Thingy is present 
+
+  offset = (uint64_t) handler;
+
+  idt[num].b[0] = offset & 0xFF;
+  idt[num].b[1] = (offset >> 8) & 0xFF;
+  idt[num].b[2] = selector & 0xFF;
+  idt[num].b[3] = (selector >> 8) & 0xFF;
+  idt[num].b[4] = 0; // reserved
+  idt[num].b[5] = type;
+  idt[num].b[6] = (offset >> 16) & 0xFF;
+  idt[num].b[7] = (offset >> 24) & 0xFF;
+}
+
+void setupIDT(void) {
+  int i;
+  // Fill all vectors with the default handler:
+  for (i=0; i<256; i++) {
+    setIDTentry(i, &INTDEF);
+  }
+
+  // Now set other then default handler:
+  setIDTentry(0, INT0);
+  setIDTentry(1, INT1);
+  setIDTentry(2, INT2);
+  setIDTentry(3, INT3);
+  setIDTentry(4, INT4);
+  setIDTentry(5, INT5);
+  setIDTentry(6, INT6);
+  setIDTentry(7, INT7);
+  setIDTentry(8, INT8);
+  setIDTentry(9, INT9);
+  setIDTentry(10, INT10);
+  setIDTentry(11, INT11);
+  setIDTentry(12, INT12);
+  setIDTentry(13, INT13);
+  setIDTentry(14, INT14);
+  setIDTentry(15, INT15);
+  setIDTentry(16, INT16);
+  setIDTentry(17, INT17);
+  setIDTentry(18, INT18);
+  setIDTentry(19, INT19);
+  /* reserved interrupts: */
+  // From int20 - int31
+  setIDTentry(32, INT32);
+  setIDTentry(33, INT33);
+  setIDTentry(34, INT34);
+
+  // call load IDT asm function:
+  loadIDT(idt, 256*8-1);
+
+  PICremap();
+  enableinterrupts();
+}
+
+// PIC functions:
+void PICremap() {
+  unsigned char maskmaster, maskslave, pic1, pic2;
+  pic1 = 0x20; // remapping location master
+  pic2 = 0x28;
+  maskmaster = inb(0x21); // master cmd=0x20, data=0x21
+  maskslave = inb(0xA1); // slave command=0xA0, data=0xA1
+
+  outb(0x20, 0x20); // end of init
+
+  outb(0x20, 0x11); // init + ICW1_ICW2
+  outb(0xA0, 0x11); // init + ICW1_ICW2
+    
+  outb(0x21, pic1); // ICW2, write offset
+  outb(0xA1, pic2); // ICW2
+
+  outb(0x21, 4); // ICW3, write a 4!
+  outb(0xA1, 2); // ICW3, write a 2!
+
+  outb(0x21, 1); // ICW4, 8086 mode
+  outb(0xA1, 1); // ICW4
+
+  outb(0x21, maskmaster);
+  outb(0xA1, maskslave);
+}
+
+// Interrupt service routines:
+
+void INT0handler() 
+{
+  printf("INT0 called!\n");
+  panic("Unhandled exception!");
+}
+
+void INT1handler() 
+{
+  printf("INT1 called!\n");
+  panic("Unhandled exception!");
+}
+
+void INT2handler() 
+{
+  printf("INT2 called!\n");
+  panic("Unhandled exception!");
+}
+
+void INT3handler() 
+{
+  printf("INT3 called!\n");
+  panic("Unhandled exception!");
+}
+
+void INT4handler() 
+{
+  printf("INT4 called!\n");
+  panic("Unhandled exception!");
+}
+
+void INT5handler() 
+{
+  printf("INT5 called!\n");
+  panic("Unhandled exception!");
+}
+
+void INT6handler() 
+{
+  printf("INT6 called!\n");
+  panic("Unhandled exception!");
+}
+
+void INT7handler() 
+{
+  printf("INT7 called!\n");
+  panic("Unhandled exception!");
+}
+
+void INT8handler() 
+{
+  printf("INT8 called!\n");
+  panic("Unhandled exception!");
+}
+
+void INT9handler() 
+{
+  printf("INT9 called!\n");
+  panic("Unhandled exception!");
+}
+
+void INT10handler() 
+{
+  printf("INT10 called!\n");
+  panic("Unhandled exception!");
+}
+
+void INT11handler() 
+{
+  printf("INT11 called!\n");
+  panic("Unhandled exception!");
+}
+
+void INT12handler() 
+{
+  printf("INT12 called!\n");
+  panic("Unhandled exception!");
+}
+
+void INT13handler() 
+{
+  printf("INT13 called!\n");
+  panic("Unhandled exception!");
+}
+
+void* getUnusedPage() {
+ return 0;
+
+}
+
+void mappage(uint32_t address) {
+  uint32_t pageDirIndex = address >> 22;
+  uint32_t pageTableIndex = (address >> 12) & 0x3FF;
+
+  printf("Allocating page at %d, tableindex=%d\n", pageDirIndex, pageTableIndex);
+  //uint32_t *pageTable = (uint32_t*)(pageDirectory[pageDirIndex] & 0xFFFFFC00);
+ 
+
+}
+
+void INT14handler(unsigned int address) 
+{
+  printf("INT14 called! Page fault for address 0x%x!\n", address);
+  if ( (address & 0xF0000000) == 0xD0000000 ) {
+    mappage(address & 0xFFFFF000);
+    return;
+  }
+
+  panic("Unhandled exception!");
+}
+
+void INT15handler() 
+{
+  printf("INT15 called!\n");
+  panic("Unhandled exception!");
+}
+
+void INT16handler() 
+{
+  printf("INT16 called!\n");
+  panic("Unhandled exception!");
+}
+
+void INT17handler() 
+{
+  printf("INT17 called!\n");
+  panic("Unhandled exception!");
+}
+
+void INT18handler() 
+{
+  printf("INT18 called!\n");
+  panic("Unhandled exception!");
+}
+
+void INT19handler() 
+{
+  printf("INT19 called!\n");
+  panic("Unhandled exception!");
+}
+
+// remapped IRQ from master PIC:
+void INT32handler() 
+{
+  // System timer.
+  //printf("INT32 called!\n");
+  // called very frequent, what is this?
+  timerDriverUpdate();
+  outb(0x20, 0x20); // EOI to master
+}
+
+void INT33handler() 
+{
+  //printf("INT33 called, key pressed????\n");
+  unsigned char scancode = inb(0x60);
+  //printf("Scancode = 0x%x\n", scancode);
+  keyboardDriverUpdate(scancode);
+  outb(0x20, 0x20); // EOI to master
+}
+
+void INT34handler() 
+{
+  printf("INT34 called!\n");
+}
+
+void INTDEF_handler() 
+{
+  printf("Default int handler called\n");
+}
+
+