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 memchecker external variables and routines, used by
     15  * other qemu components.
     16  */
     17 
     18 #ifndef QEMU_MEMCHECK_MEMCHECK_API_H
     19 #define QEMU_MEMCHECK_MEMCHECK_API_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 /* Global flag, indicating whether or not memchecking has been enabled
     28  * for the current emulator session. 1 means that memchecking has been
     29  * enabled, 0 means that memchecking has not been enabled. The variable
     30  * is declared in memchec/memcheck.c */
     31 extern int memcheck_enabled;
     32 
     33 /* Flags wether or not mmu instrumentation is enabled by memchecker.
     34  * 1 - enabled, 0 - is not enabled. */
     35 extern int memcheck_instrument_mmu;
     36 
     37 /* Global flag, indicating whether or not memchecker is collecting call stack.
     38  * 1 - call stack is being collected, 0 means that stack is not being
     39  * collected. The variable is declared in memchec/memcheck.c */
     40 extern int memcheck_watch_call_stack;
     41 
     42 /* Array of (tb_pc, guest_pc) pairs, big enough for all translations. This
     43  * array is used to obtain guest PC address from a translated PC address.
     44  * tcg_gen_code_common will fill it up when memchecker is enabled. The array is
     45  * declared in ./translate_all.c */
     46 extern void** gen_opc_tpc2gpc_ptr;
     47 
     48 /* Number of (tb_pc, guest_pc) pairs stored in gen_opc_tpc2gpc array.
     49  * The variable is declared in ./translate_all.c */
     50 extern unsigned int gen_opc_tpc2gpc_pairs;
     51 
     52 /* Checks if given address range in the context of the current process is
     53  * under surveillance by memchecker.
     54  * Param:
     55  *  addr - Starting address of a range.
     56  *  size - Range size.
     57  * Return:
     58  *  boolean: 1 if address range contains memory that requires access
     59  *  violation detection, or 0 if given address range is in no interest to
     60  *  the memchecker. */
     61 int memcheck_is_checked(target_ulong addr, uint32_t size);
     62 
     63 /* Validates __ldx_mmu operations.
     64  * Param:
     65  *  addr - Virtual address in the guest space where memory is read.
     66  *  data_size - Size of the read.
     67  *  retaddr - Code address (in TB) that accesses memory.
     68  * Return:
     69  *  1 Address should be invalidated in TLB cache, in order to ensure that
     70  *  subsequent attempts to read from that page will launch __ld/__stx_mmu.
     71  *  If this routine returns zero, no page invalidation is requried.
     72  */
     73 int memcheck_validate_ld(target_ulong addr,
     74                          uint32_t data_size,
     75                          target_ulong retaddr);
     76 
     77 /* Validates __stx_mmu operations.
     78  * Param:
     79  *  addr - Virtual address in the guest space where memory is written.
     80  *  data_size - Size of the write.
     81  *  value - Value to be written. Note that we typecast all values to 64 bits,
     82  *      since this will fit all data sizes.
     83  *  retaddr - Code address (in TB) that accesses memory.
     84  * Return:
     85  *  1 Address should be invalidated in TLB cache, in order to ensure that
     86  *  subsequent attempts to read from that page will launch __ld/__stx_mmu.
     87  *  If this routine returns zero, no page invalidation is requried.
     88  */
     89 int memcheck_validate_st(target_ulong addr,
     90                          uint32_t data_size,
     91                          uint64_t value,
     92                          target_ulong retaddr);
     93 
     94 /* Memchecker's handler for on_call callback.
     95  * Param:
     96  *  pc - Guest address where call has been made.
     97  *  ret - Guest address where called routine will return.
     98  */
     99 void memcheck_on_call(target_ulong pc, target_ulong ret);
    100 
    101 /* Memchecker's handler for on_ret callback.
    102  * Param:
    103  *  pc - Guest address where routine has returned.
    104  */
    105 void memcheck_on_ret(target_ulong pc);
    106 
    107 #endif  // QEMU_MEMCHECK_MEMCHECK_API_H
    108