00001
00002
00011
00012
00013
00014
00015
00016
00017 #include <l4/env/errno.h>
00018 #include <l4/sigma0/kip.h>
00019 #include <l4/names/libnames.h>
00020 #include <l4/sys/kdebug.h>
00021 #include <l4/thread/thread.h>
00022 #include <l4/util/macros.h>
00023
00024
00025 #include <stdio.h>
00026
00027
00028 #include "omega0lib.h"
00029
00030
00031 #include <omega0_proto.h>
00032 #include <server.h>
00033 #include <irq_threads.h>
00034 #include <create_threads.h>
00035
00036
00037 #define DO_DEBUG 0
00038
00039
00040
00041
00042 unsigned MANAGEMENT_THREAD;
00045 static l4_threadid_t omega0_service_id = L4_INVALID_ID;
00046
00049 static void server_startup(void *fake)
00050 {
00051
00052 if (!names_register(OMEAG0_SERVER_NAME))
00053 Panic("[OMEGA0lib] can't register at names");
00054
00055 if (l4thread_started(NULL))
00056 Panic("[OMEGA0lib] startup notification failed");
00057
00058
00059 server();
00060
00061 while (1)
00062 Panic("[OMEGA0lib] server() returned");
00063 }
00064
00067 static void irq_handler_startup(void *fake_nr)
00068 {
00069 LOGd(DO_DEBUG, "omega0_irq_thread[%ld] "l4util_idfmt" running.",
00070 (long int)fake_nr, l4util_idstr(l4thread_l4_id(l4thread_myself())));
00071
00072 irq_handler((int long) fake_nr);
00073
00074 while (1)
00075 Panic("[OMEGA0lib] irq_handler() returned");
00076 }
00077
00080 int create_threads_sync(void)
00081 {
00082 long int i, error;
00083 l4thread_t irq_tid;
00084 l4_umword_t dummy;
00085 l4_msgdope_t result;
00086 char name[16];
00087
00088
00089 MANAGEMENT_THREAD = l4thread_l4_id(l4thread_myself()).id.lthread;
00090
00091
00092 for (i = 0; i < IRQ_NUMS; i++)
00093 {
00094 snprintf(name, sizeof(name), ".irq%.2lX", i);
00095 irq_tid = l4thread_create_long(L4THREAD_INVALID_ID,
00096 irq_handler_startup,
00097 name,
00098 L4THREAD_INVALID_SP,
00099 L4THREAD_DEFAULT_SIZE,
00100 L4THREAD_DEFAULT_PRIO,
00101 (void *) i,
00102 L4THREAD_CREATE_ASYNC);
00103
00104 if (irq_tid < 0)
00105 Panic("[OMEGA0lib] thread creation failed");
00106
00107
00108 error = l4_ipc_receive(l4thread_l4_id(irq_tid),
00109 L4_IPC_SHORT_MSG, &dummy, &dummy,
00110 L4_IPC_NEVER, &result);
00111 if (error)
00112 return -1;
00113 }
00114 return 0;
00115 }
00116
00122 int OMEGA0_init()
00123 {
00124 unsigned abi_version;
00125
00126 if ((abi_version = l4sigma0_kip_kernel_abi_version()) < 9)
00127 {
00128 LOG_Error("Fiasco kernel too old (current ABI %d - need >=9)", abi_version);
00129 return -L4_ENOTFOUND;
00130 }
00131
00132 l4thread_t thread = L4THREAD_INVALID_ID;
00133 int noparam;
00134
00135
00136 attach_irqs();
00137
00138
00139 thread = l4thread_create_long(L4THREAD_INVALID_ID,
00140 server_startup,
00141 ".irq-mgr",
00142 L4THREAD_INVALID_SP,
00143 L4THREAD_DEFAULT_SIZE,
00144 L4THREAD_DEFAULT_PRIO,
00145 (void *) &noparam,
00146 L4THREAD_CREATE_SYNC);
00147
00148 if (thread < 0)
00149 return thread;
00150
00151 omega0_service_id = l4thread_l4_id(thread);
00152
00153 LOGd(DO_DEBUG, "omega0_server_thread "l4util_idfmt" running.",
00154 l4util_idstr(l4thread_l4_id(thread)));
00155
00156 return 0;
00157 }
00158
00161 void OMEGA0_free_resources(l4_threadid_t client)
00162 {
00163 int res;
00164 l4_umword_t dw0, dw1;
00165 l4_msgdope_t result;
00166
00167 if (l4_is_invalid_id(omega0_service_id))
00168 return;
00169
00170 res = l4_ipc_call(omega0_service_id,
00171 L4_IPC_SHORT_MSG, OMEGA0_DETACH_ALL, client.id.task,
00172 L4_IPC_SHORT_MSG, &dw0, &dw1, L4_IPC_NEVER, &result);
00173 }
00174