00001
00002
00011
00012
00013
00014
00015
00016
00017 #include <l4/sys/types.h>
00018 #include <l4/sys/kernel.h>
00019 #include <l4/sys/syscalls.h>
00020 #include <l4/sys/ipc.h>
00021 #include <l4/sigma0/kip.h>
00022 #include <l4/util/util.h>
00023 #include <l4/rmgr/librmgr.h>
00024 #include <l4/env/errno.h>
00025 #include <l4/l4rm/l4rm.h>
00026 #include <l4/thread/thread.h>
00027
00028
00029 #include "io.h"
00030 #include "jiffies.h"
00031 #include "__config.h"
00032 #include "__macros.h"
00033
00034
00035
00036
00037
00038 static unsigned long long volatile *kclock;
00047 static int __map_kernel_info_page(void)
00048 {
00049 l4_kernel_info_t *kip;
00050
00051 if (!(kip = l4sigma0_kip_map(L4_INVALID_ID)))
00052 {
00053 LOGdL(DEBUG_ERRORS, "error getting kernel info page!");
00054 return -L4_ENOTFOUND;
00055 }
00056
00057 kclock = &kip->clock;
00058
00059 return 0;
00060 }
00061
00073 static void jiffies_thread(void *data)
00074 {
00075 int wait;
00076 int next_tick = 0;
00077
00078
00079 l4thread_started(NULL);
00080
00081 next_tick = *kclock + 5 * IOJIFFIES_PERIOD;
00082
00083
00084 for (;;)
00085 {
00086 wait = next_tick - *kclock;
00087
00088 while (wait > 0)
00089 {
00090 l4thread_usleep((l4_uint32_t) wait);
00091 wait = next_tick - *kclock;
00092 }
00093
00094 io_info.jiffies++;
00095 io_info.xtime.tv_sec = io_info.jiffies / IOJIFFIES_HZ;
00096 next_tick += IOJIFFIES_PERIOD;
00097 }
00098
00099
00100 Panic("left jiffies loop!\n");
00101 }
00102
00110 int io_jiffies_init()
00111 {
00112 int error;
00113 l4thread_t jiffies_tid;
00114
00115
00116 if ((error = __map_kernel_info_page()))
00117 return error;
00118
00119
00120 jiffies_tid = l4thread_create_named(jiffies_thread,
00121 ".jiffies",
00122 0, L4THREAD_CREATE_SYNC);
00123
00124 if (jiffies_tid <= 0)
00125 {
00126 LOGdL(DEBUG_ERRORS, "create jiffies thread (%d)", jiffies_tid);
00127 return jiffies_tid;
00128 }
00129
00130 return 0;
00131 }