xref: /linux/include/uapi/linux/user_events.h (revision ad584d73a22b2f6e6b4c928956fdece5c44cdb3e)
1e5a26a40SBeau Belgrave /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2e5a26a40SBeau Belgrave /*
3e5a26a40SBeau Belgrave  * Copyright (c) 2021-2022, Microsoft Corporation.
4e5a26a40SBeau Belgrave  *
5e5a26a40SBeau Belgrave  * Authors:
6e5a26a40SBeau Belgrave  *   Beau Belgrave <beaub@linux.microsoft.com>
7e5a26a40SBeau Belgrave  */
8e5a26a40SBeau Belgrave #ifndef _UAPI_LINUX_USER_EVENTS_H
9e5a26a40SBeau Belgrave #define _UAPI_LINUX_USER_EVENTS_H
10e5a26a40SBeau Belgrave 
11e5a26a40SBeau Belgrave #include <linux/types.h>
12e5a26a40SBeau Belgrave #include <linux/ioctl.h>
13e5a26a40SBeau Belgrave 
14e5a26a40SBeau Belgrave #define USER_EVENTS_SYSTEM "user_events"
15*64805e40SBeau Belgrave #define USER_EVENTS_MULTI_SYSTEM "user_events_multi"
16e5a26a40SBeau Belgrave #define USER_EVENTS_PREFIX "u:"
17e5a26a40SBeau Belgrave 
18e5a26a40SBeau Belgrave /* Create dynamic location entry within a 32-bit value */
19e5a26a40SBeau Belgrave #define DYN_LOC(offset, size) ((size) << 16 | (offset))
20e5a26a40SBeau Belgrave 
215dbd04edSBeau Belgrave /* List of supported registration flags */
225dbd04edSBeau Belgrave enum user_reg_flag {
235dbd04edSBeau Belgrave 	/* Event will not delete upon last reference closing */
245dbd04edSBeau Belgrave 	USER_EVENT_REG_PERSIST		= 1U << 0,
255dbd04edSBeau Belgrave 
26*64805e40SBeau Belgrave 	/* Event will be allowed to have multiple formats */
27*64805e40SBeau Belgrave 	USER_EVENT_REG_MULTI_FORMAT	= 1U << 1,
28*64805e40SBeau Belgrave 
295dbd04edSBeau Belgrave 	/* This value or above is currently non-ABI */
30*64805e40SBeau Belgrave 	USER_EVENT_REG_MAX		= 1U << 2,
315dbd04edSBeau Belgrave };
325dbd04edSBeau Belgrave 
33e5a26a40SBeau Belgrave /*
34e5a26a40SBeau Belgrave  * Describes an event registration and stores the results of the registration.
35e5a26a40SBeau Belgrave  * This structure is passed to the DIAG_IOCSREG ioctl, callers at a minimum
36e5a26a40SBeau Belgrave  * must set the size and name_args before invocation.
37e5a26a40SBeau Belgrave  */
38e5a26a40SBeau Belgrave struct user_reg {
39e5a26a40SBeau Belgrave 
40e5a26a40SBeau Belgrave 	/* Input: Size of the user_reg structure being used */
41e5a26a40SBeau Belgrave 	__u32	size;
42e5a26a40SBeau Belgrave 
4372357590SBeau Belgrave 	/* Input: Bit in enable address to use */
4472357590SBeau Belgrave 	__u8	enable_bit;
4572357590SBeau Belgrave 
4672357590SBeau Belgrave 	/* Input: Enable size in bytes at address */
4772357590SBeau Belgrave 	__u8	enable_size;
4872357590SBeau Belgrave 
495dbd04edSBeau Belgrave 	/* Input: Flags to use, if any */
5072357590SBeau Belgrave 	__u16	flags;
5172357590SBeau Belgrave 
5272357590SBeau Belgrave 	/* Input: Address to update when enabled */
5372357590SBeau Belgrave 	__u64	enable_addr;
5472357590SBeau Belgrave 
55e5a26a40SBeau Belgrave 	/* Input: Pointer to string with event name, description and flags */
56e5a26a40SBeau Belgrave 	__u64	name_args;
57e5a26a40SBeau Belgrave 
58e5a26a40SBeau Belgrave 	/* Output: Index of the event to use when writing data */
59e5a26a40SBeau Belgrave 	__u32	write_index;
60e5a26a40SBeau Belgrave } __attribute__((__packed__));
61e5a26a40SBeau Belgrave 
62dcb8177cSBeau Belgrave /*
63dcb8177cSBeau Belgrave  * Describes an event unregister, callers must set the size, address and bit.
64dcb8177cSBeau Belgrave  * This structure is passed to the DIAG_IOCSUNREG ioctl to disable bit updates.
65dcb8177cSBeau Belgrave  */
66dcb8177cSBeau Belgrave struct user_unreg {
67dcb8177cSBeau Belgrave 	/* Input: Size of the user_unreg structure being used */
68dcb8177cSBeau Belgrave 	__u32	size;
69dcb8177cSBeau Belgrave 
70dcb8177cSBeau Belgrave 	/* Input: Bit to unregister */
71dcb8177cSBeau Belgrave 	__u8	disable_bit;
72dcb8177cSBeau Belgrave 
73dcb8177cSBeau Belgrave 	/* Input: Reserved, set to 0 */
74dcb8177cSBeau Belgrave 	__u8	__reserved;
75dcb8177cSBeau Belgrave 
76dcb8177cSBeau Belgrave 	/* Input: Reserved, set to 0 */
77dcb8177cSBeau Belgrave 	__u16	__reserved2;
78dcb8177cSBeau Belgrave 
79dcb8177cSBeau Belgrave 	/* Input: Address to unregister */
80dcb8177cSBeau Belgrave 	__u64	disable_addr;
81dcb8177cSBeau Belgrave } __attribute__((__packed__));
82dcb8177cSBeau Belgrave 
83e5a26a40SBeau Belgrave #define DIAG_IOC_MAGIC '*'
84e5a26a40SBeau Belgrave 
85e5a26a40SBeau Belgrave /* Request to register a user_event */
86e5a26a40SBeau Belgrave #define DIAG_IOCSREG _IOWR(DIAG_IOC_MAGIC, 0, struct user_reg *)
87e5a26a40SBeau Belgrave 
88e5a26a40SBeau Belgrave /* Request to delete a user_event */
89e5a26a40SBeau Belgrave #define DIAG_IOCSDEL _IOW(DIAG_IOC_MAGIC, 1, char *)
90e5a26a40SBeau Belgrave 
91dcb8177cSBeau Belgrave /* Requests to unregister a user_event */
92dcb8177cSBeau Belgrave #define DIAG_IOCSUNREG _IOW(DIAG_IOC_MAGIC, 2, struct user_unreg*)
93dcb8177cSBeau Belgrave 
94e5a26a40SBeau Belgrave #endif /* _UAPI_LINUX_USER_EVENTS_H */
95