1*03ca6dbdSKonstantin Belousov /* 2*03ca6dbdSKonstantin Belousov * SPDX-License-Identifier: BSD-2-Clause 3*03ca6dbdSKonstantin Belousov * 4*03ca6dbdSKonstantin Belousov * Copyright 2026 The FreeBSD Foundation 5*03ca6dbdSKonstantin Belousov * 6*03ca6dbdSKonstantin Belousov * This software was developed by Konstantin Belousov <kib@FreeBSD.org> 7*03ca6dbdSKonstantin Belousov * under sponsorship from the FreeBSD Foundation. 8*03ca6dbdSKonstantin Belousov */ 9*03ca6dbdSKonstantin Belousov 10*03ca6dbdSKonstantin Belousov #ifndef __DEV_NTSYNCVAR_H__ 11*03ca6dbdSKonstantin Belousov #define __DEV_NTSYNCVAR_H__ 12*03ca6dbdSKonstantin Belousov 13*03ca6dbdSKonstantin Belousov #include <sys/lock.h> 14*03ca6dbdSKonstantin Belousov #include <sys/mutex.h> 15*03ca6dbdSKonstantin Belousov #include <sys/time.h> 16*03ca6dbdSKonstantin Belousov #include <sys/queue.h> 17*03ca6dbdSKonstantin Belousov #include <dev/ntsync/ntsync.h> 18*03ca6dbdSKonstantin Belousov 19*03ca6dbdSKonstantin Belousov enum ntsync_obj_type { 20*03ca6dbdSKonstantin Belousov NTSYNC_OBJ_SEM, 21*03ca6dbdSKonstantin Belousov NTSYNC_OBJ_MUTEX, 22*03ca6dbdSKonstantin Belousov NTSYNC_OBJ_EVENT, 23*03ca6dbdSKonstantin Belousov }; 24*03ca6dbdSKonstantin Belousov 25*03ca6dbdSKonstantin Belousov struct ntsync_wait_state; 26*03ca6dbdSKonstantin Belousov 27*03ca6dbdSKonstantin Belousov struct ntsync_obj_waiter { 28*03ca6dbdSKonstantin Belousov struct ntsync_wait_state *state; 29*03ca6dbdSKonstantin Belousov TAILQ_ENTRY(ntsync_obj_waiter) link; 30*03ca6dbdSKonstantin Belousov }; 31*03ca6dbdSKonstantin Belousov 32*03ca6dbdSKonstantin Belousov struct ntsync_obj { 33*03ca6dbdSKonstantin Belousov enum ntsync_obj_type type; 34*03ca6dbdSKonstantin Belousov struct ntsync_priv *owner; 35*03ca6dbdSKonstantin Belousov TAILQ_HEAD(, ntsync_obj_waiter) waiters; 36*03ca6dbdSKonstantin Belousov /* any */ 37*03ca6dbdSKonstantin Belousov bool (*is_signaled)(struct ntsync_obj *, 38*03ca6dbdSKonstantin Belousov struct ntsync_wait_state *state, int index); 39*03ca6dbdSKonstantin Belousov void (*consume)(struct ntsync_obj *, struct ntsync_wait_state *, 40*03ca6dbdSKonstantin Belousov int index); 41*03ca6dbdSKonstantin Belousov /* all */ 42*03ca6dbdSKonstantin Belousov bool (*prepare)(struct ntsync_obj *, struct ntsync_wait_state *state, 43*03ca6dbdSKonstantin Belousov int index, bool *stop); 44*03ca6dbdSKonstantin Belousov void (*commit)(struct ntsync_obj *, struct ntsync_wait_state *state, 45*03ca6dbdSKonstantin Belousov int index); 46*03ca6dbdSKonstantin Belousov void (*post_commit)(struct ntsync_obj *, 47*03ca6dbdSKonstantin Belousov struct ntsync_wait_state *state, int index); 48*03ca6dbdSKonstantin Belousov }; 49*03ca6dbdSKonstantin Belousov 50*03ca6dbdSKonstantin Belousov struct ntsync_obj_sem { 51*03ca6dbdSKonstantin Belousov struct ntsync_obj obj; 52*03ca6dbdSKonstantin Belousov struct ntsync_sem_args a; 53*03ca6dbdSKonstantin Belousov struct ntsync_sem_args a1; 54*03ca6dbdSKonstantin Belousov }; 55*03ca6dbdSKonstantin Belousov #define OBJ_TO_SEM(obj) __containerof(obj, struct ntsync_obj_sem, obj) 56*03ca6dbdSKonstantin Belousov 57*03ca6dbdSKonstantin Belousov struct ntsync_obj_mutex { 58*03ca6dbdSKonstantin Belousov struct ntsync_obj obj; 59*03ca6dbdSKonstantin Belousov struct ntsync_mutex_args a; 60*03ca6dbdSKonstantin Belousov struct ntsync_mutex_args a1; 61*03ca6dbdSKonstantin Belousov bool abandoned; 62*03ca6dbdSKonstantin Belousov }; 63*03ca6dbdSKonstantin Belousov #define OBJ_TO_MUTEX(obj) __containerof(obj, struct ntsync_obj_mutex, obj) 64*03ca6dbdSKonstantin Belousov 65*03ca6dbdSKonstantin Belousov struct ntsync_obj_event { 66*03ca6dbdSKonstantin Belousov struct ntsync_obj obj; 67*03ca6dbdSKonstantin Belousov struct ntsync_event_args a; 68*03ca6dbdSKonstantin Belousov struct ntsync_event_args a1; 69*03ca6dbdSKonstantin Belousov bool pulse; 70*03ca6dbdSKonstantin Belousov }; 71*03ca6dbdSKonstantin Belousov #define OBJ_TO_EVENT(obj) __containerof(obj, struct ntsync_obj_event, obj) 72*03ca6dbdSKonstantin Belousov 73*03ca6dbdSKonstantin Belousov struct ntsync_wait_state { 74*03ca6dbdSKonstantin Belousov struct ntsync_wait_args *nwa; 75*03ca6dbdSKonstantin Belousov struct ntsync_priv *owner; 76*03ca6dbdSKonstantin Belousov struct ntsync_obj_waiter waiters[NTSYNC_MAX_WAIT_COUNT + 1]; 77*03ca6dbdSKonstantin Belousov int fds[NTSYNC_MAX_WAIT_COUNT]; 78*03ca6dbdSKonstantin Belousov struct file *fps[NTSYNC_MAX_WAIT_COUNT]; 79*03ca6dbdSKonstantin Belousov struct file *fp_alert; 80*03ca6dbdSKonstantin Belousov int obj_count; 81*03ca6dbdSKonstantin Belousov struct ntsync_obj *objs[NTSYNC_MAX_WAIT_COUNT + 1]; 82*03ca6dbdSKonstantin Belousov struct ntsync_obj_event *alert_event; 83*03ca6dbdSKonstantin Belousov sbintime_t sb; 84*03ca6dbdSKonstantin Belousov int error; 85*03ca6dbdSKonstantin Belousov int index; 86*03ca6dbdSKonstantin Belousov bool any; 87*03ca6dbdSKonstantin Belousov bool all; 88*03ca6dbdSKonstantin Belousov bool ready; 89*03ca6dbdSKonstantin Belousov }; 90*03ca6dbdSKonstantin Belousov 91*03ca6dbdSKonstantin Belousov struct ntsync_priv { 92*03ca6dbdSKonstantin Belousov struct mtx lock; 93*03ca6dbdSKonstantin Belousov unsigned objs_cnt; 94*03ca6dbdSKonstantin Belousov bool closed; 95*03ca6dbdSKonstantin Belousov }; 96*03ca6dbdSKonstantin Belousov 97*03ca6dbdSKonstantin Belousov #define NTSYNC_PRIV_LOCK(priv) mtx_lock(&priv->lock) 98*03ca6dbdSKonstantin Belousov #define NTSYNC_PRIV_UNLOCK(priv) mtx_unlock(&priv->lock) 99*03ca6dbdSKonstantin Belousov #define NTSYNC_PRIV_ASSERT(priv) mtx_assert(&priv->lock, MA_OWNED) 100*03ca6dbdSKonstantin Belousov 101*03ca6dbdSKonstantin Belousov extern struct cdevsw ntsync_cdevsw; 102*03ca6dbdSKonstantin Belousov 103*03ca6dbdSKonstantin Belousov struct file; 104*03ca6dbdSKonstantin Belousov struct thread; 105*03ca6dbdSKonstantin Belousov int ntsync_sem_release(struct thread *td, struct file *fp, uint32_t *val); 106*03ca6dbdSKonstantin Belousov int ntsync_sem_read(struct thread *td, struct file *fp, 107*03ca6dbdSKonstantin Belousov struct ntsync_sem_args *a); 108*03ca6dbdSKonstantin Belousov int ntsync_mutex_unlock(struct thread *td, struct file *fp, 109*03ca6dbdSKonstantin Belousov struct ntsync_mutex_args *a); 110*03ca6dbdSKonstantin Belousov int ntsync_mutex_kill(struct thread *td, struct file *fp, uint32_t val); 111*03ca6dbdSKonstantin Belousov int ntsync_mutex_read(struct thread *td, struct file *fp, 112*03ca6dbdSKonstantin Belousov struct ntsync_mutex_args *a, bool *doco); 113*03ca6dbdSKonstantin Belousov int ntsync_event_set(struct thread *td, struct file *fp, uint32_t *val); 114*03ca6dbdSKonstantin Belousov int ntsync_event_reset(struct thread *td, struct file *fp, uint32_t *val); 115*03ca6dbdSKonstantin Belousov int ntsync_event_pulse(struct thread *td, struct file *fp, uint32_t *val); 116*03ca6dbdSKonstantin Belousov int ntsync_event_read(struct thread *td, struct file *fp, 117*03ca6dbdSKonstantin Belousov struct ntsync_event_args *a); 118*03ca6dbdSKonstantin Belousov 119*03ca6dbdSKonstantin Belousov #endif 120