--- /dev/null
+#ifndef __SIMPLE_PIC_H
+#define __SIMPLE_PIC_H
+#include <palacios/vm_dev.h>
+
+struct vm_device * create_pic();
+
+#endif
 
--- /dev/null
+#ifndef __TIMER_H
+#define __TIMER_H
+
+#include <palacios/vm_dev.h>
+
+
+
+struct vm_device * create_timer();
+
+
+
+
+#endif
 
--- /dev/null
+#ifndef __VMM_IRQ_H
+#define __VMM_IRQ_H
+
+#if 0
+#include <palacios/vmm_types.h>
+
+
+struct vmm_irq_hook;
+
+
+
+
+struct vmm_irq_hook {
+  uint_t irq;
+  void * private_data;
+
+  int(*handler)(uint_t irq, void * private_data);
+
+  struct vmm_irq_hook *next, *prev;
+};
+
+
+void init_irq_map(struct vmm_irq_map * map);
+
+
+int hook_irq(struct vmm_irq_map * map, uint_t irq, 
+            int(*handler)(uint_t irq, void * private_data), 
+            void * private_data);
+
+
+int unhook_irq(struct vmm_irq_map * map, uint_t irq);
+
+struct vmm_irq_hook * get_irq_hook(struct vmm_irq_map * map, uint_t irq);
+
+#endif
+#endif
 
--- /dev/null
+#include <devices/simple_pic.h>
+#include <palacios/vmm_intr.h>
+#include <palacios/vmm_types.h>
+#include <palacios/vmm.h>
+
+struct pic_internal {
+  int pending_irq;
+  int error_code;
+};
+
+
+int pic_intr_pending(void * private_data) {
+  struct pic_internal * data = (struct pic_internal *)private_data;
+  
+  return (data->pending_irq > 0);
+}
+
+int pic_raise_intr(void * private_data, int irq, int error_code) {
+  struct pic_internal * data = (struct pic_internal *)private_data;
+
+  data->pending_irq = irq;
+  data->error_code = error_code;
+
+  return 0;
+}
+
+
+int pic_get_intr_number(void * private_data) {
+  struct pic_internal * data = (struct pic_internal *)private_data;
+
+  return data->pending_irq;
+}
+
+
+static struct intr_ctrl_ops intr_ops = {
+  .intr_pending = pic_intr_pending,
+  .get_intr_number = pic_get_intr_number,
+  .raise_intr = pic_raise_intr
+};
+
+
+
+
+int pic_init_device(struct vm_device * dev) {
+  struct pic_internal * data = (struct pic_internal *)dev->private_data;
+  set_intr_controller(dev->vm, &intr_ops, data);
+  data->pending_irq = 0;
+
+  return 0;
+}
+
+
+int pic_deinit_device(struct vm_device * dev) {
+  return 0;
+}
+
+
+
+
+
+static struct vm_device_ops dev_ops = {
+  .init = pic_init_device,
+  .deinit = pic_deinit_device,
+  .reset = NULL,
+  .start = NULL,
+  .stop = NULL
+};
+
+
+struct vm_device * create_pic() {
+  struct pic_internal * state = NULL;
+  VMMMalloc(struct pic_internal *, state, sizeof(struct pic_internal));
+
+  struct vm_device * pic_dev = create_device("Simple Pic", &dev_ops, state);
+
+
+  return pic_dev;
+}
 
--- /dev/null
+#include <devices/timer.h>
+#include <palacios/vmm.h>
+
+
+#define TIMER_IRQ 32
+
+struct timer_state {
+  int foo;
+};
+
+
+
+int irq_handler(uint_t irq, struct vm_device * dev) {
+  PrintDebug("Timer interrupt\n");
+  return 0;
+
+}
+
+int timer_init(struct vm_device * dev) {
+  //dev_hook_irq(dev, TIMER_IRQ, &irq_handler);
+
+  return 0;
+}
+
+int timer_deinit(struct vm_device * dev) {
+
+  return 0;
+}
+
+
+static struct vm_device_ops dev_ops = {
+  .init = timer_init,
+  .deinit = timer_deinit,
+  .reset = NULL,
+  .start = NULL,
+  .stop = NULL,
+
+};
+
+
+struct vm_device * create_timer() {
+  struct timer_state * timer = NULL;
+  VMMMalloc(struct timer_state *, timer, sizeof(struct timer_state));
+  struct vm_device * dev = create_device("Timer", &dev_ops, timer);
+  
+  return dev;
+
+}
 
