Implement bounce buffering for AMD SEV in amd64 bus dma.
authorbluhm <bluhm@openbsd.org>
Wed, 14 Aug 2024 18:31:33 +0000 (18:31 +0000)
committerbluhm <bluhm@openbsd.org>
Wed, 14 Aug 2024 18:31:33 +0000 (18:31 +0000)
commitd5a984e5ffbed41e56832b99c96a9ef19fad454b
tree6be856ff1ef475e3ebb6aa68f07ac903c8a8f078
parent7af15f03dac24b2518f4ed336f8e8cd00d70cef5
Implement bounce buffering for AMD SEV in amd64 bus dma.

When running as SEV guest, as indicated by variable cpu_sev_guestmode,
allocate additional pages for each segment on dma map creation.
These pages are mapped with the PMAP_NOCRYPT attribute, i.e. the
crypt bit is not set in the PTE.  Thus, these pages are shared with
the hypervisor.
When the map is loaded with actual pages, the address in the
descriptor is replaced by the corresponding bounce buffer.  Using
bus_dmamap_sync(), data is copied from the encrypted pages used by
guest drivers to the unencrypted bounce buffers shared with the
hypervisor, and vice versa.
If the kernel is not running in SEV guest mode, which means as
normal host or non-SEV guest, no bounce buffers are used.

from hshoexer@; based on ancient code of mickey@; OK kettenis@
sys/arch/amd64/amd64/bus_dma.c
sys/arch/amd64/include/bus.h