_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.
This commit is contained in:
Kyle Evans 2020-11-22 05:34:51 +00:00
parent 3c85ca21d1
commit 15eaec6a5c
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=367928
5 changed files with 45 additions and 49 deletions

View File

@ -94,27 +94,6 @@ struct itimerval32 {
struct timeval32 it_value; 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_MFSNAMELEN 16
#define FREEBSD4_MNAMELEN (88 - 2 * sizeof(int32_t)) #define FREEBSD4_MNAMELEN (88 - 2 * sizeof(int32_t))

View File

@ -3766,11 +3766,3 @@ freebsd32_sched_rr_get_interval(struct thread *td,
} }
return (error); 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));
}

View File

@ -219,7 +219,41 @@ struct abs_timeout {
struct timespec end; 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 #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(sizeof(struct umutex) == sizeof(struct umutex32), "umutex32");
_Static_assert(__offsetof(struct umutex, m_spare[0]) == _Static_assert(__offsetof(struct umutex, m_spare[0]) ==
__offsetof(struct umutex32, m_spare[0]), "m_spare32"); __offsetof(struct umutex32, m_spare[0]), "m_spare32");
@ -4291,7 +4325,7 @@ const struct umtx_copyops umtx_native_ops32 = {
}; };
#endif #endif
int static int
kern__umtx_op(struct thread *td, void *obj, int op, unsigned long val, kern__umtx_op(struct thread *td, void *obj, int op, unsigned long val,
void *uaddr1, void *uaddr2, const struct umtx_copyops *ops) 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)); 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 void
umtx_thread_init(struct thread *td) umtx_thread_init(struct thread *td)
{ {

View File

@ -62,7 +62,6 @@ struct sockaddr;
struct stat; struct stat;
struct thr_param; struct thr_param;
struct uio; struct uio;
struct umtx_copyops;
struct vm_map; struct vm_map;
struct vmspace; struct vmspace;
@ -80,8 +79,6 @@ struct mmap_req {
int kern___getcwd(struct thread *td, char *buf, enum uio_seg bufseg, int kern___getcwd(struct thread *td, char *buf, enum uio_seg bufseg,
size_t buflen, size_t path_max); 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, int kern_accept(struct thread *td, int s, struct sockaddr **name,
socklen_t *namelen, struct file **fp); socklen_t *namelen, struct file **fp);
int kern_accept4(struct thread *td, int s, struct sockaddr **name, int kern_accept4(struct thread *td, int s, struct sockaddr **name,

View File

@ -200,21 +200,5 @@ void umtx_thread_fini(struct thread *);
void umtx_thread_alloc(struct thread *); void umtx_thread_alloc(struct thread *);
void umtx_thread_exit(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 /* !_KERNEL */
#endif /* !_SYS_UMTX_H_ */ #endif /* !_SYS_UMTX_H_ */