diff options
Diffstat (limited to 'src/usr/ecmddatabuffer/ecmdDataBuffer.C')
-rwxr-xr-x | src/usr/ecmddatabuffer/ecmdDataBuffer.C | 276 |
1 files changed, 0 insertions, 276 deletions
diff --git a/src/usr/ecmddatabuffer/ecmdDataBuffer.C b/src/usr/ecmddatabuffer/ecmdDataBuffer.C deleted file mode 100755 index 4b0323137..000000000 --- a/src/usr/ecmddatabuffer/ecmdDataBuffer.C +++ /dev/null @@ -1,276 +0,0 @@ -// IBM_PROLOG_BEGIN_TAG -// This is an automatically generated prolog. -// -// $Source: src/usr/ecmddatabuffer/ecmdDataBuffer.C $ -// -// IBM CONFIDENTIAL -// -// COPYRIGHT International Business Machines Corp. 2011 -// -// p1 -// -// Object Code Only (OCO) source materials -// Licensed Internal Code Source Materials -// IBM HostBoot Licensed Internal Code -// -// The source code for this program is not published or other- -// wise divested of its trade secrets, irrespective of what has -// been deposited with the U.S. Copyright Office. -// -// Origin: 30 -// -// IBM_PROLOG_END -/** - * @file ecmdDataBuffer.C - * @brief Provides a means to handle data from the eCMD C API - * - ******************************************************************** - * @todo - This is only a temporary file created to compile code. - * We will use John Farrugia's version - ********************************************************************* - */ - -//---------------------------------------------------------------------- -// Includes -//---------------------------------------------------------------------- -#include <stdint.h> -#include <string.h> -#include <trace/interface.H> -#include <ecmdDataBuffer.H> - -#define EDB_ADMIN_TOTAL_SIZE 2 -#define EDB_ADMIN_HEADER_SIZE 1 -#define EDB_ADMIN_FOOTER_SIZE 1 -#define EDB_ADMIN_TOTAL_SIZE 2 -#define EDB_RETURN_CODE 0 -#define EDB_RANDNUM 0x12345678 -#define ECMD_DBUF_BUFFER_OVERFLOW (ECMD_ERR_ECMD | 0x2011) - -// Trace definition -trace_desc_t* g_trac_ecmd = NULL; -TRAC_INIT(&g_trac_ecmd, "ECMD", 4096); - -//--------------------------------------------------------------------- -// Constructors -//--------------------------------------------------------------------- -ecmdDataBufferBase::ecmdDataBufferBase() // Default constructor -: iv_Capacity(0), iv_NumBits(0), iv_Data(NULL), iv_RealData(NULL) -{ - iv_UserOwned = true; -} - -ecmdDataBufferBase::ecmdDataBufferBase(uint32_t i_numBits) -: iv_Capacity(0), iv_NumBits(0), iv_Data(NULL), iv_RealData(NULL) -{ - iv_UserOwned = true; - if (i_numBits > 0) - { - setBitLength(i_numBits); - } -} - -//--------------------------------------------------------------------- -// Destructor -//--------------------------------------------------------------------- -ecmdDataBufferBase::~ecmdDataBufferBase() -{ - // Only call clear() if buffer is owned by this user (ie, not shared) - if (iv_UserOwned) - { - clear(); - } -} - -uint32_t ecmdDataBufferBase::getWordLength() const -{ - return (iv_NumBits + 31) / 32; -} - -uint32_t ecmdDataBufferBase::flushTo0() -{ - uint32_t rc = ECMD_DBUF_SUCCESS; - if (getWordLength() > 0) - { - memset(iv_Data, 0x00, getWordLength() * 4); /* init to 0 */ - } - return rc; -} - - -uint32_t ecmdDataBufferBase::clear() { - uint32_t rc = ECMD_DBUF_SUCCESS; - - if (iv_RealData != NULL) - { - /* That looked okay, reset everything else */ - /* Only do the delete if we alloc'd something */ - if (iv_RealData != iv_LocalData) - { - delete[] iv_RealData; - } - iv_RealData = NULL; - iv_Capacity = 0; - iv_NumBits = 0; - } - return rc; -} - -uint32_t ecmdDataBufferBase::setCapacity(uint32_t i_newCapacity) { - uint32_t rc = ECMD_DBUF_SUCCESS; - - if(!iv_UserOwned) { - TRACFCOMP(g_trac_ecmd, "**** ERROR (ecmdDataBuffer) : Attempt to modify non user owned buffer size."); - return 0; - } - - /* for case where i_newCapacity is 0 (like in unflatten) use iv_LocalData for iv_RealData */ - /* This allows for iv_Data, the header, and the tail to be setup right */ - if (iv_Capacity == 0) { - /* We are using iv_LocalData, so point iv_RealData to the start of that */ - iv_RealData = iv_LocalData; - } - - /* only resize to make the capacity bigger */ - if (iv_Capacity < i_newCapacity) { - iv_Capacity = i_newCapacity; - - /* Now setup iv_RealData */ - if (iv_Capacity <= 2) { - /* We are using iv_LocalData, so point iv_RealData to the start of that */ - iv_RealData = iv_LocalData; - } else { - /* If we are going from <= 64 to > 64, there was no malloc done so can't do delete */ - if ((iv_RealData != NULL) && (iv_RealData != iv_LocalData)) { - delete[] iv_RealData; - } - iv_RealData = NULL; - - iv_RealData = new uint32_t[iv_Capacity + EDB_ADMIN_TOTAL_SIZE]; - if (iv_RealData == NULL) { - TRACFCOMP(g_trac_ecmd, "**** ERROR : ecmdDataBuffer::setCapacity : Unable to allocate memory for new databuffer"); - return 0; - } - } - } - - /* Now setup iv_Data to point into the offset inside of iv_RealData */ - iv_Data = iv_RealData + EDB_ADMIN_HEADER_SIZE; - - /* We are all setup, now init everything to 0 */ - /* We want to do this regardless of if the buffer was resized. */ - /* This function is meant to be a destructive operation */ - /* Ok, now setup the header, and tail */ - iv_RealData[EDB_RETURN_CODE] = 0; ///< Reset error code - iv_RealData[getWordLength() + EDB_ADMIN_HEADER_SIZE] = EDB_RANDNUM; - - rc = flushTo0(); - if (rc) return rc; - - return rc; -} - -uint32_t ecmdDataBufferBase::setBitLength(uint32_t i_newNumBits) { - uint32_t rc = ECMD_DBUF_SUCCESS; - - if ((i_newNumBits == 0) && (iv_NumBits == 0)) { - // Do Nothing: this data doesn't already have iv_RealData,iv_Data defined, and it doesn't want to define it - return rc; - } - - /* Assign i_newNumBits to iv_NumBits and figure out how many words that is */ - iv_NumBits = i_newNumBits; - - /* Now call setCapacity to do all the data buffer resizing and setup */ - rc = setCapacity(getWordLength()); - if (rc) return rc; - - return rc; -} - -uint32_t ecmdDataBufferBase::setDoubleWord(uint32_t i_doublewordoffset, uint64_t i_value) -{ - uint32_t rc = ECMD_DBUF_SUCCESS; - if (i_doublewordoffset >= ((getWordLength()+1)/2)) - { - TRACFCOMP(g_trac_ecmd, "**** ERROR : ecmdDataBuffer::setDoubleWord: doubleWordOffset %d >= NumDoubleWords (%d)", - i_doublewordoffset, ((getWordLength()+1)/2)); - return (ECMD_DBUF_BUFFER_OVERFLOW); - } - - // Create mask if part of this byte is not in the valid part of the ecmdDataBuffer - if (((i_doublewordoffset + 1) == ((getWordLength()+1)/2)) && (iv_NumBits % 64)) - { - uint64_t bitMask = 0xFFFFFFFFFFFFFFFFul; - /* Shift it left by the amount of unused bits */ - bitMask <<= ((64 * ((getWordLength()+1)/2)) - iv_NumBits); - /* Clear the unused bits */ - i_value &= bitMask; - } - uint32_t hivalue = (uint32_t)((i_value & 0xFFFFFFFF00000000ul) >> 32); - uint32_t lovalue = (uint32_t)((i_value & 0x00000000FFFFFFFFul)); - - iv_Data[i_doublewordoffset*2] = hivalue; - /* Don't set the second word if we are on oddwords */ - if (!((i_doublewordoffset*2)+1 >= getWordLength()) ) { - iv_Data[(i_doublewordoffset*2)+1] = lovalue; - } - return rc; -} - -uint64_t ecmdDataBufferBase::getDoubleWord(uint32_t i_doublewordoffset) const -{ - // Round up to the next word and check length - if (i_doublewordoffset >= ((getWordLength()+1)/2)) - { - TRACFCOMP(g_trac_ecmd, "**** ERROR : ecmdDataBuffer::getDoubleWord: doubleWordOffset %d >= NumDoubleWords (%d)", - i_doublewordoffset, ((getWordLength()+1)/2)); - return 0; - } - uint64_t ret; - ret = ((uint64_t)(iv_Data[i_doublewordoffset*2])) << 32; - // If we have an odd length of words we can't pull the second word if we are at the end - if (!((i_doublewordoffset*2)+1 >= getWordLength()) ) { - ret |= iv_Data[(i_doublewordoffset*2)+1]; - } - return ret; -} - -uint32_t ecmdDataBufferBase::setWord(uint32_t i_wordOffset, uint32_t i_value) -{ - uint32_t rc = ECMD_DBUF_SUCCESS; - - if (i_wordOffset >= getWordLength()) - { - TRACFCOMP(g_trac_ecmd, "**** ERROR : ecmdDataBuffer::setWord: wordoffset %d >= NumWords (%d)", i_wordOffset, getWordLength()); - return (ECMD_DBUF_BUFFER_OVERFLOW); - } - - // Create mask if part of this word is not in the valid part of the ecmdDataBuffer - if (((i_wordOffset + 1) == getWordLength()) && (iv_NumBits % 32)) - { - /* Create my mask */ - uint32_t bitMask = 0xFFFFFFFF; - /* Shift it left by the amount of unused bits */ - bitMask <<= ((32 * getWordLength()) - iv_NumBits); - /* Clear the unused bits */ - i_value &= bitMask; - } - - iv_Data[i_wordOffset] = i_value; - - return rc; -} - -uint32_t ecmdDataBufferBase::getWord(uint32_t i_wordOffset) const -{ - if (i_wordOffset >= getWordLength()) - { - TRACFCOMP(g_trac_ecmd,"**** ERROR : ecmdDataBuffer::getWord: i_wordOffset %d >= NumWords (%d)", - i_wordOffset, getWordLength()); - return 0; - } - - return this->iv_Data[i_wordOffset]; -} - - |