usr/src/lib/fm/topo/libtopo/common/topo_fmri.c
author cindi
Tue, 06 Feb 2007 16:54:41 -0800
changeset 3605 16b1da2c7b52
parent 3323 3cff27a475a5
child 3666 4c0bd30907d2
permissions -rw-r--r--
6520901 repeated fmd cores with ereport.cpu.SPARC64-VI.cre injected
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
     1
/*
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
     2
 * CDDL HEADER START
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
     3
 *
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
     7
 *
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    11
 * and limitations under the License.
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    12
 *
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    18
 *
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    19
 * CDDL HEADER END
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    20
 */
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    21
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    22
/*
3605
16b1da2c7b52 6520901 repeated fmd cores with ereport.cpu.SPARC64-VI.cre injected
cindi
parents: 3323
diff changeset
    23
 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    24
 * Use is subject to license terms.
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    25
 */
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    26
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    27
#pragma ident	"%Z%%M%	%I%	%E% SMI"
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    28
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    29
#include <string.h>
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    30
#include <limits.h>
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    31
#include <fm/topo_mod.h>
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    32
#include <sys/fm/protocol.h>
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    33
#include <topo_alloc.h>
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    34
#include <topo_error.h>
3062
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
    35
#include <topo_method.h>
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    36
#include <topo_subr.h>
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    37
#include <topo_string.h>
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    38
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    39
/*ARGSUSED*/
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    40
static int
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    41
set_error(topo_hdl_t *thp, int err, int *errp, char *method, nvlist_t *nvlp)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    42
{
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    43
	if (nvlp != NULL)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    44
		nvlist_free(nvlp);
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    45
3062
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
    46
	topo_dprintf(thp, TOPO_DBG_ERR, "%s failed: %s\n", method,
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    47
	    topo_strerror(err));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    48
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    49
	*errp = err;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    50
	return (-1);
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    51
}
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    52
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    53
/*ARGSUSED*/
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    54
static nvlist_t *
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    55
set_nverror(topo_hdl_t *thp, int err, int *errp, char *method, nvlist_t *nvlp)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    56
{
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    57
	if (nvlp != NULL)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    58
		nvlist_free(nvlp);
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    59
3062
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
    60
	topo_dprintf(thp, TOPO_DBG_ERR, "%s failed: %s\n", method,
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    61
	    topo_strerror(err));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    62
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    63
	*errp = err;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    64
	return (NULL);
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    65
}
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    66
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    67
int
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    68
topo_fmri_nvl2str(topo_hdl_t *thp, nvlist_t *fmri, char **fmristr, int *err)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    69
{
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    70
	char *scheme, *str;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    71
	nvlist_t *out = NULL;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    72
	tnode_t *rnode;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    73
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    74
	if (nvlist_lookup_string(fmri, FM_FMRI_SCHEME, &scheme) != 0)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    75
		return (set_error(thp, ETOPO_FMRI_MALFORM, err,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    76
		    TOPO_METH_NVL2STR, out));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    77
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    78
	if ((rnode = topo_hdl_root(thp, scheme)) == NULL)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    79
		return (set_error(thp, ETOPO_METHOD_NOTSUP, err,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    80
		    TOPO_METH_NVL2STR, out));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    81
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    82
	if (topo_method_invoke(rnode, TOPO_METH_NVL2STR,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    83
	    TOPO_METH_NVL2STR_VERSION, fmri, &out, err) != 0)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    84
		return (set_error(thp, *err, err, TOPO_METH_NVL2STR, out));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    85
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    86
	if (out == NULL || nvlist_lookup_string(out, "fmri-string", &str) != 0)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    87
		return (set_error(thp, ETOPO_METHOD_INVAL, err,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    88
		    TOPO_METH_NVL2STR, out));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    89
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    90
	if ((*fmristr = topo_hdl_strdup(thp, str)) == NULL)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    91
		return (set_error(thp, ETOPO_NOMEM, err,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    92
		    TOPO_METH_NVL2STR, out));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    93
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    94
	nvlist_free(out);
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    95
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    96
	return (0);
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    97
}
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    98
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
    99
