xref: /freebsd/sys/cddl/dev/dtrace/riscv/instr_size.c (revision 080e56a6c98c7e7a241a4260d4c19d3cad5b22af)
1*080e56a6SChristos Margiolis /*
2*080e56a6SChristos Margiolis  * SPDX-License-Identifier: CDDL 1.0
3*080e56a6SChristos Margiolis  *
4*080e56a6SChristos Margiolis  * Copyright 2023 Christos Margiolis <christos@FreeBSD.org>
5*080e56a6SChristos Margiolis  */
6*080e56a6SChristos Margiolis 
7*080e56a6SChristos Margiolis #include <sys/types.h>
8*080e56a6SChristos Margiolis #include <sys/dtrace.h>
9*080e56a6SChristos Margiolis 
10*080e56a6SChristos Margiolis #include <machine/riscvreg.h>
11*080e56a6SChristos Margiolis 
12*080e56a6SChristos Margiolis #define RVC_MASK 0x03
13*080e56a6SChristos Margiolis 
14*080e56a6SChristos Margiolis int
dtrace_instr_size(uint8_t * instr)15*080e56a6SChristos Margiolis dtrace_instr_size(uint8_t *instr)
16*080e56a6SChristos Margiolis {
17*080e56a6SChristos Margiolis 	/* Detect compressed instructions. */
18*080e56a6SChristos Margiolis 	if ((~(*instr) & RVC_MASK) == 0)
19*080e56a6SChristos Margiolis 		return (INSN_SIZE);
20*080e56a6SChristos Margiolis 	else
21*080e56a6SChristos Margiolis 		return (INSN_C_SIZE);
22*080e56a6SChristos Margiolis }
23