1 /*! 2 * \file trc_mem_acc_base.cpp 3 * \brief OpenCSD : Trace memory accessor base class. 4 * 5 * \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved. 6 */ 7 8 9 /* 10 * Redistribution and use in source and binary forms, with or without modification, 11 * are permitted provided that the following conditions are met: 12 * 13 * 1. Redistributions of source code must retain the above copyright notice, 14 * this list of conditions and the following disclaimer. 15 * 16 * 2. Redistributions in binary form must reproduce the above copyright notice, 17 * this list of conditions and the following disclaimer in the documentation 18 * and/or other materials provided with the distribution. 19 * 20 * 3. Neither the name of the copyright holder nor the names of its contributors 21 * may be used to endorse or promote products derived from this software without 22 * specific prior written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND 25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 26 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 27 * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 28 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 29 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 30 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 31 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 33 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34 */ 35 36 #include "mem_acc/trc_mem_acc_base.h" 37 #include "mem_acc/trc_mem_acc_file.h" 38 #include "mem_acc/trc_mem_acc_cb.h" 39 #include "mem_acc/trc_mem_acc_bufptr.h" 40 41 #include <sstream> 42 #include <iomanip> 43 44 /** Accessor Creation */ 45 ocsd_err_t TrcMemAccFactory::CreateBufferAccessor(TrcMemAccessorBase **pAccessor, const ocsd_vaddr_t s_address, const uint8_t *p_buffer, const uint32_t size) 46 { 47 ocsd_err_t err = OCSD_OK; 48 TrcMemAccessorBase *pAcc = 0; 49 pAcc = new (std::nothrow) TrcMemAccBufPtr(s_address,p_buffer,size); 50 if(pAcc == 0) 51 err = OCSD_ERR_MEM; 52 *pAccessor = pAcc; 53 return err; 54 } 55 56 ocsd_err_t TrcMemAccFactory::CreateFileAccessor(TrcMemAccessorBase **pAccessor, const std::string &pathToFile, ocsd_vaddr_t startAddr, size_t offset /*= 0*/, size_t size /*= 0*/) 57 { 58 ocsd_err_t err = OCSD_OK; 59 TrcMemAccessorFile *pFileAccessor = 0; 60 err = TrcMemAccessorFile::createFileAccessor(&pFileAccessor, pathToFile, startAddr, offset,size); 61 *pAccessor = pFileAccessor; 62 return err; 63 } 64 65 ocsd_err_t TrcMemAccFactory::CreateCBAccessor(TrcMemAccessorBase **pAccessor, const ocsd_vaddr_t s_address, const ocsd_vaddr_t e_address, const ocsd_mem_space_acc_t mem_space) 66 { 67 ocsd_err_t err = OCSD_OK; 68 TrcMemAccessorBase *pAcc = 0; 69 pAcc = new (std::nothrow) TrcMemAccCB(s_address,e_address,mem_space); 70 if(pAcc == 0) 71 err = OCSD_ERR_MEM; 72 *pAccessor = pAcc; 73 return err; 74 } 75 76 /** Accessor Destruction */ 77 void TrcMemAccFactory::DestroyAccessor(TrcMemAccessorBase *pAccessor) 78 { 79 switch(pAccessor->getType()) 80 { 81 case TrcMemAccessorBase::MEMACC_FILE: 82 TrcMemAccessorFile::destroyFileAccessor(dynamic_cast<TrcMemAccessorFile *>(pAccessor)); 83 break; 84 85 case TrcMemAccessorBase::MEMACC_CB_IF: 86 case TrcMemAccessorBase::MEMACC_BUFPTR: 87 delete pAccessor; 88 break; 89 90 default: 91 break; 92 } 93 } 94 95 96 /* memory access info logging */ 97 void TrcMemAccessorBase::getMemAccString(std::string &accStr) const 98 { 99 std::ostringstream oss; 100 101 switch(m_type) 102 { 103 case MEMACC_FILE: 104 oss << "FileAcc; Range::0x"; 105 break; 106 107 case MEMACC_BUFPTR: 108 oss << "BuffAcc; Range::0x"; 109 break; 110 111 case MEMACC_CB_IF: 112 oss << "CB Acc; Range::0x"; 113 break; 114 115 default: 116 oss << "UnknAcc; Range::0x"; 117 break; 118 } 119 oss << std::hex << std::setw(2) << std::setfill('0') << m_startAddress << ":" << m_endAddress; 120 oss << "; Mem Space::"; 121 switch(m_mem_space) 122 { 123 case OCSD_MEM_SPACE_EL1S: oss << "EL1S"; break; 124 case OCSD_MEM_SPACE_EL1N: oss << "EL1N"; break; 125 case OCSD_MEM_SPACE_EL2: oss << "EL2"; break; 126 case OCSD_MEM_SPACE_EL3: oss << "EL3"; break; 127 case OCSD_MEM_SPACE_S: oss << "Any S"; break; 128 case OCSD_MEM_SPACE_N: oss << "Any NS"; break; 129 case OCSD_MEM_SPACE_ANY: oss << "Any"; break; 130 131 default: 132 { 133 uint8_t MSBits = (uint8_t)m_mem_space; 134 if(MSBits & (uint8_t)OCSD_MEM_SPACE_EL1S) 135 oss << "EL1S,"; 136 if(MSBits & (uint8_t)OCSD_MEM_SPACE_EL1N) 137 oss << "EL1N,"; 138 if(MSBits & (uint8_t)OCSD_MEM_SPACE_EL2) 139 oss << "EL2,"; 140 if(MSBits & (uint8_t)OCSD_MEM_SPACE_EL3) 141 oss << "EL3,"; 142 } 143 break; 144 } 145 accStr = oss.str(); 146 } 147 148 /* End of File trc_mem_acc_base.cpp */ 149