- struct fileproc *p_fp; /* file data pointer */
- struct proc *p_proc; /* proc pointer */
- struct ipc_mqueue *p_mqueue; /* pset pointer */
- } kn_ptr;
- struct kevent_internal_s kn_kevent;
- int kn_sfflags; /* saved filter flags */
- int kn_hookid;
- uint16_t kn_inuse; /* inuse count */
- kn_status_t kn_status; /* status bits */
-
-#define kn_id kn_kevent.ident
-#define kn_filter kn_kevent.filter
-#define kn_flags kn_kevent.flags
-#define kn_qos kn_kevent.qos
-#define kn_udata kn_kevent.udata
-#define kn_fflags kn_kevent.fflags
-#define kn_xflags kn_kevent.xflags
-#define kn_data kn_kevent.data
-#define kn_ext kn_kevent.ext
-#define kn_fp kn_ptr.p_fp
+ struct fileproc *kn_fp; /* file data pointer */
+ struct proc *kn_proc; /* proc pointer */
+ struct ipc_mqueue *kn_mqueue; /* pset pointer */
+ struct thread_call *kn_thcall;
+ struct thread *kn_thread;
+ };
+
+ /*
+ * Mimic kevent_qos so that knote_fill_kevent code is not horrid,
+ * but with subtleties:
+ *
+ * - kevent_qos_s::filter is 16bits where ours is 8, and we use the top
+ * bits to store the real specialized filter.
+ * knote_fill_kevent* will always force the top bits to 0xff.
+ *
+ * - kevent_qos_s::xflags is not kept, kn_sfflags takes its place,
+ * knote_fill_kevent* will set xflags to 0.
+ *
+ * - kevent_qos_s::data is saved as kn_sdata and filters are encouraged
+ * to use knote_fill_kevent, knote_fill_kevent_with_sdata will copy
+ * kn_sdata as the output value.
+ *
+ * knote_fill_kevent_with_sdata() programatically asserts
+ * these aliasings are respected.
+ */
+ struct kevent_internal_s {
+ uint64_t kei_ident; /* identifier for this event */
+#ifdef __LITTLE_ENDIAN__
+ int8_t kei_filter; /* filter for event */
+ uint8_t kei_filtid; /* actual filter for event */
+#else
+ uint8_t kei_filtid; /* actual filter for event */
+ int8_t kei_filter; /* filter for event */
+#endif
+ uint16_t kei_flags; /* general flags */
+ int32_t kei_qos; /* quality of service */
+ uint64_t kei_udata; /* opaque user data identifier */
+ uint32_t kei_fflags; /* filter-specific flags */
+ uint32_t kei_sfflags; /* knote: saved fflags */
+ int64_t kei_sdata; /* knote: filter-specific saved data */
+ uint64_t kei_ext[4]; /* filter-specific extensions */
+ } kn_kevent;
+
+#define kn_id kn_kevent.kei_ident
+#define kn_filtid kn_kevent.kei_filtid
+#define kn_filter kn_kevent.kei_filter
+#define kn_flags kn_kevent.kei_flags
+#define kn_qos kn_kevent.kei_qos
+#define kn_udata kn_kevent.kei_udata
+#define kn_fflags kn_kevent.kei_fflags
+#define kn_sfflags kn_kevent.kei_sfflags
+#define kn_sdata kn_kevent.kei_sdata
+#define kn_ext kn_kevent.kei_ext