/* * Test that thread suspending works when idling the system. * Note: This test non-deterministically fails. If you find only this test * try re-running the test suite. */ static int test_thread_suspend(env_t env) { helper_thread_t t1; volatile seL4_Word counter; ZF_LOGD("test_thread_suspend\n"); create_helper_thread(env, &t1); set_helper_priority(&t1, 100); start_helper(env, &t1, (helper_fn_t) counter_func, (seL4_Word) &counter, 0, 0, 0); timer_periodic(env->timer->timer, 10 * NS_IN_MS); timer_start(env->timer->timer); sel4_timer_handle_single_irq(env->timer); seL4_Word old_counter; /* Let the counter thread run. We might have a pending interrupt, so * wait twice. */ wait_for_timer_interrupt(env); wait_for_timer_interrupt(env); old_counter = counter; /* Let it run again. */ wait_for_timer_interrupt(env); /* Now, counter should have moved. */ test_check(counter != old_counter); old_counter = counter; /* Suspend the thread, and wait again. */ seL4_TCB_Suspend(t1.thread.tcb.cptr); wait_for_timer_interrupt(env); /* Counter should not have moved. */ test_check(counter == old_counter); old_counter = counter; /* Check once more for good measure. */ wait_for_timer_interrupt(env); /* Counter should not have moved. */ test_check(counter == old_counter); old_counter = counter; /* Resume the thread and check it does move. */ seL4_TCB_Resume(t1.thread.tcb.cptr); wait_for_timer_interrupt(env); test_check(counter != old_counter); /* Done. */ timer_stop(env->timer->timer); sel4_timer_handle_single_irq(env->timer); cleanup_helper(env, &t1); return sel4test_get_result(); }
static void stop_periodic_timer() { UNUSED int err = timer_stop(timer->timer); assert(err == 0); sel4_timer_handle_single_irq(timer); }
void wait_for_timer_interrupt(env_t env) { seL4_Word sender_badge; seL4_Wait(env->timer_aep.cptr, &sender_badge); sel4_timer_handle_single_irq(env->timer); }
static int test_interrupt(env_t env) { int error = timer_periodic(env->timer->timer, 10 * NS_IN_MS); timer_start(env->timer->timer); sel4_timer_handle_single_irq(env->timer); test_check(error == 0); for (int i = 0; i < 3; i++) { wait_for_timer_interrupt(env); } timer_stop(env->timer->timer); sel4_timer_handle_single_irq(env->timer); return sel4test_get_result(); }
/* * We have to loop a couple of time because we exceed hardware limit. */ static void wait_for_timer() { for (int i = 0; i < 100 / speed; i++) { //wait for timer interrupt to occur seL4_Wait(timer_aep.cptr, NULL); //Ack IRQ sel4_timer_handle_single_irq(timer); } }
static void start_periodic_timer() { //setup periodic timer UNUSED int err = timer_periodic(timer->timer, 10 * NS_IN_MS); assert(err == 0); //start timer (no-op for PIT) err = timer_start(timer->timer); assert(err == 0); //Ack IRQ for good measure sel4_timer_handle_single_irq(timer); }