コード例 #1
0
ファイル: tee_memm.c プロジェクト: team-eureka/eureka_linux
tee_memm_ss_t tee_memm_create_ss(void)
{
	tee_memm_handle_t *tee_memm_handle;

	tee_memm_handle = osa_kmem_alloc(sizeof(tee_memm_handle_t));
	if (!tee_memm_handle)
		return NULL;

	memset(tee_memm_handle, 0, sizeof(tee_memm_handle_t));
	INIT_MEMM_MAGIC(tee_memm_handle->magic);

	return (tee_memm_ss_t) tee_memm_handle;
}
コード例 #2
0
/* ********************
 * create instance
 * ********************/
tee_msgm_t tee_msgm_create_inst(void)
{
	tee_msgm_ntw_struct *handle = NULL;

	handle =
	    (tee_msgm_ntw_struct *) osa_kmem_alloc(sizeof(tee_msgm_ntw_struct));
	if (NULL == handle) {
		TZDD_DBG("In tee_msgm_create_inst, alloc err\n");
		goto err;
	}
	osa_memset(handle, 0, sizeof(tee_msgm_ntw_struct));
	INIT_MAGIC(handle->magic);
	handle->ntw_cmd = NULL;
	handle->body = NULL;
	handle->op = NULL;
	handle->cmd_record.cmd = TEE_CMD_INVALID;
	handle->cmd_record.cmd_sz = 0;
	handle->cmd_record.param_size = 0;
	handle->cmd_record.stat = TEE_NTW_CMD_STAT_CLEAR;
	return (tee_msgm_t) handle;
err:
	TZDD_DBG("In tee_msgm_create_inst err\n");
	return NULL;
}
コード例 #3
0
ファイル: tee_memm.c プロジェクト: team-eureka/eureka_linux
tee_stat_t tee_memm_calc_pages_num(tee_memm_ss_t tee_memm_ss,
				   void *virt, uint32_t size,
				   uint32_t *pages_num)
{
	uint32_t num = 0;
	uint32_t base = (uint32_t) virt;
	uint32_t length = size;
	tee_memm_handle_t *tee_memm_handle;

	uint8_t *buf;
	tee_mem_page_t *page;
	tee_mem_page_t tmp;
	uint32_t tmp_len = 0;
	uint32_t count = 0;

	if (!tee_memm_ss || !virt || !pages_num)
		OSA_ASSERT(0);

	tee_memm_handle = (tee_memm_handle_t *) tee_memm_ss;
	if (!(IS_MEMM_MAGIC_VALID(tee_memm_handle->magic)))
		OSA_ASSERT(0);

	size += base & (~PAGE_MASK);
	num = size / PAGE_SIZE;
	if (size & (PAGE_SIZE - 1))
		num ++;

	/* *pages_num = num; */

	buf = osa_kmem_alloc(num * sizeof(tee_mem_page_t));
	OSA_ASSERT(buf != NULL);

	page = (tee_mem_page_t *)buf;
	tmp.phy_addr = NULL;
	tmp.len = 0;
	while (base < ((ulong_t) virt + length)) {
		page->phy_addr = osa_virt_to_phys((void *)base);
		if (base == (ulong_t) virt) {
			/* the first page */
			tmp.len = PAGE_SIZE - (base - (base & PAGE_MASK));
			if (tmp.len > length)
				tmp.len = length;
			tmp_len = tmp.len;
		} else if (((ulong_t) virt + length) - base <= PAGE_SIZE) {
			/* the last page */
			tmp_len = ((ulong_t) virt + length) - base;
		} else {
			tmp_len = PAGE_SIZE;
		}

		if (page->phy_addr == (tmp.phy_addr + tmp.len)) {
			page --;
			page->len += tmp_len;
		} else {
			page->len = tmp_len;
			count ++;
		}

		tmp.phy_addr = page->phy_addr;
		tmp.len = page->len;
		page ++;

		base = (base & PAGE_MASK) + PAGE_SIZE;
	}

	*pages_num = count;

	tee_memm_handle->page_list_buf = buf;
	tee_memm_handle->page_list_size = count * sizeof(tee_mem_page_t);

	return TEEC_SUCCESS;
}