static int test_cnode_move(env_t env) { int error; seL4_Word src, dest; /* A call that should succeed. */ src = get_cap(&env->vka); dest = get_free_slot(env); error = cnode_move(env, src, dest); test_assert(!error); test_assert(is_slot_empty(env, src)); test_assert(!is_slot_empty(env, dest)); /* Move from an empty slot (should fail). */ src = get_free_slot(env); dest = get_free_slot(env); error = cnode_move(env, src, dest); test_assert(error = seL4_FailedLookup); test_assert(is_slot_empty(env, dest)); /* Move to an occupied slot (should fail). */ src = get_cap(&env->vka); dest = get_cap(&env->vka); error = cnode_move(env, src, dest); test_assert(error == seL4_DeleteFirst); test_assert(!is_slot_empty(env, src)); test_assert(!is_slot_empty(env, dest)); return sel4test_get_result(); }
/* Determine whether a given slot in the init thread's CSpace is empty by * examining the error when moving a slot onto itself. * * Serves as == 0 comparator for caps. */ int is_slot_empty(env_t env, seL4_Word slot) { int error; error = cnode_move(env, slot, slot); assert(error == seL4_DeleteFirst || error == seL4_FailedLookup); return (error == seL4_FailedLookup); }