status_t rva_cache_del( vmi_instance_t vmi, addr_t base_addr, addr_t dtb, addr_t rva) { status_t ret=VMI_FAILURE; GHashTable *rva_table=NULL; struct key_128 local_key; key_128_t key = &local_key; key_128_init(vmi, key, (uint64_t)base_addr, (uint64_t)dtb); if ((rva_table = g_hash_table_lookup(vmi->rva_cache, key)) == NULL) { return ret; } dbprint(VMI_DEBUG_RVACACHE, "--RVA cache del 0x%.16"PRIx64":0x%.16"PRIx64":0x%.16"PRIx64"\n", dtb, base_addr, rva); if (TRUE == g_hash_table_remove(rva_table, GUINT_TO_POINTER(rva))) { ret=VMI_SUCCESS; if(!g_hash_table_size(rva_table)) { g_hash_table_remove(vmi->rva_cache, key); } } return ret; }
status_t rva_cache_get( vmi_instance_t vmi, addr_t base_addr, addr_t dtb, addr_t rva, char **sym) { status_t ret=VMI_FAILURE; GHashTable *rva_table = NULL; sym_cache_entry_t entry = NULL; struct key_128 local_key; key_128_t key = &local_key; key_128_init(vmi, key, (uint64_t)base_addr, (uint64_t)dtb); if ((rva_table = g_hash_table_lookup(vmi->rva_cache, key)) == NULL) { return ret; } if ((entry = g_hash_table_lookup(rva_table, GUINT_TO_POINTER(rva))) != NULL) { entry->last_used = time(NULL); *sym = entry->sym; dbprint(VMI_DEBUG_RVACACHE, "--RVA cache hit 0x%.16"PRIx64":0x%.16"PRIx64":%s -- 0x%.16"PRIx64"\n", dtb, base_addr, *sym, rva); ret=VMI_SUCCESS; } return ret; }
status_t sym_cache_del( vmi_instance_t vmi, addr_t base_addr, vmi_pid_t pid, char *sym) { status_t ret=VMI_FAILURE; GHashTable *symbol_table=NULL; struct key_128 local_key; key_128_t key = &local_key; key_128_init(vmi, key, (uint64_t)base_addr, (uint64_t)pid); if ((symbol_table = g_hash_table_lookup(vmi->sym_cache, key)) == NULL) { return ret; } dbprint(VMI_DEBUG_SYMCACHE, "--SYM cache del %u:0x%.16"PRIx64":%s\n", pid, base_addr, sym); if (TRUE == g_hash_table_remove(symbol_table, sym)) { ret=VMI_SUCCESS; if(!g_hash_table_size(symbol_table)) { g_hash_table_remove(vmi->sym_cache, key); } } return ret; }
status_t sym_cache_get( vmi_instance_t vmi, addr_t base_addr, vmi_pid_t pid, const char *sym, addr_t *va) { status_t ret=VMI_FAILURE; GHashTable *symbol_table = NULL; sym_cache_entry_t entry = NULL; struct key_128 local_key; key_128_t key = &local_key; key_128_init(vmi, key, (uint64_t)base_addr, (uint64_t)pid); if ((symbol_table = g_hash_table_lookup(vmi->sym_cache, key)) == NULL) { return ret; } if ((entry = g_hash_table_lookup(symbol_table, sym)) != NULL) { entry->last_used = time(NULL); *va = entry->va; dbprint(VMI_DEBUG_SYMCACHE, "--SYM cache hit %u:0x%.16"PRIx64":%s -- 0x%.16"PRIx64"\n", pid, base_addr, sym, *va); ret=VMI_SUCCESS; } return ret; }
status_t v2m_cache_get( vmi_instance_t vmi, addr_t va, pid_t pid, addr_t *ma, uint64_t *length) { v2m_cache_entry_t entry = NULL; struct key_128 local_key; key_128_t key = &local_key; key_128_init(vmi, key, (uint64_t)va, (uint64_t)pid); if ((entry = g_hash_table_lookup(vmi->v2m_cache, key)) != NULL) { entry->last_used = time(NULL); *ma = entry->ma | ((vmi->page_size - 1) & va); *length = entry->length; dbprint(VMI_DEBUG_V2MCACHE, "--v2m cache hit 0x%.16"PRIx64" -- 0x%.16"PRIx64" len 0x%.16"PRIx64" (0x%.16"PRIx64"/0x%.16"PRIx64")\n", va, *ma, *length, key->high, key->low); return VMI_SUCCESS; } return VMI_FAILURE; }
status_t v2m_cache_del( vmi_instance_t vmi, addr_t va, pid_t pid) { struct key_128 local_key; key_128_t key = &local_key; key_128_init(vmi, key, (uint64_t)va, (uint64_t)pid); dbprint(VMI_DEBUG_V2MCACHE, "--v2m cache del 0x%.16"PRIx64" (0x%.16"PRIx64"/0x%.16"PRIx64")\n", va, key->high, key->low); // key collision doesn't really matter here because worst case // scenario we incur an small performance hit if (TRUE == g_hash_table_remove(vmi->v2m_cache, key)) { return VMI_SUCCESS; } else { return VMI_FAILURE; } }
status_t v2p_cache_get( vmi_instance_t vmi, addr_t va, addr_t dtb, addr_t *pa) { v2p_cache_entry_t entry = NULL; struct key_128 local_key; key_128_t key = &local_key; key_128_init(vmi, key, (uint64_t)va, (uint64_t)dtb); if ((entry = g_hash_table_lookup(vmi->v2p_cache, key)) != NULL) { entry->last_used = time(NULL); *pa = entry->pa | ((vmi->page_size - 1) & va); dbprint(VMI_DEBUG_V2PCACHE, "--V2P cache hit 0x%.16"PRIx64" -- 0x%.16"PRIx64" (0x%.16"PRIx64"/0x%.16"PRIx64")\n", va, *pa, key->high, key->low); return VMI_SUCCESS; } return VMI_FAILURE; }
key_128_t key_128_build (vmi_instance_t vmi, uint64_t low, uint64_t high) { key_128_t key = (key_128_t) safe_malloc(sizeof(struct key_128)); key_128_init(vmi, key, low, high); return key; }