Patch for MS Hyper V (virtualization)

John Baldwin jhb at
Tue Apr 7 07:28:50 PDT 2009

On Monday 06 April 2009 11:12:33 pm Sergey Babkin wrote:
> John Baldwin wrote:
> > 
> > On Monday 06 April 2009 1:07:38 pm Ivan Voras wrote:
> > > 2009/4/6 John Baldwin <jhb at>:
> > > > On Sunday 05 April 2009 12:23:39 pm Sergey Babkin wrote:
> > >
> > > > Hmm, the problem is we need to be able to write to BARs to size them. 
б Any
> > OS
> > > > needs to be able to do this to know what address space regions are 
> > > > decoded by devices. б We can't avoid writing to BARs.
> > >
> > > I have only vague idea what BARs are and if it's the correct diagnosis
> > > in this case, but the fact is that other operating systems (Windows,
> > > Linux tested) work, so either there is a way around it or the original
> > > premise is wrong-ish.
> > 
> > Every OS writes to BARs to size them during boot.  It's the defined 
> > for sizing them.  A BAR is a base address register, and it is how a PCI
> > device gets memory and I/O port resources.  OS (or BIOS) writes a starting
> > address into the register to tell the PCI device where a given
> > resource "starts".
> The OS doesn't have to write to the BAR if BIOS has already
> done it. And the BIOS in the Hyper-V VM is obviously special,
> so it doesn't trip on iself. 

Yes it does because we don't know how _big_ the BAR is.  The OS has to know if 
the device is decoding 1MB or 64KB because we need to reserve the entire 
window to prevent any other devices from using it.  We don't just write the 
existing value, we write all 1's to it and read it back.  The lower N 
bits "stick" at zero and we use that to figure out the BAR's size.  See 
pci_add_map() in sys/dev/pci/pci.c

> Anyway, as far as I can tell, it's only the base register of 
> the simulated DEC21140 device that has this issue, so it's 
> quite possible that the bug is in that device's simulator. 
> I've attached a modified patch that checks conservatively for this
> precise situation, so it should not break compatibility with
> anything else. I've tested it on Hyper-V.

Can you test unmodified FreeBSD 8 on Hyper-V?  It has an extra fix relative to 
7 to disable decoding via the PCI command register while sizing BARs that may 
address this.

John Baldwin

More information about the freebsd-hackers mailing list