/* 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 ANDROID_QEMU_MEMCHECK_MEMCHECK_MALLOC_MAP_H
#define ANDROID_QEMU_MEMCHECK_MEMCHECK_MALLOC_MAP_H

#include "sys-tree.h"
#include "android/qemu/memcheck/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  // ANDROID_QEMU_MEMCHECK_MEMCHECK_MALLOC_MAP_H
