Date: Fri, 27 Sep 2019 20:09:44 +0000 (UTC) From: Rick Macklem <rmacklem@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r352817 - in projects/nfsv42/sys: amd64/amd64 amd64/linux amd64/linux32 amd64/sgx amd64/vmm arm/arm arm/freescale/imx arm/nvidia/drm2 arm/ti arm/ti/am335x arm64/arm64 arm64/conf arm64/i... Message-ID: <201909272009.x8RK9iTq077065@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: rmacklem Date: Fri Sep 27 20:09:43 2019 New Revision: 352817 URL: https://svnweb.freebsd.org/changeset/base/352817 Log: Merge in an up to date kernel from head. Added: projects/nfsv42/sys/arm64/intel/ - copied from r352815, head/sys/arm64/intel/ projects/nfsv42/sys/arm64/linux/linux_genassym.c - copied unchanged from r352815, head/sys/arm64/linux/linux_genassym.c projects/nfsv42/sys/dev/hwpmc/hwpmc_beri.c - copied unchanged from r352815, head/sys/dev/hwpmc/hwpmc_beri.c projects/nfsv42/sys/dev/hwpmc/hwpmc_beri.h - copied unchanged from r352815, head/sys/dev/hwpmc/hwpmc_beri.h projects/nfsv42/sys/dev/nvdimm/nvdimm_acpi.c - copied unchanged from r352815, head/sys/dev/nvdimm/nvdimm_acpi.c projects/nfsv42/sys/dev/psci/smccc_arm.S - copied unchanged from r352815, head/sys/dev/psci/smccc_arm.S projects/nfsv42/sys/dev/psci/smccc_arm64.S - copied unchanged from r352815, head/sys/dev/psci/smccc_arm64.S projects/nfsv42/sys/kern/subr_filter.c - copied unchanged from r352815, head/sys/kern/subr_filter.c projects/nfsv42/sys/modules/opal_nvram/ - copied from r352815, head/sys/modules/opal_nvram/ projects/nfsv42/sys/modules/tcp/bbr/ - copied from r352815, head/sys/modules/tcp/bbr/ projects/nfsv42/sys/netinet/tcp_stacks/bbr.c - copied unchanged from r352815, head/sys/netinet/tcp_stacks/bbr.c projects/nfsv42/sys/netinet/tcp_stacks/tcp_bbr.h - copied unchanged from r352815, head/sys/netinet/tcp_stacks/tcp_bbr.h projects/nfsv42/sys/powerpc/powernv/opal_nvram.c - copied unchanged from r352815, head/sys/powerpc/powernv/opal_nvram.c projects/nfsv42/sys/sys/arb.h - copied unchanged from r352815, head/sys/sys/arb.h projects/nfsv42/sys/sys/tim_filter.h - copied unchanged from r352815, head/sys/sys/tim_filter.h Deleted: projects/nfsv42/sys/dev/nand/ projects/nfsv42/sys/dev/psci/psci_arm.S projects/nfsv42/sys/dev/psci/psci_arm64.S projects/nfsv42/sys/fs/nandfs/ projects/nfsv42/sys/gnu/dts/include/dt-bindings/genpd/ projects/nfsv42/sys/mips/gxemul/ projects/nfsv42/sys/modules/drm/ projects/nfsv42/sys/modules/drm2/ projects/nfsv42/sys/modules/if_tap/ projects/nfsv42/sys/modules/if_tun/ projects/nfsv42/sys/modules/nand/ projects/nfsv42/sys/modules/nandfs/ projects/nfsv42/sys/modules/nandsim/ Modified: projects/nfsv42/sys/amd64/amd64/efirt_machdep.c projects/nfsv42/sys/amd64/amd64/elf_machdep.c projects/nfsv42/sys/amd64/amd64/pmap.c projects/nfsv42/sys/amd64/amd64/trap.c projects/nfsv42/sys/amd64/linux/linux_dummy.c projects/nfsv42/sys/amd64/linux/linux_proto.h projects/nfsv42/sys/amd64/linux/linux_systrace_args.c projects/nfsv42/sys/amd64/linux/syscalls.master projects/nfsv42/sys/amd64/linux32/linux32_dummy.c projects/nfsv42/sys/amd64/linux32/linux32_proto.h projects/nfsv42/sys/amd64/linux32/linux32_systrace_args.c projects/nfsv42/sys/amd64/linux32/syscalls.master projects/nfsv42/sys/amd64/sgx/sgx.c projects/nfsv42/sys/amd64/vmm/vmm.c projects/nfsv42/sys/arm/arm/pmap-v4.c projects/nfsv42/sys/arm/arm/pmap-v6.c projects/nfsv42/sys/arm/arm/trap-v4.c projects/nfsv42/sys/arm/arm/trap-v6.c projects/nfsv42/sys/arm/freescale/imx/imx6_machdep.c projects/nfsv42/sys/arm/nvidia/drm2/tegra_bo.c projects/nfsv42/sys/arm/ti/am335x/am335x_dmtpps.c projects/nfsv42/sys/arm/ti/ti_sysc.c projects/nfsv42/sys/arm64/arm64/efirt_machdep.c projects/nfsv42/sys/arm64/arm64/pmap.c projects/nfsv42/sys/arm64/arm64/trap.c projects/nfsv42/sys/arm64/conf/GENERIC projects/nfsv42/sys/arm64/linux/linux_dummy.c projects/nfsv42/sys/arm64/linux/linux_proto.h projects/nfsv42/sys/arm64/linux/linux_systrace_args.c projects/nfsv42/sys/arm64/linux/syscalls.master projects/nfsv42/sys/cam/cam_periph.c projects/nfsv42/sys/cam/scsi/scsi_da.c projects/nfsv42/sys/cam/scsi/scsi_enc_ses.c projects/nfsv42/sys/cddl/compat/opensolaris/kern/opensolaris_vfs.c projects/nfsv42/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_scan.c projects/nfsv42/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c projects/nfsv42/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c projects/nfsv42/sys/cddl/dev/dtrace/amd64/dtrace_asm.S projects/nfsv42/sys/cddl/dev/dtrace/amd64/dtrace_subr.c projects/nfsv42/sys/cddl/dev/dtrace/i386/dtrace_asm.S projects/nfsv42/sys/cddl/dev/dtrace/i386/dtrace_subr.c projects/nfsv42/sys/compat/cloudabi/cloudabi_fd.c projects/nfsv42/sys/compat/freebsd32/freebsd32_proto.h projects/nfsv42/sys/compat/freebsd32/freebsd32_syscall.h projects/nfsv42/sys/compat/freebsd32/freebsd32_syscalls.c projects/nfsv42/sys/compat/freebsd32/freebsd32_sysent.c projects/nfsv42/sys/compat/freebsd32/freebsd32_systrace_args.c projects/nfsv42/sys/compat/freebsd32/syscalls.master projects/nfsv42/sys/compat/linsysfs/linsysfs.c projects/nfsv42/sys/compat/linux/linux_file.c projects/nfsv42/sys/compat/linuxkpi/common/include/linux/interrupt.h projects/nfsv42/sys/compat/linuxkpi/common/include/linux/mm.h projects/nfsv42/sys/compat/linuxkpi/common/src/linux_compat.c projects/nfsv42/sys/compat/linuxkpi/common/src/linux_page.c projects/nfsv42/sys/compat/linuxkpi/common/src/linux_work.c projects/nfsv42/sys/conf/files projects/nfsv42/sys/conf/files.arm projects/nfsv42/sys/conf/files.arm64 projects/nfsv42/sys/conf/files.mips projects/nfsv42/sys/conf/files.powerpc projects/nfsv42/sys/conf/kern.mk projects/nfsv42/sys/conf/ldscript.riscv projects/nfsv42/sys/conf/makeLINT.mk projects/nfsv42/sys/conf/options projects/nfsv42/sys/conf/options.arm64 projects/nfsv42/sys/contrib/ipfilter/netinet/fil.c projects/nfsv42/sys/contrib/octeon-sdk/cvmx-app-init.h projects/nfsv42/sys/contrib/vchiq/interface/vchiq_arm/vchiq_2835_arm.c projects/nfsv42/sys/ddb/db_command.h projects/nfsv42/sys/ddb/db_lex.c projects/nfsv42/sys/ddb/db_lex.h projects/nfsv42/sys/ddb/db_run.c projects/nfsv42/sys/dev/agp/agp.c projects/nfsv42/sys/dev/agp/agp_i810.c projects/nfsv42/sys/dev/cxgbe/tom/t4_cpl_io.c projects/nfsv42/sys/dev/cxgbe/tom/t4_ddp.c projects/nfsv42/sys/dev/drm2/ttm/ttm_bo_vm.c projects/nfsv42/sys/dev/drm2/ttm/ttm_page_alloc.c projects/nfsv42/sys/dev/drm2/ttm/ttm_tt.c projects/nfsv42/sys/dev/firewire/if_fwip.c projects/nfsv42/sys/dev/hwpmc/pmc_events.h projects/nfsv42/sys/dev/ichiic/ig4_iic.c projects/nfsv42/sys/dev/iicbus/iiconf.c projects/nfsv42/sys/dev/iicbus/iiconf.h projects/nfsv42/sys/dev/ioat/ioat.c projects/nfsv42/sys/dev/ioat/ioat_internal.h projects/nfsv42/sys/dev/ixgbe/if_ix.c projects/nfsv42/sys/dev/ixgbe/if_ixv.c projects/nfsv42/sys/dev/ixgbe/ixgbe.h projects/nfsv42/sys/dev/jme/if_jme.c projects/nfsv42/sys/dev/md/md.c projects/nfsv42/sys/dev/netmap/netmap_freebsd.c projects/nfsv42/sys/dev/nvdimm/nvdimm.c projects/nfsv42/sys/dev/nvdimm/nvdimm_var.h projects/nfsv42/sys/dev/nvme/nvme_ahci.c projects/nfsv42/sys/dev/nvme/nvme_ctrlr.c projects/nfsv42/sys/dev/nvme/nvme_ctrlr_cmd.c projects/nfsv42/sys/dev/nvme/nvme_pci.c projects/nfsv42/sys/dev/nvme/nvme_private.h projects/nfsv42/sys/dev/nvme/nvme_qpair.c projects/nfsv42/sys/dev/nvme/nvme_sysctl.c projects/nfsv42/sys/dev/pccard/pccard.c projects/nfsv42/sys/dev/psci/psci.c projects/nfsv42/sys/dev/psci/psci.h projects/nfsv42/sys/dev/psci/smccc.h projects/nfsv42/sys/dev/ral/if_ral_pci.c projects/nfsv42/sys/dev/ral/rt2860.c projects/nfsv42/sys/dev/sound/pci/hda/hdac.c projects/nfsv42/sys/dev/sound/pci/hda/hdac.h projects/nfsv42/sys/dev/uart/uart_dev_ns8250.c projects/nfsv42/sys/dev/usb/controller/xhci.c projects/nfsv42/sys/dev/usb/usb_bus.h projects/nfsv42/sys/dev/usb/usb_ioctl.h projects/nfsv42/sys/dev/usb/usb_transfer.c projects/nfsv42/sys/dev/vt/hw/fb/vt_fb.c projects/nfsv42/sys/dev/vt/vt.h projects/nfsv42/sys/dev/vt/vt_buf.c projects/nfsv42/sys/dev/vt/vt_core.c projects/nfsv42/sys/dev/vt/vt_cpulogos.c projects/nfsv42/sys/dev/xen/gntdev/gntdev.c projects/nfsv42/sys/dev/xen/privcmd/privcmd.c projects/nfsv42/sys/fs/fuse/fuse_internal.c projects/nfsv42/sys/fs/fuse/fuse_io.c projects/nfsv42/sys/fs/fuse/fuse_node.h projects/nfsv42/sys/fs/fuse/fuse_vnops.c projects/nfsv42/sys/fs/msdosfs/fat.h projects/nfsv42/sys/fs/msdosfs/msdosfs_denode.c projects/nfsv42/sys/fs/msdosfs/msdosfs_fat.c projects/nfsv42/sys/fs/msdosfs/msdosfs_vfsops.c projects/nfsv42/sys/fs/msdosfs/msdosfsmount.h projects/nfsv42/sys/fs/nfs/nfsport.h projects/nfsv42/sys/fs/nfsclient/nfs_clbio.c projects/nfsv42/sys/fs/nfsclient/nfs_clnfsiod.c projects/nfsv42/sys/fs/nfsclient/nfs_clnode.c projects/nfsv42/sys/fs/nfsclient/nfs_clport.c projects/nfsv42/sys/fs/nfsclient/nfs_clrpcops.c projects/nfsv42/sys/fs/nfsclient/nfs_clsubs.c projects/nfsv42/sys/fs/nfsclient/nfs_clvfsops.c projects/nfsv42/sys/fs/nfsclient/nfs_clvnops.c projects/nfsv42/sys/fs/pseudofs/pseudofs.c projects/nfsv42/sys/fs/pseudofs/pseudofs.h projects/nfsv42/sys/fs/tmpfs/tmpfs_subr.c projects/nfsv42/sys/geom/nop/g_nop.c projects/nfsv42/sys/geom/nop/g_nop.h projects/nfsv42/sys/i386/i386/pmap.c projects/nfsv42/sys/i386/i386/pmap_base.c projects/nfsv42/sys/i386/i386/trap.c projects/nfsv42/sys/i386/include/pmap_base.h projects/nfsv42/sys/i386/linux/linux_dummy.c projects/nfsv42/sys/i386/linux/linux_proto.h projects/nfsv42/sys/i386/linux/linux_systrace_args.c projects/nfsv42/sys/i386/linux/syscalls.master projects/nfsv42/sys/kern/capabilities.conf projects/nfsv42/sys/kern/imgact_elf.c projects/nfsv42/sys/kern/init_sysent.c projects/nfsv42/sys/kern/kern_cpuset.c projects/nfsv42/sys/kern/kern_descrip.c projects/nfsv42/sys/kern/kern_environment.c projects/nfsv42/sys/kern/kern_exec.c projects/nfsv42/sys/kern/kern_fork.c projects/nfsv42/sys/kern/kern_kcov.c projects/nfsv42/sys/kern/kern_rangelock.c projects/nfsv42/sys/kern/kern_sendfile.c projects/nfsv42/sys/kern/kern_sig.c projects/nfsv42/sys/kern/kern_sysctl.c projects/nfsv42/sys/kern/kern_tc.c projects/nfsv42/sys/kern/kern_thread.c projects/nfsv42/sys/kern/kern_timeout.c projects/nfsv42/sys/kern/link_elf.c projects/nfsv42/sys/kern/makesyscalls.sh projects/nfsv42/sys/kern/sched_ule.c projects/nfsv42/sys/kern/subr_epoch.c projects/nfsv42/sys/kern/subr_lock.c projects/nfsv42/sys/kern/subr_pcpu.c projects/nfsv42/sys/kern/subr_stack.c projects/nfsv42/sys/kern/subr_terminal.c projects/nfsv42/sys/kern/sys_process.c projects/nfsv42/sys/kern/syscalls.c projects/nfsv42/sys/kern/syscalls.master projects/nfsv42/sys/kern/systrace_args.c projects/nfsv42/sys/kern/uipc_ktls.c projects/nfsv42/sys/kern/uipc_mbuf.c projects/nfsv42/sys/kern/uipc_shm.c projects/nfsv42/sys/kern/vfs_bio.c projects/nfsv42/sys/kern/vfs_cache.c projects/nfsv42/sys/kern/vfs_cluster.c projects/nfsv42/sys/kern/vfs_default.c projects/nfsv42/sys/kern/vfs_mount.c projects/nfsv42/sys/kern/vfs_mountroot.c projects/nfsv42/sys/kern/vfs_subr.c projects/nfsv42/sys/kern/vfs_vnops.c projects/nfsv42/sys/mips/cavium/std.octeon1 projects/nfsv42/sys/mips/include/pcpu.h projects/nfsv42/sys/mips/mips/pmap.c projects/nfsv42/sys/mips/mips/trap.c projects/nfsv42/sys/modules/Makefile projects/nfsv42/sys/modules/nvdimm/Makefile projects/nfsv42/sys/modules/tcp/Makefile projects/nfsv42/sys/net/bpf_zerocopy.c projects/nfsv42/sys/net/if.c projects/nfsv42/sys/net/if.h projects/nfsv42/sys/net/if_ethersubr.c projects/nfsv42/sys/net/if_spppsubr.c projects/nfsv42/sys/net/if_vlan.c projects/nfsv42/sys/net/iflib.c projects/nfsv42/sys/net/rtsock.c projects/nfsv42/sys/netinet/ip_output.c projects/nfsv42/sys/netinet/ip_var.h projects/nfsv42/sys/netinet/sctp_asconf.c projects/nfsv42/sys/netinet/sctp_auth.c projects/nfsv42/sys/netinet/sctp_crc32.c projects/nfsv42/sys/netinet/sctp_indata.c projects/nfsv42/sys/netinet/sctp_input.c projects/nfsv42/sys/netinet/sctputil.c projects/nfsv42/sys/netinet/sctputil.h projects/nfsv42/sys/netinet/tcp.h projects/nfsv42/sys/netinet/tcp_input.c projects/nfsv42/sys/netinet/tcp_ratelimit.c projects/nfsv42/sys/netinet/tcp_ratelimit.h projects/nfsv42/sys/netinet/tcp_sack.c projects/nfsv42/sys/netinet/tcp_stacks/rack.c projects/nfsv42/sys/netinet/tcp_stacks/rack_bbr_common.c projects/nfsv42/sys/netinet/tcp_stacks/rack_bbr_common.h projects/nfsv42/sys/netinet/tcp_stacks/sack_filter.c projects/nfsv42/sys/netinet/tcp_stacks/sack_filter.h projects/nfsv42/sys/netinet/tcp_stacks/tcp_rack.h projects/nfsv42/sys/netinet/tcp_syncache.c projects/nfsv42/sys/netinet/tcp_syncache.h projects/nfsv42/sys/netinet6/ip6_input.c projects/nfsv42/sys/netpfil/ipfw/ip_fw2.c projects/nfsv42/sys/opencrypto/ktls_ocf.c projects/nfsv42/sys/powerpc/aim/mmu_oea.c projects/nfsv42/sys/powerpc/aim/mmu_oea64.c projects/nfsv42/sys/powerpc/booke/pmap.c projects/nfsv42/sys/powerpc/include/atomic.h projects/nfsv42/sys/powerpc/powernv/opal.h projects/nfsv42/sys/powerpc/powernv/opal_hmi.c projects/nfsv42/sys/powerpc/powerpc/mp_machdep.c projects/nfsv42/sys/powerpc/powerpc/trap.c projects/nfsv42/sys/riscv/conf/GENERIC projects/nfsv42/sys/riscv/riscv/clock.c projects/nfsv42/sys/riscv/riscv/elf_machdep.c projects/nfsv42/sys/riscv/riscv/identcpu.c projects/nfsv42/sys/riscv/riscv/mp_machdep.c projects/nfsv42/sys/riscv/riscv/pmap.c projects/nfsv42/sys/riscv/riscv/trap.c projects/nfsv42/sys/sparc64/sparc64/pmap.c projects/nfsv42/sys/sparc64/sparc64/trap.c projects/nfsv42/sys/sys/buf.h projects/nfsv42/sys/sys/elf_common.h projects/nfsv42/sys/sys/epoch.h projects/nfsv42/sys/sys/fcntl.h projects/nfsv42/sys/sys/file.h projects/nfsv42/sys/sys/ktls.h projects/nfsv42/sys/sys/mbuf.h projects/nfsv42/sys/sys/mman.h projects/nfsv42/sys/sys/mount.h projects/nfsv42/sys/sys/param.h projects/nfsv42/sys/sys/pcpu.h projects/nfsv42/sys/sys/pmc.h projects/nfsv42/sys/sys/proc.h projects/nfsv42/sys/sys/rangelock.h projects/nfsv42/sys/sys/refcount.h projects/nfsv42/sys/sys/signal.h projects/nfsv42/sys/sys/signalvar.h projects/nfsv42/sys/sys/sockio.h projects/nfsv42/sys/sys/stack.h projects/nfsv42/sys/sys/syscall.h projects/nfsv42/sys/sys/syscall.mk projects/nfsv42/sys/sys/syscallsubr.h projects/nfsv42/sys/sys/sysctl.h projects/nfsv42/sys/sys/sysproto.h projects/nfsv42/sys/sys/unistd.h projects/nfsv42/sys/sys/vnode.h projects/nfsv42/sys/tools/fw_stub.awk projects/nfsv42/sys/ufs/ffs/ffs_softdep.c projects/nfsv42/sys/vm/device_pager.c projects/nfsv42/sys/vm/phys_pager.c projects/nfsv42/sys/vm/uma.h projects/nfsv42/sys/vm/vm_extern.h projects/nfsv42/sys/vm/vm_fault.c projects/nfsv42/sys/vm/vm_glue.c projects/nfsv42/sys/vm/vm_map.c projects/nfsv42/sys/vm/vm_object.c projects/nfsv42/sys/vm/vm_page.c projects/nfsv42/sys/vm/vm_page.h projects/nfsv42/sys/vm/vm_pageout.c projects/nfsv42/sys/vm/vm_param.h projects/nfsv42/sys/vm/vm_swapout.c projects/nfsv42/sys/x86/iommu/intel_idpgtbl.c projects/nfsv42/sys/x86/x86/tsc.c Directory Properties: projects/nfsv42/sys/ (props changed) projects/nfsv42/sys/arm64/conf/ (props changed) projects/nfsv42/sys/cddl/contrib/opensolaris/ (props changed) projects/nfsv42/sys/contrib/ipfilter/ (props changed) projects/nfsv42/sys/contrib/octeon-sdk/ (props changed) projects/nfsv42/sys/gnu/dts/include/ (props changed) Modified: projects/nfsv42/sys/amd64/amd64/efirt_machdep.c ============================================================================== --- projects/nfsv42/sys/amd64/amd64/efirt_machdep.c Fri Sep 27 20:08:19 2019 (r352816) +++ projects/nfsv42/sys/amd64/amd64/efirt_machdep.c Fri Sep 27 20:09:43 2019 (r352817) @@ -74,7 +74,7 @@ efi_destroy_1t1_map(void) if (obj_1t1_pt != NULL) { VM_OBJECT_RLOCK(obj_1t1_pt); TAILQ_FOREACH(m, &obj_1t1_pt->memq, listq) - m->wire_count = 0; + m->ref_count = VPRC_OBJREF; vm_wire_sub(obj_1t1_pt->resident_page_count); VM_OBJECT_RUNLOCK(obj_1t1_pt); vm_object_deallocate(obj_1t1_pt); Modified: projects/nfsv42/sys/amd64/amd64/elf_machdep.c ============================================================================== --- projects/nfsv42/sys/amd64/amd64/elf_machdep.c Fri Sep 27 20:08:19 2019 (r352816) +++ projects/nfsv42/sys/amd64/amd64/elf_machdep.c Fri Sep 27 20:09:43 2019 (r352817) @@ -267,7 +267,6 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbas */ printf("kldload: unexpected R_COPY relocation\n"); return (-1); - break; case R_X86_64_GLOB_DAT: /* S */ case R_X86_64_JMP_SLOT: /* XXX need addend + offset */ @@ -279,7 +278,7 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbas break; case R_X86_64_RELATIVE: /* B + A */ - addr = relocbase + addend; + addr = elf_relocaddr(lf, relocbase + addend); val = addr; if (*where != val) *where = val; Modified: projects/nfsv42/sys/amd64/amd64/pmap.c ============================================================================== --- projects/nfsv42/sys/amd64/amd64/pmap.c Fri Sep 27 20:08:19 2019 (r352816) +++ projects/nfsv42/sys/amd64/amd64/pmap.c Fri Sep 27 20:09:43 2019 (r352817) @@ -1539,13 +1539,13 @@ create_pagetables(vm_paddr_t *firstaddr) } for (j = 0; i < ndmpdp; i++, j++) { pdp_p[i] = DMPDphys + ptoa(j); - pdp_p[i] |= X86_PG_RW | X86_PG_V; + pdp_p[i] |= X86_PG_RW | X86_PG_V | pg_nx; } /* * Instead of using a 1G page for the memory containing the kernel, - * use 2M pages with appropriate permissions. (If using 1G pages, - * this will partially overwrite the PDPEs above.) + * use 2M pages with read-only and no-execute permissions. (If using 1G + * pages, this will partially overwrite the PDPEs above.) */ if (ndm1g) { pd_p = (pd_entry_t *)DMPDkernphys; @@ -1555,7 +1555,7 @@ create_pagetables(vm_paddr_t *firstaddr) bootaddr_rwx(i << PDRSHIFT); for (i = 0; i < nkdmpde; i++) pdp_p[i] = (DMPDkernphys + ptoa(i)) | X86_PG_RW | - X86_PG_V; + X86_PG_V | pg_nx; } /* And recursively map PML4 to itself in order to get PTmap */ @@ -1566,7 +1566,7 @@ create_pagetables(vm_paddr_t *firstaddr) /* Connect the Direct Map slot(s) up to the PML4. */ for (i = 0; i < ndmpdpphys; i++) { p4_p[DMPML4I + i] = DMPDPphys + ptoa(i); - p4_p[DMPML4I + i] |= X86_PG_RW | X86_PG_V; + p4_p[DMPML4I + i] |= X86_PG_RW | X86_PG_V | pg_nx; } /* Connect the KVA slots up to the PML4 */ @@ -1856,7 +1856,7 @@ pmap_init(void) ("pmap_init: page table page is out of range")); mpte->pindex = pmap_pde_pindex(KERNBASE) + i; mpte->phys_addr = KPTphys + (i << PAGE_SHIFT); - mpte->wire_count = 1; + mpte->ref_count = 1; /* * Collect the page table pages that were replaced by a 2MB @@ -1947,7 +1947,7 @@ pmap_init(void) if (lm_ents > LMEPML4I - LMSPML4I + 1) lm_ents = LMEPML4I - LMSPML4I + 1; if (bootverbose) - printf("pmap: large map %u PML4 slots (%lu Gb)\n", + printf("pmap: large map %u PML4 slots (%lu GB)\n", lm_ents, (u_long)lm_ents * (NBPML4 / 1024 / 1024 / 1024)); if (lm_ents != 0) { large_vmem = vmem_create("large", LARGEMAP_MIN_ADDRESS, @@ -1965,6 +1965,11 @@ pmap_init(void) } } +SYSCTL_UINT(_vm_pmap, OID_AUTO, large_map_pml4_entries, + CTLFLAG_RDTUN | CTLFLAG_NOFETCH, &lm_ents, 0, + "Maximum number of PML4 entries for use by large map (tunable). " + "Each entry corresponds to 512GB of address space."); + static SYSCTL_NODE(_vm_pmap, OID_AUTO, pde, CTLFLAG_RD, 0, "2MB page mapping counters"); @@ -3064,38 +3069,28 @@ pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_ { pd_entry_t pde, *pdep; pt_entry_t pte, PG_RW, PG_V; - vm_paddr_t pa; vm_page_t m; - pa = 0; m = NULL; PG_RW = pmap_rw_bit(pmap); PG_V = pmap_valid_bit(pmap); + PMAP_LOCK(pmap); -retry: pdep = pmap_pde(pmap, va); if (pdep != NULL && (pde = *pdep)) { if (pde & PG_PS) { - if ((pde & PG_RW) || (prot & VM_PROT_WRITE) == 0) { - if (vm_page_pa_tryrelock(pmap, (pde & - PG_PS_FRAME) | (va & PDRMASK), &pa)) - goto retry; - m = PHYS_TO_VM_PAGE(pa); - } + if ((pde & PG_RW) != 0 || (prot & VM_PROT_WRITE) == 0) + m = PHYS_TO_VM_PAGE((pde & PG_PS_FRAME) | + (va & PDRMASK)); } else { pte = *pmap_pde_to_pte(pdep, va); - if ((pte & PG_V) && - ((pte & PG_RW) || (prot & VM_PROT_WRITE) == 0)) { - if (vm_page_pa_tryrelock(pmap, pte & PG_FRAME, - &pa)) - goto retry; - m = PHYS_TO_VM_PAGE(pa); - } + if ((pte & PG_V) != 0 && + ((pte & PG_RW) != 0 || (prot & VM_PROT_WRITE) == 0)) + m = PHYS_TO_VM_PAGE(pte & PG_FRAME); } - if (m != NULL) - vm_page_wire(m); + if (m != NULL && !vm_page_wire_mapped(m)) + m = NULL; } - PA_UNLOCK_COND(pa); PMAP_UNLOCK(pmap); return (m); } @@ -3144,7 +3139,7 @@ pmap_kenter(vm_offset_t va, vm_paddr_t pa) pt_entry_t *pte; pte = vtopte(va); - pte_store(pte, pa | X86_PG_RW | X86_PG_V | pg_g); + pte_store(pte, pa | X86_PG_RW | X86_PG_V | pg_g | pg_nx); } static __inline void @@ -3155,7 +3150,7 @@ pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, int mo pte = vtopte(va); cache_bits = pmap_cache_bits(kernel_pmap, mode, 0); - pte_store(pte, pa | X86_PG_RW | X86_PG_V | pg_g | cache_bits); + pte_store(pte, pa | X86_PG_RW | X86_PG_V | pg_g | pg_nx | cache_bits); } /* @@ -3295,8 +3290,8 @@ pmap_remove_pt_page(pmap_t pmap, vm_offset_t va) } /* - * Decrements a page table page's wire count, which is used to record the - * number of valid page table entries within the page. If the wire count + * Decrements a page table page's reference count, which is used to record the + * number of valid page table entries within the page. If the reference count * drops to zero, then the page table page is unmapped. Returns TRUE if the * page table page was unmapped and FALSE otherwise. */ @@ -3304,8 +3299,8 @@ static inline boolean_t pmap_unwire_ptp(pmap_t pmap, vm_offset_t va, vm_page_t m, struct spglist *free) { - --m->wire_count; - if (m->wire_count == 0) { + --m->ref_count; + if (m->ref_count == 0) { _pmap_unwire_ptp(pmap, va, m, free); return (TRUE); } else @@ -3365,7 +3360,7 @@ _pmap_unwire_ptp(pmap_t pmap, vm_offset_t va, vm_page_ /* * After removing a page table entry, this routine is used to - * conditionally free the page, and manage the hold/wire counts. + * conditionally free the page, and manage the reference count. */ static int pmap_unuse_pt(pmap_t pmap, vm_offset_t va, pd_entry_t ptepde, @@ -3625,7 +3620,7 @@ _pmap_allocpte(pmap_t pmap, vm_pindex_t ptepindex, str } else { /* Add reference to pdp page */ pdppg = PHYS_TO_VM_PAGE(*pml4 & PG_FRAME); - pdppg->wire_count++; + pdppg->ref_count++; } pdp = (pdp_entry_t *)PHYS_TO_DMAP(*pml4 & PG_FRAME); @@ -3670,7 +3665,7 @@ _pmap_allocpte(pmap_t pmap, vm_pindex_t ptepindex, str } else { /* Add reference to the pd page */ pdpg = PHYS_TO_VM_PAGE(*pdp & PG_FRAME); - pdpg->wire_count++; + pdpg->ref_count++; } } pd = (pd_entry_t *)PHYS_TO_DMAP(*pdp & PG_FRAME); @@ -3699,7 +3694,7 @@ retry: if (pdpe != NULL && (*pdpe & PG_V) != 0) { /* Add a reference to the pd page. */ pdpg = PHYS_TO_VM_PAGE(*pdpe & PG_FRAME); - pdpg->wire_count++; + pdpg->ref_count++; } else { /* Allocate a pd page. */ ptepindex = pmap_pde_pindex(va); @@ -3750,7 +3745,7 @@ retry: */ if (pd != NULL && (*pd & PG_V) != 0) { m = PHYS_TO_VM_PAGE(*pd & PG_FRAME); - m->wire_count++; + m->ref_count++; } else { /* * Here if the pte page isn't mapped, or if it has been @@ -4215,7 +4210,7 @@ next_chunk: m_pc = SLIST_FIRST(&free); SLIST_REMOVE_HEAD(&free, plinks.s.ss); /* Recycle a freed page table page. */ - m_pc->wire_count = 1; + m_pc->ref_count = 1; } vm_page_free_pages_toq(&free, true); return (m_pc); @@ -4795,7 +4790,7 @@ pmap_demote_pde_locked(pmap_t pmap, pd_entry_t *pde, v } if (!in_kernel) { - mpte->wire_count = NPTEPG; + mpte->ref_count = NPTEPG; pmap_resident_count_inc(pmap, 1); } } @@ -4956,9 +4951,9 @@ pmap_remove_pde(pmap_t pmap, pd_entry_t *pdq, vm_offse KASSERT(mpte->valid == VM_PAGE_BITS_ALL, ("pmap_remove_pde: pte page not promoted")); pmap_resident_count_dec(pmap, 1); - KASSERT(mpte->wire_count == NPTEPG, - ("pmap_remove_pde: pte page wire count error")); - mpte->wire_count = 0; + KASSERT(mpte->ref_count == NPTEPG, + ("pmap_remove_pde: pte page ref count error")); + mpte->ref_count = 0; pmap_add_delayed_free_list(mpte, free, FALSE); } } @@ -5719,7 +5714,7 @@ retry: pte = pmap_pde_to_pte(pde, va); if (va < VM_MAXUSER_ADDRESS && mpte == NULL) { mpte = PHYS_TO_VM_PAGE(*pde & PG_FRAME); - mpte->wire_count++; + mpte->ref_count++; } } else if (va < VM_MAXUSER_ADDRESS) { /* @@ -5761,8 +5756,8 @@ retry: * Remove the extra PT page reference. */ if (mpte != NULL) { - mpte->wire_count--; - KASSERT(mpte->wire_count > 0, + mpte->ref_count--; + KASSERT(mpte->ref_count > 0, ("pmap_enter: missing reference to page table page," " va: 0x%lx", va)); } @@ -5883,7 +5878,7 @@ unchanged: * If both the page table page and the reservation are fully * populated, then attempt promotion. */ - if ((mpte == NULL || mpte->wire_count == NPTEPG) && + if ((mpte == NULL || mpte->ref_count == NPTEPG) && pmap_ps_enabled(pmap) && (m->flags & PG_FICTITIOUS) == 0 && vm_reserv_level_iffullpop(m) == 0) @@ -5985,10 +5980,10 @@ pmap_enter_pde(pmap_t pmap, vm_offset_t va, pd_entry_t pde = &pde[pmap_pde_index(va)]; oldpde = *pde; if ((oldpde & PG_V) != 0) { - KASSERT(pdpg->wire_count > 1, - ("pmap_enter_pde: pdpg's wire count is too low")); + KASSERT(pdpg->ref_count > 1, + ("pmap_enter_pde: pdpg's reference count is too low")); if ((flags & PMAP_ENTER_NOREPLACE) != 0) { - pdpg->wire_count--; + pdpg->ref_count--; CTR2(KTR_PMAP, "pmap_enter_pde: failure for va %#lx" " in pmap %p", va, pmap); return (KERN_FAILURE); @@ -6162,7 +6157,7 @@ pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, v */ ptepindex = pmap_pde_pindex(va); if (mpte && (mpte->pindex == ptepindex)) { - mpte->wire_count++; + mpte->ref_count++; } else { /* * Get the page directory entry @@ -6179,7 +6174,7 @@ pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, v if (*ptepa & PG_PS) return (NULL); mpte = PHYS_TO_VM_PAGE(*ptepa & PG_FRAME); - mpte->wire_count++; + mpte->ref_count++; } else { /* * Pass NULL instead of the PV list lock @@ -6198,7 +6193,7 @@ pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, v } if (*pte) { if (mpte != NULL) { - mpte->wire_count--; + mpte->ref_count--; mpte = NULL; } return (mpte); @@ -6344,8 +6339,8 @@ pmap_object_init_pt(pmap_t pmap, vm_offset_t addr, vm_ atomic_add_long(&pmap_pde_mappings, 1); } else { /* Continue on if the PDE is already valid. */ - pdpg->wire_count--; - KASSERT(pdpg->wire_count > 0, + pdpg->ref_count--; + KASSERT(pdpg->ref_count > 0, ("pmap_object_init_pt: missing reference " "to page directory page, va: 0x%lx", addr)); } @@ -6535,13 +6530,13 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_ PAGE_SIZE); atomic_add_long(&pmap_pde_mappings, 1); } else - dst_pdpg->wire_count--; + dst_pdpg->ref_count--; continue; } srcptepaddr &= PG_FRAME; srcmpte = PHYS_TO_VM_PAGE(srcptepaddr); - KASSERT(srcmpte->wire_count > 0, + KASSERT(srcmpte->ref_count > 0, ("pmap_copy: source page table page is unused")); if (va_next > end_addr) @@ -6563,7 +6558,7 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_ KASSERT(dstmpte->pindex == pmap_pde_pindex(addr), ("dstmpte pindex/addr mismatch")); - dstmpte->wire_count++; + dstmpte->ref_count++; } else if ((dstmpte = pmap_allocpte(dst_pmap, addr, NULL)) == NULL) goto out; @@ -6596,7 +6591,7 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_ goto out; } /* Have we copied all of the valid mappings? */ - if (dstmpte->wire_count >= srcmpte->wire_count) + if (dstmpte->ref_count >= srcmpte->ref_count) break; } } @@ -7006,9 +7001,9 @@ pmap_remove_pages(pmap_t pmap) KASSERT(mpte->valid == VM_PAGE_BITS_ALL, ("pmap_remove_pages: pte page not promoted")); pmap_resident_count_dec(pmap, 1); - KASSERT(mpte->wire_count == NPTEPG, - ("pmap_remove_pages: pte page wire count error")); - mpte->wire_count = 0; + KASSERT(mpte->ref_count == NPTEPG, + ("pmap_remove_pages: pte page reference count error")); + mpte->ref_count = 0; pmap_add_delayed_free_list(mpte, &free, FALSE); } } else { @@ -8738,7 +8733,7 @@ pmap_emulate_accessed_dirty(pmap_t pmap, vm_offset_t v m = PHYS_TO_VM_PAGE(*pte & PG_FRAME); - if ((mpte == NULL || mpte->wire_count == NPTEPG) && + if ((mpte == NULL || mpte->ref_count == NPTEPG) && pmap_ps_enabled(pmap) && (m->flags & PG_FICTITIOUS) == 0 && vm_reserv_level_iffullpop(m) == 0) { @@ -8929,12 +8924,12 @@ pmap_quick_remove_page(vm_offset_t addr) /* * Pdp pages from the large map are managed differently from either * kernel or user page table pages. They are permanently allocated at - * initialization time, and their wire count is permanently set to + * initialization time, and their reference count is permanently set to * zero. The pml4 entries pointing to those pages are copied into * each allocated pmap. * * In contrast, pd and pt pages are managed like user page table - * pages. They are dynamically allocated, and their wire count + * pages. They are dynamically allocated, and their reference count * represents the number of valid entries within the page. */ static vm_page_t @@ -9021,7 +9016,7 @@ retry: goto retry; mphys = VM_PAGE_TO_PHYS(m); *pde = mphys | X86_PG_A | X86_PG_RW | X86_PG_V | pg_nx; - PHYS_TO_VM_PAGE(DMAP_TO_PHYS((uintptr_t)pde))->wire_count++; + PHYS_TO_VM_PAGE(DMAP_TO_PHYS((uintptr_t)pde))->ref_count++; } else { MPASS((*pde & X86_PG_PS) == 0); mphys = *pde & PG_FRAME; @@ -9141,7 +9136,7 @@ pmap_large_map(vm_paddr_t spa, vm_size_t len, void **a X86_PG_V | X86_PG_A | pg_nx | pmap_cache_bits(kernel_pmap, mattr, TRUE); PHYS_TO_VM_PAGE(DMAP_TO_PHYS((uintptr_t)pde))-> - wire_count++; + ref_count++; inc = NBPDR; } else { pte = pmap_large_map_pte(va); @@ -9150,7 +9145,7 @@ pmap_large_map(vm_paddr_t spa, vm_size_t len, void **a X86_PG_A | pg_nx | pmap_cache_bits(kernel_pmap, mattr, FALSE); PHYS_TO_VM_PAGE(DMAP_TO_PHYS((uintptr_t)pte))-> - wire_count++; + ref_count++; inc = PAGE_SIZE; } } @@ -9219,8 +9214,8 @@ pmap_large_unmap(void *svaa, vm_size_t len) pde_store(pde, 0); inc = NBPDR; m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pde)); - m->wire_count--; - if (m->wire_count == 0) { + m->ref_count--; + if (m->ref_count == 0) { *pdpe = 0; SLIST_INSERT_HEAD(&spgf, m, plinks.s.ss); } @@ -9233,13 +9228,13 @@ pmap_large_unmap(void *svaa, vm_size_t len) pte_clear(pte); inc = PAGE_SIZE; m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pte)); - m->wire_count--; - if (m->wire_count == 0) { + m->ref_count--; + if (m->ref_count == 0) { *pde = 0; SLIST_INSERT_HEAD(&spgf, m, plinks.s.ss); m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pde)); - m->wire_count--; - if (m->wire_count == 0) { + m->ref_count--; + if (m->ref_count == 0) { *pdpe = 0; SLIST_INSERT_HEAD(&spgf, m, plinks.s.ss); } @@ -9446,7 +9441,7 @@ static bool pmap_pti_free_page(vm_page_t m) { - KASSERT(m->wire_count > 0, ("page %p not wired", m)); + KASSERT(m->ref_count > 0, ("page %p not referenced", m)); if (!vm_page_unwire_noq(m)) return (false); vm_page_free_zero(m); @@ -9540,7 +9535,7 @@ pmap_pti_wire_pte(void *pte) VM_OBJECT_ASSERT_WLOCKED(pti_obj); m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((uintptr_t)pte)); - m->wire_count++; + m->ref_count++; } static void @@ -9550,8 +9545,8 @@ pmap_pti_unwire_pde(void *pde, bool only_ref) VM_OBJECT_ASSERT_WLOCKED(pti_obj); m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((uintptr_t)pde)); - MPASS(m->wire_count > 0); - MPASS(only_ref || m->wire_count > 1); + MPASS(m->ref_count > 0); + MPASS(only_ref || m->ref_count > 1); pmap_pti_free_page(m); } @@ -9563,7 +9558,7 @@ pmap_pti_unwire_pte(void *pte, vm_offset_t va) VM_OBJECT_ASSERT_WLOCKED(pti_obj); m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((uintptr_t)pte)); - MPASS(m->wire_count > 0); + MPASS(m->ref_count > 0); if (pmap_pti_free_page(m)) { pde = pmap_pti_pde(va); MPASS((*pde & (X86_PG_PS | X86_PG_V)) == X86_PG_V); @@ -10033,6 +10028,9 @@ sysctl_kmaps_dump(struct sbuf *sb, struct pmap_kernel_ case PAT_UNCACHEABLE: mode = "UC"; break; + case PAT_UNCACHED: + mode = "U-"; + break; case PAT_WRITE_PROTECTED: mode = "WP"; break; @@ -10040,13 +10038,13 @@ sysctl_kmaps_dump(struct sbuf *sb, struct pmap_kernel_ mode = "WC"; break; default: - printf("%s: unknown PAT mode %#x for range %#016lx-%#016lx\n", - __func__, i, range->sva, eva); + printf("%s: unknown PAT mode %#x for range 0x%016lx-0x%016lx\n", + __func__, pat_idx, range->sva, eva); mode = "??"; break; } - sbuf_printf(sb, "%#016lx-%#016lx r%c%c%c%c %s %d %d %d\n", + sbuf_printf(sb, "0x%016lx-0x%016lx r%c%c%c%c %s %d %d %d\n", range->sva, eva, (range->attrs & X86_PG_RW) != 0 ? 'w' : '-', (range->attrs & pg_nx) != 0 ? '-' : 'x', @@ -10281,25 +10279,25 @@ DB_SHOW_COMMAND(pte, pmap_print_pte) PG_V = pmap_valid_bit(pmap); pml4 = pmap_pml4e(pmap, va); - db_printf("VA %#016lx pml4e %#016lx", va, *pml4); + db_printf("VA 0x%016lx pml4e 0x%016lx", va, *pml4); if ((*pml4 & PG_V) == 0) { db_printf("\n"); return; } pdp = pmap_pml4e_to_pdpe(pml4, va); - db_printf(" pdpe %#016lx", *pdp); + db_printf(" pdpe 0x%016lx", *pdp); if ((*pdp & PG_V) == 0 || (*pdp & PG_PS) != 0) { db_printf("\n"); return; } pde = pmap_pdpe_to_pde(pdp, va); - db_printf(" pde %#016lx", *pde); + db_printf(" pde 0x%016lx", *pde); if ((*pde & PG_V) == 0 || (*pde & PG_PS) != 0) { db_printf("\n"); return; } pte = pmap_pde_to_pte(pde, va); - db_printf(" pte %#016lx\n", *pte); + db_printf(" pte 0x%016lx\n", *pte); } DB_SHOW_COMMAND(phys2dmap, pmap_phys2dmap) Modified: projects/nfsv42/sys/amd64/amd64/trap.c ============================================================================== --- projects/nfsv42/sys/amd64/amd64/trap.c Fri Sep 27 20:08:19 2019 (r352816) +++ projects/nfsv42/sys/amd64/amd64/trap.c Fri Sep 27 20:09:43 2019 (r352817) @@ -111,7 +111,7 @@ void __noinline trap(struct trapframe *frame); void trap_check(struct trapframe *frame); void dblfault_handler(struct trapframe *frame); -static int trap_pfault(struct trapframe *, int); +static int trap_pfault(struct trapframe *, bool, int *, int *); static void trap_fatal(struct trapframe *, vm_offset_t); #ifdef KDTRACE_HOOKS static bool trap_user_dtrace(struct trapframe *, @@ -155,10 +155,6 @@ static const char *const trap_msg[] = { [T_DTRACE_RET] = "DTrace pid return trap", }; -static int prot_fault_translation; -SYSCTL_INT(_machdep, OID_AUTO, prot_fault_translation, CTLFLAG_RWTUN, - &prot_fault_translation, 0, - "Select signal to deliver on protection fault"); static int uprintf_signal; SYSCTL_INT(_machdep, OID_AUTO, uprintf_signal, CTLFLAG_RWTUN, &uprintf_signal, 0, @@ -192,14 +188,11 @@ trap(struct trapframe *frame) struct thread *td; struct proc *p; register_t addr, dr6; - int signo, ucode; + int pf, signo, ucode; u_int type; td = curthread; p = td->td_proc; - signo = 0; - ucode = 0; - addr = 0; dr6 = 0; VM_CNT_INC(v_trap); @@ -345,47 +338,18 @@ trap(struct trapframe *frame) case T_PAGEFLT: /* page fault */ /* - * Emulator can take care about this trap? + * Can emulator handle this trap? */ if (*p->p_sysent->sv_trap != NULL && (*p->p_sysent->sv_trap)(td) == 0) return; - addr = frame->tf_addr; - signo = trap_pfault(frame, TRUE); - if (signo == -1) + pf = trap_pfault(frame, true, &signo, &ucode); + if (pf == -1) return; - if (signo == 0) + if (pf == 0) goto userret; - if (signo == SIGSEGV) { - ucode = SEGV_MAPERR; - } else if (prot_fault_translation == 0) { - /* - * Autodetect. This check also covers - * the images without the ABI-tag ELF - * note. - */ - if (SV_CURPROC_ABI() == SV_ABI_FREEBSD && - p->p_osrel >= P_OSREL_SIGSEGV) { - signo = SIGSEGV; - ucode = SEGV_ACCERR; - } else { - signo = SIGBUS; - ucode = T_PAGEFLT; - } - } else if (prot_fault_translation == 1) { - /* - * Always compat mode. - */ - signo = SIGBUS; - ucode = T_PAGEFLT; - } else { - /* - * Always SIGSEGV mode. - */ - signo = SIGSEGV; - ucode = SEGV_ACCERR; - } + addr = frame->tf_addr; break; case T_DIVIDE: /* integer divide fault */ @@ -440,7 +404,7 @@ trap(struct trapframe *frame) ("kernel trap doesn't have ucred")); switch (type) { case T_PAGEFLT: /* page fault */ - (void) trap_pfault(frame, FALSE); + (void)trap_pfault(frame, false, NULL, NULL); return; case T_DNA: @@ -712,17 +676,29 @@ trap_is_pti(struct trapframe *frame) (PCPU_GET(curpmap)->pm_cr3 & ~CR3_PCID_MASK)); } +/* + * Handle all details of a page fault. + * Returns: + * -1 if this fault was fatal, typically from kernel mode + * (cannot happen, but we need to return something). + * 0 if this fault was handled by updating either the user or kernel + * page table, execution can continue. + * 1 if this fault was from usermode and it was not handled, a synchronous + * signal should be delivered to the thread. *signo returns the signal + * number, *ucode gives si_code. + */ static int -trap_pfault(struct trapframe *frame, int usermode) +trap_pfault(struct trapframe *frame, bool usermode, int *signo, int *ucode) { struct thread *td; struct proc *p; vm_map_t map; - vm_offset_t va; + vm_offset_t eva; int rv; vm_prot_t ftype; - vm_offset_t eva; + MPASS(!usermode || (signo != NULL && ucode != NULL)); + td = curthread; p = td->td_proc; eva = frame->tf_addr; @@ -771,13 +747,15 @@ trap_pfault(struct trapframe *frame, int usermode) return (-1); } } - va = trunc_page(eva); - if (va >= VM_MIN_KERNEL_ADDRESS) { + if (eva >= VM_MIN_KERNEL_ADDRESS) { /* * Don't allow user-mode faults in kernel address space. */ - if (usermode) - return (SIGSEGV); + if (usermode) { + *signo = SIGSEGV; + *ucode = SEGV_MAPERR; + return (1); + } map = kernel_map; } else { @@ -819,7 +797,11 @@ trap_pfault(struct trapframe *frame, int usermode) trap_fatal(frame, eva); return (-1); } - rv = KERN_PROTECTION_FAILURE; + if (usermode) { + *signo = SIGSEGV; + *ucode = SEGV_PKUERR; + return (1); + } goto after_vmfault; } @@ -843,7 +825,7 @@ trap_pfault(struct trapframe *frame, int usermode) ftype = VM_PROT_READ; /* Fault in the page. */ - rv = vm_fault(map, va, ftype, VM_FAULT_NORMAL); + rv = vm_fault_trap(map, eva, ftype, VM_FAULT_NORMAL, signo, ucode); if (rv == KERN_SUCCESS) { #ifdef HWPMC_HOOKS if (ftype == VM_PROT_READ || ftype == VM_PROT_WRITE) { @@ -858,17 +840,17 @@ trap_pfault(struct trapframe *frame, int usermode) #endif return (0); } + + if (usermode) + return (1); after_vmfault: - if (!usermode) { - if (td->td_intr_nesting_level == 0 && - curpcb->pcb_onfault != NULL) { - frame->tf_rip = (long)curpcb->pcb_onfault; - return (0); - } - trap_fatal(frame, eva); - return (-1); + if (td->td_intr_nesting_level == 0 && + curpcb->pcb_onfault != NULL) { + frame->tf_rip = (long)curpcb->pcb_onfault; + return (0); } - return ((rv == KERN_PROTECTION_FAILURE) ? SIGBUS : SIGSEGV); + trap_fatal(frame, eva); + return (-1); } static void Modified: projects/nfsv42/sys/amd64/linux/linux_dummy.c ============================================================================== --- projects/nfsv42/sys/amd64/linux/linux_dummy.c Fri Sep 27 20:08:19 2019 (r352816) +++ projects/nfsv42/sys/amd64/linux/linux_dummy.c Fri Sep 27 20:09:43 2019 (r352817) @@ -99,11 +99,13 @@ DUMMY(migrate_pages); DUMMY(unshare); /* Linux 2.6.17: */ DUMMY(splice); -DUMMY(tee); DUMMY(sync_file_range); +DUMMY(tee); DUMMY(vmsplice); /* Linux 2.6.18: */ DUMMY(move_pages); +/* Linux 2.6.19: */ +DUMMY(getcpu); /* Linux 2.6.22: */ DUMMY(signalfd); /* Linux 2.6.27: */ @@ -111,7 +113,7 @@ DUMMY(signalfd4); DUMMY(inotify_init1); /* Linux 2.6.31: */ DUMMY(perf_event_open); -/* Linux 2.6.38: */ +/* Linux 2.6.36: */ DUMMY(fanotify_init); DUMMY(fanotify_mark); /* Linux 2.6.39: */ @@ -120,7 +122,6 @@ DUMMY(open_by_handle_at); DUMMY(clock_adjtime); /* Linux 3.0: */ DUMMY(setns); -DUMMY(getcpu); /* Linux 3.2: */ DUMMY(process_vm_readv); DUMMY(process_vm_writev); @@ -130,12 +131,11 @@ DUMMY(kcmp); DUMMY(finit_module); DUMMY(sched_setattr); DUMMY(sched_getattr); -/* Linux 3.14: */ -DUMMY(renameat2); /* Linux 3.15: */ -DUMMY(seccomp); -DUMMY(memfd_create); DUMMY(kexec_file_load); +/* Linux 3.17: */ +DUMMY(memfd_create); +DUMMY(seccomp); /* Linux 3.18: */ DUMMY(bpf); /* Linux 3.19: */ Modified: projects/nfsv42/sys/amd64/linux/linux_proto.h ============================================================================== --- projects/nfsv42/sys/amd64/linux/linux_proto.h Fri Sep 27 20:08:19 2019 (r352816) +++ projects/nfsv42/sys/amd64/linux/linux_proto.h Fri Sep 27 20:09:43 2019 (r352817) @@ -1125,9 +1125,9 @@ struct linux_sched_getattr_args { char flags_l_[PADL_(l_uint)]; l_uint flags; char flags_r_[PADR_(l_uint)]; }; struct linux_renameat2_args { - char oldfd_l_[PADL_(l_int)]; l_int oldfd; char oldfd_r_[PADR_(l_int)]; + char olddfd_l_[PADL_(l_int)]; l_int olddfd; char olddfd_r_[PADR_(l_int)]; char oldname_l_[PADL_(const char *)]; const char * oldname; char oldname_r_[PADR_(const char *)]; - char newfd_l_[PADL_(l_int)]; l_int newfd; char newfd_r_[PADR_(l_int)]; + char newdfd_l_[PADL_(l_int)]; l_int newdfd; char newdfd_r_[PADR_(l_int)]; char newname_l_[PADL_(const char *)]; const char * newname; char newname_r_[PADR_(const char *)]; char flags_l_[PADL_(unsigned int)]; unsigned int flags; char flags_r_[PADR_(unsigned int)]; }; @@ -1555,6 +1555,13 @@ int linux_io_uring_register(struct thread *, struct li #define nosys linux_nosys #endif /* COMPAT_FREEBSD11 */ + + +#ifdef COMPAT_FREEBSD12 + +#define nosys linux_nosys + +#endif /* COMPAT_FREEBSD12 */ #define LINUX_SYS_AUE_linux_open AUE_OPEN_RWTC #define LINUX_SYS_AUE_linux_newstat AUE_STAT Modified: projects/nfsv42/sys/amd64/linux/linux_systrace_args.c ============================================================================== --- projects/nfsv42/sys/amd64/linux/linux_systrace_args.c Fri Sep 27 20:08:19 2019 (r352816) +++ projects/nfsv42/sys/amd64/linux/linux_systrace_args.c Fri Sep 27 20:09:43 2019 (r352817) @@ -2297,9 +2297,9 @@ systrace_args(int sysnum, void *params, uint64_t *uarg /* linux_renameat2 */ case 316: { struct linux_renameat2_args *p = params; - iarg[0] = p->oldfd; /* l_int */ + iarg[0] = p->olddfd; /* l_int */ uarg[1] = (intptr_t) p->oldname; /* const char * */ - iarg[2] = p->newfd; /* l_int */ + iarg[2] = p->newdfd; /* l_int */ uarg[3] = (intptr_t) p->newname; /* const char * */ uarg[4] = p->flags; /* unsigned int */ *n_args = 5; Modified: projects/nfsv42/sys/amd64/linux/syscalls.master ============================================================================== --- projects/nfsv42/sys/amd64/linux/syscalls.master Fri Sep 27 20:08:19 2019 (r352816) +++ projects/nfsv42/sys/amd64/linux/syscalls.master Fri Sep 27 20:09:43 2019 (r352817) @@ -550,8 +550,8 @@ 315 AUE_NULL STD { int linux_sched_getattr(l_pid_t pid, \ void *attr, l_uint size, l_uint flags); } ; Linux 3.15: -316 AUE_NULL STD { int linux_renameat2(l_int oldfd, \ - const char *oldname, l_int newfd, \ +316 AUE_NULL STD { int linux_renameat2(l_int olddfd, \ + const char *oldname, l_int newdfd, \ const char *newname, unsigned int flags); } ; Linux 3.17: 317 AUE_NULL STD { int linux_seccomp(l_uint op, l_uint flags, \ Modified: projects/nfsv42/sys/amd64/linux32/linux32_dummy.c ============================================================================== --- projects/nfsv42/sys/amd64/linux32/linux32_dummy.c Fri Sep 27 20:08:19 2019 (r352816) +++ projects/nfsv42/sys/amd64/linux32/linux32_dummy.c Fri Sep 27 20:09:43 2019 (r352817) @@ -119,7 +119,7 @@ DUMMY(signalfd4); DUMMY(inotify_init1); /* Linux 2.6.31: */ DUMMY(perf_event_open); -/* Linux 2.6.33: */ +/* Linux 2.6.36: */ DUMMY(fanotify_init); DUMMY(fanotify_mark); /* Linux 2.6.39: */ @@ -137,11 +137,9 @@ DUMMY(kcmp); DUMMY(finit_module); DUMMY(sched_setattr); DUMMY(sched_getattr); -/* Linux 3.14: */ -DUMMY(renameat2); -/* Linux 3.15: */ -DUMMY(seccomp); +/* Linux 3.17: */ DUMMY(memfd_create); +DUMMY(seccomp); /* Linux 3.18: */ DUMMY(bpf); /* Linux 3.19: */ Modified: projects/nfsv42/sys/amd64/linux32/linux32_proto.h ============================================================================== --- projects/nfsv42/sys/amd64/linux32/linux32_proto.h Fri Sep 27 20:08:19 2019 (r352816) +++ projects/nfsv42/sys/amd64/linux32/linux32_proto.h Fri Sep 27 20:09:43 2019 (r352817) @@ -1199,9 +1199,9 @@ struct linux_sched_getattr_args { char flags_l_[PADL_(l_uint)]; l_uint flags; char flags_r_[PADR_(l_uint)]; }; struct linux_renameat2_args { - char oldfd_l_[PADL_(l_int)]; l_int oldfd; char oldfd_r_[PADR_(l_int)]; + char olddfd_l_[PADL_(l_int)]; l_int olddfd; char olddfd_r_[PADR_(l_int)]; char oldname_l_[PADL_(const char *)]; const char * oldname; char oldname_r_[PADR_(const char *)]; - char newfd_l_[PADL_(l_int)]; l_int newfd; char newfd_r_[PADR_(l_int)]; + char newdfd_l_[PADL_(l_int)]; l_int newdfd; char newdfd_r_[PADR_(l_int)]; char newname_l_[PADL_(const char *)]; const char * newname; char newname_r_[PADR_(const char *)]; char flags_l_[PADL_(unsigned int)]; unsigned int flags; char flags_r_[PADR_(unsigned int)]; }; @@ -1895,6 +1895,13 @@ int linux_io_uring_register(struct thread *, struct li #define nosys linux_nosys #endif /* COMPAT_FREEBSD11 */ + + +#ifdef COMPAT_FREEBSD12 + +#define nosys linux_nosys + +#endif /* COMPAT_FREEBSD12 */ #define LINUX32_SYS_AUE_linux_exit AUE_EXIT #define LINUX32_SYS_AUE_linux_fork AUE_FORK Modified: projects/nfsv42/sys/amd64/linux32/linux32_systrace_args.c ============================================================================== --- projects/nfsv42/sys/amd64/linux32/linux32_systrace_args.c Fri Sep 27 20:08:19 2019 (r352816) +++ projects/nfsv42/sys/amd64/linux32/linux32_systrace_args.c Fri Sep 27 20:09:43 2019 (r352817) @@ -2424,9 +2424,9 @@ systrace_args(int sysnum, void *params, uint64_t *uarg /* linux_renameat2 */ case 353: { struct linux_renameat2_args *p = params; - iarg[0] = p->oldfd; /* l_int */ + iarg[0] = p->olddfd; /* l_int */ uarg[1] = (intptr_t) p->oldname; /* const char * */ - iarg[2] = p->newfd; /* l_int */ + iarg[2] = p->newdfd; /* l_int */ uarg[3] = (intptr_t) p->newname; /* const char * */ uarg[4] = p->flags; /* unsigned int */ *n_args = 5; Modified: projects/nfsv42/sys/amd64/linux32/syscalls.master ============================================================================== --- projects/nfsv42/sys/amd64/linux32/syscalls.master Fri Sep 27 20:08:19 2019 (r352816) +++ projects/nfsv42/sys/amd64/linux32/syscalls.master Fri Sep 27 20:09:43 2019 (r352817) @@ -610,8 +610,8 @@ 352 AUE_NULL STD { int linux_sched_getattr(l_pid_t pid, \ void *attr, l_uint size, l_uint flags); } ; Linux 3.15: -353 AUE_NULL STD { int linux_renameat2(l_int oldfd, \ - const char *oldname, l_int newfd, \ +353 AUE_NULL STD { int linux_renameat2(l_int olddfd, \ + const char *oldname, l_int newdfd, \ const char *newname, unsigned int flags); } ; Linux 3.17: 354 AUE_NULL STD { int linux_seccomp(l_uint op, l_uint flags, \ Modified: projects/nfsv42/sys/amd64/sgx/sgx.c ============================================================================== --- projects/nfsv42/sys/amd64/sgx/sgx.c Fri Sep 27 20:08:19 2019 (r352816) +++ projects/nfsv42/sys/amd64/sgx/sgx.c Fri Sep 27 20:09:43 2019 (r352817) @@ -357,9 +357,7 @@ sgx_page_remove(struct sgx_softc *sc, vm_page_t p) vm_paddr_t pa; uint64_t offs; - vm_page_lock(p); (void)vm_page_remove(p); - vm_page_unlock(p); dprintf("%s: p->pidx %ld\n", __func__, p->pindex); Modified: projects/nfsv42/sys/amd64/vmm/vmm.c ============================================================================== --- projects/nfsv42/sys/amd64/vmm/vmm.c Fri Sep 27 20:08:19 2019 (r352816) +++ projects/nfsv42/sys/amd64/vmm/vmm.c Fri Sep 27 20:09:43 2019 (r352817) @@ -1002,9 +1002,7 @@ vm_gpa_release(void *cookie) { vm_page_t m = cookie; - vm_page_lock(m); vm_page_unwire(m, PQ_ACTIVE); - vm_page_unlock(m); } int @@ -1413,7 +1411,7 @@ vm_handle_paging(struct vm *vm, int vcpuid, bool *retu } map = &vm->vmspace->vm_map; - rv = vm_fault(map, vme->u.paging.gpa, ftype, VM_FAULT_NORMAL); + rv = vm_fault(map, vme->u.paging.gpa, ftype, VM_FAULT_NORMAL, NULL); VCPU_CTR3(vm, vcpuid, "vm_handle_paging rv = %d, gpa = %#lx, " "ftype = %d", rv, vme->u.paging.gpa, ftype); Modified: projects/nfsv42/sys/arm/arm/pmap-v4.c ============================================================================== --- projects/nfsv42/sys/arm/arm/pmap-v4.c Fri Sep 27 20:08:19 2019 (r352816) +++ projects/nfsv42/sys/arm/arm/pmap-v4.c Fri Sep 27 20:09:43 2019 (r352817) @@ -3415,14 +3415,14 @@ pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_ struct l2_dtable *l2; pd_entry_t l1pd; pt_entry_t *ptep, pte; - vm_paddr_t pa, paddr; - vm_page_t m = NULL; + vm_paddr_t pa; + vm_page_t m; u_int l1idx; + l1idx = L1_IDX(va); - paddr = 0; + m = NULL; *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201909272009.x8RK9iTq077065>