[PATCH 1/1]: Log more information on IO_PAGE_FAULT event.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Prints more information when IO_PAGE_FAULT event occurs.

Signed-off-by: Prasad Joshi <prasadjoshi124@xxxxxxxxx>

---
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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux