Print this page
SKU fix for 5094
5094 Update libsmbios with recent items
Reviewed by: Dan McDonald <danmcd@omniti.com>
Reviewed by: Josef 'Jeff' Sipek<jeffpc@josefsipek.net>
Reviewed by: Garrett D'Amore <garrett@damore.org>
        
*** 18,27 ****
--- 18,28 ----
   *
   * CDDL HEADER END
   */
  
  /*
+  * Copyright 2015 OmniTI Computer Consulting, Inc.  All rights reserved.
   * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
   * Use is subject to license terms.
   */
  
  /*
*** 409,441 ****
  
  int
  smbios_info_chassis(smbios_hdl_t *shp, id_t id, smbios_chassis_t *chp)
  {
          const smb_struct_t *stp = smb_lookup_id(shp, id);
!         smb_chassis_t ch;
  
          if (stp == NULL)
                  return (-1); /* errno is set for us */
  
          if (stp->smbst_hdr->smbh_type != SMB_TYPE_CHASSIS)
                  return (smb_set_errno(shp, ESMB_TYPE));
  
!         smb_info_bcopy(stp->smbst_hdr, &ch, sizeof (ch));
          bzero(chp, sizeof (smbios_chassis_t));
  
!         chp->smbc_oemdata = ch.smbch_oemdata;
!         chp->smbc_lock = (ch.smbch_type & SMB_CHT_LOCK) != 0;
!         chp->smbc_type = ch.smbch_type & ~SMB_CHT_LOCK;
!         chp->smbc_bustate = ch.smbch_bustate;
!         chp->smbc_psstate = ch.smbch_psstate;
!         chp->smbc_thstate = ch.smbch_thstate;
!         chp->smbc_security = ch.smbch_security;
!         chp->smbc_uheight = ch.smbch_uheight;
!         chp->smbc_cords = ch.smbch_cords;
!         chp->smbc_elems = ch.smbch_cn;
!         chp->smbc_elemlen = ch.smbch_cm;
  
          return (0);
  }
  
  int
  smbios_info_processor(smbios_hdl_t *shp, id_t id, smbios_processor_t *pp)
--- 410,449 ----
  
  int
  smbios_info_chassis(smbios_hdl_t *shp, id_t id, smbios_chassis_t *chp)
  {
          const smb_struct_t *stp = smb_lookup_id(shp, id);
!         /* Length is measurable by one byte, so it'll be no more than 255. */
!         uint8_t buf[256]
!         smb_chassis_t *ch = (smb_chassis_t *)&(buf[0]);
  
          if (stp == NULL)
                  return (-1); /* errno is set for us */
  
          if (stp->smbst_hdr->smbh_type != SMB_TYPE_CHASSIS)
                  return (smb_set_errno(shp, ESMB_TYPE));
  
!         smb_info_bcopy(stp->smbst_hdr, ch, sizeof (buf));
          bzero(chp, sizeof (smbios_chassis_t));
  
!         chp->smbc_oemdata = ch->smbch_oemdata;
!         chp->smbc_lock = (ch->smbch_type & SMB_CHT_LOCK) != 0;
!         chp->smbc_type = ch->smbch_type & ~SMB_CHT_LOCK;
!         chp->smbc_bustate = ch->smbch_bustate;
!         chp->smbc_psstate = ch->smbch_psstate;
!         chp->smbc_thstate = ch->smbch_thstate;
!         chp->smbc_security = ch->smbch_security;
!         chp->smbc_uheight = ch->smbch_uheight;
!         chp->smbc_cords = ch->smbch_cords;
!         chp->smbc_elems = ch->smbch_cn;
!         chp->smbc_elemlen = ch->smbch_cm;
  
+         if (shp->sh_smbvers >= SMB_VERSION_27) {
+                 (void) strlcpy(chp->smbc_sku, SMB_CH_SKU(ch),
+                     sizeof (chp->smbc_sku));
+         }
+ 
          return (0);
  }
  
  int
  smbios_info_processor(smbios_hdl_t *shp, id_t id, smbios_processor_t *pp)
*** 462,471 ****
--- 470,489 ----
          pp->smbp_upgrade = p.smbpr_upgrade;
          pp->smbp_l1cache = p.smbpr_l1cache;
          pp->smbp_l2cache = p.smbpr_l2cache;
          pp->smbp_l3cache = p.smbpr_l3cache;
  
+         if (shp->sh_smbvers >= SMB_VERSION_25) {
+                 pp->smbp_corecount = p.smbpr_corecount;
+                 pp->smbp_coresenabled = p.smbpr_coresenabled;
+                 pp->smbp_threadcount = p.smbpr_threadcount;
+                 pp->smbp_cflags = p.smbpr_cflags;
+         }
+ 
+         if (shp->sh_smbvers >= SMB_VERSION_26)
+                 pp->smbp_family2 = p.smbpr_family2;
+ 
          return (0);
  }
  
  int
  smbios_info_cache(smbios_hdl_t *shp, id_t id, smbios_cache_t *cap)
*** 716,725 ****
--- 734,745 ----
          map->smbma_ndevs = m.smbmarr_ndevs;
          map->smbma_err = m.smbmarr_err;
  
          if (m.smbmarr_cap != 0x80000000)
                  map->smbma_size = (uint64_t)m.smbmarr_cap * 1024;
+         else if (m.smbmarr_extcap != 0)
+                 map->smbma_size = m.smbmarr_extcap;
          else
                  map->smbma_size = 0; /* unknown */
  
          return (0);
  }
*** 739,751 ****
--- 759,777 ----
          smb_info_bcopy(stp->smbst_hdr, &m, sizeof (m));
          bzero(map, sizeof (smbios_memarrmap_t));
  
          map->smbmam_array = m.smbamap_array;
          map->smbmam_width = m.smbamap_width;
+ 
+         if (m.smbamap_start != 0xFFFFFFFF && m.smbamap_end != 0xFFFFFFFF) {
                  map->smbmam_addr = (uint64_t)m.smbamap_start * 1024;
                  map->smbmam_size = (uint64_t)
                      (m.smbamap_end - m.smbamap_start + 1) * 1024;
+         } else if (m.smbamap_extstart != 0 && m.smbamap_extend != 0) {
+                 map->smbmam_addr = m.smbamap_extstart;
+                 map->smbmam_size = m.smbamap_extend - m.smbamap_extstart + 1;
+         }
  
          return (0);
  }
  
  int
*** 766,776 ****
          mdp->smbmd_array = m.smbmdev_array;
          mdp->smbmd_error = m.smbmdev_error;
          mdp->smbmd_twidth = m.smbmdev_twidth == 0xFFFF ? -1U : m.smbmdev_twidth;
          mdp->smbmd_dwidth = m.smbmdev_dwidth == 0xFFFF ? -1U : m.smbmdev_dwidth;
  
