/* Copyright (C) 2007-2010 The Android Open Source Project
**
** This software is licensed under the terms of the GNU General Public
** License version 2, as published by the Free Software Foundation, and
** may be copied, distributed, and modified under those terms.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
*/
/*
* Contains declarations of memchecker external variables and routines, used by
* other qemu components.
*/
#ifndef QEMU_MEMCHECK_MEMCHECK_API_H
#define QEMU_MEMCHECK_MEMCHECK_API_H
/* This file should compile iff qemu is built with memory checking
* configuration turned on. */
#ifndef CONFIG_MEMCHECK
#error CONFIG_MEMCHECK is not defined.
#endif // CONFIG_MEMCHECK
/* Global flag, indicating whether or not memchecking has been enabled
* for the current emulator session. 1 means that memchecking has been
* enabled, 0 means that memchecking has not been enabled. The variable
* is declared in memchec/memcheck.c */
extern int memcheck_enabled;
/* Flags wether or not mmu instrumentation is enabled by memchecker.
* 1 - enabled, 0 - is not enabled. */
extern int memcheck_instrument_mmu;
/* Global flag, indicating whether or not memchecker is collecting call stack.
* 1 - call stack is being collected, 0 means that stack is not being
* collected. The variable is declared in memchec/memcheck.c */
extern int memcheck_watch_call_stack;
/* Array of (tb_pc, guest_pc) pairs, big enough for all translations. This
* array is used to obtain guest PC address from a translated PC address.
* tcg_gen_code_common will fill it up when memchecker is enabled. The array is
* declared in ./translate_all.c */
extern void** gen_opc_tpc2gpc_ptr;
/* Number of (tb_pc, guest_pc) pairs stored in gen_opc_tpc2gpc array.
* The variable is declared in ./translate_all.c */
extern unsigned int gen_opc_tpc2gpc_pairs;
/* Checks if given address range in the context of the current process is
* under surveillance by memchecker.
* Param:
* addr - Starting address of a range.
* size - Range size.
* Return:
* boolean: 1 if address range contains memory that requires access
* violation detection, or 0 if given address range is in no interest to
* the memchecker. */
int memcheck_is_checked(target_ulong addr, uint32_t size);
/* Validates __ldx_mmu operations.
* Param:
* addr - Virtual address in the guest space where memory is read.
* data_size - Size of the read.
* retaddr - Code address (in TB) that accesses memory.
* Return:
* 1 Address should be invalidated in TLB cache, in order to ensure that
* subsequent attempts to read from that page will launch __ld/__stx_mmu.
* If this routine returns zero, no page invalidation is requried.
*/
int memcheck_validate_ld(target_ulong addr,
uint32_t data_size,
target_ulong retaddr);
/* Validates __stx_mmu operations.
* Param:
* addr - Virtual address in the guest space where memory is written.
* data_size - Size of the write.
* value - Value to be written. Note that we typecast all values to 64 bits,
* since this will fit all data sizes.
* retaddr - Code address (in TB) that accesses memory.
* Return:
* 1 Address should be invalidated in TLB cache, in order to ensure that
* subsequent attempts to read from that page will launch __ld/__stx_mmu.
* If this routine returns zero, no page invalidation is requried.
*/
int memcheck_validate_st(target_ulong addr,
uint32_t data_size,
uint64_t value,
target_ulong retaddr);
/* Memchecker's handler for on_call callback.
* Param:
* pc - Guest address where call has been made.
* ret - Guest address where called routine will return.
*/
void memcheck_on_call(target_ulong pc, target_ulong ret);
/* Memchecker's handler for on_ret callback.
* Param:
* pc - Guest address where routine has returned.
*/
void memcheck_on_ret(target_ulong pc);
#endif // QEMU_MEMCHECK_MEMCHECK_API_H