static uint32_t _try_watermark_utspace(allocman_t *alloc, uint32_t size_bits, seL4_Word type, cspacepath_t *path, int *_error) { uint32_t i; for (i = 0; i < alloc->num_utspace_chunks; i++) { if (alloc->utspace_chunk[i].size_bits == size_bits && alloc->utspace_chunk[i].type == type) { if (alloc->utspace_chunk_count[i] > 0) { struct allocman_utspace_allocation result = alloc->utspace_chunks[i][alloc->utspace_chunk_count[i] - 1]; int error; /* Need to perform a cap move */ error = vka_cnode_move(path, &result.slot); if (error != seL4_NoError) { SET_ERROR(_error, 1); return 0; } alloc->used_watermark = 1; alloc->utspace_chunk_count[i]--; allocman_cspace_free(alloc, &result.slot); SET_ERROR(_error, 0); return result.cookie; } } } SET_ERROR(_error, 1); return 0; }
int cnode_move(env_t env, seL4_CPtr src, seL4_CPtr dest) { cspacepath_t src_path, dest_path; vka_cspace_make_path(&env->vka, src, &src_path); vka_cspace_make_path(&env->vka, dest, &dest_path); return vka_cnode_move(&dest_path, &src_path); }