xref: /illumos-gate/usr/src/cmd/psrset/psrset.c (revision 0cc80ade)
17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5fb9b0aa8SSurya Prakki  * Common Development and Distribution License (the "License").
6fb9b0aa8SSurya Prakki  * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate  *
87c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate  * and limitations under the License.
127c478bd9Sstevel@tonic-gate  *
137c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate  *
197c478bd9Sstevel@tonic-gate  * CDDL HEADER END
207c478bd9Sstevel@tonic-gate  */
217c478bd9Sstevel@tonic-gate /*
22fb9b0aa8SSurya Prakki  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
237c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
247c478bd9Sstevel@tonic-gate  */
25*0cc80adeSRobert Mustacchi /*
26*0cc80adeSRobert Mustacchi  * Copyright (c) 2013, Joyent, Inc.  All rights reserved.
27*0cc80adeSRobert Mustacchi  */
287c478bd9Sstevel@tonic-gate 
297c478bd9Sstevel@tonic-gate /*
307c478bd9Sstevel@tonic-gate  * psrset - create and manage processor sets
317c478bd9Sstevel@tonic-gate  */
327c478bd9Sstevel@tonic-gate 
337c478bd9Sstevel@tonic-gate #include <sys/types.h>
347c478bd9Sstevel@tonic-gate #include <sys/procset.h>
357c478bd9Sstevel@tonic-gate #include <sys/processor.h>
367c478bd9Sstevel@tonic-gate #include <sys/pset.h>
377c478bd9Sstevel@tonic-gate #include <fcntl.h>
387c478bd9Sstevel@tonic-gate #include <stdio.h>
397c478bd9Sstevel@tonic-gate #include <errno.h>
407c478bd9Sstevel@tonic-gate #include <dirent.h>
417c478bd9Sstevel@tonic-gate #include <locale.h>
427c478bd9Sstevel@tonic-gate #include <string.h>
437c478bd9Sstevel@tonic-gate #include <limits.h>
447c478bd9Sstevel@tonic-gate #include <procfs.h>
457c478bd9Sstevel@tonic-gate #include <libproc.h>
467c478bd9Sstevel@tonic-gate #include <stdarg.h>
47*0cc80adeSRobert Mustacchi #include <zone.h>
487c478bd9Sstevel@tonic-gate 
497c478bd9Sstevel@tonic-gate #if !defined(TEXT_DOMAIN)		/* should be defined by cc -D */
507c478bd9Sstevel@tonic-gate #define	TEXT_DOMAIN 	"SYS_TEST"	/* Use this only if it wasn't */
517c478bd9Sstevel@tonic-gate #endif
527c478bd9Sstevel@tonic-gate 
537c478bd9Sstevel@tonic-gate #define	MAX_PROCFS_PATH	80
547c478bd9Sstevel@tonic-gate 
557c478bd9Sstevel@tonic-gate #define	ERR_OK		0		/* exit status for success */
567c478bd9Sstevel@tonic-gate #define	ERR_FAIL	1		/* exit status for errors */
577c478bd9Sstevel@tonic-gate #define	ERR_USAGE	2		/* exit status for usage errors */
587c478bd9Sstevel@tonic-gate 
597c478bd9Sstevel@tonic-gate static char *progname;
607c478bd9Sstevel@tonic-gate static int errors;
617c478bd9Sstevel@tonic-gate static char cflag;
627c478bd9Sstevel@tonic-gate static char dflag;
637c478bd9Sstevel@tonic-gate static char aflag;
647c478bd9Sstevel@tonic-gate static char rflag;
657c478bd9Sstevel@tonic-gate static char iflag;
667c478bd9Sstevel@tonic-gate static char bflag;
677c478bd9Sstevel@tonic-gate static char uflag;
687c478bd9Sstevel@tonic-gate static char Uflag;
697c478bd9Sstevel@tonic-gate static char qflag;
707c478bd9Sstevel@tonic-gate static char Qflag;
717c478bd9Sstevel@tonic-gate static char pflag;
727c478bd9Sstevel@tonic-gate static char nflag;
737c478bd9Sstevel@tonic-gate static char fflag;
747c478bd9Sstevel@tonic-gate static char Fflag;
757c478bd9Sstevel@tonic-gate static char eflag;
76*0cc80adeSRobert Mustacchi static char zflag;
77*0cc80adeSRobert Mustacchi static const char *zname;
787c478bd9Sstevel@tonic-gate 
797c478bd9Sstevel@tonic-gate extern int pset_assign_forced(psetid_t, processorid_t, psetid_t *);
807c478bd9Sstevel@tonic-gate 
817c478bd9Sstevel@tonic-gate /*PRINTFLIKE1*/
827c478bd9Sstevel@tonic-gate static void
warn(char * format,...)837c478bd9Sstevel@tonic-gate warn(char *format, ...)
847c478bd9Sstevel@tonic-gate {
857c478bd9Sstevel@tonic-gate 	int err = errno;
867c478bd9Sstevel@tonic-gate 	va_list alist;
877c478bd9Sstevel@tonic-gate 
887c478bd9Sstevel@tonic-gate 	(void) fprintf(stderr, "%s: ", progname);
897c478bd9Sstevel@tonic-gate 	va_start(alist, format);
907c478bd9Sstevel@tonic-gate 	(void) vfprintf(stderr, format, alist);
917c478bd9Sstevel@tonic-gate 	va_end(alist);
927c478bd9Sstevel@tonic-gate 	if (strchr(format, '\n') == NULL)
937c478bd9Sstevel@tonic-gate 		(void) fprintf(stderr, ": %s\n", strerror(err));
947c478bd9Sstevel@tonic-gate }
957c478bd9Sstevel@tonic-gate 
967c478bd9Sstevel@tonic-gate /*PRINTFLIKE1*/
977c478bd9Sstevel@tonic-gate static void
die(char * format,...)987c478bd9Sstevel@tonic-gate die(char *format, ...)
997c478bd9Sstevel@tonic-gate {
1007c478bd9Sstevel@tonic-gate 	int err = errno;
1017c478bd9Sstevel@tonic-gate 	va_list alist;
1027c478bd9Sstevel@tonic-gate 
1037c478bd9Sstevel@tonic-gate 	(void) fprintf(stderr, "%s: ", progname);
1047c478bd9Sstevel@tonic-gate 	va_start(alist, format);
1057c478bd9Sstevel@tonic-gate 	(void) vfprintf(stderr, format, alist);
1067c478bd9Sstevel@tonic-gate 	va_end(alist);
1077c478bd9Sstevel@tonic-gate 	if (strchr(format, '\n') == NULL)
1087c478bd9Sstevel@tonic-gate 		(void) fprintf(stderr, ": %s\n", strerror(err));
1097c478bd9Sstevel@tonic-gate 	exit(ERR_FAIL);
1107c478bd9Sstevel@tonic-gate }
1117c478bd9Sstevel@tonic-gate 
1127c478bd9Sstevel@tonic-gate static struct ps_prochandle *
grab_proc(id_t pid)1137c478bd9Sstevel@tonic-gate grab_proc(id_t pid)
1147c478bd9Sstevel@tonic-gate {
1157c478bd9Sstevel@tonic-gate 	int ret;
1167c478bd9Sstevel@tonic-gate 	struct ps_prochandle *Pr;
1177c478bd9Sstevel@tonic-gate 
1187c478bd9Sstevel@tonic-gate 	if ((Pr = Pgrab(pid, 0, &ret)) == NULL) {
1197c478bd9Sstevel@tonic-gate 		warn(gettext("cannot control process %d: %s\n"),
1207c478bd9Sstevel@tonic-gate 		    (int)pid, Pgrab_error(ret));
1217c478bd9Sstevel@tonic-gate 		errors = ERR_FAIL;
1227c478bd9Sstevel@tonic-gate 		return (NULL);
1237c478bd9Sstevel@tonic-gate 	}
1247c478bd9Sstevel@tonic-gate 
1257c478bd9Sstevel@tonic-gate 	return (Pr);
1267c478bd9Sstevel@tonic-gate }
1277c478bd9Sstevel@tonic-gate 
1287c478bd9Sstevel@tonic-gate static void
rele_proc(struct ps_prochandle * Pr)1297c478bd9Sstevel@tonic-gate rele_proc(struct ps_prochandle *Pr)
1307c478bd9Sstevel@tonic-gate {
1317c478bd9Sstevel@tonic-gate 	if (Pr == NULL)
1327c478bd9Sstevel@tonic-gate 		return;
1337c478bd9Sstevel@tonic-gate 	Prelease(Pr, 0);
1347c478bd9Sstevel@tonic-gate }
1357c478bd9Sstevel@tonic-gate 
1367c478bd9Sstevel@tonic-gate static void
bind_err(psetid_t pset,const char * zname,id_t pid,id_t lwpid,int err)137*0cc80adeSRobert Mustacchi bind_err(psetid_t pset, const char *zname, id_t pid, id_t lwpid, int err)
1387c478bd9Sstevel@tonic-gate {
1397c478bd9Sstevel@tonic-gate 	char    *msg;
1407c478bd9Sstevel@tonic-gate 
1417c478bd9Sstevel@tonic-gate 	switch (pset) {
1427c478bd9Sstevel@tonic-gate 	case PS_NONE:
1437c478bd9Sstevel@tonic-gate 		msg = gettext("unbind");
1447c478bd9Sstevel@tonic-gate 		break;
1457c478bd9Sstevel@tonic-gate 	case PS_QUERY:
1467c478bd9Sstevel@tonic-gate 		msg = gettext("query");
1477c478bd9Sstevel@tonic-gate 		break;
1487c478bd9Sstevel@tonic-gate 	default:
1497c478bd9Sstevel@tonic-gate 		msg = gettext("bind");
1507c478bd9Sstevel@tonic-gate 		break;
1517c478bd9Sstevel@tonic-gate 	}
1527c478bd9Sstevel@tonic-gate 
1537c478bd9Sstevel@tonic-gate 	errno = err;
154*0cc80adeSRobert Mustacchi 	if (zname != NULL)
155*0cc80adeSRobert Mustacchi 		warn(gettext("cannot %s zone %s"), msg, zname);
156*0cc80adeSRobert Mustacchi 	else if (lwpid == -1)
1577c478bd9Sstevel@tonic-gate 		warn(gettext("cannot %s pid %d"), msg, pid);
1587c478bd9Sstevel@tonic-gate 	else
1597c478bd9Sstevel@tonic-gate 		warn(gettext("cannot %s lwpid %d/%d"), msg, pid, lwpid);
1607c478bd9Sstevel@tonic-gate }
1617c478bd9Sstevel@tonic-gate 
1627c478bd9Sstevel@tonic-gate /*
1637c478bd9Sstevel@tonic-gate  * Output for create.
1647c478bd9Sstevel@tonic-gate  */
1657c478bd9Sstevel@tonic-gate static void
create_out(psetid_t pset)1667c478bd9Sstevel@tonic-gate create_out(psetid_t pset)
1677c478bd9Sstevel@tonic-gate {
1687c478bd9Sstevel@tonic-gate 	(void) printf("%s %d\n", gettext("created processor set"), pset);
1697c478bd9Sstevel@tonic-gate }
1707c478bd9Sstevel@tonic-gate 
1717c478bd9Sstevel@tonic-gate /*
1727c478bd9Sstevel@tonic-gate  * Output for assign.
1737c478bd9Sstevel@tonic-gate  */
1747c478bd9Sstevel@tonic-gate static void
assign_out(processorid_t cpu,psetid_t old,psetid_t new)1757c478bd9Sstevel@tonic-gate assign_out(processorid_t cpu, psetid_t old, psetid_t new)
1767c478bd9Sstevel@tonic-gate {
1777c478bd9Sstevel@tonic-gate 	if (old == PS_NONE) {
1787c478bd9Sstevel@tonic-gate 		if (new == PS_NONE)
1797c478bd9Sstevel@tonic-gate 			(void) printf(gettext("processor %d: was not assigned,"
1807c478bd9Sstevel@tonic-gate 			    " now not assigned\n"), cpu);
1817c478bd9Sstevel@tonic-gate 		else
1827c478bd9Sstevel@tonic-gate 			(void) printf(gettext("processor %d: was not assigned,"
1837c478bd9Sstevel@tonic-gate 			    " now %d\n"), cpu, new);
1847c478bd9Sstevel@tonic-gate 	} else {
1857c478bd9Sstevel@tonic-gate 		if (new == PS_NONE)
1867c478bd9Sstevel@tonic-gate 			(void) printf(gettext("processor %d: was %d, "
1877c478bd9Sstevel@tonic-gate 			    "now not assigned\n"), cpu, old);
1887c478bd9Sstevel@tonic-gate 		else
1897c478bd9Sstevel@tonic-gate 			(void) printf(gettext("processor %d: was %d, "
1907c478bd9Sstevel@tonic-gate 			    "now %d\n"), cpu, old, new);
1917c478bd9Sstevel@tonic-gate 	}
1927c478bd9Sstevel@tonic-gate }
1937c478bd9Sstevel@tonic-gate 
1947c478bd9Sstevel@tonic-gate /*
1957c478bd9Sstevel@tonic-gate  * Output for query.
1967c478bd9Sstevel@tonic-gate  */
1977c478bd9Sstevel@tonic-gate static void
query_out(id_t pid,id_t lwpid,psetid_t pset)1987c478bd9Sstevel@tonic-gate query_out(id_t pid, id_t lwpid, psetid_t pset)
1997c478bd9Sstevel@tonic-gate {
2007c478bd9Sstevel@tonic-gate 	char *proclwp;
2017c478bd9Sstevel@tonic-gate 	char pidstr[21];
2027c478bd9Sstevel@tonic-gate 
2037c478bd9Sstevel@tonic-gate 	if (lwpid == -1) {
2047c478bd9Sstevel@tonic-gate 		(void) snprintf(pidstr, 20, "%d", pid);
2057c478bd9Sstevel@tonic-gate 		proclwp = "process";
2067c478bd9Sstevel@tonic-gate 	} else {
2077c478bd9Sstevel@tonic-gate 		(void) snprintf(pidstr, 20, "%d/%d", pid, lwpid);
2087c478bd9Sstevel@tonic-gate 		proclwp = "lwp";
2097c478bd9Sstevel@tonic-gate 	}
2107c478bd9Sstevel@tonic-gate 
2117c478bd9Sstevel@tonic-gate 	if (pset == PS_NONE)
2127c478bd9Sstevel@tonic-gate 		(void) printf(gettext("%s id %s: not bound\n"),
2137c478bd9Sstevel@tonic-gate 		    proclwp, pidstr);
2147c478bd9Sstevel@tonic-gate 	else
2157c478bd9Sstevel@tonic-gate 		(void) printf(gettext("%s id %s: %d\n"), proclwp, pidstr, pset);
2167c478bd9Sstevel@tonic-gate }
2177c478bd9Sstevel@tonic-gate 
2187c478bd9Sstevel@tonic-gate /*
2197c478bd9Sstevel@tonic-gate  * Output for info.
2207c478bd9Sstevel@tonic-gate  */
2217c478bd9Sstevel@tonic-gate static void
info_out(psetid_t pset,int type,uint_t numcpus,processorid_t * cpus)2227c478bd9Sstevel@tonic-gate info_out(psetid_t pset, int type, uint_t numcpus, processorid_t *cpus)
2237c478bd9Sstevel@tonic-gate {
2247c478bd9Sstevel@tonic-gate 	int i;
2257c478bd9Sstevel@tonic-gate 	if (type == PS_SYSTEM)
2267c478bd9Sstevel@tonic-gate 		(void) printf(gettext("system processor set %d:"), pset);
2277c478bd9Sstevel@tonic-gate 	else
2287c478bd9Sstevel@tonic-gate 		(void) printf(gettext("user processor set %d:"), pset);
2297c478bd9Sstevel@tonic-gate 	if (numcpus == 0)
2307c478bd9Sstevel@tonic-gate 		(void) printf(gettext(" empty"));
2317c478bd9Sstevel@tonic-gate 	else if (numcpus > 1)
2327c478bd9Sstevel@tonic-gate 		(void) printf(gettext(" processors"));
2337c478bd9Sstevel@tonic-gate 	else
2347c478bd9Sstevel@tonic-gate 		(void) printf(gettext(" processor"));
2357c478bd9Sstevel@tonic-gate 	for (i = 0; i < numcpus; i++)
2367c478bd9Sstevel@tonic-gate 		(void) printf(" %d", cpus[i]);
2377c478bd9Sstevel@tonic-gate 	(void) printf("\n");
2387c478bd9Sstevel@tonic-gate }
2397c478bd9Sstevel@tonic-gate 
2407c478bd9Sstevel@tonic-gate /*
2417c478bd9Sstevel@tonic-gate  * Output for print.
2427c478bd9Sstevel@tonic-gate  */
2437c478bd9Sstevel@tonic-gate static void
print_out(processorid_t cpu,psetid_t pset)2447c478bd9Sstevel@tonic-gate print_out(processorid_t cpu, psetid_t pset)
2457c478bd9Sstevel@tonic-gate {
2467c478bd9Sstevel@tonic-gate 	if (pset == PS_NONE)
2477c478bd9Sstevel@tonic-gate 		(void) printf(gettext("processor %d: not assigned\n"), cpu);
2487c478bd9Sstevel@tonic-gate 	else
2497c478bd9Sstevel@tonic-gate 		(void) printf(gettext("processor %d: %d\n"), cpu, pset);
2507c478bd9Sstevel@tonic-gate }
2517c478bd9Sstevel@tonic-gate 
2527c478bd9Sstevel@tonic-gate /*
2537c478bd9Sstevel@tonic-gate  * Output for bind.
2547c478bd9Sstevel@tonic-gate  */
2557c478bd9Sstevel@tonic-gate static void
bind_out(id_t pid,id_t lwpid,psetid_t old,psetid_t new)2567c478bd9Sstevel@tonic-gate bind_out(id_t pid, id_t lwpid, psetid_t old, psetid_t new)
2577c478bd9Sstevel@tonic-gate {
2587c478bd9Sstevel@tonic-gate 	char *proclwp;
2597c478bd9Sstevel@tonic-gate 	char pidstr[21];
2607c478bd9Sstevel@tonic-gate 
2617c478bd9Sstevel@tonic-gate 	if (lwpid == -1) {
2627c478bd9Sstevel@tonic-gate 		(void) snprintf(pidstr, 20, "%d", pid);
2637c478bd9Sstevel@tonic-gate 		proclwp = "process";
2647c478bd9Sstevel@tonic-gate 	} else {
2657c478bd9Sstevel@tonic-gate 		(void) snprintf(pidstr, 20, "%d/%d", pid, lwpid);
2667c478bd9Sstevel@tonic-gate 		proclwp = "lwp";
2677c478bd9Sstevel@tonic-gate 	}
2687c478bd9Sstevel@tonic-gate 
2697c478bd9Sstevel@tonic-gate 	if (old == PS_NONE) {
2707c478bd9Sstevel@tonic-gate 		if (new == PS_NONE)
2717c478bd9Sstevel@tonic-gate 			(void) printf(gettext("%s id %s: was not bound, "
272fb9b0aa8SSurya Prakki 			    "now not bound\n"), proclwp, pidstr);
2737c478bd9Sstevel@tonic-gate 		else
2747c478bd9Sstevel@tonic-gate 			(void) printf(gettext("%s id %s: was not bound, "
275fb9b0aa8SSurya Prakki 			    "now %d\n"), proclwp, pidstr, new);
2767c478bd9Sstevel@tonic-gate 	} else {
2777c478bd9Sstevel@tonic-gate 		if (new == PS_NONE)
2787c478bd9Sstevel@tonic-gate 			(void) printf(gettext("%s id %s: was %d, "
279fb9b0aa8SSurya Prakki 			    "now not bound\n"), proclwp, pidstr, old);
2807c478bd9Sstevel@tonic-gate 		else
2817c478bd9Sstevel@tonic-gate 			(void) printf(gettext("%s id %s: was %d, "
282fb9b0aa8SSurya Prakki 			    "now %d\n"), proclwp, pidstr, old, new);
2837c478bd9Sstevel@tonic-gate 	}
2847c478bd9Sstevel@tonic-gate }
2857c478bd9Sstevel@tonic-gate 
2867c478bd9Sstevel@tonic-gate static void
bind_lwp(id_t pid,id_t lwpid,psetid_t pset)287fb9b0aa8SSurya Prakki bind_lwp(id_t pid, id_t lwpid, psetid_t pset)
2887c478bd9Sstevel@tonic-gate {
2897c478bd9Sstevel@tonic-gate 	psetid_t old_pset;
2907c478bd9Sstevel@tonic-gate 
291fb9b0aa8SSurya Prakki 	if (pset_bind_lwp(pset, lwpid, pid, &old_pset) != 0) {
292*0cc80adeSRobert Mustacchi 		bind_err(pset, NULL, pid, lwpid, errno);
2937c478bd9Sstevel@tonic-gate 		errors = ERR_FAIL;
294fb9b0aa8SSurya Prakki 	}
295fb9b0aa8SSurya Prakki 	if (errors != ERR_FAIL) {
2967c478bd9Sstevel@tonic-gate 		if (qflag)
2977c478bd9Sstevel@tonic-gate 			query_out(pid, lwpid, old_pset);
2987c478bd9Sstevel@tonic-gate 		else
2997c478bd9Sstevel@tonic-gate 			bind_out(pid, lwpid, old_pset, pset);
3007c478bd9Sstevel@tonic-gate 	}
3017c478bd9Sstevel@tonic-gate }
3027c478bd9Sstevel@tonic-gate 
3037c478bd9Sstevel@tonic-gate static int
do_cpu(psetid_t pset,processorid_t cpu,int print,int mustexist)3047c478bd9Sstevel@tonic-gate do_cpu(psetid_t pset, processorid_t cpu, int print, int mustexist)
3057c478bd9Sstevel@tonic-gate {
3067c478bd9Sstevel@tonic-gate 	psetid_t old_pset;
3077c478bd9Sstevel@tonic-gate 	int err;
3087c478bd9Sstevel@tonic-gate 
3097c478bd9Sstevel@tonic-gate 	if ((!Fflag && pset_assign(pset, cpu, &old_pset) != 0) ||
3107c478bd9Sstevel@tonic-gate 	    (Fflag && pset_assign_forced(pset, cpu, &old_pset) != 0)) {
3117c478bd9Sstevel@tonic-gate 		if (errno == EINVAL && !mustexist)
3127c478bd9Sstevel@tonic-gate 			return (EINVAL);
3137c478bd9Sstevel@tonic-gate 		err = errno;
3147c478bd9Sstevel@tonic-gate 
3157c478bd9Sstevel@tonic-gate 		switch (pset) {
3167c478bd9Sstevel@tonic-gate 		case PS_NONE:
3177c478bd9Sstevel@tonic-gate 			warn(gettext("cannot remove processor %d"), cpu);
3187c478bd9Sstevel@tonic-gate 			break;
3197c478bd9Sstevel@tonic-gate 		case PS_QUERY:
3207c478bd9Sstevel@tonic-gate 			warn(gettext("cannot query processor %d"), cpu);
3217c478bd9Sstevel@tonic-gate 			break;
3227c478bd9Sstevel@tonic-gate 		default:
3237c478bd9Sstevel@tonic-gate 			warn(gettext("cannot assign processor %d"), cpu);
3247c478bd9Sstevel@tonic-gate 			break;
3257c478bd9Sstevel@tonic-gate 		}
3267c478bd9Sstevel@tonic-gate 		return (err);
3277c478bd9Sstevel@tonic-gate 	}
3287c478bd9Sstevel@tonic-gate 	if (print)
3297c478bd9Sstevel@tonic-gate 		print_out(cpu, old_pset);
3307c478bd9Sstevel@tonic-gate 	else
3317c478bd9Sstevel@tonic-gate 		assign_out(cpu, old_pset, pset);
3327c478bd9Sstevel@tonic-gate 	return (0);
3337c478bd9Sstevel@tonic-gate }
3347c478bd9Sstevel@tonic-gate 
3357c478bd9Sstevel@tonic-gate static int
do_range(psetid_t pset,processorid_t first,processorid_t last,int print)3367c478bd9Sstevel@tonic-gate do_range(psetid_t pset, processorid_t first, processorid_t last, int print)
3377c478bd9Sstevel@tonic-gate {
3387c478bd9Sstevel@tonic-gate 	processorid_t cpu;
3397c478bd9Sstevel@tonic-gate 	int error = ERR_OK;
3407c478bd9Sstevel@tonic-gate 	int err;
3417c478bd9Sstevel@tonic-gate 	int found_one = 0;
3427c478bd9Sstevel@tonic-gate 
3437c478bd9Sstevel@tonic-gate 	for (cpu = first; cpu <= last; cpu++) {
3447c478bd9Sstevel@tonic-gate 		if ((err = do_cpu(pset, cpu, print, 0)) == 0)
3457c478bd9Sstevel@tonic-gate 			found_one = 1;
3467c478bd9Sstevel@tonic-gate 		else if (err != EINVAL)
3477c478bd9Sstevel@tonic-gate 			error = ERR_FAIL;
3487c478bd9Sstevel@tonic-gate 	}
3497c478bd9Sstevel@tonic-gate 	if (!found_one && error == ERR_OK) {
3507c478bd9Sstevel@tonic-gate 		warn(gettext("no processors in range %d-%d\n"), first, last);
3517c478bd9Sstevel@tonic-gate 		error = ERR_FAIL;
3527c478bd9Sstevel@tonic-gate 	}
3537c478bd9Sstevel@tonic-gate 	return (error);
3547c478bd9Sstevel@tonic-gate }
3557c478bd9Sstevel@tonic-gate 
3567c478bd9Sstevel@tonic-gate static int
do_info(psetid_t pset)3577c478bd9Sstevel@tonic-gate do_info(psetid_t pset)
3587c478bd9Sstevel@tonic-gate {
3597c478bd9Sstevel@tonic-gate 	int	type;
3607c478bd9Sstevel@tonic-gate 	uint_t	numcpus;
3617c478bd9Sstevel@tonic-gate 	processorid_t	*cpus;
3627c478bd9Sstevel@tonic-gate 
3637c478bd9Sstevel@tonic-gate 	numcpus = (uint_t)sysconf(_SC_NPROCESSORS_MAX);
3647c478bd9Sstevel@tonic-gate 	cpus = (processorid_t *)
3657c478bd9Sstevel@tonic-gate 	    malloc(numcpus * sizeof (processorid_t));
3667c478bd9Sstevel@tonic-gate 	if (cpus == NULL) {
3677c478bd9Sstevel@tonic-gate 		warn(gettext("memory allocation failed"));
3687c478bd9Sstevel@tonic-gate 		return (ERR_FAIL);
3697c478bd9Sstevel@tonic-gate 	}
3707c478bd9Sstevel@tonic-gate 	if (pset_info(pset, &type, &numcpus, cpus) != 0) {
3717c478bd9Sstevel@tonic-gate 		warn(gettext("cannot get info for processor set %d"), pset);
3727c478bd9Sstevel@tonic-gate 		free(cpus);
3737c478bd9Sstevel@tonic-gate 		return (ERR_FAIL);
3747c478bd9Sstevel@tonic-gate 	}
3757c478bd9Sstevel@tonic-gate 	info_out(pset, type, numcpus, cpus);
3767c478bd9Sstevel@tonic-gate 	free(cpus);
3777c478bd9Sstevel@tonic-gate 	return (ERR_OK);
3787c478bd9Sstevel@tonic-gate }
3797c478bd9Sstevel@tonic-gate 
3807c478bd9Sstevel@tonic-gate static int
do_destroy(psetid_t pset)3817c478bd9Sstevel@tonic-gate do_destroy(psetid_t pset)
3827c478bd9Sstevel@tonic-gate {
3837c478bd9Sstevel@tonic-gate 	if (pset_destroy(pset) != 0) {
3847c478bd9Sstevel@tonic-gate 		warn(gettext("could not remove processor set %d"), pset);
3857c478bd9Sstevel@tonic-gate 		return (ERR_FAIL);
3867c478bd9Sstevel@tonic-gate 	}
3877c478bd9Sstevel@tonic-gate 	(void) printf(gettext("removed processor set %d\n"), pset);
3887c478bd9Sstevel@tonic-gate 	return (ERR_OK);
3897c478bd9Sstevel@tonic-gate }
3907c478bd9Sstevel@tonic-gate 
3917c478bd9Sstevel@tonic-gate static int
do_intr(psetid_t pset,int flag)3927c478bd9Sstevel@tonic-gate do_intr(psetid_t pset, int flag)
3937c478bd9Sstevel@tonic-gate {
3947c478bd9Sstevel@tonic-gate 	uint_t i, numcpus;
3957c478bd9Sstevel@tonic-gate 	processorid_t *cpus;
3967c478bd9Sstevel@tonic-gate 	int error = ERR_OK;
3977c478bd9Sstevel@tonic-gate 
3987c478bd9Sstevel@tonic-gate 	numcpus = (uint_t)sysconf(_SC_NPROCESSORS_MAX);
3997c478bd9Sstevel@tonic-gate 	cpus = (processorid_t *)
4007c478bd9Sstevel@tonic-gate 	    malloc(numcpus * sizeof (processorid_t));
4017c478bd9Sstevel@tonic-gate 	if (cpus == NULL) {
4027c478bd9Sstevel@tonic-gate 		warn(gettext("memory allocation failed"));
4037c478bd9Sstevel@tonic-gate 		return (ERR_FAIL);
4047c478bd9Sstevel@tonic-gate 	}
4057c478bd9Sstevel@tonic-gate 	if (pset_info(pset, NULL, &numcpus, cpus) != 0) {
4067c478bd9Sstevel@tonic-gate 		warn(gettext(
4077c478bd9Sstevel@tonic-gate 		    "cannot set interrupt status for processor set %d"), pset);
4087c478bd9Sstevel@tonic-gate 		free(cpus);
4097c478bd9Sstevel@tonic-gate 		return (ERR_FAIL);
4107c478bd9Sstevel@tonic-gate 	}
4117c478bd9Sstevel@tonic-gate 	for (i = 0; i < numcpus; i++) {
4127c478bd9Sstevel@tonic-gate 		int status = p_online(cpus[i], P_STATUS);
4137c478bd9Sstevel@tonic-gate 		if (status != P_OFFLINE && status != P_POWEROFF &&
4147c478bd9Sstevel@tonic-gate 		    status != flag) {
4157c478bd9Sstevel@tonic-gate 			if (p_online(cpus[i], flag) == -1) {
4167c478bd9Sstevel@tonic-gate 				warn(gettext("processor %d"), cpus[i]);
4177c478bd9Sstevel@tonic-gate 				error = ERR_FAIL;
4187c478bd9Sstevel@tonic-gate 			}
4197c478bd9Sstevel@tonic-gate 		}
4207c478bd9Sstevel@tonic-gate 	}
4217c478bd9Sstevel@tonic-gate 	free(cpus);
4227c478bd9Sstevel@tonic-gate 	return (error);
4237c478bd9Sstevel@tonic-gate }
4247c478bd9Sstevel@tonic-gate 
4257c478bd9Sstevel@tonic-gate /*
4267c478bd9Sstevel@tonic-gate  * Query the type and CPUs for all active processor sets in the system.
4277c478bd9Sstevel@tonic-gate  */
4287c478bd9Sstevel@tonic-gate static int
info_all(void)4297c478bd9Sstevel@tonic-gate info_all(void)
4307c478bd9Sstevel@tonic-gate {
4317c478bd9Sstevel@tonic-gate 	psetid_t *psetlist;
4327c478bd9Sstevel@tonic-gate 	uint_t	npsets, oldnpsets;
4337c478bd9Sstevel@tonic-gate 	int	i;
4347c478bd9Sstevel@tonic-gate 	int	errors = ERR_OK;
4357c478bd9Sstevel@tonic-gate 
4367c478bd9Sstevel@tonic-gate 	if (pset_list(NULL, &npsets) != 0) {
4377c478bd9Sstevel@tonic-gate 		warn(gettext("cannot get number of processor sets"));
4387c478bd9Sstevel@tonic-gate 		return (1);
4397c478bd9Sstevel@tonic-gate 	}
4407c478bd9Sstevel@tonic-gate 	for (;;) {
4417c478bd9Sstevel@tonic-gate 		psetlist = malloc(sizeof (psetid_t) * npsets);
4427c478bd9Sstevel@tonic-gate 		if (psetlist == NULL) {
4437c478bd9Sstevel@tonic-gate 			warn(gettext("memory allocation failed"));
4447c478bd9Sstevel@tonic-gate 			return (ERR_FAIL);
4457c478bd9Sstevel@tonic-gate 		}
4467c478bd9Sstevel@tonic-gate 		oldnpsets = npsets;
4477c478bd9Sstevel@tonic-gate 		if (pset_list(psetlist, &npsets) != 0) {
4487c478bd9Sstevel@tonic-gate 			warn(gettext("cannot get list of processor sets"));
4497c478bd9Sstevel@tonic-gate 			free(psetlist);
4507c478bd9Sstevel@tonic-gate 			return (ERR_FAIL);
4517c478bd9Sstevel@tonic-gate 		}
4527c478bd9Sstevel@tonic-gate 		if (npsets <= oldnpsets)
4537c478bd9Sstevel@tonic-gate 			break;
4547c478bd9Sstevel@tonic-gate 		free(psetlist);
4557c478bd9Sstevel@tonic-gate 	}
4567c478bd9Sstevel@tonic-gate 
4577c478bd9Sstevel@tonic-gate 	for (i = 0; i < npsets; i++) {
4587c478bd9Sstevel@tonic-gate 		if (do_info(psetlist[i]))
4597c478bd9Sstevel@tonic-gate 			errors = ERR_FAIL;
4607c478bd9Sstevel@tonic-gate 	}
4617c478bd9Sstevel@tonic-gate 	free(psetlist);
4627c478bd9Sstevel@tonic-gate 	return (errors);
4637c478bd9Sstevel@tonic-gate }
4647c478bd9Sstevel@tonic-gate 
4657c478bd9Sstevel@tonic-gate /*
4667c478bd9Sstevel@tonic-gate  * Query the processor set assignments for all CPUs in the system.
4677c478bd9Sstevel@tonic-gate  */
4687c478bd9Sstevel@tonic-gate static int
print_all(void)4697c478bd9Sstevel@tonic-gate print_all(void)
4707c478bd9Sstevel@tonic-gate {
4717c478bd9Sstevel@tonic-gate 	psetid_t	pset;
4727c478bd9Sstevel@tonic-gate 	processorid_t cpuid, max_cpuid;
4737c478bd9Sstevel@tonic-gate 	int	errors = ERR_OK;
4747c478bd9Sstevel@tonic-gate 
4757c478bd9Sstevel@tonic-gate 	max_cpuid = (processorid_t)sysconf(_SC_CPUID_MAX);
4767c478bd9Sstevel@tonic-gate 	for (cpuid = 0; cpuid <= max_cpuid; cpuid++) {
4777c478bd9Sstevel@tonic-gate 		if (pset_assign(PS_QUERY, cpuid, &pset) == 0) {
4787c478bd9Sstevel@tonic-gate 			if (pset != PS_NONE)
4797c478bd9Sstevel@tonic-gate 				print_out(cpuid, pset);
4807c478bd9Sstevel@tonic-gate 		} else if (errno != EINVAL) {
4817c478bd9Sstevel@tonic-gate 			warn(gettext("cannot query processor %d"), cpuid);
4827c478bd9Sstevel@tonic-gate 			errors = ERR_FAIL;
4837c478bd9Sstevel@tonic-gate 		}
4847c478bd9Sstevel@tonic-gate 	}
4857c478bd9Sstevel@tonic-gate 	return (errors);
4867c478bd9Sstevel@tonic-gate }
4877c478bd9Sstevel@tonic-gate 
4887c478bd9Sstevel@tonic-gate /*ARGSUSED*/
4897c478bd9Sstevel@tonic-gate static int
query_all_proc(psinfo_t * psinfo,lwpsinfo_t * lwpsinfo,void * arg)4907c478bd9Sstevel@tonic-gate query_all_proc(psinfo_t *psinfo, lwpsinfo_t *lwpsinfo, void *arg)
4917c478bd9Sstevel@tonic-gate {
4927c478bd9Sstevel@tonic-gate 	id_t pid = psinfo->pr_pid;
4937c478bd9Sstevel@tonic-gate 	psetid_t binding;
4947c478bd9Sstevel@tonic-gate 
4957c478bd9Sstevel@tonic-gate 	if (pset_bind(PS_QUERY, P_PID, pid, &binding) < 0) {
4967c478bd9Sstevel@tonic-gate 		/*
4977c478bd9Sstevel@tonic-gate 		 * Ignore search errors.  The process may have exited
4987c478bd9Sstevel@tonic-gate 		 * since we read the directory.
4997c478bd9Sstevel@tonic-gate 		 */
5007c478bd9Sstevel@tonic-gate 		if (errno == ESRCH)
5017c478bd9Sstevel@tonic-gate 			return (0);
502*0cc80adeSRobert Mustacchi 		bind_err(PS_QUERY, NULL, pid, -1, errno);
5037c478bd9Sstevel@tonic-gate 		errors = ERR_FAIL;
5047c478bd9Sstevel@tonic-gate 		return (0);
5057c478bd9Sstevel@tonic-gate 	}
5067c478bd9Sstevel@tonic-gate 	if (binding != PS_NONE)
5077c478bd9Sstevel@tonic-gate 		query_out(pid, -1, binding);
5087c478bd9Sstevel@tonic-gate 	return (0);
5097c478bd9Sstevel@tonic-gate }
5107c478bd9Sstevel@tonic-gate 
5117c478bd9Sstevel@tonic-gate static int
query_all_lwp(psinfo_t * psinfo,lwpsinfo_t * lwpsinfo,void * arg)5127c478bd9Sstevel@tonic-gate query_all_lwp(psinfo_t *psinfo, lwpsinfo_t *lwpsinfo, void *arg)
5137c478bd9Sstevel@tonic-gate {
5147c478bd9Sstevel@tonic-gate 	id_t pid = psinfo->pr_pid;
5157c478bd9Sstevel@tonic-gate 	id_t lwpid = lwpsinfo->pr_lwpid;
5167c478bd9Sstevel@tonic-gate 	psetid_t *cpuid = arg;
5177c478bd9Sstevel@tonic-gate 	psetid_t binding = lwpsinfo->pr_bindpset;
5187c478bd9Sstevel@tonic-gate 
5197c478bd9Sstevel@tonic-gate 	if (psinfo->pr_nlwp == 1)
5207c478bd9Sstevel@tonic-gate 		lwpid = -1;	/* report process bindings if only 1 lwp */
5217c478bd9Sstevel@tonic-gate 	if ((cpuid != NULL && *cpuid == binding) ||
5227c478bd9Sstevel@tonic-gate 	    (cpuid == NULL && binding != PBIND_NONE))
5237c478bd9Sstevel@tonic-gate 		query_out(pid, lwpid, binding);
5247c478bd9Sstevel@tonic-gate 	return (0);
5257c478bd9Sstevel@tonic-gate }
5267c478bd9Sstevel@tonic-gate 
5277c478bd9Sstevel@tonic-gate void
exec_cmd(psetid_t pset,char ** argv)5287c478bd9Sstevel@tonic-gate exec_cmd(psetid_t pset, char **argv)
5297c478bd9Sstevel@tonic-gate {
5307c478bd9Sstevel@tonic-gate 	if (pset_bind(pset, P_PID, P_MYID, NULL) != 0) {
5317c478bd9Sstevel@tonic-gate 		warn(gettext("cannot exec in processor set %d"), pset);
5327c478bd9Sstevel@tonic-gate 		return;
5337c478bd9Sstevel@tonic-gate 	}
5347c478bd9Sstevel@tonic-gate 
5357c478bd9Sstevel@tonic-gate 	(void) execvp(argv[0], argv);
5367c478bd9Sstevel@tonic-gate 	warn(gettext("cannot exec command %s"), argv[0]);
5377c478bd9Sstevel@tonic-gate }
5387c478bd9Sstevel@tonic-gate 
5397c478bd9Sstevel@tonic-gate int
usage(void)5407c478bd9Sstevel@tonic-gate usage(void)
5417c478bd9Sstevel@tonic-gate {
5427c478bd9Sstevel@tonic-gate 	(void) fprintf(stderr, gettext(
543fb9b0aa8SSurya Prakki 	    "usage: \n"
544fb9b0aa8SSurya Prakki 	    "\t%1$s -c [-F] [processor_id ...]\n"
545fb9b0aa8SSurya Prakki 	    "\t%1$s -d processor_set_id ...\n"
546fb9b0aa8SSurya Prakki 	    "\t%1$s -n processor_set_id\n"
547fb9b0aa8SSurya Prakki 	    "\t%1$s -f processor_set_id\n"
548fb9b0aa8SSurya Prakki 	    "\t%1$s -e processor_set_id command [argument(s)...]\n"
549fb9b0aa8SSurya Prakki 	    "\t%1$s -a [-F] processor_set_id processor_id ...\n"
550fb9b0aa8SSurya Prakki 	    "\t%1$s -r [-F] processor_id ...\n"
551fb9b0aa8SSurya Prakki 	    "\t%1$s -p [processorid ...]\n"
552fb9b0aa8SSurya Prakki 	    "\t%1$s -b processor_set_id pid[/lwpids] ...\n"
553*0cc80adeSRobert Mustacchi 	    "\t%1$s -b -z zonename processor_set_id\n"
554fb9b0aa8SSurya Prakki 	    "\t%1$s -u pid[/lwpids] ...\n"
555fb9b0aa8SSurya Prakki 	    "\t%1$s -q [pid[/lwpids] ...]\n"
556fb9b0aa8SSurya Prakki 	    "\t%1$s -U [processor_set_id] ...\n"
557fb9b0aa8SSurya Prakki 	    "\t%1$s -Q [processor_set_id] ...\n"
558fb9b0aa8SSurya Prakki 	    "\t%1$s [-i] [processor_set_id ...]\n"),
559fb9b0aa8SSurya Prakki 	    progname);
5607c478bd9Sstevel@tonic-gate 	return (ERR_USAGE);
5617c478bd9Sstevel@tonic-gate }
5627c478bd9Sstevel@tonic-gate 
5637c478bd9Sstevel@tonic-gate /*
5647c478bd9Sstevel@tonic-gate  * Query, set, or clear bindings for the range of LWPs in the given process.
5657c478bd9Sstevel@tonic-gate  */
5667c478bd9Sstevel@tonic-gate static int
do_lwps(id_t pid,const char * range,psetid_t pset)5677c478bd9Sstevel@tonic-gate do_lwps(id_t pid, const char *range, psetid_t pset)
5687c478bd9Sstevel@tonic-gate {
5697c478bd9Sstevel@tonic-gate 	char procfile[MAX_PROCFS_PATH];
5707c478bd9Sstevel@tonic-gate 	struct ps_prochandle *Pr;
5717c478bd9Sstevel@tonic-gate 	struct prheader header;
5727c478bd9Sstevel@tonic-gate 	struct lwpsinfo *lwp;
5737c478bd9Sstevel@tonic-gate 	char *lpsinfo, *ptr;
5747c478bd9Sstevel@tonic-gate 	psetid_t binding;
5757c478bd9Sstevel@tonic-gate 	int nent, size;
5767c478bd9Sstevel@tonic-gate 	int i, fd, found;
5777c478bd9Sstevel@tonic-gate 
5787c478bd9Sstevel@tonic-gate 	/*
5797c478bd9Sstevel@tonic-gate 	 * Report bindings for LWPs in process 'pid'.
5807c478bd9Sstevel@tonic-gate 	 */
5817c478bd9Sstevel@tonic-gate 	(void) snprintf(procfile, MAX_PROCFS_PATH,
5827c478bd9Sstevel@tonic-gate 	    "/proc/%d/lpsinfo", (int)pid);
5837c478bd9Sstevel@tonic-gate 	if ((fd = open(procfile, O_RDONLY)) < 0) {
5847c478bd9Sstevel@tonic-gate 		if (errno == ENOENT)
5857c478bd9Sstevel@tonic-gate 			errno = ESRCH;
586*0cc80adeSRobert Mustacchi 		bind_err(pset, NULL, pid, -1, errno);
5877c478bd9Sstevel@tonic-gate 		return (ERR_FAIL);
5887c478bd9Sstevel@tonic-gate 	}
5897c478bd9Sstevel@tonic-gate 	if (pread(fd, &header, sizeof (header), 0) != sizeof (header)) {
5907c478bd9Sstevel@tonic-gate 		(void) close(fd);
591*0cc80adeSRobert Mustacchi 		bind_err(pset, NULL, pid, -1, errno);
5927c478bd9Sstevel@tonic-gate 		return (ERR_FAIL);
5937c478bd9Sstevel@tonic-gate 	}
5947c478bd9Sstevel@tonic-gate 	nent = header.pr_nent;
5957c478bd9Sstevel@tonic-gate 	size = header.pr_entsize * nent;
5967c478bd9Sstevel@tonic-gate 	ptr = lpsinfo = malloc(size);
5977c478bd9Sstevel@tonic-gate 	if (lpsinfo == NULL) {
598*0cc80adeSRobert Mustacchi 		bind_err(pset, NULL, pid, -1, errno);
5997c478bd9Sstevel@tonic-gate 		return (ERR_FAIL);
6007c478bd9Sstevel@tonic-gate 	}
6017c478bd9Sstevel@tonic-gate 	if (pread(fd, lpsinfo, size, sizeof (header)) != size) {
602*0cc80adeSRobert Mustacchi 		bind_err(pset, NULL, pid, -1, errno);
6037c478bd9Sstevel@tonic-gate 		free(lpsinfo);
6047c478bd9Sstevel@tonic-gate 		(void) close(fd);
6057c478bd9Sstevel@tonic-gate 		return (ERR_FAIL);
6067c478bd9Sstevel@tonic-gate 	}
6077c478bd9Sstevel@tonic-gate 
6087c478bd9Sstevel@tonic-gate 	if ((bflag || uflag) && (Pr = grab_proc(pid)) == NULL) {
6097c478bd9Sstevel@tonic-gate 		free(lpsinfo);
6107c478bd9Sstevel@tonic-gate 		(void) close(fd);
6117c478bd9Sstevel@tonic-gate 		return (ERR_FAIL);
6127c478bd9Sstevel@tonic-gate 	}
6137c478bd9Sstevel@tonic-gate 	found = 0;
6147c478bd9Sstevel@tonic-gate 	for (i = 0; i < nent; i++, ptr += header.pr_entsize) {
6157c478bd9Sstevel@tonic-gate 		/*LINTED ALIGNMENT*/
6167c478bd9Sstevel@tonic-gate 		lwp = (lwpsinfo_t *)ptr;
6177c478bd9Sstevel@tonic-gate 		binding = lwp->pr_bindpset;
6187c478bd9Sstevel@tonic-gate 		if (!proc_lwp_in_set(range, lwp->pr_lwpid))
6197c478bd9Sstevel@tonic-gate 			continue;
6207c478bd9Sstevel@tonic-gate 		found++;
6217c478bd9Sstevel@tonic-gate 		if (bflag || uflag)
622fb9b0aa8SSurya Prakki 			bind_lwp(pid, lwp->pr_lwpid, pset);
6237c478bd9Sstevel@tonic-gate 		else if (binding != PBIND_NONE)
6247c478bd9Sstevel@tonic-gate 			query_out(pid, lwp->pr_lwpid, binding);
6257c478bd9Sstevel@tonic-gate 	}
6267c478bd9Sstevel@tonic-gate 	if (bflag || uflag)
6277c478bd9Sstevel@tonic-gate 		rele_proc(Pr);
6287c478bd9Sstevel@tonic-gate 	free(lpsinfo);
6297c478bd9Sstevel@tonic-gate 	(void) close(fd);
6307c478bd9Sstevel@tonic-gate 	if (found == 0) {
6317c478bd9Sstevel@tonic-gate 		warn(gettext("cannot %s lwpid %d/%s: "
6327c478bd9Sstevel@tonic-gate 		    "No matching LWPs found\n"),
6337c478bd9Sstevel@tonic-gate 		    bflag ? "bind" : "query", pid, range);
6347c478bd9Sstevel@tonic-gate 		return (ERR_FAIL);
6357c478bd9Sstevel@tonic-gate 	}
6367c478bd9Sstevel@tonic-gate 	return (ERR_OK);
6377c478bd9Sstevel@tonic-gate }
6387c478bd9Sstevel@tonic-gate 
6397c478bd9Sstevel@tonic-gate int
main(int argc,char * argv[])6407c478bd9Sstevel@tonic-gate main(int argc, char *argv[])
6417c478bd9Sstevel@tonic-gate {
6427c478bd9Sstevel@tonic-gate 	extern int optind;
6437c478bd9Sstevel@tonic-gate 	int	c;
6447c478bd9Sstevel@tonic-gate 	id_t	pid;
6457c478bd9Sstevel@tonic-gate 	processorid_t	cpu;
6467c478bd9Sstevel@tonic-gate 	psetid_t	pset, old_pset;
647*0cc80adeSRobert Mustacchi 	zoneid_t	zid;
6487c478bd9Sstevel@tonic-gate 	char	*errptr;
6497c478bd9Sstevel@tonic-gate 
6507c478bd9Sstevel@tonic-gate 	progname = argv[0];	/* put actual command name in messages */
6517c478bd9Sstevel@tonic-gate 
6527c478bd9Sstevel@tonic-gate 	(void) setlocale(LC_ALL, "");	/* setup localization */
6537c478bd9Sstevel@tonic-gate 	(void) textdomain(TEXT_DOMAIN);
6547c478bd9Sstevel@tonic-gate 
655*0cc80adeSRobert Mustacchi 	while ((c = getopt(argc, argv, "cdFarpibqQuUnfez:")) != EOF) {
6567c478bd9Sstevel@tonic-gate 		switch (c) {
6577c478bd9Sstevel@tonic-gate 		case 'c':
6587c478bd9Sstevel@tonic-gate 			cflag = 1;
6597c478bd9Sstevel@tonic-gate 			break;
6607c478bd9Sstevel@tonic-gate 		case 'd':
6617c478bd9Sstevel@tonic-gate 			dflag = 1;
6627c478bd9Sstevel@tonic-gate 			break;
6637c478bd9Sstevel@tonic-gate 		case 'e':
6647c478bd9Sstevel@tonic-gate 			eflag = 1;
6657c478bd9Sstevel@tonic-gate 			break;
6667c478bd9Sstevel@tonic-gate 		case 'a':
6677c478bd9Sstevel@tonic-gate 			aflag = 1;
6687c478bd9Sstevel@tonic-gate 			break;
6697c478bd9Sstevel@tonic-gate 		case 'r':
6707c478bd9Sstevel@tonic-gate 			rflag = 1;
6717c478bd9Sstevel@tonic-gate 			pset = PS_NONE;
6727c478bd9Sstevel@tonic-gate 			break;
6737c478bd9Sstevel@tonic-gate 		case 'p':
6747c478bd9Sstevel@tonic-gate 			pflag = 1;
6757c478bd9Sstevel@tonic-gate 			pset = PS_QUERY;
6767c478bd9Sstevel@tonic-gate 			break;
6777c478bd9Sstevel@tonic-gate 		case 'i':
6787c478bd9Sstevel@tonic-gate 			iflag = 1;
6797c478bd9Sstevel@tonic-gate 			break;
6807c478bd9Sstevel@tonic-gate 		case 'b':
6817c478bd9Sstevel@tonic-gate 			bflag = 1;
6827c478bd9Sstevel@tonic-gate 			break;
6837c478bd9Sstevel@tonic-gate 		case 'u':
6847c478bd9Sstevel@tonic-gate 			uflag = 1;
6857c478bd9Sstevel@tonic-gate 			pset = PS_NONE;
6867c478bd9Sstevel@tonic-gate 			break;
6877c478bd9Sstevel@tonic-gate 		case 'U':
6887c478bd9Sstevel@tonic-gate 			Uflag = 1;
6897c478bd9Sstevel@tonic-gate 			break;
6907c478bd9Sstevel@tonic-gate 		case 'q':
6917c478bd9Sstevel@tonic-gate 			qflag = 1;
6927c478bd9Sstevel@tonic-gate 			pset = PS_QUERY;
6937c478bd9Sstevel@tonic-gate 			break;
6947c478bd9Sstevel@tonic-gate 		case 'Q':
6957c478bd9Sstevel@tonic-gate 			Qflag = 1;
6967c478bd9Sstevel@tonic-gate 			break;
6977c478bd9Sstevel@tonic-gate 		case 'f':
6987c478bd9Sstevel@tonic-gate 			fflag = 1;
6997c478bd9Sstevel@tonic-gate 			break;
7007c478bd9Sstevel@tonic-gate 		case 'F':
7017c478bd9Sstevel@tonic-gate 			Fflag = 1;
7027c478bd9Sstevel@tonic-gate 			break;
7037c478bd9Sstevel@tonic-gate 		case 'n':
7047c478bd9Sstevel@tonic-gate 			nflag = 1;
7057c478bd9Sstevel@tonic-gate 			break;
706*0cc80adeSRobert Mustacchi 		case 'z':
707*0cc80adeSRobert Mustacchi 			if (!bflag) {
708*0cc80adeSRobert Mustacchi 				warn(gettext("-z can only be used after -b\n"));
709*0cc80adeSRobert Mustacchi 				return (usage());
710*0cc80adeSRobert Mustacchi 			}
711*0cc80adeSRobert Mustacchi 			if (zflag) {
712*0cc80adeSRobert Mustacchi 				warn(gettext("-z can only be specified "
713*0cc80adeSRobert Mustacchi 				    "once\n"));
714*0cc80adeSRobert Mustacchi 				return (usage());
715*0cc80adeSRobert Mustacchi 			}
716*0cc80adeSRobert Mustacchi 			zflag = 1;
717*0cc80adeSRobert Mustacchi 			zname = optarg;
718*0cc80adeSRobert Mustacchi 			break;
7197c478bd9Sstevel@tonic-gate 		default:
7207c478bd9Sstevel@tonic-gate 			return (usage());
7217c478bd9Sstevel@tonic-gate 		}
7227c478bd9Sstevel@tonic-gate 	}
7237c478bd9Sstevel@tonic-gate 
7247c478bd9Sstevel@tonic-gate 	/*
7257c478bd9Sstevel@tonic-gate 	 * Make sure that at most one of the options was specified.
7267c478bd9Sstevel@tonic-gate 	 */
7277c478bd9Sstevel@tonic-gate 	c = cflag + dflag + aflag + rflag + pflag +
7287c478bd9Sstevel@tonic-gate 	    iflag + bflag + uflag + Uflag +
7297c478bd9Sstevel@tonic-gate 	    qflag + Qflag + fflag + nflag + eflag;
7307c478bd9Sstevel@tonic-gate 	if (c < 1) {				/* nothing specified */
7317c478bd9Sstevel@tonic-gate 		iflag = 1;			/* default is to get info */
7327c478bd9Sstevel@tonic-gate 	} else if (c > 1) {
7337c478bd9Sstevel@tonic-gate 		warn(gettext("options are mutually exclusive\n"));
7347c478bd9Sstevel@tonic-gate 		return (usage());
7357c478bd9Sstevel@tonic-gate 	}
7367c478bd9Sstevel@tonic-gate 
7377c478bd9Sstevel@tonic-gate 	if (Fflag && (cflag + aflag + rflag == 0))
7387c478bd9Sstevel@tonic-gate 		return (usage());
7397c478bd9Sstevel@tonic-gate 
7407c478bd9Sstevel@tonic-gate 	errors = 0;
7417c478bd9Sstevel@tonic-gate 	argc -= optind;
7427c478bd9Sstevel@tonic-gate 	argv += optind;
7437c478bd9Sstevel@tonic-gate 
7447c478bd9Sstevel@tonic-gate 	if (argc == 0) {
7457c478bd9Sstevel@tonic-gate 		/*
7467c478bd9Sstevel@tonic-gate 		 * Handle single option cases.
7477c478bd9Sstevel@tonic-gate 		 */
7487c478bd9Sstevel@tonic-gate 		if (qflag) {
7497c478bd9Sstevel@tonic-gate 			(void) proc_walk(query_all_proc, NULL, PR_WALK_PROC);
7507c478bd9Sstevel@tonic-gate 			return (errors);
7517c478bd9Sstevel@tonic-gate 		}
7527c478bd9Sstevel@tonic-gate 		if (Qflag) {
7537c478bd9Sstevel@tonic-gate 			(void) proc_walk(query_all_lwp, NULL, PR_WALK_LWP);
7547c478bd9Sstevel@tonic-gate 			return (errors);
7557c478bd9Sstevel@tonic-gate 		}
7567c478bd9Sstevel@tonic-gate 		if (Uflag) {
7577c478bd9Sstevel@tonic-gate 			if (pset_bind(PS_NONE, P_ALL, 0, &old_pset) != 0)
7587c478bd9Sstevel@tonic-gate 				die(gettext("failed to unbind all LWPs"));
7597c478bd9Sstevel@tonic-gate 		}
7607c478bd9Sstevel@tonic-gate 		if (pflag)
7617c478bd9Sstevel@tonic-gate 			return (print_all());
7627c478bd9Sstevel@tonic-gate 		if (iflag)
7637c478bd9Sstevel@tonic-gate 			return (info_all());
7647c478bd9Sstevel@tonic-gate 	}
7657c478bd9Sstevel@tonic-gate 
7667c478bd9Sstevel@tonic-gate 	/*
7677c478bd9Sstevel@tonic-gate 	 * Get processor set id.
7687c478bd9Sstevel@tonic-gate 	 */
7697c478bd9Sstevel@tonic-gate 	if (aflag || bflag || fflag || nflag || eflag) {
7707c478bd9Sstevel@tonic-gate 		if (argc < 1) {
7717c478bd9Sstevel@tonic-gate 			/* must specify processor set */
7727c478bd9Sstevel@tonic-gate 			warn(gettext("must specify processor set\n"));
7737c478bd9Sstevel@tonic-gate 			return (usage());
7747c478bd9Sstevel@tonic-gate 		}
7757c478bd9Sstevel@tonic-gate 		pset = strtol(*argv, &errptr, 10);
7767c478bd9Sstevel@tonic-gate 		if (errptr != NULL && *errptr != '\0' || pset < 0) {
7777c478bd9Sstevel@tonic-gate 			warn(gettext("invalid processor set ID %s\n"), *argv);
7787c478bd9Sstevel@tonic-gate 			return (ERR_FAIL);
7797c478bd9Sstevel@tonic-gate 		}
7807c478bd9Sstevel@tonic-gate 		argv++;
7817c478bd9Sstevel@tonic-gate 		argc--;
7827c478bd9Sstevel@tonic-gate 	}
7837c478bd9Sstevel@tonic-gate 
7847c478bd9Sstevel@tonic-gate 	if (cflag) {
7857c478bd9Sstevel@tonic-gate 		if (pset_create(&pset) != 0) {
7867c478bd9Sstevel@tonic-gate 			warn(gettext("could not create processor set"));
7877c478bd9Sstevel@tonic-gate 			return (ERR_FAIL);
7887c478bd9Sstevel@tonic-gate 		} else {
7897c478bd9Sstevel@tonic-gate 			create_out(pset);
7907c478bd9Sstevel@tonic-gate 			if (argc == 0)
7917c478bd9Sstevel@tonic-gate 				return (ERR_OK);
7927c478bd9Sstevel@tonic-gate 		}
7937c478bd9Sstevel@tonic-gate 	} else if (iflag || dflag) {
7947c478bd9Sstevel@tonic-gate 		if (argc == 0) {
7957c478bd9Sstevel@tonic-gate 			warn(gettext("must specify at least one "
7967c478bd9Sstevel@tonic-gate 			    "processor set\n"));
7977c478bd9Sstevel@tonic-gate 			return (usage());
7987c478bd9Sstevel@tonic-gate 		}
7997c478bd9Sstevel@tonic-gate 		/*
8007c478bd9Sstevel@tonic-gate 		 * Go through listed processor sets.
8017c478bd9Sstevel@tonic-gate 		 */
8027c478bd9Sstevel@tonic-gate 		for (; argc > 0; argv++, argc--) {
8037c478bd9Sstevel@tonic-gate 			pset = (psetid_t)strtol(*argv, &errptr, 10);
8047c478bd9Sstevel@tonic-gate 			if (errptr != NULL && *errptr != '\0') {
8057c478bd9Sstevel@tonic-gate 				warn(gettext("invalid processor set ID %s\n"),
8067c478bd9Sstevel@tonic-gate 				    *argv);
8077c478bd9Sstevel@tonic-gate 				errors = ERR_FAIL;
8087c478bd9Sstevel@tonic-gate 				continue;
8097c478bd9Sstevel@tonic-gate 			}
8107c478bd9Sstevel@tonic-gate 			if (iflag) {
8117c478bd9Sstevel@tonic-gate 				errors = do_info(pset);
8127c478bd9Sstevel@tonic-gate 			} else {
8137c478bd9Sstevel@tonic-gate 				errors = do_destroy(pset);
8147c478bd9Sstevel@tonic-gate 			}
8157c478bd9Sstevel@tonic-gate 		}
8167c478bd9Sstevel@tonic-gate 	} else if (nflag) {
8177c478bd9Sstevel@tonic-gate 		errors = do_intr(pset, P_ONLINE);
8187c478bd9Sstevel@tonic-gate 	} else if (fflag) {
8197c478bd9Sstevel@tonic-gate 		errors = do_intr(pset, P_NOINTR);
8207c478bd9Sstevel@tonic-gate 	} else if (eflag) {
8217c478bd9Sstevel@tonic-gate 		if (argc == 0) {
8227c478bd9Sstevel@tonic-gate 			warn(gettext("must specify command\n"));
8237c478bd9Sstevel@tonic-gate 			return (usage());
8247c478bd9Sstevel@tonic-gate 		}
8257c478bd9Sstevel@tonic-gate 		exec_cmd(pset, argv);
8267c478bd9Sstevel@tonic-gate 		/* if returning, must have had an error */
8277c478bd9Sstevel@tonic-gate 		return (ERR_USAGE);
8287c478bd9Sstevel@tonic-gate 	}
8297c478bd9Sstevel@tonic-gate 
8307c478bd9Sstevel@tonic-gate 	if (cflag || aflag || rflag || pflag) {
8317c478bd9Sstevel@tonic-gate 		/*
8327c478bd9Sstevel@tonic-gate 		 * Perform function for each processor specified.
8337c478bd9Sstevel@tonic-gate 		 */
8347c478bd9Sstevel@tonic-gate 		if (argc == 0) {
8357c478bd9Sstevel@tonic-gate 			warn(gettext("must specify at least one processor\n"));
8367c478bd9Sstevel@tonic-gate 			return (usage());
8377c478bd9Sstevel@tonic-gate 		}
8387c478bd9Sstevel@tonic-gate 
8397c478bd9Sstevel@tonic-gate 		/*
8407c478bd9Sstevel@tonic-gate 		 * Go through listed processors.
8417c478bd9Sstevel@tonic-gate 		 */
8427c478bd9Sstevel@tonic-gate 		for (; argc > 0; argv++, argc--) {
8437c478bd9Sstevel@tonic-gate 			if (strchr(*argv, '-') == NULL) {
8447c478bd9Sstevel@tonic-gate 				/* individual processor id */
8457c478bd9Sstevel@tonic-gate 				cpu = (processorid_t)strtol(*argv, &errptr, 10);
8467c478bd9Sstevel@tonic-gate 				if (errptr != NULL && *errptr != '\0') {
8477c478bd9Sstevel@tonic-gate 					warn(gettext("invalid processor "
8487c478bd9Sstevel@tonic-gate 					    "ID %s\n"), *argv);
8497c478bd9Sstevel@tonic-gate 					errors = ERR_FAIL;
8507c478bd9Sstevel@tonic-gate 					continue;
8517c478bd9Sstevel@tonic-gate 				}
8527c478bd9Sstevel@tonic-gate 				if (do_cpu(pset, cpu, pflag, 1))
8537c478bd9Sstevel@tonic-gate 					errors = ERR_FAIL;
8547c478bd9Sstevel@tonic-gate 			} else {
8557c478bd9Sstevel@tonic-gate 				/* range of processors */
8567c478bd9Sstevel@tonic-gate 				processorid_t first, last;
8577c478bd9Sstevel@tonic-gate 
8587c478bd9Sstevel@tonic-gate 				first = (processorid_t)
8597c478bd9Sstevel@tonic-gate 				    strtol(*argv, &errptr, 10);
8607c478bd9Sstevel@tonic-gate 				if (*errptr++ != '-') {
8617c478bd9Sstevel@tonic-gate 					warn(gettext(
8627c478bd9Sstevel@tonic-gate 					    "invalid processor range %s\n"),
8637c478bd9Sstevel@tonic-gate 					    *argv);
8647c478bd9Sstevel@tonic-gate 					errors = ERR_USAGE;
8657c478bd9Sstevel@tonic-gate 					continue;
8667c478bd9Sstevel@tonic-gate 				}
8677c478bd9Sstevel@tonic-gate 				last = (processorid_t)
8687c478bd9Sstevel@tonic-gate 				    strtol(errptr, &errptr, 10);
8697c478bd9Sstevel@tonic-gate 				if ((errptr != NULL && *errptr != '\0') ||
8707c478bd9Sstevel@tonic-gate 				    last < first || first < 0) {
8717c478bd9Sstevel@tonic-gate 					warn(gettext(
8727c478bd9Sstevel@tonic-gate 					    "invalid processor range %s\n"),
8737c478bd9Sstevel@tonic-gate 					    *argv);
8747c478bd9Sstevel@tonic-gate 					errors = ERR_USAGE;
8757c478bd9Sstevel@tonic-gate 					continue;
8767c478bd9Sstevel@tonic-gate 				}
8777c478bd9Sstevel@tonic-gate 				if (do_range(pset, first, last, pflag))
8787c478bd9Sstevel@tonic-gate 					errors = ERR_FAIL;
8797c478bd9Sstevel@tonic-gate 			}
8807c478bd9Sstevel@tonic-gate 		}
8817c478bd9Sstevel@tonic-gate 	} else if (bflag || uflag || qflag) {
8827c478bd9Sstevel@tonic-gate 		/*
8837c478bd9Sstevel@tonic-gate 		 * Perform function for each pid/lwpid specified.
8847c478bd9Sstevel@tonic-gate 		 */
885*0cc80adeSRobert Mustacchi 		if (argc == 0 && !zflag) {
8867c478bd9Sstevel@tonic-gate 			warn(gettext("must specify at least one pid\n"));
8877c478bd9Sstevel@tonic-gate 			return (usage());
888*0cc80adeSRobert Mustacchi 		} else if (argc > 0 && zflag) {
889*0cc80adeSRobert Mustacchi 			warn(gettext("cannot specify extra pids with -z\n"));
890*0cc80adeSRobert Mustacchi 			return (usage());
891*0cc80adeSRobert Mustacchi 		}
892*0cc80adeSRobert Mustacchi 
893*0cc80adeSRobert Mustacchi 		if (zflag) {
894*0cc80adeSRobert Mustacchi 			zid = getzoneidbyname(zname);
895*0cc80adeSRobert Mustacchi 			if (zid < 0) {
896*0cc80adeSRobert Mustacchi 				warn(gettext("invalid zone name: %s\n"),
897*0cc80adeSRobert Mustacchi 				    zname);
898*0cc80adeSRobert Mustacchi 				errors = ERR_FAIL;
899*0cc80adeSRobert Mustacchi 			} else if (pset_bind(pset, P_ZONEID, zid,
900*0cc80adeSRobert Mustacchi 			    &old_pset) < 0) {
901*0cc80adeSRobert Mustacchi 				bind_err(pset, zname, -1, -1, errno);
902*0cc80adeSRobert Mustacchi 				errors = ERR_FAIL;
903*0cc80adeSRobert Mustacchi 			} else {
904*0cc80adeSRobert Mustacchi 				(void) printf(gettext("zone %s: bound to %d\n"),
905*0cc80adeSRobert Mustacchi 				    zname, pset);
906*0cc80adeSRobert Mustacchi 			}
9077c478bd9Sstevel@tonic-gate 		}
9087c478bd9Sstevel@tonic-gate 
9097c478bd9Sstevel@tonic-gate 		/*
9107c478bd9Sstevel@tonic-gate 		 * Go through listed processes/lwp_ranges.
9117c478bd9Sstevel@tonic-gate 		 */
9127c478bd9Sstevel@tonic-gate 		for (; argc > 0; argv++, argc--) {
9137c478bd9Sstevel@tonic-gate 			pid = (id_t)strtol(*argv, &errptr, 10);
9147c478bd9Sstevel@tonic-gate 			if (errno != 0 ||
9157c478bd9Sstevel@tonic-gate 			    (errptr != NULL && *errptr != '\0' &&
916fb9b0aa8SSurya Prakki 			    *errptr != '/')) {
9177c478bd9Sstevel@tonic-gate 				warn(gettext("invalid process ID: %s\n"),
9187c478bd9Sstevel@tonic-gate 				    *argv);
9197c478bd9Sstevel@tonic-gate 				continue;
9207c478bd9Sstevel@tonic-gate 			}
9217c478bd9Sstevel@tonic-gate 			if (errptr != NULL && *errptr == '/') {
9227c478bd9Sstevel@tonic-gate 				int ret;
9237c478bd9Sstevel@tonic-gate 				/*
9247c478bd9Sstevel@tonic-gate 				 * Handle lwp range case
9257c478bd9Sstevel@tonic-gate 				 */
9267c478bd9Sstevel@tonic-gate 				const char *lwps = (const char *)(++errptr);
9277c478bd9Sstevel@tonic-gate 				if (*lwps == '\0' ||
9287c478bd9Sstevel@tonic-gate 				    proc_lwp_range_valid(lwps) != 0) {
9297c478bd9Sstevel@tonic-gate 					warn(gettext("invalid lwp range "
9307c478bd9Sstevel@tonic-gate 					    "for pid %d\n"), (int)pid);
9317c478bd9Sstevel@tonic-gate 					errors = ERR_FAIL;
9327c478bd9Sstevel@tonic-gate 					continue;
9337c478bd9Sstevel@tonic-gate 				}
9347c478bd9Sstevel@tonic-gate 				if (!qflag)
9357c478bd9Sstevel@tonic-gate 					(void) proc_initstdio();
9367c478bd9Sstevel@tonic-gate 				ret = do_lwps(pid, lwps, pset);
9377c478bd9Sstevel@tonic-gate 				if (!qflag)
9387c478bd9Sstevel@tonic-gate 					(void) proc_finistdio();
9397c478bd9Sstevel@tonic-gate 				if (ret != ERR_OK)
9407c478bd9Sstevel@tonic-gate 					errors = ret;
9417c478bd9Sstevel@tonic-gate 			} else {
9427c478bd9Sstevel@tonic-gate 				/*
9437c478bd9Sstevel@tonic-gate 				 * Handle whole process case.
9447c478bd9Sstevel@tonic-gate 				 */
9457c478bd9Sstevel@tonic-gate 				if (pset_bind(pset, P_PID, pid,
9467c478bd9Sstevel@tonic-gate 				    &old_pset) < 0) {
947*0cc80adeSRobert Mustacchi 					bind_err(pset, NULL, pid, -1, errno);
9487c478bd9Sstevel@tonic-gate 					errors = ERR_FAIL;
9497c478bd9Sstevel@tonic-gate 					continue;
9507c478bd9Sstevel@tonic-gate 				}
9517c478bd9Sstevel@tonic-gate 				if (qflag)
9527c478bd9Sstevel@tonic-gate 					query_out(pid, -1, old_pset);
9537c478bd9Sstevel@tonic-gate 				else
9547c478bd9Sstevel@tonic-gate 					bind_out(pid, -1, old_pset, pset);
9557c478bd9Sstevel@tonic-gate 			}
9567c478bd9Sstevel@tonic-gate 		}
9577c478bd9Sstevel@tonic-gate 	}
9587c478bd9Sstevel@tonic-gate 
9597c478bd9Sstevel@tonic-gate 	if (Qflag || Uflag) {
9607c478bd9Sstevel@tonic-gate 		/*
9617c478bd9Sstevel@tonic-gate 		 * Go through listed processor set IDs.
9627c478bd9Sstevel@tonic-gate 		 */
9637c478bd9Sstevel@tonic-gate 		for (; argc > 0; argv++, argc--) {
9647c478bd9Sstevel@tonic-gate 			errno = 0;
9657c478bd9Sstevel@tonic-gate 			pset = (id_t)strtol(*argv, &errptr, 10);
9667c478bd9Sstevel@tonic-gate 			if (errno != 0 ||
9677c478bd9Sstevel@tonic-gate 			    (errptr != NULL && *errptr != '\0')) {
9687c478bd9Sstevel@tonic-gate 				warn(gettext("invalid processor set ID\n"));
9697c478bd9Sstevel@tonic-gate 				continue;
9707c478bd9Sstevel@tonic-gate 			}
9717c478bd9Sstevel@tonic-gate 			if (Qflag) {
9727c478bd9Sstevel@tonic-gate 				(void) proc_walk(query_all_lwp,
9737c478bd9Sstevel@tonic-gate 				    &pset, PR_WALK_LWP);
9747c478bd9Sstevel@tonic-gate 				continue;
9757c478bd9Sstevel@tonic-gate 			}
9767c478bd9Sstevel@tonic-gate 			if (Uflag) {
9777c478bd9Sstevel@tonic-gate 				if (pset_bind(PS_NONE, P_PSETID, pset,
9787c478bd9Sstevel@tonic-gate 				    &old_pset) != 0) {
9797c478bd9Sstevel@tonic-gate 					warn(gettext("failed to unbind from "
9807c478bd9Sstevel@tonic-gate 					    "processor set %d"), (int)pset);
9817c478bd9Sstevel@tonic-gate 					errors = ERR_FAIL;
9827c478bd9Sstevel@tonic-gate 				}
9837c478bd9Sstevel@tonic-gate 				continue;
9847c478bd9Sstevel@tonic-gate 			}
9857c478bd9Sstevel@tonic-gate 		}
9867c478bd9Sstevel@tonic-gate 	}
9877c478bd9Sstevel@tonic-gate 
9887c478bd9Sstevel@tonic-gate 	return (errors);
9897c478bd9Sstevel@tonic-gate }
990