static int print_pc( caddr_t pc ) { void *handle ; DlInfoRec dli ; OZ_ClassID cid ; if ( DlIsCore( pc ) ) cid = 0LL ; else cid = DlIsClass( pc ) ; handle = DlOpen( cid ) ; if ( handle == NULL ) { if ( cid ) OzOutput( -1, " %016lx:0x%08x", cid, pc ) ; else OzOutput( -1, " 0x%08x", pc ) ; goto error ; } if ( DlAddr( handle, pc, &dli ) < 0 ) { if ( cid ) OzOutput( -1, " %016lx:0x%08x", cid, pc ) ; else OzOutput( -1, " 0x%08x", pc ) ; goto error ; } if ( dli.sname != NULL ) { char *ptr ; char *buff ; OzOutput( -1, " in " ) ; buff = OzMalloc( OzStrlen(dli.sname) + 1 ) ; if ( buff == NULL ) ptr = (char *)dli.sname ; else { OzStrcpy( buff, dli.sname ) ; ptr = OzStrchr( buff, ':' ) ; if ( ptr ) *ptr = '\0' ; ptr = buff ; } if ( cid ) OzOutput( -1, "%016lx::%s", cid, ptr ) ; else OzOutput( -1, "<%s>", ptr ) ; if ( buff != NULL ) OzFree( buff ) ; } if ( dli.sline ) { if ( dli.fname == NULL || cid ) { OzOutput( -1, " (at %d)", dli.sline ) ; } else OzOutput(-1, " at %s:%d", dli.fname, dli.sline ) ; } error: if ( handle != NULL ) DlClose( handle ) ; return( 0 ) ; }
static int Break( char *aStrAddr ) { int id = -1 ; char *p ; caddr_t addr ; OZ_ClassID cid ; void *handle ; int line ; if ( aStrAddr == NULL ) return( 1 ) ; cid = OzStrtoull( aStrAddr, &p, 16 ) ; if ( p - aStrAddr < 16 ) cid |= OzExecutorID ; handle = DlOpen( cid ) ; if ( handle == NULL ) { OzOutput( -1, "Not found %016lx\n", cid ) ; goto error ; } line = OzStrtol( p+1, NULL, 0 ) ; addr = DlSrc( handle, "/private.c", line ) ; if ( addr == NULL ) { OzOutput( -1, "Not found %016lx:%d\n", cid, line ) ; goto error ; } id = OzBreak( addr ) ; if ( id < 0 ) { OzOutput( -1, "Can't break at %016lx:%d[0x%x]\n", cid, line, addr ) ; goto error ; } OzOutput( -1, "%d at 0x%x.\n", id, addr ) ; error: if ( handle != NULL ) DlClose( handle ) ; return( 0 <= id ? 0 : -1 ) ; }
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; }