struct x86_tpause_t
UMONITOR arms an address-range monitor on the watched line; UMWAIT drops the logical processor into an optimized sleep until any agent's store to that line, an interrupt, or the TSC deadline. The store pushes the waiter awake as an event, so a fork-join handoff is observed rather than polled, and on an SMT core the sibling reclaims the freed pipeline slots for the duration.
There are several older ways to wait on x86, but they may require different privileges:
MONITOR and MWAIT in SSE - used for power management, require ring 0 privilege.MWAITX in MONITORX ISA on AMD - used for power management, requires ring 0 privilege.TPAUSE in WAITPKG - a blind timed pause that watches no address, so a store never wakes it early. This waiter replaces it: UMWAIT is strictly better given a word to watch.
The UMWAIT control selects the sleep depth: bit 0 = 1 picks C0.1, shallow and fast-waking; bit 0 = 0 picks C0.2, deeper and slower. A fork-join barrier resolves in tens of nanoseconds, so we ask for C0.1. Neither state lowers voltage: like ARM's WFE, this clock-gates and saves dynamic power only, and never releases the core to the scheduler.
Fields
Warnings
The UMONITOR and UMWAIT opcodes are hand-encoded and, unlike the AArch64 path, untested on WAITPKG silicon in this tree; capability_x86_tpause_k gates them.