]> rtime.felk.cvut.cz Git - jailhouse.git/commitdiff
inmates: Add IOAPIC service to inmates framework
authorJan Kiszka <jan.kiszka@siemens.com>
Thu, 17 Jul 2014 18:30:24 +0000 (20:30 +0200)
committerJan Kiszka <jan.kiszka@siemens.com>
Mon, 21 Jul 2014 06:53:05 +0000 (08:53 +0200)
This provides the functionality for programing an assigned IOAPIC pin to
send standard IRQs to the caller's CPU. Just enough for basic IOAPIC
usage.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
inmates/lib/x86/inmate.h
inmates/lib/x86/ioapic.c [new file with mode: 0644]

index 66e043730a6a5e8fd5c72f245eaa0c60c15c64bc..a9f915d0036e81ad1edb3ed09b0b62fca9579a0c 100644 (file)
@@ -180,6 +180,17 @@ typedef void(*int_handler_t)(void);
 void int_init(void);
 void int_set_handler(unsigned int vector, int_handler_t handler);
 
+enum ioapic_trigger_mode {
+       TRIGGER_EDGE = 0,
+       TRIGGER_LEVEL_ACTIVE_HIGH = 1 << 15,
+       TRIGGER_LEVEL_ACTIVE_LOW = (1 << 15) | (1 << 13),
+};
+
+void ioapic_init(void);
+void ioapic_pin_set_vector(unsigned int pin,
+                          enum ioapic_trigger_mode trigger_mode,
+                          unsigned int vector);
+
 void inmate_main(void);
 
 unsigned long pm_timer_read(void);
diff --git a/inmates/lib/x86/ioapic.c b/inmates/lib/x86/ioapic.c
new file mode 100644 (file)
index 0000000..de96e21
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Jailhouse, a Linux-based partitioning hypervisor
+ *
+ * Copyright (c) Siemens AG, 2014
+ *
+ * Authors:
+ *  Jan Kiszka <jan.kiszka@siemens.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.  See
+ * the COPYING file in the top-level directory.
+ */
+
+#include <inmate.h>
+
+#define IOAPIC_BASE            ((void *)0xfec00000)
+#define IOAPIC_REG_INDEX       0x00
+#define IOAPIC_REG_DATA                0x10
+#define IOAPIC_REDIR_TBL_START 0x10
+
+void ioapic_init(void)
+{
+       map_range(IOAPIC_BASE, PAGE_SIZE, MAP_UNCACHED);
+}
+
+void ioapic_pin_set_vector(unsigned int pin,
+                          enum ioapic_trigger_mode trigger_mode,
+                          unsigned int vector)
+{
+       mmio_write32(IOAPIC_BASE + IOAPIC_REG_INDEX,
+                    IOAPIC_REDIR_TBL_START + pin * 2 + 1);
+       mmio_write32(IOAPIC_BASE + IOAPIC_REG_DATA, cpu_id() << (56 - 32));
+
+       mmio_write32(IOAPIC_BASE + IOAPIC_REG_INDEX,
+                    IOAPIC_REDIR_TBL_START + pin * 2);
+       mmio_write32(IOAPIC_BASE + IOAPIC_REG_DATA, trigger_mode | vector);
+}