1 /* 2 * SPDX-License-Identifier: CDDL 1.0 3 * 4 * Copyright (c) 2022 Christos Margiolis <christos@FreeBSD.org> 5 * Copyright (c) 2023 The FreeBSD Foundation 6 * 7 * Portions of this software were developed by Christos Margiolis 8 * <christos@FreeBSD.org> under sponsorship from the FreeBSD Foundation. 9 */ 10 11 #ifndef _KINST_H_ 12 #define _KINST_H_ 13 14 #include <sys/dtrace.h> 15 16 typedef struct { 17 char kpd_func[DTRACE_FUNCNAMELEN]; 18 char kpd_mod[DTRACE_MODNAMELEN]; 19 int kpd_off; 20 } dtrace_kinst_probedesc_t; 21 22 #define KINSTIOC_MAKEPROBE _IOW('k', 1, dtrace_kinst_probedesc_t) 23 24 #ifdef _KERNEL 25 26 #include <sys/queue.h> 27 28 #include "kinst_isa.h" 29 30 struct kinst_probe { 31 LIST_ENTRY(kinst_probe) kp_hashnext; 32 const char *kp_func; 33 char kp_name[16]; 34 dtrace_id_t kp_id; 35 kinst_patchval_t kp_patchval; 36 kinst_patchval_t kp_savedval; 37 kinst_patchval_t *kp_patchpoint; 38 39 struct kinst_probe_md kp_md; 40 }; 41 42 LIST_HEAD(kinst_probe_list, kinst_probe); 43 44 extern struct kinst_probe_list *kinst_probetab; 45 46 #define KINST_PROBETAB_MAX 0x8000 /* 32k */ 47 #define KINST_ADDR2NDX(addr) (((uintptr_t)(addr)) & (KINST_PROBETAB_MAX - 1)) 48 #define KINST_GETPROBE(i) (&kinst_probetab[KINST_ADDR2NDX(i)]) 49 50 struct linker_file; 51 struct linker_symval; 52 53 volatile void *kinst_memcpy(volatile void *, volatile const void *, size_t); 54 bool kinst_excluded(const char *); 55 bool kinst_md_excluded(const char *); 56 int kinst_invop(uintptr_t, struct trapframe *, uintptr_t); 57 int kinst_make_probe(struct linker_file *, int, struct linker_symval *, 58 void *); 59 void kinst_patch_tracepoint(struct kinst_probe *, kinst_patchval_t); 60 void kinst_probe_create(struct kinst_probe *, struct linker_file *); 61 62 int kinst_trampoline_init(void); 63 int kinst_trampoline_deinit(void); 64 uint8_t *kinst_trampoline_alloc(int); 65 void kinst_trampoline_dealloc(uint8_t *); 66 67 int kinst_md_init(void); 68 void kinst_md_deinit(void); 69 70 #ifdef MALLOC_DECLARE 71 MALLOC_DECLARE(M_KINST); 72 #endif /* MALLOC_DECLARE */ 73 74 #define KINST_LOG_HELPER(fmt, ...) \ 75 printf("%s:%d: " fmt "%s\n", __func__, __LINE__, __VA_ARGS__) 76 #define KINST_LOG(...) \ 77 KINST_LOG_HELPER(__VA_ARGS__, "") 78 79 #endif /* _KERNEL */ 80 81 #endif /* _KINST_H_ */ 82