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