/****************************************************************************** * evh_init * * * * event handler initialization * ******************************************************************************/ int evh_init(void) { l4thread_t evh_tid; l4thread_t btn_tid; /* start thread */ if ((evh_tid = l4thread_create_long(L4THREAD_INVALID_ID, evh_loop, ".kbd", L4THREAD_INVALID_SP, L4THREAD_DEFAULT_SIZE, L4THREAD_DEFAULT_PRIO, 0, L4THREAD_CREATE_SYNC)) < 0) return evh_tid; evh_l4id = l4thread_l4_id(evh_tid); if ((btn_tid = l4thread_create_long(L4THREAD_INVALID_ID, btn_repeat, ".kbdrep", L4THREAD_INVALID_SP, L4THREAD_DEFAULT_SIZE, L4THREAD_DEFAULT_PRIO, 0, L4THREAD_CREATE_SYNC)) < 0) return btn_tid; btn_l4id = l4thread_l4_id(btn_tid); return 0; }
/* * prevent all other threads from running */ void jthread_suspendall(void) { l4_umword_t old_eflags; l4_umword_t dummy; l4_msgdope_t result; l4_threadid_t src; l4_threadid_t preempter = L4_INVALID_ID; l4_threadid_t pager = L4_INVALID_ID; jthread_t current = live; l4thread_t myself = l4thread_myself(); leaflet.gc = l4_myself(); // LOG("suspendall"); /* * ex-regs all threads and save their state */ while (current) { /** * NoHeapRealtimeThreads will not be stopped */ if (current->daemon==0 && #ifdef REALTIME_EXTENSION current->threadtype != THREADTYPE_NOHEAPREAL && #endif !l4thread_equal(current->l4thread,myself)) { l4_thread_ex_regs(l4thread_l4_id(current->l4thread), (unsigned long)_l4threads_suspendall, (l4_umword_t)-1, &preempter, &pager, &old_eflags,¤t->eip,¤t->esp); } current = current -> next; } /* * Waiting for the notification IPC of the last stopped thread */ { l4_ipc_wait(&src, L4_IPC_SHORT_MSG, &dummy, &dummy, L4_IPC_NEVER,&result); }while(!l4_tasknum_equal(leaflet.gc, src) || L4_IPC_ERROR(result) == L4_IPC_RECANCELED || L4_IPC_ERROR(result) == L4_IPC_REABORTED); // LOG("suspendall-complete"); }
int jthread_extract_stack(jthread_t jtid, void **from, unsigned *len) { l4_umword_t esp,eip,eflags; l4_addr_t low,high; l4_threadid_t pager = L4_INVALID_ID; l4_threadid_t preempter = L4_INVALID_ID; if (l4thread_get_stack(jtid->l4thread,&low,&high)){ assert(!"l4thread_get_stack() problem!"); } else { l4_thread_ex_regs_flags(l4thread_l4_id(jtid->l4thread), (l4_umword_t)-1, (l4_umword_t)-1, &preempter, &pager, &eflags, &eip, &esp, L4_THREAD_EX_REGS_NO_CANCEL); *from = (void *)esp; *len = high - esp; } return (1); }
/* * restore threads */ void jthread_unsuspendall(void) { volatile unsigned long int * ret_addr; l4_umword_t old_eflags,dummy; l4_threadid_t preempter = L4_INVALID_ID; l4_threadid_t pager = L4_INVALID_ID; l4thread_t myself = l4thread_myself(); jthread_t current = live; while (current) { /** * NoHeapRealtimeThreads are never stopped and therefore they are not resumed */ if (current->daemon==0 && #ifdef REALTIME_EXTENSION current->threadtype != THREADTYPE_NOHEAPREAL && #endif !l4thread_equal(current->l4thread,myself)) { current->esp -= 0x04; /* stack address for the return address*/ ret_addr = (unsigned long int *)current->esp; /* replace place holder with the eip*/ *ret_addr = current->eip; l4_thread_ex_regs(l4thread_l4_id(current->l4thread), (unsigned long)_l4threads_resumepoint, current->esp-0x24, &preempter, &pager, &old_eflags, &dummy, &dummy); } current = current -> next; } sleepcount = 0; }
/****************************************************************************** * main * * * * Main function * ******************************************************************************/ int main(int argc, char *argv[]) { int error = 0, i=1; l4_threadid_t dummy_l4id = L4_NIL_ID, loader_id; // l4events_event_t event; // l4events_nr_t eventnr; CORBA_Environment _env = dice_default_environment; /* init */ do_args(argc, argv); my_l4id = l4thread_l4_id( l4thread_myself() ); LOG("Hello, I'm running as "l4util_idfmt, l4util_idstr(my_l4id)); /* ask for 'con' (timeout = 5000 ms) */ if (names_waitfor_name(CON_NAMES_STR, &con_l4id, 50000) == 0) { LOG("PANIC: %s not registered at names", CON_NAMES_STR); enter_kdebug("panic"); } if (names_waitfor_name("LOADER", &loader_id, 50000) == 0) { LOG("PANIC: LOADER not registered at names"); enter_kdebug("panic"); } if (con_if_openqry_call(&con_l4id, MY_SBUF_SIZE, 0, 0, L4THREAD_DEFAULT_PRIO, &vc_l4id, CON_VFB, &_env)) enter_kdebug("Ouch, open vc failed"); if (con_vc_smode_call(&vc_l4id, CON_OUT, &dummy_l4id, &_env)) enter_kdebug("Ouch, setup vc failed"); if (con_vc_graph_gmode_call(&vc_l4id, &gmode, &xres, &yres, &bits_per_pixel, &bytes_per_pixel, &bytes_per_line, &accel_flags, &fn_x, &fn_y, &_env)) enter_kdebug("Ouch, graph_gmode failed"); if (bytes_per_pixel != 2) { printf("Graphics mode not 2 bytes/pixel, exiting\n"); con_vc_close_call(&vc_l4id, &_env); exit(0); } if (create_logo()) enter_kdebug("Ouch, logo creation failed"); while (!error && (i>0)) { if ((error = clear_screen())) enter_kdebug("Ouch, clear_screen failed"); if ((error = logo())) enter_kdebug("Ouch, logo failed"); l4_sleep(500); i--; } if (con_vc_close_call(&vc_l4id, &_env)) enter_kdebug("Ouch, close vc failed?!"); LOG("Finally closed vc"); LOG("Going to bed ..."); names_register("CON_DEMO1"); /* my_id = l4_myself(); event.len=sizeof(l4_umword_t); *(l4_umword_t*)event.str=my_id.id.task; l4events_send(1, &event, &eventnr, L4EVENTS_SEND_ACK); l4events_get_ack(eventnr, L4_IPC_NEVER); */ return 0; }
int ux_probe(con_accel_t *accel) { struct l4_vhw_descriptor *vhw; struct l4_vhw_entry *vhwe; if (!l4util_kip_kernel_is_ux(l4re_kip())) return -L4_ENODEV; if (l4io_lookup_device("L4UXfb", NULL, 0, 0)) { printf("WARNING: Running under Fiasco-UX and no 'L4UXfb' device found, can only use polling mode!\n"); return -L4_ENODEV; } printf("Found Fiasco-UX Framebuffer\n"); if (!(vhw = l4_vhw_get(l4re_kip()))) return -L4_ENODEV; if (!(vhwe = l4_vhw_get_entry_type(vhw, L4_TYPE_VHW_FRAMEBUFFER))) return -L4_ENODEV; ux_con_pid = vhwe->provider_pid; accel->drty = uxScreenUpdate; accel->caps = ACCEL_POST_DIRTY; printf("Found VHW descriptor, provider is %d\n", ux_con_pid); l4_thread_control_start(); l4_thread_control_ux_host_syscall(1); l4_thread_control_commit(l4re_env()->main_thread); /* The update thread needs to run with the same priority than as the vc * threads (otherwise the screen won't be updated) */ { pthread_t update_tid; pthread_attr_t a; struct sched_param sp; pthread_attr_init(&a); sp.sched_priority = 0x70; pthread_attr_setschedpolicy(&a, SCHED_L4); pthread_attr_setschedparam(&a, &sp); pthread_attr_setinheritsched(&a, PTHREAD_EXPLICIT_SCHED); if (pthread_create(&update_tid, &a, updater_thread, NULL)) return -L4_ENOMEM; updater_id = pthread_getl4cap(update_tid); #if 0 update_tid = l4thread_create_long(L4THREAD_INVALID_ID, updater_thread, ".scr-upd", L4THREAD_INVALID_SP, L4THREAD_DEFAULT_SIZE, 0xff, NULL, L4THREAD_CREATE_ASYNC); if (update_tid < 0) { printf("Could not create updater thread.\n"); return -L4_ENOTHREAD; } updater_id = l4thread_l4_id(update_tid); #endif } #if 0 if (hw_vid_mem_addr != vhwe->mem_start || hw_vid_mem_size != vhwe->mem_size) printf("!!! Memory area mismatch "l4_addr_fmt"(%lx) vs. "l4_addr_fmt "(%lx) ... continuing\n", hw_vid_mem_addr, hw_vid_mem_size, vhwe->mem_start, vhwe->mem_size); #endif //map_io_mem(hw_vid_mem_addr, hw_vid_mem_size, 0, "UX video", // (l4_addr_t *)&hw_map_vid_mem_addr); // already mapped by vesa-ds + rm-attach hw_map_vid_mem_addr = hw_vid_mem_addr; return 0; }
/****************************************************************************** * main * * * * Main function * ******************************************************************************/ int main(int argc, char *argv[]) { int error = 0; l4_threadid_t dummy_l4id = L4_NIL_ID; CORBA_Environment _env = dice_default_environment; /* init */ do_args(argc, argv); my_l4id = l4thread_l4_id( l4thread_myself() ); LOG("Hello, I'm running as "l4util_idfmt, l4util_idstr(my_l4id)); /* ask for 'con' (timeout = 5000 ms) */ if (names_waitfor_name(CON_NAMES_STR, &con_l4id, 50000) == 0) { LOG("PANIC: %s not registered at names", CON_NAMES_STR); enter_kdebug("panic"); } if (con_if_openqry_call(&con_l4id, MY_SBUF_SIZE, 0, 0, L4THREAD_DEFAULT_PRIO, &vc_l4id, CON_VFB, &_env)) enter_kdebug("Ouch, open vc failed"); if (con_vc_smode_call(&vc_l4id, CON_OUT, &dummy_l4id, &_env)) enter_kdebug("Ouch, setup vc failed"); if (con_vc_graph_gmode_call(&vc_l4id, &gmode, &xres, &yres, &bits_per_pixel, &bytes_per_pixel, &bytes_per_line, &accel_flags, &fn_x, &fn_y, &_env)) enter_kdebug("Ouch, graph_gmode failed"); if (bytes_per_pixel != 2) { printf("Graphics mode not 2 bytes/pixel, exiting\n"); con_vc_close_call(&vc_l4id, &_env); exit(0); } if (create_logo()) enter_kdebug("Ouch, logo creation failed"); while (!error) { if ((error = clear_screen())) enter_kdebug("Ouch, clear_screen failed"); if ((error = logo())) enter_kdebug("Ouch, logo failed"); l4_sleep(2000); } if (con_vc_close_call(&vc_l4id, &_env)) enter_kdebug("Ouch, close vc failed?!"); LOG("Finally closed vc"); LOG("Going to bed ..."); l4_sleep(-1); return 0; }
void (*_onstop)(void) UNUSED, void (*_ondeadlock)(void) UNUSED) { volatile jthread_t athread; #ifdef REALTIME_EXTENSION l4_threadid_t pager = L4_INVALID_ID; l4_threadid_t preempter; l4_umword_t dummy; /* start the preempter thread */ leaflet.preempter = l4thread_l4_id( l4thread_create_long(L4THREAD_INVALID_ID, jthread_preempter, 0, L4THREAD_INVALID_SP, L4THREAD_DEFAULT_SIZE, //threadStackSize, leaflet.startPrio + maxpr, 0, L4THREAD_CREATE_SYNC)); #endif leaflet.threadCollector = threadCollector; leaflet.onthreadexit = _onthreadexit; /* function to call, if a thread dies*/ leaflet.daemonCount = 0; /* count of all daemon threads */ leaflet.threadCount = 1; /* count of all threads */ #ifdef REALTIME_EXTENSION leaflet.noheapthreadCount = 0; /* count of all NoHeapRealtime threads */ #endif