CVE-2026-80861: usb: xhci: bail out of setup if the controller is inaccessible
In the Linux kernel, the following vulnerability has been resolved:
usb: xhci: bail out of setup if the controller is inaccessible
xhcigensetup() locates the operational registers using the capability length read from the very first register:
xhci->opregs = hcd->regs + HCLENGTH(readl(&xhci->capregs->hccapbase));
If the controller is dead or has dropped off the bus, that read returns ~0, HCLENGTH() truncates it to 0xff, and opregs ends up 0xff bytes past the page-aligned MMIO base, i.e. unaligned. The first access through it, xhcihalt() -> xhcihandshake() reading opregs->status, is then an unaligned readl() on device memory. arm64 faults on unaligned device accesses, so instead of xhcihandshake() catching the all-ones value and returning -ENODEV, setup oopses:
xhci-pci-renesas 0005:08:00.0: Unable to change power state from D3cold to D0, device inaccessible xhci-pci-renesas 0005:08:00.0: xHCI Host Controller xhci-pci-renesas 0005:08:00.0: new USB bus registered, assigned bus number 1 Unable to handle kernel paging request at virtual address ffff80030a770103 ESR = 0x0000000096000021 FSC = 0x21: alignment fault Internal error: Oops: 0000000096000021 [#1] SMP pc : xhcihalt [xhcihcd] Call trace: xhcihalt xhcigensetup xhcipcisetup usbaddhcd usbhcdpciprobe xhcipcicommonprobe xhcipcirenesasprobe
This was hit with a Renesas uPD720201 that failed to power up ("Unable to change power state from D3cold to D0, device inaccessible") yet still reached the HCD probe path.
Read the capability register once, and if it reads back the all-ones value (as xhcihandshake() and xhcireset() already test for), abort setup with -ENODEV before opregs is derived from it. Reading it once also avoids re-reading a register that may change under a concurrent hot-removal.
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Configuration
Apply the kernel fix so that the xHCI driver detects controller inaccessibility and bails out of setup/PCI probe (return -ENODEV) before deriving op_regs from cap_regs->hc_capbase, preventing the subsequent unaligned readl()/MMIO access and probe-time Oops.
Linux kernel USB xHCI (xhci) bail out of setup if controller is inaccessible (ENODEV check before deriving op_regs) = enabled
Event History
Frequently Asked Questions
Which systems are most likely to experience a kernel fault from this issue?
The described failure specifically affects arm64 systems, where an unaligned read from device memory faults. It occurs when an xHCI USB controller is dead, inaccessible, or has dropped off the bus during controller setup.
What conditions trigger the failure?
The controller's initial capability-register read must return an all-ones value, such as when the device cannot be accessed. The provided example shows a controller that could not transition from D3cold to D0 before the kernel attempted to initialize it.
How can an administrator identify that this issue has occurred?
Kernel logs may report that the xHCI controller is inaccessible, followed by registration of a new USB bus and an alignment-fault kernel oops. The example includes an "Unable to change power state from D3cold to D0" message and an "Unable to handle kernel paging request" alignment fault in xhci_halt or xhci_handshake.