summaryrefslogtreecommitdiffstats
path: root/src/usr/hwpf/hwp/fapiHwpExecInitFile.C
diff options
context:
space:
mode:
authorAndrew Geissler <andrewg@us.ibm.com>2011-11-15 16:49:58 -0600
committerMIKE J. JONES <mjjones@us.ibm.com>2011-11-17 16:14:31 -0600
commit610b9837c7586d6ae39b20492fd9383e2c35e70a (patch)
tree656917fc1dd3a3824dceb9f3b585f284b4878a7b /src/usr/hwpf/hwp/fapiHwpExecInitFile.C
parentd7f4265a6a3f73e98024e9d9c7f9cc36d4d27b9d (diff)
downloadtalos-hostboot-610b9837c7586d6ae39b20492fd9383e2c35e70a.tar.gz
talos-hostboot-610b9837c7586d6ae39b20492fd9383e2c35e70a.zip
Initfile - Support for multi-dimensional arrays
- Fix compile issue (forgot new file) - Explicitly define array size - Code review comment to replace #define with const - More changes for const police Change-Id: Ib5964c6bd266f9d74f4810d7884e5d63754eb3fb Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/497 Tested-by: Jenkins Server Reviewed-by: MIKE J. JONES <mjjones@us.ibm.com>
Diffstat (limited to 'src/usr/hwpf/hwp/fapiHwpExecInitFile.C')
-rw-r--r--src/usr/hwpf/hwp/fapiHwpExecInitFile.C110
1 files changed, 57 insertions, 53 deletions
diff --git a/src/usr/hwpf/hwp/fapiHwpExecInitFile.C b/src/usr/hwpf/hwp/fapiHwpExecInitFile.C
index 7df1dbed3..4382e34ab 100644
--- a/src/usr/hwpf/hwp/fapiHwpExecInitFile.C
+++ b/src/usr/hwpf/hwp/fapiHwpExecInitFile.C
@@ -31,6 +31,7 @@
* Flag Defect/Feature User Date Description
* ------ -------------- ---------- ----------- ----------------------------
* camvanng 09/29/2011 Created.
+ * andrewg 11/09/2011 Multi-dimension array support
*/
#include <fapiHwpExecInitFile.H>
@@ -153,10 +154,7 @@ void unloadAttrSymbolTable(attrTableEntry_t *& io_attrs);
fapi::ReturnCode getAttr(const ifData_t & i_ifData,
const uint16_t i_id,
uint64_t & o_val,
- const uint32_t i_arrayIndex1 = 0,
- const uint32_t i_arrayIndex2 = 0,
- const uint32_t i_arrayIndex3 = 0,
- const uint32_t i_arrayIndex4 = 0);
+ const uint16_t i_arrayIndexIds[MAX_ATTRIBUTE_ARRAY_DIMENSION]);
uint64_t * loadLitSymbolTable(ifInfo_t & io_ifInfo,
uint16_t & o_numLits);
@@ -189,7 +187,7 @@ uint64_t rpnBinaryOp(IfRpnOp i_op, uint64_t i_val1, uint64_t i_val2,
uint32_t i_any);
fapi::ReturnCode rpnDoPush(ifData_t & io_ifData, const uint16_t i_id,
- uint32_t & io_any, const uint16_t i_arrayIndex1 = 0);
+ uint32_t & io_any, const uint16_t i_arrayIndexIds[MAX_ATTRIBUTE_ARRAY_DIMENSION]);
fapi::ReturnCode rpnDoOp(rpnStack_t * io_rpnStack, IfRpnOp i_op,
uint32_t i_any);
@@ -494,13 +492,10 @@ void unloadAttrSymbolTable(attrTableEntry_t *& io_attrs)
* If there are ever attributes with more than 4 dimensions then this function
* will need to be updated.
*
- * @param[in] i_ifData Reference to ifData_t which contains initfile data
- * @param[in] i_id AttributeID
- * @param[out] o_val Reference to uint64_t where attribute value is set
- * @param[in] i_arrayIndex1 If array attribute then index1
- * @param[in] i_arrayIndex2 If at least 2D array attribute then index2
- * @param[in] i_arrayIndex3 If at least 3D array attribute then index3
- * @param[in] i_arrayIndex4 If at least 4D array attribute then index4
+ * @param[in] i_ifData Reference to ifData_t which contains initfile data
+ * @param[in] i_id AttributeID
+ * @param[out] o_val Reference to uint64_t where attribute value is set
+ * @param[in] i_arrayIndexIds Array of attribute array index's (when needed)
*
* @return ReturnCode. Zero if success.
*/
@@ -508,13 +503,10 @@ void unloadAttrSymbolTable(attrTableEntry_t *& io_attrs)
fapi::ReturnCode getAttr(const ifData_t & i_ifData,
const uint16_t i_id,
uint64_t & o_val,
- const uint32_t i_arrayIndex1,
- const uint32_t i_arrayIndex2,
- const uint32_t i_arrayIndex3,
- const uint32_t i_arrayIndex4)
+ const uint16_t i_arrayIndexIds[MAX_ATTRIBUTE_ARRAY_DIMENSION])
{
- FAPI_DBG(">> hwpExecInitFile: getAttr: id 0x%x index %d",
- i_id, i_arrayIndex1);
+ FAPI_DBG(">> hwpExecInitFile: getAttr: id 0x%x",
+ i_id);
fapi::ReturnCode l_rc = fapi::FAPI_RC_SUCCESS;
@@ -539,8 +531,8 @@ fapi::ReturnCode getAttr(const ifData_t & i_ifData,
FAPI_DBG("hwpExecInitFile: getAttr: attrId %u", l_attrId);
l_rc = fapi::fapiGetInitFileAttr(l_attrId, l_pTarget, o_val,
- i_arrayIndex1, i_arrayIndex2,
- i_arrayIndex3, i_arrayIndex4);
+ i_arrayIndexIds[0], i_arrayIndexIds[1],
+ i_arrayIndexIds[2], i_arrayIndexIds[3]);
if (l_rc)
{
@@ -1559,46 +1551,34 @@ uint64_t rpnBinaryOp(IfRpnOp i_op, uint64_t i_val1, uint64_t i_val2,
* Pushes the attribute or literal value specified by i_id onto the RPN stack.
* It uses the appropriate symbol table to resolve the value first.
*
- * @param[in,out] io_ifData Reference to ifData_t which contains initfile data
- * @param[in] i_id Id of element to push
- * @param[in,out] io_any Set if ANY op
- * @param[in] i_arrayIndexId Set to array index if this is an array attribute,
- * support for 1-dimensional array only
- * @return fapi::ReturnCode Zero on success
+ * @param[in,out] io_ifData Reference to ifData_t which contains initfile data
+ * @param[in] i_id Id of element to push
+ * @param[in,out] io_any Set if ANY op
+ * @param[in] i_arrayIndexIds Array of attribute array index's
+ (when attribute is array type)
+ * @return fapi::ReturnCode Zero on success
*/
fapi::ReturnCode rpnDoPush(ifData_t & io_ifData, const uint16_t i_id,
- uint32_t & io_any, const uint16_t i_arrayIndexId)
+ uint32_t & io_any, const uint16_t i_arrayIndexIds[MAX_ATTRIBUTE_ARRAY_DIMENSION])
{
FAPI_DBG(">> HwpInitFile: rpnDoPush: id 0x%X", i_id);
fapi::ReturnCode l_rc = fapi::FAPI_RC_SUCCESS;
uint64_t l_val = 0;
- uint64_t l_idx = 0;
do
{
- if ((i_id & IF_TYPE_MASK) == IF_VAR_TYPE) //It's an attribute
+ if ((i_id & IF_TYPE_MASK) == IF_ATTR_TYPE) //It's an attribute
{
- if (i_arrayIndexId)
- {
- l_rc = getLit(io_ifData, i_arrayIndexId, l_idx);
-
- if (l_rc)
- {
- break;
- }
- }
-
- l_rc = getAttr(io_ifData, i_id, l_val, l_idx);
-
+ l_rc = getAttr(io_ifData, i_id, l_val, i_arrayIndexIds);
if (l_rc)
{
break;
}
FAPI_DBG("hwpExecInitFile: rpnDoPush: getAttr: id = 0x%X, "
- "value = 0x%llX idx = %u", i_id, l_val, l_idx);
+ "value = 0x%llX", i_id, l_val);
rpnPush(io_ifData.rpnStack, l_val);
}
@@ -1747,7 +1727,7 @@ fapi::ReturnCode rpnDoOp(rpnStack_t * io_rpnStack, IfRpnOp i_op, uint32_t i_any)
*
* @return fapi::ReturnCode Zero on success
*/
-fapi::ReturnCode evalRpn(ifData_t & io_ifData, char * i_expr,
+fapi::ReturnCode evalRpn(ifData_t & io_ifData, char *i_expr,
uint32_t i_len, const bool i_hasExpr)
{
FAPI_DBG(">> hwpExecInitFile: evalRpn");
@@ -1780,24 +1760,50 @@ fapi::ReturnCode evalRpn(ifData_t & io_ifData, char * i_expr,
FAPI_DBG("hwpExecInitFile: evalRpn: id 0x%.2X", l_id);
//Check for attribute of array type
- //1 dimensional support only
- uint16_t l_arrayIndexId = 0;
- if ((l_id & IF_TYPE_MASK) == IF_VAR_TYPE)
+ uint16_t l_arrayIndexs[MAX_ATTRIBUTE_ARRAY_DIMENSION] = {0};
+
+ if ((l_id & IF_TYPE_MASK) == IF_ATTR_TYPE)
{
//Mask out the type bits and zero-based
uint16_t i = (l_id & ~IF_TYPE_MASK) - 1;
- if (SYM_ATTR_UINT8_ARRAY_TYPE <= io_ifData.attrs[i].type)
+ // Get the attribute dimension
+ uint8_t l_attrDimension = io_ifData.attrs[i].type & ATTR_DIMENSION_MASK;
+
+ // Now shift it to the LS nibble
+ l_attrDimension = l_attrDimension >> 4;
+
+ //FAPI_DBG("hwpExecInitFile: evalRpn: Attribute ID:0x%.4X has dimension %u of type 0x%.4X",
+ // l_id,l_attrDimension,io_ifData.attrs[i].type);
+
+ // Read out all dimensions for the attribute
+ for(uint8_t j=0; j<l_attrDimension; j++)
{
- l_arrayIndexId = *(const uint16_t *)i_expr;
+ // Read out array index id
+ uint16_t l_arrayIdxId = 0;
+ memcpy(&l_arrayIdxId,i_expr,2);
+
+ uint64_t l_tmpIdx = 0;
+
+ // Retrieve the actual value for the array index (using it's id)
+ l_rc = getLit(io_ifData,l_arrayIdxId,l_tmpIdx);
+ if (l_rc)
+ {
+ break;
+ }
+ l_arrayIndexs[j] = l_tmpIdx;
i_expr += 2;
i_len -= 2;
- FAPI_DBG("hwpExecInitFile: evalRpn: array index id 0x%.2X",
- l_arrayIndexId);
}
}
- l_rc = rpnDoPush(io_ifData, l_id, l_any, l_arrayIndexId);
+ // Handle error from above for loop
+ if(l_rc)
+ {
+ break;
+ }
+
+ l_rc = rpnDoPush(io_ifData, l_id, l_any, l_arrayIndexs);
}
else
{
@@ -1814,6 +1820,4 @@ fapi::ReturnCode evalRpn(ifData_t & io_ifData, char * i_expr,
return l_rc;
}
-
-
} // extern "C"
OpenPOWER on IntegriCloud