Skip to content

Commit fbe6070

Browse files
Vineeth Pillai (Google)joergroedel
authored andcommitted
iommu/vt-d: debugfs: Fix legacy mode page table dump logic
In legacy mode, SSPTPTR is ignored if TT is not 00b or 01b. SSPTPTR maybe uninitialized or zero in that case and may cause oops like: Oops: general protection fault, probably for non-canonical address 0xf00087d3f000f000: 0000 [#1] SMP NOPTI CPU: 2 UID: 0 PID: 786 Comm: cat Not tainted 6.16.0 #191 PREEMPT(voluntary) Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.17.0-5.fc42 04/01/2014 RIP: 0010:pgtable_walk_level+0x98/0x150 RSP: 0018:ffffc90000f279c0 EFLAGS: 00010206 RAX: 0000000040000000 RBX: ffffc90000f27ab0 RCX: 000000000000001e RDX: 0000000000000003 RSI: f00087d3f000f000 RDI: f00087d3f0010000 RBP: ffffc90000f27a00 R08: ffffc90000f27a98 R09: 0000000000000002 R10: 0000000000000000 R11: 0000000000000000 R12: f00087d3f000f000 R13: 0000000000000000 R14: 0000000040000000 R15: ffffc90000f27a98 FS: 0000764566dcb740(0000) GS:ffff8881f812c000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000764566d44000 CR3: 0000000109d81003 CR4: 0000000000772ef0 PKRU: 55555554 Call Trace: <TASK> pgtable_walk_level+0x88/0x150 domain_translation_struct_show.isra.0+0x2d9/0x300 dev_domain_translation_struct_show+0x20/0x40 seq_read_iter+0x12d/0x490 ... Avoid walking the page table if TT is not 00b or 01b. Fixes: 2b437e8 ("iommu/vt-d: debugfs: Support dumping a specified page table") Signed-off-by: Vineeth Pillai (Google) <[email protected]> Reviewed-by: Kevin Tian <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Lu Baolu <[email protected]> Signed-off-by: Joerg Roedel <[email protected]>
1 parent 75c02a0 commit fbe6070

File tree

1 file changed

+15
-2
lines changed

1 file changed

+15
-2
lines changed

drivers/iommu/intel/debugfs.c

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -435,8 +435,21 @@ static int domain_translation_struct_show(struct seq_file *m,
435435
}
436436
pgd &= VTD_PAGE_MASK;
437437
} else { /* legacy mode */
438-
pgd = context->lo & VTD_PAGE_MASK;
439-
agaw = context->hi & 7;
438+
u8 tt = (u8)(context->lo & GENMASK_ULL(3, 2)) >> 2;
439+
440+
/*
441+
* According to Translation Type(TT),
442+
* get the page table pointer(SSPTPTR).
443+
*/
444+
switch (tt) {
445+
case CONTEXT_TT_MULTI_LEVEL:
446+
case CONTEXT_TT_DEV_IOTLB:
447+
pgd = context->lo & VTD_PAGE_MASK;
448+
agaw = context->hi & 7;
449+
break;
450+
default:
451+
goto iommu_unlock;
452+
}
440453
}
441454

442455
seq_printf(m, "Device %04x:%02x:%02x.%x ",

0 commit comments

Comments
 (0)