svn commit: r361416 - in projects/nfs-over-tls/sys: amd64/amd64 amd64/include amd64/vmm amd64/vmm/amd amd64/vmm/intel amd64/vmm/io arm/arm arm/mv/discovery arm/mv/kirkwood arm/mv/orion arm/ralink a...

Rick Macklem rmacklem at FreeBSD.org
Sat May 23 15:49:11 UTC 2020


Author: rmacklem
Date: Sat May 23 15:49:07 2020
New Revision: 361416
URL: https://svnweb.freebsd.org/changeset/base/361416

Log:
  Merge in an up-to-date kernel from head and make the changes
  required by recent modifications to the mbuf structure for ext_pgs mbufs.
  Now I just need to see if this all builds and works.

Added:
  projects/nfs-over-tls/sys/amd64/include/vmm_snapshot.h
     - copied unchanged from r361415, head/sys/amd64/include/vmm_snapshot.h
  projects/nfs-over-tls/sys/amd64/vmm/vmm_snapshot.c
     - copied unchanged from r361415, head/sys/amd64/vmm/vmm_snapshot.c
  projects/nfs-over-tls/sys/compat/linuxkpi/common/include/linux/irq_work.h
     - copied unchanged from r361415, head/sys/compat/linuxkpi/common/include/linux/irq_work.h
  projects/nfs-over-tls/sys/dev/hyperv/hvsock/
     - copied from r361415, head/sys/dev/hyperv/hvsock/
  projects/nfs-over-tls/sys/modules/hyperv/hvsock/
     - copied from r361415, head/sys/modules/hyperv/hvsock/
  projects/nfs-over-tls/sys/powerpc/aim/mmu_radix.c
     - copied unchanged from r361415, head/sys/powerpc/aim/mmu_radix.c
Deleted:
  projects/nfs-over-tls/sys/arm/mv/discovery/
  projects/nfs-over-tls/sys/arm/mv/kirkwood/
  projects/nfs-over-tls/sys/arm/mv/orion/
  projects/nfs-over-tls/sys/arm/ralink/
  projects/nfs-over-tls/sys/cddl/contrib/opensolaris/common/atomic/aarch64/
  projects/nfs-over-tls/sys/cddl/contrib/opensolaris/common/atomic/amd64/
  projects/nfs-over-tls/sys/cddl/contrib/opensolaris/common/atomic/powerpc64/
  projects/nfs-over-tls/sys/cddl/contrib/opensolaris/common/atomic/sparc64/
  projects/nfs-over-tls/sys/crypto/blowfish/
  projects/nfs-over-tls/sys/dev/auxio/
  projects/nfs-over-tls/sys/dev/bktr/
  projects/nfs-over-tls/sys/dev/sound/sbus/
  projects/nfs-over-tls/sys/dev/ubsec/
  projects/nfs-over-tls/sys/modules/auxio/
  projects/nfs-over-tls/sys/modules/bktr/
  projects/nfs-over-tls/sys/modules/epic/
  projects/nfs-over-tls/sys/modules/libalias/modules/cuseeme/
  projects/nfs-over-tls/sys/modules/sound/driver/audiocs/
  projects/nfs-over-tls/sys/modules/ubsec/
  projects/nfs-over-tls/sys/modules/vpo/
  projects/nfs-over-tls/sys/netinet/libalias/alias_cuseeme.c
  projects/nfs-over-tls/sys/opencrypto/cast.c
  projects/nfs-over-tls/sys/opencrypto/cast.h
  projects/nfs-over-tls/sys/opencrypto/castsb.h
  projects/nfs-over-tls/sys/opencrypto/skipjack.c
  projects/nfs-over-tls/sys/opencrypto/skipjack.h
  projects/nfs-over-tls/sys/opencrypto/xform_blf.c
  projects/nfs-over-tls/sys/opencrypto/xform_cast5.c
  projects/nfs-over-tls/sys/opencrypto/xform_des1.c
  projects/nfs-over-tls/sys/opencrypto/xform_des3.c
  projects/nfs-over-tls/sys/opencrypto/xform_md5.c
  projects/nfs-over-tls/sys/opencrypto/xform_skipjack.c
  projects/nfs-over-tls/sys/opencrypto/xform_userland.h
