Пример #1
0
/* OBS! For fsrouter to work it must be initialized from globals.c:init_globals() */
int io_load_file33(const char * filename, void ** addr, unsigned long * size) {

  static l4_threadid_t        fs_drvc_id;
  l4_threadid_t        dm_id;
  l4dm_dataspace_t     ds;
  CORBA_Environment   _env = dice_default_environment;
  char drv = get_drv(filename);

  if(drv == '\0') {
    //io_printf("io.c Warning, no drive in filename, assume c: for now.\n");
    drv = 'c';
  }
  /* How to find the working directory? From this thread ( l4thread_myself() ) find the thread's 
     process (our own prcess structure) and lookup the working directory there.
     L4 has a task- and thread number, as seen in output by [x.y] */
  
  struct I_Fs_srv *target_fs_srv = FSRouter_route(&fsrouter, drv );
  //io_printf("io_load_file: '%s'\n", filename);
  
  if(target_fs_srv) {
      if (!names_waitfor_name(target_fs_srv->server, &fs_drvc_id, 10000))
      {
        io_printf("File provider %s doesn't answer\n", target_fs_srv->mountpoint);
        return 2;
      };

      dm_id = l4env_get_default_dsm();

     if (l4_is_invalid_id(dm_id))
      {
        io_printf("Bad dataspace!\n");
        return 1;
      }
      int f_status = l4fprov_file_open_call(&fs_drvc_id,
                           filename, /* OBS! Ta bort enheten från sökvägen! */
                           &dm_id,
                           0, &ds, size, &_env);
      if(f_status)
        return 2;
      f_status=l4rm_attach(&ds, *size, 0,
                  L4DM_RO | L4RM_MAP, addr);
      if(f_status)
      {
        io_printf("error %s\n", l4env_errstr(f_status));
        return 2;
      }
      //io_printf("io_load_file(: '%s', 0x%x, %d )\n", filename, *addr, *size);
      return 0;
  } else {
    io_printf("target_fs_srv: 0x%x\n", target_fs_srv);
    return 2; /* ERROR_FILE_NOT_FOUND; */
  }
Пример #2
0
static void get_fb(void)
{
  l4_addr_t fpage_addr;
  l4_size_t fpage_size;
  l4dm_dataspace_t ds;
  CORBA_Environment env = dice_default_environment;
  int i, pages, error;
  struct stat st;

  /* check if we're running under L4Linux */
  if (stat("/proc/l4", &st) == -1) {
    fprintf(stderr, "Error: /proc/l4 doesn't exist, not running on L4Linux?!\n");
    exit(1);
  }

  /* ask for 'con' (timeout = 5000 ms) */
  if (names_waitfor_name(CON_NAMES_STR, &con_l4id, 5000) == 0) {
    fprintf(stderr, "PANIC: %s not registered at names", CON_NAMES_STR);
    exit(1);
  }
  INFO("Found my console through names, it's at "l4util_idfmt".\n",
       l4util_idstr(con_l4id));

  PRINT("Screenshot'ing, please smile... ;-)\n");
  /* get screenshot */
  if (con_if_screenshot_call(&con_l4id, get_vc, &ds, 
			&xres, &yres, &bpp, &env)) {
    fprintf(stderr, "Could not get screenshot\n");
    exit(1);
  }
  INFO("Got screenshot: res: %dx%d, bpp: %d\n", xres, yres, bpp);

  if (l4dm_mem_size(&ds, &fb_size)) {
    fprintf(stderr, "Couldn't get size of data space\n");
    exit(1);
  }
  INFO("Size of data space: %d\n", fb_size);

  if ((fb_mem = malloc(fb_size)) == NULL) {
    fprintf(stderr, "Couldn't malloc %d Bytes of memory!\n", fb_size);
    exit(1);
  }
  raw_pic_size = xres*yres*3;
  if ((raw_pic_mem = malloc(raw_pic_size)) == NULL) {
    fprintf(stderr, "Couldn't malloc %d bytes of memory!\n", raw_pic_size);
    exit(1);
  }
  
  pages = fb_size / L4_PAGESIZE; // size is always a multiple of L4_PAGESIZE?
  for (i = 0; i < pages; i++) {
    /* unmap memory */
    l4_fpage_unmap(l4_fpage((l4_umword_t)map_page, L4_LOG2_PAGESIZE,
	  	   L4_FPAGE_RW, L4_MAP_ITEM_MAP),
                   L4_FP_FLUSH_PAGE|L4_FP_ALL_SPACES);

    /* page in L4 page */
    if ((error = l4dm_map_pages(&ds, i*L4_PAGESIZE, L4_PAGESIZE,
			        (l4_addr_t)map_page, L4_LOG2_PAGESIZE,
				0, L4DM_RO, &fpage_addr,&fpage_size)) < 0) {
      fprintf(stderr, "Error %d requesting ds %d at ds_manager "
	      l4util_idfmt"\n",
	  error, ds.id, l4util_idstr(ds.manager));
      l4dm_close(&ds);
      exit(error);
    }

    memcpy(fb_mem + i*L4_PAGESIZE, map_page, L4_PAGESIZE);
  }

  if (l4dm_close(&ds)) {
    fprintf(stderr, "Error on closing dataspace, expect memory leakage...\n");
  }
}
Пример #3
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;
}
Пример #4
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;
}
Пример #5
0
void
exec_runserver(int ppid)
{
    int  i, j;
    char *s, *p, *q, *name;
    char params[] = "";
    char server[0x20];
    char *srv, *to;
    int  timeout = 30000;
    l4_threadid_t tid;
    struct t_os2process *proc; // server PTDA/proc

    for (i = 0; i < 5; i++)
    {
        name = (char *)type[i].name;
        io_log("name=%s\n", name);
        if (!strcmp(name, "RUNSERVER"))
        {
            for (j = 0; j < type[i].ip; j++)
            {
                s = type[i].sp[j].string;
                p = getcmd (s);
                s = skipto(0, s);

                q = strdup(p);

                // create proc/PTDA structure
                proc = PrcCreate(ppid,      // ppid
                                 basename(q), // pPrg
                                 NULL,      // pArg
                                 NULL);     // pEnv

                free(q);

                l4os3_exec (p, params, &tid);
                io_log("started task: %x.%x\n", tid.id.task, tid.id.lthread);

                /* set task number */
                proc->task = tid;

                if (strstr(p, "os2fs"))
                {
                    io_log("os2fs started\n");
                    if (!names_waitfor_name("os2fs", &fs, 30000))
                    {
                        io_log("Can't find os2fs on name server!\n");
                        return;
                    }
                }

                srv     = getcmd (skipto(0, strstr(s, "-LOOKFOR")));

                /* skip spaces and quotes */
                for (p = srv; *p == '"' || *p == ' '; p++) ;
                srv = p;
                for (p = srv + strlen(srv) - 1; *p == '"' || *p == ' '; p--) *p = '\0';
                strcpy (server, srv);

                to      = getcmd (skipto(0, strstr(s, "-TIMEOUT")));
                timeout = atoi (to);

                io_log("LOOKFOR:%s, TIMEOUT:%d\n", server, timeout);
                if (*server && !names_waitfor_name(server, &tid, timeout))
                {
                    io_log("Timeout waiting for %s\n", server);
                    return;
                }
            }
            io_log("Server %s started\n", server);
        }
    }

    return;
}
Пример #6
0
int main (int argc, char *argv[])
{
  //CORBA_Environment env = dice_default_environment;
  l4_uint32_t area;
  int rc = 0;
  int optionid;
  int opt = 0;

  const struct option long_options[] =
                {
                { "events",      no_argument, NULL, 'e'},
		{ 0, 0, 0, 0}
                };

  if (!names_waitfor_name("os2srv", &os2srv, 30000))
    {
      LOG("Can't find os2srv on names, exiting...");
      __exit(1, 1);
    }

  if (!names_waitfor_name(fprov, &fprov_id, 30000))
    {
      LOG("Can't find %s on names, exiting...", fprov);
      __exit(1, 1);
    }

  // reserve the lower 64 Mb for OS/2 app
  rc = l4rm_area_reserve_region(0x10000, 0x04000000 - 0x10000, 0, &area);
  if (rc < 0)
  {
    LOG("Panic: something is using memory within the 1st 64 Mb!");
    __exit(1, 1);
  }

  /* query default dataspace manager id */
  dsm = l4env_get_default_dsm();
  if (l4_is_invalid_id(dsm))
  {
    LOG("No dataspace manager found\n");
    __exit(1, 1);
  }
  LOG("dsm=%u.%u", dsm.id.task, dsm.id.lthread);
  LOG("frov_id=%u.%u", fprov_id.id.task, fprov_id.id.lthread);

  l4env_infopage = &infopg;
  l4env_infopage->fprov_id = fprov_id;
  l4env_infopage->memserv_id = dsm;

  if ((rc = DlOpen("/file/system/libkal.s.so", &kalHandle)))
  {
    LOG("Can't load libkal.s.so");
    __exit(1, 1);
  }

  LOG("kalHandle=%lu", kalHandle);

  // fill in the parameter structure for KalInit
  initstr.stack   = __stack;
  initstr.l4rm_do_attach = l4rm_do_attach;
  initstr.l4rm_detach = l4rm_detach;
  initstr.l4rm_lookup        = l4rm_lookup;
  initstr.l4rm_lookup_region = l4rm_lookup_region;
  initstr.l4rm_do_reserve  = l4rm_do_reserve;
  initstr.l4rm_set_userptr   = l4rm_set_userptr; 
  initstr.l4rm_get_userptr   = l4rm_get_userptr;
  initstr.l4rm_area_release  = l4rm_area_release;
  initstr.l4rm_area_release_addr = l4rm_area_release_addr;
  initstr.l4rm_show_region_list = l4rm_show_region_list;
  initstr.l4env_get_default_dsm  = l4env_get_default_dsm;
  initstr.fiasco_gdt_set         = __fiasco_gdt_set;
  initstr.fiasco_gdt_get_entry_offset = __fiasco_gdt_get_entry_offset;
  initstr.logtag = LOG_tag;

  // init kal.dll
  DlRoute(0, "KalInit", &initstr);

  // Parse command line arguments
  for (;;)
  {
    opt = getopt_long(argc, argv, "e", long_options, &optionid);
    if (opt == -1) break;
    switch (opt)
    {
      case 'e':
        LOG("using events server");
	use_events = 1;
	break;
      
      default:
        LOG("Error: Unknown option %c", opt);
        usage();
        __exit(1, 2);
    }
  }

  // start events thread
  if (use_events)
  {
    // start events thread
    l4thread_create((void *)event_thread, 0, L4THREAD_CREATE_ASYNC);
    LOG("event thread started");
  }

  // release the reserved area for application
  rc = l4rm_area_release(area);

  LOG("calling KalStartApp...");
  DlRoute(0, "KalStartApp", argv[argc - 1]);

  return 0;
}
Пример #7
0
void main (int argc, char *argv[])
{
  CORBA_Server_Environment env = dice_default_server_environment;
  l4dm_dataspace_t ds;
  l4_threadid_t pager;
  l4_addr_t addr;
  l4_size_t size;
  int  rc, t;
  int  is_int = 0;
  int  value_int = 0;
  char buf[0x1000];
  char *p = buf;
  int optionid;
  int opt = 0;
  const struct option long_options[] =
                {
                { "events",      no_argument, NULL, 'e'},
		{ 0, 0, 0, 0}
                };

  //init_globals();

  if (!names_register("os2exec"))
    {
      LOG("Error registering on the name server!");
      return;
    }

  if (!names_waitfor_name("os2srv", &os2srv, 30000))
    {
      LOG("os2srv not found on name server!");
      return;
    }

  if (!names_waitfor_name("os2fs", &fs, 30000))
    {
      LOG("os2fs not found on name server!");
      return;
    }
  LOG("os2fs tid:%x.%x", fs.id.task, fs.id.lthread);

  if (!names_waitfor_name("LOADER", &loader, 30000))
    {
      LOG("LOADER not found on name server!");
      return;
    }

  execsrv = l4_myself();

  // Parse command line arguments
  for (;;)
  {
    opt = getopt_long(argc, argv, "e", long_options, &optionid);
    if (opt == -1) break;
    switch (opt)
    {
      case 'e':
        LOG("using events server");
	use_events = 1;
	break;
      
      default:
        LOG("Error: Unknown option %c", opt);
        usage();
        return;
    }
  }

  // start events thread
  if (use_events)
  {
    // start events thread
    l4thread_create(event_thread, 0, L4THREAD_CREATE_ASYNC);
    LOG("event thread started");
  }

  /* reserve the area below 64 Mb for application private code
     (not for use by libraries, loaded by execsrv) */
  addr = 0x2f000; size = 0x04000000 - addr;
  if ((rc  = l4rm_direct_area_setup_region(addr,
					   size,
					   L4RM_DEFAULT_REGION_AREA,
					   L4RM_REGION_BLOCKED, 0,
					   L4_INVALID_ID)) < 0)
    {
      LOG_printf("main(): setup region %x-%x failed (%d)!\n",
	  addr, addr + size, rc);
      l4rm_show_region_list();
      enter_kdebug("PANIC");
    }
  memset (&options, 0, sizeof(options));

#if 0
  if (!CfgGetopt("debugmodmgr", &is_int, &value_int, (char **)&p))
    if (is_int)
      options.debugmodmgr = value_int;

  if (!CfgGetopt("debugixfmgr", &is_int, &value_int, (char **)&p))
    if (is_int)
      options.debugixfmgr = value_int;

  if (!CfgGetopt("libpath", &is_int, &value_int, (char **)&p))
    if (!is_int)
    {
      options.libpath = (char *)malloc(strlen(p) + 1);
      strcpy(options.libpath, p);
    }

  LOG("debugmodmgr=%d", options.debugmodmgr);
  LOG("debugixfmgr=%d", options.debugixfmgr);
  LOG("libpath=%s", options.libpath);
#endif
  options.libpath = (char *)malloc(4);
  strcpy(options.libpath, "c:\\");

  /* get our l4env infopage as a dataspace */
  rc = l4loader_app_info_call(&loader, l4_myself().id.task,
                              0, &p, &ds, &env);
  /* attach it */  
  attach_ds(&ds, L4DM_RO, &infopage);

#if 0
  /* load shared libs */
  rc = loadso();
  if (rc)
  {
    LOG("Error loading shared libraries");
    return;
  }
#endif

  init_memmgr(&root_area);

  /* load IXF's */
  rc = load_ixfs();
  if (rc)
  {
    LOG("Error loading IXF driver");
    return;
  }
			      
  /* Initializes the module list. Keeps info about which dlls an process have loaded and
     has linked to it (Only support for LX dlls so far). The head of the linked list is
     declared as a global inside dynlink.c */
  rc = ModInitialize();
  if (rc)
  {
    LOG("Can't initialize module manager");
    return;
  }

  // server loop
  LOG("execsrv started.");
  env.malloc = (dice_malloc_func)malloc;
  env.free = (dice_free_func)free;
  os2exec_server_loop(&env);
}
Пример #8
0
int main(int argc, char **argv)
{
  CORBA_Environment env = dice_default_environment;
  int optionid;
  int opt = 0;
  const struct option long_options[] =
                {
                { "events",      no_argument, NULL, 'e'},
		{ 0, 0, 0, 0}
                };
  //int  rc;

  init_globals();
  //FSR_INIT();

  if (!names_register("os2fs"))
  {
    LOG("Can't register on the name server!");
    return 1;
  }
  LOG("registered at the name server");

  if (!names_waitfor_name("os2srv", &os2srv, 30000))
  {
    LOG("Can't find os2srv on names, exiting...");
    return 1;
  }
  LOG("got os2srv tid from the name server");

  LOG("argc=%d", argc);
  // Parse command line arguments
  for (;;)
  {
    opt = getopt_long(argc, argv, "e", long_options, &optionid);
    LOG("opt=%d", opt);
    if (opt == -1) break;
    switch (opt)
    {
      case 'e':
        LOG("using events server");
	use_events = 1;
	break;
      
      default:
        LOG("Error: Unknown option %c", opt);
        usage();
        break;
    }
  }

  // start events thread
  if (use_events)
  {
    // start events thread
    l4thread_create((void *)event_thread, 0, L4THREAD_CREATE_ASYNC);
    LOG("event thread started");
  }

  // my id
  fs = l4_myself();

  // server loop
  LOG("going to the server loop");
  env.malloc = (dice_malloc_func)malloc;
  env.free = (dice_free_func)free;
  os2fs_server_loop(&env);

  return 0;
}