xref: /onnv-gate/usr/src/cmd/fm/modules/sun4v/generic-mem/gmem_fmri.c (revision 8346:ecea0dd9d4ce)
1*8346SScott.Davenport@Sun.COM /*
2*8346SScott.Davenport@Sun.COM  * CDDL HEADER START
3*8346SScott.Davenport@Sun.COM  *
4*8346SScott.Davenport@Sun.COM  * The contents of this file are subject to the terms of the
5*8346SScott.Davenport@Sun.COM  * Common Development and Distribution License (the "License").
6*8346SScott.Davenport@Sun.COM  * You may not use this file except in compliance with the License.
7*8346SScott.Davenport@Sun.COM  *
8*8346SScott.Davenport@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*8346SScott.Davenport@Sun.COM  * or http://www.opensolaris.org/os/licensing.
10*8346SScott.Davenport@Sun.COM  * See the License for the specific language governing permissions
11*8346SScott.Davenport@Sun.COM  * and limitations under the License.
12*8346SScott.Davenport@Sun.COM  *
13*8346SScott.Davenport@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
14*8346SScott.Davenport@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*8346SScott.Davenport@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
16*8346SScott.Davenport@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
17*8346SScott.Davenport@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
18*8346SScott.Davenport@Sun.COM  *
19*8346SScott.Davenport@Sun.COM  * CDDL HEADER END
20*8346SScott.Davenport@Sun.COM  */
21*8346SScott.Davenport@Sun.COM /*
22*8346SScott.Davenport@Sun.COM  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23*8346SScott.Davenport@Sun.COM  * Use is subject to license terms.
24*8346SScott.Davenport@Sun.COM  */
25*8346SScott.Davenport@Sun.COM 
26*8346SScott.Davenport@Sun.COM 
27*8346SScott.Davenport@Sun.COM #include <errno.h>
28*8346SScott.Davenport@Sun.COM #include <strings.h>
29*8346SScott.Davenport@Sun.COM 
30*8346SScott.Davenport@Sun.COM #include <gmem_fmri.h>
31*8346SScott.Davenport@Sun.COM #include <gmem.h>
32*8346SScott.Davenport@Sun.COM 
33*8346SScott.Davenport@Sun.COM void
gmem_fmri_init(fmd_hdl_t * hdl,gmem_fmri_t * fmri,nvlist_t * nvl,const char * fmt,...)34*8346SScott.Davenport@Sun.COM gmem_fmri_init(fmd_hdl_t *hdl, gmem_fmri_t *fmri, nvlist_t *nvl,
35*8346SScott.Davenport@Sun.COM     const char *fmt, ...)
36*8346SScott.Davenport@Sun.COM {
37*8346SScott.Davenport@Sun.COM 	va_list ap;
38*8346SScott.Davenport@Sun.COM 
39*8346SScott.Davenport@Sun.COM 	va_start(ap, fmt);
40*8346SScott.Davenport@Sun.COM 	gmem_vbufname(fmri->fmri_packnm, sizeof (fmri->fmri_packnm), fmt, ap);
41*8346SScott.Davenport@Sun.COM 	va_end(ap);
42*8346SScott.Davenport@Sun.COM 
43*8346SScott.Davenport@Sun.COM 	if ((errno = nvlist_dup(nvl, &fmri->fmri_nvl, 0)) != 0 ||
44*8346SScott.Davenport@Sun.COM 	    (errno = nvlist_size(nvl, &fmri->fmri_packsz,
45*8346SScott.Davenport@Sun.COM 	    NV_ENCODE_NATIVE)) != 0)
46*8346SScott.Davenport@Sun.COM 		fmd_hdl_abort(hdl, "failed to copy fmri for fmri create");
47*8346SScott.Davenport@Sun.COM 
48*8346SScott.Davenport@Sun.COM 	fmri->fmri_packbuf = fmd_hdl_alloc(hdl, fmri->fmri_packsz, FMD_SLEEP);
49*8346SScott.Davenport@Sun.COM 
50*8346SScott.Davenport@Sun.COM 	if ((errno = nvlist_pack(nvl, &fmri->fmri_packbuf, &fmri->fmri_packsz,
51*8346SScott.Davenport@Sun.COM 	    NV_ENCODE_NATIVE, 0)) != 0)
52*8346SScott.Davenport@Sun.COM 		fmd_hdl_abort(hdl, "failed to pack fmri for fmri create");
53*8346SScott.Davenport@Sun.COM 
54*8346SScott.Davenport@Sun.COM 	gmem_fmri_write(hdl, fmri);
55*8346SScott.Davenport@Sun.COM }
56*8346SScott.Davenport@Sun.COM 
57*8346SScott.Davenport@Sun.COM void
gmem_fmri_fini(fmd_hdl_t * hdl,gmem_fmri_t * fmri,int destroy)58*8346SScott.Davenport@Sun.COM gmem_fmri_fini(fmd_hdl_t *hdl, gmem_fmri_t *fmri, int destroy)
59*8346SScott.Davenport@Sun.COM {
60*8346SScott.Davenport@Sun.COM 	if (destroy)
61*8346SScott.Davenport@Sun.COM 		fmd_buf_destroy(hdl, NULL, fmri->fmri_packnm);
62*8346SScott.Davenport@Sun.COM 
63*8346SScott.Davenport@Sun.COM 	fmd_hdl_free(hdl, fmri->fmri_packbuf, fmri->fmri_packsz);
64*8346SScott.Davenport@Sun.COM 	nvlist_free(fmri->fmri_nvl);
65*8346SScott.Davenport@Sun.COM }
66*8346SScott.Davenport@Sun.COM 
67*8346SScott.Davenport@Sun.COM void
gmem_fmri_restore(fmd_hdl_t * hdl,gmem_fmri_t * fmri)68*8346SScott.Davenport@Sun.COM gmem_fmri_restore(fmd_hdl_t *hdl, gmem_fmri_t *fmri)
69*8346SScott.Davenport@Sun.COM {
70*8346SScott.Davenport@Sun.COM 	if (fmd_buf_size(hdl, NULL, fmri->fmri_packnm) == 0) {
71*8346SScott.Davenport@Sun.COM 		bzero(fmri, sizeof (gmem_fmri_t));
72*8346SScott.Davenport@Sun.COM 		return;
73*8346SScott.Davenport@Sun.COM 	}
74*8346SScott.Davenport@Sun.COM 
75*8346SScott.Davenport@Sun.COM 	if ((fmri->fmri_packbuf = gmem_buf_read(hdl, NULL, fmri->fmri_packnm,
76*8346SScott.Davenport@Sun.COM 	    fmri->fmri_packsz)) == NULL) {
77*8346SScott.Davenport@Sun.COM 		fmd_hdl_abort(hdl, "failed to read fmri buffer %s",
78*8346SScott.Davenport@Sun.COM 		    fmri->fmri_packnm);
79*8346SScott.Davenport@Sun.COM 	}
80*8346SScott.Davenport@Sun.COM 
81*8346SScott.Davenport@Sun.COM 	if (nvlist_unpack(fmri->fmri_packbuf, fmri->fmri_packsz,
82*8346SScott.Davenport@Sun.COM 	    &fmri->fmri_nvl, 0) != 0) {
83*8346SScott.Davenport@Sun.COM 		fmd_hdl_abort(hdl, "failed to unpack fmri buffer %s\n",
84*8346SScott.Davenport@Sun.COM 		    fmri->fmri_packnm);
85*8346SScott.Davenport@Sun.COM 	}
86*8346SScott.Davenport@Sun.COM }
87*8346SScott.Davenport@Sun.COM 
88*8346SScott.Davenport@Sun.COM void
gmem_fmri_write(fmd_hdl_t * hdl,gmem_fmri_t * fmri)89*8346SScott.Davenport@Sun.COM gmem_fmri_write(fmd_hdl_t *hdl, gmem_fmri_t *fmri)
90*8346SScott.Davenport@Sun.COM {
91*8346SScott.Davenport@Sun.COM 	size_t sz;
92*8346SScott.Davenport@Sun.COM 
93*8346SScott.Davenport@Sun.COM 	if ((sz = fmd_buf_size(hdl, NULL, fmri->fmri_packnm)) !=
94*8346SScott.Davenport@Sun.COM 	    fmri->fmri_packsz && sz != 0)
95*8346SScott.Davenport@Sun.COM 		fmd_buf_destroy(hdl, NULL, fmri->fmri_packnm);
96*8346SScott.Davenport@Sun.COM 
97*8346SScott.Davenport@Sun.COM 	fmd_buf_write(hdl, NULL, fmri->fmri_packnm, fmri->fmri_packbuf,
98*8346SScott.Davenport@Sun.COM 	    fmri->fmri_packsz);
99*8346SScott.Davenport@Sun.COM }
100