1*98f69a57SNamhyung Kim // SPDX-License-Identifier: GPL-2.0 2*98f69a57SNamhyung Kim #ifndef __PERF_UTIL_DISASM_H 3*98f69a57SNamhyung Kim #define __PERF_UTIL_DISASM_H 4*98f69a57SNamhyung Kim 5*98f69a57SNamhyung Kim #include "map_symbol.h" 6*98f69a57SNamhyung Kim 7*98f69a57SNamhyung Kim struct annotation_options; 8*98f69a57SNamhyung Kim struct disasm_line; 9*98f69a57SNamhyung Kim struct ins; 10*98f69a57SNamhyung Kim struct evsel; 11*98f69a57SNamhyung Kim struct symbol; 12*98f69a57SNamhyung Kim 13*98f69a57SNamhyung Kim struct arch { 14*98f69a57SNamhyung Kim const char *name; 15*98f69a57SNamhyung Kim struct ins *instructions; 16*98f69a57SNamhyung Kim size_t nr_instructions; 17*98f69a57SNamhyung Kim size_t nr_instructions_allocated; 18*98f69a57SNamhyung Kim struct ins_ops *(*associate_instruction_ops)(struct arch *arch, const char *name); 19*98f69a57SNamhyung Kim bool sorted_instructions; 20*98f69a57SNamhyung Kim bool initialized; 21*98f69a57SNamhyung Kim const char *insn_suffix; 22*98f69a57SNamhyung Kim void *priv; 23*98f69a57SNamhyung Kim unsigned int model; 24*98f69a57SNamhyung Kim unsigned int family; 25*98f69a57SNamhyung Kim int (*init)(struct arch *arch, char *cpuid); 26*98f69a57SNamhyung Kim bool (*ins_is_fused)(struct arch *arch, const char *ins1, 27*98f69a57SNamhyung Kim const char *ins2); 28*98f69a57SNamhyung Kim struct { 29*98f69a57SNamhyung Kim char comment_char; 30*98f69a57SNamhyung Kim char skip_functions_char; 31*98f69a57SNamhyung Kim char register_char; 32*98f69a57SNamhyung Kim char memory_ref_char; 33*98f69a57SNamhyung Kim char imm_char; 34*98f69a57SNamhyung Kim } objdump; 35*98f69a57SNamhyung Kim }; 36*98f69a57SNamhyung Kim 37*98f69a57SNamhyung Kim struct ins { 38*98f69a57SNamhyung Kim const char *name; 39*98f69a57SNamhyung Kim struct ins_ops *ops; 40*98f69a57SNamhyung Kim }; 41*98f69a57SNamhyung Kim 42*98f69a57SNamhyung Kim struct ins_operands { 43*98f69a57SNamhyung Kim char *raw; 44*98f69a57SNamhyung Kim struct { 45*98f69a57SNamhyung Kim char *raw; 46*98f69a57SNamhyung Kim char *name; 47*98f69a57SNamhyung Kim struct symbol *sym; 48*98f69a57SNamhyung Kim u64 addr; 49*98f69a57SNamhyung Kim s64 offset; 50*98f69a57SNamhyung Kim bool offset_avail; 51*98f69a57SNamhyung Kim bool outside; 52*98f69a57SNamhyung Kim bool multi_regs; 53*98f69a57SNamhyung Kim } target; 54*98f69a57SNamhyung Kim union { 55*98f69a57SNamhyung Kim struct { 56*98f69a57SNamhyung Kim char *raw; 57*98f69a57SNamhyung Kim char *name; 58*98f69a57SNamhyung Kim u64 addr; 59*98f69a57SNamhyung Kim bool multi_regs; 60*98f69a57SNamhyung Kim } source; 61*98f69a57SNamhyung Kim struct { 62*98f69a57SNamhyung Kim struct ins ins; 63*98f69a57SNamhyung Kim struct ins_operands *ops; 64*98f69a57SNamhyung Kim } locked; 65*98f69a57SNamhyung Kim struct { 66*98f69a57SNamhyung Kim char *raw_comment; 67*98f69a57SNamhyung Kim char *raw_func_start; 68*98f69a57SNamhyung Kim } jump; 69*98f69a57SNamhyung Kim }; 70*98f69a57SNamhyung Kim }; 71*98f69a57SNamhyung Kim 72*98f69a57SNamhyung Kim struct ins_ops { 73*98f69a57SNamhyung Kim void (*free)(struct ins_operands *ops); 74*98f69a57SNamhyung Kim int (*parse)(struct arch *arch, struct ins_operands *ops, struct map_symbol *ms); 75*98f69a57SNamhyung Kim int (*scnprintf)(struct ins *ins, char *bf, size_t size, 76*98f69a57SNamhyung Kim struct ins_operands *ops, int max_ins_name); 77*98f69a57SNamhyung Kim }; 78*98f69a57SNamhyung Kim 79*98f69a57SNamhyung Kim struct annotate_args { 80*98f69a57SNamhyung Kim struct arch *arch; 81*98f69a57SNamhyung Kim struct map_symbol ms; 82*98f69a57SNamhyung Kim struct evsel *evsel; 83*98f69a57SNamhyung Kim struct annotation_options *options; 84*98f69a57SNamhyung Kim s64 offset; 85*98f69a57SNamhyung Kim char *line; 86*98f69a57SNamhyung Kim int line_nr; 87*98f69a57SNamhyung Kim char *fileloc; 88*98f69a57SNamhyung Kim }; 89*98f69a57SNamhyung Kim 90*98f69a57SNamhyung Kim struct arch *arch__find(const char *name); 91*98f69a57SNamhyung Kim bool arch__is(struct arch *arch, const char *name); 92*98f69a57SNamhyung Kim 93*98f69a57SNamhyung Kim struct ins_ops *ins__find(struct arch *arch, const char *name); 94*98f69a57SNamhyung Kim int ins__scnprintf(struct ins *ins, char *bf, size_t size, 95*98f69a57SNamhyung Kim struct ins_operands *ops, int max_ins_name); 96*98f69a57SNamhyung Kim 97*98f69a57SNamhyung Kim bool ins__is_call(const struct ins *ins); 98*98f69a57SNamhyung Kim bool ins__is_jump(const struct ins *ins); 99*98f69a57SNamhyung Kim bool ins__is_fused(struct arch *arch, const char *ins1, const char *ins2); 100*98f69a57SNamhyung Kim bool ins__is_nop(const struct ins *ins); 101*98f69a57SNamhyung Kim bool ins__is_ret(const struct ins *ins); 102*98f69a57SNamhyung Kim bool ins__is_lock(const struct ins *ins); 103*98f69a57SNamhyung Kim 104*98f69a57SNamhyung Kim struct disasm_line *disasm_line__new(struct annotate_args *args); 105*98f69a57SNamhyung Kim void disasm_line__free(struct disasm_line *dl); 106*98f69a57SNamhyung Kim 107*98f69a57SNamhyung Kim int disasm_line__scnprintf(struct disasm_line *dl, char *bf, size_t size, 108*98f69a57SNamhyung Kim bool raw, int max_ins_name); 109*98f69a57SNamhyung Kim 110*98f69a57SNamhyung Kim int symbol__disassemble(struct symbol *sym, struct annotate_args *args); 111*98f69a57SNamhyung Kim 112*98f69a57SNamhyung Kim #endif /* __PERF_UTIL_DISASM_H */ 113