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