From nobody Mon Jan 17 21:13:10 2022 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 230D51976F9C; Mon, 17 Jan 2022 21:13:13 +0000 (UTC) (envelope-from git@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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Jd4Pg3TSxz3FZC; Mon, 17 Jan 2022 21:13:11 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1642453991; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=nLgSx3X45Qy9/pe4HWaW5uKNZ8vxmJRsygGzYw4L0P0=; b=tDgtL+h7ApCQC4zI0V5xlOlufe2vopNLUra3TmcKvLsdErOmb6g/LeHnBmqZC5Dg6uf4zb HCQpNcvo587eF5Zmw8yHGhfRTu/IUzsdEdOmksMcTjwGDvDidlztO2zEI3ZPyPJQbuucuW fZLNU3PWZxReP/VSpskhE+bI8au5yuO88A8Ux2LSdbym+UyfX60kPD1IG15E+Vc2vP3F4t y9U0xBlcZsRF2WaNl0pR3YFCJzfiVwljU81uH55U7FISzbOq9DxuL62GOgg16CeIC3HzAg AMsFsO8+YALnl3A9BMkHnwpSm9G9zr+Ej6/RDoJm/3iqxcC+BLY2TsWJtDU/bw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (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 did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id D851214DED; Mon, 17 Jan 2022 21:13:10 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 20HLDAED007007; Mon, 17 Jan 2022 21:13:10 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 20HLDAGF007006; Mon, 17 Jan 2022 21:13:10 GMT (envelope-from git) Date: Mon, 17 Jan 2022 21:13:10 GMT Message-Id: <202201172113.20HLDAGF007006@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Mark Johnston Subject: git: 3ce04aca49e9 - main - proc: Add a sysctl to fetch virtual address space layout info List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: markj X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 3ce04aca49e9228c3c6ab24ffbee709f5b464765 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1642453991; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=nLgSx3X45Qy9/pe4HWaW5uKNZ8vxmJRsygGzYw4L0P0=; b=qrihYKVdxwGU/T7eCuB0yV2obxGa6WI4VawwwN/FEV33+/r1PxcExWIcquk3VwGklrUao/ F23rmAOVyPfz8IFzkjFyatYOTaWZjikxxi6+s96Cc128zPSp3b5qmkLrredg/XISI/su8/ UzOEnhJ/hs3fQ2W/KBvysdBwqoAHG8nc/14tHLpy2mWQQLfQUX/f618n4nvBYuJqwo4lAS xPmM38ha6WLBqkGaN0sTcSwrxeH/d/pQMSY65Ee5o54FNuODEh5zFpOaqBMMrqJttm4sDL UkgROjvQ/+v+hDN+3F7Yj6k9qNa5kioSTaxy7NDct6hxRYaBOSfFEuanr+mJBQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1642453991; a=rsa-sha256; cv=none; b=BYpxHjTuxtZfXlp7SRSrOX1jR8+0Cd8IiCBY3sC3fgIyotiynU6RmBHr7hvahHX09oIxT/ MF1kBCgCr5/uc490YXeKAGuQS1uW3shNbW6FtKTzXCCsaNWRFM1C3KjlgRsSu268F1zjxS fGJbauSXwTzzYvyiEvhFQXk7zzVEprGnqHYwG9XPmEQ/cjMDperNltRQVmWpfk47hAFJT3 Kv6ZYhwXBd9Tpi0k1VU+rXpIIfaUc57xWZp9pr1FJnDJG+fw/RCdXJn9PAjQvoH9GlSdxW +ylDLkzF3vE7gHNPH//Ln4CuZX+m3ROtefdRSgUxoynfUqKLEKqC/Hdb+PJ05Q== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=3ce04aca49e9228c3c6ab24ffbee709f5b464765 commit 3ce04aca49e9228c3c6ab24ffbee709f5b464765 Author: Mark Johnston AuthorDate: 2022-01-17 16:43:03 +0000 Commit: Mark Johnston CommitDate: 2022-01-17 21:12:43 +0000 proc: Add a sysctl to fetch virtual address space layout info This provides information about fixed regions of the target process' user memory map. Reviewed by: kib MFC after: 1 month Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D33708 --- sys/compat/freebsd32/freebsd32.h | 13 +++++++ sys/kern/kern_proc.c | 78 ++++++++++++++++++++++++++++++++++++++++ sys/sys/sysctl.h | 1 + sys/sys/user.h | 19 ++++++++++ 4 files changed, 111 insertions(+) diff --git a/sys/compat/freebsd32/freebsd32.h b/sys/compat/freebsd32/freebsd32.h index 1f6270d684ee..96bf79d28c02 100644 --- a/sys/compat/freebsd32/freebsd32.h +++ b/sys/compat/freebsd32/freebsd32.h @@ -432,6 +432,19 @@ struct kinfo_sigtramp32 { uint32_t ksigtramp_spare[4]; }; +struct kinfo_vm_layout32 { + uint32_t kvm_min_user_addr; + uint32_t kvm_max_user_addr; + uint32_t kvm_text_addr; + uint32_t kvm_text_size; + uint32_t kvm_data_addr; + uint32_t kvm_data_size; + uint32_t kvm_stack_addr; + uint32_t kvm_stack_size; + int kvm_map_flags; + uint32_t kvm_spare[14]; +}; + struct kld_file_stat_1_32 { int version; /* set to sizeof(struct kld_file_stat_1) */ char name[MAXPATHLEN]; diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c index 1ef8d86295b3..b5896cedf3b9 100644 --- a/sys/kern/kern_proc.c +++ b/sys/kern/kern_proc.c @@ -3200,6 +3200,80 @@ errlocked: return (error); } +static int +sysctl_kern_proc_vm_layout(SYSCTL_HANDLER_ARGS) +{ + struct kinfo_vm_layout kvm; + struct proc *p; + struct vmspace *vmspace; + int error, *name; + + name = (int *)arg1; + if ((u_int)arg2 != 1) + return (EINVAL); + + error = pget((pid_t)name[0], PGET_CANDEBUG, &p); + if (error != 0) + return (error); +#ifdef COMPAT_FREEBSD32 + if (SV_CURPROC_FLAG(SV_ILP32)) { + if (!SV_PROC_FLAG(p, SV_ILP32)) { + PROC_UNLOCK(p); + return (EINVAL); + } + } +#endif + vmspace = vmspace_acquire_ref(p); + PROC_UNLOCK(p); + + memset(&kvm, 0, sizeof(kvm)); + kvm.kvm_min_user_addr = vm_map_min(&vmspace->vm_map); + kvm.kvm_max_user_addr = vm_map_max(&vmspace->vm_map); + kvm.kvm_text_addr = (uintptr_t)vmspace->vm_taddr; + kvm.kvm_text_size = vmspace->vm_tsize; + kvm.kvm_data_addr = (uintptr_t)vmspace->vm_daddr; + kvm.kvm_data_size = vmspace->vm_dsize; + kvm.kvm_stack_addr = (uintptr_t)vmspace->vm_maxsaddr; + kvm.kvm_stack_size = vmspace->vm_ssize; + if ((vmspace->vm_map.flags & MAP_WIREFUTURE) != 0) + kvm.kvm_map_flags |= KMAP_FLAG_WIREFUTURE; + if ((vmspace->vm_map.flags & MAP_ASLR) != 0) + kvm.kvm_map_flags |= KMAP_FLAG_ASLR; + if ((vmspace->vm_map.flags & MAP_ASLR_IGNSTART) != 0) + kvm.kvm_map_flags |= KMAP_FLAG_ASLR_IGNSTART; + if ((vmspace->vm_map.flags & MAP_WXORX) != 0) + kvm.kvm_map_flags |= KMAP_FLAG_WXORX; + if ((vmspace->vm_map.flags & MAP_ASLR_STACK) != 0) + kvm.kvm_map_flags |= KMAP_FLAG_ASLR_STACK; + +#ifdef COMPAT_FREEBSD32 + if (SV_CURPROC_FLAG(SV_ILP32)) { + struct kinfo_vm_layout32 kvm32; + + memset(&kvm32, 0, sizeof(kvm32)); + kvm32.kvm_min_user_addr = (uint32_t)kvm.kvm_min_user_addr; + kvm32.kvm_max_user_addr = (uint32_t)kvm.kvm_max_user_addr; + kvm32.kvm_text_addr = (uint32_t)kvm.kvm_text_addr; + kvm32.kvm_text_size = (uint32_t)kvm.kvm_text_size; + kvm32.kvm_data_addr = (uint32_t)kvm.kvm_data_addr; + kvm32.kvm_data_size = (uint32_t)kvm.kvm_data_size; + kvm32.kvm_stack_addr = (uint32_t)kvm.kvm_stack_addr; + kvm32.kvm_stack_size = (uint32_t)kvm.kvm_stack_size; + kvm32.kvm_map_flags = kvm.kvm_map_flags; + vmspace_free(vmspace); + error = SYSCTL_OUT(req, &kvm32, sizeof(kvm32)); + goto out; + } +#endif + + error = SYSCTL_OUT(req, &kvm, sizeof(kvm)); +#ifdef COMPAT_FREEBSD32 +out: +#endif + vmspace_free(vmspace); + return (error); +} + SYSCTL_NODE(_kern, KERN_PROC, proc, CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "Process table"); @@ -3318,6 +3392,10 @@ static SYSCTL_NODE(_kern_proc, KERN_PROC_SIGFASTBLK, sigfastblk, CTLFLAG_RD | CTLFLAG_ANYBODY | CTLFLAG_MPSAFE, sysctl_kern_proc_sigfastblk, "Thread sigfastblock address"); +static SYSCTL_NODE(_kern_proc, KERN_PROC_VM_LAYOUT, vm_layout, CTLFLAG_RD | + CTLFLAG_ANYBODY | CTLFLAG_MPSAFE, sysctl_kern_proc_vm_layout, + "Process virtual address space layout info"); + int allproc_gen; /* diff --git a/sys/sys/sysctl.h b/sys/sys/sysctl.h index 71a34652ff44..f25152db8215 100644 --- a/sys/sys/sysctl.h +++ b/sys/sys/sysctl.h @@ -1013,6 +1013,7 @@ TAILQ_HEAD(sysctl_ctx_list, sysctl_ctx_entry); #define KERN_PROC_CWD 42 /* process current working directory */ #define KERN_PROC_NFDS 43 /* number of open file descriptors */ #define KERN_PROC_SIGFASTBLK 44 /* address of fastsigblk magic word */ +#define KERN_PROC_VM_LAYOUT 45 /* virtual address space layout info */ /* * KERN_IPC identifiers diff --git a/sys/sys/user.h b/sys/sys/user.h index e8bfba981e83..f57a69aed13e 100644 --- a/sys/sys/user.h +++ b/sys/sys/user.h @@ -598,6 +598,25 @@ struct kinfo_sigtramp { void *ksigtramp_spare[4]; }; +#define KMAP_FLAG_WIREFUTURE 0x01 /* all future mappings wil be wired */ +#define KMAP_FLAG_ASLR 0x02 /* ASLR is applied to mappings */ +#define KMAP_FLAG_ASLR_IGNSTART 0x04 /* ASLR may map into sbrk grow region */ +#define KMAP_FLAG_WXORX 0x08 /* W^X mapping policy is enforced */ +#define KMAP_FLAG_ASLR_STACK 0x10 /* the stack location is randomized */ + +struct kinfo_vm_layout { + uintptr_t kvm_min_user_addr; + uintptr_t kvm_max_user_addr; + uintptr_t kvm_text_addr; + size_t kvm_text_size; + uintptr_t kvm_data_addr; + size_t kvm_data_size; + uintptr_t kvm_stack_addr; + size_t kvm_stack_size; + int kvm_map_flags; + uintptr_t kvm_spare[14]; +}; + #ifdef _KERNEL /* Flags for kern_proc_out function. */ #define KERN_PROC_NOTHREADS 0x1