Modified:
  projects/nfs-over-tls/sys/amd64/amd64/cpu_switch.S
  projects/nfs-over-tls/sys/amd64/amd64/initcpu.c
  projects/nfs-over-tls/sys/amd64/amd64/machdep.c
  projects/nfs-over-tls/sys/amd64/amd64/mp_machdep.c
  projects/nfs-over-tls/sys/amd64/amd64/pmap.c
  projects/nfs-over-tls/sys/amd64/amd64/support.S
  projects/nfs-over-tls/sys/amd64/include/vmm.h
  projects/nfs-over-tls/sys/amd64/include/vmm_dev.h
  projects/nfs-over-tls/sys/amd64/vmm/amd/svm.c
  projects/nfs-over-tls/sys/amd64/vmm/amd/svm.h
  projects/nfs-over-tls/sys/amd64/vmm/amd/svm_msr.c
  projects/nfs-over-tls/sys/amd64/vmm/amd/vmcb.c
  projects/nfs-over-tls/sys/amd64/vmm/amd/vmcb.h
  projects/nfs-over-tls/sys/amd64/vmm/intel/vmcs.c
  projects/nfs-over-tls/sys/amd64/vmm/intel/vmcs.h
  projects/nfs-over-tls/sys/amd64/vmm/intel/vmx.c
  projects/nfs-over-tls/sys/amd64/vmm/io/vatpic.c
  projects/nfs-over-tls/sys/amd64/vmm/io/vatpic.h
  projects/nfs-over-tls/sys/amd64/vmm/io/vatpit.c
  projects/nfs-over-tls/sys/amd64/vmm/io/vatpit.h
  projects/nfs-over-tls/sys/amd64/vmm/io/vhpet.c
  projects/nfs-over-tls/sys/amd64/vmm/io/vhpet.h
  projects/nfs-over-tls/sys/amd64/vmm/io/vioapic.c
  projects/nfs-over-tls/sys/amd64/vmm/io/vioapic.h
  projects/nfs-over-tls/sys/amd64/vmm/io/vlapic.c
  projects/nfs-over-tls/sys/amd64/vmm/io/vlapic.h
  projects/nfs-over-tls/sys/amd64/vmm/io/vpmtmr.c
  projects/nfs-over-tls/sys/amd64/vmm/io/vpmtmr.h
  projects/nfs-over-tls/sys/amd64/vmm/io/vrtc.c
  projects/nfs-over-tls/sys/amd64/vmm/io/vrtc.h
  projects/nfs-over-tls/sys/amd64/vmm/vmm.c
  projects/nfs-over-tls/sys/amd64/vmm/vmm_dev.c
  projects/nfs-over-tls/sys/amd64/vmm/x86.c
  projects/nfs-over-tls/sys/amd64/vmm/x86.h
  projects/nfs-over-tls/sys/arm/arm/mp_machdep.c
  projects/nfs-over-tls/sys/arm/xilinx/zy7_mp.c
  projects/nfs-over-tls/sys/arm/xilinx/zy7_slcr.h
  projects/nfs-over-tls/sys/arm64/arm64/cpufunc_asm.S
  projects/nfs-over-tls/sys/arm64/arm64/gicv3_its.c
  projects/nfs-over-tls/sys/arm64/arm64/identcpu.c
  projects/nfs-over-tls/sys/arm64/arm64/mp_machdep.c
  projects/nfs-over-tls/sys/arm64/arm64/pmap.c
  projects/nfs-over-tls/sys/arm64/include/cpufunc.h
  projects/nfs-over-tls/sys/cam/ata/ata_xpt.c
  projects/nfs-over-tls/sys/cam/cam_ccb.h
  projects/nfs-over-tls/sys/cam/cam_xpt.c
  projects/nfs-over-tls/sys/cam/ctl/ctl.c
  projects/nfs-over-tls/sys/cam/ctl/ctl_backend.c
  projects/nfs-over-tls/sys/cam/ctl/ctl_backend.h
  projects/nfs-over-tls/sys/cam/ctl/ctl_backend_block.c
  projects/nfs-over-tls/sys/cam/ctl/ctl_backend_ramdisk.c
  projects/nfs-over-tls/sys/cam/ctl/ctl_frontend_iscsi.c
  projects/nfs-over-tls/sys/cam/ctl/ctl_private.h
  projects/nfs-over-tls/sys/cam/mmc/mmc_xpt.c
  projects/nfs-over-tls/sys/cam/nvme/nvme_da.c
  projects/nfs-over-tls/sys/cam/nvme/nvme_xpt.c
  projects/nfs-over-tls/sys/cam/scsi/scsi_enc_ses.c
  projects/nfs-over-tls/sys/cam/scsi/scsi_targ_bh.c
  projects/nfs-over-tls/sys/cam/scsi/scsi_xpt.c
  projects/nfs-over-tls/sys/cddl/contrib/opensolaris/common/lz4/lz4.c
  projects/nfs-over-tls/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_rlock.h
  projects/nfs-over-tls/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_rlock.c
  projects/nfs-over-tls/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
  projects/nfs-over-tls/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
  projects/nfs-over-tls/sys/compat/linuxkpi/common/include/linux/bitmap.h
  projects/nfs-over-tls/sys/compat/linuxkpi/common/include/linux/errno.h
  projects/nfs-over-tls/sys/compat/linuxkpi/common/include/linux/kernel.h
  projects/nfs-over-tls/sys/compat/linuxkpi/common/include/linux/lockdep.h
  projects/nfs-over-tls/sys/compat/linuxkpi/common/include/linux/math64.h
  projects/nfs-over-tls/sys/compat/linuxkpi/common/include/linux/mutex.h
  projects/nfs-over-tls/sys/compat/linuxkpi/common/include/linux/pci.h
  projects/nfs-over-tls/sys/compat/linuxkpi/common/include/linux/scatterlist.h
  projects/nfs-over-tls/sys/compat/linuxkpi/common/include/linux/srcu.h
  projects/nfs-over-tls/sys/compat/linuxkpi/common/include/linux/wait.h
  projects/nfs-over-tls/sys/compat/linuxkpi/common/include/linux/workqueue.h
  projects/nfs-over-tls/sys/compat/linuxkpi/common/src/linux_compat.c
  projects/nfs-over-tls/sys/compat/linuxkpi/common/src/linux_pci.c
  projects/nfs-over-tls/sys/compat/linuxkpi/common/src/linux_work.c
  projects/nfs-over-tls/sys/conf/Makefile.arm
  projects/nfs-over-tls/sys/conf/Makefile.powerpc
  projects/nfs-over-tls/sys/conf/Makefile.riscv
  projects/nfs-over-tls/sys/conf/NOTES
  projects/nfs-over-tls/sys/conf/config.mk
  projects/nfs-over-tls/sys/conf/files
  projects/nfs-over-tls/sys/conf/files.amd64
  projects/nfs-over-tls/sys/conf/files.arm
  projects/nfs-over-tls/sys/conf/files.arm64
  projects/nfs-over-tls/sys/conf/files.i386
  projects/nfs-over-tls/sys/conf/files.mips
  projects/nfs-over-tls/sys/conf/files.powerpc
  projects/nfs-over-tls/sys/conf/files.riscv
  projects/nfs-over-tls/sys/conf/files.x86
  projects/nfs-over-tls/sys/conf/kern.mk
  projects/nfs-over-tls/sys/conf/kern.opts.mk
  projects/nfs-over-tls/sys/conf/kern.post.mk
  projects/nfs-over-tls/sys/conf/kern.pre.mk
  projects/nfs-over-tls/sys/conf/kmod.mk
  projects/nfs-over-tls/sys/conf/ldscript.powerpc
  projects/nfs-over-tls/sys/conf/ldscript.powerpc64
  projects/nfs-over-tls/sys/conf/ldscript.powerpcspe
  projects/nfs-over-tls/sys/conf/options
  projects/nfs-over-tls/sys/conf/options.amd64
  projects/nfs-over-tls/sys/contrib/dev/acpica/changes.txt
  projects/nfs-over-tls/sys/contrib/dev/acpica/common/acgetline.c
  projects/nfs-over-tls/sys/contrib/dev/acpica/common/dmtbdump2.c
  projects/nfs-over-tls/sys/contrib/dev/acpica/compiler/aslcompiler.l
  projects/nfs-over-tls/sys/contrib/dev/acpica/compiler/aslload.c
  projects/nfs-over-tls/sys/contrib/dev/acpica/compiler/aslmessages.c
  projects/nfs-over-tls/sys/contrib/dev/acpica/compiler/aslmessages.h
  projects/nfs-over-tls/sys/contrib/dev/acpica/compiler/aslpredef.c
  projects/nfs-over-tls/sys/contrib/dev/acpica/compiler/aslxref.c
  projects/nfs-over-tls/sys/contrib/dev/acpica/compiler/dtutils.c
  projects/nfs-over-tls/sys/contrib/dev/acpica/components/debugger/dbhistry.c
  projects/nfs-over-tls/sys/contrib/dev/acpica/components/disassembler/dmbuffer.c
  projects/nfs-over-tls/sys/contrib/dev/acpica/components/dispatcher/dsfield.c
  projects/nfs-over-tls/sys/contrib/dev/acpica/components/executer/exfield.c
  projects/nfs-over-tls/sys/contrib/dev/acpica/include/acglobal.h
  projects/nfs-over-tls/sys/contrib/dev/acpica/include/acpixf.h
  projects/nfs-over-tls/sys/contrib/dev/acpica/include/acpredef.h
  projects/nfs-over-tls/sys/contrib/dev/ath/ath_hal/ar9300/ar9300.h
  projects/nfs-over-tls/sys/contrib/dev/ath/ath_hal/ar9300/ar9300_eeprom.c
  projects/nfs-over-tls/sys/contrib/dev/ath/ath_hal/ar9300/ar9300_phy.c
  projects/nfs-over-tls/sys/contrib/dev/ath/ath_hal/ar9300/ar9300eep.h
  projects/nfs-over-tls/sys/contrib/dev/ath/ath_hal/ar9300/ar9300template_ap121.h
  projects/nfs-over-tls/sys/contrib/dev/ath/ath_hal/ar9300/ar9300template_aphrodite.h
  projects/nfs-over-tls/sys/contrib/dev/ath/ath_hal/ar9300/ar9300template_cus157.h
  projects/nfs-over-tls/sys/contrib/dev/ath/ath_hal/ar9300/ar9300template_generic.h
  projects/nfs-over-tls/sys/contrib/dev/ath/ath_hal/ar9300/ar9300template_hb112.h
  projects/nfs-over-tls/sys/contrib/dev/ath/ath_hal/ar9300/ar9300template_hb116.h
  projects/nfs-over-tls/sys/contrib/dev/ath/ath_hal/ar9300/ar9300template_osprey_k31.h
  projects/nfs-over-tls/sys/contrib/dev/ath/ath_hal/ar9300/ar9300template_wasp_2.h
  projects/nfs-over-tls/sys/contrib/dev/ath/ath_hal/ar9300/ar9300template_xb112.h
  projects/nfs-over-tls/sys/contrib/dev/ath/ath_hal/ar9300/ar9300template_xb113.h
  projects/nfs-over-tls/sys/crypto/ccp/ccp.c
  projects/nfs-over-tls/sys/crypto/chacha20/chacha-sw.c
  projects/nfs-over-tls/sys/crypto/via/padlock_hash.c
  projects/nfs-over-tls/sys/ddb/db_expr.c
  projects/nfs-over-tls/sys/dev/acpica/acpi_lid.c
  projects/nfs-over-tls/sys/dev/acpica/acpi_pxm.c
  projects/nfs-over-tls/sys/dev/acpica/acpi_video.c
  projects/nfs-over-tls/sys/dev/acpica/acpivar.h
  projects/nfs-over-tls/sys/dev/amdtemp/amdtemp.c
  projects/nfs-over-tls/sys/dev/ath/ath_hal/ah.h
  projects/nfs-over-tls/sys/dev/ath/ath_hal/ar5416/ar2133.c
  projects/nfs-over-tls/sys/dev/ath/ath_rate/amrr/amrr.c
  projects/nfs-over-tls/sys/dev/ath/ath_rate/onoe/onoe.c
  projects/nfs-over-tls/sys/dev/ath/ath_rate/sample/sample.c
  projects/nfs-over-tls/sys/dev/ath/ath_rate/sample/sample.h
  projects/nfs-over-tls/sys/dev/ath/if_ath.c
  projects/nfs-over-tls/sys/dev/ath/if_ath_misc.h
  projects/nfs-over-tls/sys/dev/ath/if_ath_rx_edma.c
  projects/nfs-over-tls/sys/dev/ath/if_ath_tx.c
  projects/nfs-over-tls/sys/dev/ath/if_ath_tx_ht.c
  projects/nfs-over-tls/sys/dev/ath/if_athrate.h
  projects/nfs-over-tls/sys/dev/ath/if_athvar.h
  projects/nfs-over-tls/sys/dev/bnxt/bnxt.h
  projects/nfs-over-tls/sys/dev/bnxt/if_bnxt.c
  projects/nfs-over-tls/sys/dev/cesa/cesa.c
  projects/nfs-over-tls/sys/dev/cxgbe/adapter.h
  projects/nfs-over-tls/sys/dev/cxgbe/crypto/t4_crypto.c
  projects/nfs-over-tls/sys/dev/cxgbe/crypto/t4_kern_tls.c
  projects/nfs-over-tls/sys/dev/cxgbe/iw_cxgbe/cm.c
  projects/nfs-over-tls/sys/dev/cxgbe/iw_cxgbe/device.c
  projects/nfs-over-tls/sys/dev/cxgbe/offload.h
  projects/nfs-over-tls/sys/dev/cxgbe/t4_main.c
  projects/nfs-over-tls/sys/dev/cxgbe/t4_sge.c
  projects/nfs-over-tls/sys/dev/cxgbe/tom/t4_cpl_io.c
  projects/nfs-over-tls/sys/dev/cxgbe/tom/t4_tls.c
  projects/nfs-over-tls/sys/dev/e1000/if_em.c
  projects/nfs-over-tls/sys/dev/ena/ena.c
  projects/nfs-over-tls/sys/dev/ena/ena.h
  projects/nfs-over-tls/sys/dev/ena/ena_sysctl.c
  projects/nfs-over-tls/sys/dev/ena/ena_sysctl.h
  projects/nfs-over-tls/sys/dev/etherswitch/etherswitch.h
  projects/nfs-over-tls/sys/dev/evdev/evdev_utils.c
  projects/nfs-over-tls/sys/dev/evdev/input-event-codes.h
  projects/nfs-over-tls/sys/dev/evdev/input.h
  projects/nfs-over-tls/sys/dev/glxsb/glxsb.c
  projects/nfs-over-tls/sys/dev/gpio/gpioiic.c
  projects/nfs-over-tls/sys/dev/hifn/hifn7751.c
  projects/nfs-over-tls/sys/dev/hyperv/include/vmbus.h
  projects/nfs-over-tls/sys/dev/hyperv/vmbus/vmbus.c
  projects/nfs-over-tls/sys/dev/hyperv/vmbus/vmbus_br.c
  projects/nfs-over-tls/sys/dev/hyperv/vmbus/vmbus_brvar.h
  projects/nfs-over-tls/sys/dev/hyperv/vmbus/vmbus_chan.c
  projects/nfs-over-tls/sys/dev/hyperv/vmbus/vmbus_chanvar.h
  projects/nfs-over-tls/sys/dev/hyperv/vmbus/vmbus_reg.h
  projects/nfs-over-tls/sys/dev/ichiic/ig4_acpi.c
  projects/nfs-over-tls/sys/dev/iscsi/icl_soft.c
  projects/nfs-over-tls/sys/dev/iwm/if_iwm.c
  projects/nfs-over-tls/sys/dev/iwm/if_iwmvar.h
  projects/nfs-over-tls/sys/dev/ixgbe/if_ix.c
  projects/nfs-over-tls/sys/dev/ixgbe/if_ixv.c
  projects/nfs-over-tls/sys/dev/ixl/if_iavf.c
  projects/nfs-over-tls/sys/dev/ixl/if_ixl.c
  projects/nfs-over-tls/sys/dev/mlx5/device.h
  projects/nfs-over-tls/sys/dev/mlx5/mlx5_core/mlx5_eq.c
  projects/nfs-over-tls/sys/dev/mlx5/mlx5_core/mlx5_main.c
  projects/nfs-over-tls/sys/dev/mlx5/mlx5_en/mlx5_en_hw_tls.c
  projects/nfs-over-tls/sys/dev/nvdimm/nvdimm.c
  projects/nfs-over-tls/sys/dev/nvme/nvme.c
  projects/nfs-over-tls/sys/dev/nvme/nvme_ctrlr.c
  projects/nfs-over-tls/sys/dev/nvme/nvme_ns.c
  projects/nfs-over-tls/sys/dev/nvme/nvme_pci.c
  projects/nfs-over-tls/sys/dev/nvme/nvme_qpair.c
  projects/nfs-over-tls/sys/dev/nvme/nvme_sim.c
  projects/nfs-over-tls/sys/dev/nvme/nvme_sysctl.c
  projects/nfs-over-tls/sys/dev/nvme/nvme_test.c
  projects/nfs-over-tls/sys/dev/ow/ow.c
  projects/nfs-over-tls/sys/dev/qlnx/qlnxe/bcm_osal.h
  projects/nfs-over-tls/sys/dev/random/random_harvestq.c
  projects/nfs-over-tls/sys/dev/rtwn/usb/rtwn_usb_attach.h
  projects/nfs-over-tls/sys/dev/safe/safe.c
  projects/nfs-over-tls/sys/dev/sec/sec.c
  projects/nfs-over-tls/sys/dev/sound/pci/hda/hdac.c
  projects/nfs-over-tls/sys/dev/sound/pcm/dsp.c
  projects/nfs-over-tls/sys/dev/usb/usb_device.c
  projects/nfs-over-tls/sys/dev/usb/usb_device.h
  projects/nfs-over-tls/sys/dev/usb/usb_hub.c
  projects/nfs-over-tls/sys/dev/usb/usbdevs
  projects/nfs-over-tls/sys/dev/usb/usbhid.h
  projects/nfs-over-tls/sys/dev/virtio/balloon/virtio_balloon.c
  projects/nfs-over-tls/sys/dev/virtio/console/virtio_console.c
  projects/nfs-over-tls/sys/dev/virtio/mmio/virtio_mmio.c
  projects/nfs-over-tls/sys/dev/virtio/mmio/virtio_mmio.h
  projects/nfs-over-tls/sys/dev/virtio/random/virtio_random.c
  projects/nfs-over-tls/sys/dev/virtio/scsi/virtio_scsi.c
  projects/nfs-over-tls/sys/dev/xen/evtchn/evtchn_dev.c
  projects/nfs-over-tls/sys/fs/ext2fs/ext2_alloc.c
  projects/nfs-over-tls/sys/fs/ext2fs/ext2_balloc.c
  projects/nfs-over-tls/sys/fs/ext2fs/ext2_bmap.c
  projects/nfs-over-tls/sys/fs/ext2fs/ext2_csum.c
  projects/nfs-over-tls/sys/fs/ext2fs/ext2_extattr.c
  projects/nfs-over-tls/sys/fs/ext2fs/ext2_extents.c
  projects/nfs-over-tls/sys/fs/ext2fs/ext2_extents.h
  projects/nfs-over-tls/sys/fs/ext2fs/ext2_htree.c
  projects/nfs-over-tls/sys/fs/ext2fs/ext2_inode.c
  projects/nfs-over-tls/sys/fs/ext2fs/ext2_inode_cnv.c
  projects/nfs-over-tls/sys/fs/ext2fs/ext2_lookup.c
  projects/nfs-over-tls/sys/fs/ext2fs/ext2_subr.c
  projects/nfs-over-tls/sys/fs/ext2fs/ext2_vfsops.c
  projects/nfs-over-tls/sys/fs/ext2fs/ext2_vnops.c
  projects/nfs-over-tls/sys/fs/ext2fs/ext2fs.h
  projects/nfs-over-tls/sys/fs/ext2fs/fs.h
  projects/nfs-over-tls/sys/fs/fuse/fuse_internal.c
  projects/nfs-over-tls/sys/fs/fuse/fuse_vfsops.c
  projects/nfs-over-tls/sys/fs/fuse/fuse_vnops.c
  projects/nfs-over-tls/sys/fs/nfs/nfs_commonacl.c
  projects/nfs-over-tls/sys/fs/nfs/nfs_commonsubs.c
  projects/nfs-over-tls/sys/fs/nfs/nfs_var.h
  projects/nfs-over-tls/sys/fs/nfs/nfsdport.h
  projects/nfs-over-tls/sys/fs/nfs/nfsm_subs.h
  projects/nfs-over-tls/sys/fs/nfs/nfsport.h
  projects/nfs-over-tls/sys/fs/nfsclient/nfs_clcomsubs.c
  projects/nfs-over-tls/sys/fs/nfsclient/nfs_clport.c
  projects/nfs-over-tls/sys/fs/nfsclient/nfs_clrpcops.c
  projects/nfs-over-tls/sys/fs/nfsclient/nfs_clstate.c
  projects/nfs-over-tls/sys/fs/nfsclient/nfs_clvfsops.c
  projects/nfs-over-tls/sys/fs/nfsserver/nfs_nfsdcache.c
  projects/nfs-over-tls/sys/fs/nfsserver/nfs_nfsdport.c
  projects/nfs-over-tls/sys/fs/nfsserver/nfs_nfsdserv.c
  projects/nfs-over-tls/sys/fs/nfsserver/nfs_nfsdsocket.c
  projects/nfs-over-tls/sys/fs/nfsserver/nfs_nfsdstate.c
  projects/nfs-over-tls/sys/fs/nfsserver/nfs_nfsdsubs.c
  projects/nfs-over-tls/sys/geom/eli/g_eli.c
  projects/nfs-over-tls/sys/geom/geom.h
  projects/nfs-over-tls/sys/geom/geom_dev.c
  projects/nfs-over-tls/sys/geom/geom_disk.c
  projects/nfs-over-tls/sys/geom/geom_dump.c
  projects/nfs-over-tls/sys/geom/geom_subr.c
  projects/nfs-over-tls/sys/geom/mirror/g_mirror_ctl.c
  projects/nfs-over-tls/sys/geom/mountver/g_mountver.c
  projects/nfs-over-tls/sys/geom/nop/g_nop.c
  projects/nfs-over-tls/sys/geom/part/g_part.c
  projects/nfs-over-tls/sys/geom/uzip/g_uzip.c
  projects/nfs-over-tls/sys/i386/i386/mp_machdep.c
  projects/nfs-over-tls/sys/i386/i386/support.s
  projects/nfs-over-tls/sys/kern/kern_exec.c
  projects/nfs-over-tls/sys/kern/kern_fork.c
  projects/nfs-over-tls/sys/kern/kern_linker.c
  projects/nfs-over-tls/sys/kern/kern_mbuf.c
  projects/nfs-over-tls/sys/kern/kern_mib.c
  projects/nfs-over-tls/sys/kern/kern_procctl.c
  projects/nfs-over-tls/sys/kern/kern_sendfile.c
  projects/nfs-over-tls/sys/kern/kern_sig.c
  projects/nfs-over-tls/sys/kern/link_elf.c
  projects/nfs-over-tls/sys/kern/subr_bus_dma.c
  projects/nfs-over-tls/sys/kern/subr_prf.c
  projects/nfs-over-tls/sys/kern/subr_sglist.c
  projects/nfs-over-tls/sys/kern/subr_uio.c
  projects/nfs-over-tls/sys/kern/tty.c
  projects/nfs-over-tls/sys/kern/uipc_ktls.c
  projects/nfs-over-tls/sys/kern/uipc_mbuf.c
  projects/nfs-over-tls/sys/kern/uipc_sockbuf.c
  projects/nfs-over-tls/sys/kern/uipc_socket.c
  projects/nfs-over-tls/sys/kern/vfs_export.c
  projects/nfs-over-tls/sys/kern/vfs_extattr.c
  projects/nfs-over-tls/sys/kern/vfs_subr.c
  projects/nfs-over-tls/sys/mips/atheros/ar531x/ar5315_machdep.c
  projects/nfs-over-tls/sys/mips/atheros/ar71xx_machdep.c
  projects/nfs-over-tls/sys/mips/atheros/if_arge.c
  projects/nfs-over-tls/sys/mips/atheros/if_argevar.h
  projects/nfs-over-tls/sys/mips/cavium/cryptocteon/cavium_crypto.c
  projects/nfs-over-tls/sys/mips/cavium/cryptocteon/cryptocteon.c
  projects/nfs-over-tls/sys/mips/cavium/cryptocteon/cryptocteonvar.h
  projects/nfs-over-tls/sys/mips/cavium/octeon_machdep.c
  projects/nfs-over-tls/sys/mips/include/md_var.h
  projects/nfs-over-tls/sys/mips/mediatek/mtk_soc.c
  projects/nfs-over-tls/sys/mips/mips/cpu.c
  projects/nfs-over-tls/sys/mips/mips/freebsd32_machdep.c
  projects/nfs-over-tls/sys/mips/mips/machdep.c
  projects/nfs-over-tls/sys/mips/mips/pm_machdep.c
  projects/nfs-over-tls/sys/mips/mips/swtch.S
  projects/nfs-over-tls/sys/mips/nlm/dev/sec/nlmsec.c
  projects/nfs-over-tls/sys/mips/nlm/dev/sec/nlmseclib.c
  projects/nfs-over-tls/sys/modules/Makefile
  projects/nfs-over-tls/sys/modules/crypto/Makefile
  projects/nfs-over-tls/sys/modules/hyperv/Makefile
  projects/nfs-over-tls/sys/modules/libalias/modules/modules.inc
  projects/nfs-over-tls/sys/modules/vmm/Makefile
  projects/nfs-over-tls/sys/net/if.c
  projects/nfs-over-tls/sys/net/iflib.c
  projects/nfs-over-tls/sys/net/mppcc.c
  projects/nfs-over-tls/sys/net/netisr.c
  projects/nfs-over-tls/sys/net/pfvar.h
  projects/nfs-over-tls/sys/net/route.c
  projects/nfs-over-tls/sys/net/route.h
  projects/nfs-over-tls/sys/net/route/nhop.h
  projects/nfs-over-tls/sys/net/route/nhop_ctl.c
  projects/nfs-over-tls/sys/net/route/nhop_var.h
  projects/nfs-over-tls/sys/net/route/route_ddb.c
  projects/nfs-over-tls/sys/net/route/route_helpers.c
  projects/nfs-over-tls/sys/net/route/route_var.h
  projects/nfs-over-tls/sys/net/rtsock.c
  projects/nfs-over-tls/sys/net80211/ieee80211_freebsd.c
  projects/nfs-over-tls/sys/net80211/ieee80211_output.c
  projects/nfs-over-tls/sys/net80211/ieee80211_proto.c
  projects/nfs-over-tls/sys/net80211/ieee80211_proto.h
  projects/nfs-over-tls/sys/netgraph/bluetooth/include/ng_hci.h
  projects/nfs-over-tls/sys/netinet/accf_data.c
  projects/nfs-over-tls/sys/netinet/accf_dns.c
  projects/nfs-over-tls/sys/netinet/accf_http.c
  projects/nfs-over-tls/sys/netinet/cc/cc_cubic.c
  projects/nfs-over-tls/sys/netinet/cc/cc_dctcp.c
  projects/nfs-over-tls/sys/netinet/in_pcb.c
  projects/nfs-over-tls/sys/netinet/in_pcb.h
  projects/nfs-over-tls/sys/netinet/in_rmx.c
  projects/nfs-over-tls/sys/netinet/ip_output.c
  projects/nfs-over-tls/sys/netinet/libalias/alias.c
  projects/nfs-over-tls/sys/netinet/libalias/alias_ftp.c
  projects/nfs-over-tls/sys/netinet/libalias/libalias.3
  projects/nfs-over-tls/sys/netinet/sctp_asconf.c
  projects/nfs-over-tls/sys/netinet/sctp_auth.c
  projects/nfs-over-tls/sys/netinet/sctp_indata.c
  projects/nfs-over-tls/sys/netinet/sctp_indata.h
  projects/nfs-over-tls/sys/netinet/sctp_input.c
  projects/nfs-over-tls/sys/netinet/sctp_os_bsd.h
  projects/nfs-over-tls/sys/netinet/sctp_output.c
  projects/nfs-over-tls/sys/netinet/sctp_pcb.c
  projects/nfs-over-tls/sys/netinet/sctp_timer.c
  projects/nfs-over-tls/sys/netinet/sctp_usrreq.c
  projects/nfs-over-tls/sys/netinet/sctputil.c
  projects/nfs-over-tls/sys/netinet/tcp_input.c
  projects/nfs-over-tls/sys/netinet/tcp_output.c
  projects/nfs-over-tls/sys/netinet/tcp_pcap.c
  projects/nfs-over-tls/sys/netinet/tcp_stacks/bbr.c
  projects/nfs-over-tls/sys/netinet/tcp_stacks/rack.c
  projects/nfs-over-tls/sys/netinet/tcp_stacks/rack_bbr_common.c
  projects/nfs-over-tls/sys/netinet/tcp_stacks/rack_bbr_common.h
  projects/nfs-over-tls/sys/netinet/tcp_stacks/tcp_bbr.h
  projects/nfs-over-tls/sys/netinet/tcp_stacks/tcp_rack.h
  projects/nfs-over-tls/sys/netinet/tcp_usrreq.c
  projects/nfs-over-tls/sys/netinet/tcp_var.h
  projects/nfs-over-tls/sys/netinet6/in6_pcb.c
  projects/nfs-over-tls/sys/netinet6/in6_pcb.h
  projects/nfs-over-tls/sys/netinet6/in6_rmx.c
  projects/nfs-over-tls/sys/netinet6/ip6_output.c
  projects/nfs-over-tls/sys/netinet6/nd6.c
  projects/nfs-over-tls/sys/netinet6/nd6_rtr.c
  projects/nfs-over-tls/sys/netipsec/ipsec.c
  projects/nfs-over-tls/sys/netipsec/ipsec.h
  projects/nfs-over-tls/sys/netipsec/key.c
  projects/nfs-over-tls/sys/netipsec/xform_ah.c
  projects/nfs-over-tls/sys/netipsec/xform_esp.c
  projects/nfs-over-tls/sys/netpfil/ipfw/ip_fw2.c
  projects/nfs-over-tls/sys/netpfil/pf/pf_ioctl.c
  projects/nfs-over-tls/sys/netpfil/pf/pf_table.c
  projects/nfs-over-tls/sys/nfs/bootp_subr.c
  projects/nfs-over-tls/sys/opencrypto/crypto.c
  projects/nfs-over-tls/sys/opencrypto/cryptodev.c
  projects/nfs-over-tls/sys/opencrypto/cryptodev.h
  projects/nfs-over-tls/sys/opencrypto/cryptosoft.c
  projects/nfs-over-tls/sys/opencrypto/xform.c
  projects/nfs-over-tls/sys/opencrypto/xform.h
  projects/nfs-over-tls/sys/opencrypto/xform_aes_icm.c
  projects/nfs-over-tls/sys/opencrypto/xform_aes_xts.c
  projects/nfs-over-tls/sys/opencrypto/xform_auth.h
  projects/nfs-over-tls/sys/opencrypto/xform_cml.c
  projects/nfs-over-tls/sys/opencrypto/xform_comp.h
  projects/nfs-over-tls/sys/opencrypto/xform_enc.h
  projects/nfs-over-tls/sys/opencrypto/xform_gmac.c
  projects/nfs-over-tls/sys/opencrypto/xform_null.c
  projects/nfs-over-tls/sys/opencrypto/xform_rijndael.c
  projects/nfs-over-tls/sys/opencrypto/xform_sha1.c
  projects/nfs-over-tls/sys/powerpc/aim/aim_machdep.c
  projects/nfs-over-tls/sys/powerpc/aim/locore64.S
  projects/nfs-over-tls/sys/powerpc/aim/mmu_oea.c
  projects/nfs-over-tls/sys/powerpc/aim/mmu_oea64.c
  projects/nfs-over-tls/sys/powerpc/aim/trap_subr64.S
  projects/nfs-over-tls/sys/powerpc/booke/machdep_e500.c
  projects/nfs-over-tls/sys/powerpc/booke/pmap.c
  projects/nfs-over-tls/sys/powerpc/conf/QORIQ64
  projects/nfs-over-tls/sys/powerpc/include/cpu.h
  projects/nfs-over-tls/sys/powerpc/include/cpufunc.h
  projects/nfs-over-tls/sys/powerpc/include/db_machdep.h
  projects/nfs-over-tls/sys/powerpc/include/mmuvar.h
  projects/nfs-over-tls/sys/powerpc/include/param.h
  projects/nfs-over-tls/sys/powerpc/include/pmap.h
  projects/nfs-over-tls/sys/powerpc/include/pte.h
  projects/nfs-over-tls/sys/powerpc/include/spr.h
  projects/nfs-over-tls/sys/powerpc/include/sr.h
  projects/nfs-over-tls/sys/powerpc/include/vmparam.h
  projects/nfs-over-tls/sys/powerpc/ofw/ofw_initrd.c
  projects/nfs-over-tls/sys/powerpc/powerpc/elf32_machdep.c
  projects/nfs-over-tls/sys/powerpc/powerpc/elf64_machdep.c
  projects/nfs-over-tls/sys/powerpc/powerpc/machdep.c
  projects/nfs-over-tls/sys/powerpc/powerpc/mmu_if.m
  projects/nfs-over-tls/sys/powerpc/powerpc/pmap_dispatch.c
  projects/nfs-over-tls/sys/powerpc/powerpc/trap.c
  projects/nfs-over-tls/sys/riscv/include/sbi.h
  projects/nfs-over-tls/sys/riscv/riscv/locore.S
  projects/nfs-over-tls/sys/riscv/riscv/machdep.c
  projects/nfs-over-tls/sys/riscv/riscv/mp_machdep.c
  projects/nfs-over-tls/sys/riscv/riscv/pmap.c
  projects/nfs-over-tls/sys/riscv/riscv/sbi.c
  projects/nfs-over-tls/sys/rpc/rpc_generic.c
  projects/nfs-over-tls/sys/security/audit/audit_bsm.c
  projects/nfs-over-tls/sys/security/mac_bsdextended/mac_bsdextended.c
  projects/nfs-over-tls/sys/security/mac_bsdextended/mac_bsdextended.h
  projects/nfs-over-tls/sys/sys/elf_common.h
  projects/nfs-over-tls/sys/sys/ktls.h
  projects/nfs-over-tls/sys/sys/link_elf.h
  projects/nfs-over-tls/sys/sys/mbuf.h
  projects/nfs-over-tls/sys/sys/mount.h
  projects/nfs-over-tls/sys/sys/param.h
  projects/nfs-over-tls/sys/sys/random.h
  projects/nfs-over-tls/sys/sys/sglist.h
  projects/nfs-over-tls/sys/sys/socket.h
  projects/nfs-over-tls/sys/sys/socketvar.h
  projects/nfs-over-tls/sys/sys/systm.h
  projects/nfs-over-tls/sys/sys/tree.h
  projects/nfs-over-tls/sys/sys/uio.h
  projects/nfs-over-tls/sys/ufs/ffs/ffs_alloc.c
  projects/nfs-over-tls/sys/vm/uma_core.c
  projects/nfs-over-tls/sys/vm/vm_fault.c
  projects/nfs-over-tls/sys/vm/vm_radix.c
  projects/nfs-over-tls/sys/x86/acpica/srat.c
  projects/nfs-over-tls/sys/x86/include/x86_var.h
  projects/nfs-over-tls/sys/x86/x86/cpu_machdep.c
