void sym_cache_set( vmi_instance_t vmi, addr_t base_addr, vmi_pid_t pid, const char *sym, addr_t va) { GHashTable *symbol_table = NULL; sym_cache_entry_t entry = sym_cache_entry_create(sym, va, base_addr, pid); char* sym_dup = NULL; key_128_t key = key_128_build(vmi, (uint64_t)base_addr, (uint64_t)pid); symbol_table = g_hash_table_lookup(vmi->sym_cache, key); if (symbol_table == NULL) { symbol_table = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, sym_cache_entry_free); g_hash_table_insert(vmi->sym_cache, key, symbol_table); } else { free(key); } sym_dup = strndup(sym, 100); g_hash_table_insert(symbol_table, sym_dup, entry); dbprint(VMI_DEBUG_SYMCACHE, "--SYM cache set %s -- 0x%.16"PRIx64"\n", sym, va); }
void v2p_cache_set( vmi_instance_t vmi, addr_t va, addr_t dtb, addr_t pa) { if (!va || !dtb || !pa) { return; } key_128_t key = key_128_build(vmi, (uint64_t)va, (uint64_t)dtb); v2p_cache_entry_t entry = v2p_cache_entry_create(vmi, pa); g_hash_table_insert(vmi->v2p_cache, key, entry); dbprint(VMI_DEBUG_V2PCACHE, "--V2P cache set 0x%.16"PRIx64" -- 0x%.16"PRIx64" (0x%.16"PRIx64"/0x%.16"PRIx64")\n", va, pa, key->high, key->low); }
void v2m_cache_set( vmi_instance_t vmi, addr_t va, pid_t pid, addr_t ma, uint64_t length) { if (!va || !ma) { return; } key_128_t key = key_128_build(vmi, (uint64_t)va, (uint64_t)pid); v2m_cache_entry_t entry = v2m_cache_entry_create(vmi, ma, length); g_hash_table_insert(vmi->v2m_cache, key, entry); dbprint(VMI_DEBUG_V2MCACHE, "--v2m cache set 0x%.16"PRIx64" -- 0x%.16"PRIx64" len 0x%.16"PRIx64" (0x%.16"PRIx64"/0x%.16"PRIx64")\n", va, ma, length, key->high, key->low); }
void rva_cache_set( vmi_instance_t vmi, addr_t base_addr, addr_t dtb, addr_t rva, char *sym) { GHashTable *rva_table = NULL; sym_cache_entry_t entry = sym_cache_entry_create(sym, rva, base_addr, dtb); key_128_t key = key_128_build(vmi, (uint64_t)base_addr, (uint64_t)dtb); if ((rva_table = g_hash_table_lookup(vmi->rva_cache, key)) == NULL) { rva_table = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, sym_cache_entry_free); g_hash_table_insert(vmi->rva_cache, GUINT_TO_POINTER(key), rva_table); } else { free(key); } g_hash_table_insert(rva_table, GUINT_TO_POINTER(rva), entry); dbprint(VMI_DEBUG_RVACACHE, "--RVA cache set %s -- 0x%.16"PRIx64"\n", sym, rva); }