xref: /freebsd/sys/dev/hwt/hwt_backend.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 #ifndef _DEV_HWT_HWT_BACKEND_H_
30 #define _DEV_HWT_HWT_BACKEND_H_
31 
32 struct hwt_backend_ops {
33 	int (*hwt_backend_init)(struct hwt_context *);
34 	int (*hwt_backend_deinit)(struct hwt_context *);
35 	int (*hwt_backend_configure)(struct hwt_context *, int cpu_id,
36 	    int thread_id);
37 	int (*hwt_backend_svc_buf)(struct hwt_context *, void *data,
38 	    size_t data_size, int data_version);
39 	void (*hwt_backend_enable)(struct hwt_context *, int cpu_id);
40 	void (*hwt_backend_disable)(struct hwt_context *, int cpu_id);
41 	int (*hwt_backend_read)(struct hwt_vm *, int *ident,
42 	    vm_offset_t *offset, uint64_t *data);
43 	void (*hwt_backend_stop)(struct hwt_context *);
44 	/* For backends that are tied to local CPU registers */
45 	int (*hwt_backend_enable_smp)(struct hwt_context *);
46 	int (*hwt_backend_disable_smp)(struct hwt_context *);
47 	/* Allocation and initialization of backend-specific thread data. */
48 	int (*hwt_backend_thread_alloc)(struct hwt_thread *);
49 	void (*hwt_backend_thread_free)(struct hwt_thread *);
50 	/* Debugging only. */
51 	void (*hwt_backend_dump)(int cpu_id);
52 };
53 
54 struct hwt_backend {
55 	const char			*name;
56 	struct hwt_backend_ops		*ops;
57 	/* buffers require kernel virtual addresses */
58 	bool				kva_req;
59 };
60 
61 int hwt_backend_init(struct hwt_context *ctx);
62 void hwt_backend_deinit(struct hwt_context *ctx);
63 int hwt_backend_configure(struct hwt_context *ctx, int cpu_id, int thread_id);
64 void hwt_backend_enable(struct hwt_context *ctx, int cpu_id);
65 void hwt_backend_disable(struct hwt_context *ctx, int cpu_id);
66 void hwt_backend_enable_smp(struct hwt_context *ctx);
67 void hwt_backend_disable_smp(struct hwt_context *ctx);
68 void hwt_backend_dump(struct hwt_context *ctx, int cpu_id);
69 int hwt_backend_read(struct hwt_context *ctx, struct hwt_vm *vm, int *ident,
70     vm_offset_t *offset, uint64_t *data);
71 int hwt_backend_register(struct hwt_backend *);
72 int hwt_backend_unregister(struct hwt_backend *);
73 void hwt_backend_stop(struct hwt_context *);
74 int hwt_backend_svc_buf(struct hwt_context *ctx, void *data, size_t data_size,
75     int data_version);
76 struct hwt_backend * hwt_backend_lookup(const char *name);
77 int hwt_backend_thread_alloc(struct hwt_context *ctx, struct hwt_thread *);
78 void hwt_backend_thread_free(struct hwt_thread *);
79 
80 void hwt_backend_load(void);
81 void hwt_backend_unload(void);
82 
83 #define	HWT_BACKEND_LOCK()		mtx_lock(&hwt_backend_mtx)
84 #define	HWT_BACKEND_UNLOCK()		mtx_unlock(&hwt_backend_mtx)
85 
86 #endif /* !_DEV_HWT_HWT_BACKEND_H_ */
87 
88