Prints more information when IO_PAGE_FAULT event occurs.
Signed-off-by: Prasad Joshi <[email protected]>
---
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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html