Changeset View
Changeset View
Standalone View
Standalone View
sys/compat/freebsd32/freebsd32_misc.c
Show First 20 Lines • Show All 113 Lines • ▼ Show 20 Lines | |||||
CTASSERT(sizeof(struct timespec32) == 8); | CTASSERT(sizeof(struct timespec32) == 8); | ||||
CTASSERT(sizeof(struct itimerval32) == 16); | CTASSERT(sizeof(struct itimerval32) == 16); | ||||
#endif | #endif | ||||
CTASSERT(sizeof(struct statfs32) == 256); | CTASSERT(sizeof(struct statfs32) == 256); | ||||
#ifndef __mips__ | #ifndef __mips__ | ||||
CTASSERT(sizeof(struct rusage32) == 72); | CTASSERT(sizeof(struct rusage32) == 72); | ||||
#endif | #endif | ||||
CTASSERT(sizeof(struct sigaltstack32) == 12); | CTASSERT(sizeof(struct sigaltstack32) == 12); | ||||
CTASSERT(sizeof(struct kevent32) == 20); | CTASSERT(sizeof(struct kevent32) == 56); | ||||
CTASSERT(sizeof(struct iovec32) == 8); | CTASSERT(sizeof(struct iovec32) == 8); | ||||
CTASSERT(sizeof(struct msghdr32) == 28); | CTASSERT(sizeof(struct msghdr32) == 28); | ||||
#ifdef __amd64__ | #ifdef __amd64__ | ||||
CTASSERT(sizeof(struct stat32) == 208); | CTASSERT(sizeof(struct stat32) == 208); | ||||
#endif | #endif | ||||
#ifndef __mips__ | #ifndef __mips__ | ||||
CTASSERT(sizeof(struct freebsd11_stat32) == 96); | CTASSERT(sizeof(struct freebsd11_stat32) == 96); | ||||
#endif | #endif | ||||
▲ Show 20 Lines • Show All 486 Lines • ▼ Show 20 Lines | |||||
/* | /* | ||||
* Copy 'count' items into the destination list pointed to by uap->eventlist. | * Copy 'count' items into the destination list pointed to by uap->eventlist. | ||||
*/ | */ | ||||
static int | static int | ||||
freebsd32_kevent_copyout(void *arg, struct kevent *kevp, int count) | freebsd32_kevent_copyout(void *arg, struct kevent *kevp, int count) | ||||
{ | { | ||||
struct freebsd32_kevent_args *uap; | struct freebsd32_kevent_args *uap; | ||||
struct kevent32 ks32[KQ_NEVENTS]; | struct kevent32 ks32[KQ_NEVENTS]; | ||||
int i, error = 0; | uint64_t e; | ||||
int i, j, error; | |||||
KASSERT(count <= KQ_NEVENTS, ("count (%d) > KQ_NEVENTS", count)); | KASSERT(count <= KQ_NEVENTS, ("count (%d) > KQ_NEVENTS", count)); | ||||
uap = (struct freebsd32_kevent_args *)arg; | uap = (struct freebsd32_kevent_args *)arg; | ||||
for (i = 0; i < count; i++) { | for (i = 0; i < count; i++) { | ||||
CP(kevp[i], ks32[i], ident); | CP(kevp[i], ks32[i], ident); | ||||
CP(kevp[i], ks32[i], filter); | CP(kevp[i], ks32[i], filter); | ||||
CP(kevp[i], ks32[i], flags); | CP(kevp[i], ks32[i], flags); | ||||
CP(kevp[i], ks32[i], fflags); | CP(kevp[i], ks32[i], fflags); | ||||
CP(kevp[i], ks32[i], data); | bcopy(&kevp[i].data, &ks32[i].data1, sizeof(uint64_t)); | ||||
PTROUT_CP(kevp[i], ks32[i], udata); | PTROUT_CP(kevp[i], ks32[i], udata); | ||||
for (j = 0; j < nitems(kevp->ext); j++) { | |||||
e = kevp[i].ext[j]; | |||||
#if BYTE_ORDER == LITTLE_ENDIAN | |||||
ks32[i].ext64[2 * j] = e; | |||||
ks32[i].ext64[2 * j + 1] = e >> 32; | |||||
#else | |||||
ks32[i].ext64[2 * j] = e >> 32; | |||||
ks32[i].ext64[2 * j + 1] = e; | |||||
#endif | |||||
} | } | ||||
} | |||||
error = copyout(ks32, uap->eventlist, count * sizeof *ks32); | error = copyout(ks32, uap->eventlist, count * sizeof *ks32); | ||||
if (error == 0) | if (error == 0) | ||||
uap->eventlist += count; | uap->eventlist += count; | ||||
return (error); | return (error); | ||||
} | } | ||||
/* | /* | ||||
* Copy 'count' items from the list pointed to by uap->changelist. | * Copy 'count' items from the list pointed to by uap->changelist. | ||||
*/ | */ | ||||
static int | static int | ||||
freebsd32_kevent_copyin(void *arg, struct kevent *kevp, int count) | freebsd32_kevent_copyin(void *arg, struct kevent *kevp, int count) | ||||
{ | { | ||||
struct freebsd32_kevent_args *uap; | struct freebsd32_kevent_args *uap; | ||||
struct kevent32 ks32[KQ_NEVENTS]; | struct kevent32 ks32[KQ_NEVENTS]; | ||||
int i, error = 0; | uint64_t e; | ||||
int i, j, error; | |||||
KASSERT(count <= KQ_NEVENTS, ("count (%d) > KQ_NEVENTS", count)); | KASSERT(count <= KQ_NEVENTS, ("count (%d) > KQ_NEVENTS", count)); | ||||
uap = (struct freebsd32_kevent_args *)arg; | uap = (struct freebsd32_kevent_args *)arg; | ||||
error = copyin(uap->changelist, ks32, count * sizeof *ks32); | error = copyin(uap->changelist, ks32, count * sizeof *ks32); | ||||
if (error) | if (error) | ||||
goto done; | goto done; | ||||
uap->changelist += count; | uap->changelist += count; | ||||
for (i = 0; i < count; i++) { | for (i = 0; i < count; i++) { | ||||
CP(ks32[i], kevp[i], ident); | CP(ks32[i], kevp[i], ident); | ||||
CP(ks32[i], kevp[i], filter); | CP(ks32[i], kevp[i], filter); | ||||
CP(ks32[i], kevp[i], flags); | CP(ks32[i], kevp[i], flags); | ||||
CP(ks32[i], kevp[i], fflags); | CP(ks32[i], kevp[i], fflags); | ||||
CP(ks32[i], kevp[i], data); | kevp[i].data = PAIR32TO64(uint64_t, ks32[i].data); | ||||
PTRIN_CP(ks32[i], kevp[i], udata); | PTRIN_CP(ks32[i], kevp[i], udata); | ||||
for (j = 0; j < nitems(kevp->ext); j++) { | |||||
#if BYTE_ORDER == LITTLE_ENDIAN | |||||
e = ks32[i].ext64[2 * j + 1]; | |||||
e <<= 32; | |||||
e += ks32[i].ext64[2 * j]; | |||||
#else | |||||
e = ks32[i].ext64[2 * j]; | |||||
e <<= 32; | |||||
e += ks32[i].ext64[2 * j + 1]; | |||||
#endif | |||||
kevp[i].ext[j] = e; | |||||
} | } | ||||
} | |||||
done: | done: | ||||
return (error); | return (error); | ||||
} | } | ||||
int | int | ||||
freebsd32_kevent(struct thread *td, struct freebsd32_kevent_args *uap) | freebsd32_kevent(struct thread *td, struct freebsd32_kevent_args *uap) | ||||
{ | { | ||||
struct timespec32 ts32; | struct timespec32 ts32; | ||||
struct timespec ts, *tsp; | struct timespec ts, *tsp; | ||||
struct kevent_copyops k_ops = { | struct kevent_copyops k_ops = { | ||||
.arg = uap, | .arg = uap, | ||||
.k_copyout = freebsd32_kevent_copyout, | .k_copyout = freebsd32_kevent_copyout, | ||||
.k_copyin = freebsd32_kevent_copyin, | .k_copyin = freebsd32_kevent_copyin, | ||||
}; | }; | ||||
int error; | int error; | ||||
if (uap->timeout) { | |||||
error = copyin(uap->timeout, &ts32, sizeof(ts32)); | |||||
if (error) | |||||
return (error); | |||||
CP(ts32, ts, tv_sec); | |||||
CP(ts32, ts, tv_nsec); | |||||
tsp = &ts; | |||||
} else | |||||
tsp = NULL; | |||||
error = kern_kevent(td, uap->fd, uap->nchanges, uap->nevents, | |||||
&k_ops, tsp); | |||||
return (error); | |||||
} | |||||
#ifdef COMPAT_FREEBSD11 | |||||
struct kevent32_freebsd11 { | |||||
u_int32_t ident; /* identifier for this event */ | |||||
short filter; /* filter for event */ | |||||
u_short flags; | |||||
u_int fflags; | |||||
int32_t data; | |||||
u_int32_t udata; /* opaque user data identifier */ | |||||
}; | |||||
static int | |||||
freebsd32_kevent11_copyout(void *arg, struct kevent *kevp, int count) | |||||
{ | |||||
struct freebsd11_freebsd32_kevent_args *uap; | |||||
struct kevent32_freebsd11 ks32[KQ_NEVENTS]; | |||||
int i, error; | |||||
KASSERT(count <= KQ_NEVENTS, ("count (%d) > KQ_NEVENTS", count)); | |||||
uap = (struct freebsd11_freebsd32_kevent_args *)arg; | |||||
for (i = 0; i < count; i++) { | |||||
CP(kevp[i], ks32[i], ident); | |||||
CP(kevp[i], ks32[i], filter); | |||||
CP(kevp[i], ks32[i], flags); | |||||
CP(kevp[i], ks32[i], fflags); | |||||
CP(kevp[i], ks32[i], data); | |||||
PTROUT_CP(kevp[i], ks32[i], udata); | |||||
} | |||||
error = copyout(ks32, uap->eventlist, count * sizeof *ks32); | |||||
if (error == 0) | |||||
uap->eventlist += count; | |||||
return (error); | |||||
} | |||||
/* | |||||
* Copy 'count' items from the list pointed to by uap->changelist. | |||||
*/ | |||||
static int | |||||
freebsd32_kevent11_copyin(void *arg, struct kevent *kevp, int count) | |||||
{ | |||||
struct freebsd11_freebsd32_kevent_args *uap; | |||||
struct kevent32_freebsd11 ks32[KQ_NEVENTS]; | |||||
int i, j, error; | |||||
KASSERT(count <= KQ_NEVENTS, ("count (%d) > KQ_NEVENTS", count)); | |||||
uap = (struct freebsd11_freebsd32_kevent_args *)arg; | |||||
error = copyin(uap->changelist, ks32, count * sizeof *ks32); | |||||
if (error) | |||||
goto done; | |||||
uap->changelist += count; | |||||
for (i = 0; i < count; i++) { | |||||
CP(ks32[i], kevp[i], ident); | |||||
CP(ks32[i], kevp[i], filter); | |||||
CP(ks32[i], kevp[i], flags); | |||||
CP(ks32[i], kevp[i], fflags); | |||||
CP(ks32[i], kevp[i], data); | |||||
PTRIN_CP(ks32[i], kevp[i], udata); | |||||
for (j = 0; j < nitems(kevp->ext); j++) | |||||
kevp[i].ext[j] = 0; | |||||
} | |||||
done: | |||||
return (error); | |||||
} | |||||
int | |||||
freebsd11_freebsd32_kevent(struct thread *td, | |||||
struct freebsd11_freebsd32_kevent_args *uap) | |||||
{ | |||||
struct timespec32 ts32; | |||||
struct timespec ts, *tsp; | |||||
struct kevent_copyops k_ops = { | |||||
.arg = uap, | |||||
.k_copyout = freebsd32_kevent11_copyout, | |||||
.k_copyin = freebsd32_kevent11_copyin, | |||||
}; | |||||
int error; | |||||
if (uap->timeout) { | if (uap->timeout) { | ||||
error = copyin(uap->timeout, &ts32, sizeof(ts32)); | error = copyin(uap->timeout, &ts32, sizeof(ts32)); | ||||
if (error) | if (error) | ||||
return (error); | return (error); | ||||
CP(ts32, ts, tv_sec); | CP(ts32, ts, tv_sec); | ||||
CP(ts32, ts, tv_nsec); | CP(ts32, ts, tv_nsec); | ||||
tsp = &ts; | tsp = &ts; | ||||
} else | } else | ||||
tsp = NULL; | tsp = NULL; | ||||
error = kern_kevent(td, uap->fd, uap->nchanges, uap->nevents, | error = kern_kevent(td, uap->fd, uap->nchanges, uap->nevents, | ||||
&k_ops, tsp); | &k_ops, tsp); | ||||
return (error); | return (error); | ||||
} | } | ||||
#endif | |||||
int | int | ||||
freebsd32_gettimeofday(struct thread *td, | freebsd32_gettimeofday(struct thread *td, | ||||
struct freebsd32_gettimeofday_args *uap) | struct freebsd32_gettimeofday_args *uap) | ||||
{ | { | ||||
struct timeval atv; | struct timeval atv; | ||||
struct timeval32 atv32; | struct timeval32 atv32; | ||||
struct timezone rtz; | struct timezone rtz; | ||||
▲ Show 20 Lines • Show All 2,646 Lines • Show Last 20 Lines |