Home | History | Annotate | Download | only in coregrind
      1 
      2 /*--------------------------------------------------------------------*/
      3 /*--- Handle remote gdb protocol.             pub_core_gdbserver.h ---*/
      4 /*--------------------------------------------------------------------*/
      5 
      6 /*
      7    This file is part of Valgrind, a dynamic binary instrumentation
      8    framework.
      9 
     10    Copyright (C) 2011-2013 Philippe Waroquiers
     11 
     12    This program is free software; you can redistribute it and/or
     13    modify it under the terms of the GNU General Public License as
     14    published by the Free Software Foundation; either version 2 of the
     15    License, or (at your option) any later version.
     16 
     17    This program is distributed in the hope that it will be useful, but
     18    WITHOUT ANY WARRANTY; without even the implied warranty of
     19    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     20    General Public License for more details.
     21 
     22    You should have received a copy of the GNU General Public License
     23    along with this program; if not, write to the Free Software
     24    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
     25    02111-1307, USA.
     26 
     27    The GNU General Public License is contained in the file COPYING.
     28 */
     29 
     30 #ifndef __PUB_CORE_GDBSERVER_H
     31 #define __PUB_CORE_GDBSERVER_H
     32 
     33 #include "pub_tool_gdbserver.h"
     34 #include "pub_core_options.h"
     35 #include "pub_core_threadstate.h"   // VgSchedReturnCode
     36 
     37 /* Return the default path prefix for the named pipes (FIFOs) used by vgdb/gdb
     38    to communicate with valgrind */
     39 HChar* VG_(vgdb_prefix_default)(void);
     40 
     41 // After a fork or after an exec, call the below to (possibly) terminate
     42 // the previous gdbserver and then activate a new gdbserver
     43 // before any guest code execution, to e.g. allow the user to set
     44 // breakpoints before execution.
     45 // If VG_(clo_vgdb) == No, the below has no effect.
     46 void VG_(gdbserver_prerun_action) (ThreadId tid);
     47 
     48 // True if the initialisation of gdbserver was done,
     49 // i.e. VG_(gdbserver_prerun_action) was called.
     50 Bool VG_(gdbserver_init_done) (void);
     51 
     52 // True if gdbserver should stop execution for the specified stop at reason
     53 Bool VG_(gdbserver_stop_at) (VgdbStopAt stopat);
     54 
     55 // True if there is some activity from vgdb
     56 // If it returns True, then extern void VG_(gdbserver) can be called
     57 // to handle this incoming vgdb request.
     58 extern Bool VG_(gdbserver_activity) (ThreadId tid);
     59 
     60 // If connected to GDB, VG_(gdbserver_exit) reports to GDB that the process
     61 // is about to exit.
     62 // gdbserver is then stopped (using VG_(gdbserver) (0))
     63 void VG_(gdbserver_exit) (ThreadId tid, VgSchedReturnCode tids_schedretcode);
     64 
     65 /* On systems that defines PR_SET_PTRACER, verify if ptrace_scope is
     66    is permissive enough for vgdb or --db-attach=yes.
     67    Otherwise, call set_ptracer.
     68    This is especially aimed at Ubuntu >= 10.10 which has added
     69    the ptrace_scope context. */
     70 void VG_(set_ptracer)(void);
     71 
     72 /* Called by low level to insert or remove a break or watch point.
     73    Break or watch point implementation is done using help from the tool.
     74    break point support implies some (small) specific instrumentation
     75    taken in charge for all tools by m_translate.c.
     76 
     77    Write/read/access watchpoint can only be provided by tools which are
     78    tracking addressability and/or accessibility of memory
     79    (so typically memcheck can provide it). Note that memcheck addressability
     80    bits do not differentiate between read and write accessibility.
     81    However, when accessing unaddressable byte, memcheck can differentiate
     82    reads from write, thereby providing read/write or access watchpoints.
     83 
     84    Note that gdbserver assumes that software breakpoint is supported
     85    (as this will be done by re-instrumenting the code).
     86    Note that len is ignored for sofware breakpoints. hardware_breakpoint
     87    are not supported.
     88 
     89    Returns True if the point has properly been inserted or removed
     90    Returns False otherwise. */
     91 Bool VG_(gdbserver_point) (PointKind kind, Bool insert,
     92                            Addr addr, int len);
     93 
     94 /* True if there is a breakpoint at addr. */
     95 Bool VG_(has_gdbserver_breakpoint) (Addr addr);
     96 
     97 /* Entry point invoked by vgdb when it uses ptrace to cause a gdbserver
     98    invocation. A magic value is passed by vgdb in check as a verification
     99    that the call has been properly pushed by vgdb. */
    100 extern void VG_(invoke_gdbserver) ( int check );
    101 
    102 // To be called by core (m_signals.c) before delivering a signal.
    103 // Returns True unless gdb user asks to not pass the signal to the client.
    104 // Note that if the below returns True, the signal might
    105 // still be ignored if this is the action desired by the
    106 // guest program.
    107 extern Bool VG_(gdbserver_report_signal) (Int signo, ThreadId tid);
    108 
    109 /* Entry point invoked by scheduler.c to execute the request
    110    VALGRIND_CLIENT_MONITOR_COMMAND.
    111    Returns True if command was not recognised. */
    112 extern Bool VG_(client_monitor_command) (HChar* cmd);
    113 
    114 /* software_breakpoint, single step and jump support ------------------------*/
    115 /* VG_(instrument_for_gdbserver_if_needed) allows to do "standard and easy"
    116    instrumentation for gdbserver.
    117    VG_(instrument_for_gdbserver_if_needed) does the following:
    118       * checks if gdbserver instrumentation is needed for vge.
    119       * if no gdbserver instrumentation needed,
    120            returns sb_in
    121       * otherwise
    122         It will instrument sb_in to allow gdbserver to properly
    123         handle breakpoints and single_stepping in sb_in.
    124         All the target jumps of sb_in will also be invalidated
    125         if these are not yet instrumented for gdbserver.
    126         This allows to have single_step working, using a lazily
    127         translation of the blocks which are being single stepped
    128         in.
    129 
    130    The typical usage of this function is to call it on the block
    131    instrumented by the tool instrument function i.e. :
    132      return VG_(instrument_for_gdbserver_if_needed) (sb_out,
    133                                                      layout,
    134                                                      vge,
    135                                                      gWordTy,
    136                                                      hWordTy);
    137    where sb_out is the block instrumented by the tool.
    138 
    139    If the block contains a call to a dirty helper that indirectly
    140    calls gdbserver, then this dirty helper can (indirectly) change
    141    the IP. This implies to jump to this IP after the call to
    142    gdbserver. */
    143 extern IRSB* VG_(instrument_for_gdbserver_if_needed)
    144      (IRSB* sb_in,                   /* block to be instrumented */
    145       VexGuestLayout* layout,
    146       VexGuestExtents* vge,
    147       IRType gWordTy, IRType hWordTy);
    148 
    149 /* reason for which gdbserver connection must be finished */
    150 typedef
    151    enum {
    152       orderly_finish,
    153       reset_after_error,
    154       reset_after_fork} FinishReason;
    155 
    156 /* output various gdbserver statistics and status. */
    157 extern void VG_(gdbserver_status_output)(void);
    158 
    159 /* Shared structure between vgdb and the process running
    160    under valgrind.
    161    We define two variants: a 32 bit and a 64 bit.
    162    The valgrind process will use the appropriate size,
    163    according to the architecture.
    164    vgdb will use what the valgrind process is using. */
    165 /* The below takes care that sizes will be 32 or 64 bits,
    166    whatever the architecture. A.o., vgdb.c cannot use directly
    167    the types from pub_core_threadstate.h as we want vgdb.c to
    168    be independent of the arch it is debugging in case of bi-arch
    169    Valgrind (e.g. x86 and amd64). So, the valgrind process must
    170    give all the needed info/offset to vgdb in the below structure. */
    171 
    172 typedef
    173    struct {
    174       // nr of bytes vgdb has written to valgrind
    175       volatile int written_by_vgdb;
    176       // nr of bytes seen by valgrind
    177       volatile int seen_by_valgrind;
    178 
    179       // address at which gdbserver can be invoked
    180       Addr32 invoke_gdbserver;
    181 
    182       // address of VG_(threads) and various sizes
    183       // and offset needed by vgdb.
    184       Addr32 threads;
    185       int sizeof_ThreadState;
    186       int offset_status;
    187       int offset_lwpid;
    188 
    189       // PID of the vgdb that last connected to the Valgrind gdbserver.
    190       // It will be set by vgdb after connecting.
    191       int vgdb_pid;
    192    } VgdbShared32;
    193 
    194 /* Same as VgdbShared32 but for 64 bits arch. */
    195 typedef
    196    struct {
    197       volatile int written_by_vgdb;
    198       volatile int seen_by_valgrind;
    199 
    200       Addr64 invoke_gdbserver;
    201 
    202       Addr64 threads;
    203       int sizeof_ThreadState;
    204       int offset_status;
    205       int offset_lwpid;
    206 
    207       int vgdb_pid;
    208    } VgdbShared64;
    209 
    210 // The below typedef makes the life of valgrind easier.
    211 // vgdb must however work explicitely with the specific 32 or 64 bits version.
    212 
    213 #if VEX_HOST_WORDSIZE == 8
    214 typedef VgdbShared64 VgdbShared;
    215 #elif VEX_HOST_WORDSIZE == 4
    216 typedef VgdbShared32 VgdbShared;
    217 #else
    218 # error "unexpected wordsize"
    219 #endif
    220 
    221 
    222 #endif   // __PUB_CORE_GDBSERVER_H
    223 /*--------------------------------------------------------------------*/
    224 /*--- end                                                          ---*/
    225 /*--------------------------------------------------------------------*/
    226