]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
bhyve: Fix NVMe data structure copy to guest
authorchuck <chuck@FreeBSD.org>
Fri, 5 Apr 2019 16:54:20 +0000 (16:54 +0000)
committerchuck <chuck@FreeBSD.org>
Fri, 5 Apr 2019 16:54:20 +0000 (16:54 +0000)
commitdc8900e8c679af4ca1a8b27a93fc3929a7f74a94
tree11f1f1e2e27ae4466c264a8d38dbcff8e970cc51
parentff894081f2ef5a54af077b1c7fc8d93f2118667e
bhyve: Fix NVMe data structure copy to guest

bhyve's NVMe emulation was transferring Identify data back to the guest
incorrectly causing memory corruptions. These corruptions resulted in
core dumps and other system level errors in the guest.

In their simplest form, NVMe Physical Region Page (PRP) values in
commands indicate which physical pages to use for data transfer. The
first PRP value is not required to be page aligned but does not cross a
page boundary. The second PRP value must be page aligned, does not cross
a page boundary, and need not be contiguous with PRP1.

The code was copying Identify data past the end of PRP1. This happens to
work if PRP1 and PRP2 are physically contiguous but will corrupt guest
memory in unpredictable ways if they are not.

Fix is to copy the Identify data back to the guest piecewise (i.e. for
each PRP entry). Also fix a similarly wrong problem when copying back
Log page data.

Reviewed by: imp (mentor), araujo, jhb, rgrimes, bhyve
Approved by: imp (mentor), bhyve (jhb)
MFC after: 2 weeks
Differential Revision: https://reviews.freebsd.org/D19695
usr.sbin/bhyve/pci_nvme.c