--- /dev/null
+#if 0
+#include <palacios/vmm_irq.h>
+#include <palacios/vmm.h>
+
+void init_irq_map(struct vmm_irq_map * map) {
+  map->head = NULL;
+  map->num_hooks = 0;
+}
+
+
+int add_irq_hook(struct vmm_irq_map * map, struct vmm_irq_hook * hook) {
+  if (!(map->head)) {
+    map->head = hook;
+    map->num_hooks = 1;
+    return 0;
+  } else if (map->head->irq > hook->irq) {
+    hook->next = map->head;
+
+    map->head->prev = hook;
+    map->head = hook;
+    map->num_hooks++;
+
+    return 0;
+  } else {
+    struct vmm_irq_hook * tmp_hook = map->head;
+    while ((tmp_hook->next) &&
+          (tmp_hook->next->irq <= hook->irq)) {
+      tmp_hook = tmp_hook->next;
+    }
+
+    if (tmp_hook->irq == hook->irq) {
+      return -1;
+    } else {
+      hook->prev = tmp_hook;
+      hook->next = tmp_hook->next;
+
+      if (tmp_hook->next) {
+       tmp_hook->next->prev = hook;
+      }
+
+      tmp_hook->next = hook;
+
+      map->num_hooks++;
+      return 0;
+    }
+  }
+  return -1;
+}
+
+
+int remove_irq_hook(struct vmm_irq_map * map, struct vmm_irq_hook * hook) {
+  if (map->head == hook) {
+    map->head = hook->next;
+  } else if (hook->prev) {
+    hook->prev->next = hook->next;
+  } else {
+    return -1;
+  }
+
+  if (hook->next) {
+    hook->next->prev = hook->prev;
+  }
+
+  map->num_hooks--;
+
+  return 0;
+}
+
+
+int hook_irq(struct vmm_irq_map * map, uint_t irq, 
+            int(*handler)(uint_t irq, void * private_data), 
+            void * private_data) {
+
+  struct vmm_irq_hook * hook = NULL;
+  VMMMalloc(struct vmm_irq_hook *, hook, sizeof(struct vmm_irq_hook));
+
+  if (!hook) {
+    // big problems
+    return -1;
+  }
+
+  hook->irq = irq;
+  hook->handler = handler;
+  hook->private_data = private_data;
+  hook->next = NULL;
+  hook->prev = NULL;
+  
+  if (add_irq_hook(map, hook) != 0) {
+    VMMFree(hook);
+    return -1;
+  }
+
+  return 0;
+}
+
+
+int unhook_irq(struct vmm_irq_map * map, uint_t irq) {
+  struct vmm_irq_hook * hook = get_irq_hook(map, irq);
+
+  if (!hook) {
+    return -1;
+  }
+
+  remove_irq_hook(map, hook);
+  return 0;
+}
+
+
+struct vmm_irq_hook * get_irq_hook(struct vmm_irq_map * map, uint_t irq) {
+  struct vmm_irq_hook * tmp_hook = map->head;
+  
+  while (tmp_hook) {
+    if (tmp_hook->irq == irq) {
+      return tmp_hook;
+    }
+    tmp_hook = tmp_hook->next;
+  }
+  return NULL;
+}
+
+
+#endif
 
--- /dev/null
+; -*- fundamental -*-
+
+
+%ifndef VMM_ASM
+%define VMM_ASM
+
+%include "vmm_symbol.asm"
+
+EXPORT DisableInts
+
+EXPORT GetGDTR
+EXPORT GetIDTR
+EXPORT GetTR
+
+
+
+
+
+
+align 8
+DisableInts:
+       cli
+       ret
+
+
+align 8
+GetGDTR:
+       push    ebp
+       mov     ebp, esp
+       pusha   
+       mov     ebx, [ebp + 8]
+       sgdt    [ebx]
+       
+       popa
+       pop     ebp
+       ret
+
+
+align 8
+GetIDTR:
+       push    ebp
+       mov     ebp, esp
+       pusha   
+
+       mov     ebx, [ebp + 8]
+       sidt    [ebx]
+       
+       popa
+       pop     ebp
+       ret
+
+
+
+align 8
+GetTR:
+       push    ebp
+       mov     ebp, esp
+       pusha   
+       mov     ebx, [ebp + 8]
+       str     [ebx]
+       
+       popa
+       pop     ebp
+       ret
+
+
+
+
+
+
+
+%endif
\ No newline at end of file