Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
0
Arquivo: shm.c Projeto: bentau/libvmi
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;
}
Exemplo n.º 6
0
Arquivo: shm.c Projeto: bentau/libvmi
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;
    }
}
Exemplo n.º 7
0
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;
}
Exemplo n.º 8
0
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;
}