diff options
author | Martin Peschke <mpeschke@de.ibm.com> | 2016-09-15 14:40:39 +0200 |
---|---|---|
committer | Sachin Gupta <sgupta2m@in.ibm.com> | 2016-09-20 04:43:45 -0400 |
commit | 278e29100f424cc4d148bbfdcc509b19b3a2ec3e (patch) | |
tree | 2b766f4ac045cc781fd4e5e100a224a88b670e0a /src/import/chips | |
parent | e1ee57c925e45d3cc10b50b82504642f190e2002 (diff) | |
download | talos-sbe-278e29100f424cc4d148bbfdcc509b19b3a2ec3e.tar.gz talos-sbe-278e29100f424cc4d148bbfdcc509b19b3a2ec3e.zip |
P9-XIP: p9_xip_get_item() can now deal with array attributes
This is a new API only used in one place so far. So enhancing it
should be ok. The funtionality is needed for a p9_xip_tool change.
Change-Id: Ibecb2ee45dc5fbf1394fcac0bfef92aa10468927
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/29752
Reviewed-by: Shakeeb A. Pasha B K <shakeebbk@in.ibm.com>
Reviewed-by: Sachin Gupta <sgupta2m@in.ibm.com>
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Tested-by: PPE CI <ppe-ci+hostboot@us.ibm.com>
Tested-by: Hostboot CI <hostboot-ci+hostboot@us.ibm.com>
Reviewed-by: Richard J. Knight <rjknight@us.ibm.com>
Reviewed-by: Martin Peschke <mpeschke@de.ibm.com>
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/29755
Reviewed-by: Hostboot Team <hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Diffstat (limited to 'src/import/chips')
-rw-r--r-- | src/import/chips/p9/xip/p9_xip_image.c | 30 | ||||
-rw-r--r-- | src/import/chips/p9/xip/p9_xip_image.h | 4 | ||||
-rw-r--r-- | src/import/chips/p9/xip/p9_xip_tool.C | 2 |
3 files changed, 24 insertions, 12 deletions
diff --git a/src/import/chips/p9/xip/p9_xip_image.c b/src/import/chips/p9/xip/p9_xip_image.c index 18621811..533dd0f6 100644 --- a/src/import/chips/p9/xip/p9_xip_image.c +++ b/src/import/chips/p9/xip/p9_xip_image.c @@ -2102,43 +2102,53 @@ p9_xip_find(void* i_image, } int -p9_xip_get_item(const P9XipItem* i_item, uint64_t* o_data) +p9_xip_get_item(const P9XipItem* i_item, uint64_t* o_data, uint32_t i_index) { + if ((i_item->iv_elements != 0) && (i_index >= i_item->iv_elements)) + { + return TRACE_ERROR(P9_XIP_BOUNDS_ERROR); + } + switch (i_item->iv_type) { case P9_XIP_UINT8: - *o_data = *((uint8_t*)(i_item->iv_imageData)); + *o_data = ((uint8_t*)(i_item->iv_imageData))[i_index]; break; case P9_XIP_UINT16: - *o_data = htobe16(*((uint16_t*)(i_item->iv_imageData))); + *o_data = htobe16(((uint16_t*)(i_item->iv_imageData))[i_index]); break; case P9_XIP_UINT32: - *o_data = htobe32(*((uint32_t*)(i_item->iv_imageData))); + *o_data = htobe32(((uint32_t*)(i_item->iv_imageData))[i_index]); break; case P9_XIP_UINT64: - *o_data = htobe64(*((uint64_t*)(i_item->iv_imageData))); + *o_data = htobe64(((uint64_t*)(i_item->iv_imageData))[i_index]); break; case P9_XIP_INT8: - *o_data = *((int8_t*)(i_item->iv_imageData)); + *o_data = ((int8_t*)(i_item->iv_imageData))[i_index]; break; case P9_XIP_INT16: - *o_data = htobe16(*((int16_t*)(i_item->iv_imageData))); + *o_data = htobe16(((int16_t*)(i_item->iv_imageData))[i_index]); break; case P9_XIP_INT32: - *o_data = htobe32(*((int32_t*)(i_item->iv_imageData))); + *o_data = htobe32(((int32_t*)(i_item->iv_imageData))[i_index]); break; case P9_XIP_INT64: - *o_data = htobe64(*((int64_t*)(i_item->iv_imageData))); + *o_data = htobe64(((int64_t*)(i_item->iv_imageData))[i_index]); break; case P9_XIP_ADDRESS: + if (i_index) + { + return TRACE_ERROR(P9_XIP_BOUNDS_ERROR); + } + *o_data = i_item->iv_address; break; @@ -2164,7 +2174,7 @@ p9_xip_get_scalar(void* i_image, const char* i_id, uint64_t* o_data) if (!rc) { - rc = p9_xip_get_item(&item, o_data); + rc = p9_xip_get_item(&item, o_data, 0); } return rc; diff --git a/src/import/chips/p9/xip/p9_xip_image.h b/src/import/chips/p9/xip/p9_xip_image.h index 06240326..58410d4d 100644 --- a/src/import/chips/p9/xip/p9_xip_image.h +++ b/src/import/chips/p9/xip/p9_xip_image.h @@ -739,11 +739,13 @@ p9_xip_get_scalar(void* i_image, const char* i_id, uint64_t* o_data); /// data. Assuming the item is located this variable is assigned by the call. /// In the event of an error the final state of \a o_data is not specified. /// +/// \param[in] i_index The index of the vector element to return. +/// /// \retval 0 Success /// /// \retval non-0 See \ref p9_xip_image_errors int -p9_xip_get_item(const P9XipItem *i_item, uint64_t* o_data); +p9_xip_get_item(const P9XipItem *i_item, uint64_t* o_data, uint32_t i_index); /// Get an integral element from a vector held in a P9-XIP image diff --git a/src/import/chips/p9/xip/p9_xip_tool.C b/src/import/chips/p9/xip/p9_xip_tool.C index 86748368..3c6a4612 100644 --- a/src/import/chips/p9/xip/p9_xip_tool.C +++ b/src/import/chips/p9/xip/p9_xip_tool.C @@ -402,7 +402,7 @@ attrListing(const P9XipItem* i_item, const char* prefix) printf("%s%-42s | %s | ", prefix, i_item->iv_id, P9_XIP_TYPE_STRING(g_typeAbbrevs, i_item->iv_type)); - rc = p9_xip_get_item(i_item, &data); + rc = p9_xip_get_item(i_item, &data, 0); if (rc) { |