Per the Intel manuals, CPUID is supposed to unconditionally zero the upper 32 bits of the involved (rax/rbx/rcx/rdx) registers. Previously, the emulation would cast pointers to the 64-bit register values down to uint32_t, which while properly manipulating the lower bits, would leave any garbage in the upper bits uncleared. While no existing guest OSes seem to stumble over this in practice, the bhyve emulation should match x86 expectations.
This was discovered through alignment warnings emitted by gcc9, while testing it against SmartOS/bhyve.
SmartOS bug: https://smartos.org/bugview/OS-8168