From owner-svn-src-projects@freebsd.org Sat May 23 15:49:11 2020 Return-Path: Delivered-To: svn-src-projects@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 3C3E62CE7B0 for ; Sat, 23 May 2020 15:49:11 +0000 (UTC) (envelope-from rmacklem@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 49Tnpb184Rz4CXR; Sat, 23 May 2020 15:49:11 +0000 (UTC) (envelope-from rmacklem@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 21CAA12420; Sat, 23 May 2020 15:49:11 +0000 (UTC) (envelope-from rmacklem@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 04NFnB80066069; Sat, 23 May 2020 15:49:11 GMT (envelope-from rmacklem@FreeBSD.org) Received: (from rmacklem@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 04NFn8g1066054; Sat, 23 May 2020 15:49:08 GMT (envelope-from rmacklem@FreeBSD.org) Message-Id: <202005231549.04NFn8g1066054@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to rmacklem@FreeBSD.org using -f From: Rick Macklem Date: Sat, 23 May 2020 15:49:08 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: 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... X-SVN-Group: projects X-SVN-Commit-Author: rmacklem X-SVN-Commit-Paths: 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 arm/xilinx arm64/arm64 arm... X-SVN-Commit-Revision: 361416 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.33 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 23 May 2020 15:49:11 -0000 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 __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 #include +#ifdef DEV_ACPI #include #include +#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 #include +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 +#include +#ifndef _KERNEL +#include +#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 __FBSDID("$FreeBSD$"); +#include "opt_bhyve_snapshot.h" + #include #include #include @@ -50,6 +52,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #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 __FBSDID("$FreeBSD$"); +#include "opt_bhyve_snapshot.h" + #include #include #include @@ -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 __FBSDID("$FreeBSD$"); +#include "opt_bhyve_snapshot.h" + #include #include #include #include #include +#include #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 ***