summaryrefslogtreecommitdiffstats
path: root/src/import/chips/p9
diff options
context:
space:
mode:
authorMartin Peschke <mpeschke@de.ibm.com>2016-09-15 14:40:39 +0200
committerSachin Gupta <sgupta2m@in.ibm.com>2016-09-20 04:43:45 -0400
commit278e29100f424cc4d148bbfdcc509b19b3a2ec3e (patch)
tree2b766f4ac045cc781fd4e5e100a224a88b670e0a /src/import/chips/p9
parente1ee57c925e45d3cc10b50b82504642f190e2002 (diff)
downloadtalos-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/p9')
-rw-r--r--src/import/chips/p9/xip/p9_xip_image.c30
-rw-r--r--src/import/chips/p9/xip/p9_xip_image.h4
-rw-r--r--src/import/chips/p9/xip/p9_xip_tool.C2
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)
{
OpenPOWER on IntegriCloud