Пример #1
0
static int get_isa(Context * ctx, ContextAddress addr, ContextISA * isa) {
    if (context_get_isa(ctx, addr, isa) < 0) {
        memset(isa, 0, sizeof(ContextISA));
        return -1;
    }
#if ENABLE_MemoryMap
    if (isa->size == 0) {
        unsigned i, j;
        MemoryMap * client_map = NULL;
        MemoryMap * target_map = NULL;
        Context * mem = context_get_group(ctx, CONTEXT_GROUP_PROCESS);
        if (memory_map_get(mem, &client_map, &target_map) == 0) {
            isa->addr = addr;
            isa->size = ~addr + 1;
            for (j = 0; j < 2; j++) {
                MemoryMap * map = j ? target_map : client_map;
                for (i = 0; i < map->region_cnt; i++) {
                    MemoryRegion * r = map->regions + i;
                    ContextAddress x = r->addr;
                    ContextAddress y = r->addr + r->size;
                    if (x > addr && (addr + isa->size == 0 || x < addr + isa->size)) isa->size = x - addr;
                    if (y > addr && (addr + isa->size == 0 || y < addr + isa->size)) isa->size = y - addr;
                }
            }
        }
    }
#endif
    return 0;
}
Пример #2
0
static void command_get_sym_file_info_cache_client(void * x) {
    int err = 0;
    MemoryMap * client_map = NULL;
    MemoryMap * target_map = NULL;
    MemoryRegion * region = NULL;
    Channel * c = cache_channel();
    CommandSymFileInfo * args = (CommandSymFileInfo *)x;
    const char * sym_file = NULL;
    Context * ctx = NULL;
    int sym_error = 0;

    ctx = id2ctx(args->id);
    if (ctx == NULL) err = ERR_INV_CONTEXT;
    if (!err && memory_map_get(ctx, &client_map, &target_map) < 0) err = errno;

    if (!err) {
        unsigned i;
        for (i = 0; i < client_map->region_cnt; i++) {
            MemoryRegion * r = client_map->regions + i;
            if (r->addr <= args->addr && r->addr + r->size > args->addr) region = r;
        }
        if (region == NULL) {
            for (i = 0; i < target_map->region_cnt; i++) {
                MemoryRegion * r = target_map->regions + i;
                if (r->addr <= args->addr && r->addr + r->size > args->addr) region = r;
            }
        }

#if ENABLE_ELF
        /* TODO: need a generic way to support ELF program headers in getSymFileInfo command */
        if (region == NULL) {
            static MemoryMap map;
            extern int elf_get_map(Context * ctx, ContextAddress addr0, ContextAddress addr1, MemoryMap * map);
            if (elf_get_map(ctx, args->addr, args->addr, &map) == 0) {
                for (i = 0; i < map.region_cnt; i++) {
                    MemoryRegion * r = map.regions + i;
                    if (r->addr <= args->addr && r->addr + r->size > args->addr) region = r;
                }
            }
        }
#endif

        sym_file = get_symbol_file_name(ctx, region);
        sym_error = errno;
    }

    cache_exit();

    write_stringz(&c->out, "R");
    write_stringz(&c->out, args->token);
    write_errno(&c->out, err);
    if (region != NULL) {
        write_stream(&c->out, '{');
        json_write_string(&c->out, "Addr");
        write_stream(&c->out, ':');
        json_write_uint64(&c->out, region->addr);
        write_stream(&c->out, ',');
        json_write_string(&c->out, "Size");
        write_stream(&c->out, ':');
        json_write_uint64(&c->out, region->size);
        if (sym_file != NULL) {
            write_stream(&c->out, ',');
            json_write_string(&c->out, "FileName");
            write_stream(&c->out, ':');
            json_write_string(&c->out, sym_file);
        }
        if (sym_error != 0) {
            write_stream(&c->out, ',');
            json_write_string(&c->out, "FileError");
            write_stream(&c->out, ':');
            write_error_object(&c->out, sym_error);
        }
        write_stream(&c->out, '}');
        write_stream(&c->out, 0);
    }
    else {
        write_stringz(&c->out, "null");
    }
    write_stream(&c->out, MARKER_EOM);
}