1 2 /*--------------------------------------------------------------------*/ 3 /*--- The core/tool interface. pub_core_tooliface.h ---*/ 4 /*--------------------------------------------------------------------*/ 5 6 /* 7 This file is part of Valgrind, a dynamic binary instrumentation 8 framework. 9 10 Copyright (C) 2000-2017 Julian Seward 11 jseward@acm.org 12 13 This program is free software; you can redistribute it and/or 14 modify it under the terms of the GNU General Public License as 15 published by the Free Software Foundation; either version 2 of the 16 License, or (at your option) any later version. 17 18 This program is distributed in the hope that it will be useful, but 19 WITHOUT ANY WARRANTY; without even the implied warranty of 20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 21 General Public License for more details. 22 23 You should have received a copy of the GNU General Public License 24 along with this program; if not, write to the Free Software 25 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 26 02111-1307, USA. 27 28 The GNU General Public License is contained in the file COPYING. 29 */ 30 31 #ifndef __PUB_CORE_TOOLIFACE_H 32 #define __PUB_CORE_TOOLIFACE_H 33 34 #include "pub_tool_tooliface.h" 35 36 //-------------------------------------------------------------------- 37 // PURPOSE: This module encapsulates the key parts of the core/tool 38 // interface: 'details', 'needs' and 'trackable events'. 39 //-------------------------------------------------------------------- 40 41 // Note the use of C's comma operator here -- it means that we execute both 42 // statements, and the rvalue of the whole thing is the rvalue of the last 43 // statement. This lets us say "x = VG_TDICT_CALL(...)" in the required 44 // places, while still checking the assertion. 45 #define VG_TDICT_CALL(fn, args...) \ 46 ( vg_assert2(VG_(tdict).fn, \ 47 "you forgot to set VgToolInterface function '" #fn "'"), \ 48 VG_(tdict).fn(args) ) 49 50 #define VG_TRACK(fn, args...) \ 51 do { \ 52 if (VG_(tdict).track_##fn) \ 53 VG_(tdict).track_##fn(args); \ 54 } while(0) 55 56 /* These structs are not exposed to tools to mitigate possibility of 57 binary-incompatibilities when the core/tool interface changes. Instead, 58 set functions are provided (see include/pub_tool_tooliface.h). */ 59 60 /* --------------------------------------------------------------------- 61 'Details' 62 ------------------------------------------------------------------ */ 63 64 typedef 65 struct { 66 const HChar* name; 67 const HChar* version; 68 const HChar* description; 69 const HChar* copyright_author; 70 const HChar* bug_reports_to; 71 UInt avg_translation_sizeB; 72 } 73 VgDetails; 74 75 extern VgDetails VG_(details); 76 77 /* --------------------------------------------------------------------- 78 'Needs' 79 ------------------------------------------------------------------ */ 80 81 typedef 82 struct { 83 Bool libc_freeres; 84 Bool cxx_freeres; 85 Bool core_errors; 86 Bool tool_errors; 87 Bool superblock_discards; 88 Bool command_line_options; 89 Bool client_requests; 90 Bool syscall_wrapper; 91 Bool sanity_checks; 92 Bool print_stats; 93 Bool info_location; 94 Bool var_info; 95 Bool malloc_replacement; 96 Bool xml_output; 97 Bool final_IR_tidy_pass; 98 } 99 VgNeeds; 100 101 extern VgNeeds VG_(needs); 102 103 /* --------------------------------------------------------------------- 104 The dictionary of callable tool functions 105 ------------------------------------------------------------------ */ 106 107 typedef struct { 108 // -- 'Needs'-related functions ---------------------------------- 109 // Basic functions 110 void (*tool_pre_clo_init) (void); 111 void (*tool_post_clo_init)(void); 112 IRSB* (*tool_instrument) (VgCallbackClosure*, 113 IRSB*, 114 const VexGuestLayout*, const VexGuestExtents*, 115 const VexArchInfo*, IRType, IRType); 116 void (*tool_fini) (Int); 117 118 // VG_(needs).core_errors 119 // (none) 120 121 // VG_(needs).tool_errors 122 Bool (*tool_eq_Error) (VgRes, const Error*, const Error*); 123 void (*tool_before_pp_Error) (const Error*); 124 void (*tool_pp_Error) (const Error*); 125 Bool tool_show_ThreadIDs_for_errors; 126 UInt (*tool_update_extra) (const Error*); 127 Bool (*tool_recognised_suppression) (const HChar*, Supp*); 128 Bool (*tool_read_extra_suppression_info) (Int, HChar**, SizeT*, Int*, 129 Supp*); 130 Bool (*tool_error_matches_suppression) (const Error*, const Supp*); 131 const HChar* (*tool_get_error_name) (const Error*); 132 SizeT (*tool_get_extra_suppression_info) (const Error*,/*OUT*/HChar*,Int); 133 SizeT (*tool_print_extra_suppression_use) (const Supp*,/*OUT*/HChar*,Int); 134 void (*tool_update_extra_suppression_use) (const Error*, const Supp*); 135 136 // VG_(needs).superblock_discards 137 void (*tool_discard_superblock_info)(Addr, VexGuestExtents); 138 139 // VG_(needs).command_line_options 140 Bool (*tool_process_cmd_line_option)(const HChar*); 141 void (*tool_print_usage) (void); 142 void (*tool_print_debug_usage) (void); 143 144 // VG_(needs).client_requests 145 Bool (*tool_handle_client_request)(ThreadId, UWord*, UWord*); 146 147 // VG_(needs).syscall_wrapper 148 void (*tool_pre_syscall) (ThreadId, UInt, UWord*, UInt); 149 void (*tool_post_syscall)(ThreadId, UInt, UWord*, UInt, SysRes); 150 151 // VG_(needs).sanity_checks 152 Bool (*tool_cheap_sanity_check)(void); 153 Bool (*tool_expensive_sanity_check)(void); 154 155 // VG_(needs).print_stats 156 void (*tool_print_stats)(void); 157 158 // VG_(needs).info_location 159 void (*tool_info_location)(Addr a); 160 161 // VG_(needs).malloc_replacement 162 void* (*tool_malloc) (ThreadId, SizeT); 163 void* (*tool___builtin_new) (ThreadId, SizeT); 164 void* (*tool___builtin_vec_new) (ThreadId, SizeT); 165 void* (*tool_memalign) (ThreadId, SizeT, SizeT); 166 void* (*tool_calloc) (ThreadId, SizeT, SizeT); 167 void (*tool_free) (ThreadId, void*); 168 void (*tool___builtin_delete) (ThreadId, void*); 169 void (*tool___builtin_vec_delete)(ThreadId, void*); 170 void* (*tool_realloc) (ThreadId, void*, SizeT); 171 SizeT (*tool_malloc_usable_size) (ThreadId, void*); 172 SizeT tool_client_redzone_szB; 173 174 // VG_(needs).final_IR_tidy_pass 175 IRSB* (*tool_final_IR_tidy_pass) (IRSB*); 176 177 // VG_(needs).xml_output 178 // (none) 179 180 // -- Event tracking functions ------------------------------------ 181 void (*track_new_mem_startup) (Addr, SizeT, Bool, Bool, Bool, ULong); 182 void (*track_new_mem_stack_signal)(Addr, SizeT, ThreadId); 183 void (*track_new_mem_brk) (Addr, SizeT, ThreadId); 184 void (*track_new_mem_mmap) (Addr, SizeT, Bool, Bool, Bool, ULong); 185 186 void (*track_copy_mem_remap) (Addr src, Addr dst, SizeT); 187 void (*track_change_mem_mprotect) (Addr, SizeT, Bool, Bool, Bool); 188 void (*track_die_mem_stack_signal)(Addr, SizeT); 189 void (*track_die_mem_brk) (Addr, SizeT); 190 void (*track_die_mem_munmap) (Addr, SizeT); 191 192 void VG_REGPARM(2) (*track_new_mem_stack_4_w_ECU) (Addr,UInt); 193 void VG_REGPARM(2) (*track_new_mem_stack_8_w_ECU) (Addr,UInt); 194 void VG_REGPARM(2) (*track_new_mem_stack_12_w_ECU) (Addr,UInt); 195 void VG_REGPARM(2) (*track_new_mem_stack_16_w_ECU) (Addr,UInt); 196 void VG_REGPARM(2) (*track_new_mem_stack_32_w_ECU) (Addr,UInt); 197 void VG_REGPARM(2) (*track_new_mem_stack_112_w_ECU)(Addr,UInt); 198 void VG_REGPARM(2) (*track_new_mem_stack_128_w_ECU)(Addr,UInt); 199 void VG_REGPARM(2) (*track_new_mem_stack_144_w_ECU)(Addr,UInt); 200 void VG_REGPARM(2) (*track_new_mem_stack_160_w_ECU)(Addr,UInt); 201 void (*track_new_mem_stack_w_ECU)(Addr,SizeT,UInt); 202 203 void VG_REGPARM(1) (*track_new_mem_stack_4) (Addr); 204 void VG_REGPARM(1) (*track_new_mem_stack_8) (Addr); 205 void VG_REGPARM(1) (*track_new_mem_stack_12) (Addr); 206 void VG_REGPARM(1) (*track_new_mem_stack_16) (Addr); 207 void VG_REGPARM(1) (*track_new_mem_stack_32) (Addr); 208 void VG_REGPARM(1) (*track_new_mem_stack_112)(Addr); 209 void VG_REGPARM(1) (*track_new_mem_stack_128)(Addr); 210 void VG_REGPARM(1) (*track_new_mem_stack_144)(Addr); 211 void VG_REGPARM(1) (*track_new_mem_stack_160)(Addr); 212 void (*track_new_mem_stack)(Addr,SizeT); 213 214 void VG_REGPARM(1) (*track_die_mem_stack_4) (Addr); 215 void VG_REGPARM(1) (*track_die_mem_stack_8) (Addr); 216 void VG_REGPARM(1) (*track_die_mem_stack_12) (Addr); 217 void VG_REGPARM(1) (*track_die_mem_stack_16) (Addr); 218 void VG_REGPARM(1) (*track_die_mem_stack_32) (Addr); 219 void VG_REGPARM(1) (*track_die_mem_stack_112)(Addr); 220 void VG_REGPARM(1) (*track_die_mem_stack_128)(Addr); 221 void VG_REGPARM(1) (*track_die_mem_stack_144)(Addr); 222 void VG_REGPARM(1) (*track_die_mem_stack_160)(Addr); 223 void (*track_die_mem_stack)(Addr, SizeT); 224 225 void (*track_ban_mem_stack)(Addr, SizeT); 226 227 void (*track_pre_mem_read) (CorePart, ThreadId, const HChar*, Addr, SizeT); 228 void (*track_pre_mem_read_asciiz)(CorePart, ThreadId, const HChar*, Addr); 229 void (*track_pre_mem_write) (CorePart, ThreadId, const HChar*, Addr, SizeT); 230 void (*track_post_mem_write) (CorePart, ThreadId, Addr, SizeT); 231 232 void (*track_pre_reg_read) (CorePart, ThreadId, const HChar*, PtrdiffT, SizeT); 233 void (*track_post_reg_write)(CorePart, ThreadId, PtrdiffT, SizeT); 234 void (*track_post_reg_write_clientcall_return)(ThreadId, PtrdiffT, SizeT, 235 Addr); 236 237 void (*track_copy_mem_to_reg)(CorePart, ThreadId, Addr, PtrdiffT, SizeT); 238 void (*track_copy_reg_to_mem)(CorePart, ThreadId, PtrdiffT, Addr, SizeT); 239 240 void (*track_start_client_code)(ThreadId, ULong); 241 void (*track_stop_client_code) (ThreadId, ULong); 242 243 void (*track_pre_thread_ll_create)(ThreadId, ThreadId); 244 void (*track_pre_thread_first_insn)(ThreadId); 245 void (*track_pre_thread_ll_exit) (ThreadId); 246 247 void (*track_pre_deliver_signal) (ThreadId, Int sigNo, Bool); 248 void (*track_post_deliver_signal)(ThreadId, Int sigNo); 249 250 } VgToolInterface; 251 252 extern VgToolInterface VG_(tdict); 253 254 /* --------------------------------------------------------------------- 255 Miscellaneous functions 256 ------------------------------------------------------------------ */ 257 258 Bool VG_(sanity_check_needs) ( const HChar** failmsg ); 259 260 #endif // __PUB_CORE_TOOLIFACE_H 261 262 /*--------------------------------------------------------------------*/ 263 /*--- end ---*/ 264 /*--------------------------------------------------------------------*/ 265