!         if (mdp->smbmd_size != 0xFFFF) {
                  mdp->smbmd_size = (uint64_t)(m.smbmdev_size & ~SMB_MDS_KBYTES);
                  if (m.smbmdev_size & SMB_MDS_KBYTES)
                          mdp->smbmd_size *= 1024;
                  else
                          mdp->smbmd_size *= 1024 * 1024;
--- 792,805 ----
          mdp->smbmd_array = m.smbmdev_array;
          mdp->smbmd_error = m.smbmdev_error;
          mdp->smbmd_twidth = m.smbmdev_twidth == 0xFFFF ? -1U : m.smbmdev_twidth;
          mdp->smbmd_dwidth = m.smbmdev_dwidth == 0xFFFF ? -1U : m.smbmdev_dwidth;
  
!         if (m.smbmdev_size == 0x7FFF) {
!                 mdp->smbmd_size = (uint64_t)m.smbmdev_extsize;
!                 mdp->smbmd_size *= 1024 * 1024; /* convert MB to bytes */
!         } else if (m.smbmdev_size != 0xFFFF) {
                  mdp->smbmd_size = (uint64_t)(m.smbmdev_size & ~SMB_MDS_KBYTES);
                  if (m.smbmdev_size & SMB_MDS_KBYTES)
                          mdp->smbmd_size *= 1024;
                  else
                          mdp->smbmd_size *= 1024 * 1024;
*** 778,794 ****
                  mdp->smbmd_size = -1ULL; /* size unknown */
  
          mdp->smbmd_form = m.smbmdev_form;
          mdp->smbmd_set = m.smbmdev_set;
          mdp->smbmd_type = m.smbmdev_type;
          mdp->smbmd_flags = m.smbmdev_flags;
          mdp->smbmd_dloc = smb_strptr(stp, m.smbmdev_dloc);
          mdp->smbmd_bloc = smb_strptr(stp, m.smbmdev_bloc);
  
!         if (m.smbmdev_speed != 0)
!                 mdp->smbmd_speed = 1000 / m.smbmdev_speed; /* MHz -> nsec */
  
          return (0);
  }
  
  int
  smbios_info_memdevmap(smbios_hdl_t *shp, id_t id, smbios_memdevmap_t *mdp)
--- 807,833 ----
                  mdp->smbmd_size = -1ULL; /* size unknown */
  
          mdp->smbmd_form = m.smbmdev_form;
          mdp->smbmd_set = m.smbmdev_set;
          mdp->smbmd_type = m.smbmdev_type;
+         mdp->smbmd_speed = m.smbmdev_speed;
          mdp->smbmd_flags = m.smbmdev_flags;
          mdp->smbmd_dloc = smb_strptr(stp, m.smbmdev_dloc);
          mdp->smbmd_bloc = smb_strptr(stp, m.smbmdev_bloc);
  
!         if (shp->sh_smbvers >= SMB_VERSION_26)
!                 mdp->smbmd_rank = m.smbmdev_attrs & 0x0F;
  
+         if (shp->sh_smbvers >= SMB_VERSION_27)
+                 mdp->smbmd_clkspeed = m.smbmdev_clkspeed;
+ 
+         if (shp->sh_smbvers >= SMB_VERSION_28) {
+                 mdp->smbmd_minvolt = m.smbmdev_minvolt;
+                 mdp->smbmd_maxvolt = m.smbmdev_maxvolt;
+                 mdp->smbmd_confvolt = m.smbmdev_confvolt;
+         }
+ 
          return (0);
  }
  
  int
  smbios_info_memdevmap(smbios_hdl_t *shp, id_t id, smbios_memdevmap_t *mdp)
*** 805,821 ****
          smb_info_bcopy(stp->smbst_hdr, &m, sizeof (m));
          bzero(mdp, sizeof (smbios_memdevmap_t));
  
          mdp->smbmdm_device = m.smbdmap_device;
          mdp->smbmdm_arrmap = m.smbdmap_array;
-         mdp->smbmdm_addr = (uint64_t)m.smbdmap_start * 1024;
-         mdp->smbmdm_size = (uint64_t)
-             (m.smbdmap_end - m.smbdmap_start + 1) * 1024;
          mdp->smbmdm_rpos = m.smbdmap_rpos;
          mdp->smbmdm_ipos = m.smbdmap_ipos;
          mdp->smbmdm_idepth = m.smbdmap_idepth;
  
          return (0);
  }
  
  id_t
  smbios_info_hwsec(smbios_hdl_t *shp, smbios_hwsec_t *hsp)
--- 844,866 ----
          smb_info_bcopy(stp->smbst_hdr, &m, sizeof (m));
          bzero(mdp, sizeof (smbios_memdevmap_t));
  
          mdp->smbmdm_device = m.smbdmap_device;
          mdp->smbmdm_arrmap = m.smbdmap_array;
          mdp->smbmdm_rpos = m.smbdmap_rpos;
          mdp->smbmdm_ipos = m.smbdmap_ipos;
          mdp->smbmdm_idepth = m.smbdmap_idepth;
  
+         if (m.smbdmap_start != 0xFFFFFFFF && m.smbdmap_end != 0xFFFFFFFF) {
+                 mdp->smbmdm_addr = (uint64_t)m.smbdmap_start * 1024;
+                 mdp->smbmdm_size = (uint64_t)
+                     (m.smbdmap_end - m.smbdmap_start + 1) * 1024;
+         } else if (m.smbdmap_extstart != 0 && m.smbdmap_extend != 0) {
+                 mdp->smbmdm_addr = m.smbdmap_extstart;
+                 mdp->smbmdm_size = m.smbdmap_extend - m.smbdmap_extstart + 1;
+         }
+ 
          return (0);
  }
  
  id_t
  smbios_info_hwsec(smbios_hdl_t *shp, smbios_hwsec_t *hsp)