int
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   100
topo_fmri_str2nvl(topo_hdl_t *thp, const char *fmristr, nvlist_t **fmri,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   101
    int *err)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   102
{
3062
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   103
	char *f, buf[PATH_MAX];
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   104
	nvlist_t *out = NULL, *in = NULL;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   105
	tnode_t *rnode;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   106
3062
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   107
	(void) strlcpy(buf, fmristr, sizeof (buf));
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   108
	if ((f = strchr(buf, ':')) == NULL)
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   109
		return (set_error(thp, ETOPO_FMRI_MALFORM, err,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   110
		    TOPO_METH_STR2NVL, in));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   111
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   112
	*f = '\0'; /* strip trailing FMRI path */
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   113
3062
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   114
	if ((rnode = topo_hdl_root(thp, buf)) == NULL)
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   115
		return (set_error(thp, ETOPO_METHOD_NOTSUP, err,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   116
		    TOPO_METH_STR2NVL, in));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   117
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   118
	if (topo_hdl_nvalloc(thp, &in, NV_UNIQUE_NAME) != 0)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   119
		return (set_error(thp, ETOPO_FMRI_NVL, err, TOPO_METH_STR2NVL,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   120
		    in));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   121
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   122
	if (nvlist_add_string(in, "fmri-string", fmristr) != 0)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   123
		return (set_error(thp, ETOPO_FMRI_NVL, err, TOPO_METH_STR2NVL,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   124
		    in));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   125
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   126
	if (topo_method_invoke(rnode, TOPO_METH_STR2NVL,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   127
	    TOPO_METH_STR2NVL_VERSION, in, &out, err) != 0)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   128
		return (set_error(thp, *err, err, TOPO_METH_STR2NVL, in));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   129
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   130
	if (out == NULL ||
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   131
	    topo_hdl_nvdup(thp, out, fmri) != 0)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   132
		return (set_error(thp, ETOPO_FMRI_NVL, err,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   133
		    TOPO_METH_STR2NVL, in));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   134
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   135
	nvlist_free(out);
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   136
	nvlist_free(in);
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   137
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   138
	return (0);
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   139
}
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   140
3062
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   141
/* ARGSUSED */
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   142
static int
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   143
is_present(topo_hdl_t *thp, tnode_t *node, void *data)
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   144
{
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   145
	int err;
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   146
	uint32_t present = 0;
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   147
	nvlist_t *out = NULL;
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   148
	nvlist_t *fmri = (nvlist_t *)data;
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   149
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   150
	if (topo_method_invoke(node, TOPO_METH_PRESENT,
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   151
	    TOPO_METH_PRESENT_VERSION, fmri, &out, &err) < 0) {
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   152
		if (out != NULL)
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   153
			nvlist_free(out);
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   154
		return (present);
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   155
	}
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   156
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   157
	(void) nvlist_lookup_uint32(out, TOPO_METH_PRESENT_RET, &present);
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   158
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   159
	nvlist_free(out);
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   160
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   161
	return (present);
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   162
}
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   163
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   164
int
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   165
topo_fmri_present(topo_hdl_t *thp, nvlist_t *fmri, int *err)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   166
{
3062
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   167
	int ret = 0;
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   168
	uint32_t present = 0;
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   169
	char *scheme;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   170
	nvlist_t *out = NULL;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   171
	tnode_t *rnode;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   172
3062
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   173
	if (topo_fmri_invoke(thp, fmri, is_present, fmri, &ret) == 0)
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   174
		return (ret);
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   175
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   176
	if (nvlist_lookup_string(fmri, FM_FMRI_SCHEME, &scheme) != 0)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   177
		return (set_error(thp, ETOPO_FMRI_MALFORM, err,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   178
		    TOPO_METH_PRESENT, out));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   179
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   180
	if ((rnode = topo_hdl_root(thp, scheme)) == NULL)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   181
		return (set_error(thp, ETOPO_METHOD_NOTSUP, err,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   182
		    TOPO_METH_PRESENT, out));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   183
3062
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   184
	if (topo_method_invoke(rnode, TOPO_METH_PRESENT,
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   185
	    TOPO_METH_PRESENT_VERSION, fmri, &out, err) < 0) {
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   186
		(void) set_error(thp, *err, err, TOPO_METH_PRESENT, out);
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   187
		return (present);
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   188
	}
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   189
3062
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   190
	(void) nvlist_lookup_uint32(out, TOPO_METH_PRESENT_RET, &present);
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   191
	nvlist_free(out);
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   192
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   193
	return (present);
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   194
}
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   195
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   196
int
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   197
topo_fmri_contains(topo_hdl_t *thp, nvlist_t *fmri, nvlist_t *subfmri, int *err)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   198
{
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   199
	int rc;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   200
	char *scheme;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   201
	nvlist_t *in, *out = NULL;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   202
	tnode_t *rnode;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   203
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   204
	if (nvlist_lookup_string(fmri, FM_FMRI_SCHEME, &scheme) != 0)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   205
		return (set_error(thp, ETOPO_FMRI_MALFORM, err,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   206
		    TOPO_METH_CONTAINS, out));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   207
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   208
	if ((rnode = topo_hdl_root(thp, scheme)) == NULL)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   209
		return (set_error(thp, ETOPO_METHOD_NOTSUP, err,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   210
		    TOPO_METH_CONTAINS, out));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   211
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   212
	if (topo_hdl_nvalloc(thp, &in, NV_UNIQUE_NAME) != 0)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   213
		return (set_error(thp, ETOPO_FMRI_NVL, err, TOPO_METH_CONTAINS,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   214
		    out));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   215
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   216
	if (nvlist_add_nvlist(in, "fmri", fmri) != 0 ||
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   217
	    nvlist_add_nvlist(in, "subfmri", subfmri) != 0)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   218
		return (set_error(thp, ETOPO_FMRI_NVL, err, TOPO_METH_CONTAINS,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   219
		    out));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   220
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   221
	if (topo_hdl_nvalloc(thp, &out, NV_UNIQUE_NAME) != 0)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   222
		return (set_error(thp, ETOPO_FMRI_NVL, err, TOPO_METH_CONTAINS,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   223
		    out));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   224
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   225
	if ((rc = topo_method_invoke(rnode, TOPO_METH_CONTAINS,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   226
	    TOPO_METH_CONTAINS_VERSION, fmri, &out, err)) < 0)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   227
		return (set_error(thp, *err, err, TOPO_METH_CONTAINS, out));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   228
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   229
	return (rc);
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   230
}
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   231
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   232
int
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   233
topo_fmri_unusable(topo_hdl_t *thp, nvlist_t *fmri, int *err)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   234
{
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   235
	int rc;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   236
	char *scheme;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   237
	nvlist_t *out = NULL;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   238
	tnode_t *rnode;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   239
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   240
	if (nvlist_lookup_string(fmri, FM_FMRI_SCHEME, &scheme) != 0)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   241
		return (set_error(thp, ETOPO_FMRI_MALFORM, err,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   242
		    TOPO_METH_UNUSABLE, out));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   243
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   244
	if ((rnode = topo_hdl_root(thp, scheme)) == NULL)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   245
		return (set_error(thp, ETOPO_METHOD_NOTSUP, err,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   246
		    TOPO_METH_UNUSABLE, out));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   247
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   248
	if ((rc = topo_method_invoke(rnode, TOPO_METH_UNUSABLE,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   249
	    TOPO_METH_UNUSABLE_VERSION, fmri, &out, err)) < 0)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   250
		return (set_error(thp, *err, err, TOPO_METH_UNUSABLE, out));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   251
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   252
	return (rc);
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   253
}
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   254
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   255
int
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   256
topo_fmri_expand(topo_hdl_t *thp, nvlist_t *fmri, int *err)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   257
{
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   258
	char *scheme;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   259
	nvlist_t *out = NULL;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   260
	tnode_t *rnode;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   261
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   262
	if (nvlist_lookup_string(fmri, FM_FMRI_SCHEME, &scheme) != 0)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   263
		return (set_error(thp, ETOPO_FMRI_MALFORM, err,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   264
		    TOPO_METH_EXPAND, out));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   265
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   266
	if ((rnode = topo_hdl_root(thp, scheme)) == NULL)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   267
		return (set_error(thp, ETOPO_METHOD_NOTSUP, err,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   268
		    TOPO_METH_EXPAND, out));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   269
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   270
	if (topo_method_invoke(rnode, TOPO_METH_EXPAND,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   271
	    TOPO_METH_EXPAND_VERSION, fmri, &out, err) != 0)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   272
		return (set_error(thp, *err, err, TOPO_METH_EXPAND, out));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   273
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   274
	return (0);
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   275
}
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   276
3323
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   277
struct prop_lookup {
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   278
	int pl_err;
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   279
	topo_type_t pl_type;
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   280
	const char *pl_group;
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   281
	const char *pl_name;
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   282
	nvlist_t **pl_prop;
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   283
	nvlist_t *pl_resource;
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   284
};
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   285
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   286
static int
3323
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   287
prop_lookup(topo_hdl_t *thp, tnode_t *node, void *pdata)
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   288
{
3323
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   289
	int rc;
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   290
	nvlist_t *r1;
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   291
	struct prop_lookup *plp = (struct prop_lookup *)pdata;
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   292
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   293
	if (topo_node_resource(node, &r1, &plp->pl_err) != 0)
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   294
		return (TOPO_WALK_ERR);
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   295
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   296
	rc = topo_fmri_compare(thp, r1, plp->pl_resource, &plp->pl_err);
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   297
	nvlist_free(r1);
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   298
	if (rc == 0)
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   299
		return (TOPO_WALK_NEXT);
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   300
	if (rc < 0)
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   301
		return (TOPO_WALK_ERR);
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   302
3323
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   303
	/*
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   304
	 * Special case for dynamically created ASRU and FRU
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   305
	 */
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   306
	if (strcmp(plp->pl_group, TOPO_PGROUP_PROTOCOL) == 0) {
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   307
		if (strcmp(plp->pl_name, TOPO_PROP_ASRU) == 0) {
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   308
			if (topo_node_asru(node, plp->pl_prop, plp->pl_resource,
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   309
			    &plp->pl_err) < 0) {
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   310
				return (TOPO_WALK_ERR);
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   311
			}
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   312
			return (0);
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   313
		} else if (strcmp(plp->pl_name, TOPO_PROP_FRU) == 0) {
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   314
			if (topo_node_fru(node, plp->pl_prop, plp->pl_resource,
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   315
			    &plp->pl_err) < 0) {
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   316
				return (TOPO_WALK_ERR);
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   317
			}
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   318
			return (0);
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   319
		}
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   320
	}
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   321
3323
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   322
	switch (plp->pl_type) {
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   323
		case TOPO_TYPE_STRING:
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   324
		{
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   325
			char *str;
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   326
			if (topo_prop_get_string(node, plp->pl_group,
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   327
			    plp->pl_name, &str, &plp->pl_err) < 0)
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   328
				return (TOPO_WALK_ERR);
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   329
3323
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   330
			if (nvlist_add_string(*plp->pl_prop, "prop", str)
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   331
			    != 0) {
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   332
				topo_hdl_strfree(thp, str);
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   333
				plp->pl_err = ETOPO_PROP_NVL;
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   334
				return (TOPO_WALK_ERR);
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   335
			}
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   336
			topo_hdl_strfree(thp, str);
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   337
			return (TOPO_WALK_TERMINATE);
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   338
		}
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   339
		default:
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   340
			plp->pl_err = ETOPO_PROP_TYPE;
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   341
			return (TOPO_WALK_ERR);
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   342
	}
3323
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   343
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   344
}
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   345
3323
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   346
static int
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   347
fmri_prop(topo_hdl_t *thp, nvlist_t *resource, const char *pgname,
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   348
    const char *pname, topo_type_t type, nvlist_t **prop, int *err)
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   349
{
3323
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   350
	int rc;
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   351
	topo_walk_t *wp;
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   352
	char *scheme;
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   353
	struct prop_lookup pl;
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   354
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   355
	if (nvlist_lookup_string(resource, FM_FMRI_SCHEME, &scheme)   != 0)
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   356
		return (set_error(thp, ETOPO_METHOD_INVAL, err,
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   357
		    "fmri_prop", NULL));
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   358
3605
16b1da2c7b52 6520901 repeated fmd cores with ereport.cpu.SPARC64-VI.cre injected
cindi
parents: 3323
diff changeset
   359
	*prop = NULL;
3323
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   360
	pl.pl_resource = resource;
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   361
	pl.pl_err = 0;
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   362
	pl.pl_type = type;
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   363
	pl.pl_group = pgname;
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   364
	pl.pl_name = pname;
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   365
	pl.pl_prop = prop;
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   366
	if ((wp = topo_walk_init(thp, scheme, prop_lookup, &pl, err)) == NULL)
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   367
		return (set_error(thp, pl.pl_err, err, "fmri_prop", NULL));
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   368
3323
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   369
	rc = topo_walk_step(wp, TOPO_WALK_CHILD);
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   370
	topo_walk_fini(wp);
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   371
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   372
	if (rc == TOPO_WALK_ERR) {
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   373
		return (set_error(thp, pl.pl_err, err, "fmri_prop", NULL));
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   374
	}
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   375
3605
16b1da2c7b52 6520901 repeated fmd cores with ereport.cpu.SPARC64-VI.cre injected
cindi
parents: 3323
diff changeset
   376
	/*
16b1da2c7b52 6520901 repeated fmd cores with ereport.cpu.SPARC64-VI.cre injected
cindi
parents: 3323
diff changeset
   377
	 * Walk terminated without finding resource or property
16b1da2c7b52 6520901 repeated fmd cores with ereport.cpu.SPARC64-VI.cre injected
cindi
parents: 3323
diff changeset
   378
	 */
16b1da2c7b52 6520901 repeated fmd cores with ereport.cpu.SPARC64-VI.cre injected
cindi
parents: 3323
diff changeset
   379
	if (*prop == NULL)
16b1da2c7b52 6520901 repeated fmd cores with ereport.cpu.SPARC64-VI.cre injected
cindi
parents: 3323
diff changeset
   380
		return (set_error(thp, ETOPO_PROP_NOENT, err, "fmri_prop",
16b1da2c7b52 6520901 repeated fmd cores with ereport.cpu.SPARC64-VI.cre injected
cindi
parents: 3323
diff changeset
   381
		    NULL));
16b1da2c7b52 6520901 repeated fmd cores with ereport.cpu.SPARC64-VI.cre injected
cindi
parents: 3323
diff changeset
   382
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   383
	return (0);
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   384
}
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   385
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   386
int
3323
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   387
topo_fmri_asru(topo_hdl_t *thp, nvlist_t *nvl, nvlist_t **asru, int *err)
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   388
{
3605
16b1da2c7b52 6520901 repeated fmd cores with ereport.cpu.SPARC64-VI.cre injected
cindi
parents: 3323
diff changeset
   389
3323
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   390
	if (fmri_prop(thp, nvl, TOPO_PGROUP_PROTOCOL, TOPO_PROP_ASRU,
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   391
	    TOPO_TYPE_FMRI, asru, err) < 0)
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   392
		return (set_error(thp, *err, err, "topo_fmri_asru", NULL));
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   393
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   394
	return (0);
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   395
}
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   396
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   397
int
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   398
topo_fmri_fru(topo_hdl_t *thp, nvlist_t *nvl, nvlist_t **fru, int *err)
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   399
{
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   400
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   401
	if (fmri_prop(thp, nvl, TOPO_PGROUP_PROTOCOL, TOPO_PROP_FRU,
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   402
	    TOPO_TYPE_FMRI, fru, err) < 0)
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   403
		return (set_error(thp, *err, err, "topo_fmri_fru", NULL));
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   404
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   405
	return (0);
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   406
}
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   407
3323
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   408
int
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   409
topo_fmri_label(topo_hdl_t *thp, nvlist_t *fmri, char **label, int *err)
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   410
{
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   411
	nvlist_t *nvl, *fru;
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   412
	char *str;
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   413
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   414
	if (topo_fmri_fru(thp, fmri, &fru, err) < 0)
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   415
		return (set_error(thp, *err, err, "topo_fmri_label", NULL));
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   416
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   417
	if (topo_hdl_nvalloc(thp, &nvl, NV_UNIQUE_NAME) < 0)
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   418
		return (set_error(thp, ETOPO_PROP_NVL, err, "topo_fmri_label",
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   419
		    NULL));
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   420
3323
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   421
	if (fmri_prop(thp, fru, TOPO_PGROUP_PROTOCOL, TOPO_PROP_LABEL,
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   422
	    TOPO_TYPE_STRING, &nvl, err) < 0) {
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   423
		nvlist_free(fru);
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   424
		return (set_error(thp, *err, err, "topo_fmri_label", nvl));
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   425
	}
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   426
3323
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   427
	nvlist_free(fru);
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   428
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   429
	if (nvlist_lookup_string(nvl, "prop", &str) != 0)
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   430
		return (set_error(thp, ETOPO_PROP_NVL, err, "topo_fmri_label",
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   431
		    nvl));
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   432
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   433
	if ((*label = topo_hdl_strdup(thp, str)) == NULL)
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   434
		return (set_error(thp, ETOPO_PROP_NOMEM, err,
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   435
		    "topo_fmri_label", nvl));
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   436
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   437
	nvlist_free(nvl);
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   438
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   439
	return (0);
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   440
}
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   441
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   442
int
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   443
topo_fmri_compare(topo_hdl_t *thp, nvlist_t *f1, nvlist_t *f2, int *err)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   444
{
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   445
	int rc;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   446
	char *scheme1, *scheme2;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   447
	nvlist_t *in;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   448
	nvlist_t *out = NULL;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   449
	tnode_t *rnode;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   450
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   451
	if (nvlist_lookup_string(f1, FM_FMRI_SCHEME, &scheme1) != 0)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   452
		return (set_error(thp, ETOPO_FMRI_MALFORM, err,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   453
		    TOPO_METH_COMPARE, NULL));
2027
7f714f201d97 PSARC 2006/221 /dev/bmc interface upgrade
sethg
parents: 1717
diff changeset
   454
	if (nvlist_lookup_string(f2, FM_FMRI_SCHEME, &scheme2) != 0)
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   455
		return (set_error(thp, ETOPO_FMRI_MALFORM, err,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   456
		    TOPO_METH_COMPARE, NULL));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   457
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   458
	if (strcmp(scheme1, scheme2) != 0)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   459
		return (0);
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   460
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   461
	if ((rnode = topo_hdl_root(thp, scheme1)) == NULL)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   462
		return (set_error(thp, ETOPO_METHOD_NOTSUP, err,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   463
		    TOPO_METH_COMPARE, NULL));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   464
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   465
	if (topo_hdl_nvalloc(thp, &in, NV_UNIQUE_NAME) != 0)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   466
		return (set_error(thp, ETOPO_FMRI_NVL, err, TOPO_METH_COMPARE,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   467
		    NULL));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   468
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   469
	if (nvlist_add_nvlist(in, "nv1", f1) != 0 ||
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   470
	    nvlist_add_nvlist(in, "nv2", f2) != 0)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   471
		return (set_error(thp, ETOPO_FMRI_NVL, err, TOPO_METH_COMPARE,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   472
		    in));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   473
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   474
	if ((rc = topo_method_invoke(rnode, TOPO_METH_COMPARE,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   475
	    TOPO_METH_COMPARE_VERSION, in, &out, err)) < 0)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   476
		return (set_error(thp, *err, err, TOPO_METH_COMPARE, in));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   477
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   478
	nvlist_free(in);
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   479
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   480
	return (rc);
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   481
}
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   482
3323
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   483
struct topo_invoke {
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   484
	nvlist_t *tl_resource;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   485
	topo_walk_cb_t tl_func;
3062
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   486
	int tl_ret;
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   487
	void *tl_pdata;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   488
};
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   489
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   490
static int
3323
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   491
walk_invoke(topo_hdl_t *thp, tnode_t *node, void *pdata)
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   492
{
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   493
	int rc;
3323
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   494
	struct topo_invoke *tlp = (struct topo_invoke *)pdata;
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   495
	nvlist_t *r1, *r2 = tlp->tl_resource;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   496
3062
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   497
	if (topo_node_resource(node, &r1, &tlp->tl_ret) != 0)
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   498
		return (TOPO_WALK_ERR);
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   499
3062
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   500
	rc = topo_fmri_compare(thp, r1, r2, &tlp->tl_ret);
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   501
	nvlist_free(r1);
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   502
	if (rc == 0)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   503
		return (TOPO_WALK_NEXT);
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   504
	else if (rc == -1)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   505
		return (TOPO_WALK_ERR);
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   506
3062
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   507
	tlp->tl_ret = tlp->tl_func(thp, node, tlp->tl_pdata);
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   508
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   509
	return (TOPO_WALK_TERMINATE);
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   510
}
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   511
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   512
int
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   513
topo_fmri_invoke(topo_hdl_t *thp, nvlist_t *nvl, topo_walk_cb_t cb_f,
3062
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   514
    void *pdata, int *ret)
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   515
{
3062
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   516
	int err;
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   517
	topo_walk_t *wp;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   518
	char *scheme;
3323
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   519
	struct topo_invoke tl;
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   520
3062
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   521
	if (nvlist_lookup_string(nvl, FM_FMRI_SCHEME, &scheme)   != 0)
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   522
		return (set_error(thp, ETOPO_METHOD_INVAL, ret,
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   523
		    "topo_fmri_invoke", NULL));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   524
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   525
	tl.tl_resource = nvl;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   526
	tl.tl_func = cb_f;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   527
	tl.tl_pdata = pdata;
3062
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   528
	tl.tl_ret = 0;
3323
3cff27a475a5 PSARC 2006/679 Fault Event Extension
cindi
parents: 3062
diff changeset
   529
	if ((wp = topo_walk_init(thp, scheme, walk_invoke, &tl, &err)) == NULL)
3062
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   530
		return (set_error(thp, err, ret, "topo_fmri_invoke", NULL));
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   531
3062
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   532
	err = topo_walk_step(wp, TOPO_WALK_CHILD);
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   533
	topo_walk_fini(wp);
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   534
3062
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   535
	if (err == TOPO_WALK_ERR) {
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   536
		*ret = err;
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   537
		return (-1);
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   538
	}
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   539
3062
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   540
	*ret = tl.tl_ret;
46d280f5351d 6396916 verification of dtd file name is wrong
cindi
parents: 2027
diff changeset
   541
1414
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   542
	return (0);
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   543
}
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   544
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   545
/*
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   546
 * topo_fmri_create
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   547
 *
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   548
 *	If possible, creates an FMRI of the requested version in the
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   549
 *	requested scheme.  Args are passed as part of the inputs to the
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   550
 *	fmri-create method of the scheme.
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   551
 */
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   552
nvlist_t *
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   553
topo_fmri_create(topo_hdl_t *thp, const char *scheme, const char *name,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   554
    topo_instance_t inst, nvlist_t *nvl, int *err)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   555
{
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   556
	nvlist_t *ins;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   557
	nvlist_t *out;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   558
	tnode_t *rnode;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   559
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   560
	ins = out = NULL;
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   561
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   562
	if ((rnode = topo_hdl_root(thp, scheme)) == NULL)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   563
		return (set_nverror(thp, ETOPO_METHOD_NOTSUP, err,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   564
		    TOPO_METH_FMRI, NULL));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   565
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   566
	if ((*err = topo_hdl_nvalloc(thp, &ins, NV_UNIQUE_NAME)) != 0)
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   567
		return (set_nverror(thp, ETOPO_FMRI_NVL, err,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   568
		    TOPO_METH_FMRI, NULL));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   569
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   570
	if (nvlist_add_string(ins, TOPO_METH_FMRI_ARG_NAME, name) != 0 ||
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   571
	    nvlist_add_uint32(ins, TOPO_METH_FMRI_ARG_INST, inst) != 0) {
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   572
		return (set_nverror(thp, ETOPO_FMRI_NVL, err,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   573
		    TOPO_METH_FMRI, ins));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   574
	}
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   575
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   576
	if (nvl != NULL &&
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   577
	    nvlist_add_nvlist(ins, TOPO_METH_FMRI_ARG_NVL, nvl) != 0) {
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   578
		return (set_nverror(thp, ETOPO_FMRI_NVL, err,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   579
		    TOPO_METH_FMRI, ins));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   580
	}
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   581
	if (topo_method_invoke(rnode,
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   582
	    TOPO_METH_FMRI, TOPO_METH_FMRI_VERSION, ins, &out, err) != 0) {
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   583
		return (set_nverror(thp, *err, err, TOPO_METH_FMRI, ins));
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   584
	}
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   585
	nvlist_free(ins);
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   586
	return (out);
b4126407ac5b PSARC 2006/020 FMA for Athlon 64 and Opteron Processors
cindi
parents:
diff changeset
   587
}