diff options
author | peter <peter@FreeBSD.org> | 2004-02-18 00:54:17 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 2004-02-18 00:54:17 +0000 |
commit | 175d4b65a9c9cd4b2d3024c70cdf24d9cdb4800c (patch) | |
tree | 35e36006965893775bb5c0f6cec18913e0fac5d9 /sys/kern/kern_exec.c | |
parent | 60723c32606f318dd3816d81ba433654f812312b (diff) | |
download | FreeBSD-src-175d4b65a9c9cd4b2d3024c70cdf24d9cdb4800c.zip FreeBSD-src-175d4b65a9c9cd4b2d3024c70cdf24d9cdb4800c.tar.gz |
Checkpoint a hack to enable running i386 libc_r binaries on a 64 bit
kernel. I'm not happy with it yet - refinements are to come.
This hack allows the kern.ps_strings and kern.usrstack sysctls to respond
to a 32 bit request, such as those coming from emulated i386 binaries.
Diffstat (limited to 'sys/kern/kern_exec.c')
-rw-r--r-- | sys/kern/kern_exec.c | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c index 6e3d86e..4d2a7fe 100644 --- a/sys/kern/kern_exec.c +++ b/sys/kern/kern_exec.c @@ -102,20 +102,38 @@ static int sysctl_kern_ps_strings(SYSCTL_HANDLER_ARGS) { struct proc *p; + int error; p = curproc; - return (SYSCTL_OUT(req, &p->p_sysent->sv_psstrings, - sizeof(p->p_sysent->sv_psstrings))); +#if defined(__amd64__) || defined(__ia64__) + if (req->oldlen == sizeof(unsigned int)) { + unsigned int val; + val = (unsigned int)p->p_sysent->sv_psstrings; + error = SYSCTL_OUT(req, &val, sizeof(val)); + } else +#endif + error = SYSCTL_OUT(req, &p->p_sysent->sv_psstrings, + sizeof(p->p_sysent->sv_psstrings)); + return error; } static int sysctl_kern_usrstack(SYSCTL_HANDLER_ARGS) { struct proc *p; + int error; p = curproc; - return (SYSCTL_OUT(req, &p->p_sysent->sv_usrstack, - sizeof(p->p_sysent->sv_usrstack))); +#if defined(__amd64__) || defined(__ia64__) + if (req->oldlen == sizeof(unsigned int)) { + unsigned int val; + val = (unsigned int)p->p_sysent->sv_usrstack; + error = SYSCTL_OUT(req, &val, sizeof(val)); + } else +#endif + error = SYSCTL_OUT(req, &p->p_sysent->sv_usrstack, + sizeof(p->p_sysent->sv_usrstack)); + return error; } static int |