(gdb) step genfs_getpages (v=0xffff87802a293008) at /usr/src/sys/miscfs/genfs/genfs_io.c:120 120 } */ * const ap = v; (gdb) 124 const int flags = ap->a_flags; (gdb) n 125 struct vnode * const vp = ap->a_vp; (gdb) 126 struct uvm_object * const uobj = &vp->v_uobj; (gdb) 127 const bool async = (flags & PGO_SYNCIO) == 0; (gdb) 128 const bool memwrite = (ap->a_access_type & VM_PROT_WRITE) != 0; (gdb) 129 const bool overwrite = (flags & PGO_OVERWRITE) != 0; (gdb) 130 const bool blockalloc = memwrite && (flags & PGO_NOBLOCKALLOC) == 0; (gdb) 131 const bool need_wapbl = (vp->v_mount->mnt_wapbl && (gdb) 133 const bool glocked = (flags & PGO_GLOCKHELD) != 0; (gdb) 134 bool holds_wapbl = false; (gdb) 135 struct mount *trans_mount = NULL; (gdb) 141 KASSERT(vp->v_type == VREG || vp->v_type == VDIR || (gdb) 145 if ((flags & PGO_JOURNALLOCKED) && vp->v_mount->mnt_wapbl) (gdb) 149 error = vdead_check(vp, VDEAD_NOWAIT); (gdb) 150 if (error) { (gdb) p error $21 = 0 (gdb) n 157 error = 0; (gdb) 158 const voff_t origvsize = vp->v_size; (gdb) 159 const off_t origoffset = ap->a_offset; (gdb) 160 const int orignpages = *ap->a_count; (gdb) 162 GOP_SIZE(vp, origvsize, &diskeof, 0); (gdb) 163 if (flags & PGO_PASTEOF) { (gdb) 180 GOP_SIZE(vp, origvsize, &memeof, GOP_SIZE_MEM); (gdb) 182 KASSERT(ap->a_centeridx >= 0 || ap->a_centeridx <= orignpages); (gdb) 183 KASSERT((origoffset & (PAGE_SIZE - 1)) == 0 && origoffset >= 0); (gdb) 184 KASSERT(orignpages > 0); (gdb) 190 if (origoffset + (ap->a_centeridx << PAGE_SHIFT) >= memeof) { (gdb) 191 if ((flags & PGO_LOCKED) == 0) { (gdb) 192 mutex_exit(uobj->vmobjlock); (gdb) 196 error = EINVAL; (gdb) 197 goto out_err; (gdb) p error $22 = 22 (gdb) bt #0 genfs_getpages (v=0xffff87802a293008) at /usr/src/sys/miscfs/genfs/genfs_io.c:197 #1 0xffffffff80e09576 in VOP_GETPAGES (vp=0xffff856d20801d20, offset=0, m=0xffff87802a2930f0, count=0xffff87802a2930e8, centeridx=0, access_type=1, advice=0, flags=2) at /usr/src/sys/kern/vnode_if.c:1594 #2 0xffffffff80cdc9fe in uvn_get (uobj=0xffff856d20801d20, offset=0, pps=0xffff87802a2930f0, npagesp=0xffff87802a2930e8, centeridx=0, access_type=1, advice=0, flags=2) at /usr/src/sys/uvm/uvm_vnode.c:187 #3 0xffffffff80cbc8a6 in uvm_fault_lower_io (ufi=0xffff87802a293208, flt=0xffff87802a2931d8, ruobj=0xffff87802a293148, ruobjpage=0xffff87802a293150) at /usr/src/sys/uvm/uvm_fault.c:1909 #4 0xffffffff80cbbf32 in uvm_fault_lower (ufi=0xffff87802a293208, flt=0xffff87802a2931d8, pages=0xffff87802a2932c0) at /usr/src/sys/uvm/uvm_fault.c:1717 #5 0xffffffff80cba8de in uvm_fault_internal (orig_map=0xffff856d0adec8a0, vaddr=140187597225984, access_type=1, fault_flag=0) at /usr/src/sys/uvm/uvm_fault.c:905 #6 0xffffffff8022783a in trap (frame=0xffff87802a293420) at /usr/src/sys/arch/amd64/amd64/trap.c:552 #7 0xffffffff8021d568 in alltraps () #8 0xffffffff8021ce0f in copyin () #9 0xffffffff80d6054b in copyin_vmspace (vm=0xffff856d0adec8a0, uaddr=0x7f7ff7ef4c00, kaddr=0xffff87802a293630, len=1024) ---Type to continue, or q to quit--- at /usr/src/sys/kern/subr_copy.c:215 #10 0xffffffff80d606f5 in copyin_proc (p=0xffff856d2648c018, uaddr=0x7f7ff7ef4c00, kaddr=0xffff87802a293630, len=1024) at /usr/src/sys/kern/subr_copy.c:277 #11 0xffffffff80ce099b in coredump_getseghdrs_elf64 (us=0xffff87802a293a98) at /usr/src/sys/kern/core_elf32.c:316 #12 0xffffffff80cb8d27 in uvm_coredump_walkmap (p=0xffff856d2648c018, func=0xffffffff80ce0892 , cookie=0xffff87802a293b30) at /usr/src/sys/uvm/uvm_coredump.c:190 #13 0xffffffff80ce04eb in coredump_elf64 (l=0xffff856d22f19a80, cookie=0xffff87802a293c58) at /usr/src/sys/kern/core_elf32.c:221 #14 0xffffffff80cf51aa in coredump (l=0xffff856d22f19a80, pattern=0xffffffff81c5d280 "%n.core") at /usr/src/sys/kern/kern_core.c:256 #15 0xffffffff80d39f2c in sigexit (l=0xffff856d22f19a80, signo=10) at /usr/src/sys/kern/kern_sig.c:2090 #16 0xffffffff80d39750 in postsig (signo=10) at /usr/src/sys/kern/kern_sig.c:1914 #17 0xffffffff80d13e71 in lwp_userret (l=0xffff856d22f19a80) at /usr/src/sys/kern/kern_lwp.c:1561 #18 0xffffffff80226c3a in mi_userret (l=0xffff856d22f19a80) at /usr/src/sys/sys/userret.h:94 #19 0xffffffff80226cb7 in userret (l=0xffff856d22f19a80) at ./machine/userret.h:81 #20 0xffffffff80227c77 in trap (frame=0xffff87802a294000) at /usr/src/sys/arch/amd64/amd64/trap.c:697 #21 0xffffffff8021d568 in alltraps () Index: sys/kern/core_elf32.c =================================================================== RCS file: /cvsroot/src/sys/kern/core_elf32.c,v retrieving revision 1.57 diff -u -r1.57 core_elf32.c --- sys/kern/core_elf32.c 3 Sep 2018 16:29:35 -0000 1.57 +++ sys/kern/core_elf32.c 17 Jan 2019 20:08:20 -0000 @@ -313,8 +313,18 @@ int i; end -= slen; - if ((error = copyin_proc(ws->p, (void *)end, buf, slen)) != 0) - return error; + if ((error = copyin_proc(ws->p, (void *)end, buf, slen)) != 0) { + /* + * We receive EINVAL if there are unassigned + * pages for a virtual address, which causes + * the SIGBUS signal. The error is propagated + * from genfs_getpages(). + */ + if (error == EINVAL) + memset(buf, 0, slen); + else + return error; + } ep = (const long *) &buf[slen / sizeof(buf[0])]; for (i = 0, ep--; buf <= ep; ep--, i++) {