summaryrefslogtreecommitdiffstats
path: root/src/import/chips/p9/xip
diff options
context:
space:
mode:
authorMartin Peschke <mpeschke@de.ibm.com>2016-09-15 14:40:39 +0200
committerDaniel M. Crowell <dcrowell@us.ibm.com>2016-09-25 13:27:11 -0400
commit60f38c2bbfbe687ae26a0c6d667b33fbe388de85 (patch)
tree78875f29dd1243c556058b463297498df610d365 /src/import/chips/p9/xip
parent30b8ee7d02bdd67cd369a9d847075432f32aa0fa (diff)
downloadtalos-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.c30
-rw-r--r--src/import/chips/p9/xip/p9_xip_image.h4
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
OpenPOWER on IntegriCloud