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) { } }
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, ®ion); 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, ®ion); return (uintptr_t)tbl_info.table | TABLE_DESC; }
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; } }
vaddr_t core_mmu_get_ul1_ttb_va(void) { return (vaddr_t)main_mmu_ul1_ttb[thread_get_id()]; }