Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Release 1.0
[palacios.git] / misc / test_vm / src / geekos / int.c
diff --git a/misc/test_vm/src/geekos/int.c b/misc/test_vm/src/geekos/int.c
new file mode 100644 (file)
index 0000000..2c59a5f
--- /dev/null
@@ -0,0 +1,123 @@
+/*
+ * GeekOS interrupt handling data structures and functions
+ * Copyright (c) 2001,2003 David H. Hovemeyer <daveho@cs.umd.edu>
+ * $Revision: 1.1 $
+ * 
+ * This is free software.  You are permitted to use,
+ * redistribute, and modify it as specified in the file "COPYING".
+ */
+
+#include <geekos/idt.h>         /* x86-specific int handling stuff */
+#include <geekos/screen.h>
+#include <geekos/kassert.h>
+#include <geekos/int.h>
+#include <geekos/serial.h>
+
+#include <geekos/cpu.h>
+
+/*
+ * Defined in lowlevel.asm.
+ */
+ulong_t Get_Current_EFLAGS(void);
+
+/* ----------------------------------------------------------------------
+ * Private functions and data
+ * ---------------------------------------------------------------------- */
+
+/*
+ * A dummy interrupt handler function.
+ * Ensures that the low-level interrupt code always
+ * has a handler to call.
+ */
+static void Dummy_Interrupt_Handler(struct Interrupt_State* state)
+{
+  Begin_IRQ(state);
+
+  Print("Unexpected Interrupt!  Ignoring!\n");
+  SerialPrint("*** Unexpected interrupt! *** Ignoring!\n");
+  Dump_Interrupt_State(state);
+
+  End_IRQ(state);
+  
+  //  STOP();
+}
+
+#if 0
+static void Print_Selector(const char* regName, uint_t value)
+{
+    Print("%s: index=%d, ti=%d, rpl=%d\n",
+       regName, value >> 3, (value >> 2) & 1, value & 3);
+}
+#endif
+
+static void SerialPrint_Selector(const char* regName, uint_t value)
+{
+    SerialPrint("%s: index=%d, ti=%d, rpl=%d\n",
+       regName, value >> 3, (value >> 2) & 1, value & 3);
+}
+
+/* ----------------------------------------------------------------------
+ * Public functions
+ * ---------------------------------------------------------------------- */
+
+/*
+ * Initialize the interrupt system.
+ */
+void Init_Interrupts(void)
+{
+    int i;
+
+    PrintBoth("Initializing Interrupts\n");
+
+    /* Low-level initialization.  Build and initialize the IDT. */
+    Init_IDT();
+
+    /*
+     * Initialize all entries of the handler table with a dummy handler.
+     * This will ensure that we always have a handler function to call.
+     */
+    for (i = 0; i < NUM_IDT_ENTRIES; ++i) {
+       Install_Interrupt_Handler(i, Dummy_Interrupt_Handler);
+    }
+
+    /* Re-enable interrupts */
+    Enable_Interrupts();
+}
+
+/*
+ * Query whether or not interrupts are currently enabled.
+ */
+bool Interrupts_Enabled(void)
+{
+    ulong_t eflags = Get_Current_EFLAGS();
+    return (eflags & EFLAGS_IF) != 0;
+}
+
+/*
+ * Dump interrupt state struct to screen
+ */
+void Dump_Interrupt_State(struct Interrupt_State* state)
+{
+    uint_t errorCode = state->errorCode;
+
+   SerialPrint("eax=%08x ebx=%08x ecx=%08x edx=%08x\n"
+          "esi=%08x edi=%08x ebp=%08x\n"
+          "eip=%08x cs=%08x eflags=%08x\n"
+          "Interrupt number=%d, error code=%d\n"
+          "index=%d, TI=%d, IDT=%d, EXT=%d\n",
+       state->eax, state->ebx, state->ecx, state->edx,
+       state->esi, state->edi, state->ebp,
+       state->eip, state->cs, state->eflags,
+       state->intNum,  errorCode,
+       errorCode >> 3, (errorCode >> 2) & 1, (errorCode >> 1) & 1, errorCode & 1
+    );
+    if (Is_User_Interrupt(state)) {
+       struct User_Interrupt_State *ustate = (struct User_Interrupt_State*) state;
+       SerialPrint("user esp=%08x, user ss=%08x\n", ustate->espUser, ustate->ssUser);
+    }
+    SerialPrint_Selector("cs", state->cs);
+    SerialPrint_Selector("ds", state->ds);
+    SerialPrint_Selector("es", state->es);
+    SerialPrint_Selector("fs", state->fs);
+    SerialPrint_Selector("gs", state->gs);
+}