/* 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 ANDROID_QEMU_MEMCHECK_MEMCHECK_API_H
#define ANDROID_QEMU_MEMCHECK_MEMCHECK_API_H

/* This file should compile iff qemu is built with memory checking
 * configuration turned on. */
#ifndef CONFIG_ANDROID_MEMCHECK
#error CONFIG_ANDROID_MEMCHECK is not defined.
#endif  // CONFIG_ANDROID_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  // ANDROID_QEMU_MEMCHECK_MEMCHECK_API_H
