Page MenuHomeFreeBSD

D33708.id100788.diff
No OneTemporary

D33708.id100788.diff

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

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)

Event Timeline