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 */
31extern int memcheck_enabled;
32
33/* Flags wether or not mmu instrumentation is enabled by memchecker.
34 * 1 - enabled, 0 - is not enabled. */
35extern 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 */
40extern 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 */
46extern 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 */
50extern 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. */
61int 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 */
73int 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 */
89int 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 */
99void 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 */
105void memcheck_on_ret(target_ulong pc);
106
107#endif  // QEMU_MEMCHECK_MEMCHECK_API_H
108