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] / geekos / include / geekos / int.h
diff --git a/geekos/include/geekos/int.h b/geekos/include/geekos/int.h
new file mode 100644 (file)
index 0000000..0097777
--- /dev/null
@@ -0,0 +1,185 @@
+/*
+ * GeekOS interrupt handling data structures and functions
+ * Copyright (c) 2001, 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".
+ */
+
+/*
+ * This module describes the C interface which must be implemented
+ * by interrupt handlers, and has the initialization function
+ * for the interrupt system as a whole.
+ */
+
+#ifndef GEEKOS_INT_H
+#define GEEKOS_INT_H
+
+#include <geekos/kassert.h>
+#include <geekos/ktypes.h>
+#include <geekos/defs.h>
+
+
+// to stop the compilation warnings
+extern void Print(const char* fmt, ...); 
+extern void Set_Current_Attr(uchar_t attrib);
+
+/*
+ * This struct reflects the contents of the stack when
+ * a C interrupt handler function is called.
+ * It must be kept up to date with the code in "lowlevel.asm".
+ */
+struct Interrupt_State {
+    /*
+     * The register contents at the time of the exception.
+     * We save these explicitly.
+     */
+    uint_t gs;
+    uint_t fs;
+    uint_t es;
+    uint_t ds;
+    uint_t ebp;
+    uint_t edi;
+    uint_t esi;
+    uint_t edx;
+    uint_t ecx;
+    uint_t ebx;
+    uint_t eax;
+
+    /*
+     * We explicitly push the interrupt number.
+     * This makes it easy for the handler function to determine
+     * which interrupt occurred.
+     */
+    uint_t intNum;
+
+    /*
+     * This may be pushed by the processor; if not, we push
+     * a dummy error code, so the stack layout is the same
+     * for every type of interrupt.
+     */
+    uint_t errorCode;
+
+    /* These are always pushed on the stack by the processor. */
+    uint_t eip;
+    uint_t cs;
+    uint_t eflags;
+};
+
+/*
+ * An interrupt that occurred in user mode.
+ * If Is_User_Interrupt(state) returns true, then the
+ * Interrupt_State object may be cast to this kind of struct.
+ */
+struct User_Interrupt_State {
+    struct Interrupt_State state;
+    uint_t espUser;
+    uint_t ssUser;
+};
+
+static __inline__ bool Is_User_Interrupt(struct Interrupt_State *state)
+{
+    return (state->cs & 3) == USER_PRIVILEGE;
+}
+
+
+/*
+ * The signature of an interrupt handler.
+ */
+typedef void (*Interrupt_Handler)(struct Interrupt_State* state);
+
+/*
+ * Perform all low- and high-level initialization of the
+ * interrupt system.
+ */
+void Init_Interrupts(void);
+
+/*
+ * Query whether or not interrupts are currently enabled.
+ */
+bool Interrupts_Enabled(void);
+
+/*
+ * Block interrupts.
+ */
+static __inline__ void __Disable_Interrupts(void)
+{
+    __asm__ __volatile__ ("cli");
+}
+#define Disable_Interrupts()           \
+do {                                   \
+    KASSERT(Interrupts_Enabled());     \
+    __Disable_Interrupts();            \
+} while (0)
+
+/*
+ * Unblock interrupts.
+ */
+static __inline__ void __Enable_Interrupts(void)
+{
+    __asm__ __volatile__ ("sti");
+}
+#define Enable_Interrupts()            \
+do {                                   \
+    KASSERT(!Interrupts_Enabled());    \
+    __Enable_Interrupts();             \
+} while (0)
+
+/*
+ * Dump interrupt state struct to screen
+ */
+void Dump_Interrupt_State(struct Interrupt_State* state);
+
+/**
+ * Start interrupt-atomic region.
+ * @return true if interrupts were enabled at beginning of call,
+ * false otherwise.
+ */
+static __inline__ bool Begin_Int_Atomic(void) 
+{
+    bool enabled = Interrupts_Enabled();
+    if (enabled)
+       Disable_Interrupts();
+    return enabled;
+}
+
+/**
+ * End interrupt-atomic region.
+ * @param iflag the value returned from the original Begin_Int_Atomic() call.
+ */
+static __inline__ void End_Int_Atomic(bool iflag)
+{
+    KASSERT(!Interrupts_Enabled());
+    if (iflag) {
+       /* Interrupts were originally enabled, so turn them back on */
+       Enable_Interrupts();
+    }
+}
+
+#define EXCEPTION_DE   0   // Divide by zero
+#define EXCEPTION_DB   1   // reserved
+#define EXCEPTION_NMI  2   // NMI
+#define EXCEPTION_BP   3   // Breakpoint
+#define EXCEPTION_OF   4   // Overflow
+#define EXCEPTION_BR   5   // Bound range exceeded
+#define EXCEPTION_UD   6   // Undefined opcode
+#define EXCEPTION_NM   7   // Math coprocessor gone missing
+#define EXCEPTION_DF   8   // Double fault
+#define EXCEPTION_CO   9   // Coprocessor segment overrrun
+#define EXCEPTION_TS   10  // Invalid TSS
+#define EXCEPTION_NP   11  // Segment not present
+#define EXCEPTION_SS   12  // Stack segment fault
+#define EXCEPTION_GP   13  // General Protection fault
+#define EXCEPTION_PF   14  // Page Fault
+#define EXCEPTION_RES  15  // reserved
+#define EXCEPTION_MF   16  // Math fault
+#define EXCEPTION_AC   17  // Alignment check
+#define EXCEPTION_MC   18  // Machine check
+#define EXCEPTION_XF   19  // SIMD FP exception
+// 20+ are reserved
+
+
+
+
+#endif  /* GEEKOS_INT_H */