110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/**
210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @file opd_anon.c
310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * Anonymous region handling.
410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *
510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * Our caching of maps has some problems: if we get tgid reuse,
610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * and it's the same application, we might end up with wrong
710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * maps. The same happens in an unmap-remap case. There's not much
810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * we can do about this, we just hope it's not too common...
910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *
1010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * What is relatively common is expanding anon maps, which leaves us
1110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * with lots of separate sample files.
1210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *
1310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @remark Copyright 2005 OProfile authors
1410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @remark Read the file COPYING
1510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project *
1610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @author John Levon
1710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @Modifications Gisle Dankel
1810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */
1910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
2010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "opd_anon.h"
2110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "opd_trans.h"
2210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "opd_sfile.h"
2310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "opd_printf.h"
2410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_libiberty.h"
2510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
2610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <limits.h>
2710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <stdlib.h>
2810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <stdio.h>
2910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <string.h>
3010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
3110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#define HASH_SIZE 1024
3210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#define HASH_BITS (HASH_SIZE - 1)
3310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
3410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/*
3510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * Note that this value is tempered by the fact that when we miss in the
3610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * anon cache, we'll tear down all the mappings for that tgid. Thus, LRU
3710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * of a mapping can potentially clear out a much larger number of
3810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * mappings.
3910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */
4010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#define LRU_SIZE 8192
4110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#define LRU_AMOUNT (LRU_SIZE/8)
4210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
4310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic struct list_head hashes[HASH_SIZE];
4410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic struct list_head lru;
4510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic size_t nr_lru;
4610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
4710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic void do_lru(struct transient * trans)
4810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{
4910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	size_t nr_to_kill = LRU_AMOUNT;
5010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	struct list_head * pos;
5110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	struct list_head * pos2;
5210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	struct anon_mapping * entry;
5310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
5410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	list_for_each_safe(pos, pos2, &lru) {
5510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		entry = list_entry(pos, struct anon_mapping, lru_list);
5610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		if (trans->anon == entry)
5710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			clear_trans_current(trans);
5810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		if (trans->last_anon == entry)
5910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			clear_trans_last(trans);
6010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		sfile_clear_anon(entry);
6110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		list_del(&entry->list);
6210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		list_del(&entry->lru_list);
6310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		--nr_lru;
6410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		free(entry);
6510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		if (nr_to_kill-- == 0)
6610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			break;
6710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	}
6810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}
6910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
7010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
7110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic unsigned long hash_anon(pid_t tgid, cookie_t app)
7210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{
7310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	return ((app >> DCOOKIE_SHIFT) ^ (tgid >> 2)) & (HASH_SIZE - 1);
7410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}
7510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
7610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
7710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic void clear_anon_maps(struct transient * trans)
7810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{
7910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	unsigned long hash = hash_anon(trans->tgid, trans->app_cookie);
8010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	pid_t tgid = trans->tgid;
8110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	cookie_t app = trans->app_cookie;
8210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	struct list_head * pos;
8310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	struct list_head * pos2;
8410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	struct anon_mapping * entry;
8510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
8610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	clear_trans_current(trans);
8710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
8810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	list_for_each_safe(pos, pos2, &hashes[hash]) {
8910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		entry = list_entry(pos, struct anon_mapping, list);
9010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		if (entry->tgid == tgid && entry->app_cookie == app) {
9110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			if (trans->last_anon == entry)
9210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project				clear_trans_last(trans);
9310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			sfile_clear_anon(entry);
9410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			list_del(&entry->list);
9510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			list_del(&entry->lru_list);
9610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			--nr_lru;
9710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			free(entry);
9810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		}
9910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	}
10010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
10110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	if (vmisc) {
10210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		char const * name = verbose_cookie(app);
10310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		printf("Cleared anon maps for tgid %u (%s).\n", tgid, name);
10410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	}
10510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}
10610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
10710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
10810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic void
10910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectadd_anon_mapping(struct transient * trans, vma_t start, vma_t end, char * name)
11010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{
11110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	unsigned long hash = hash_anon(trans->tgid, trans->app_cookie);
11210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	struct anon_mapping * m = xmalloc(sizeof(struct anon_mapping));
11310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	m->tgid = trans->tgid;
11410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	m->app_cookie = trans->app_cookie;
11510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	m->start = start;
11610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	m->end = end;
11710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	strncpy(m->name, name, MAX_IMAGE_NAME_SIZE + 1);
11810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	list_add_tail(&m->list, &hashes[hash]);
11910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	list_add_tail(&m->lru_list, &lru);
12010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	if (++nr_lru == LRU_SIZE)
12110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		do_lru(trans);
12210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	if (vmisc) {
12310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		char const * name = verbose_cookie(m->app_cookie);
12410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		printf("Added anon map 0x%llx-0x%llx for tgid %u (%s).\n",
12510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		       start, end, m->tgid, name);
12610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	}
12710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}
12810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
12910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
13010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/* 42000000-4212f000 r-xp 00000000 16:03 424334 /lib/tls/libc-2.3.2.so */
13110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic void get_anon_maps(struct transient * trans)
13210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{
13310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	FILE * fp = NULL;
13410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	char buf[PATH_MAX];
13510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	vma_t start, end;
13610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	int ret;
13710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
13810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	snprintf(buf, PATH_MAX, "/proc/%d/maps", trans->tgid);
13910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	fp = fopen(buf, "r");
14010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	if (!fp)
14110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		return;
14210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
14310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	while (fgets(buf, PATH_MAX, fp) != NULL) {
14410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		char tmp[MAX_IMAGE_NAME_SIZE + 1];
14510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		char name[MAX_IMAGE_NAME_SIZE + 1];
14610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		/* Some anon maps have labels like
14710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		 * [heap], [stack], [vdso], [vsyscall] ...
14810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		 * Keep track of these labels. If a map has no name, call it "anon".
14910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		 * Ignore all mappings starting with "/" (file or shared memory object)
15010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		 */
15110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		strcpy(name, "anon");
15210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		ret = sscanf(buf, "%llx-%llx %20s %20s %20s %20s %20s",
15310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		             &start, &end, tmp, tmp, tmp, tmp, name);
15410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		if (ret < 6 || name[0] == '/')
15510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			continue;
15610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
15710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		add_anon_mapping(trans, start, end, name);
15810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	}
15910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
16010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	fclose(fp);
16110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}
16210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
16310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
16410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic int
16510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectanon_match(struct transient const * trans, struct anon_mapping const * anon)
16610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{
16710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	if (!anon)
16810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		return 0;
16910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	if (trans->tgid != anon->tgid)
17010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		return 0;
17110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	if (trans->app_cookie != anon->app_cookie)
17210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		return 0;
17310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	if (trans->pc < anon->start)
17410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		return 0;
17510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	return (trans->pc < anon->end);
17610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}
17710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
17810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
17910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstruct anon_mapping * find_anon_mapping(struct transient * trans)
18010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{
18110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	unsigned long hash = hash_anon(trans->tgid, trans->app_cookie);
18210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	struct list_head * pos;
18310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	struct anon_mapping * entry;
18410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	int tried = 0;
18510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
18610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	if (anon_match(trans, trans->anon))
18710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		return (trans->anon);
18810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
18910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectretry:
19010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	list_for_each(pos, &hashes[hash]) {
19110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		entry = list_entry(pos, struct anon_mapping, list);
19210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		if (anon_match(trans, entry))
19310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project			goto success;
19410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	}
19510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
19610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	if (!tried) {
19710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		clear_anon_maps(trans);
19810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		get_anon_maps(trans);
19910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		tried = 1;
20010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		goto retry;
20110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	}
20210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
20310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	return NULL;
20410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
20510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectsuccess:
20610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	/*
20710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	 * Typically, there's one big mapping that matches. Let's go
20810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	 * faster.
20910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	 */
21010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	list_del(&entry->list);
21110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	list_add(&entry->list, &hashes[hash]);
21210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
21310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	verbprintf(vmisc, "Found range 0x%llx-0x%llx for tgid %u, pc %llx.\n",
21410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	           entry->start, entry->end, (unsigned int)entry->tgid,
21510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		   trans->pc);
21610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	return entry;
21710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}
21810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
21910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
22010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectvoid anon_init(void)
22110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{
22210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	size_t i;
22310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
22410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	for (i = 0; i < HASH_SIZE; ++i)
22510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project		list_init(&hashes[i]);
22610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project
22710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project	list_init(&lru);
22810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project}
229