diff options
| author | Peter Wemm <peter@FreeBSD.org> | 2004-10-11 22:04:16 +0000 |
|---|---|---|
| committer | Peter Wemm <peter@FreeBSD.org> | 2004-10-11 22:04:16 +0000 |
| commit | a7bc3102c474e06cee479c0474f8815bd54bf994 (patch) | |
| tree | 1829b174800facf808eb5d32c6e9b155f798a0f6 /sys/kern | |
| parent | 731239920fb7702a4710c231d842457bb77bf069 (diff) | |
Notes
Diffstat (limited to 'sys/kern')
| -rw-r--r-- | sys/kern/kern_exec.c | 8 | ||||
| -rw-r--r-- | sys/kern/kern_sysctl.c | 38 | ||||
| -rw-r--r-- | sys/kern/kern_tc.c | 19 | ||||
| -rw-r--r-- | sys/kern/kern_xxx.c | 10 |
4 files changed, 54 insertions, 21 deletions
diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c index d23683207999..06cbc6817109 100644 --- a/sys/kern/kern_exec.c +++ b/sys/kern/kern_exec.c @@ -104,8 +104,8 @@ sysctl_kern_ps_strings(SYSCTL_HANDLER_ARGS) int error; p = curproc; -#if defined(__amd64__) || defined(__ia64__) - if (req->oldlen == sizeof(unsigned int)) { +#ifdef SCTL_MASK32 + if (req->flags & SCTL_MASK32) { unsigned int val; val = (unsigned int)p->p_sysent->sv_psstrings; error = SYSCTL_OUT(req, &val, sizeof(val)); @@ -123,8 +123,8 @@ sysctl_kern_usrstack(SYSCTL_HANDLER_ARGS) int error; p = curproc; -#if defined(__amd64__) || defined(__ia64__) - if (req->oldlen == sizeof(unsigned int)) { +#ifdef SCTL_MASK32 + if (req->flags & SCTL_MASK32) { unsigned int val; val = (unsigned int)p->p_sysent->sv_usrstack; error = SYSCTL_OUT(req, &val, sizeof(val)); diff --git a/sys/kern/kern_sysctl.c b/sys/kern/kern_sysctl.c index eda6810605ff..af0dda4d792b 100644 --- a/sys/kern/kern_sysctl.c +++ b/sys/kern/kern_sysctl.c @@ -828,20 +828,35 @@ int sysctl_handle_long(SYSCTL_HANDLER_ARGS) { int error = 0; - long tmpout; + long tmplong; +#ifdef SCTL_MASK32 + int tmpint; +#endif /* * Attempt to get a coherent snapshot by making a copy of the data. */ if (!arg1) return (EINVAL); - tmpout = *(long *)arg1; - error = SYSCTL_OUT(req, &tmpout, sizeof(long)); + tmplong = *(long *)arg1; +#ifdef SCTL_MASK32 + if (req->flags & SCTL_MASK32) { + tmpint = tmplong; + error = SYSCTL_OUT(req, &tmpint, sizeof(int)); + } else +#endif + error = SYSCTL_OUT(req, &tmplong, sizeof(long)); if (error || !req->newptr) return (error); - error = SYSCTL_IN(req, arg1, sizeof(long)); +#ifdef SCTL_MASK32 + if (req->flags & SCTL_MASK32) { + error = SYSCTL_IN(req, &tmpint, sizeof(int)); + *(long *)arg1 = (long)tmpint; + } else +#endif + error = SYSCTL_IN(req, arg1, sizeof(long)); return (error); } @@ -965,7 +980,7 @@ sysctl_new_kernel(struct sysctl_req *req, void *p, size_t l) int kernel_sysctl(struct thread *td, int *name, u_int namelen, void *old, - size_t *oldlenp, void *new, size_t newlen, size_t *retval) + size_t *oldlenp, void *new, size_t newlen, size_t *retval, int flags) { int error = 0; struct sysctl_req req; @@ -973,6 +988,7 @@ kernel_sysctl(struct thread *td, int *name, u_int namelen, void *old, bzero(&req, sizeof req); req.td = td; + req.flags = flags; if (oldlenp) { req.oldlen = *oldlenp; @@ -1015,7 +1031,7 @@ kernel_sysctl(struct thread *td, int *name, u_int namelen, void *old, int kernel_sysctlbyname(struct thread *td, char *name, void *old, size_t *oldlenp, - void *new, size_t newlen, size_t *retval) + void *new, size_t newlen, size_t *retval, int flags) { int oid[CTL_MAXNAME]; size_t oidlen, plen; @@ -1026,12 +1042,12 @@ kernel_sysctlbyname(struct thread *td, char *name, void *old, size_t *oldlenp, oidlen = sizeof(oid); error = kernel_sysctl(td, oid, 2, oid, &oidlen, - (void *)name, strlen(name), &plen); + (void *)name, strlen(name), &plen, flags); if (error) return (error); error = kernel_sysctl(td, oid, plen / sizeof(int), old, oldlenp, - new, newlen, retval); + new, newlen, retval, flags); return (error); } @@ -1256,7 +1272,7 @@ __sysctl(struct thread *td, struct sysctl_args *uap) error = userland_sysctl(td, name, uap->namelen, uap->old, uap->oldlenp, 0, - uap->new, uap->newlen, &j); + uap->new, uap->newlen, &j, 0); if (error && error != ENOMEM) goto done2; if (uap->oldlenp) { @@ -1275,7 +1291,8 @@ done2: */ int userland_sysctl(struct thread *td, int *name, u_int namelen, void *old, - size_t *oldlenp, int inkernel, void *new, size_t newlen, size_t *retval) + size_t *oldlenp, int inkernel, void *new, size_t newlen, size_t *retval, + int flags) { int error = 0; struct sysctl_req req; @@ -1283,6 +1300,7 @@ userland_sysctl(struct thread *td, int *name, u_int namelen, void *old, bzero(&req, sizeof req); req.td = td; + req.flags = flags; if (oldlenp) { if (inkernel) { diff --git a/sys/kern/kern_tc.c b/sys/kern/kern_tc.c index 984d237ec91e..4567dde2c070 100644 --- a/sys/kern/kern_tc.c +++ b/sys/kern/kern_tc.c @@ -92,8 +92,9 @@ time_t time_uptime = 0; static struct bintime boottimebin; struct timeval boottime; -SYSCTL_STRUCT(_kern, KERN_BOOTTIME, boottime, CTLFLAG_RD, - &boottime, timeval, "System boottime"); +static int sysctl_kern_boottime(SYSCTL_HANDLER_ARGS); +SYSCTL_PROC(_kern, KERN_BOOTTIME, boottime, CTLTYPE_STRUCT|CTLFLAG_RD, + NULL, 0, sysctl_kern_boottime, "S,timeval", "System boottime"); SYSCTL_NODE(_kern, OID_AUTO, timecounter, CTLFLAG_RW, 0, ""); @@ -116,6 +117,20 @@ TC_STATS(nsetclock); static void tc_windup(void); +static int +sysctl_kern_boottime(SYSCTL_HANDLER_ARGS) +{ +#ifdef SCTL_MASK32 + int tv[2]; + + if (req->flags & SCTL_MASK32) { + tv[0] = boottime.tv_sec; + tv[1] = boottime.tv_usec; + return SYSCTL_OUT(req, tv, sizeof(tv)); + } else +#endif + return SYSCTL_OUT(req, &boottime, sizeof(boottime)); +} /* * Return the difference between the timehands' counter value now and what * was when we copied it to the timehands' offset_count. diff --git a/sys/kern/kern_xxx.c b/sys/kern/kern_xxx.c index 6840e6411063..fdf6e27c398a 100644 --- a/sys/kern/kern_xxx.c +++ b/sys/kern/kern_xxx.c @@ -192,7 +192,7 @@ uname(td, uap) len = sizeof (uap->name->sysname); mtx_lock(&Giant); error = userland_sysctl(td, name, 2, uap->name->sysname, &len, - 1, 0, 0, 0); + 1, 0, 0, 0, 0); if (error) goto done2; subyte( uap->name->sysname + sizeof(uap->name->sysname) - 1, 0); @@ -200,7 +200,7 @@ uname(td, uap) name[1] = KERN_HOSTNAME; len = sizeof uap->name->nodename; error = userland_sysctl(td, name, 2, uap->name->nodename, &len, - 1, 0, 0, 0); + 1, 0, 0, 0, 0); if (error) goto done2; subyte( uap->name->nodename + sizeof(uap->name->nodename) - 1, 0); @@ -208,7 +208,7 @@ uname(td, uap) name[1] = KERN_OSRELEASE; len = sizeof uap->name->release; error = userland_sysctl(td, name, 2, uap->name->release, &len, - 1, 0, 0, 0); + 1, 0, 0, 0, 0); if (error) goto done2; subyte( uap->name->release + sizeof(uap->name->release) - 1, 0); @@ -217,7 +217,7 @@ uname(td, uap) name = KERN_VERSION; len = sizeof uap->name->version; error = userland_sysctl(td, name, 2, uap->name->version, &len, - 1, 0, 0, 0); + 1, 0, 0, 0, 0); if (error) goto done2; subyte( uap->name->version + sizeof(uap->name->version) - 1, 0); @@ -241,7 +241,7 @@ uname(td, uap) name[1] = HW_MACHINE; len = sizeof uap->name->machine; error = userland_sysctl(td, name, 2, uap->name->machine, &len, - 1, 0, 0, 0); + 1, 0, 0, 0, 0); if (error) goto done2; subyte( uap->name->machine + sizeof(uap->name->machine) - 1, 0); |
