[hyperv] Cope with Windows Server 2016 enlightenments
authorMichael Brown <mcb30@ipxe.org>
Tue, 25 Apr 2017 13:13:22 +0000 (14:13 +0100)
committerMichael Brown <mcb30@ipxe.org>
Fri, 28 Apr 2017 15:20:47 +0000 (16:20 +0100)
commitb91cc983da48b2791a672431551f7859e33126ec
tree466bc46ef18d86a619769a49acf4c149193237b1
parent276d618ca9588198acde376e28e49bd5a93b20d6
[hyperv] Cope with Windows Server 2016 enlightenments

An "enlightened" external bootloader (such as Windows Server 2016's
winload.exe) may take ownership of the Hyper-V connection before all
INT 13 operations have been completed.  When this happens, all VMBus
devices are implicitly closed and we are left with a non-functional
network connection.

Detect when our Hyper-V connection has been lost (by checking the
SynIC message page MSR).  Reclaim ownership of the Hyper-V connection
and reestablish any VMBus devices, without disrupting any existing
iPXE state (such as IPv4 settings attached to the network device).

Windows Server 2016 will not cleanly take ownership of an active
Hyper-V connection.  Experimentation shows that we can quiesce by
resetting only the SynIC message page MSR; this results in a
successful SAN boot (on a Windows 2012 R2 physical host).  Choose to
quiesce by resetting (almost) all MSRs, in the hope that this will be
more robust against corner cases such as a stray synthetic interrupt
occurring during the handover.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/arch/x86/drivers/hyperv/hyperv.c
src/drivers/net/netvsc.c
src/drivers/net/netvsc.h
src/include/ipxe/hyperv.h
src/include/ipxe/vmbus.h
src/interface/hyperv/vmbus.c