Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F144428897
D33708.id100788.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D33708.id100788.diff
View Options
Index: sys/compat/freebsd32/freebsd32.h
===================================================================
--- sys/compat/freebsd32/freebsd32.h
+++ sys/compat/freebsd32/freebsd32.h
@@ -432,6 +432,12 @@
uint32_t ksigtramp_spare[4];
};
+struct kinfo_vm_layout32 {
+ uint32_t kvm_min_user_address;
+ uint32_t kvm_max_user_address;
+ uint32_t kvm_spare[14];
+};
+
struct kld_file_stat_1_32 {
int version; /* set to sizeof(struct kld_file_stat_1) */
char name[MAXPATHLEN];
Index: sys/kern/kern_proc.c
===================================================================
--- sys/kern/kern_proc.c
+++ sys/kern/kern_proc.c
@@ -3200,6 +3200,52 @@
return (error);
}
+static int
+sysctl_kern_proc_vm_layout(SYSCTL_HANDLER_ARGS)
+{
+ struct kinfo_vm_layout kvm;
+ struct sysentvec *sv;
+ struct proc *p;
+ int error, *name;
+ u_int namelen;
+
+ name = (int *)arg1;
+ namelen = arg2;
+ if (namelen != 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
+ sv = p->p_sysent;
+ PROC_UNLOCK(p);
+
+ memset(&kvm, 0, sizeof(kvm));
+ kvm.kvm_min_user_address = sv->sv_minuser;
+ kvm.kvm_max_user_address = sv->sv_maxuser;
+
+#ifdef COMPAT_FREEBSD32
+ if (SV_CURPROC_FLAG(SV_ILP32)) {
+ struct kinfo_vm_layout32 kvm32;
+
+ memset(&kvm32, 0, sizeof(kvm32));
+ kvm32.kvm_min_user_address = (uint32_t)kvm.kvm_min_user_address;
+ kvm32.kvm_max_user_address = (uint32_t)kvm.kvm_max_user_address;
+ return (SYSCTL_OUT(req, &kvm32, sizeof(kvm32)));
+ }
+#endif
+
+ return (SYSCTL_OUT(req, &kvm, sizeof(kvm)));
+}
+
SYSCTL_NODE(_kern, KERN_PROC, proc, CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
"Process table");
@@ -3318,6 +3364,10 @@
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;
/*
Index: sys/sys/sysctl.h
===================================================================
--- sys/sys/sysctl.h
+++ sys/sys/sysctl.h
@@ -1013,6 +1013,7 @@
#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
Index: sys/sys/user.h
===================================================================
--- sys/sys/user.h
+++ sys/sys/user.h
@@ -598,6 +598,12 @@
void *ksigtramp_spare[4];
};
+struct kinfo_vm_layout {
+ uintptr_t kvm_min_user_address;
+ uintptr_t kvm_max_user_address;
+ uintptr_t kvm_spare[14];
+};
+
#ifdef _KERNEL
/* Flags for kern_proc_out function. */
#define KERN_PROC_NOTHREADS 0x1
Index: tests/sys/kern/kern_copyin.c
===================================================================
--- tests/sys/kern/kern_copyin.c
+++ tests/sys/kern/kern_copyin.c
@@ -33,6 +33,8 @@
#include <sys/param.h>
#include <sys/exec.h>
#include <sys/sysctl.h>
+#include <sys/user.h>
+
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
@@ -74,27 +76,20 @@
static uintptr_t
get_maxuser_address(void)
{
+ struct kinfo_vm_layout kvm;
size_t len;
- uintptr_t psstrings;
int error, mib[4];
mib[0] = CTL_KERN;
mib[1] = KERN_PROC;
- mib[2] = KERN_PROC_PS_STRINGS;
+ mib[2] = KERN_PROC_VM_LAYOUT;
mib[3] = getpid();
- len = sizeof(psstrings);
- error = sysctl(mib, nitems(mib), &psstrings, &len, NULL, 0);
+ len = sizeof(kvm);
+ error = sysctl(mib, nitems(mib), &kvm, &len, NULL, 0);
if (error != 0)
return (0);
- if (psstrings == PS_STRINGS_LA57)
- return (VM_MAXUSER_ADDRESS_LA57);
- if (psstrings == PS_STRINGS_LA48)
- return (VM_MAXUSER_ADDRESS_LA48);
- /* AMD LA48 with clipped UVA */
- if (psstrings == PS_STRINGS_LA48 - PAGE_SIZE)
- return (VM_MAXUSER_ADDRESS_LA48 - PAGE_SIZE);
- return (0);
+ return (kvm.kvm_max_user_address);
}
#endif
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Feb 9, 9:42 AM (4 h, 27 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28564886
Default Alt Text
D33708.id100788.diff (4 KB)
Attached To
Mode
D33708: Add a sysctl to fetch virtual address space layout info
Attached
Detach File
Event Timeline
Log In to Comment