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 structures and routines that implement a red-black 15 * tree (a map) of module memory mapping ranges in the guest system. The map is 16 * organized in such a way, that each entry in the map describes a virtual 17 * address range that belongs to a mapped execution module in the guest system. 18 * Map considers two ranges to be equal if their address ranges intersect in 19 * any part. 20 */ 21 22 #ifndef QEMU_MEMCHECK_MEMCHECK_MMRANGE_MAP_H 23 #define QEMU_MEMCHECK_MEMCHECK_MMRANGE_MAP_H 24 25 #include "sys-tree.h" 26 #include "memcheck_common.h" 27 28 #ifdef __cplusplus 29 extern "C" { 30 #endif 31 32 /* Memory mapping range map. */ 33 typedef struct MMRangeMap { 34 /* Head of the map. */ 35 struct MMRangeMapEntry* rbh_root; 36 } MMRangeMap; 37 38 // ============================================================================= 39 // Map API 40 // ============================================================================= 41 42 /* Initializes the map. 43 * Param: 44 * map - Map to initialize. 45 */ 46 void mmrangemap_init(MMRangeMap* map); 47 48 /* Inserts new (or replaces existing) entry in the map. 49 * Insertion, or replacement is controlled by the value, passed to this routine 50 * with 'replaced' parameter. If this parameter is NULL, insertion will fail if 51 * a matching entry already exists in the map. If 'replaced' parameter is not 52 * NULL, and a matching entry exists in the map, content of the existing entry 53 * will be copied to the descriptor, addressed by 'replace' parameter, existing 54 * entry will be removed from the map, and new entry will be inserted. 55 * Param: 56 * map - Map where to insert new, or replace existing entry. 57 * desc - Descriptor to insert to the map. 58 * replaced - If not NULL, upon return from this routine contains descriptor 59 * that has been replaced in the map with the new entry. Note that if this 60 * routine returns with value other than RBT_MAP_RESULT_ENTRY_REPLACED, 61 * content of the 'replaced' buffer is not defined, as no replacement has 62 * actually occurred. 63 * Return 64 * See RBTMapResult for the return codes. 65 */ 66 RBTMapResult mmrangemap_insert(MMRangeMap* map, 67 const MMRangeDesc* desc, 68 MMRangeDesc* replaced); 69 70 /* Finds an entry in the map that matches the given address. 71 * Param: 72 * map - Map where to search for an entry. 73 * start - Starting address of a mapping range. 74 * end - Ending address of a mapping range. 75 * Return: 76 * Pointer to the descriptor found in a map entry, or NULL if no matching 77 * entry has been found in the map. 78 */ 79 MMRangeDesc* mmrangemap_find(const MMRangeMap* map, 80 target_ulong start, 81 target_ulong end); 82 83 /* Pulls (finds and removes) an entry from the map that matches the given 84 * address. 85 * Param: 86 * map - Map where to search for an entry. 87 * start - Starting address of a mapping range. 88 * end - Ending address of a mapping range. 89 * pulled - Upon successful return contains descriptor data pulled from the 90 * map. 91 * Return: 92 * Zero if a descriptor that matches the given address has been pulled, or 1 93 * if no matching entry has been found in the map. 94 */ 95 int mmrangemap_pull(MMRangeMap* map, 96 target_ulong start, 97 target_ulong end, 98 MMRangeDesc* pulled); 99 100 /* Copies content of one memory map to another. 101 * Param: 102 * to - Map where to copy entries to. 103 * from - Map where to copy entries from. 104 * Return: 105 * Zero on success, or -1 on error. 106 */ 107 int mmrangemap_copy(MMRangeMap* to, const MMRangeMap* from); 108 109 /* Empties the map. 110 * Param: 111 * map - Map to empty. 112 * Return: 113 * Number of entries removed from the map. 114 */ 115 int mmrangemap_empty(MMRangeMap* map); 116 117 #ifdef __cplusplus 118 }; /* end of extern "C" */ 119 #endif 120 121 #endif // QEMU_MEMCHECK_MEMCHECK_MMRANGE_MAP_H 122