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 types, constants, and routines used by memory
     15  * checking framework.
     16  */
     17 
     18 #ifndef QEMU_MEMCHECK_MEMCHECK_H
     19 #define QEMU_MEMCHECK_MEMCHECK_H
     20 
     21 /* This file should compile iff qemu is built with memory checking
     22  * configuration turned on. */
     23 #ifndef CONFIG_MEMCHECK
     24 #error CONFIG_MEMCHECK is not defined.
     25 #endif  // CONFIG_MEMCHECK
     26 
     27 #include "memcheck_common.h"
     28 
     29 #ifdef __cplusplus
     30 extern "C" {
     31 #endif
     32 
     33 /* Initializes memory access checking framework.
     34  * This routine is called from emulator's main routine on condition,
     35  * that emulator has been started with -memcheck option.
     36  * Param:
     37  *  tracing_flags - Parameters set for the -memcheck option. These parameters
     38  *  contain abbreviation for memchecking tracing messages that should be enabled
     39  *  for the emulator and guest systems.
     40  */
     41 void memcheck_init(const char* tracing_flags);
     42 
     43 // =============================================================================
     44 // Handlers for memory allocation events, generated by the guest system.
     45 // =============================================================================
     46 
     47 /* Libc.so has been initialized by a process in guest's system.
     48  * This routine is called in response to TRACE_DEV_REG_LIBC_INIT event that is
     49  * fired up by the guest system on /dev/qemu_trace mapped page.
     50  * Param:
     51  *  pid - ID of the process in context of which libc.so has been initialized.
     52  */
     53 void memcheck_guest_libc_initialized(uint32_t pid);
     54 
     55 /* Guest system has allocated memory from heap.
     56  * This routine is called in response to TRACE_DEV_REG_MALLOC event that is
     57  * fired up by the guest system on /dev/qemu_trace mapped page.
     58  * Param:
     59  *  guest_address - Virtual address of allocation descriptor (MallocDesc) that
     60  *      contains information about allocated memory block. Note that this
     61  *      descriptor is located in the guests's user memory. Note also that
     62  *      emulator reports failure back to the guest by zeroing out libc_pid field
     63  *      of the structure, addressed by this parameter.
     64  */
     65 void memcheck_guest_alloc(target_ulong guest_address);
     66 
     67 /* Guest system is freeing memory to heap.
     68  * This routine is called in response to TRACE_DEV_REG_FREE_PTR event,
     69  * fired up by the guest system on /dev/qemu_trace mapped page.
     70  * Param:
     71  *  guest_address - Virtual address of free descriptor (MallocFree) that
     72  *      contains information about memory block that's being freed. Note that
     73  *      this descriptor is located in the guests's user memory.  Note also that
     74  *      emulator reports failure back to the guest by zeroing out libc_pid field
     75  *      of the structure, addressed by this parameter.
     76  */
     77 void memcheck_guest_free(target_ulong guest_address);
     78 
     79 /* Guest system has queried information about an address in its virtual memory.
     80  * This routine is called in response to TRACE_DEV_REG_QUERY_MALLOC event,
     81  * fired up by the guest system on /dev/qemu_trace mapped page.
     82  * Param:
     83  *  guest_address - Virtual address in the guest's space of the MallocDescQuery
     84  *      structure, that describes the query and receives the response. Note
     85  *      that emulator reports failure back to the guest by zeroing out libc_pid
     86  *      field of the structure, addressed by this parameter.
     87  */
     88 void memcheck_guest_query_malloc(target_ulong guest_address);
     89 
     90 /* Prints a string to emulator's stdout.
     91  * This routine is called in response to TRACE_DEV_REG_PRINT_USER_STR event,
     92  * fired up by the guest system on /dev/qemu_trace mapped page.
     93  * Param:
     94  *  str - Virtual address in the guest's space of the string to print.
     95  */
     96 void memcheck_guest_print_str(target_ulong str);
     97 
     98 // =============================================================================
     99 // Handlers for events, generated by the kernel.
    100 // =============================================================================
    101 
    102 /* Handles PID initialization event.
    103  * This routine is called in response to TRACE_DEV_REG_INIT_PID event, which
    104  * indicates that new process has been initialized (but not yet executed).
    105  * Param:
    106  *  pid - ID of the process that is being initialized. This value will also be
    107  *      used as main thread ID for the intializing process.
    108  */
    109 void memcheck_init_pid(uint32_t pid);
    110 
    111 /* Handles thread switch event.
    112  * This routine is called in response to TRACE_DEV_REG_SWITCH event, which
    113  * indicates that thread switch occurred in the guest system.
    114  * Param:
    115  *  tid - ID of the thread that becomes active.
    116  */
    117 void memcheck_switch(uint32_t tid);
    118 
    119 /* Handles process forking / new process creation event.
    120  * This routine is called in response to TRACE_DEV_REG_FORK event, which
    121  * indicates that new process has been forked / created. It's assumed, that
    122  * process that is forking new process is the current process.
    123  * Param:
    124  *  tgid - TODO: Clarify that!
    125  *  new_pid - Process ID that's been assigned to the forked process.
    126  */
    127 void memcheck_fork(uint32_t tgid, uint32_t new_pid);
    128 
    129 /* Handles new thread creation event.
    130  * This routine is called in response to TRACE_DEV_REG_CLONE event, which
    131  * indicates that new thread has been created in context of the current process.
    132  * Param:
    133  *  tgid - TODO: Clarify that!
    134  *  new_tid - Thread ID that's been assigned to the new thread.
    135  */
    136 void memcheck_clone(uint32_t tgid, uint32_t new_tid);
    137 
    138 /* Sets process command line.
    139  * This routine is called in response to TRACE_DEV_REG_CMDLINE event, which
    140  * is used to grab first command line argument, and use it is image path to
    141  * the current process.
    142  * Param:
    143  *  cmg_arg - Command line arguments.
    144  *  cmdlen - Length of the command line arguments string.
    145  */
    146 void memcheck_set_cmd_line(const char* cmd_arg, unsigned cmdlen);
    147 
    148 /* Handles thread / process exiting event.
    149  * This routine is called in response to TRACE_DEV_REG_EXIT event, which
    150  * indicates that current thread is exiting. We consider that process is
    151  * exiting when last thread for that process is exiting.
    152  * Param:
    153  *  exit_code - Thread exit code.
    154  */
    155 void memcheck_exit(uint32_t exit_code);
    156 
    157 /* Handles memory mapping of a module in guest address space.
    158  * This routine is called in response to TRACE_DEV_REG_EXECVE_VMSTART,
    159  * TRACE_DEV_REG_EXECVE_VMEND, TRACE_DEV_REG_EXECVE_OFFSET, and
    160  * TRACE_DEV_REG_MMAP_EXEPATH events, which indicate that a module has been
    161  * loaded and mapped on the guest system.
    162  * Param:
    163  *  vstart - Guest address where mapping starts.
    164  *  vend - Guest address where mapping ends.
    165  *  exec_offset - Exec offset inside module mapping.
    166  *  path - Path to the module that has been mapped.
    167  */
    168 void memcheck_mmap_exepath(target_ulong vstart,
    169                            target_ulong vend,
    170                            target_ulong exec_offset,
    171                            const char* path);
    172 
    173 /* Handles memory unmapping of a module in guest address space.
    174  * This routine is called in response to TRACE_DEV_REG_UNMAP_START, and
    175  * TRACE_DEV_REG_UNMAP_END events, which indicate that a module has been
    176  * unmapped on the guest system.
    177  * Param:
    178  *  vstart - Guest address where unmapping starts.
    179  *  vend - Guest address where unmapping ends.
    180  */
    181 void memcheck_unmap(target_ulong vstart, target_ulong vend);
    182 
    183 /* Global flag, indicating whether or not memchecking has been enabled
    184  * for the current emulator session. If set to zero, indicates that memchecking
    185  * is not enabled. Value other than zero indicates that memchecking is enabled
    186  * for the current emulator session.
    187  */
    188 extern int memcheck_enabled;
    189 
    190 #ifdef __cplusplus
    191 };  /* end of extern "C" */
    192 #endif
    193 
    194 #endif  // QEMU_MEMCHECK_MEMCHECK_H
    195