C++程序  |  112行  |  2.56 KB

/**
 * @file opd_mapping.h
 * Management of process mappings
 *
 * @remark Copyright 2002 OProfile authors
 * @remark Read the file COPYING
 *
 * @author John Levon
 * @author Philippe Elie
 */

#ifndef OPD_MAPPING_H
#define OPD_MAPPING_H

#include "op_list.h"

struct opd_image;
struct opd_proc;
struct op_note;

/**
 * represent a mmap'ed area, we create such area only for vma area with exec
 * access right
 */
struct opd_map {
	/** next mapping for this image */
	struct list_head next;
	/** owning image */
	struct opd_image * image;
	/** mapping start vma */
	unsigned long start;
	/** mapping offset */
	unsigned long offset;
	/** mapping end vma */
	unsigned long end;
};

/**
 * opd_init_hash_map - initialise the hashmap
 */
void opd_init_hash_map(void);

/**
 * op_cleanup_hash_name
 *
 * release resource owned by hash_name array
 */
void opd_cleanup_hash_name(void);

/**
 * opd_handle_mapping - deal with mapping notification
 * @param note  mapping notification
 *
 * Deal with one notification that a process has mapped
 * in a new executable file. The mapping information is
 * added to the process structure.
 */
void opd_handle_mapping(struct op_note const * note);

/**
 * opd_put_mapping - add a mapping to a process
 * @param proc  process to add map to
 * @param image  mapped image pointer
 * @param start  start of mapping
 * @param offset  file offset of mapping
 * @param end  end of mapping
 *
 * Add the mapping specified to the process proc growing the maps array
 * if necessary.
 */
void opd_add_mapping(struct opd_proc * proc, struct opd_image * image,
		unsigned long start, unsigned long offset, unsigned long end);

/**
 * opd_kill_maps - delete mapping information for a process
 * @param proc  process to work on
 *
 * Frees structures holding mapping information
 */
void opd_kill_maps(struct opd_proc * proc);

/**
 * opd_is_in_map - check whether an EIP is within a mapping
 * @param map  map to check
 * @param eip  EIP value
 *
 * Return %1 if the EIP value @eip is within the boundaries
 * of the map @map, %0 otherwise.
 */
inline static int opd_is_in_map(struct opd_map * map, unsigned long eip)
{
	return (eip >= map->start && eip < map->end);
}


/*
 * opd_map_offset - return offset of sample against map
 * @param map  map to use
 * @param eip  EIP value to use
 *
 * Returns the offset of the EIP value @eip into
 * the map @map, which is the same as the file offset
 * for the relevant binary image.
 */
inline static unsigned long opd_map_offset(struct opd_map * map,
					   unsigned long eip)
{
	return (eip - map->start) + map->offset;
}

#endif /* OPD_MAPPING_H */