1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22/*
23 * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
24 */
25
26#ifndef	_SYS_SYSEVENT_IMPL_H
27#define	_SYS_SYSEVENT_IMPL_H
28
29#include <sys/nvpair.h>
30#include <sys/id_space.h>
31#include <sys/door.h>
32
33#ifdef	__cplusplus
34extern "C" {
35#endif
36
37typedef uint64_t se_data_t;
38
39/*
40 * The following data structure assist in loading and extracting event
41 * header and attribute data into contiguous memory.  Access to all typed
42 * data done so on 64-bit boundaries.  *Do Not* alter any of the structures
43 * defined below without thorough thought and testing.
44 */
45
46/* Attribute name */
47typedef struct se_name {
48	int32_t		name_sz;
49	int32_t		name_pad;
50	se_data_t	name;	/* 64-bit aligned offset */
51} se_name_t;
52
53/* Attribute value */
54typedef struct se_value {
55	int32_t		value_type;	/* data type */
56	int32_t		value_sz;
57	se_data_t	value;		/* data value - 64-bit aligned offset */
58} se_value_t;
59
60/* sysevent internal attribute name-value pair stored in contiguous memory */
61typedef struct sysevent_attr_impl {
62	int32_t		se_attr_sz;	/* Size of attribute data */
63	int32_t		se_attr_pad;	/* pad */
64	se_data_t	se_attr_name;	/* name of data attribute */
65	se_data_t	se_attr_val;	/* value and type of data */
66} sysevent_attr_impl_t;
67
68/* Attribute list states */
69#define	ATTR_DETACHED	0
70#define	ATTR_ATTACHED	1
71
72/*
73 * The following type definitions describe a sysevent object that is
74 * generated by a call to sysevent_alloc and sent to userland.
75 */
76
77/*
78 * sysevent event header information -
79 *	contained in every event generated.  The header and the event
80 *	must remain 64-bit aligned.  The header, up to the attribute
81 *	offset, can be contained in a single cache line.
82 */
83typedef struct sysevent_hdr {
84	sysevent_id_t	se_id;		/* unique identifier */
85	uint32_t	se_version;	/* version of this data structure */
86	uint32_t	se_flag;
87	uint32_t	se_class;	/* event class id - reserved */
88	uint32_t	se_subclass;	/* event subclass id - reserved */
89	int32_t		se_payload_sz;	/* size of attr data + strings */
90	uint16_t	se_subclass_off; /* offset to subclass string */
91	uint16_t	se_pub_off;	/* offset to publisher string */
92	uint64_t	se_attr_off;	/* pointer or offset to attr data */
93} sysevent_hdr_t;
94
95/* sysevent event buffer - 64-bit aligned offsets */
96typedef struct sys_event_impl {
97	sysevent_hdr_t	se_header;
98	se_data_t	se_class_name;	/* class string in contig memory */
99	se_data_t	se_subclass_name; /* subclass string in contig memory */
100	se_data_t	se_pub;		/* publisher string in contig mem */
101	se_data_t	se_attr_buf;	/* contiguous attribute memory	*/
102} sysevent_impl_t;
103
104/* Helpful defines */
105#define	seh_version	se_header.se_version
106#define	seh_class	se_header.se_class
107#define	seh_subclass	se_header.se_subclass
108#define	seh_seq		se_header.se_id.eid_seq
109#define	seh_time	se_header.se_id.eid_ts
110#define	seh_subclass_off se_header.se_subclass_off
111#define	seh_pub_off	se_header.se_pub_off
112#define	seh_attr_off	se_header.se_attr_off
113#define	seh_payload_sz	se_header.se_payload_sz
114#define	seh_flag	se_header.se_flag
115
116/* Event buffer version */
117#define	SYS_EVENT_VERSION	0
118
119/* Event buffer flags */
120#define	SE_PACKED_BUF	1
121
122#define	SYSEVENT_IMPL(ev)	((sysevent_impl_t *)(void *)(ev))
123#define	SE_VERSION(ev)		(SYSEVENT_IMPL(ev)->seh_version)
124#define	SE_CLASS(ev)		(SYSEVENT_IMPL(ev)->seh_class)
125#define	SE_SUBCLASS(ev)		(SYSEVENT_IMPL(ev)->seh_subclass)
126#define	SE_SEQ(ev)		(SYSEVENT_IMPL(ev)->seh_seq)
127#define	SE_TIME(ev)		(SYSEVENT_IMPL(ev)->seh_time)
128#define	SE_SUBCLASS_OFF(ev)	(SYSEVENT_IMPL(ev)->seh_subclass_off)
129#define	SE_PUB_OFF(ev)		(SYSEVENT_IMPL(ev)->seh_pub_off)
130#define	SE_PAYLOAD_SZ(ev)	(SYSEVENT_IMPL(ev)->seh_payload_sz)
131#define	SE_FLAG(ev)		(SYSEVENT_IMPL(ev)->seh_flag)
132#define	SE_SIZE(ev)		(sizeof (sysevent_impl_t) + SE_PAYLOAD_SZ(ev))
133#define	SE_CLASS_NAME(ev)	((char *)&(SYSEVENT_IMPL(ev)->se_class_name))
134#define	SE_SUBCLASS_NAME(ev)	((char *)((caddr_t)(ev) + SE_SUBCLASS_OFF(ev)))
135#define	SE_PUB_NAME(ev)		((char *)((caddr_t)(ev) + SE_PUB_OFF(ev)))
136
137/*
138 * Attribute data can be stored in contiguous memory or
139 * as a list of attribute data elements.  The storage format is determined
140 * by the SE_PACKED_BUF flag in the event buffer flags.
141 *
142 */
143
144/* 64-bit boundary alignment function */
145#define	SE_ALIGN(x)	((((ulong_t)x) + 7ul) & ~7ul)
146
147/* Access to unpacked attribute list */
148#define	SE_ATTR_PTR(ev)		(SYSEVENT_IMPL(ev)->seh_attr_off)
149
150/* Offset to packed attribute data */
151#define	SE_ATTR_OFF(ev)	SE_PUB_OFF(ev) + SE_ALIGN(strlen(SE_PUB_NAME(ev)) + 1)
152
153/* syseventd door */
154#define	LOGEVENT_DOOR_UPCALL	"/var/run/sysevent_door"
155
156/*
157 * door upcall data structures
158 */
159typedef struct log_event_upcall_arg {
160	int32_t retcode;
161	int32_t	pad;
162	sysevent_impl_t buf;
163} log_event_upcall_arg_t;
164
165typedef struct log_eventq {
166	struct log_eventq	*next;
167	log_event_upcall_arg_t	arg;
168} log_eventq_t;
169
170/* Syseventd Channel structures */
171
172#define	MAX_CHAN	256	/* Maximum channels per system */
173#define	MAX_SUBSCRIBERS	100	/* Maximum subscribers per channel */
174#define	MAX_PUBLISHERS	1	/* Maximum publishers per channel */
175
176/*
177 * Channel-based subscription structures
178 */
179
180/* Class hashing defines */
181#define	CLASS_HASH_SZ	63
182#define	CLASS_HASH(class_name)	((hash_func(class_name) \
183				% CLASS_HASH_SZ) + 1)
184#define	CHAN_HASH_SZ	32
185
186typedef struct subclass_lst {
187	struct subclass_lst	*sl_next;
188	char			*sl_name;
189	uchar_t			sl_num[MAX_SUBSCRIBERS + 1];
190} subclass_lst_t;
191
192typedef struct class_lst {
193	struct class_lst	*cl_next;
194	char			*cl_name;
195	struct subclass_lst	*cl_subclass_list;
196} class_lst_t;
197
198/* User/Kernel Structure to pass event registration modctl data */
199typedef struct se_pubsub {
200	uint32_t	ps_buflen;
201	uint32_t	ps_channel_name_len;
202	uint32_t	ps_id;
203	uint32_t	ps_op;
204	uint32_t	ps_type;
205} se_pubsub_t;
206
207/* op defines */
208#define	SE_REGISTER		0
209#define	SE_UNREGISTER		1
210#define	SE_CLEANUP		2
211#define	SE_OPEN_REGISTRATION	3
212#define	SE_CLOSE_REGISTRATION	4
213#define	SE_BIND_REGISTRATION	5
214#define	SE_UNBIND_REGISTRATION	6
215#define	SE_GET_REGISTRATION	7
216
217/* type defines */
218#define	SUBSCRIBER	0
219#define	PUBLISHER	1
220
221/* nvpair names */
222#define	CLASS_NAME	"class"
223
224#ifdef	_KERNEL
225
226typedef struct sysevent_channel_descriptor {
227	char   *scd_channel_name;	/* Name of channel */
228	struct sysevent_channel_descriptor *scd_next;
229	int    scd_ref_cnt;		/* Reference count of channel opens */
230	id_space_t *scd_subscriber_cache;	/* cache of subscriber ids */
231	id_space_t *scd_publisher_cache;	/* cache of publisher ids */
232	uchar_t scd_subscriber_ids[MAX_SUBSCRIBERS + 1]; /* used sub ids */
233	uchar_t scd_publisher_ids[MAX_PUBLISHERS + 1];	/* used  pub ids */
234	class_lst_t *scd_class_list_tbl[CLASS_HASH_SZ + 1];
235} sysevent_channel_descriptor_t;
236
237/*
238 * log_sysevent private interfaces
239 */
240extern void log_event_init(void);
241extern void log_sysevent_flushq(int, uint_t);
242extern int log_sysevent_filename(char *);
243extern int log_usr_sysevent(sysevent_t *, int, sysevent_id_t *);
244extern int log_sysevent_copyout_data(sysevent_id_t *, size_t, caddr_t);
245extern int log_sysevent_free_data(sysevent_id_t *);
246extern int log_sysevent_register(char *, char *, se_pubsub_t *);
247extern uint64_t log_sysevent_new_id(void);
248
249/*
250 * Structures and definitions for general purpose event channels
251 */
252
253/* Limits */
254#define	EVCH_MAX_CHANNELS		1024
255#define	EVCH_MAX_BINDS_PER_CHANNEL	512
256#define	EVCH_MAX_SUBSCRIPTIONS		32
257#define	EVCH_SUBPOOLFACT		8
258#define	EVCH_DEFAULT_EVENTS		2000
259#define	EVCH_MAX_TRY_DELIVERY		3
260
261/* Linkage element for evch_dlist_t lists */
262typedef struct evch_dlelem {
263	struct evch_dlelem	*dl_next;
264	struct evch_dlelem	*dl_prev;
265} evch_dlelem_t;
266
267/* List head */
268typedef struct {
269	evch_dlelem_t	dh_head;
270	int		dh_count;
271} evch_dlist_t;
272
273/* Placeholder for elements in a evch_squeue_t queue */
274typedef struct evch_qelem {
275	struct evch_qelem	*q_next;
276	void			*q_objref;
277	size_t			q_objsize;
278} evch_qelem_t;
279
280/* Queue head data */
281typedef struct {
282	evch_qelem_t	*sq_head;
283	evch_qelem_t	*sq_tail;
284	uint32_t	sq_count;
285	uint32_t	sq_highwm;
286} evch_squeue_t;
287
288/*
289 * Defines for event queue routines
290 */
291#define	EVQ_IGNORE	1
292#define	EVQ_DELIVER	2
293
294#define	EVQ_CONT	0
295#define	EVQ_AGAIN	1
296#define	EVQ_SLEEP	2
297
298/* Call back routine typedefs */
299typedef int (*filter_f)(void *, void *);
300typedef int (*deliver_f)(void *, void *);
301typedef int (*kerndlv_f)(void *, void *);
302typedef void (*destr_f)(void *, void *);
303typedef int (*compare_f)(evch_dlelem_t *, char *);
304
305/*
306 * Event structure handled by evch_evq_* functions. Sysevent type events are
307 * stored as the payload.
308 */
309typedef struct {
310	uint32_t	ge_size;	/* Total size of event structure */
311	uint32_t	ge_refcount;	/* No of queues event is linked to */
312	destr_f		ge_destruct;	/* Destructor for event structure */
313	uint32_t	*ge_dstcookie;	/* Cookie for destructor function */
314	uchar_t		ge_payload[1];	/* Placeholder for event data */
315} evch_gevent_t;
316
317/*
318 * Event queue descriptor
319 */
320typedef struct {
321	evch_squeue_t	eq_eventq;	/* Protected by eq_dtmutex */
322	kt_did_t	eq_thrid;	/* Id delivery thread */
323	kmutex_t	eq_queuemx;	/* Protect. of this struct and ev q */
324	kcondvar_t	eq_thrsleepcv;	/* Delivery thread sleeps on empty q */
325	int		eq_dactive;	/* Event delivery is in progress */
326	kcondvar_t	eq_dactivecv;	/* Unsubscr. has to wait on this */
327	evch_dlist_t	eq_subscr;	/* Chain of all evch_evqsub_t */
328	uint32_t	eq_nsleep;	/* Statistic: Publisher set to sleep */
329	int		eq_holdmode;	/* Hold event delivery */
330	evch_gevent_t	*eq_curevent;	/* Event currently beeing delivered */
331	evch_qelem_t	*eq_nextev;	/* For iterating over events in a q */
332	kcondvar_t	eq_onholdcv;	/* To signal hold mode of deliv. thr. */
333	uchar_t		eq_tabortflag;	/* Request to abort delivery thread */
334} evch_eventq_t;
335
336/*
337 * Event queue per subscriber structure
338 */
339typedef struct {
340	evch_dlelem_t	su_link;
341	filter_f	su_filter;	/* Event filter function pointer */
342	void		*su_fcookie;	/* cookie for event filter */
343	deliver_f	su_callb;	/* Event delivery callback */
344	void		*su_cbcookie;	/* callback cookie */
345} evch_evqsub_t;
346
347/* Eveny delivery type */
348#define	EVCH_DELKERN		1	/* Kernel event delivery */
349#define	EVCH_DELDOOR		2	/* User event delivery via doors */
350
351/*
352 * Per channel subscriber data structure. Chained in a linked list to an
353 * event channel and to a binding.
354 */
355typedef struct chsubd {
356	evch_dlelem_t	sd_link;	/* Links all subscribers of this ch. */
357	struct chsubd	*sd_subnxt;	/* Links all subscr. for a binding */
358	char		*sd_ident;	/* Subscriber identifier */
359	evch_eventq_t	*sd_queue;	/* Event queue for this subscriber */
360	evch_evqsub_t	*sd_msub;	/* Main event queue subscr. */
361	char		*sd_classname;	/* Filter criteria */
362	size_t		sd_clnsize;	/* Size of sd_classname buffer */
363	evch_evqsub_t	*sd_ssub;	/* Subscriber queue subscr. */
364	int		sd_type;	/* Type of event delivery */
365	kerndlv_f	sd_callback;	/* Callback for kernel delivery */
366	void		*sd_cbcookie;	/* Cookie for kernel delivery */
367	door_handle_t	sd_door;	/* Door handle for user delivery */
368	int		sd_active;	/* Subscription is in use indicator */
369	pid_t		sd_pid;		/* PID of subscribing process */
370	uint8_t		sd_persist;	/* Persistent user land subscription */
371	uint8_t		sd_dump;	/* Dump with sysevent_evc_walk_* */
372} evch_subd_t;
373
374/*
375 * General purpose event channel descriptor structure. This is the main
376 * structure for event subscribing, publishing, delivery to/from an event
377 * channel.
378 */
379typedef struct {
380	evch_dlelem_t	ch_link;	/* Must be first elem. of structure */
381	char		*ch_name;	/* Channel name */
382	size_t		ch_namelen;	/* Length of channel name buffer */
383	kmutex_t	ch_mutex;	/* To protect this structure */
384	evch_eventq_t	*ch_queue;	/* Publisher event queue */
385	evch_dlist_t	ch_subscr;	/* List of subscr. data (evch_subd_t) */
386	uint32_t	ch_bindings;	/* No of bindings to this channel */
387	int		ch_maxbinds;	/* Maximum number of binds */
388	uid_t		ch_uid;		/* Creators effective user id */
389	gid_t		ch_gid;		/* Creators effective group id */
390	kmutex_t	ch_pubmx;	/* Mutex for ch_pubcv and ch_nevents */
391	kcondvar_t	ch_pubcv;	/* To set publisher to sleep */
392	uint32_t	ch_nevents;	/* Current number of events */
393	uint32_t	ch_maxev;	/* Maximum number of events */
394	int		ch_maxsubscr;	/* Maximum number of subscriptions */
395	int		ch_holdpend;	/* Hold pending events mode if != 0 */
396	time_t		ch_ctime;	/* Channel creation time */
397	nvlist_t	*ch_propnvl;	/* Channel properties nvlist */
398	int64_t		ch_propnvlgen;	/* Properties generation number */
399} evch_chan_t;
400
401/*
402 * Channel binding structure. Allocated per binding to a channel. Protected
403 * by locking the channel structure
404 */
405typedef struct {
406	evch_chan_t	*bd_channel;
407	evch_subd_t	*bd_sublst;	/* chain of all subscriptions */
408} evch_bind_t;
409
410/*
411 * Structure to keep a snapshot of all events of a channel
412 */
413typedef struct {
414	evch_eventq_t	*sn_queue;	/* Event queue with snapshot of ev's */
415	sysevent_impl_t	*sn_nxtev;	/* Pointer to find next event */
416} evchanq_t;
417
418/* Project private interfaces */
419extern evchan_t *evch_usrchanopen(const char *name, uint32_t flags, int *err);
420extern void evch_usrchanclose(evchan_t *cbp);
421extern sysevent_impl_t *evch_usrallocev(size_t evsize, uint32_t flags);
422extern void evch_usrfreeev(sysevent_impl_t *ev);
423extern int evch_usrpostevent(evchan_t *bp, sysevent_impl_t *ev, uint32_t flags);
424extern int evch_usrsubscribe(evchan_t *bp, const char *sid, const char *class,
425    int d, uint32_t flags);
426extern int evch_usrcontrol_set(evchan_t *bp, int cmd, uint32_t value);
427extern int evch_usrcontrol_get(evchan_t *bp, int cmd, uint32_t *value);
428extern void evch_usrunsubscribe(evchan_t *bp, const char *subid, uint32_t flag);
429extern int evch_usrgetchnames(char *buf, size_t size);
430extern int evch_usrgetchdata(char *chname, void *buf, size_t size);
431extern void evch_usrsetpropnvl(evchan_t *bp, nvlist_t *nvl);
432extern int evch_usrgetpropnvl(evchan_t *bp, nvlist_t **nvlp, int64_t *genp);
433
434extern void sysevent_evc_init();
435extern void sysevent_evc_thrinit();
436extern evchanq_t *sysevent_evc_walk_init(evchan_t *, char *);
437extern sysevent_t *sysevent_evc_walk_step(evchanq_t *);
438extern void sysevent_evc_walk_fini(evchanq_t *);
439extern char *sysevent_evc_event_attr(sysevent_t *, size_t *);
440
441#endif /* _KERNEL */
442
443/*
444 * Structures and limits to deliver channel data to syseventadm
445 */
446#define	EVCH_MAX_DATA_SIZE	(1024 * 1024)
447
448typedef struct {
449	uint32_t	sb_nextoff;	/* Offset to next subscr info struct */
450	uint32_t	sb_stroff;	/* Offset to strings */
451	uint32_t	sb_clnamoff;	/* Offset of class in sb_strings */
452	uint32_t	sb_pid;		/* Subscriber process id */
453	uint32_t	sb_nevents;	/* Current no of event in sub q */
454	uint32_t	sb_evhwm;	/* High watermark of sub q */
455	uint32_t	sb_persist;	/* != 0 if subscription persists */
456	uint32_t	sb_status;	/* != 0 if subscription is inactive */
457	uint32_t	sb_active;	/* > 0 if subscription is in use */
458	uint32_t	sb_dump;	/* != 0 if sub will be dumped */
459	char		sb_strings[1];	/* String space for subid and class */
460} sev_subinfo_t;
461
462typedef struct {
463	uint32_t	cd_version;	/* Version of this structure */
464	uint32_t	cd_suboffs;	/* Offset of subscriber info struct */
465	uint64_t	cd_ctime;	/* Creation time */
466	uint32_t	cd_uid;		/* User id */
467	uint32_t	cd_gid;		/* Owner group id */
468	uint32_t	cd_perms;	/* Permission bits */
469	uint32_t	cd_maxev;	/* Max number of events */
470	uint32_t	cd_evhwm;	/* High watermark of main event queue */
471	uint32_t	cd_nevents;	/* current no of events in main ev q */
472	uint32_t	cd_maxsub;	/* Max number of subscriptions */
473	uint32_t	cd_nsub;	/* Current number of subscriptions */
474	uint32_t	cd_maxbinds;	/* Max number of binds */
475	uint32_t	cd_nbinds;	/* Current number of binds */
476	uint32_t	cd_holdpend;	/* != 0 when HOLDPEND mode is set */
477	uint32_t	cd_limev;	/* Limit of events per channel */
478	sev_subinfo_t	cd_subinfo[1];	/* Per subscriber data */
479} sev_chinfo_t;
480
481/*
482 * Project private flags for sysevent_evc_subscribe. Bits 0 to 7 are reserved
483 * for the consolidation private interface, so we must use bits 8-15 here.
484 */
485#define	EVCH_SUB_DUMP		(0x01 << 8)
486
487/*
488 * Permission flags
489 */
490#define	EVCH_PUB		0x0004	/* wants to publish events */
491#define	EVCH_SUB		0x0008	/* wants to subscribe to channel */
492
493#define	EVCH_SUBU		0x0001	/* Subscribing allowed for uid */
494#define	EVCH_PUBU		0x0002	/* Publishing allowed for uid */
495#define	EVCH_PSUSR		0x0003	/* EVCH_SUBU + EVCH_PUBU */
496#define	EVCH_SUBG		0x0004	/* Subscribing allowed for gid */
497#define	EVCH_PUBG		0x0008	/* Publishing allowed for gid */
498#define	EVCH_PSGRP		0x000C	/* EVCH_SUBG + EVCH_PUBG */
499#define	EVCH_SUBO		0x0010	/* Subscribing allowed to all users */
500#define	EVCH_PUBO		0x0020	/* Publishing allowed to all users */
501#define	EVCH_PSOTH		0x0030	/* EVCH_SUBO + EVCH_PUBO */
502#define	EVCH_PSALL		0x003f	/* Mask of all permission bits */
503
504/*
505 * Sysevent driver ioctls
506 */
507#define	SEV_BASE		0x53455600
508#define	SEV_PUBLISH		SEV_BASE | 0x01
509#define	SEV_CHAN_OPEN		SEV_BASE | 0x02
510#define	SEV_CHAN_CONTROL	SEV_BASE | 0x03
511#define	SEV_SUBSCRIBE		SEV_BASE | 0x04
512#define	SEV_UNSUBSCRIBE		SEV_BASE | 0x05
513#define	SEV_CHANNAMES		SEV_BASE | 0x06
514#define	SEV_CHANDATA		SEV_BASE | 0x07
515#define	SEV_SETPROPNVL		SEV_BASE | 0x08
516#define	SEV_GETPROPNVL		SEV_BASE | 0x09
517
518#define	DEVSYSEVENT	"/dev/sysevent"
519#define	DEVICESYSEVENT	"/devices/pseudo/sysevent@0:sysevent"
520
521/*
522 * Maximum allowed binding handles
523 * It's a limit required by bitmap algorithm design (see sys/bitmap.h).
524 * Use pack(4) to make sizeof structs be the same on x86 and amd64.
525 */
526#define	SYSEVENT_MINOR_MAX	SHRT_MAX
527
528#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
529#pragma pack(4)
530#endif
531
532/* copyin/copyout data */
533typedef struct box {
534	uint64_t name;		/* pointer to something */
535	uint32_t len;
536} sev_box_t;
537
538typedef struct bind_args {
539	sev_box_t chan_name;
540	uint32_t flags;
541} sev_bind_args_t;
542
543typedef struct control_args {
544	uint32_t cmd;
545	uint32_t value;
546} sev_control_args_t;
547
548typedef struct publish_args {
549	sev_box_t ev;
550	uint32_t flags;
551} sev_publish_args_t;
552
553typedef struct subscribe_args {
554	sev_box_t sid;
555	sev_box_t class_info;
556	int door_desc;
557	uint32_t flags;
558} sev_subscribe_args_t;
559
560typedef struct unsubscribe_args {
561	sev_box_t sid;
562} sev_unsubscribe_args_t;
563
564typedef struct chandata {
565	sev_box_t in_data;
566	sev_box_t out_data;
567} sev_chandata_args_t;
568
569typedef struct propnvl_args {
570	sev_box_t packednvl;	/* input and output */
571	int64_t generation;	/* output on get operation */
572} sev_propnvl_args_t;
573
574#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
575#pragma pack()
576#endif
577
578#ifdef	__cplusplus
579}
580#endif
581
582#endif	/* _SYS_SYSEVENT_IMPL_H */
583