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