|
@@ -90,6 +90,44 @@ get_context_addr_from_root(struct root_entry *root)
|
|
NULL);
|
|
NULL);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * low 64 bits:
|
|
|
|
+ * 0: present
|
|
|
|
+ * 1: fault processing disable
|
|
|
|
+ * 2-3: translation type
|
|
|
|
+ * 12-63: address space root
|
|
|
|
+ * high 64 bits:
|
|
|
|
+ * 0-2: address width
|
|
|
|
+ * 3-6: aval
|
|
|
|
+ * 8-23: domain id
|
|
|
|
+ */
|
|
|
|
+struct context_entry {
|
|
|
|
+ u64 lo;
|
|
|
|
+ u64 hi;
|
|
|
|
+};
|
|
|
|
+#define context_present(c) ((c).lo & 1)
|
|
|
|
+#define context_fault_disable(c) (((c).lo >> 1) & 1)
|
|
|
|
+#define context_translation_type(c) (((c).lo >> 2) & 3)
|
|
|
|
+#define context_address_root(c) ((c).lo & VTD_PAGE_MASK)
|
|
|
|
+#define context_address_width(c) ((c).hi & 7)
|
|
|
|
+#define context_domain_id(c) (((c).hi >> 8) & ((1 << 16) - 1))
|
|
|
|
+
|
|
|
|
+#define context_set_present(c) do {(c).lo |= 1;} while (0)
|
|
|
|
+#define context_set_fault_enable(c) \
|
|
|
|
+ do {(c).lo &= (((u64)-1) << 2) | 1;} while (0)
|
|
|
|
+#define context_set_translation_type(c, val) \
|
|
|
|
+ do { \
|
|
|
|
+ (c).lo &= (((u64)-1) << 4) | 3; \
|
|
|
|
+ (c).lo |= ((val) & 3) << 2; \
|
|
|
|
+ } while (0)
|
|
|
|
+#define CONTEXT_TT_MULTI_LEVEL 0
|
|
|
|
+#define context_set_address_root(c, val) \
|
|
|
|
+ do {(c).lo |= (val) & VTD_PAGE_MASK; } while (0)
|
|
|
|
+#define context_set_address_width(c, val) do {(c).hi |= (val) & 7;} while (0)
|
|
|
|
+#define context_set_domain_id(c, val) \
|
|
|
|
+ do {(c).hi |= ((val) & ((1 << 16) - 1)) << 8;} while (0)
|
|
|
|
+#define context_clear_entry(c) do {(c).lo = 0; (c).hi = 0;} while (0)
|
|
|
|
+
|
|
static void flush_unmaps_timeout(unsigned long data);
|
|
static void flush_unmaps_timeout(unsigned long data);
|
|
|
|
|
|
DEFINE_TIMER(unmap_timer, flush_unmaps_timeout, 0, 0);
|
|
DEFINE_TIMER(unmap_timer, flush_unmaps_timeout, 0, 0);
|