Directory Properties:
  projects/nfs-over-tls/sys/   (props changed)
  projects/nfs-over-tls/sys/cddl/contrib/opensolaris/   (props changed)
  projects/nfs-over-tls/sys/contrib/dev/acpica/   (props changed)

Modified: projects/nfs-over-tls/sys/amd64/amd64/cpu_switch.S
==============================================================================
--- projects/nfs-over-tls/sys/amd64/amd64/cpu_switch.S	Sat May 23 12:15:47 2020	(r361415)
+++ projects/nfs-over-tls/sys/amd64/amd64/cpu_switch.S	Sat May 23 15:49:07 2020	(r361416)
@@ -221,6 +221,8 @@ done_load_dr:
 	movq	%rax,(%rsp)
 	movq	PCPU(CURTHREAD),%rdi
 	call	fpu_activate_sw
+	cmpb	$0,cpu_flush_rsb_ctxsw(%rip)
+	jne	rsb_flush
 	ret
 
 	/*

Modified: projects/nfs-over-tls/sys/amd64/amd64/initcpu.c
==============================================================================
--- projects/nfs-over-tls/sys/amd64/amd64/initcpu.c	Sat May 23 12:15:47 2020	(r361415)
+++ projects/nfs-over-tls/sys/amd64/amd64/initcpu.c	Sat May 23 15:49:07 2020	(r361416)
@@ -238,12 +238,24 @@ initializecpu(void)
 		cr4 |= CR4_PKE;
 
 	/*
+	 * If SMEP is present, we only need to flush RSB (by default)
+	 * on context switches, to prevent cross-process ret2spec
+	 * attacks.  Do it automatically if ibrs_disable is set, to
+	 * complete the mitigation.
+	 *
 	 * Postpone enabling the SMEP on the boot CPU until the page
 	 * tables are switched from the boot loader identity mapping
 	 * to the kernel tables.  The boot loader enables the U bit in
 	 * its tables.
 	 */
