From 15eaec6a5c04b1cce7594cd1278600d7a57efc5a Mon Sep 17 00:00:00 2001 From: Kyle Evans Date: Sun, 22 Nov 2020 05:34:51 +0000 Subject: [PATCH] _umtx_op: move compat32 definitions back in These are reasonably compact, and a future commit will blur the compat32 lines by supporting 32-bit operations with the native _umtx_op. --- sys/compat/freebsd32/freebsd32.h | 21 ------------ sys/compat/freebsd32/freebsd32_misc.c | 8 ----- sys/kern/kern_umtx.c | 46 ++++++++++++++++++++++++++- sys/sys/syscallsubr.h | 3 -- sys/sys/umtx.h | 16 ---------- 5 files changed, 45 insertions(+), 49 deletions(-) diff --git a/sys/compat/freebsd32/freebsd32.h b/sys/compat/freebsd32/freebsd32.h index 46ba54c1971d..a3774c99a0cb 100644 --- a/sys/compat/freebsd32/freebsd32.h +++ b/sys/compat/freebsd32/freebsd32.h @@ -94,27 +94,6 @@ struct itimerval32 { struct timeval32 it_value; }; -struct umtx_time32 { - struct timespec32 _timeout; - uint32_t _flags; - uint32_t _clockid; -}; - -struct umtx_robust_lists_params_compat32 { - uint32_t robust_list_offset; - uint32_t robust_priv_list_offset; - uint32_t robust_inact_offset; -}; - -struct umutex32 { - volatile __lwpid_t m_owner; /* Owner of the mutex */ - __uint32_t m_flags; /* Flags of the mutex */ - __uint32_t m_ceilings[2]; /* Priority protect ceiling */ - __uint32_t m_rb_lnk; /* Robust linkage */ - __uint32_t m_pad; - __uint32_t m_spare[2]; -}; - #define FREEBSD4_MFSNAMELEN 16 #define FREEBSD4_MNAMELEN (88 - 2 * sizeof(int32_t)) diff --git a/sys/compat/freebsd32/freebsd32_misc.c b/sys/compat/freebsd32/freebsd32_misc.c index f1464cb2ba43..d0489919718f 100644 --- a/sys/compat/freebsd32/freebsd32_misc.c +++ b/sys/compat/freebsd32/freebsd32_misc.c @@ -3766,11 +3766,3 @@ freebsd32_sched_rr_get_interval(struct thread *td, } return (error); } - -int -freebsd32__umtx_op(struct thread *td, struct freebsd32__umtx_op_args *uap) -{ - - return (kern__umtx_op(td, uap->obj, uap->op, uap->val, uap->uaddr, - uap->uaddr2, &umtx_native_ops32)); -} diff --git a/sys/kern/kern_umtx.c b/sys/kern/kern_umtx.c index 5cc46a966609..dc2f820bc349 100644 --- a/sys/kern/kern_umtx.c +++ b/sys/kern/kern_umtx.c @@ -219,7 +219,41 @@ struct abs_timeout { struct timespec end; }; +struct umtx_copyops { + int (*copyin_timeout)(const void *uaddr, struct timespec *tsp); + int (*copyin_umtx_time)(const void *uaddr, size_t size, + struct _umtx_time *tp); + int (*copyin_robust_lists)(const void *uaddr, size_t size, + struct umtx_robust_lists_params *rbp); + int (*copyout_timeout)(void *uaddr, size_t size, + struct timespec *tsp); + const size_t timespec_sz; + const size_t umtx_time_sz; + const bool compat32; +}; + #ifdef COMPAT_FREEBSD32 +struct umtx_time32 { + struct timespec32 _timeout; + uint32_t _flags; + uint32_t _clockid; +}; + +struct umtx_robust_lists_params_compat32 { + uint32_t robust_list_offset; + uint32_t robust_priv_list_offset; + uint32_t robust_inact_offset; +}; + +struct umutex32 { + volatile __lwpid_t m_owner; /* Owner of the mutex */ + __uint32_t m_flags; /* Flags of the mutex */ + __uint32_t m_ceilings[2]; /* Priority protect ceiling */ + __uint32_t m_rb_lnk; /* Robust linkage */ + __uint32_t m_pad; + __uint32_t m_spare[2]; +}; + _Static_assert(sizeof(struct umutex) == sizeof(struct umutex32), "umutex32"); _Static_assert(__offsetof(struct umutex, m_spare[0]) == __offsetof(struct umutex32, m_spare[0]), "m_spare32"); @@ -4291,7 +4325,7 @@ const struct umtx_copyops umtx_native_ops32 = { }; #endif -int +static int kern__umtx_op(struct thread *td, void *obj, int op, unsigned long val, void *uaddr1, void *uaddr2, const struct umtx_copyops *ops) { @@ -4316,6 +4350,16 @@ sys__umtx_op(struct thread *td, struct _umtx_op_args *uap) uap->uaddr2, &umtx_native_ops)); } +#ifdef COMPAT_FREEBSD32 +int +freebsd32__umtx_op(struct thread *td, struct freebsd32__umtx_op_args *uap) +{ + + return (kern__umtx_op(td, uap->obj, uap->op, uap->val, uap->uaddr, + uap->uaddr2, &umtx_native_ops32)); +} +#endif + void umtx_thread_init(struct thread *td) { diff --git a/sys/sys/syscallsubr.h b/sys/sys/syscallsubr.h index cc3134acce1f..80383be2d155 100644 --- a/sys/sys/syscallsubr.h +++ b/sys/sys/syscallsubr.h @@ -62,7 +62,6 @@ struct sockaddr; struct stat; struct thr_param; struct uio; -struct umtx_copyops; struct vm_map; struct vmspace; @@ -80,8 +79,6 @@ struct mmap_req { int kern___getcwd(struct thread *td, char *buf, enum uio_seg bufseg, size_t buflen, size_t path_max); -int kern__umtx_op(struct thread *td, void *obj, int op, unsigned long val, - void *uaddr1, void *uaddr2, const struct umtx_copyops *ops); int kern_accept(struct thread *td, int s, struct sockaddr **name, socklen_t *namelen, struct file **fp); int kern_accept4(struct thread *td, int s, struct sockaddr **name, diff --git a/sys/sys/umtx.h b/sys/sys/umtx.h index 2955c2ad9901..f0a34e0aed67 100644 --- a/sys/sys/umtx.h +++ b/sys/sys/umtx.h @@ -200,21 +200,5 @@ void umtx_thread_fini(struct thread *); void umtx_thread_alloc(struct thread *); void umtx_thread_exit(struct thread *); -struct umtx_copyops { - int (*copyin_timeout)(const void *uaddr, struct timespec *tsp); - int (*copyin_umtx_time)(const void *uaddr, size_t size, - struct _umtx_time *tp); - int (*copyin_robust_lists)(const void *uaddr, size_t size, - struct umtx_robust_lists_params *rbp); - int (*copyout_timeout)(void *uaddr, size_t size, - struct timespec *tsp); - const size_t timespec_sz; - const size_t umtx_time_sz; - const bool compat32; -}; - -#ifdef COMPAT_FREEBSD32 -extern const struct umtx_copyops umtx_native_ops32; -#endif #endif /* !_KERNEL */ #endif /* !_SYS_UMTX_H_ */