xref: /freebsd-src/contrib/opencsd/decoder/include/i_dec/trc_idec_arminst.h (revision 46e6e290975f19ea62d03f90ac3e523af4dae557)
1c120c564SAndrew Turner /*
2c120c564SAndrew Turner  * \file       trc_idec_arminst.h
3c120c564SAndrew Turner  * \brief      OpenCSD :
4c120c564SAndrew Turner  *
5c120c564SAndrew Turner  * \copyright  Copyright (c) 2015, ARM Limited. All Rights Reserved.
6c120c564SAndrew Turner  */
7c120c564SAndrew Turner 
8c120c564SAndrew Turner /*
9c120c564SAndrew Turner  * Redistribution and use in source and binary forms, with or without modification,
10c120c564SAndrew Turner  * are permitted provided that the following conditions are met:
11c120c564SAndrew Turner  *
12c120c564SAndrew Turner  * 1. Redistributions of source code must retain the above copyright notice,
13c120c564SAndrew Turner  * this list of conditions and the following disclaimer.
14c120c564SAndrew Turner  *
15c120c564SAndrew Turner  * 2. Redistributions in binary form must reproduce the above copyright notice,
16c120c564SAndrew Turner  * this list of conditions and the following disclaimer in the documentation
17c120c564SAndrew Turner  * and/or other materials provided with the distribution.
18c120c564SAndrew Turner  *
19c120c564SAndrew Turner  * 3. Neither the name of the copyright holder nor the names of its contributors
20c120c564SAndrew Turner  * may be used to endorse or promote products derived from this software without
21c120c564SAndrew Turner  * specific prior written permission.
22c120c564SAndrew Turner  *
23c120c564SAndrew Turner  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
24c120c564SAndrew Turner  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25c120c564SAndrew Turner  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26c120c564SAndrew Turner  * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27c120c564SAndrew Turner  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28c120c564SAndrew Turner  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29c120c564SAndrew Turner  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
30c120c564SAndrew Turner  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31c120c564SAndrew Turner  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32c120c564SAndrew Turner  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33c120c564SAndrew Turner  */
34c120c564SAndrew Turner 
35c120c564SAndrew Turner #ifndef ARM_TRC_IDEC_ARMINST_H_INCLUDED
36c120c564SAndrew Turner #define ARM_TRC_IDEC_ARMINST_H_INCLUDED
37c120c564SAndrew Turner 
38c120c564SAndrew Turner #ifndef __STDC_CONSTANT_MACROS
39c120c564SAndrew Turner #define __STDC_CONSTANT_MACROS 1
40c120c564SAndrew Turner #endif
41c120c564SAndrew Turner 
42c120c564SAndrew Turner #include "opencsd/ocsd_if_types.h"
43c120c564SAndrew Turner #include <cstdint>
44c120c564SAndrew Turner 
45b6aadd18SAndrew Turner /* supplementary decode information */
46b6aadd18SAndrew Turner struct decode_info {
47*46e6e290SRuslan Bukin     ocsd_arch_version_t arch_version;
48b6aadd18SAndrew Turner     ocsd_instr_subtype instr_sub_type;
49b6aadd18SAndrew Turner };
50b6aadd18SAndrew Turner 
51c120c564SAndrew Turner /*
52c120c564SAndrew Turner For Thumb2, test if a halfword is the first half of a 32-bit instruction,
53c120c564SAndrew Turner as opposed to a complete 16-bit instruction.
54c120c564SAndrew Turner */
is_wide_thumb(uint16_t insthw)55c120c564SAndrew Turner inline int is_wide_thumb(uint16_t insthw)
56c120c564SAndrew Turner {
57c120c564SAndrew Turner     return (insthw & 0xF800) >= 0xE800;
58c120c564SAndrew Turner }
59c120c564SAndrew Turner 
60c120c564SAndrew Turner /*
61c120c564SAndrew Turner In the following queries, 16-bit Thumb2 instructions should be
62c120c564SAndrew Turner passed in as the high halfword, e.g. xxxx0000.
63c120c564SAndrew Turner */
64c120c564SAndrew Turner 
65c120c564SAndrew Turner /*
66c120c564SAndrew Turner Test whether an instruction is a branch (software change of the PC).
67c120c564SAndrew Turner This includes branch instructions and all loads and data-processing
68c120c564SAndrew Turner instructions that write to the PC.  It does not include exception
69c120c564SAndrew Turner instructions such as SVC, HVC and SMC.
70c120c564SAndrew Turner (Performance event 0x0C includes these.)
71c120c564SAndrew Turner */
72b6aadd18SAndrew Turner int inst_ARM_is_branch(uint32_t inst, struct decode_info *info);
73b6aadd18SAndrew Turner int inst_Thumb_is_branch(uint32_t inst, struct decode_info *info);
74b6aadd18SAndrew Turner int inst_A64_is_branch(uint32_t inst, struct decode_info *info);
75c120c564SAndrew Turner 
76c120c564SAndrew Turner /*
77c120c564SAndrew Turner Test whether an instruction is a direct (aka immediate) branch.
78c120c564SAndrew Turner Performance event 0x0D counts these.
79c120c564SAndrew Turner */
80c120c564SAndrew Turner int inst_ARM_is_direct_branch(uint32_t inst);
81b6aadd18SAndrew Turner int inst_Thumb_is_direct_branch(uint32_t inst, struct decode_info *info);
82b6aadd18SAndrew Turner int inst_Thumb_is_direct_branch_link(uint32_t inst, uint8_t *is_link, uint8_t *is_cond, struct decode_info *info);
83b6aadd18SAndrew Turner int inst_A64_is_direct_branch(uint32_t inst, struct decode_info *info);
84b6aadd18SAndrew Turner int inst_A64_is_direct_branch_link(uint32_t inst, uint8_t *is_link, struct decode_info *info);
85c120c564SAndrew Turner 
86c120c564SAndrew Turner /*
87c120c564SAndrew Turner Get branch destination for a direct branch.
88c120c564SAndrew Turner */
89c120c564SAndrew Turner int inst_ARM_branch_destination(uint32_t addr, uint32_t inst, uint32_t *pnpc);
90c120c564SAndrew Turner int inst_Thumb_branch_destination(uint32_t addr, uint32_t inst, uint32_t *pnpc);
91c120c564SAndrew Turner int inst_A64_branch_destination(uint64_t addr, uint32_t inst, uint64_t *pnpc);
92c120c564SAndrew Turner 
93b6aadd18SAndrew Turner int inst_ARM_is_indirect_branch(uint32_t inst, struct decode_info *info);
94b6aadd18SAndrew Turner int inst_Thumb_is_indirect_branch_link(uint32_t inst, uint8_t *is_link, struct decode_info *info);
95b6aadd18SAndrew Turner int inst_Thumb_is_indirect_branch(uint32_t inst, struct decode_info *info);
96b6aadd18SAndrew Turner int inst_A64_is_indirect_branch_link(uint32_t inst, uint8_t *is_link, struct decode_info *info);
97b6aadd18SAndrew Turner int inst_A64_is_indirect_branch(uint32_t inst, struct decode_info *info);
98c120c564SAndrew Turner 
99b6aadd18SAndrew Turner int inst_ARM_is_branch_and_link(uint32_t inst, struct decode_info *info);
100b6aadd18SAndrew Turner int inst_Thumb_is_branch_and_link(uint32_t inst, struct decode_info *info);
101b6aadd18SAndrew Turner int inst_A64_is_branch_and_link(uint32_t inst, struct decode_info *info);
102c120c564SAndrew Turner 
103c120c564SAndrew Turner int inst_ARM_is_conditional(uint32_t inst);
104c120c564SAndrew Turner int inst_Thumb_is_conditional(uint32_t inst);
105c120c564SAndrew Turner int inst_A64_is_conditional(uint32_t inst);
106c120c564SAndrew Turner 
107c120c564SAndrew Turner /* For an IT instruction, return the number of instructions conditionalized
108c120c564SAndrew Turner    (from 1 to 4).  For other instructions, return zero. */
109c120c564SAndrew Turner unsigned int inst_Thumb_is_IT(uint32_t inst);
110c120c564SAndrew Turner 
111c120c564SAndrew Turner typedef enum {
112c120c564SAndrew Turner     ARM_BARRIER_NONE,
113c120c564SAndrew Turner     ARM_BARRIER_ISB,
114c120c564SAndrew Turner     ARM_BARRIER_DMB,
115c120c564SAndrew Turner     ARM_BARRIER_DSB
116c120c564SAndrew Turner } arm_barrier_t;
117c120c564SAndrew Turner 
118c120c564SAndrew Turner arm_barrier_t inst_ARM_barrier(uint32_t inst);
119c120c564SAndrew Turner arm_barrier_t inst_Thumb_barrier(uint32_t inst);
120c120c564SAndrew Turner arm_barrier_t inst_A64_barrier(uint32_t inst);
121c120c564SAndrew Turner 
122c120c564SAndrew Turner int inst_ARM_wfiwfe(uint32_t inst);
123c120c564SAndrew Turner int inst_Thumb_wfiwfe(uint32_t inst);
124*46e6e290SRuslan Bukin int inst_A64_wfiwfe(uint32_t inst, struct decode_info *info);
125*46e6e290SRuslan Bukin int inst_A64_Tstart(uint32_t inst);
126c120c564SAndrew Turner 
127c120c564SAndrew Turner /*
128c120c564SAndrew Turner Test whether an instruction is definitely undefined, e.g. because
129c120c564SAndrew Turner allocated to a "permanently UNDEFINED" space (UDF mnemonic).
130c120c564SAndrew Turner Other instructions besides the ones indicated, may always or
131c120c564SAndrew Turner sometimes cause an undefined instruction trap.  This call is
132c120c564SAndrew Turner intended to be helpful in 'runaway decode' prevention.
133c120c564SAndrew Turner */
134c120c564SAndrew Turner int inst_ARM_is_UDF(uint32_t inst);
135c120c564SAndrew Turner int inst_Thumb_is_UDF(uint32_t inst);
136c120c564SAndrew Turner int inst_A64_is_UDF(uint32_t inst);
137c120c564SAndrew Turner 
138c120c564SAndrew Turner #endif // ARM_TRC_IDEC_ARMINST_H_INCLUDED
139c120c564SAndrew Turner 
140c120c564SAndrew Turner /* End of File trc_idec_arminst.h */
141