blob: d15eedf7999dab57c917dc281a9e0ad3257679cd [file] [log] [blame]
Vladimir Chtchetkine5389aa12010-02-16 10:38:35 -08001/* 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 utility routines for memchecker framework.
15 */
16
17#ifndef QEMU_MEMCHECK_MEMCHECK_UTIL_H
18#define QEMU_MEMCHECK_MEMCHECK_UTIL_H
19
Vladimir Chtchetkine5389aa12010-02-16 10:38:35 -080020#include "memcheck_common.h"
David 'Digit' Turner4e024bb2010-09-22 14:19:28 +020021#include "elff/elff_api.h"
David 'Digit' Turner52858642011-06-03 13:41:05 +020022#include "exec.h"
Vladimir Chtchetkine5389aa12010-02-16 10:38:35 -080023
24#ifdef __cplusplus
25extern "C" {
26#endif
27
28// =============================================================================
29// Transfering data between guest and emulator address spaces.
30// =============================================================================
31
32/* Copies buffer residing in the guest's virtual address space to a buffer
33 * in the emulator's address space.
34 * Param:
35 * guest_address - Address of the bufer in guest's virtual address space.
36 * qemu_address - Address of the bufer in the emulator's address space.
37 * buffer_size - Byte size of the guest's buffer.
38 */
39void memcheck_get_guest_buffer(void* qemu_address,
40 target_ulong guest_address,
41 size_t buffer_size);
42
43/* Copies buffer residing in the emulator's address space to a buffer in the
44 * guest's virtual address space.
45 * Param:
46 * qemu_address - Address of the bufer in the emulator's address space.
47 * guest_address - Address of the bufer in guest's virtual address space.
48 * buffer_size - Byte size of the emualtor's buffer.
49 */
50void memcheck_set_guest_buffer(target_ulong guest_address,
51 const void* qemu_address,
52 size_t buffer_size);
53
54/* Copies zero-terminated string residing in the guest's virtual address space
55 * to a string buffer in emulator's address space.
56 * Param:
57 * qemu_str - Address of the string bufer in the emulator's address space.
58 * guest_str - Address of the string in guest's virtual address space.
59 * qemu_buffer_size - Size of the emulator's string buffer.
60 * Return
61 * Length of the string that has been copied.
62 */
63size_t memcheck_get_guest_string(char* qemu_str,
64 target_ulong guest_str,
65 size_t qemu_buffer_size);
66
67/* Copies zero-terminated string residing in the guest's kernel address space
68 * to a string buffer in emulator's address space.
69 * Param:
70 * qemu_str - Address of the string bufer in the emulator's address space.
71 * guest_str - Address of the string in guest's kernel address space.
72 * qemu_buffer_size - Size of the emulator's string buffer.
73 * Return
74 * Length of the string that has been copied.
75 */
76size_t memcheck_get_guest_kernel_string(char* qemu_str,
77 target_ulong guest_str,
78 size_t qemu_buffer_size);
79
80// =============================================================================
81// Helpers for transfering memory allocation information.
82// =============================================================================
83
84/* Copies memory allocation descriptor from the guest's address space to the
85 * emulator's memory.
86 * Param:
87 * qemu_address - Descriptor address in the emulator's address space where to
88 * copy descriptor.
89 * guest_address - Descriptor address in the guest's address space.
90 */
91static inline void
92memcheck_get_malloc_descriptor(MallocDesc* qemu_address,
93 target_ulong guest_address)
94{
95 memcheck_get_guest_buffer(qemu_address, guest_address, sizeof(MallocDesc));
96}
97
98/* Copies memory allocation descriptor from the emulator's memory to the guest's
99 * address space.
100 * Param:
101 * guest_address - Descriptor address in the guest's address space.
102 * qemu_address - Descriptor address in the emulator's address space where to
103 * copy descriptor.
104 */
105static inline void
106memcheck_set_malloc_descriptor(target_ulong guest_address,
107 const MallocDesc* qemu_address)
108{
109 memcheck_set_guest_buffer(guest_address, qemu_address, sizeof(MallocDesc));
110}
111
112/* Copies memory free descriptor from the guest's address space to the
113 * emulator's memory.
114 * Param:
115 * qemu_address - Descriptor address in the emulator's address space where to
116 * copy descriptor.
117 * guest_address - Descriptor address in the guest's address space.
118 */
119static inline void
120memcheck_get_free_descriptor(MallocFree* qemu_address,
121 target_ulong guest_address)
122{
123 memcheck_get_guest_buffer(qemu_address, guest_address, sizeof(MallocFree));
124}
125
126/* Copies memory allocation query descriptor from the guest's address space to
127 * the emulator's memory.
128 * Param:
129 * guest_address - Descriptor address in the guest's address space.
130 * qemu_address - Descriptor address in the emulator's address space where to
131 * copy descriptor.
132 */
133static inline void
134memcheck_get_query_descriptor(MallocDescQuery* qemu_address,
135 target_ulong guest_address)
136{
137 memcheck_get_guest_buffer(qemu_address, guest_address,
138 sizeof(MallocDescQuery));
139}
140
141/* Fails allocation request (TRACE_DEV_REG_MALLOC event).
142 * Allocation request failure is reported by zeroing 'libc_pid' filed in the
143 * allocation descriptor in the guest's address space.
144 * Param:
145 * guest_address - Allocation descriptor address in the guest's address space,
146 * where to record failure.
147 */
148void memcheck_fail_alloc(target_ulong guest_address);
149
150/* Fails free request (TRACE_DEV_REG_FREE_PTR event).
151 * Free request failure is reported by zeroing 'libc_pid' filed in the free
152 * descriptor in the guest's address space.
153 * Param:
154 * guest_address - Free descriptor address in the guest's address space, where
155 * to record failure.
156 */
157void memcheck_fail_free(target_ulong guest_address);
158
159/* Fails memory allocation query request (TRACE_DEV_REG_QUERY_MALLOC event).
160 * Query request failure is reported by zeroing 'libc_pid' filed in the query
161 * descriptor in the guest's address space.
162 * Param:
163 * guest_address - Query descriptor address in the guest's address space, where
164 * to record failure.
165 */
166void memcheck_fail_query(target_ulong guest_address);
167
168// =============================================================================
169// Misc. utility routines.
170// =============================================================================
171
172/* Converts PC address in the translated block to a corresponded PC address in
173 * the guest address space.
174 * Param:
175 * tb_pc - PC address in the translated block.
176 * Return:
177 * Corresponded PC address in the guest address space on success, or NULL if
178 * conversion has failed.
179 */
180static inline target_ulong
181memcheck_tpc_to_gpc(target_ulong tb_pc)
182{
183 const TranslationBlock* tb = tb_find_pc(tb_pc);
184 return tb != NULL ? tb_search_guest_pc_from_tb_pc(tb, tb_pc) : 0;
185}
186
187/* Invalidates TLB table pages that contain given memory range.
188 * This routine is called after new entry is inserted into allocation map, so
189 * every access to the allocated block will cause __ld/__stx_mmu to be called.
190 * Param:
191 * start - Beginning of the allocated block to invalidate pages for.
192 * end - End of (past one byte after) the allocated block to invalidate pages
193 * for.
194 */
195void invalidate_tlb_cache(target_ulong start, target_ulong end);
196
197/* Gets routine, file path and line number information for a PC address in the
198 * given module.
199 * Param:
200 * abs_pc - PC address.
201 * rdesc - Mapped memory range descriptor for the module containing abs_pc.
202 * info - Upon successful return will contain routine, file path and line
203 * information for the given PC address in the given module.
204 * NOTE: Pathnames, saved into this structure are contained in mapped
205 * sections of the symbols file for the module addressed by module_path.
206 * Thus, pathnames are accessible only while elff_handle returned from this
207 * routine remains opened.
208 * NOTE: each successful call to this routine requires the caller to call
209 * elff_free_pc_address_info for Elf_AddressInfo structure.
210 * elff_handle - Upon successful return will contain a handle to the ELFF API
211 * that wraps symbols file for the module, addressed by module_path. The
212 * handle must remain opened for as long as pathnames in the info structure
213 * are accessed, and must be eventually closed via call to elff_close.
214 * Return:
215 * 0 on success, 1, if symbols file for the module has not been found, or -1 on
216 * other failures. If a failure is returned from this routine content of info
217 * and elff_handle parameters is undefined.
218 */
219int memcheck_get_address_info(target_ulong abs_pc,
220 const MMRangeDesc* rdesc,
221 Elf_AddressInfo* info,
222 ELFF_HANDLE* elff_handle);
223
224/* Dumps content of an allocation descriptor to stdout.
225 * Param desc - Allocation descriptor to dump.
226 * print_flags - If 1, flags field of the descriptor will be dumped to stdout.
227 * If 0, flags filed will not be dumped.
228 * print_proc_info - If 1, allocator's process information for the descriptor
229 * will be dumped to stdout. If 0, allocator's process information will
230 * not be dumped.
231 */
232void memcheck_dump_malloc_desc(const MallocDescEx* desc,
233 int print_flags,
234 int print_proc_info);
235
236#ifdef __cplusplus
237}; /* end of extern "C" */
238#endif
239
240#endif // QEMU_MEMCHECK_MEMCHECK_UTIL_H