1286 mdb_tgt_t *t = mdb.m_target;
1287
1288 if (t->t_pshandle != NULL) {
1289 const pstatus_t *psp = Pstatus(t->t_pshandle);
1290 int cursig = psp->pr_lwp.pr_cursig;
1291 char signame[SIG2STR_MAX];
1292 int state = Pstate(t->t_pshandle);
1293
1294 if (state != PS_DEAD && state != PS_IDLE)
1295 mdb_printf("process id = %d\n", psp->pr_pid);
1296 else
1297 mdb_printf("no process\n");
1298
1299 if (cursig != 0 && sig2str(cursig, signame) == 0)
1300 mdb_printf("SIG%s: %s\n", signame, strsignal(cursig));
1301 }
1302
1303 return (pt_regs(addr, flags, argc, argv));
1304 }
1305
1306 static int
1307 pt_findstack(uintptr_t tid, uint_t flags, int argc, const mdb_arg_t *argv)
1308 {
1309 mdb_tgt_t *t = mdb.m_target;
1310 mdb_tgt_gregset_t gregs;
1311 int showargs = 0;
1312 int count;
1313 uintptr_t pc, sp;
1314
1315 if (!(flags & DCMD_ADDRSPEC))
1316 return (DCMD_USAGE);
1317
1318 count = mdb_getopts(argc, argv, 'v', MDB_OPT_SETBITS, TRUE, &showargs,
1319 NULL);
1320 argc -= count;
1321 argv += count;
1322
1323 if (argc > 1 || (argc == 1 && argv->a_type != MDB_TYPE_STRING))
1324 return (DCMD_USAGE);
1325
1326 if (PTL_GETREGS(t, tid, gregs.gregs) != 0) {
1327 mdb_warn("failed to get register set for thread %p", tid);
1328 return (DCMD_ERR);
1329 }
1330
1331 pc = gregs.gregs[R_PC];
1332 #if defined(__i386) || defined(__amd64)
1333 sp = gregs.gregs[R_FP];
1334 #else
1335 sp = gregs.gregs[R_SP];
1336 #endif
1337 mdb_printf("stack pointer for thread %p: %p\n", tid, sp);
1338 if (pc != 0)
1339 mdb_printf("[ %0?lr %a() ]\n", sp, pc);
1340
1341 (void) mdb_inc_indent(2);
1342 mdb_set_dot(sp);
1343
1344 if (argc == 1)
1345 (void) mdb_eval(argv->a_un.a_str);
1346 else if (showargs)
1347 (void) mdb_eval("<.$C");
1348 else
1349 (void) mdb_eval("<.$C0");
1350
1351 (void) mdb_dec_indent(2);
1352 return (DCMD_OK);
1353 }
1354
1355 /*ARGSUSED*/
1356 static int
1357 pt_gcore(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
|
1286 mdb_tgt_t *t = mdb.m_target;
1287
1288 if (t->t_pshandle != NULL) {
1289 const pstatus_t *psp = Pstatus(t->t_pshandle);
1290 int cursig = psp->pr_lwp.pr_cursig;
1291 char signame[SIG2STR_MAX];
1292 int state = Pstate(t->t_pshandle);
1293
1294 if (state != PS_DEAD && state != PS_IDLE)
1295 mdb_printf("process id = %d\n", psp->pr_pid);
1296 else
1297 mdb_printf("no process\n");
1298
1299 if (cursig != 0 && sig2str(cursig, signame) == 0)
1300 mdb_printf("SIG%s: %s\n", signame, strsignal(cursig));
1301 }
1302
1303 return (pt_regs(addr, flags, argc, argv));
1304 }
1305
1306 static void
1307 pt_thread_name(mdb_tgt_t *t, mdb_tgt_tid_t tid, char *buf, size_t bufsize)
1308 {
1309 char name[THREAD_NAME_MAX];
1310
1311 buf[0] = '\0';
1312
1313 if (t->t_pshandle == NULL ||
1314 Plwp_getname(t->t_pshandle, tid, name, sizeof (name)) != 0 ||
1315 name[0] == '\0') {
1316 (void) mdb_snprintf(buf, bufsize, "%lu", tid);
1317 return;
1318 }
1319
1320 (void) mdb_snprintf(buf, bufsize, "%lu [%s]", tid, name);
1321 }
1322
1323 static int
1324 pt_findstack(uintptr_t tid, uint_t flags, int argc, const mdb_arg_t *argv)
1325 {
1326 mdb_tgt_t *t = mdb.m_target;
1327 mdb_tgt_gregset_t gregs;
1328 int showargs = 0;
1329 int count;
1330 uintptr_t pc, sp;
1331 char name[128];
1332
1333 if (!(flags & DCMD_ADDRSPEC))
1334 return (DCMD_USAGE);
1335
1336 count = mdb_getopts(argc, argv, 'v', MDB_OPT_SETBITS, TRUE, &showargs,
1337 NULL);
1338 argc -= count;
1339 argv += count;
1340
1341 if (argc > 1 || (argc == 1 && argv->a_type != MDB_TYPE_STRING))
1342 return (DCMD_USAGE);
1343
1344 if (PTL_GETREGS(t, tid, gregs.gregs) != 0) {
1345 mdb_warn("failed to get register set for thread %p", tid);
1346 return (DCMD_ERR);
1347 }
1348
1349 pc = gregs.gregs[R_PC];
1350 #if defined(__i386) || defined(__amd64)
1351 sp = gregs.gregs[R_FP];
1352 #else
1353 sp = gregs.gregs[R_SP];
1354 #endif
1355
1356 pt_thread_name(t, tid, name, sizeof (name));
1357
1358 mdb_printf("stack pointer for thread %s: %p\n", name, sp);
1359 if (pc != 0)
1360 mdb_printf("[ %0?lr %a() ]\n", sp, pc);
1361
1362 (void) mdb_inc_indent(2);
1363 mdb_set_dot(sp);
1364
1365 if (argc == 1)
1366 (void) mdb_eval(argv->a_un.a_str);
1367 else if (showargs)
1368 (void) mdb_eval("<.$C");
1369 else
1370 (void) mdb_eval("<.$C0");
1371
1372 (void) mdb_dec_indent(2);
1373 return (DCMD_OK);
1374 }
1375
1376 /*ARGSUSED*/
1377 static int
1378 pt_gcore(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
|