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