1*61046927SAndroid Build Coastguard Worker /* 2*61046927SAndroid Build Coastguard Worker * Copyright © 2020 Google, Inc. 3*61046927SAndroid Build Coastguard Worker * 4*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a 5*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"), 6*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation 7*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the 9*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions: 10*61046927SAndroid Build Coastguard Worker * 11*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next 12*61046927SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the 13*61046927SAndroid Build Coastguard Worker * Software. 14*61046927SAndroid Build Coastguard Worker * 15*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19*61046927SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20*61046927SAndroid Build Coastguard Worker * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21*61046927SAndroid Build Coastguard Worker * SOFTWARE. 22*61046927SAndroid Build Coastguard Worker */ 23*61046927SAndroid Build Coastguard Worker 24*61046927SAndroid Build Coastguard Worker #ifndef _ISASPEC_H_ 25*61046927SAndroid Build Coastguard Worker #define _ISASPEC_H_ 26*61046927SAndroid Build Coastguard Worker 27*61046927SAndroid Build Coastguard Worker #include <stdbool.h> 28*61046927SAndroid Build Coastguard Worker #include <stdint.h> 29*61046927SAndroid Build Coastguard Worker 30*61046927SAndroid Build Coastguard Worker #include <stdio.h> 31*61046927SAndroid Build Coastguard Worker #include "util/bitset.h" 32*61046927SAndroid Build Coastguard Worker 33*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus 34*61046927SAndroid Build Coastguard Worker extern "C" { 35*61046927SAndroid Build Coastguard Worker #endif 36*61046927SAndroid Build Coastguard Worker 37*61046927SAndroid Build Coastguard Worker struct isa_decode_value { 38*61046927SAndroid Build Coastguard Worker /** for {NAME} */ 39*61046927SAndroid Build Coastguard Worker const char *str; 40*61046927SAndroid Build Coastguard Worker /** for all other fields */ 41*61046927SAndroid Build Coastguard Worker uint64_t num; 42*61046927SAndroid Build Coastguard Worker }; 43*61046927SAndroid Build Coastguard Worker 44*61046927SAndroid Build Coastguard Worker struct isa_entrypoint { 45*61046927SAndroid Build Coastguard Worker const char *name; 46*61046927SAndroid Build Coastguard Worker uint32_t offset; 47*61046927SAndroid Build Coastguard Worker }; 48*61046927SAndroid Build Coastguard Worker 49*61046927SAndroid Build Coastguard Worker struct isa_print_state { 50*61046927SAndroid Build Coastguard Worker FILE *out; 51*61046927SAndroid Build Coastguard Worker 52*61046927SAndroid Build Coastguard Worker /** 53*61046927SAndroid Build Coastguard Worker * Column number of current line 54*61046927SAndroid Build Coastguard Worker */ 55*61046927SAndroid Build Coastguard Worker unsigned line_column; 56*61046927SAndroid Build Coastguard Worker }; 57*61046927SAndroid Build Coastguard Worker 58*61046927SAndroid Build Coastguard Worker void isa_print(struct isa_print_state *state, const char *fmt, ...) PRINTFLIKE(2, 3); 59*61046927SAndroid Build Coastguard Worker 60*61046927SAndroid Build Coastguard Worker struct isa_decode_options { 61*61046927SAndroid Build Coastguard Worker uint32_t gpu_id; 62*61046927SAndroid Build Coastguard Worker 63*61046927SAndroid Build Coastguard Worker /** show errors detected in decoding, like unexpected dontcare bits */ 64*61046927SAndroid Build Coastguard Worker bool show_errors; 65*61046927SAndroid Build Coastguard Worker 66*61046927SAndroid Build Coastguard Worker /** 67*61046927SAndroid Build Coastguard Worker * If non-zero, maximum # of instructions that are unmatched before 68*61046927SAndroid Build Coastguard Worker * bailing, ie. to trigger stopping if we start trying to decode 69*61046927SAndroid Build Coastguard Worker * random garbage. 70*61046927SAndroid Build Coastguard Worker */ 71*61046927SAndroid Build Coastguard Worker unsigned max_errors; 72*61046927SAndroid Build Coastguard Worker 73*61046927SAndroid Build Coastguard Worker /** Generate branch target labels */ 74*61046927SAndroid Build Coastguard Worker bool branch_labels; 75*61046927SAndroid Build Coastguard Worker 76*61046927SAndroid Build Coastguard Worker /** 77*61046927SAndroid Build Coastguard Worker * Flag which can be set, for ex, but decode hook to trigger end of 78*61046927SAndroid Build Coastguard Worker * decoding 79*61046927SAndroid Build Coastguard Worker */ 80*61046927SAndroid Build Coastguard Worker bool stop; 81*61046927SAndroid Build Coastguard Worker 82*61046927SAndroid Build Coastguard Worker /** 83*61046927SAndroid Build Coastguard Worker * Data passed back to decode hooks 84*61046927SAndroid Build Coastguard Worker */ 85*61046927SAndroid Build Coastguard Worker void *cbdata; 86*61046927SAndroid Build Coastguard Worker 87*61046927SAndroid Build Coastguard Worker /** 88*61046927SAndroid Build Coastguard Worker * Callback for field decode 89*61046927SAndroid Build Coastguard Worker */ 90*61046927SAndroid Build Coastguard Worker void (*field_cb)(void *data, const char *field_name, struct isa_decode_value *val); 91*61046927SAndroid Build Coastguard Worker 92*61046927SAndroid Build Coastguard Worker /** 93*61046927SAndroid Build Coastguard Worker * Callback for fields that need custom code to print their value. 94*61046927SAndroid Build Coastguard Worker */ 95*61046927SAndroid Build Coastguard Worker void (*field_print_cb)(struct isa_print_state *print, const char *field_name, uint64_t val); 96*61046927SAndroid Build Coastguard Worker 97*61046927SAndroid Build Coastguard Worker /** 98*61046927SAndroid Build Coastguard Worker * Callback prior to instruction decode 99*61046927SAndroid Build Coastguard Worker */ 100*61046927SAndroid Build Coastguard Worker void (*pre_instr_cb)(void *data, unsigned n, void *instr); 101*61046927SAndroid Build Coastguard Worker 102*61046927SAndroid Build Coastguard Worker /** 103*61046927SAndroid Build Coastguard Worker * Callback after instruction decode 104*61046927SAndroid Build Coastguard Worker */ 105*61046927SAndroid Build Coastguard Worker void (*post_instr_cb)(void *data, unsigned n, void *instr); 106*61046927SAndroid Build Coastguard Worker 107*61046927SAndroid Build Coastguard Worker /** 108*61046927SAndroid Build Coastguard Worker * callback for undefined instructions 109*61046927SAndroid Build Coastguard Worker */ 110*61046927SAndroid Build Coastguard Worker void (*no_match_cb)(FILE *out, const BITSET_WORD *bitset, size_t size); 111*61046927SAndroid Build Coastguard Worker 112*61046927SAndroid Build Coastguard Worker /** 113*61046927SAndroid Build Coastguard Worker * List of known entrypoints to treat like call targets 114*61046927SAndroid Build Coastguard Worker */ 115*61046927SAndroid Build Coastguard Worker unsigned entrypoint_count; 116*61046927SAndroid Build Coastguard Worker const struct isa_entrypoint *entrypoints; 117*61046927SAndroid Build Coastguard Worker }; 118*61046927SAndroid Build Coastguard Worker 119*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus 120*61046927SAndroid Build Coastguard Worker } 121*61046927SAndroid Build Coastguard Worker #endif 122*61046927SAndroid Build Coastguard Worker 123*61046927SAndroid Build Coastguard Worker #endif /* _ISASPEC_H_ */ 124