kthread_usleep()

It's the guts of what sys_block did: blocks a kthread for X usec.  The classic
issue is where we run the alarm handler and where to restart the kthread.
diff --git a/kern/include/kthread.h b/kern/include/kthread.h
index 8b24dff..e55a956 100644
--- a/kern/include/kthread.h
+++ b/kern/include/kthread.h
@@ -82,6 +82,7 @@
 void restart_kthread(struct kthread *kthread);
 void kthread_runnable(struct kthread *kthread);
 void kthread_yield(void);
+void kthread_usleep(uint64_t usec);
 void ktask(char *name, void (*fn)(void*), void *arg);
 /* Debugging */
 void check_poison(char *msg);
diff --git a/kern/src/kthread.c b/kern/src/kthread.c
index ef17394..8dbc0b6 100644
--- a/kern/src/kthread.c
+++ b/kern/src/kthread.c
@@ -180,6 +180,17 @@
 	sem_down(sem);
 }
 
+void kthread_usleep(uint64_t usec)
+{
+	/* TODO: classic ksched issue: where do we want the wake up to happen? */
+	struct timer_chain *tchain = &per_cpu_info[core_id()].tchain;
+	struct alarm_waiter a_waiter;
+	init_awaiter(&a_waiter, 0);
+	set_awaiter_rel(&a_waiter, usec);
+	set_alarm(tchain, &a_waiter);
+	sleep_on_awaiter(&a_waiter);
+}
+
 static void __ktask_wrapper(uint32_t srcid, long a0, long a1, long a2)
 {
 	ERRSTACK(1);
diff --git a/kern/src/syscall.c b/kern/src/syscall.c
index 2be0963..6522682 100644
--- a/kern/src/syscall.c
+++ b/kern/src/syscall.c
@@ -328,14 +328,9 @@
  * async I/O handling. */
 static int sys_block(struct proc *p, unsigned int usec)
 {
-	struct timer_chain *tchain = &per_cpu_info[core_id()].tchain;
-	struct alarm_waiter a_waiter;
-	init_awaiter(&a_waiter, 0);
 	/* Note printing takes a few ms, so your printds won't be perfect. */
 	printd("[kernel] sys_block(), sleeping at %llu\n", read_tsc());
-	set_awaiter_rel(&a_waiter, usec);
-	set_alarm(tchain, &a_waiter);
-	sleep_on_awaiter(&a_waiter);
+	kthread_usleep(usec);
 	printd("[kernel] sys_block(), waking up at %llu\n", read_tsc());
 	return 0;
 }