Пример #1
0
/* 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);
}
Пример #2
0
/* 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);
		}
	}
}