[ipxe-devel] hyperv net device driver design question
Michael Brown
mcb30 at ipxe.org
Mon Jan 22 00:05:55 UTC 2018
On 19/01/18 17:59, Roman Kagan wrote:
> 1) the driver assumes full control over VMBus: it initializes,
> enumerates, and shuts it down at its own discretion. As a result,
> should the network booting fail, upon return to the BIOS, which may
> have its own VMBus state (e.g. to access disks via Hyper-V
> SCSI), it is screwed up
Yes. There's no interface I'm aware of that would allow iPXE to share
control with other legacy BIOS components.
This problem is similar to an issue that iPXE faces when performing an
iSCSI boot of Windows Server 2016. Various Windows components
(winload.exe et al) will assume full control over VMBus, which then
causes iPXE's emulated INT13 iSCSI drive to fail.
We work around this by checking the SynIC message page MSR to detect
when some other component has stolen control of VMBus, and reclaiming
ownership if needed:
http://git.ipxe.org/ipxe.git/commitdiff/b91cc98
For legacy BIOS, I think you'll need to do something similar.
> 3) in case of OVMF, I ran out of ideas how to provide iPXE to the
> firmware in a ROM; building it as a .efidrv and incorporating it as a
> .efi blob in the main OVMF image[*] results in the driver starting,
> discovering the VMBus and the netdevices, but then giving up because
> the parent bus is unknown to EFI. 1) and 2) apply, too.
>
> [*] licensing issues may also preclude this scheme
On the licensing point: this seems like "mere aggregation" to me, so I
don't see a problem.
> I guess that the hyperv netdevice driver in iPXE was designed to cover
> only the scenario when, on the real Hyper-V, the vendor PXE stack pulled
> iPXE from the network, and then it took over completely, with no way
> out, so the above problems didn't stand in the way.
The initial use case was actually booting Azure VMs with bin/ipxe.usb
attached as a virtual disk.
> I wonder if it can also be made the only PXE stack in the system,
> interoperating with the firmware, and, if it can, how to do it? It
> looks like the VMBus will have to be managed by the firmware for that to
> work, with the driver using it through the interfaces, but it's unclear
> how feasible it is.
As discussed in
http://git.ipxe.org/ipxe.git/commitdiff/9366578
the "proper" solution for UEFI would be for iPXE to attach to whatever
VMBus abstraction is provided by the platform firmware. Unfortunately
the abstraction provided by the Hyper-V UEFI firmware is totally
undocumented.
I'd be very happy to update iPXE to bind via the VMBus UEFI protocols,
if you have documentation and/or an open source implementation of the
protocols matching those found in Hyper-V's own UEFI firmware.
Michael
More information about the ipxe-devel
mailing list