Home | History | Annotate | Download | only in include
      1 
      2 /*--------------------------------------------------------------------*/
      3 /*--- Machine-related stuff.                    pub_tool_machine.h ---*/
      4 /*--------------------------------------------------------------------*/
      5 
      6 /*
      7    This file is part of Valgrind, a dynamic binary instrumentation
      8    framework.
      9 
     10    Copyright (C) 2000-2010 Julian Seward
     11       jseward (at) 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_TOOL_MACHINE_H
     32 #define __PUB_TOOL_MACHINE_H
     33 
     34 #if defined(VGP_x86_linux)
     35 #  define VG_MIN_INSTR_SZB          1  // min length of native instruction
     36 #  define VG_MAX_INSTR_SZB         16  // max length of native instruction
     37 #  define VG_CLREQ_SZB             14  // length of a client request, may
     38                                        //   be larger than VG_MAX_INSTR_SZB
     39 #  define VG_STACK_REDZONE_SZB      0  // number of addressable bytes below %RSP
     40 
     41 #elif defined(VGP_amd64_linux)
     42 #  define VG_MIN_INSTR_SZB          1
     43 #  define VG_MAX_INSTR_SZB         16
     44 #  define VG_CLREQ_SZB             19
     45 #  define VG_STACK_REDZONE_SZB    128
     46 
     47 #elif defined(VGP_ppc32_linux)
     48 #  define VG_MIN_INSTR_SZB          4
     49 #  define VG_MAX_INSTR_SZB          4
     50 #  define VG_CLREQ_SZB             20
     51 #  define VG_STACK_REDZONE_SZB      0
     52 
     53 #elif defined(VGP_ppc64_linux)
     54 #  define VG_MIN_INSTR_SZB          4
     55 #  define VG_MAX_INSTR_SZB          4
     56 #  define VG_CLREQ_SZB             20
     57 #  define VG_STACK_REDZONE_SZB    288  // number of addressable bytes below R1
     58                                        // from 64-bit PowerPC ELF ABI
     59                                        // Supplement 1.7
     60 
     61 #elif defined(VGP_arm_linux)
     62 #  define VG_MIN_INSTR_SZB          2
     63 #  define VG_MAX_INSTR_SZB          4
     64 #  define VG_CLREQ_SZB             20
     65 #  define VG_STACK_REDZONE_SZB      0
     66 
     67 #elif defined(VGP_ppc32_aix5)
     68 #  define VG_MIN_INSTR_SZB          4
     69 #  define VG_MAX_INSTR_SZB          4
     70 #  define VG_CLREQ_SZB             20
     71    /* The PowerOpen ABI actually says 220 bytes, but that is not an
     72       8-aligned number, and frequently forces Memcheck's
     73       mc_{new,die}_mem_stack_N routines into slow cases by losing
     74       8-alignment of the area to be messed with.  So let's just say
     75       224 instead.  Gdb has a similar kludge. */
     76 #  define VG_STACK_REDZONE_SZB    224
     77 
     78 #elif defined(VGP_ppc64_aix5)
     79 #  define VG_MIN_INSTR_SZB          4
     80 #  define VG_MAX_INSTR_SZB          4
     81 #  define VG_CLREQ_SZB             20
     82 #  define VG_STACK_REDZONE_SZB    288 // is this right?
     83 
     84 #elif defined(VGP_x86_darwin)
     85 #  define VG_MIN_INSTR_SZB          1  // min length of native instruction
     86 #  define VG_MAX_INSTR_SZB         16  // max length of native instruction
     87 #  define VG_CLREQ_SZB             14  // length of a client request, may
     88                                        //   be larger than VG_MAX_INSTR_SZB
     89 #  define VG_STACK_REDZONE_SZB      0  // number of addressable bytes below %RSP
     90 
     91 #elif defined(VGP_amd64_darwin)
     92 #  define VG_MIN_INSTR_SZB          1
     93 #  define VG_MAX_INSTR_SZB         16
     94 #  define VG_CLREQ_SZB             19
     95 #  define VG_STACK_REDZONE_SZB    128
     96 
     97 #else
     98 #  error Unknown platform
     99 #endif
    100 
    101 // Guest state accessors
    102 // Are mostly in the core_ header.
    103 //  Only these two are available to tools.
    104 Addr VG_(get_IP) ( ThreadId tid );
    105 Addr VG_(get_SP) ( ThreadId tid );
    106 
    107 
    108 // For get/set, 'area' is where the asked-for guest state will be copied
    109 // into/from.  If shadowNo == 0, the real (non-shadow) guest state is
    110 // accessed.  If shadowNo == 1, the first shadow area is accessed, and
    111 // if shadowNo == 2, the second shadow area is accessed.  This gives a
    112 // completely general way to read/modify a thread's guest register state
    113 // providing you know the offsets you need.
    114 void
    115 VG_(get_shadow_regs_area) ( ThreadId tid,
    116                             /*DST*/UChar* dst,
    117                             /*SRC*/Int shadowNo, PtrdiffT offset, SizeT size );
    118 void
    119 VG_(set_shadow_regs_area) ( ThreadId tid,
    120                             /*DST*/Int shadowNo, PtrdiffT offset, SizeT size,
    121                             /*SRC*/const UChar* src );
    122 
    123 // Sets the shadow values for the syscall return value register(s).
    124 // This is platform specific.
    125 void VG_(set_syscall_return_shadows) ( ThreadId tid,
    126                                        /* shadow vals for the result */
    127                                        UWord s1res, UWord s2res,
    128                                        /* shadow vals for the error val */
    129                                        UWord s1err, UWord s2err );
    130 
    131 // Apply a function 'f' to all the general purpose registers in all the
    132 // current threads.
    133 // This is very Memcheck-specific -- it's used to find the roots when
    134 // doing leak checking.
    135 extern void VG_(apply_to_GP_regs)(void (*f)(UWord val));
    136 
    137 // This iterator lets you inspect each live thread's stack bounds.
    138 // Returns False at the end.  'tid' is the iterator and you can only
    139 // safely change it by making calls to these functions.
    140 extern void VG_(thread_stack_reset_iter) ( /*OUT*/ThreadId* tid );
    141 extern Bool VG_(thread_stack_next)       ( /*MOD*/ThreadId* tid,
    142                                            /*OUT*/Addr* stack_min,
    143                                            /*OUT*/Addr* stack_max );
    144 
    145 // Returns .client_stack_highest_word for the given thread
    146 extern Addr VG_(thread_get_stack_max) ( ThreadId tid );
    147 
    148 // Returns how many bytes have been allocated for the stack of the given thread
    149 extern SizeT VG_(thread_get_stack_size) ( ThreadId tid );
    150 
    151 // Returns the bottommost address of the alternate signal stack.
    152 // See also the man page of sigaltstack().
    153 extern Addr VG_(thread_get_altstack_min) ( ThreadId tid );
    154 
    155 // Returns how many bytes have been allocated for the alternate signal stack.
    156 // See also the man page of sigaltstack().
    157 extern SizeT VG_(thread_get_altstack_size) ( ThreadId tid );
    158 
    159 // Given a pointer to a function as obtained by "& functionname" in C,
    160 // produce a pointer to the actual entry point for the function.  For
    161 // most platforms it's the identity function.  Unfortunately, on
    162 // ppc64-linux it isn't (sigh).
    163 extern void* VG_(fnptr_to_fnentry)( void* );
    164 
    165 #endif   // __PUB_TOOL_MACHINE_H
    166 
    167 /*--------------------------------------------------------------------*/
    168 /*--- end                                                          ---*/
    169 /*--------------------------------------------------------------------*/
    170