• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 target_ulong* 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