void teecore_init_ta_ram(void) { vaddr_t s; vaddr_t e; paddr_t ps; paddr_t pe; /* get virtual addr/size of RAM where TA are loaded/executedNSec * shared mem allcated from teecore */ core_mmu_get_mem_by_type(MEM_AREA_TA_RAM, &s, &e); ps = virt_to_phys((void *)s); TEE_ASSERT(ps); pe = virt_to_phys((void *)(e - 1)) + 1; TEE_ASSERT(pe); TEE_ASSERT((ps & (CORE_MMU_USER_CODE_SIZE - 1)) == 0); TEE_ASSERT((pe & (CORE_MMU_USER_CODE_SIZE - 1)) == 0); /* extra check: we could rely on core_mmu_get_mem_by_type() */ TEE_ASSERT(tee_pbuf_is_sec(ps, pe - ps) == true); TEE_ASSERT(tee_mm_is_empty(&tee_mm_sec_ddr)); /* remove previous config and init TA ddr memory pool */ tee_mm_final(&tee_mm_sec_ddr); tee_mm_init(&tee_mm_sec_ddr, ps, pe, CORE_MMU_USER_CODE_SHIFT, TEE_MM_POOL_NO_FLAGS); }
void teecore_init_pub_ram(void) { vaddr_t s; vaddr_t e; unsigned int nsec_tee_size = 32 * 1024; /* get virtual addr/size of NSec shared mem allcated from teecore */ core_mmu_get_mem_by_type(MEM_AREA_NSEC_SHM, &s, &e); TEE_ASSERT(s < e); TEE_ASSERT((s & SMALL_PAGE_MASK) == 0); TEE_ASSERT((e & SMALL_PAGE_MASK) == 0); /* extra check: we could rely on core_mmu_get_mem_by_type() */ TEE_ASSERT(tee_vbuf_is_non_sec(s, e - s) == true); /* * 32kByte first bytes are allocated from teecore. * Remaining is under control of the NSec allocator. */ TEE_ASSERT((e - s) > nsec_tee_size); TEE_ASSERT(tee_mm_is_empty(&tee_mm_pub_ddr)); tee_mm_final(&tee_mm_pub_ddr); tee_mm_init(&tee_mm_pub_ddr, s, s + nsec_tee_size, SMALL_PAGE_SHIFT, TEE_MM_POOL_NO_FLAGS); s += nsec_tee_size; default_nsec_shm_paddr = s; default_nsec_shm_size = e - s; }
int tee_rpmb_fs_write(const char *filename, uint8_t *buf, size_t size) { TEE_Result res = TEE_ERROR_GENERIC; struct file_handle *fh = NULL; tee_mm_pool_t p; tee_mm_entry_t *mm = NULL; size_t length; uint32_t mm_flags; if (filename == NULL || buf == NULL) { res = TEE_ERROR_BAD_PARAMETERS; goto out; } length = strlen(filename); if ((length >= FILENAME_LENGTH - 1) || (length == 0)) { res = TEE_ERROR_BAD_PARAMETERS; goto out; } /* Create a FAT entry for the file to write. */ fh = alloc_file_handle(filename); if (fh == NULL) { res = TEE_ERROR_OUT_OF_MEMORY; goto out; } /* Upper memory allocation must be used for RPMB_FS. */ mm_flags = TEE_MM_POOL_HI_ALLOC; if (!tee_mm_init (&p, RPMB_STORAGE_START_ADDRESS, RPMB_STORAGE_END_ADDRESS, RPMB_BLOCK_SIZE_SHIFT, mm_flags)) { res = TEE_ERROR_OUT_OF_MEMORY; goto out; } res = read_fat(fh, &p); if (res != TEE_SUCCESS) goto out; mm = tee_mm_alloc(&p, size); if (mm == NULL) { res = TEE_ERROR_OUT_OF_MEMORY; goto out; } if ((fh->fat_entry.flags & FILE_IS_LAST_ENTRY) != 0) { res = add_fat_entry(fh); if (res != TEE_SUCCESS) goto out; } memset(&fh->fat_entry, 0, sizeof(struct rpmb_fat_entry)); memcpy(fh->fat_entry.filename, filename, length); fh->fat_entry.data_size = size; fh->fat_entry.flags = FILE_IS_ACTIVE; fh->fat_entry.start_address = tee_mm_get_smem(mm); res = tee_rpmb_write(DEV_ID, fh->fat_entry.start_address, buf, size); if (res != TEE_SUCCESS) goto out; res = write_fat_entry(fh, true); out: free(fh); if (mm != NULL) tee_mm_final(&p); if (res == TEE_SUCCESS) return size; return -1; }