xref: /freebsd/sys/sys/hwt.h (revision df114daef4c48548c3c2b86717612761185ae18f)
1 /*-
2  * Copyright (c) 2023-2025 Ruslan Bukin <br@bsdpad.com>
3  *
4  * This work was supported by Innovate UK project 105694, "Digital Security
5  * by Design (DSbD) Technology Platform Prototype".
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  */
28 
29 /* User-visible header. */
30 
31 #include <sys/param.h>
32 #include <sys/cpuset.h>
33 #include <sys/types.h>
34 #include <sys/hwt_record.h>
35 
36 #ifndef _SYS_HWT_H_
37 #define _SYS_HWT_H_
38 
39 #define	HWT_MAGIC		0x42
40 #define	HWT_IOC_ALLOC		_IOW(HWT_MAGIC, 0x00, struct hwt_alloc)
41 #define	HWT_IOC_START		_IOW(HWT_MAGIC, 0x01, struct hwt_start)
42 #define	HWT_IOC_STOP		_IOW(HWT_MAGIC, 0x02, struct hwt_stop)
43 #define	HWT_IOC_RECORD_GET	_IOW(HWT_MAGIC, 0x03, struct hwt_record_get)
44 #define	HWT_IOC_BUFPTR_GET	_IOW(HWT_MAGIC, 0x04, struct hwt_bufptr_get)
45 #define	HWT_IOC_SET_CONFIG	_IOW(HWT_MAGIC, 0x05, struct hwt_set_config)
46 #define	HWT_IOC_WAKEUP		_IOW(HWT_MAGIC, 0x06, struct hwt_wakeup)
47 #define	HWT_IOC_SVC_BUF		_IOW(HWT_MAGIC, 0x07, struct hwt_svc_buf)
48 
49 #define	HWT_BACKEND_MAXNAMELEN	256
50 
51 #define	HWT_MODE_THREAD		1
52 #define	HWT_MODE_CPU		2
53 
54 struct hwt_alloc {
55 	size_t		bufsize;
56 	int		mode;
57 	pid_t		pid;		/* thread mode */
58 	cpuset_t	*cpu_map;	/* cpu mode only */
59 	size_t		cpusetsize;
60 	const char	*backend_name;
61 	int		*ident;
62 	int		kqueue_fd;
63 } __aligned(16);
64 
65 struct hwt_start {
66 	int		reserved;
67 } __aligned(16);
68 
69 struct hwt_stop {
70 	int		reserved;
71 } __aligned(16);
72 
73 struct hwt_wakeup {
74 	int		reserved;
75 } __aligned(16);
76 
77 struct hwt_record_user_entry {
78 	enum hwt_record_type	record_type;
79 	union {
80 		/*
81 		 * Used for MMAP, EXECUTABLE, INTERP,
82 		 * and KERNEL records.
83 		 */
84 		struct {
85 			char fullpath[MAXPATHLEN];
86 			uintptr_t addr;
87 			uintptr_t baseaddr;
88 		};
89 		/* Used for BUFFER records. */
90 		struct {
91 			int buf_id;
92 			int curpage;
93 			vm_offset_t offset;
94 		};
95 		/* Used for THREAD_* records. */
96 		int thread_id;
97 	};
98 } __aligned(16);
99 
100 struct hwt_record_get {
101 	struct hwt_record_user_entry	*records;
102 	int				*nentries;
103 	int             wait;
104 } __aligned(16);
105 
106 struct hwt_bufptr_get {
107 	int		*ident;
108 	vm_offset_t	*offset;
109 	uint64_t	*data;
110 } __aligned(16);
111 
112 struct hwt_set_config {
113 	/* Configuration of ctx. */
114 	int			pause_on_mmap;
115 
116 	/* The following passed to backend as is. */
117 	void			*config;
118 	size_t			config_size;
119 	int			config_version;
120 } __aligned(16);
121 
122 struct hwt_svc_buf {
123 	/* The following passed to backend as is. */
124 	void			*data;
125 	size_t			data_size;
126 	int			data_version;
127 } __aligned(16);
128 
129 #endif /* !_SYS_HWT_H_ */
130