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
525cf1a30Sjl  * Common Development and Distribution License (the "License").
625cf1a30Sjl  * 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 /*
225f149bcaScy  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
237c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
24*c3377ee9SJohn Levon  *
25*c3377ee9SJohn Levon  * Copyright 2019 Joyent, Inc.
267c478bd9Sstevel@tonic-gate  */
277c478bd9Sstevel@tonic-gate 
287c478bd9Sstevel@tonic-gate #include <cma.h>
297c478bd9Sstevel@tonic-gate 
307c478bd9Sstevel@tonic-gate #include <fcntl.h>
317c478bd9Sstevel@tonic-gate #include <unistd.h>
327c478bd9Sstevel@tonic-gate #include <strings.h>
337c478bd9Sstevel@tonic-gate #include <errno.h>
347c478bd9Sstevel@tonic-gate #include <time.h>
357c478bd9Sstevel@tonic-gate #include <fm/fmd_api.h>
36e4b86885SCheng Sean Ye #include <fm/fmd_agent.h>
377c478bd9Sstevel@tonic-gate #include <sys/fm/protocol.h>
387c478bd9Sstevel@tonic-gate #include <sys/bl.h>
397c478bd9Sstevel@tonic-gate #include <sys/processor.h>
407c478bd9Sstevel@tonic-gate 
413f1e69beSCheng Sean Ye static int cpu_statechange(fmd_hdl_t *, nvlist_t *, nvlist_t *, const char *,
423f1e69beSCheng Sean Ye     uint32_t, boolean_t);
43e4b86885SCheng Sean Ye 
443f1e69beSCheng Sean Ye #ifndef opl
45e4b86885SCheng Sean Ye /*
463f1e69beSCheng Sean Ye  * Perform retire/unretire by invoking the topo methods registered in the
473f1e69beSCheng Sean Ye  * hc-scheme resource.
483f1e69beSCheng Sean Ye  *
493f1e69beSCheng Sean Ye  * If the fault is found to be diagnosed under the old topology, the resource
503f1e69beSCheng Sean Ye  * will not exist in the current topology, then we fall back to legacy retire
513f1e69beSCheng Sean Ye  * (using the "cpu" scheme ASRU).
52e4b86885SCheng Sean Ye  */
533f1e69beSCheng Sean Ye 
54e4b86885SCheng Sean Ye static boolean_t
old_topo_fault(nvlist_t * nvl)55e4b86885SCheng Sean Ye old_topo_fault(nvlist_t *nvl)
56e4b86885SCheng Sean Ye {
573f1e69beSCheng Sean Ye 	nvlist_t *rsrc;
583f1e69beSCheng Sean Ye #ifdef i386
593f1e69beSCheng Sean Ye 	nvlist_t **hcl;
60e4b86885SCheng Sean Ye 	uint_t nhcl = 0;
61e4b86885SCheng Sean Ye 	char *name;
623f1e69beSCheng Sean Ye #endif
63e4b86885SCheng Sean Ye 
643f1e69beSCheng Sean Ye 	if (nvlist_lookup_nvlist(nvl, FM_FAULT_RESOURCE, &rsrc) != 0)
653f1e69beSCheng Sean Ye 		return (B_TRUE);
663f1e69beSCheng Sean Ye #ifdef i386
673f1e69beSCheng Sean Ye 	/*
683f1e69beSCheng Sean Ye 	 * x86 has moved from "motherboard/chip/cpu" topo to
693f1e69beSCheng Sean Ye 	 * "motherboard/chip/core/strand"
703f1e69beSCheng Sean Ye 	 */
713f1e69beSCheng Sean Ye 	if (nvlist_lookup_nvlist_array(rsrc, FM_FMRI_HC_LIST, &hcl, &nhcl)
72e4b86885SCheng Sean Ye 	    == 0 && nhcl == 3 &&
73e4b86885SCheng Sean Ye 	    nvlist_lookup_string(hcl[0], FM_FMRI_HC_NAME, &name) == 0 &&
74e4b86885SCheng Sean Ye 	    strcmp(name, "motherboard") == 0 &&
75e4b86885SCheng Sean Ye 	    nvlist_lookup_string(hcl[1], FM_FMRI_HC_NAME, &name) == 0 &&
76e4b86885SCheng Sean Ye 	    strcmp(name, "chip") == 0 &&
77e4b86885SCheng Sean Ye 	    nvlist_lookup_string(hcl[2], FM_FMRI_HC_NAME, &name) == 0 &&
78e4b86885SCheng Sean Ye 	    strcmp(name, "cpu") == 0)
793f1e69beSCheng Sean Ye 		return (B_TRUE);
803f1e69beSCheng Sean Ye #endif
81e4b86885SCheng Sean Ye 
823f1e69beSCheng Sean Ye 	return (B_FALSE);
83e4b86885SCheng Sean Ye }
84e4b86885SCheng Sean Ye 
85e4b86885SCheng Sean Ye /* ARGSUSED */
86e4b86885SCheng Sean Ye int
cma_cpu_hc_retire(fmd_hdl_t * hdl,nvlist_t * nvl,nvlist_t * asru,const char * uuid,boolean_t repair)87e4b86885SCheng Sean Ye cma_cpu_hc_retire(fmd_hdl_t *hdl, nvlist_t *nvl, nvlist_t *asru,
88e4b86885SCheng Sean Ye     const char *uuid, boolean_t repair)
89e4b86885SCheng Sean Ye {
903f1e69beSCheng Sean Ye 	int i, err;
91e4b86885SCheng Sean Ye 	int rc = CMA_RA_SUCCESS;
92e4b86885SCheng Sean Ye 	nvlist_t *rsrc;
93e4b86885SCheng Sean Ye 
94e4b86885SCheng Sean Ye 	/*
95e4b86885SCheng Sean Ye 	 * For the cached faults which were diagnosed under the old
963f1e69beSCheng Sean Ye 	 * topology,  we fall back to retire by using cpu-scheme ASRUs.
973f1e69beSCheng Sean Ye 	 * Under xVM Dom0, since logic cpuid in "cpu" scheme ASRU makes no
983f1e69beSCheng Sean Ye 	 * sense, the fault should be ignored.
99e4b86885SCheng Sean Ye 	 */
100e4b86885SCheng Sean Ye 	if (old_topo_fault(nvl)) {
1013f1e69beSCheng Sean Ye #ifdef i386
1023f1e69beSCheng Sean Ye 		if (! cma_is_native)
1033f1e69beSCheng Sean Ye 			return (CMA_RA_FAILURE);
1043f1e69beSCheng Sean Ye #endif
1053f1e69beSCheng Sean Ye 		return (cma_cpu_cpu_retire(hdl, nvl, asru, uuid, repair));
106e4b86885SCheng Sean Ye 	}
107e4b86885SCheng Sean Ye 
108e4b86885SCheng Sean Ye 	/*
109e4b86885SCheng Sean Ye 	 * Lookup the resource and call its topo methods to do retire/unretire
110e4b86885SCheng Sean Ye 	 */
111e4b86885SCheng Sean Ye 	if ((! repair && ! cma.cma_cpu_dooffline) ||
112e4b86885SCheng Sean Ye 	    (repair && ! cma.cma_cpu_doonline)) {
113e4b86885SCheng Sean Ye 		fmd_hdl_debug(hdl, "suppressed %s of CPU\n",
114e4b86885SCheng Sean Ye 		    repair ? "unretire" : "retire");
115e4b86885SCheng Sean Ye 		cma_stats.cpu_supp.fmds_value.ui64++;
116e4b86885SCheng Sean Ye 	} else {
117e4b86885SCheng Sean Ye 		err = FMD_AGENT_RETIRE_FAIL;
118e4b86885SCheng Sean Ye 		if (nvlist_lookup_nvlist(nvl, FM_FAULT_RESOURCE, &rsrc) == 0) {
1193f1e69beSCheng Sean Ye 			if (repair) {
1203f1e69beSCheng Sean Ye 				err = fmd_nvl_fmri_unretire(hdl, rsrc);
1213f1e69beSCheng Sean Ye 			} else {
1223f1e69beSCheng Sean Ye 				for (i = 0; i < cma.cma_cpu_tries; i++) {
1233f1e69beSCheng Sean Ye 					err = fmd_nvl_fmri_retire(hdl, rsrc);
1243f1e69beSCheng Sean Ye 					if (err == FMD_AGENT_RETIRE_DONE)
1253f1e69beSCheng Sean Ye 						break;
1263f1e69beSCheng Sean Ye 					(void) nanosleep(&cma.cma_cpu_delay,
1273f1e69beSCheng Sean Ye 					    NULL);
1283f1e69beSCheng Sean Ye 				}
1293f1e69beSCheng Sean Ye 			}
130e4b86885SCheng Sean Ye 		}
131e4b86885SCheng Sean Ye 		if (err == FMD_AGENT_RETIRE_DONE) {
132e4b86885SCheng Sean Ye 			if (repair)
133e4b86885SCheng Sean Ye 				cma_stats.cpu_repairs.fmds_value.ui64++;
134e4b86885SCheng Sean Ye 			else
135e4b86885SCheng Sean Ye 				cma_stats.cpu_flts.fmds_value.ui64++;
136e4b86885SCheng Sean Ye 		} else {
137e4b86885SCheng Sean Ye 			rc = CMA_RA_FAILURE;
138e4b86885SCheng Sean Ye 			cma_stats.bad_flts.fmds_value.ui64++;
1393f1e69beSCheng Sean Ye #ifdef sun4v
1403f1e69beSCheng Sean Ye 			/* libldom requests are processed asynchronously */
1413f1e69beSCheng Sean Ye 			cma_cpu_start_retry(hdl, nvl, uuid, repair);
1423f1e69beSCheng Sean Ye #endif
143e4b86885SCheng Sean Ye 		}
144e4b86885SCheng Sean Ye 	}
145e4b86885SCheng Sean Ye 
146e4b86885SCheng Sean Ye 	if ((! repair && ! cma.cma_cpu_doblacklist) ||
147e4b86885SCheng Sean Ye 	    (repair && ! cma.cma_cpu_dounblacklist)) {
148e4b86885SCheng Sean Ye 		fmd_hdl_debug(hdl, "suppressed %s of CPU\n",
149e4b86885SCheng Sean Ye 		    repair ? "unblacklist" : "blacklist");
150e4b86885SCheng Sean Ye 		cma_stats.cpu_blsupp.fmds_value.ui64++;
151e4b86885SCheng Sean Ye 	} else {
152e4b86885SCheng Sean Ye 		if (cma_cpu_blacklist(hdl, nvl, asru, repair) < 0)
153e4b86885SCheng Sean Ye 			cma_stats.cpu_blfails.fmds_value.ui64++;
154e4b86885SCheng Sean Ye 	}
155e4b86885SCheng Sean Ye 
156e4b86885SCheng Sean Ye 	return (rc);
157e4b86885SCheng Sean Ye }
1583f1e69beSCheng Sean Ye 
1593f1e69beSCheng Sean Ye #else /* opl */
1603f1e69beSCheng Sean Ye 
1613f1e69beSCheng Sean Ye /* ARGSUSED 4 */
1623f1e69beSCheng Sean Ye int
cma_cpu_hc_retire(fmd_hdl_t * hdl,nvlist_t * nvl,nvlist_t * asru,const char * uuid,boolean_t repair)1633f1e69beSCheng Sean Ye cma_cpu_hc_retire(fmd_hdl_t *hdl, nvlist_t *nvl, nvlist_t *asru,
1643f1e69beSCheng Sean Ye     const char *uuid, boolean_t repair)
1653f1e69beSCheng Sean Ye {
1663f1e69beSCheng Sean Ye 	uint_t cpuid;
1673f1e69beSCheng Sean Ye 	uint_t i, nprs;
1683f1e69beSCheng Sean Ye 	nvlist_t **hc_prs = NULL, *hc_spec_nvl;
1693f1e69beSCheng Sean Ye 
1703f1e69beSCheng Sean Ye 	/* OPL has ASRU in "hc" scheme */
1713f1e69beSCheng Sean Ye 	if (nvlist_lookup_nvlist(asru, FM_FMRI_HC_SPECIFIC,
1723f1e69beSCheng Sean Ye 	    &hc_spec_nvl) != 0) {
1733f1e69beSCheng Sean Ye 		cma_stats.bad_flts.fmds_value.ui64++;
1743f1e69beSCheng Sean Ye 		fmd_hdl_debug(hdl,
1753f1e69beSCheng Sean Ye 		    "cma_cpu_hc_retire lookup hc_spec_nvl failed\n");
1763f1e69beSCheng Sean Ye 		return (CMA_RA_FAILURE);
1773f1e69beSCheng Sean Ye 	}
1783f1e69beSCheng Sean Ye 
1793f1e69beSCheng Sean Ye 	if (nvlist_lookup_nvlist_array(hc_spec_nvl, FM_FMRI_HC_CPUIDS,
1803f1e69beSCheng Sean Ye 	    &hc_prs, &nprs) != 0) {
1813f1e69beSCheng Sean Ye 		cma_stats.bad_flts.fmds_value.ui64++;
1823f1e69beSCheng Sean Ye 		fmd_hdl_debug(hdl,
1833f1e69beSCheng Sean Ye 		    "cma_cpu_hc_retire lookup cpuid array failed\n");
1843f1e69beSCheng Sean Ye 		return (CMA_RA_FAILURE);
1853f1e69beSCheng Sean Ye 	}
1863f1e69beSCheng Sean Ye 
1873f1e69beSCheng Sean Ye 	for (i = 0; i < nprs; i++) {
1883f1e69beSCheng Sean Ye 		if (nvlist_lookup_uint32(hc_prs[i],
1893f1e69beSCheng Sean Ye 		    FM_FMRI_CPU_ID, &cpuid) != 0) {
1903f1e69beSCheng Sean Ye 			cma_stats.bad_flts.fmds_value.ui64++;
1913f1e69beSCheng Sean Ye 			return (CMA_RA_FAILURE);
1923f1e69beSCheng Sean Ye 		}
1933f1e69beSCheng Sean Ye 
1943f1e69beSCheng Sean Ye 		if (cpu_statechange(hdl, nvl, hc_prs[i], uuid, cpuid, repair)
1953f1e69beSCheng Sean Ye 		    != CMA_RA_SUCCESS) {
1963f1e69beSCheng Sean Ye 			cma_stats.bad_flts.fmds_value.ui64++;
1973f1e69beSCheng Sean Ye 			return (CMA_RA_FAILURE);
1983f1e69beSCheng Sean Ye 		}
1993f1e69beSCheng Sean Ye 	}
2003f1e69beSCheng Sean Ye 
2013f1e69beSCheng Sean Ye 	return (CMA_RA_SUCCESS);
2023f1e69beSCheng Sean Ye }
2033f1e69beSCheng Sean Ye #endif /* opl */
2043f1e69beSCheng Sean Ye 
2053f1e69beSCheng Sean Ye /*
2063f1e69beSCheng Sean Ye  * The rest of this file uses ASRUs to do retire, this is now not the
2073f1e69beSCheng Sean Ye  * preferable way, but it's still needed for some circumstances when
2083f1e69beSCheng Sean Ye  * retire via topo methods can't work, ie.
2093f1e69beSCheng Sean Ye  *
2103f1e69beSCheng Sean Ye  * 1) There are legacy platforms which don't have full topology.
2113f1e69beSCheng Sean Ye  * 2) The resources in the FMD cached faults may not be set or exist in the
2123f1e69beSCheng Sean Ye  *    up-to-dated topology.
2133f1e69beSCheng Sean Ye  */
214e4b86885SCheng Sean Ye 
2155f149bcaScy /* ARGSUSED */
2167c478bd9Sstevel@tonic-gate static int
cpu_online(fmd_hdl_t * hdl,nvlist_t * nvl,nvlist_t * asru,const char * uuid,uint32_t cpuid)2175f149bcaScy cpu_online(fmd_hdl_t *hdl, nvlist_t *nvl, nvlist_t *asru, const char *uuid,
2185f149bcaScy     uint32_t cpuid)
2197c478bd9Sstevel@tonic-gate {
2205f149bcaScy 	int err = CMA_RA_SUCCESS;
2217c478bd9Sstevel@tonic-gate 
2225f149bcaScy 	if (cma.cma_cpu_doonline) {
2235f149bcaScy 		err = cma_cpu_statechange(hdl, asru, uuid, P_ONLINE,
2245f149bcaScy 		    B_TRUE);
2255f149bcaScy 	} else {
2265f149bcaScy 		fmd_hdl_debug(hdl, "suppressed online of CPU %u\n",
2275f149bcaScy 		    cpuid);
2285f149bcaScy 		cma_stats.cpu_supp.fmds_value.ui64++;
2297c478bd9Sstevel@tonic-gate 	}
2307c478bd9Sstevel@tonic-gate 
2315f149bcaScy 	/* OPL performs the blacklist in the service processor */
2325f149bcaScy #ifndef opl
2335f149bcaScy 	if (cma.cma_cpu_dounblacklist) {
2345f149bcaScy 		if (cma_cpu_blacklist(hdl, nvl, asru, B_TRUE) < 0)
2355f149bcaScy 			cma_stats.cpu_blfails.fmds_value.ui64++;
2365f149bcaScy 	} else {
2375f149bcaScy 		fmd_hdl_debug(hdl, "suppressed unblacklist of CPU %u\n", cpuid);
2385f149bcaScy 		cma_stats.cpu_blsupp.fmds_value.ui64++;
2397c478bd9Sstevel@tonic-gate 	}
2405f149bcaScy #endif /* opl */
2417c478bd9Sstevel@tonic-gate 
2425f149bcaScy 	return (err);
2435f149bcaScy }
2447c478bd9Sstevel@tonic-gate 
2455f149bcaScy /* ARGSUSED */
2465f149bcaScy static int
cpu_offline(fmd_hdl_t * hdl,nvlist_t * nvl,nvlist_t * asru,const char * uuid,uint32_t cpuid)2475f149bcaScy cpu_offline(fmd_hdl_t *hdl, nvlist_t *nvl, nvlist_t *asru, const char *uuid,
2485f149bcaScy     uint32_t cpuid)
2495f149bcaScy {
2505f149bcaScy 	int err = CMA_RA_FAILURE;
2517c478bd9Sstevel@tonic-gate 
2525f149bcaScy 	if (cma.cma_cpu_dooffline) {
2535f149bcaScy 		int cpustate = P_FAULTED;
2547c478bd9Sstevel@tonic-gate 
2555f149bcaScy 		if (cma.cma_cpu_forcedoffline)
2565f149bcaScy 			cpustate |= P_FORCED;
2575f149bcaScy 		err = cma_cpu_statechange(hdl, asru, uuid, cpustate,
2585f149bcaScy 		    B_FALSE);
2595f149bcaScy 	} else {
2605f149bcaScy 		fmd_hdl_debug(hdl, "suppressed offline of CPU %u\n",
2615f149bcaScy 		    cpuid);
2625f149bcaScy 		cma_stats.cpu_supp.fmds_value.ui64++;
2635f149bcaScy 	}
2647c478bd9Sstevel@tonic-gate 
2655f149bcaScy 	/* OPL performs the blacklist in the service processor */
2665f149bcaScy #ifndef opl
2675f149bcaScy 	if (cma.cma_cpu_doblacklist) {
2685f149bcaScy 		if (cma_cpu_blacklist(hdl, nvl, asru, B_FALSE) < 0)
2695f149bcaScy 			cma_stats.cpu_blfails.fmds_value.ui64++;
2705f149bcaScy 	} else {
2715f149bcaScy 		fmd_hdl_debug(hdl, "suppressed blacklist of CPU %u\n",
2725f149bcaScy 		    cpuid);
2735f149bcaScy 		cma_stats.cpu_blsupp.fmds_value.ui64++;
2747c478bd9Sstevel@tonic-gate 	}
2755f149bcaScy #endif /* opl */
2767c478bd9Sstevel@tonic-gate 
2775f149bcaScy 	return (err);
2787c478bd9Sstevel@tonic-gate }
2797c478bd9Sstevel@tonic-gate 
2805f149bcaScy static int
cpu_statechange(fmd_hdl_t * hdl,nvlist_t * nvl,nvlist_t * asru,const char * uuid,uint32_t cpuid,boolean_t repair)2815f149bcaScy cpu_statechange(fmd_hdl_t *hdl, nvlist_t *nvl, nvlist_t *asru, const char *uuid,
2825f149bcaScy     uint32_t cpuid, boolean_t repair)
2837c478bd9Sstevel@tonic-gate {
2845f149bcaScy 	if (repair)
2855f149bcaScy 		return (cpu_online(hdl, nvl, asru, uuid, cpuid));
2865f149bcaScy 	else
2875f149bcaScy 		return (cpu_offline(hdl, nvl, asru, uuid, cpuid));
2885f149bcaScy }
2897c478bd9Sstevel@tonic-gate 
2905f149bcaScy const char *
p_online_state_fmt(int state)2915f149bcaScy p_online_state_fmt(int state)
2925f149bcaScy {
2935f149bcaScy 	state &= ~P_FORCED;
2945f149bcaScy 	switch (state) {
2955f149bcaScy 	case P_OFFLINE:
2965f149bcaScy 		return (PS_OFFLINE);
2975f149bcaScy 	case P_ONLINE:
2985f149bcaScy 		return (PS_ONLINE);
2995f149bcaScy 	case P_FAULTED:
3005f149bcaScy 		return (PS_FAULTED);
3015f149bcaScy 	case P_POWEROFF:
3025f149bcaScy 		return (PS_POWEROFF);
3035f149bcaScy 	case P_NOINTR:
3045f149bcaScy 		return (PS_NOINTR);
3055f149bcaScy 	case P_SPARE:
3065f149bcaScy 		return (PS_SPARE);
307*c3377ee9SJohn Levon 	case P_DISABLED:
308*c3377ee9SJohn Levon 		return (PS_DISABLED);
3095f149bcaScy 	default:
3105f149bcaScy 		return ("unknown");
3115f149bcaScy 	}
3127c478bd9Sstevel@tonic-gate }
3137c478bd9Sstevel@tonic-gate 
31425cf1a30Sjl int
cma_cpu_cpu_retire(fmd_hdl_t * hdl,nvlist_t * nvl,nvlist_t * asru,const char * uuid,boolean_t repair)3153f1e69beSCheng Sean Ye cma_cpu_cpu_retire(fmd_hdl_t *hdl, nvlist_t *nvl, nvlist_t *asru,
3163f1e69beSCheng Sean Ye     const char *uuid, boolean_t repair)
3177c478bd9Sstevel@tonic-gate {
3185f149bcaScy 	uint_t cpuid;
3196dfee483Stsien 
3207c478bd9Sstevel@tonic-gate 	if (nvlist_lookup_uint32(asru, FM_FMRI_CPU_ID, &cpuid) != 0) {
3217c478bd9Sstevel@tonic-gate 		fmd_hdl_debug(hdl, "cpu fault missing '%s'\n", FM_FMRI_CPU_ID);
3227c478bd9Sstevel@tonic-gate 		cma_stats.bad_flts.fmds_value.ui64++;
32325cf1a30Sjl 		return (CMA_RA_FAILURE);
3247c478bd9Sstevel@tonic-gate 	}
3257c478bd9Sstevel@tonic-gate 
3265f149bcaScy 	return (cpu_statechange(hdl, nvl, asru, uuid, cpuid, repair));
3275f149bcaScy }
328