00001
00009
00010
00011
00012
00013
00014 #include <l4/sys/ipc.h>
00015 #include <l4/sys/syscalls.h>
00016 #include <l4/sys/kdebug.h>
00017 #include <l4/util/stack.h>
00018 #include <l4/log/l4log.h>
00019 #include <l4/names/libnames.h>
00020 #include <stdio.h>
00021 #include <stdlib.h>
00022
00023 #include "globals.h"
00024 #include "create_threads.h"
00025 #include "irq_threads.h"
00026
00028 int create_threads_sync(){
00029 int error, i;
00030 l4_msgdope_t result;
00031 l4_umword_t dummy;
00032 l4_addr_t esp;
00033 l4_threadid_t thread = l4_myself();
00034 l4_threadid_t preempter = L4_INVALID_ID,
00035 pager = L4_INVALID_ID,
00036 new_preempter, new_pager;
00037 char name[16];
00038
00039
00040 l4_thread_ex_regs_flags(l4_myself(), -1, -1, &preempter, &pager,
00041 &dummy, &dummy, &dummy,
00042 L4_THREAD_EX_REGS_NO_CANCEL);
00043 if(l4_is_invalid_id(pager)) return -1;
00044
00045 for(i = 0; i < IRQ_NUMS; i++){
00046 thread.id.lthread = i+2;
00047 new_preempter=preempter;
00048 new_pager = pager;
00049
00050
00051 if (!(irqs[i].stack = malloc(STACKSIZE))) {
00052 LOGl("error getting %d bytes of memory", STACKSIZE);
00053 if(ENTER_KDEBUG_ON_ERRORS){
00054 enter_kdebug("!");
00055 }
00056 return -1;
00057 }
00058 irqs[i].stack += STACKSIZE/sizeof(l4_umword_t);
00059
00060 esp = (l4_addr_t)irqs[i].stack;
00061
00062
00063 l4util_stack_push_mword(&esp, i);
00064 l4util_stack_push_mword(&esp, 0);
00065
00066 l4_thread_ex_regs(thread, (l4_umword_t)irq_handler,
00067 esp, &preempter, &pager,
00068 &dummy, &dummy, &dummy);
00069
00070 snprintf(name, sizeof(name), "omega0.irq%.2X", i);
00071 names_register_thread_weak(name, thread);
00072
00073
00074
00075
00076
00077
00078 error = l4_ipc_receive(thread, L4_IPC_SHORT_MSG,
00079 &dummy, &dummy,
00080 L4_IPC_NEVER, &result);
00081 if(error) return -1;
00082 }
00083 return 0;
00084 }