Esempio n. 1
0
void main(void)
{
   thread_t thread;
   int rc = thread_create(&thread, f, (void*) 1);
   assert(rc == 0);

   int res=0;

   printf("before join\n");

   rc = thread_join(thread, (void**) &res);
   assert(rc == 0 || rc == ERR_THREAD_TERMINATED);

   printf("after join\n");  

   int t1 = thread_get_id(thread);
   int t2 = thread_get_id((thread_t) res);

   assert(t1 == t2);

   printf("passed\n");

   while (1) { }
}
Esempio n. 2
0
static uint64_t populate_user_map(struct tee_mmu_info *mmu)
{
	struct core_mmu_table_info tbl_info;
	unsigned n;
	struct tee_mmap_region region;
	vaddr_t va_range_base;
	size_t va_range_size;

	core_mmu_get_user_va_range(&va_range_base, &va_range_size);

	tbl_info.table = xlat_tables_ul1[thread_get_id()];
	tbl_info.va_base = va_range_base;
	tbl_info.level = 2;
	tbl_info.shift = L2_XLAT_ADDRESS_SHIFT;
	tbl_info.num_entries = XLAT_TABLE_ENTRIES;

	/* Clear the table before use */
	memset(tbl_info.table, 0, XLAT_TABLE_SIZE);

	region.pa = 0;
	region.va = va_range_base;
	region.attr = 0;

	for (n = 0; n < mmu->size; n++) {
		if (!mmu->table[n].size)
			continue;

		/* Empty mapping for gaps */
		region.size = mmu->table[n].va - region.va;
		set_region(&tbl_info, &region);

		set_region(&tbl_info, mmu->table + n);
		region.va = mmu->table[n].va + mmu->table[n].size;
		assert((region.va - va_range_base) <= va_range_size);
	}
	region.size = va_range_size - (region.va - va_range_base);
	set_region(&tbl_info, &region);

	return (uintptr_t)tbl_info.table | TABLE_DESC;
}
Esempio n. 3
0
void core_mmu_create_user_map(struct tee_mmu_info *mmu, uint32_t asid,
		struct core_mmu_user_map *map)
{

	COMPILE_TIME_ASSERT(sizeof(uint64_t) * XLAT_TABLE_ENTRIES == PGT_SIZE);

	if (mmu) {
		struct core_mmu_table_info dir_info;
		vaddr_t va_range_base;
		void *tbl = xlat_tables_ul1[thread_get_id()];

		core_mmu_get_user_va_range(&va_range_base, NULL);
		core_mmu_set_info_table(&dir_info, 2, va_range_base, tbl);
		memset(tbl, 0, PGT_SIZE);
		core_mmu_populate_user_map(&dir_info, mmu);
		map->user_map = (paddr_t)dir_info.table | TABLE_DESC;
		map->asid = asid & TTBR_ASID_MASK;
	} else {
		map->user_map = 0;
		map->asid = 0;
	}
}
Esempio n. 4
0
vaddr_t core_mmu_get_ul1_ttb_va(void)
{
	return (vaddr_t)main_mmu_ul1_ttb[thread_get_id()];
}