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; }
/* ******************** * 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; }
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; }