[BUG] double fault in amdgpu_discovery_init [amdgpu] [syzkaller]
Yang Zi <[email protected]>
| Newsgroups | org.freedesktop.lists.amd-gfx,org.freedesktop.lists.dri-devel,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
Hi, While fuzzing kernel v7.1 with syzkaller, we found a kernel double fault PANIC in the amdgpu IP discovery initialization path. The crash was triggered during GPU probe on a custom QEMU virtual NAVI14 device. Kernel PANIC via double fault in `amdgpu_discovery_init()` at drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c:635 during IP discovery table reading. The function triggered a double fault at its entry point (large stack frame allocation of 0x1358 bytes), causing a PANIC. The crash occurs at `amdgpu_discovery_init+0x18` — very early in the function. The trapping instruction is a `call` at offset 0x18, after the function prologue allocates a large stack frame (`sub $0x1358, %rsp` = 4952 bytes). A double fault at function entry indicates stack corruption or stack overflow — the large stack allocation may have crossed into an unmapped guard page, or the stack was already corrupted by anomalous MMIO responses from the virtual device. The amdgpu driver's `amdgpu_discovery_init()` function does not validate the device's IP discovery data sufficiently before proceeding with stack-intensive operations. The virtual device returned anomalous IP discovery data, causing memory/stack corruption that led to the double fault. - Kernel: 7.1.0 #1 PREEMPT(lazy) - Hardware: QEMU Standard PC (Q35 + ICH9), virtual NAVI14 (0x1002:0x7340) - Tainted: G B W O (BAD_PAGE, WARN, OOT_MODULE) The crash report attached below: amdgpu 0000:00:05.0: enabling device (0000 -> 0002) amdgpu 0000:00:05.0: initializing kernel modesetting (NAVI14 0x1002:0x7340 0x1AF4:0x1100 0x00). amdgpu 0000:00:05.0: register mmio base: 0xFC000000 amdgpu 0000:00:05.0: register mmio size: 33554432 traps: PANIC: double fault, error_code: 0x0 Oops: double fault: 0000 [#1] SMP KASAN NOPTI CPU: 0 UID: 0 PID: 715 Comm: syz.0.2 Tainted: G B W O 7.1.0 #1 PREEMPT(lazy) Tainted: [B]=BAD_PAGE, [W]=WARN, [O]=OOT_MODULE Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.16.3-0-ga6ed6b701f0a-prebuilt.qemu.org 04/01/2014 RIP: 0010:amdgpu_discovery_init+0x18/0x87f0 drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c:635 [amdgpu] Code: 66 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 41 57 41 56 41 54 53 48 81 ec 58 13 00 00 48 89 bc 24 08 13 00 00 31 ff <e8> b3 df b8 f6 48 89 84 24 f0 12 00 00 31 ff e8 54 e3 b8 f6 48 89 RSP: 0018:ffff8880600ff710 EFLAGS: 00010246 RAX: 0000000000000001 RBX: ffff8880099860c8 RCX: 0000000000100000 RDX: ffffc90004409000 RSI: 00000000000fffff RDI: 0000000000000000 RBP: ffff888060106d48 R08: 0000000000000000 R09: 0000000000000000 R10: ffff888060106c20 R11: ffffed100c020da4 R12: ffff8880099860c8 R13: ffff888009986078 R14: ffff888009986000 R15: ffff888009986000 FS: 000055557874c500(0000) GS:ffff8880e6a8d000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: ffff8880600ff708 CR3: 00000000694a9000 CR4: 00000000000006f0 Call Trace: <TASK> amdgpu_driver_load_kms+0x147/0x5c0 drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c:148 [amdgpu] </TASK> Modules linked in: amdgpu(+) ppp_generic slhc gadgetfs udc_core sit tunnel4 ip_tunnel geneve ip6_udp_tunnel udp_tunnel macsec macvtap tap ipvlan macvlan virt_wifi veth nlmon dummy team bonding tun rfuzzer_device(O) i2c_dev iTCO_wdt intel_pmc_bxt ppdev watchdog vga16fb vgastate parport_pc parport gpu_sched drm_panel_backlight_quirks amdxcp drm_exec drm_suballoc_helper lpc_ich mfd_core drm_ttm_helper bochs mousedev serio_raw tpm_tis tpm_tis_core tpm dm_mod dax dmi_sysfs qemu_fw_cfg virtio_rng kt_runtime(O) uio_pci_kerneltracker_driver(O) [last unloaded: amdgpu] ---[ end trace 0000000000000000 ]--- RIP: 0010:amdgpu_discovery_init+0x18/0x87f0 drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c:635 [amdgpu] Code: 66 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 41 57 41 56 41 54 53 48 81 ec 58 13 00 00 48 89 bc 24 08 13 00 00 31 ff <e8> b3 df b8 f6 48 89 84 24 f0 12 00 00 31 ff e8 54 e3 b8 f6 48 89 RSP: 0018:ffff8880600ff710 EFLAGS: 00010246 RAX: 0000000000000001 RBX: ffff8880099860c8 RCX: 0000000000100000 RDX: ffffc90004409000 RSI: 00000000000fffff RDI: 0000000000000000 RBP: ffff888060106d48 R08: 0000000000000000 R09: 0000000000000000 R10: ffff888060106c20 R11: ffffed100c020da4 R12: ffff8880099860c8 R13: ffff888009986078 R14: ffff888009986000 R15: ffff888009986000 FS: 000055557874c500(0000) GS:ffff8880e6a8d000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: ffff8880600ff708 CR3: 00000000694a9000 CR4: 00000000000006f0 ---------------- Code disassembly (best guess): 0: 66 90 xchg %ax,%ax 2: 90 nop 3: 90 nop 4: 90 nop 5: 90 nop 6: 90 nop 7: 90 nop 8: 90 nop 9: 90 nop a: 90 nop b: 90 nop c: 90 nop d: 90 nop e: 90 nop f: 90 nop 10: 90 nop 11: 90 nop 12: 41 57 push %r15 14: 41 56 push %r14 16: 41 54 push %r12 18: 53 push %rbx 19: 48 81 ec 58 13 00 00 sub $0x1358,%rsp 20: 48 89 bc 24 08 13 00 mov %rdi,0x1308(%rsp) 27: 00 28: 31 ff xor %edi,%edi * 2a: e8 b3 df b8 f6 call 0xf6b8dfe2 <-- trapping instruction 2f: 48 89 84 24 f0 12 00 mov %rax,0x12f0(%rsp) 36: 00 37: 31 ff xor %edi,%edi 39: e8 54 e3 b8 f6 call 0xf6b8e392 3e: 48 rex.W 3f: 89 .byte 0x89 <<<<<<<<<<<<<<< tail report >>>>>>>>>>>>>>> Regards, Yang Zi