]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
bhyve: ignore low bits of CFGADR
authorCorvin Köhne <CorvinK@beckhoff.com>
Fri, 15 Oct 2021 07:25:54 +0000 (09:25 +0200)
committerEmmanuel Vadot <manu@FreeBSD.org>
Fri, 15 Oct 2021 07:29:45 +0000 (09:29 +0200)
commit1b0e2f0b607e88feb57accc9521e9623b56ab7e2
tree0b000274a99bdae9d9cb40b7acfbe6a20f38742b
parent6495766acfb242048a80d58956b2cebbd885d8cc
bhyve: ignore low bits of CFGADR

Bhyve could emulate wrong PCI registers.
In the best case, the guest reads wrong registers and the device driver would
report some errors.
In the worst case, the guest writes to wrong PCI registers and could brick
hardware when using PCI passthrough.

According to Intels specification, low bits of CFGADR should be
ignored. Some OS like linux may rely on it. Otherwise, bhyve could
emulate a wrong PCI register.

E.g.
If linux would like to read 2 bytes from offset 0x02, following would
happen.
linux:
outl 0x80000002 at CFGADR
inw  at CFGDAT + 2
bhyve:
cfgoff = 0x80000002 & 0xFF = 0x02
coff   = cfgoff + (port - CFGDAT) = 0x02 + 0x02 = 0x04
Bhyve would emulate the register at offset 0x04 not 0x02.

Reviewed By: #bhyve, grehan
Differential Revision: https://reviews.freebsd.org/D31819
Sponsored by:        Beckhoff Automation GmbH & Co. KG
usr.sbin/bhyve/pci_emul.c