Beispiel #1
0
/******************************************************************************
 * 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;
}
Beispiel #2
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;
}
Beispiel #3
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

        athread = KGC_malloc(threadCollector, sizeof (*athread), KGC_ALLOC_THREADCTX);