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 */
CreateBufferAccessor(TrcMemAccessorBase ** pAccessor,const ocsd_vaddr_t s_address,const uint8_t * p_buffer,const uint32_t size)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
CreateFileAccessor(TrcMemAccessorBase ** pAccessor,const std::string & pathToFile,ocsd_vaddr_t startAddr,size_t offset,size_t size)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
CreateCBAccessor(TrcMemAccessorBase ** pAccessor,const ocsd_vaddr_t s_address,const ocsd_vaddr_t e_address,const ocsd_mem_space_acc_t mem_space)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 */
DestroyAccessor(TrcMemAccessorBase * pAccessor)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 */
getMemAccString(std::string & accStr) const97 void TrcMemAccessorBase::getMemAccString(std::string& accStr) const
98 {
99 std::ostringstream oss;
100 std::string spaceStr;
101
102 switch (m_type)
103 {
104 case MEMACC_FILE:
105 oss << "FileAcc; Range::0x";
106 break;
107
108 case MEMACC_BUFPTR:
109 oss << "BuffAcc; Range::0x";
110 break;
111
112 case MEMACC_CB_IF:
113 oss << "CB Acc; Range::0x";
114 break;
115
116 default:
117 oss << "UnknAcc; Range::0x";
118 break;
119 }
120 oss << std::hex << std::setw(2) << std::setfill('0') << m_startAddress << ":" << m_endAddress;
121 oss << "; Mem Space::";
122 getMemAccSpaceString(spaceStr, m_mem_space);
123 oss << spaceStr;
124
125 accStr = oss.str();
126 }
127
getMemAccSpaceString(std::string & spaceStr,const ocsd_mem_space_acc_t mem_space)128 void TrcMemAccessorBase::getMemAccSpaceString(std::string &spaceStr, const ocsd_mem_space_acc_t mem_space)
129 {
130 std::ostringstream oss;
131
132 switch(mem_space)
133 {
134 case OCSD_MEM_SPACE_EL1S: oss << "EL1S"; break;
135 case OCSD_MEM_SPACE_EL1N: oss << "EL1N"; break;
136 case OCSD_MEM_SPACE_EL2: oss << "EL2N"; break;
137 case OCSD_MEM_SPACE_EL3: oss << "EL3"; break;
138 case OCSD_MEM_SPACE_EL2S: oss << "EL2S"; break;
139 case OCSD_MEM_SPACE_EL1R: oss << "EL1R"; break;
140 case OCSD_MEM_SPACE_EL2R: oss << "EL2R"; break;
141 case OCSD_MEM_SPACE_ROOT: oss << "Root"; break;
142 case OCSD_MEM_SPACE_S: oss << "Any S"; break;
143 case OCSD_MEM_SPACE_N: oss << "Any NS"; break;
144 case OCSD_MEM_SPACE_R: oss << "Any R"; break;
145 case OCSD_MEM_SPACE_ANY: oss << "Any"; break;
146
147 default:
148 {
149 uint8_t MSBits = (uint8_t)mem_space;
150 if(MSBits & (uint8_t)OCSD_MEM_SPACE_EL1S)
151 oss << "EL1S,";
152 if(MSBits & (uint8_t)OCSD_MEM_SPACE_EL1N)
153 oss << "EL1N,";
154 if(MSBits & (uint8_t)OCSD_MEM_SPACE_EL2)
155 oss << "EL2N,";
156 if(MSBits & (uint8_t)OCSD_MEM_SPACE_EL3)
157 oss << "EL3,";
158 if (MSBits & (uint8_t)OCSD_MEM_SPACE_EL2S)
159 oss << "EL2S,";
160 if (MSBits & (uint8_t)OCSD_MEM_SPACE_EL1R)
161 oss << "EL1R,";
162 if (MSBits & (uint8_t)OCSD_MEM_SPACE_EL2R)
163 oss << "EL2R,";
164 if (MSBits & (uint8_t)OCSD_MEM_SPACE_ROOT)
165 oss << "Root,";
166 }
167 break;
168 }
169 spaceStr = oss.str();
170 }
171
172 /* End of File trc_mem_acc_base.cpp */
173