summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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