diff options
author | Martin Peschke <mpeschke@de.ibm.com> | 2016-09-15 14:40:39 +0200 |
---|---|---|
committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2016-09-25 13:27:11 -0400 |
commit | 60f38c2bbfbe687ae26a0c6d667b33fbe388de85 (patch) | |
tree | 78875f29dd1243c556058b463297498df610d365 /src/import/chips/p9/xip | |
parent | 30b8ee7d02bdd67cd369a9d847075432f32aa0fa (diff) | |
download | talos-hostboot-60f38c2bbfbe687ae26a0c6d667b33fbe388de85.tar.gz talos-hostboot-60f38c2bbfbe687ae26a0c6d667b33fbe388de85.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/29756
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/import/chips/p9/xip')
-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 |
2 files changed, 23 insertions, 11 deletions
diff --git a/src/import/chips/p9/xip/p9_xip_image.c b/src/import/chips/p9/xip/p9_xip_image.c index 14e7e6553..27ba98031 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 d0ac71dfd..d50dc37e7 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 |