xref: /freebsd/sys/dev/hwt/hwt_backend.h (revision df114daef4c48548c3c2b86717612761185ae18f)
1*df114daeSRuslan Bukin /*-
2*df114daeSRuslan Bukin  * Copyright (c) 2023-2025 Ruslan Bukin <br@bsdpad.com>
3*df114daeSRuslan Bukin  *
4*df114daeSRuslan Bukin  * This work was supported by Innovate UK project 105694, "Digital Security
5*df114daeSRuslan Bukin  * by Design (DSbD) Technology Platform Prototype".
6*df114daeSRuslan Bukin  *
7*df114daeSRuslan Bukin  * Redistribution and use in source and binary forms, with or without
8*df114daeSRuslan Bukin  * modification, are permitted provided that the following conditions
9*df114daeSRuslan Bukin  * are met:
10*df114daeSRuslan Bukin  * 1. Redistributions of source code must retain the above copyright
11*df114daeSRuslan Bukin  *    notice, this list of conditions and the following disclaimer.
12*df114daeSRuslan Bukin  * 2. Redistributions in binary form must reproduce the above copyright
13*df114daeSRuslan Bukin  *    notice, this list of conditions and the following disclaimer in the
14*df114daeSRuslan Bukin  *    documentation and/or other materials provided with the distribution.
15*df114daeSRuslan Bukin  *
16*df114daeSRuslan Bukin  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17*df114daeSRuslan Bukin  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*df114daeSRuslan Bukin  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*df114daeSRuslan Bukin  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20*df114daeSRuslan Bukin  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21*df114daeSRuslan Bukin  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22*df114daeSRuslan Bukin  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23*df114daeSRuslan Bukin  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24*df114daeSRuslan Bukin  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25*df114daeSRuslan Bukin  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26*df114daeSRuslan Bukin  * SUCH DAMAGE.
27*df114daeSRuslan Bukin  */
28*df114daeSRuslan Bukin 
29*df114daeSRuslan Bukin #ifndef _DEV_HWT_HWT_BACKEND_H_
30*df114daeSRuslan Bukin #define _DEV_HWT_HWT_BACKEND_H_
31*df114daeSRuslan Bukin 
32*df114daeSRuslan Bukin struct hwt_backend_ops {
33*df114daeSRuslan Bukin 	int (*hwt_backend_init)(struct hwt_context *);
34*df114daeSRuslan Bukin 	int (*hwt_backend_deinit)(struct hwt_context *);
35*df114daeSRuslan Bukin 	int (*hwt_backend_configure)(struct hwt_context *, int cpu_id,
36*df114daeSRuslan Bukin 	    int thread_id);
37*df114daeSRuslan Bukin 	int (*hwt_backend_svc_buf)(struct hwt_context *, void *data,
38*df114daeSRuslan Bukin 	    size_t data_size, int data_version);
39*df114daeSRuslan Bukin 	void (*hwt_backend_enable)(struct hwt_context *, int cpu_id);
40*df114daeSRuslan Bukin 	void (*hwt_backend_disable)(struct hwt_context *, int cpu_id);
41*df114daeSRuslan Bukin 	int (*hwt_backend_read)(struct hwt_vm *, int *ident,
42*df114daeSRuslan Bukin 	    vm_offset_t *offset, uint64_t *data);
43*df114daeSRuslan Bukin 	void (*hwt_backend_stop)(struct hwt_context *);
44*df114daeSRuslan Bukin 	/* For backends that are tied to local CPU registers */
45*df114daeSRuslan Bukin 	int (*hwt_backend_enable_smp)(struct hwt_context *);
46*df114daeSRuslan Bukin 	int (*hwt_backend_disable_smp)(struct hwt_context *);
47*df114daeSRuslan Bukin 	/* Allocation and initialization of backend-specific thread data. */
48*df114daeSRuslan Bukin 	int (*hwt_backend_thread_alloc)(struct hwt_thread *);
49*df114daeSRuslan Bukin 	void (*hwt_backend_thread_free)(struct hwt_thread *);
50*df114daeSRuslan Bukin 	/* Debugging only. */
51*df114daeSRuslan Bukin 	void (*hwt_backend_dump)(int cpu_id);
52*df114daeSRuslan Bukin };
53*df114daeSRuslan Bukin 
54*df114daeSRuslan Bukin struct hwt_backend {
55*df114daeSRuslan Bukin 	const char			*name;
56*df114daeSRuslan Bukin 	struct hwt_backend_ops		*ops;
57*df114daeSRuslan Bukin 	/* buffers require kernel virtual addresses */
58*df114daeSRuslan Bukin 	bool				kva_req;
59*df114daeSRuslan Bukin };
60*df114daeSRuslan Bukin 
61*df114daeSRuslan Bukin int hwt_backend_init(struct hwt_context *ctx);
62*df114daeSRuslan Bukin void hwt_backend_deinit(struct hwt_context *ctx);
63*df114daeSRuslan Bukin int hwt_backend_configure(struct hwt_context *ctx, int cpu_id, int thread_id);
64*df114daeSRuslan Bukin void hwt_backend_enable(struct hwt_context *ctx, int cpu_id);
65*df114daeSRuslan Bukin void hwt_backend_disable(struct hwt_context *ctx, int cpu_id);
66*df114daeSRuslan Bukin void hwt_backend_enable_smp(struct hwt_context *ctx);
67*df114daeSRuslan Bukin void hwt_backend_disable_smp(struct hwt_context *ctx);
68*df114daeSRuslan Bukin void hwt_backend_dump(struct hwt_context *ctx, int cpu_id);
69*df114daeSRuslan Bukin int hwt_backend_read(struct hwt_context *ctx, struct hwt_vm *vm, int *ident,
70*df114daeSRuslan Bukin     vm_offset_t *offset, uint64_t *data);
71*df114daeSRuslan Bukin int hwt_backend_register(struct hwt_backend *);
72*df114daeSRuslan Bukin int hwt_backend_unregister(struct hwt_backend *);
73*df114daeSRuslan Bukin void hwt_backend_stop(struct hwt_context *);
74*df114daeSRuslan Bukin int hwt_backend_svc_buf(struct hwt_context *ctx, void *data, size_t data_size,
75*df114daeSRuslan Bukin     int data_version);
76*df114daeSRuslan Bukin struct hwt_backend * hwt_backend_lookup(const char *name);
77*df114daeSRuslan Bukin int hwt_backend_thread_alloc(struct hwt_context *ctx, struct hwt_thread *);
78*df114daeSRuslan Bukin void hwt_backend_thread_free(struct hwt_thread *);
79*df114daeSRuslan Bukin 
80*df114daeSRuslan Bukin void hwt_backend_load(void);
81*df114daeSRuslan Bukin void hwt_backend_unload(void);
82*df114daeSRuslan Bukin 
83*df114daeSRuslan Bukin #define	HWT_BACKEND_LOCK()		mtx_lock(&hwt_backend_mtx)
84*df114daeSRuslan Bukin #define	HWT_BACKEND_UNLOCK()		mtx_unlock(&hwt_backend_mtx)
85*df114daeSRuslan Bukin 
86*df114daeSRuslan Bukin #endif /* !_DEV_HWT_HWT_BACKEND_H_ */
87*df114daeSRuslan Bukin 
88