Prints more information when IO_PAGE_FAULT event occurs.

Signed-off-by: Prasad Joshi <prasadjoshi...@gmail.com>

---
diff --git a/arch/x86/include/asm/amd_iommu_types.h
b/arch/x86/include/asm/amd_iommu_types.h
index e3509fc..add56b3 100644
--- a/arch/x86/include/asm/amd_iommu_types.h
+++ b/arch/x86/include/asm/amd_iommu_types.h
@@ -96,6 +96,16 @@
 #define EVENT_FLAGS_MASK       0xfff
 #define EVENT_FLAGS_SHIFT      0x10

+#define EVENT_FLAGS_RESERVED1 0x0
+#define EVENT_FLAGS_RESERVED_SIZE 0x3
+#define EVENT_FLAGS_INT (EVENT_FLAGS_RESERVED1 + EVENT_FLAGS_RESERVED_SIZE)
+#define EVENT_FLAGS_PR  (EVENT_FLAGS_INT + 0x1)
+#define EVENT_FLAGS_RW  (EVENT_FLAGS_PR + 0x1)
+#define EVENT_FLAGS_PE  (EVENT_FLAGS_RW + 0x1)
+#define EVENT_FLAGS_RZ  (EVENT_FLAGS_PE + 0x1)
+#define EVENT_FLAGS_TR  (EVENT_FLAGS_RZ + 0x1)
+#define EVENT_FLAGS_RESERVED2 (EVENT_FLAGS_TR + 0x1)
+
 /* feature control bits */
 #define CONTROL_IOMMU_EN        0x00ULL
 #define CONTROL_HT_TUN_EN       0x01ULL
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c
index 57ca777..a158852 100644
--- a/arch/x86/kernel/amd_iommu.c
+++ b/arch/x86/kernel/amd_iommu.c
@@ -283,6 +283,44 @@ static void dump_command(unsigned long phys_addr)
                pr_err("AMD-Vi: CMD[%d]: %08x\n", i, cmd->data[i]);
 }

+static void inline dump_page_fault(int flags)
+{
+       int i = (flags >> EVENT_FLAGS_INT) & 0x1;
+       int pr = (flags >> EVENT_FLAGS_PR) & 0x1;
+       int rw = (flags >> EVENT_FLAGS_RW) & 0x1;
+       int pe = (flags >> EVENT_FLAGS_PE) & 0x1;
+       int rz = (flags >> EVENT_FLAGS_RZ) & 0x1;
+       int tr = (flags >> EVENT_FLAGS_TR) & 0x1;
+
+       const char *i_pr[] = {
+               "to page marked not present",
+               "to page marked present",
+               "to interrupt marked blocked",
+               "to interrupt marked remapped"
+       };
+
+       const char *tr_s[2] = {
+               "transaction",
+               "translation"
+       };
+
+       const char *type[2] = {
+               "read",
+               "write"
+       };
+
+       const char *permission[2] = {
+               "peripheral had permission",
+               "peripheral had no permission",
+       };
+
+       pr_err("AMD-Vi: \t%s %s", tr_s[tr], i_pr[(i<<1)|pr]);
+       pr_err("AMD-Vi: \t%s type: %s", tr_s[tr], type[rw]);
+       if (pr) {
+               pr_err("AMD-Vi: \t%s", permission[pe]);
+       }
+}
+
 static void iommu_print_event(struct amd_iommu *iommu, void *__evt)
 {
        u32 *event = __evt;
@@ -307,6 +345,7 @@ static void iommu_print_event(struct amd_iommu
*iommu, void *__evt)
                       "domain=0x%04x address=0x%016llx flags=0x%04x]\n",
                       PCI_BUS(devid), PCI_SLOT(devid), PCI_FUNC(devid),
                       domid, address, flags);
+               dump_page_fault(flags);
                break;
        case EVENT_TYPE_DEV_TAB_ERR:
                printk("DEV_TAB_HARDWARE_ERROR device=%02x:%02x.%x "
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to