static int ulwp_walk_init(mdb_walk_state_t *wsp) { uintptr_t addr = wsp->walk_addr; uintptr_t uber_addr; int offset; offset = mdb_ctf_offsetof_by_name("uberdata_t", "all_lwps"); if (offset == -1) { offset = OFFSETOF(uberdata_t, all_lwps); mdb_warn("CTF data is missing for uberdata_t; using current " "platform's offset for uberdata.all_lwps"); } if (addr == NULL && ((uber_addr = uberdata_addr()) == NULL || mdb_vread(&addr, sizeof (addr), uber_addr + offset) != sizeof (addr))) { mdb_warn("cannot find 'uberdata.all_lwps'"); return (WALK_ERR); } if (addr == NULL) return (WALK_DONE); wsp->walk_addr = addr; wsp->walk_data = (void *)addr; return (WALK_NEXT); }
static int ulwp_walk_init(mdb_walk_state_t *wsp) { uintptr_t addr = wsp->walk_addr; uintptr_t uber_addr; if (addr == NULL && ((uber_addr = uberdata_addr()) == NULL || mdb_vread(&addr, sizeof (addr), uber_addr + OFFSETOF(uberdata_t, all_lwps)) != sizeof (addr))) { mdb_warn("cannot find 'uberdata.all_lwps'"); return (WALK_ERR); } if (addr == NULL) return (WALK_DONE); wsp->walk_addr = addr; wsp->walk_data = (void *)addr; return (WALK_NEXT); }
/*ARGSUSED*/ static int d_uberdata(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) { uberdata_t uberdata; int i; if (argc != 0) return (DCMD_USAGE); if (!(flags & DCMD_ADDRSPEC) && (addr = uberdata_addr()) == NULL) return (DCMD_ERR); if (mdb_vread(&uberdata, sizeof (uberdata), addr) != sizeof (uberdata)) { mdb_warn("failed to read uberdata at 0x%p", addr); return (DCMD_ERR); } mdb_printf("%#a\n", addr); HD("&link_lock &ld_lock &fork_lock"); mdb_printf(OFFSTR "%s %s %s\n", OFFSET(link_lock), prt_addr((void *)(addr + OFFSET(link_lock)), 1), prt_addr((void *)(addr + OFFSET(ld_lock)), 1), prt_addr((void *)(addr + OFFSET(fork_lock)), 0)); HD("&atfork_lock &callout_lock &tdb_hash_lock"); mdb_printf(OFFSTR "%s %s %s\n", OFFSET(atfork_lock), prt_addr((void *)(addr + OFFSET(atfork_lock)), 1), prt_addr((void *)(addr + OFFSET(callout_lock)), 1), prt_addr((void *)(addr + OFFSET(tdb_hash_lock)), 0)); HD("&tdb_hash_lock_stats &siguaction[0]"); mdb_printf(OFFSTR "%s %s\n", OFFSET(tdb_hash_lock_stats), prt_addr((void *)(addr + OFFSET(tdb_hash_lock_stats)), 1), prt_addr((void *)(addr + OFFSET(siguaction)), 0)); HD("&bucket free_list chunks"); for (i = 0; i < NBUCKETS; i++) { mdb_printf(OFFSTR "%s %s %ld\n", OFFSET(bucket[i]), prt_addr((void *)(addr + OFFSET(bucket[i])), 1), prt_addr(uberdata.bucket[i].free_list, 1), uberdata.bucket[i].chunks); } HD("&atexit_root head exit_frame_monitor"); mdb_printf(OFFSTR "%s %s %s\n", OFFSET(atexit_root), prt_addr((void *)(addr + OFFSET(atexit_root.exitfns_lock)), 1), prt_addr(uberdata.atexit_root.head, 1), prt_addr(uberdata.atexit_root.exit_frame_monitor, 0)); HD("&tsd_metadata tsdm_nkeys tsdm_nused tsdm_destro"); mdb_printf(OFFSTR "%s %-10d %-10d %s\n", OFFSET(tsd_metadata), prt_addr((void *)(addr + OFFSET(tsd_metadata.tsdm_lock)), 1), uberdata.tsd_metadata.tsdm_nkeys, uberdata.tsd_metadata.tsdm_nused, prt_addr((void *)uberdata.tsd_metadata.tsdm_destro, 0)); HD("&tls_metadata tls_modinfo.data tls_modinfo.size"); mdb_printf(OFFSTR "%s %s %ld\n", OFFSET(tls_metadata), prt_addr((void *)(addr + OFFSET(tls_metadata.tls_lock)), 1), prt_addr(uberdata.tls_metadata.tls_modinfo.tls_data, 1), uberdata.tls_metadata.tls_modinfo.tls_size); HD(" static_tls.data static_tls.size"); mdb_printf(OFFSTR "%s %s %ld\n", OFFSET(tls_metadata.static_tls), " ", prt_addr(uberdata.tls_metadata.static_tls.tls_data, 1), uberdata.tls_metadata.static_tls.tls_size); HD("primary_ma bucket_ini uflags.mt uflags.pad uflags.trs uflags.ted"); mdb_printf(OFFSTR "%-10d %-10d %-10d %-10d %-10d %d\n", OFFSET(primary_map), uberdata.primary_map, uberdata.bucket_init, uberdata.uberflags.uf_x.x_mt, uberdata.uberflags.uf_x.x_pad, uberdata.uberflags.uf_x.x_tdb_register_sync, uberdata.uberflags.uf_x.x_thread_error_detection); HD("queue_head thr_hash_table hash_size hash_mask"); mdb_printf(OFFSTR "%s %s %-10d 0x%x\n", OFFSET(queue_head), prt_addr(uberdata.queue_head, 1), prt_addr(uberdata.thr_hash_table, 1), uberdata.hash_size, uberdata.hash_mask); HD("ulwp_one all_lwps all_zombies"); mdb_printf(OFFSTR "%s %s %s\n", OFFSET(ulwp_one), prt_addr(uberdata.ulwp_one, 1), prt_addr(uberdata.all_lwps, 1), prt_addr(uberdata.all_zombies, 0)); HD("nthreads nzombies ndaemons pid sigacthandler"); mdb_printf(OFFSTR "%-10d %-10d %-10d %-10d %s\n", OFFSET(nthreads), uberdata.nthreads, uberdata.nzombies, uberdata.ndaemons, (int)uberdata.pid, prt_addr((void *)uberdata.sigacthandler, 0)); HD("lwp_stacks lwp_laststack nfreestack stk_cache"); mdb_printf(OFFSTR "%s %s %-10d %d\n", OFFSET(lwp_stacks), prt_addr(uberdata.lwp_stacks, 1), prt_addr(uberdata.lwp_laststack, 1), uberdata.nfreestack, uberdata.thread_stack_cache); HD("ulwp_freelist ulwp_lastfree ulwp_replace_free"); mdb_printf(OFFSTR "%s %s %s\n", OFFSET(ulwp_freelist), prt_addr(uberdata.ulwp_freelist, 1), prt_addr(uberdata.ulwp_lastfree, 1), prt_addr(uberdata.ulwp_replace_free, 0)); HD("ulwp_replace_last atforklist"); mdb_printf(OFFSTR "%s %s\n", OFFSET(ulwp_replace_last), prt_addr(uberdata.ulwp_replace_last, 1), prt_addr(uberdata.atforklist, 0)); HD("robustlocks robustlist progname"); mdb_printf(OFFSTR "%s %s %s\n", OFFSET(robustlocks), prt_addr(uberdata.robustlocks, 1), prt_addr(uberdata.robustlist, 1), prt_addr(uberdata.progname, 0)); HD("tdb_bootstrap tdb_sync_addr_hash tdb_'count tdb_'fail"); mdb_printf(OFFSTR "%s %s %-10d %d\n", OFFSET(tdb_bootstrap), prt_addr(uberdata.tdb_bootstrap, 1), prt_addr(uberdata.tdb.tdb_sync_addr_hash, 1), uberdata.tdb.tdb_register_count, uberdata.tdb.tdb_hash_alloc_failed); HD("tdb_sync_addr_free tdb_sync_addr_last tdb_sync_alloc"); mdb_printf(OFFSTR "%s %s %ld\n", OFFSET(tdb.tdb_sync_addr_free), prt_addr(uberdata.tdb.tdb_sync_addr_free, 1), prt_addr(uberdata.tdb.tdb_sync_addr_last, 1), uberdata.tdb.tdb_sync_alloc); HD("tdb_ev_global_mask tdb_events"); mdb_printf(OFFSTR "0x%08x 0x%08x %s\n", OFFSET(tdb.tdb_ev_global_mask), uberdata.tdb.tdb_ev_global_mask.event_bits[0], uberdata.tdb.tdb_ev_global_mask.event_bits[1], prt_addr((void *)uberdata.tdb.tdb_events, 0)); return (DCMD_OK); }