/* Extract and analyze information from the program binary associated with 'kernel_name' */ void evg_opencl_kernel_load(struct evg_opencl_kernel_t *kernel, char *kernel_name) { struct evg_opencl_program_t *program; char symbol_name[MAX_STRING_SIZE]; char name[MAX_STRING_SIZE]; /* First */ strncpy(kernel->name, kernel_name, MAX_STRING_SIZE); program = evg_opencl_repo_get_object(evg_emu->opencl_repo, evg_opencl_object_program, kernel->program_id); /* Read 'metadata' symbol */ snprintf(symbol_name, MAX_STRING_SIZE, "__OpenCL_%s_metadata", kernel_name); evg_opencl_program_read_symbol(program, symbol_name, &kernel->metadata_buffer); /* Read 'kernel' symbol */ snprintf(symbol_name, MAX_STRING_SIZE, "__OpenCL_%s_kernel", kernel_name); evg_opencl_program_read_symbol(program, symbol_name, &kernel->kernel_buffer); /* Read 'header' symbol */ snprintf(symbol_name, MAX_STRING_SIZE, "__OpenCL_%s_header", kernel_name); evg_opencl_program_read_symbol(program, symbol_name, &kernel->header_buffer); /* Create and parse kernel binary (internal ELF). * The internal ELF is contained in the buffer pointer to by the 'kernel' symbol. */ snprintf(name, sizeof(name), "clKernel<%s>.InternalELF", kernel_name); kernel->bin_file = evg_bin_file_create(kernel->kernel_buffer.ptr, kernel->kernel_buffer.size, name); /* Analyze 'metadata' file */ evg_opencl_kernel_load_metadata(kernel); }
/* Read context properties from a null-terminated sequence of * 'cl_context_properties' elements in guest memory */ void evg_opencl_context_set_properties(struct evg_opencl_context_t *context, struct mem_t *mem, unsigned int addr) { unsigned int property; unsigned int value; while (addr) { /* Read property */ mem_read(mem, addr, 4, &property); if (!property) break; mem_read(mem, addr + 4, 4, &value); addr += 8; /* Analyze property */ switch (property) { case 0x1084: /* CL_CONTEXT_PLATFORM */ context->platform_id = value; evg_opencl_repo_get_object(evg_emu->opencl_repo, evg_opencl_object_platform, value); evg_opencl_debug(" property CL_CONTEXT_PLATFORM assigned: 0x%x\n", value); break; default: fatal("opencl_context_read_properties: invalid property (0x%x)\n", property); } } }