Print this page
patch tsoome-feedback


 183                 return (NULL);
 184 
 185         len = strlen(nac_name) + 1;
 186 
 187         nac = fmd_hdl_zalloc(hdl, len, FMD_SLEEP);
 188         (void) strcpy(nac, nac_name);
 189 
 190         n = cmd_count_components(nac, '/');
 191 
 192         fmd_hdl_debug(hdl, "cmd_mkboard_fru: nac=%s components=%d\n", nac, n);
 193 
 194         hc_list = fmd_hdl_zalloc(hdl, sizeof (nvlist_t *)*n, FMD_SLEEP);
 195 
 196         for (i = 0; i < n; i++) {
 197                 (void) nvlist_alloc(&hc_list[i],
 198                     NV_UNIQUE_NAME|NV_UNIQUE_NAME_TYPE, 0);
 199         }
 200 
 201         if (cmd_breakup_components(nac, "/", hc_list) < 0) {
 202                 for (i = 0; i < n; i++) {
 203                         if (hc_list[i] != NULL)
 204                             nvlist_free(hc_list[i]);
 205                 }
 206                 fmd_hdl_free(hdl, hc_list, sizeof (nvlist_t *)*n);
 207                 fmd_hdl_free(hdl, nac, len);
 208                 return (NULL);
 209         }
 210 
 211         if (nvlist_alloc(&fru, NV_UNIQUE_NAME, 0) != 0) {
 212                 for (i = 0; i < n; i++) {
 213                         if (hc_list[i] != NULL)
 214                             nvlist_free(hc_list[i]);
 215                 }
 216                 fmd_hdl_free(hdl, hc_list, sizeof (nvlist_t *)*n);
 217                 fmd_hdl_free(hdl, nac, len);
 218                 return (NULL);
 219         }
 220 
 221         if (nvlist_add_uint8(fru, FM_VERSION, FM_HC_SCHEME_VERSION) != 0 ||
 222             nvlist_add_string(fru, FM_FMRI_SCHEME, FM_FMRI_SCHEME_HC) != 0 ||
 223             nvlist_add_string(fru, FM_FMRI_HC_ROOT, "") != 0 ||
 224             nvlist_add_uint32(fru, FM_FMRI_HC_LIST_SZ, n) != 0 ||
 225             nvlist_add_nvlist_array(fru, FM_FMRI_HC_LIST, hc_list, n) != 0) {
 226                 for (i = 0; i < n; i++) {
 227                         if (hc_list[i] != NULL)
 228                             nvlist_free(hc_list[i]);
 229                 }
 230                 fmd_hdl_free(hdl, hc_list, sizeof (nvlist_t *)*n);
 231                 fmd_hdl_free(hdl, nac, len);
 232                 nvlist_free(fru);
 233                 return (NULL);
 234         }
 235 
 236         for (i = 0; i < n; i++) {
 237                 if (hc_list[i] != NULL)
 238                     nvlist_free(hc_list[i]);
 239         }
 240         fmd_hdl_free(hdl, hc_list, sizeof (nvlist_t *)*n);
 241         fmd_hdl_free(hdl, nac, len);
 242 
 243         if ((serialstr != NULL &&
 244             nvlist_add_string(fru, FM_FMRI_HC_SERIAL_ID, serialstr) != 0) ||
 245             (partstr != NULL &&
 246             nvlist_add_string(fru, FM_FMRI_HC_PART, partstr) != 0)) {
 247                 nvlist_free(fru);
 248                 return (NULL);
 249         }
 250 
 251         return (fru);
 252 }
 253 
 254 nvlist_t *
 255 cmd_boardfru_create_fault(fmd_hdl_t *hdl, nvlist_t *asru, const char *fltnm,
 256     uint_t cert, char *loc)
 257 {
 258         nvlist_t *flt, *nvlfru;
 259         char *serialstr, *partstr;
 260 
 261         if ((loc == NULL) || (strcmp(loc, EMPTY_STR) == 0))
 262                 return (NULL);
 263 
 264         if (nvlist_lookup_string(asru, FM_FMRI_HC_SERIAL_ID, &serialstr) != 0)
 265                 serialstr = NULL;
 266         if (nvlist_lookup_string(asru, FM_FMRI_HC_PART, &partstr) != 0)
 267                 partstr = NULL;
 268 
 269         nvlfru = cmd_mkboard_fru(hdl, loc, serialstr, partstr);
 270         if (nvlfru == NULL)
 271                 return (NULL);
 272 
 273         flt = cmd_nvl_create_fault(hdl, fltnm, cert, nvlfru, nvlfru, NULL);
 274         flt = cmd_fault_add_location(hdl, flt, loc);
 275         if (nvlfru != NULL)
 276                 nvlist_free(nvlfru);
 277         return (flt);
 278 }
 279 
 280 /* find_mb -- find hardware platform motherboard within libtopo */
 281 
 282 /* ARGSUSED */
 283 static int
 284 find_mb(topo_hdl_t *thp, tnode_t *node, void *arg)
 285 {
 286         int err;
 287         nvlist_t *rsrc, **hcl;
 288         char *name;
 289         uint_t n;
 290 
 291         if (topo_node_resource(node, &rsrc, &err) < 0) {
 292                 return (TOPO_WALK_NEXT);        /* no resource, try next */
 293         }
 294 
 295         if (nvlist_lookup_nvlist_array(rsrc, FM_FMRI_HC_LIST, &hcl, &n) < 0) {


 621                  */
 622                 if ((rsrc != NULL) && strstr(class, ".page") != NULL) {
 623                         if (nvlist_alloc(&hsp, NV_UNIQUE_NAME, 0) == 0) {
 624                                 if (nvlist_lookup_uint64(asru,
 625                                     FM_FMRI_MEM_PHYSADDR, &phyaddr) == 0)
 626                                         (void) (nvlist_add_uint64(hsp,
 627                                             FM_FMRI_MEM_PHYSADDR,
 628                                             phyaddr));
 629 
 630                                 if (nvlist_lookup_uint64(asru,
 631                                     FM_FMRI_MEM_OFFSET, &offset) == 0)
 632                                         (void) nvlist_add_uint64(hsp,
 633                                             FM_FMRI_HC_SPECIFIC_OFFSET, offset);
 634 
 635                                 (void) nvlist_add_nvlist(rsrc,
 636                                     FM_FMRI_HC_SPECIFIC, hsp);
 637                         }
 638                 }
 639                 fllist = fmd_nvl_create_fault(hdl, class, cert, asru,
 640                     fru, rsrc);
 641                 if (hsp != NULL)
 642                         nvlist_free(hsp);
 643         } else {
 644                 rsrc = get_cpu_fault_resource(hdl, asru);
 645                 fllist = fmd_nvl_create_fault(hdl, class, cert, asru,
 646                     fru, rsrc);
 647         }
 648 
 649         if (rsrc != NULL)
 650                 nvlist_free(rsrc);
 651 
 652         return (fllist);
 653 }


 183                 return (NULL);
 184 
 185         len = strlen(nac_name) + 1;
 186 
 187         nac = fmd_hdl_zalloc(hdl, len, FMD_SLEEP);
 188         (void) strcpy(nac, nac_name);
 189 
 190         n = cmd_count_components(nac, '/');
 191 
 192         fmd_hdl_debug(hdl, "cmd_mkboard_fru: nac=%s components=%d\n", nac, n);
 193 
 194         hc_list = fmd_hdl_zalloc(hdl, sizeof (nvlist_t *)*n, FMD_SLEEP);
 195 
 196         for (i = 0; i < n; i++) {
 197                 (void) nvlist_alloc(&hc_list[i],
 198                     NV_UNIQUE_NAME|NV_UNIQUE_NAME_TYPE, 0);
 199         }
 200 
 201         if (cmd_breakup_components(nac, "/", hc_list) < 0) {
 202                 for (i = 0; i < n; i++) {

 203                         nvlist_free(hc_list[i]);
 204                 }
 205                 fmd_hdl_free(hdl, hc_list, sizeof (nvlist_t *)*n);
 206                 fmd_hdl_free(hdl, nac, len);
 207                 return (NULL);
 208         }
 209 
 210         if (nvlist_alloc(&fru, NV_UNIQUE_NAME, 0) != 0) {
 211                 for (i = 0; i < n; i++) {

 212                         nvlist_free(hc_list[i]);
 213                 }
 214                 fmd_hdl_free(hdl, hc_list, sizeof (nvlist_t *)*n);
 215                 fmd_hdl_free(hdl, nac, len);
 216                 return (NULL);
 217         }
 218 
 219         if (nvlist_add_uint8(fru, FM_VERSION, FM_HC_SCHEME_VERSION) != 0 ||
 220             nvlist_add_string(fru, FM_FMRI_SCHEME, FM_FMRI_SCHEME_HC) != 0 ||
 221             nvlist_add_string(fru, FM_FMRI_HC_ROOT, "") != 0 ||
 222             nvlist_add_uint32(fru, FM_FMRI_HC_LIST_SZ, n) != 0 ||
 223             nvlist_add_nvlist_array(fru, FM_FMRI_HC_LIST, hc_list, n) != 0) {
 224                 for (i = 0; i < n; i++) {

 225                         nvlist_free(hc_list[i]);
 226                 }
 227                 fmd_hdl_free(hdl, hc_list, sizeof (nvlist_t *)*n);
 228                 fmd_hdl_free(hdl, nac, len);
 229                 nvlist_free(fru);
 230                 return (NULL);
 231         }
 232 
 233         for (i = 0; i < n; i++) {

 234                 nvlist_free(hc_list[i]);
 235         }
 236         fmd_hdl_free(hdl, hc_list, sizeof (nvlist_t *)*n);
 237         fmd_hdl_free(hdl, nac, len);
 238 
 239         if ((serialstr != NULL &&
 240             nvlist_add_string(fru, FM_FMRI_HC_SERIAL_ID, serialstr) != 0) ||
 241             (partstr != NULL &&
 242             nvlist_add_string(fru, FM_FMRI_HC_PART, partstr) != 0)) {
 243                 nvlist_free(fru);
 244                 return (NULL);
 245         }
 246 
 247         return (fru);
 248 }
 249 
 250 nvlist_t *
 251 cmd_boardfru_create_fault(fmd_hdl_t *hdl, nvlist_t *asru, const char *fltnm,
 252     uint_t cert, char *loc)
 253 {
 254         nvlist_t *flt, *nvlfru;
 255         char *serialstr, *partstr;
 256 
 257         if ((loc == NULL) || (strcmp(loc, EMPTY_STR) == 0))
 258                 return (NULL);
 259 
 260         if (nvlist_lookup_string(asru, FM_FMRI_HC_SERIAL_ID, &serialstr) != 0)
 261                 serialstr = NULL;
 262         if (nvlist_lookup_string(asru, FM_FMRI_HC_PART, &partstr) != 0)
 263                 partstr = NULL;
 264 
 265         nvlfru = cmd_mkboard_fru(hdl, loc, serialstr, partstr);
 266         if (nvlfru == NULL)
 267                 return (NULL);
 268 
 269         flt = cmd_nvl_create_fault(hdl, fltnm, cert, nvlfru, nvlfru, NULL);
 270         flt = cmd_fault_add_location(hdl, flt, loc);

 271         nvlist_free(nvlfru);
 272         return (flt);
 273 }
 274 
 275 /* find_mb -- find hardware platform motherboard within libtopo */
 276 
 277 /* ARGSUSED */
 278 static int
 279 find_mb(topo_hdl_t *thp, tnode_t *node, void *arg)
 280 {
 281         int err;
 282         nvlist_t *rsrc, **hcl;
 283         char *name;
 284         uint_t n;
 285 
 286         if (topo_node_resource(node, &rsrc, &err) < 0) {
 287                 return (TOPO_WALK_NEXT);        /* no resource, try next */
 288         }
 289 
 290         if (nvlist_lookup_nvlist_array(rsrc, FM_FMRI_HC_LIST, &hcl, &n) < 0) {


 616                  */
 617                 if ((rsrc != NULL) && strstr(class, ".page") != NULL) {
 618                         if (nvlist_alloc(&hsp, NV_UNIQUE_NAME, 0) == 0) {
 619                                 if (nvlist_lookup_uint64(asru,
 620                                     FM_FMRI_MEM_PHYSADDR, &phyaddr) == 0)
 621                                         (void) (nvlist_add_uint64(hsp,
 622                                             FM_FMRI_MEM_PHYSADDR,
 623                                             phyaddr));
 624 
 625                                 if (nvlist_lookup_uint64(asru,
 626                                     FM_FMRI_MEM_OFFSET, &offset) == 0)
 627                                         (void) nvlist_add_uint64(hsp,
 628                                             FM_FMRI_HC_SPECIFIC_OFFSET, offset);
 629 
 630                                 (void) nvlist_add_nvlist(rsrc,
 631                                     FM_FMRI_HC_SPECIFIC, hsp);
 632                         }
 633                 }
 634                 fllist = fmd_nvl_create_fault(hdl, class, cert, asru,
 635                     fru, rsrc);

 636                 nvlist_free(hsp);
 637         } else {
 638                 rsrc = get_cpu_fault_resource(hdl, asru);
 639                 fllist = fmd_nvl_create_fault(hdl, class, cert, asru,
 640                     fru, rsrc);
 641         }
 642 

 643         nvlist_free(rsrc);
 644 
 645         return (fllist);
 646 }