-	if (!IS_BSP()) {
+	if (IS_BSP()) {
+		if (cpu_stdext_feature & CPUID_STDEXT_SMEP &&
+		    !TUNABLE_INT_FETCH(
+		    "machdep.mitigations.cpu_flush_rsb_ctxsw",
+		    &cpu_flush_rsb_ctxsw) &&
+		    hw_ibrs_disable)
+			cpu_flush_rsb_ctxsw = 1;
+	} else {
 		if (cpu_stdext_feature & CPUID_STDEXT_SMEP)
 			cr4 |= CR4_SMEP;
 		if (cpu_stdext_feature & CPUID_STDEXT_SMAP)

Modified: projects/nfs-over-tls/sys/amd64/amd64/machdep.c
==============================================================================
--- projects/nfs-over-tls/sys/amd64/amd64/machdep.c	Sat May 23 12:15:47 2020	(r361415)
+++ projects/nfs-over-tls/sys/amd64/amd64/machdep.c	Sat May 23 15:49:07 2020	(r361416)
@@ -1857,7 +1857,7 @@ hammer_time(u_int64_t modulep, u_int64_t physfree)
 	setidt(IDT_IO_INTS + 15, IDTVEC(spuriousint), SDT_SYSIGT, SEL_KPL, 0);
 #endif
 #else
-#error "have you forgotten the isa device?";
+#error "have you forgotten the isa device?"
 #endif
 
 	if (late_console)
@@ -1867,12 +1867,13 @@ hammer_time(u_int64_t modulep, u_int64_t physfree)
 	fpuinit();
 
 	/*
-	 * Set up thread0 pcb save area after fpuinit calculated fpu save
-	 * area size.  Zero out the extended state header in fpu save
-	 * area.
+	 * Reinitialize thread0's stack base now that the xsave area size is
+	 * known.  Set up thread0's pcb save area after fpuinit calculated fpu
+	 * save area size.  Zero out the extended state header in fpu save area.
 	 */
+	set_top_of_stack_td(&thread0);
 	thread0.td_pcb->pcb_save = get_pcb_user_save_td(&thread0);
-	bzero(get_pcb_user_save_td(&thread0), cpu_max_ext_state_size);
+	bzero(thread0.td_pcb->pcb_save, cpu_max_ext_state_size);
 	if (use_xsave) {
 		xhdr = (struct xstate_hdr *)(get_pcb_user_save_td(&thread0) +
 		    1);
@@ -1882,7 +1883,7 @@ hammer_time(u_int64_t modulep, u_int64_t physfree)
 	rsp0 = thread0.td_md.md_stack_base;
 	/* Ensure the stack is aligned to 16 bytes */
 	rsp0 &= ~0xFul;
-	__pcpu[0].pc_common_tss.tss_rsp0 = rsp0;
+	PCPU_PTR(common_tss)->tss_rsp0 = rsp0;
 	amd64_bsp_pcpu_init2(rsp0);
 
 	/* transfer to user mode */

Modified: projects/nfs-over-tls/sys/amd64/amd64/mp_machdep.c
==============================================================================
--- projects/nfs-over-tls/sys/amd64/amd64/mp_machdep.c	Sat May 23 12:15:47 2020	(r361415)
+++ projects/nfs-over-tls/sys/amd64/amd64/mp_machdep.c	Sat May 23 15:49:07 2020	(r361416)
@@ -29,6 +29,7 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include "opt_acpi.h"
 #include "opt_cpu.h"
 #include "opt_ddb.h"
 #include "opt_kstack_pages.h"
@@ -78,8 +79,10 @@ __FBSDID("$FreeBSD$");
 #include <machine/cpu.h>
 #include <x86/init.h>
 
+#ifdef DEV_ACPI
 #include <contrib/dev/acpica/include/acpi.h>
 #include <dev/acpica/acpivar.h>
+#endif
 
 #define WARMBOOT_TARGET		0
 #define WARMBOOT_OFF		(KERNBASE + 0x0467)
@@ -264,8 +267,11 @@ cpu_mp_start(void)
 	init_ops.start_all_aps();
 
 	set_interrupt_apic_ids();
-}
 
+#if defined(DEV_ACPI) && MAXMEMDOM > 1
+	acpi_pxm_set_cpu_locality();
+#endif
+}
 
 /*
  * AP CPU's call this to initialize themselves.

Modified: projects/nfs-over-tls/sys/amd64/amd64/pmap.c
==============================================================================
--- projects/nfs-over-tls/sys/amd64/amd64/pmap.c	Sat May 23 12:15:47 2020	(r361415)
+++ projects/nfs-over-tls/sys/amd64/amd64/pmap.c	Sat May 23 15:49:07 2020	(r361416)
@@ -323,12 +323,12 @@ pmap_pku_mask_bit(pmap_t pmap)
 #endif
 
 #undef pa_index
+#ifdef NUMA
 #define	pa_index(pa)	({					\
 	KASSERT((pa) <= vm_phys_segs[vm_phys_nsegs - 1].end,	\
 	    ("address %lx beyond the last segment", (pa)));	\
 	(pa) >> PDRSHIFT;					\
 })
-#ifdef NUMA
 #define	pa_to_pmdp(pa)	(&pv_table[pa_index(pa)])
 #define	pa_to_pvh(pa)	(&(pa_to_pmdp(pa)->pv_page))
 #define	PHYS_TO_PV_LIST_LOCK(pa)	({			\
@@ -340,6 +340,7 @@ pmap_pku_mask_bit(pmap_t pmap)
 	_lock;							\
 })
 #else
+#define	pa_index(pa)	((pa) >> PDRSHIFT)
 #define	pa_to_pvh(pa)	(&pv_table[pa_index(pa)])
 
 #define	NPV_LIST_LOCKS	MAXCPU
@@ -1316,6 +1317,8 @@ pmap_pdpe_to_pde(pdp_entry_t *pdpe, vm_offset_t va)
 {
 	pd_entry_t *pde;
 
+	KASSERT((*pdpe & PG_PS) == 0,
+	    ("%s: pdpe %#lx is a leaf", __func__, *pdpe));
 	pde = (pd_entry_t *)PHYS_TO_DMAP(*pdpe & PG_FRAME);
 	return (&pde[pmap_pde_index(va)]);
 }
@@ -1340,6 +1343,8 @@ pmap_pde_to_pte(pd_entry_t *pde, vm_offset_t va)
 {
 	pt_entry_t *pte;
 
+	KASSERT((*pde & PG_PS) == 0,
+	    ("%s: pde %#lx is a leaf", __func__, *pde));
 	pte = (pt_entry_t *)PHYS_TO_DMAP(*pde & PG_FRAME);
 	return (&pte[pmap_pte_index(va)]);
 }

Modified: projects/nfs-over-tls/sys/amd64/amd64/support.S
==============================================================================
--- projects/nfs-over-tls/sys/amd64/amd64/support.S	Sat May 23 12:15:47 2020	(r361415)
+++ projects/nfs-over-tls/sys/amd64/amd64/support.S	Sat May 23 15:49:07 2020	(r361416)
@@ -1613,23 +1613,27 @@ ENTRY(pmap_pti_pcid_invlrng)
 	retq
 
 	.altmacro
-	.macro	ibrs_seq_label l
-handle_ibrs_\l:
+	.macro	rsb_seq_label l
+rsb_seq_\l:
 	.endm
-	.macro	ibrs_call_label l
-	call	handle_ibrs_\l
+	.macro	rsb_call_label l
+	call	rsb_seq_\l
 	.endm
-	.macro	ibrs_seq count
+	.macro	rsb_seq count
 	ll=1
 	.rept	\count
-	ibrs_call_label	%(ll)
+	rsb_call_label	%(ll)
 	nop
-	ibrs_seq_label %(ll)
+	rsb_seq_label %(ll)
 	addq	$8,%rsp
 	ll=ll+1
 	.endr
 	.endm
 
+ENTRY(rsb_flush)
+	rsb_seq	32
+	ret
+
 /* all callers already saved %rax, %rdx, and %rcx */
 ENTRY(handle_ibrs_entry)
 	cmpb	$0,hw_ibrs_ibpb_active(%rip)
@@ -1641,8 +1645,7 @@ ENTRY(handle_ibrs_entry)
 	wrmsr
 	movb	$1,PCPU(IBPB_SET)
 	testl	$CPUID_STDEXT_SMEP,cpu_stdext_feature(%rip)
-	jne	1f
-	ibrs_seq 32
+	je	rsb_flush
 1:	ret
 END(handle_ibrs_entry)
 

Modified: projects/nfs-over-tls/sys/amd64/include/vmm.h
==============================================================================
--- projects/nfs-over-tls/sys/amd64/include/vmm.h	Sat May 23 12:15:47 2020	(r361415)
+++ projects/nfs-over-tls/sys/amd64/include/vmm.h	Sat May 23 15:49:07 2020	(r361416)
@@ -34,6 +34,8 @@
 #include <sys/sdt.h>
 #include <x86/segments.h>
 
+struct vm_snapshot_meta;
+
 #ifdef _KERNEL
 SDT_PROVIDER_DECLARE(vmm);
 #endif
@@ -152,6 +154,7 @@ struct vmspace;
 struct vm_object;
 struct vm_guest_paging;
 struct pmap;
+enum snapshot_req;
 
 struct vm_eventinfo {
 	void	*rptr;		/* rendezvous cookie */
@@ -180,6 +183,10 @@ typedef struct vmspace * (*vmi_vmspace_alloc)(vm_offse
 typedef void	(*vmi_vmspace_free)(struct vmspace *vmspace);
 typedef struct vlapic * (*vmi_vlapic_init)(void *vmi, int vcpu);
 typedef void	(*vmi_vlapic_cleanup)(void *vmi, struct vlapic *vlapic);
+typedef int	(*vmi_snapshot_t)(void *vmi, struct vm_snapshot_meta *meta);
+typedef int	(*vmi_snapshot_vmcx_t)(void *vmi, struct vm_snapshot_meta *meta,
+				       int vcpu);
+typedef int	(*vmi_restore_tsc_t)(void *vmi, int vcpuid, uint64_t now);
 
 struct vmm_ops {
 	vmm_init_func_t		init;		/* module wide initialization */
@@ -199,6 +206,11 @@ struct vmm_ops {
 	vmi_vmspace_free	vmspace_free;
 	vmi_vlapic_init		vlapic_init;
 	vmi_vlapic_cleanup	vlapic_cleanup;
+
+	/* checkpoint operations */
+	vmi_snapshot_t		vmsnapshot;
+	vmi_snapshot_vmcx_t	vmcx_snapshot;
+	vmi_restore_tsc_t	vm_restore_tsc;
 };
 
 extern struct vmm_ops vmm_ops_intel;
@@ -272,7 +284,10 @@ void vm_exit_debug(struct vm *vm, int vcpuid, uint64_t
 void vm_exit_rendezvous(struct vm *vm, int vcpuid, uint64_t rip);
 void vm_exit_astpending(struct vm *vm, int vcpuid, uint64_t rip);
 void vm_exit_reqidle(struct vm *vm, int vcpuid, uint64_t rip);
+int vm_snapshot_req(struct vm *vm, struct vm_snapshot_meta *meta);
+int vm_restore_time(struct vm *vm);
 
+
 #ifdef _SYS__CPUSET_H_
 /*
  * Rendezvous all vcpus specified in 'dest' and execute 'func(arg)'.
@@ -408,6 +423,15 @@ int vm_exit_intinfo(struct vm *vm, int vcpuid, uint64_
 int vm_entry_intinfo(struct vm *vm, int vcpuid, uint64_t *info);
 
 int vm_get_intinfo(struct vm *vm, int vcpuid, uint64_t *info1, uint64_t *info2);
+
+/*
+ * Function used to keep track of the guest's TSC offset. The
+ * offset is used by the virutalization extensions to provide a consistent
+ * value for the Time Stamp Counter to the guest.
+ *
+ * Return value is 0 on success and non-zero on failure.
+ */
+int vm_set_tsc_offset(struct vm *vm, int vcpu_id, uint64_t offset);
 
 enum vm_reg_name vm_segment_name(int seg_encoding);
 

Modified: projects/nfs-over-tls/sys/amd64/include/vmm_dev.h
==============================================================================
--- projects/nfs-over-tls/sys/amd64/include/vmm_dev.h	Sat May 23 12:15:47 2020	(r361415)
+++ projects/nfs-over-tls/sys/amd64/include/vmm_dev.h	Sat May 23 15:49:07 2020	(r361416)
@@ -31,6 +31,8 @@
 #ifndef	_VMM_DEV_H_
 #define	_VMM_DEV_H_
 
+struct vm_snapshot_meta;
+
 #ifdef _KERNEL
 void	vmmdev_init(void);
 int	vmmdev_cleanup(void);
@@ -54,6 +56,13 @@ struct vm_memseg {
 	char		name[VM_MAX_SUFFIXLEN + 1];
 };
 
+struct vm_memseg_fbsd12 {
+	int		segid;
+	size_t		len;
+	char		name[64];
+};
+_Static_assert(sizeof(struct vm_memseg_fbsd12) == 80, "COMPAT_FREEBSD12 ABI");
+
 struct vm_register {
 	int		cpuid;
 	int		regnum;		/* enum vm_reg_name */
@@ -233,6 +242,15 @@ struct vm_cpu_topology {
 	uint16_t	maxcpus;
 };
 
+struct vm_readwrite_kernemu_device {
+	int		vcpuid;
+	unsigned	access_width : 3;
+	unsigned	_unused : 29;
+	uint64_t	gpa;
+	uint64_t	value;
+};
+_Static_assert(sizeof(struct vm_readwrite_kernemu_device) == 24, "ABI");
+
 enum {
 	/* general routines */
 	IOCNUM_ABIVERS = 0,
@@ -260,6 +278,8 @@ enum {
 	IOCNUM_GET_SEGMENT_DESCRIPTOR = 23,
 	IOCNUM_SET_REGISTER_SET = 24,
 	IOCNUM_GET_REGISTER_SET = 25,
+	IOCNUM_GET_KERNEMU_DEV = 26,
+	IOCNUM_SET_KERNEMU_DEV = 27,
 
 	/* interrupt injection */
 	IOCNUM_GET_INTINFO = 28,
@@ -312,6 +332,11 @@ enum {
 	IOCNUM_RTC_WRITE = 101,
 	IOCNUM_RTC_SETTIME = 102,
 	IOCNUM_RTC_GETTIME = 103,
+
+	/* checkpoint */
+	IOCNUM_SNAPSHOT_REQ = 113,
+
+	IOCNUM_RESTORE_TIME = 115
 };
 
 #define	VM_RUN		\
@@ -320,8 +345,12 @@ enum {
 	_IOW('v', IOCNUM_SUSPEND, struct vm_suspend)
 #define	VM_REINIT	\
 	_IO('v', IOCNUM_REINIT)
+#define	VM_ALLOC_MEMSEG_FBSD12	\
+	_IOW('v', IOCNUM_ALLOC_MEMSEG, struct vm_memseg_fbsd12)
 #define	VM_ALLOC_MEMSEG	\
 	_IOW('v', IOCNUM_ALLOC_MEMSEG, struct vm_memseg)
+#define	VM_GET_MEMSEG_FBSD12	\
+	_IOWR('v', IOCNUM_GET_MEMSEG, struct vm_memseg_fbsd12)
 #define	VM_GET_MEMSEG	\
 	_IOWR('v', IOCNUM_GET_MEMSEG, struct vm_memseg)
 #define	VM_MMAP_MEMSEG	\
@@ -340,6 +369,12 @@ enum {
 	_IOW('v', IOCNUM_SET_REGISTER_SET, struct vm_register_set)
 #define	VM_GET_REGISTER_SET \
 	_IOWR('v', IOCNUM_GET_REGISTER_SET, struct vm_register_set)
+#define	VM_SET_KERNEMU_DEV \
+	_IOW('v', IOCNUM_SET_KERNEMU_DEV, \
+	    struct vm_readwrite_kernemu_device)
+#define	VM_GET_KERNEMU_DEV \
+	_IOWR('v', IOCNUM_GET_KERNEMU_DEV, \
+	    struct vm_readwrite_kernemu_device)
 #define	VM_INJECT_EXCEPTION	\
 	_IOW('v', IOCNUM_INJECT_EXCEPTION, struct vm_exception)
 #define	VM_LAPIC_IRQ 		\
@@ -422,4 +457,8 @@ enum {
 	_IOR('v', IOCNUM_RTC_GETTIME, struct vm_rtc_time)
 #define	VM_RESTART_INSTRUCTION \
 	_IOW('v', IOCNUM_RESTART_INSTRUCTION, int)
+#define VM_SNAPSHOT_REQ \
+	_IOWR('v', IOCNUM_SNAPSHOT_REQ, struct vm_snapshot_meta)
+#define VM_RESTORE_TIME \
+	_IOWR('v', IOCNUM_RESTORE_TIME, int)
 #endif

Copied: projects/nfs-over-tls/sys/amd64/include/vmm_snapshot.h (from r361415, head/sys/amd64/include/vmm_snapshot.h)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/nfs-over-tls/sys/amd64/include/vmm_snapshot.h	Sat May 23 15:49:07 2020	(r361416, copy of r361415, head/sys/amd64/include/vmm_snapshot.h)
@@ -0,0 +1,156 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2016 Flavius Anton
+ * Copyright (c) 2016 Mihai Tiganus
+ * Copyright (c) 2016-2019 Mihai Carabas
+ * Copyright (c) 2017-2019 Darius Mihai
+ * Copyright (c) 2017-2019 Elena Mihailescu
+ * Copyright (c) 2018-2019 Sergiu Weisz
+ * All rights reserved.
+ * The bhyve-snapshot feature was developed under sponsorships
+ * from Matthew Grooms.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NETAPP, INC ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL NETAPP, INC OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _VMM_SNAPSHOT_
+#define _VMM_SNAPSHOT_
+
+#include <sys/errno.h>
+#include <sys/types.h>
+#ifndef _KERNEL
+#include <stdbool.h>
+#endif
+
+struct vmctx;
+
+enum snapshot_req {
+	STRUCT_VMX,
+	STRUCT_VIOAPIC,
+	STRUCT_VM,
+	STRUCT_VLAPIC,
+	VM_MEM,
+	STRUCT_VHPET,
+	STRUCT_VMCX,
+	STRUCT_VATPIC,
+	STRUCT_VATPIT,
+	STRUCT_VPMTMR,
+	STRUCT_VRTC,
+};
+
+struct vm_snapshot_buffer {
+	/*
+	 * R/O for device-specific functions;
+	 * written by generic snapshot functions.
+	 */
+	uint8_t *const buf_start;
+	const size_t buf_size;
+
+	/*
+	 * R/W for device-specific functions used to keep track of buffer
+	 * current position and remaining size.
+	 */
+	uint8_t *buf;
+	size_t buf_rem;
+
+	/*
+	 * Length of the snapshot is either determined as (buf_size - buf_rem)
+	 * or (buf - buf_start) -- the second variation returns a signed value
+	 * so it may not be appropriate.
+	 *
+	 * Use vm_get_snapshot_size(meta).
+	 */
+};
+
+enum vm_snapshot_op {
+	VM_SNAPSHOT_SAVE,
+	VM_SNAPSHOT_RESTORE,
+};
+
+struct vm_snapshot_meta {
+	struct vmctx *ctx;
+	void *dev_data;
+	const char *dev_name;      /* identify userspace devices */
+	enum snapshot_req dev_req; /* identify kernel structs */
+
+	struct vm_snapshot_buffer buffer;
+
+	enum vm_snapshot_op op;
+};
+
+
+void vm_snapshot_buf_err(const char *bufname, const enum vm_snapshot_op op);
+int vm_snapshot_buf(volatile void *data, size_t data_size,
+		    struct vm_snapshot_meta *meta);
+size_t vm_get_snapshot_size(struct vm_snapshot_meta *meta);
+int vm_snapshot_guest2host_addr(void **addrp, size_t len, bool restore_null,
+				struct vm_snapshot_meta *meta);
+int vm_snapshot_buf_cmp(volatile void *data, size_t data_size,
+			      struct vm_snapshot_meta *meta);
+
+#define	SNAPSHOT_BUF_OR_LEAVE(DATA, LEN, META, RES, LABEL)			\
+do {										\
+	(RES) = vm_snapshot_buf((DATA), (LEN), (META));				\
+	if ((RES) != 0) {							\
+		vm_snapshot_buf_err(#DATA, (META)->op);				\
+		goto LABEL;							\
+	}									\
+} while (0)
+
+#define	SNAPSHOT_VAR_OR_LEAVE(DATA, META, RES, LABEL)				\
+	SNAPSHOT_BUF_OR_LEAVE(&(DATA), sizeof(DATA), (META), (RES), LABEL)
+
+/*
+ * Address variables are pointers to guest memory.
+ *
+ * When RNULL != 0, do not enforce invalid address checks; instead, make the
+ * pointer NULL at restore time.
+ */
+#define	SNAPSHOT_GUEST2HOST_ADDR_OR_LEAVE(ADDR, LEN, RNULL, META, RES, LABEL)	\
+do {										\
+	(RES) = vm_snapshot_guest2host_addr((void **)&(ADDR), (LEN), (RNULL),	\
+			(META));					\
+	if ((RES) != 0) {							\
+		if ((RES) == EFAULT)						\
+			fprintf(stderr, "%s: invalid address: %s\r\n",		\
+				__func__, #ADDR);				\
+		goto LABEL;							\
+	}									\
+} while (0)
+
+/* compare the value in the meta buffer with the data */
+#define	SNAPSHOT_BUF_CMP_OR_LEAVE(DATA, LEN, META, RES, LABEL)			\
+do {										\
+	(RES) = vm_snapshot_buf_cmp((DATA), (LEN), (META));			\
+	if ((RES) != 0) {							\
+		vm_snapshot_buf_err(#DATA, (META)->op);				\
+		goto LABEL;							\
+	}									\
+} while (0)
+
+#define	SNAPSHOT_VAR_CMP_OR_LEAVE(DATA, META, RES, LABEL)			\
+	SNAPSHOT_BUF_CMP_OR_LEAVE(&(DATA), sizeof(DATA), (META), (RES), LABEL)
+
+#endif

Modified: projects/nfs-over-tls/sys/amd64/vmm/amd/svm.c
==============================================================================
--- projects/nfs-over-tls/sys/amd64/vmm/amd/svm.c	Sat May 23 12:15:47 2020	(r361415)
+++ projects/nfs-over-tls/sys/amd64/vmm/amd/svm.c	Sat May 23 15:49:07 2020	(r361416)
@@ -29,6 +29,8 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include "opt_bhyve_snapshot.h"
+
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/smp.h>
@@ -50,6 +52,7 @@ __FBSDID("$FreeBSD$");
 #include <machine/vmm.h>
 #include <machine/vmm_dev.h>
 #include <machine/vmm_instruction_emul.h>
+#include <machine/vmm_snapshot.h>
 
 #include "vmm_lapic.h"
 #include "vmm_stat.h"
@@ -276,6 +279,25 @@ svm_restore(void)
 	svm_enable(NULL);
 }		
 
+#ifdef BHYVE_SNAPSHOT
+int
+svm_set_tsc_offset(struct svm_softc *sc, int vcpu, uint64_t offset)
+{
+	int error;
+	struct vmcb_ctrl *ctrl;
+
+	ctrl = svm_get_vmcb_ctrl(sc, vcpu);
+	ctrl->tsc_offset = offset;
+
+	svm_set_dirty(sc, vcpu, VMCB_CACHE_I);
+	VCPU_CTR1(sc->vm, vcpu, "tsc offset changed to %#lx", offset);
+
+	error = vm_set_tsc_offset(sc->vm, vcpu, offset);
+
+	return (error);
+}
+#endif
+
 /* Pentium compatible MSRs */
 #define MSR_PENTIUM_START 	0	
 #define MSR_PENTIUM_END 	0x1FFF
@@ -2203,7 +2225,37 @@ svm_setreg(void *arg, int vcpu, int ident, uint64_t va
 	return (EINVAL);
 }
 
+#ifdef BHYVE_SNAPSHOT
 static int
+svm_snapshot_reg(void *arg, int vcpu, int ident,
+		 struct vm_snapshot_meta *meta)
+{
+	int ret;
+	uint64_t val;
+
+	if (meta->op == VM_SNAPSHOT_SAVE) {
+		ret = svm_getreg(arg, vcpu, ident, &val);
+		if (ret != 0)
+			goto done;
+
+		SNAPSHOT_VAR_OR_LEAVE(val, meta, ret, done);
+	} else if (meta->op == VM_SNAPSHOT_RESTORE) {
+		SNAPSHOT_VAR_OR_LEAVE(val, meta, ret, done);
+
+		ret = svm_setreg(arg, vcpu, ident, val);
+		if (ret != 0)
+			goto done;
+	} else {
+		ret = EINVAL;
+		goto done;
+	}
+
+done:
+	return (ret);
+}
+#endif
+
+static int
 svm_setcap(void *arg, int vcpu, int type, int val)
 {
 	struct svm_softc *sc;
@@ -2285,6 +2337,306 @@ svm_vlapic_cleanup(void *arg, struct vlapic *vlapic)
         free(vlapic, M_SVM_VLAPIC);
 }
 
+#ifdef BHYVE_SNAPSHOT
+static int
+svm_snapshot_vmi(void *arg, struct vm_snapshot_meta *meta)
+{
+	/* struct svm_softc is AMD's representation for SVM softc */
+	struct svm_softc *sc;
+	struct svm_vcpu *vcpu;
+	struct vmcb *vmcb;
+	uint64_t val;
+	int i;
+	int ret;
+
+	sc = arg;
+
+	KASSERT(sc != NULL, ("%s: arg was NULL", __func__));
+
+	SNAPSHOT_VAR_OR_LEAVE(sc->nptp, meta, ret, done);
+
+	for (i = 0; i < VM_MAXCPU; i++) {
+		vcpu = &sc->vcpu[i];
+		vmcb = &vcpu->vmcb;
+
+		/* VMCB fields for virtual cpu i */
+		SNAPSHOT_VAR_OR_LEAVE(vmcb->ctrl.v_tpr, meta, ret, done);
+		val = vmcb->ctrl.v_tpr;
+		SNAPSHOT_VAR_OR_LEAVE(val, meta, ret, done);
+		vmcb->ctrl.v_tpr = val;
+
+		SNAPSHOT_VAR_OR_LEAVE(vmcb->ctrl.asid, meta, ret, done);
+		val = vmcb->ctrl.np_enable;
+		SNAPSHOT_VAR_OR_LEAVE(val, meta, ret, done);
+		vmcb->ctrl.np_enable = val;
+
+		val = vmcb->ctrl.intr_shadow;
+		SNAPSHOT_VAR_OR_LEAVE(val, meta, ret, done);
+		vmcb->ctrl.intr_shadow = val;
+		SNAPSHOT_VAR_OR_LEAVE(vmcb->ctrl.tlb_ctrl, meta, ret, done);
+
+		SNAPSHOT_BUF_OR_LEAVE(vmcb->state.pad1,
+				      sizeof(vmcb->state.pad1),
+				      meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vmcb->state.cpl, meta, ret, done);
+		SNAPSHOT_BUF_OR_LEAVE(vmcb->state.pad2,
+				      sizeof(vmcb->state.pad2),
+				      meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vmcb->state.efer, meta, ret, done);
+		SNAPSHOT_BUF_OR_LEAVE(vmcb->state.pad3,
+				      sizeof(vmcb->state.pad3),
+				      meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vmcb->state.cr4, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vmcb->state.cr3, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vmcb->state.cr0, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vmcb->state.dr7, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vmcb->state.dr6, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vmcb->state.rflags, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vmcb->state.rip, meta, ret, done);
+		SNAPSHOT_BUF_OR_LEAVE(vmcb->state.pad4,
+				      sizeof(vmcb->state.pad4),
+				      meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vmcb->state.rsp, meta, ret, done);
+		SNAPSHOT_BUF_OR_LEAVE(vmcb->state.pad5,
+				      sizeof(vmcb->state.pad5),
+				      meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vmcb->state.rax, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vmcb->state.star, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vmcb->state.lstar, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vmcb->state.cstar, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vmcb->state.sfmask, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vmcb->state.kernelgsbase,
+				      meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vmcb->state.sysenter_cs, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vmcb->state.sysenter_esp,
+				      meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vmcb->state.sysenter_eip,
+				      meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vmcb->state.cr2, meta, ret, done);
+		SNAPSHOT_BUF_OR_LEAVE(vmcb->state.pad6,
+				      sizeof(vmcb->state.pad6),
+				      meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vmcb->state.g_pat, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vmcb->state.dbgctl, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vmcb->state.br_from, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vmcb->state.br_to, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vmcb->state.int_from, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vmcb->state.int_to, meta, ret, done);
+		SNAPSHOT_BUF_OR_LEAVE(vmcb->state.pad7,
+				      sizeof(vmcb->state.pad7),
+				      meta, ret, done);
+
+		/* Snapshot swctx for virtual cpu i */
+		SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.sctx_rbp, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.sctx_rbx, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.sctx_rcx, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.sctx_rdx, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.sctx_rdi, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.sctx_rsi, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.sctx_r8, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.sctx_r9, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.sctx_r10, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.sctx_r11, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.sctx_r12, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.sctx_r13, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.sctx_r14, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.sctx_r15, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.sctx_dr0, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.sctx_dr1, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.sctx_dr2, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.sctx_dr3, meta, ret, done);
+
+		SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.host_dr0, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.host_dr1, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.host_dr2, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.host_dr3, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.host_dr6, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.host_dr7, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vcpu->swctx.host_debugctl, meta, ret,
+				      done);
+
+		/* Restore other svm_vcpu struct fields */
+
+		/* Restore NEXTRIP field */
+		SNAPSHOT_VAR_OR_LEAVE(vcpu->nextrip, meta, ret, done);
+
+		/* Restore lastcpu field */
+		SNAPSHOT_VAR_OR_LEAVE(vcpu->lastcpu, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vcpu->dirty, meta, ret, done);
+
+		/* Restore EPTGEN field - EPT is Extended Page Tabel */
+		SNAPSHOT_VAR_OR_LEAVE(vcpu->eptgen, meta, ret, done);
+
+		SNAPSHOT_VAR_OR_LEAVE(vcpu->asid.gen, meta, ret, done);
+		SNAPSHOT_VAR_OR_LEAVE(vcpu->asid.num, meta, ret, done);
+
+		/* Set all caches dirty */
+		if (meta->op == VM_SNAPSHOT_RESTORE) {
+			svm_set_dirty(sc, i, VMCB_CACHE_ASID);
+			svm_set_dirty(sc, i, VMCB_CACHE_IOPM);
+			svm_set_dirty(sc, i, VMCB_CACHE_I);
+			svm_set_dirty(sc, i, VMCB_CACHE_TPR);
+			svm_set_dirty(sc, i, VMCB_CACHE_CR2);
+			svm_set_dirty(sc, i, VMCB_CACHE_CR);
+			svm_set_dirty(sc, i, VMCB_CACHE_DT);
+			svm_set_dirty(sc, i, VMCB_CACHE_SEG);
+			svm_set_dirty(sc, i, VMCB_CACHE_NP);
+		}
+	}
+
+	if (meta->op == VM_SNAPSHOT_RESTORE)
+		flush_by_asid();
+
+done:
+	return (ret);
+}
+
+static int
+svm_snapshot_vmcx(void *arg, struct vm_snapshot_meta *meta, int vcpu)
+{
+	struct vmcb *vmcb;
+	struct svm_softc *sc;
+	int err, running, hostcpu;
+
+	sc = (struct svm_softc *)arg;
+	err = 0;
+
+	KASSERT(arg != NULL, ("%s: arg was NULL", __func__));
+	vmcb = svm_get_vmcb(sc, vcpu);
+
+	running = vcpu_is_running(sc->vm, vcpu, &hostcpu);
+	if (running && hostcpu !=curcpu) {
+		printf("%s: %s%d is running", __func__, vm_name(sc->vm), vcpu);
+		return (EINVAL);
+	}
+
+	err += svm_snapshot_reg(sc, vcpu, VM_REG_GUEST_CR0, meta);
+	err += svm_snapshot_reg(sc, vcpu, VM_REG_GUEST_CR2, meta);
+	err += svm_snapshot_reg(sc, vcpu, VM_REG_GUEST_CR3, meta);
+	err += svm_snapshot_reg(sc, vcpu, VM_REG_GUEST_CR4, meta);
+
+	err += svm_snapshot_reg(sc, vcpu, VM_REG_GUEST_DR7, meta);
+
+	err += svm_snapshot_reg(sc, vcpu, VM_REG_GUEST_RAX, meta);
+
+	err += svm_snapshot_reg(sc, vcpu, VM_REG_GUEST_RSP, meta);
+	err += svm_snapshot_reg(sc, vcpu, VM_REG_GUEST_RIP, meta);
+	err += svm_snapshot_reg(sc, vcpu, VM_REG_GUEST_RFLAGS, meta);
+
+	/* Guest segments */
+	/* ES */
+	err += svm_snapshot_reg(sc, vcpu, VM_REG_GUEST_ES, meta);
+	err += vmcb_snapshot_desc(sc, vcpu, VM_REG_GUEST_ES, meta);
+
+	/* CS */
+	err += svm_snapshot_reg(sc, vcpu, VM_REG_GUEST_CS, meta);
+	err += vmcb_snapshot_desc(sc, vcpu, VM_REG_GUEST_CS, meta);
+
+	/* SS */
+	err += svm_snapshot_reg(sc, vcpu, VM_REG_GUEST_SS, meta);
+	err += vmcb_snapshot_desc(sc, vcpu, VM_REG_GUEST_SS, meta);
+
+	/* DS */
+	err += svm_snapshot_reg(sc, vcpu, VM_REG_GUEST_DS, meta);
+	err += vmcb_snapshot_desc(sc, vcpu, VM_REG_GUEST_DS, meta);
+
+	/* FS */
+	err += svm_snapshot_reg(sc, vcpu, VM_REG_GUEST_FS, meta);
+	err += vmcb_snapshot_desc(sc, vcpu, VM_REG_GUEST_FS, meta);
+
+	/* GS */
+	err += svm_snapshot_reg(sc, vcpu, VM_REG_GUEST_GS, meta);
+	err += vmcb_snapshot_desc(sc, vcpu, VM_REG_GUEST_GS, meta);
+
+	/* TR */
+	err += svm_snapshot_reg(sc, vcpu, VM_REG_GUEST_TR, meta);
+	err += vmcb_snapshot_desc(sc, vcpu, VM_REG_GUEST_TR, meta);
+
+	/* LDTR */
+	err += svm_snapshot_reg(sc, vcpu, VM_REG_GUEST_LDTR, meta);
+	err += vmcb_snapshot_desc(sc, vcpu, VM_REG_GUEST_LDTR, meta);
+
+	/* EFER */
+	err += svm_snapshot_reg(sc, vcpu, VM_REG_GUEST_EFER, meta);
+
+	/* IDTR and GDTR */
+	err += vmcb_snapshot_desc(sc, vcpu, VM_REG_GUEST_IDTR, meta);
+	err += vmcb_snapshot_desc(sc, vcpu, VM_REG_GUEST_GDTR, meta);
+
+	/* Specific AMD registers */
+	err += vmcb_snapshot_any(sc, vcpu,
+				VMCB_ACCESS(VMCB_OFF_SYSENTER_CS, 8), meta);
+	err += vmcb_snapshot_any(sc, vcpu,
+				VMCB_ACCESS(VMCB_OFF_SYSENTER_ESP, 8), meta);
+	err += vmcb_snapshot_any(sc, vcpu,
+				VMCB_ACCESS(VMCB_OFF_SYSENTER_EIP, 8), meta);
+
+	err += vmcb_snapshot_any(sc, vcpu,
+				VMCB_ACCESS(VMCB_OFF_NPT_BASE, 8), meta);
+
+	err += vmcb_snapshot_any(sc, vcpu,
+				VMCB_ACCESS(VMCB_OFF_CR_INTERCEPT, 4), meta);
+	err += vmcb_snapshot_any(sc, vcpu,
+				VMCB_ACCESS(VMCB_OFF_DR_INTERCEPT, 4), meta);
+	err += vmcb_snapshot_any(sc, vcpu,
+				VMCB_ACCESS(VMCB_OFF_EXC_INTERCEPT, 4), meta);
+	err += vmcb_snapshot_any(sc, vcpu,
+				VMCB_ACCESS(VMCB_OFF_INST1_INTERCEPT, 4), meta);
+	err += vmcb_snapshot_any(sc, vcpu,
+				VMCB_ACCESS(VMCB_OFF_INST2_INTERCEPT, 4), meta);
+
+	err += vmcb_snapshot_any(sc, vcpu,
+				VMCB_ACCESS(VMCB_OFF_TLB_CTRL, 4), meta);
+
+	err += vmcb_snapshot_any(sc, vcpu,
+				VMCB_ACCESS(VMCB_OFF_EXITINFO1, 8), meta);
+	err += vmcb_snapshot_any(sc, vcpu,
+				VMCB_ACCESS(VMCB_OFF_EXITINFO2, 8), meta);
+	err += vmcb_snapshot_any(sc, vcpu,
+				VMCB_ACCESS(VMCB_OFF_EXITINTINFO, 8), meta);
+
+	err += vmcb_snapshot_any(sc, vcpu,
+				VMCB_ACCESS(VMCB_OFF_VIRQ, 8), meta);
+
+	err += vmcb_snapshot_any(sc, vcpu,
+				VMCB_ACCESS(VMCB_OFF_GUEST_PAT, 8), meta);
+
+	err += vmcb_snapshot_any(sc, vcpu,
+				VMCB_ACCESS(VMCB_OFF_AVIC_BAR, 8), meta);
+	err += vmcb_snapshot_any(sc, vcpu,
+				VMCB_ACCESS(VMCB_OFF_AVIC_PAGE, 8), meta);
+	err += vmcb_snapshot_any(sc, vcpu,
+				VMCB_ACCESS(VMCB_OFF_AVIC_LT, 8), meta);
+	err += vmcb_snapshot_any(sc, vcpu,
+				VMCB_ACCESS(VMCB_OFF_AVIC_PT, 8), meta);
+
+	err += vmcb_snapshot_any(sc, vcpu,
+				VMCB_ACCESS(VMCB_OFF_IO_PERM, 8), meta);
+	err += vmcb_snapshot_any(sc, vcpu,
+				VMCB_ACCESS(VMCB_OFF_MSR_PERM, 8), meta);
+
+	err += vmcb_snapshot_any(sc, vcpu,
+				VMCB_ACCESS(VMCB_OFF_ASID, 4), meta);
+
+	err += vmcb_snapshot_any(sc, vcpu,
+				VMCB_ACCESS(VMCB_OFF_EXIT_REASON, 8), meta);
+
+	err += svm_snapshot_reg(sc, vcpu, VM_REG_GUEST_INTR_SHADOW, meta);
+
+	return (err);
+}
+
+static int
+svm_restore_tsc(void *arg, int vcpu, uint64_t offset)
+{
+	int err;
+
+	err = svm_set_tsc_offset(arg, vcpu, offset);
+
+	return (err);
+}
+#endif
+
 struct vmm_ops vmm_ops_amd = {
 	.init		= svm_init,
 	.cleanup	= svm_cleanup,
@@ -2302,4 +2654,9 @@ struct vmm_ops vmm_ops_amd = {
 	.vmspace_free	= svm_npt_free,
 	.vlapic_init	= svm_vlapic_init,
 	.vlapic_cleanup	= svm_vlapic_cleanup,
+#ifdef BHYVE_SNAPSHOT
+	.vmsnapshot	= svm_snapshot_vmi,
+	.vmcx_snapshot	= svm_snapshot_vmcx,
+	.vm_restore_tsc	= svm_restore_tsc,
+#endif
 };

Modified: projects/nfs-over-tls/sys/amd64/vmm/amd/svm.h
==============================================================================
--- projects/nfs-over-tls/sys/amd64/vmm/amd/svm.h	Sat May 23 12:15:47 2020	(r361415)
+++ projects/nfs-over-tls/sys/amd64/vmm/amd/svm.h	Sat May 23 15:49:07 2020	(r361416)
@@ -32,6 +32,7 @@
 #define _SVM_H_
 
 struct pcpu;
+struct svm_softc;
 
 /*
  * Guest register state that is saved outside the VMCB.
@@ -66,5 +67,8 @@ struct svm_regctx {
 };
 
 void svm_launch(uint64_t pa, struct svm_regctx *gctx, struct pcpu *pcpu);
+#ifdef BHYVE_SNAPSHOT
+int  svm_set_tsc_offset(struct svm_softc *sc, int vcpu, uint64_t offset);
+#endif
 
 #endif /* _SVM_H_ */

Modified: projects/nfs-over-tls/sys/amd64/vmm/amd/svm_msr.c
==============================================================================
--- projects/nfs-over-tls/sys/amd64/vmm/amd/svm_msr.c	Sat May 23 12:15:47 2020	(r361415)
+++ projects/nfs-over-tls/sys/amd64/vmm/amd/svm_msr.c	Sat May 23 15:49:07 2020	(r361416)
@@ -29,6 +29,8 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include "opt_bhyve_snapshot.h"
+
 #include <sys/param.h>
 #include <sys/errno.h>
 #include <sys/systm.h>
@@ -162,6 +164,11 @@ svm_wrmsr(struct svm_softc *sc, int vcpu, u_int num, u
 		 * Ignore writes to microcode update register.
 		 */
 		break;
+#ifdef BHYVE_SNAPSHOT
+	case MSR_TSC:
+		error = svm_set_tsc_offset(sc, vcpu, val - rdtsc());
+		break;
+#endif
 	case MSR_EXTFEATURES:
 		break;
 	default:

Modified: projects/nfs-over-tls/sys/amd64/vmm/amd/vmcb.c
==============================================================================
--- projects/nfs-over-tls/sys/amd64/vmm/amd/vmcb.c	Sat May 23 12:15:47 2020	(r361415)
+++ projects/nfs-over-tls/sys/amd64/vmm/amd/vmcb.c	Sat May 23 15:49:07 2020	(r361416)
@@ -29,12 +29,15 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include "opt_bhyve_snapshot.h"
+
 #include <sys/param.h>
 #include <sys/systm.h>
 
 #include <machine/segments.h>
 #include <machine/specialreg.h>
 #include <machine/vmm.h>
+#include <machine/vmm_snapshot.h>
 
 #include "vmm_ktr.h"
 
@@ -452,3 +455,106 @@ vmcb_getdesc(void *arg, int vcpu, int reg, struct seg_
 
 	return (0);
 }
+
+#ifdef BHYVE_SNAPSHOT
+int
+vmcb_getany(struct svm_softc *sc, int vcpu, int ident, uint64_t *val)
+{
+	int error = 0;
+
+	if (vcpu < 0 || vcpu >= VM_MAXCPU) {
+		error = EINVAL;
+		goto err;
+	}

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***


More information about the svn-src-projects mailing list