| /* 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 structures and routines that implement a red-black |
| * tree (a map) of memory blocks allocated by the guest system. The map is |
| * organized in such a way, that each entry in the map describes a virtual |
| * address range that belongs to a memory block allocated in the guest's space. |
| * The range includes block's suffix and prefix, as well as block returned to |
| * malloc's caller. Map considers two blocks to be equal if their address ranges |
| * intersect in any part. Allocation descriptor maps are instantiated one per |
| * each process running on the guest system. |
| */ |
| |
| #ifndef QEMU_MEMCHECK_MEMCHECK_MALLOC_MAP_H |
| #define QEMU_MEMCHECK_MEMCHECK_MALLOC_MAP_H |
| |
| #include "sys-tree.h" |
| #include "memcheck_common.h" |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /* Allocation descriptors map. */ |
| typedef struct AllocMap { |
| /* Head of the map. */ |
| struct AllocMapEntry* rbh_root; |
| } AllocMap; |
| |
| // ============================================================================= |
| // Map API |
| // ============================================================================= |
| |
| /* Initializes allocation descriptors map. |
| * Param: |
| * map - Allocation descriptors map to initialize. |
| */ |
| void allocmap_init(AllocMap* map); |
| |
| /* Inserts new (or replaces existing) entry in the allocation descriptors map. |
| * Insertion, or replacement is controlled by the value, passed to this routine |
| * with 'replaced' parameter. If this parameter is NULL, insertion will fail if |
| * a matching entry already exists in the map. If 'replaced' parameter is not |
| * NULL, and a matching entry exists in the map, content of the existing entry |
| * will be copied to the descriptor, addressed by 'replace' parameter, existing |
| * entry will be removed from the map, and new entry will be inserted. |
| * Param: |
| * map - Allocation descriptors map where to insert new, or replace existing |
| * entry. |
| * desc - Allocation descriptor to insert to the map. |
| * replaced - If not NULL, upon return from this routine contains descriptor |
| * that has been replaced in the map with the new entry. Note that if this |
| * routine returns with value other than RBT_MAP_RESULT_ENTRY_REPLACED, |
| * content of the 'replaced' buffer is not defined, as no replacement has |
| * actually occurred. |
| * Return |
| * See RBTMapResult for the return codes. |
| */ |
| RBTMapResult allocmap_insert(AllocMap* map, |
| const MallocDescEx* desc, |
| MallocDescEx* replaced); |
| |
| /* Finds an entry in the allocation descriptors map that matches the given |
| * address. |
| * Param: |
| * map - Allocation descriptors map where to search for an entry. |
| * address - Virtual address in the guest's user space to find matching |
| * entry for. Entry matches the address, if address is contained within |
| * allocated memory range (including guarding areas), as defined by the |
| * memory allocation descriptor for that entry. |
| * block_size - Size of the block, beginning with 'address'. |
| * Return: |
| * Pointer to the allocation descriptor found in a map entry, or NULL if no |
| * matching entry has been found in the map. |
| */ |
| MallocDescEx* allocmap_find(const AllocMap* map, |
| target_ulong address, |
| uint32_t block_size); |
| |
| /* Pulls (finds and removes) an entry from the allocation descriptors map that |
| * matches the given address. |
| * Param: |
| * map - Allocation descriptors map where to search for an entry. |
| * address - Virtual address in the guest's user space to find matching |
| * entry for. Entry matches the address, if address is contained within |
| * allocated memory range (including guarding areas), as defined by the |
| * memory allocation descriptor for that entry. |
| * pulled - Upon successful return contains allocation descriptor data pulled |
| * from the map. |
| * Return: |
| * Zero if an allocation descriptor that matches the given address has |
| * been pulled, or 1 if no matching entry has been found in the map. |
| */ |
| int allocmap_pull(AllocMap* map, target_ulong address, MallocDescEx* pulled); |
| |
| /* Pulls (removes) an entry from the head of the allocation descriptors map. |
| * Param: |
| * map - Allocation descriptors map where to pull an entry from. |
| * pulled - Upon successful return contains allocation descriptor data pulled |
| * from the head of the map. |
| * Return: |
| * Zero if an allocation descriptor has been pulled from the head of the map, |
| * or 1 if map is empty. |
| */ |
| int allocmap_pull_first(AllocMap* map, MallocDescEx* pulled); |
| |
| /* Copies content of one memory allocation descriptors map to another. |
| * Param: |
| * to - Map where to copy entries to. |
| * from - Map where to copy entries from. |
| * set_flags - Flags that should be set in the copied entry's 'flags' field. |
| * celar_flags - Flags that should be cleared in the copied entry's 'flags' |
| * field. |
| * Return: |
| * Zero on success, or -1 on error. |
| */ |
| int allocmap_copy(AllocMap* to, |
| const AllocMap* from, |
| uint32_t set_flags, |
| uint32_t clear_flags); |
| |
| /* Empties the map. |
| * Param: |
| * map - Map to empty. |
| * Return: |
| * Number of entries removed from the map. |
| */ |
| int allocmap_empty(AllocMap* map); |
| |
| #ifdef __cplusplus |
| }; /* end of extern "C" */ |
| #endif |
| |
| #endif // QEMU_MEMCHECK_MEMCHECK_MALLOC_MAP_H |