xref: /freebsd/sys/cddl/dev/kinst/kinst.h (revision f0bc4ed144fc59b6f72d90c46b91ca803d3b29ce)
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