Check for size==1 before rounding to power of two in epoll init.
[akaros.git] / user / vmm / apic.c
index ab6e33b..2153edb 100644 (file)
@@ -26,6 +26,8 @@
 #include <vmm/virtio_mmio.h>
 #include <vmm/virtio_ids.h>
 #include <vmm/virtio_config.h>
+#include <vmm/sched.h>
+
 
 #define APIC_CONFIG 0x100
 
@@ -162,11 +164,16 @@ static void apic_write(uint64_t offset, uint32_t value)
 
 }
 
-int apic(struct vmctl *v, uint64_t gpa, int destreg, uint64_t *regp, int store)
+int __apic_access(struct guest_thread *vm_thread, uint64_t gpa, int destreg,
+                  uint64_t *regp, int store)
 {
        uint32_t offset = gpa & 0xfffff;
        /* basic sanity tests. */
        // TODO: Should be minus the base but FIXME
+
+       //fprintf(stderr, "WE SHOULD NEVER BE HERE: user/vmm/apic.c");
+       //exit(1);
+
        offset = gpa & 0xfffff;
        if (offset & 0xf) {
                DPRINTF("bad register offset; low nibl is non-zero\n");
@@ -187,3 +194,20 @@ int apic(struct vmctl *v, uint64_t gpa, int destreg, uint64_t *regp, int store)
        }
 
 }
+
+void vapic_status_dump(FILE *f, void *vapic)
+{
+       uint32_t *p = (uint32_t *)vapic;
+       int i;
+       fprintf(f, "-- BEGIN APIC STATUS DUMP --\n");
+       for (i = 0x100/sizeof(*p); i < 0x180/sizeof(*p); i+=4) {
+               fprintf(f, "VISR : 0x%x: 0x%08x\n", i, p[i]);
+       }
+       for (i = 0x200/sizeof(*p); i < 0x280/sizeof(*p); i+=4) {
+               fprintf(f, "VIRR : 0x%x: 0x%08x\n", i, p[i]);
+       }
+       i = 0x0B0/sizeof(*p);
+       fprintf(f, "EOI FIELD : 0x%x, 0x%08x\n", i, p[i]);
+
+       fprintf(f, "-- END APIC STATUS DUMP --\n");
+}