Home | History | Annotate | Download | only in memcheck
      1 /* Copyright (C) 2007-2010 The Android Open Source Project
      2 **
      3 ** This software is licensed under the terms of the GNU General Public
      4 ** License version 2, as published by the Free Software Foundation, and
      5 ** may be copied, distributed, and modified under those terms.
      6 **
      7 ** This program is distributed in the hope that it will be useful,
      8 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
      9 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     10 ** GNU General Public License for more details.
     11 */
     12 
     13 /*
     14  * Contains declarations of utility routines for memchecker framework.
     15  */
     16 
     17 #ifndef QEMU_MEMCHECK_MEMCHECK_UTIL_H
     18 #define QEMU_MEMCHECK_MEMCHECK_UTIL_H
     19 
     20 #include "memcheck_common.h"
     21 #include "elff/elff_api.h"
     22 #include "exec.h"
     23 
     24 #ifdef __cplusplus
     25 extern "C" {
     26 #endif
     27 
     28 // =============================================================================
     29 // Transfering data between guest and emulator address spaces.
     30 // =============================================================================
     31 
     32 /* Copies buffer residing in the guest's virtual address space to a buffer
     33  * in the emulator's address space.
     34  * Param:
     35  *  guest_address - Address of the bufer in guest's virtual address space.
     36  *  qemu_address - Address of the bufer in the emulator's address space.
     37  *  buffer_size - Byte size of the guest's buffer.
     38  */
     39 void memcheck_get_guest_buffer(void* qemu_address,
     40                                target_ulong guest_address,
     41                                size_t buffer_size);
     42 
     43 /* Copies buffer residing in the emulator's address space to a buffer in the
     44  * guest's virtual address space.
     45  * Param:
     46  *  qemu_address - Address of the bufer in the emulator's address space.
     47  *  guest_address - Address of the bufer in guest's virtual address space.
     48  *  buffer_size - Byte size of the emualtor's buffer.
     49  */
     50 void memcheck_set_guest_buffer(target_ulong guest_address,
     51                                const void* qemu_address,
     52                                size_t buffer_size);
     53 
     54 /* Copies zero-terminated string residing in the guest's virtual address space
     55  * to a string buffer in emulator's address space.
     56  * Param:
     57  *  qemu_str - Address of the string bufer in the emulator's address space.
     58  *  guest_str - Address of the string in guest's virtual address space.
     59  *  qemu_buffer_size - Size of the emulator's string buffer.
     60  * Return
     61  *  Length of the string that has been copied.
     62  */
     63 size_t memcheck_get_guest_string(char* qemu_str,
     64                                  target_ulong guest_str,
     65                                  size_t qemu_buffer_size);
     66 
     67 /* Copies zero-terminated string residing in the guest's kernel address space
     68  * to a string buffer in emulator's address space.
     69  * Param:
     70  *  qemu_str - Address of the string bufer in the emulator's address space.
     71  *  guest_str - Address of the string in guest's kernel address space.
     72  *  qemu_buffer_size - Size of the emulator's string buffer.
     73  * Return
     74  *  Length of the string that has been copied.
     75  */
     76 size_t memcheck_get_guest_kernel_string(char* qemu_str,
     77                                         target_ulong guest_str,
     78                                         size_t qemu_buffer_size);
     79 
     80 // =============================================================================
     81 // Helpers for transfering memory allocation information.
     82 // =============================================================================
     83 
     84 /* Copies memory allocation descriptor from the guest's address space to the
     85  * emulator's memory.
     86  * Param:
     87  *  qemu_address - Descriptor address in the emulator's address space where to
     88  *      copy descriptor.
     89  *  guest_address - Descriptor address in the guest's address space.
     90  */
     91 static inline void
     92 memcheck_get_malloc_descriptor(MallocDesc* qemu_address,
     93                                target_ulong guest_address)
     94 {
     95     memcheck_get_guest_buffer(qemu_address, guest_address, sizeof(MallocDesc));
     96 }
     97 
     98 /* Copies memory allocation descriptor from the emulator's memory to the guest's
     99  * address space.
    100  * Param:
    101  *  guest_address - Descriptor address in the guest's address space.
    102  *  qemu_address - Descriptor address in the emulator's address space where to
    103  *  copy descriptor.
    104  */
    105 static inline void
    106 memcheck_set_malloc_descriptor(target_ulong guest_address,
    107                                const MallocDesc* qemu_address)
    108 {
    109     memcheck_set_guest_buffer(guest_address, qemu_address, sizeof(MallocDesc));
    110 }
    111 
    112 /* Copies memory free descriptor from the guest's address space to the
    113  * emulator's memory.
    114  * Param:
    115  *  qemu_address - Descriptor address in the emulator's address space where to
    116  *      copy descriptor.
    117  *  guest_address - Descriptor address in the guest's address space.
    118  */
    119 static inline void
    120 memcheck_get_free_descriptor(MallocFree* qemu_address,
    121                              target_ulong guest_address)
    122 {
    123     memcheck_get_guest_buffer(qemu_address, guest_address, sizeof(MallocFree));
    124 }
    125 
    126 /* Copies memory allocation query descriptor from the guest's address space to
    127  * the emulator's memory.
    128  * Param:
    129  *  guest_address - Descriptor address in the guest's address space.
    130  *  qemu_address - Descriptor address in the emulator's address space where to
    131  *      copy descriptor.
    132  */
    133 static inline void
    134 memcheck_get_query_descriptor(MallocDescQuery* qemu_address,
    135                               target_ulong guest_address)
    136 {
    137     memcheck_get_guest_buffer(qemu_address, guest_address,
    138                               sizeof(MallocDescQuery));
    139 }
    140 
    141 /* Fails allocation request (TRACE_DEV_REG_MALLOC event).
    142  * Allocation request failure is reported by zeroing 'libc_pid' filed in the
    143  * allocation descriptor in the guest's address space.
    144  * Param:
    145  *  guest_address - Allocation descriptor address in the guest's address space,
    146  *      where to record failure.
    147  */
    148 void memcheck_fail_alloc(target_ulong guest_address);
    149 
    150 /* Fails free request (TRACE_DEV_REG_FREE_PTR event).
    151  * Free request failure is reported by zeroing 'libc_pid' filed in the free
    152  * descriptor in the guest's address space.
    153  * Param:
    154  *  guest_address - Free descriptor address in the guest's address space, where
    155  *      to record failure.
    156  */
    157 void memcheck_fail_free(target_ulong guest_address);
    158 
    159 /* Fails memory allocation query request (TRACE_DEV_REG_QUERY_MALLOC event).
    160  * Query request failure is reported by zeroing 'libc_pid' filed in the query
    161  * descriptor in the guest's address space.
    162  * Param:
    163  *  guest_address - Query descriptor address in the guest's address space, where
    164  *      to record failure.
    165  */
    166 void memcheck_fail_query(target_ulong guest_address);
    167 
    168 // =============================================================================
    169 // Misc. utility routines.
    170 // =============================================================================
    171 
    172 /* Converts PC address in the translated block to a corresponded PC address in
    173  * the guest address space.
    174  * Param:
    175  *  tb_pc - PC address in the translated block.
    176  * Return:
    177  *  Corresponded PC address in the guest address space on success, or NULL if
    178  *  conversion has failed.
    179  */
    180 static inline target_ulong
    181 memcheck_tpc_to_gpc(target_ulong tb_pc)
    182 {
    183     const TranslationBlock* tb = tb_find_pc(tb_pc);
    184     return tb != NULL ? tb_search_guest_pc_from_tb_pc(tb, tb_pc) : 0;
    185 }
    186 
    187 /* Invalidates TLB table pages that contain given memory range.
    188  * This routine is called after new entry is inserted into allocation map, so
    189  * every access to the allocated block will cause __ld/__stx_mmu to be called.
    190  * Param:
    191  *  start - Beginning of the allocated block to invalidate pages for.
    192  *  end - End of (past one byte after) the allocated block to invalidate pages
    193  *      for.
    194  */
    195 void invalidate_tlb_cache(target_ulong start, target_ulong end);
    196 
    197 /* Gets routine, file path and line number information for a PC address in the
    198  * given module.
    199  * Param:
    200  *  abs_pc - PC address.
    201  *  rdesc - Mapped memory range descriptor for the module containing abs_pc.
    202  *  info - Upon successful return will contain routine, file path and line
    203  *      information for the given PC address in the given module.
    204  *      NOTE: Pathnames, saved into this structure are contained in mapped
    205  *      sections of the symbols file for the module addressed by module_path.
    206  *      Thus, pathnames are accessible only while elff_handle returned from this
    207  *      routine remains opened.
    208  *      NOTE: each successful call to this routine requires the caller to call
    209  *      elff_free_pc_address_info for Elf_AddressInfo structure.
    210  *  elff_handle - Upon successful return will contain a handle to the ELFF API
    211  *      that wraps symbols file for the module, addressed by module_path. The
    212  *      handle must remain opened for as long as pathnames in the info structure
    213  *      are accessed, and must be eventually closed via call to elff_close.
    214  * Return:
    215  *  0 on success, 1, if symbols file for the module has not been found, or -1 on
    216  *  other failures. If a failure is returned from this routine content of info
    217  *  and elff_handle parameters is undefined.
    218  */
    219 int memcheck_get_address_info(target_ulong abs_pc,
    220                               const MMRangeDesc* rdesc,
    221                               Elf_AddressInfo* info,
    222                               ELFF_HANDLE* elff_handle);
    223 
    224 /* Dumps content of an allocation descriptor to stdout.
    225  * Param desc - Allocation descriptor to dump.
    226  * print_flags - If 1, flags field of the descriptor will be dumped to stdout.
    227  *      If 0, flags filed will not be dumped.
    228  * print_proc_info - If 1, allocator's process information for the descriptor
    229  *      will be dumped to stdout. If 0, allocator's process information will
    230  *      not be dumped.
    231  */
    232 void memcheck_dump_malloc_desc(const MallocDescEx* desc,
    233                                int print_flags,
    234                                int print_proc_info);
    235 
    236 #ifdef __cplusplus
    237 };  /* end of extern "C" */
    238 #endif
    239 
    240 #endif  // QEMU_MEMCHECK_MEMCHECK_UTIL_H
    241