source: soft/giet_vm/memo/src/pseg.cpp @ 205

Last change on this file since 205 was 173, checked in by karaoui, 12 years ago

Adding BLOB type for vobj.
Don't forget to set as BLOB type the mapping_info vobj in the xml.

File size: 9.0 KB
Line 
1/* -*- c++ -*-
2 *
3 * SOCLIB_LGPL_HEADER_BEGIN
4 *
5 * This file is part of SoCLib, GNU LGPLv2.1.
6 *
7 * SoCLib is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU Lesser General Public License as published
9 * by the Free Software Foundation; version 2.1 of the License.
10 *
11 * SoCLib is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with SoCLib; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 * 02110-1301 USA
20 *
21 * SOCLIB_LGPL_HEADER_END
22 *
23 * Copyright (c) UPMC, Lip6, SoC
24 *         Mohamed Lamine Karaoui <Mohamed.Karaoui@lip6.fr>, 2012
25 */
26
27#include <algorithm>
28#include <string.h>
29#include <cassert>
30#include <cstring>
31#include <stdexcept>
32
33#include <iostream>
34#include <sstream>
35#include <iomanip>
36
37#include "pseg.h"
38#include "exception.h"
39
40
41/*
42 * VSeg
43 */
44
45const std::string & VSeg::name() const
46{
47        return m_name;
48}
49
50const std::string & VSeg::file() const
51{
52        return m_file;
53}
54
55uintptr_t VSeg::vma() const
56{
57        return m_vma;
58}
59
60uintptr_t VSeg::lma() const
61{
62        return m_lma;
63}
64
65uintptr_t VSeg::length() const
66{
67        return m_length;
68}
69
70void VSeg::print( std::ostream &o ) const
71{
72        o << std::hex << std::noshowbase
73      << "<Virtual segment from(vaddr): 0x" 
74      << std::setw (8) << std::setfill('0') 
75      << m_vma << ", to(paddr) 0x"
76      << std::setw (8) << std::setfill('0') 
77      << m_lma << ", size: 0x"
78      << std::setw (8) << std::setfill('0') 
79      << m_length  << ",ident: " 
80      << (m_ident ? "yes" : "no") << ", in(file): "
81      << m_file << ", name: " << m_name << ">";
82}
83
84VSeg::~VSeg()
85{
86//    std::cout << "Deleted VSeg " << *this << std::endl;
87}
88
89VSeg & VSeg::operator=( const VSeg &ref )
90{
91    if ( &ref == this )
92        return *this;
93
94    //std::cout << "Copying " << ref << " to " << *this << std::endl;
95    m_name = ref.m_name,
96    m_file = ref.m_file;
97    m_vma = ref.m_vma;
98    m_lma = ref.m_lma;
99    m_length = ref.m_length;
100    m_ident = ref.m_ident;
101        return *this;
102}
103
104VSeg::VSeg()
105    : m_name("No Name"),
106      m_file("Empty section"),
107      m_vma(0),
108      m_length(0),
109      m_loadable(false),
110      m_ident(0)
111{
112    //std::cout << "New empty VSeg " << *this << std::endl;
113}
114
115VSeg::VSeg(std::string& binaryName, std::string& name, uintptr_t vma, size_t length, bool loadable, bool ident)
116    : m_name(name),
117      m_file(binaryName),
118      m_vma(vma),
119      m_length(length),
120      m_loadable(loadable),
121      m_ident(ident)
122{
123    //std::cout << "New VSeg " << *this << std::endl;
124}
125
126VSeg::VSeg( const VSeg &ref )
127    : m_name("To be copied"),
128      m_file("Empty"),
129      m_vma(0),
130      m_length(0),
131      m_loadable(false),
132      m_ident(0)
133{
134    //std::cout << "New VSeg " << *this << " copied from " << ref << std::endl;
135    (*this) = ref;
136}
137
138
139
140
141/*
142 * PSeg
143 */
144uintptr_t PSeg::lma() const
145{
146        return m_lma;
147}
148
149uintptr_t PSeg::limit() const
150{
151        return m_limit;
152}
153
154uintptr_t PSeg::length() const
155{
156        return m_length;
157}
158
159uintptr_t PSeg::nextLma() const
160{
161        return m_nextLma;
162}
163
164const std::string & PSeg::name() const
165{
166        return m_name;
167}
168
169void PSeg::check() const
170{
171    size_t size = m_vsegs.size();
172    size_t used[size][2];//lma, lma+length
173    size_t i,j,error=0;
174   
175    std::vector<VSeg>::const_iterator it;
176    for(it = m_vsegs.begin(), i= 0; it < m_vsegs.end(); it++, i++)
177    {
178        size_t it_limit = (*it).lma() + (*it).length();
179        for(j=0; j< i; j++)
180        {
181           if( 
182                (used[j][0] == (*it).lma() /*and (*it).length()?*/) ) //not the same lma ,
183            {
184                error = 1;
185                std::cout << "ok \n";
186            }
187           if( 
188                (used[j][1] == it_limit /*and (*it).legth()?*/))  // and not the same limit
189            {
190                error = 2;
191            }
192           if( 
193                ((used[j][0] < (*it).lma()) and ((*it).lma() < used[j][1] )) ) //lma  within the used slice
194            {
195                error = 3;
196            }
197           if( 
198                ((used[j][0] < it_limit) and (it_limit < used[j][1] )) )//limit not within the used slice
199            {
200                error = 4;
201                std::cout << "limit: " << std::hex << it_limit << std::endl;
202                std::cout << "used[j][0]: " << std::hex << used[j][0] << std::endl;
203                std::cout << "used[j][1]: " << std::hex << used[j][1] << std::endl;
204            }
205            if(error)
206            {
207                std::ostringstream err;
208                err << " Error" << error << " ,ovelapping Buffers:" << std::endl
209                    << *it << std::endl << m_vsegs[j] << std::endl; 
210                throw exception::RunTimeError( err.str().c_str() );
211            }
212
213        }
214        used[i][0] = (*it).lma();
215        used[i][1] = it_limit;
216    }
217}
218
219void PSeg::setName(std::string& name )
220{
221    m_name = name;
222}
223
224size_t PSeg::align( unsigned toAlign, unsigned alignPow2)
225{
226    return ((toAlign + (1 << alignPow2) - 1 ) >> alignPow2) << alignPow2;//page aligned
227}
228
229
230size_t PSeg::pageAlign( size_t toAlign )
231{
232    size_t pgs = pageSize();
233    size_t pageSizePow2 = __builtin_ctz(pgs);
234   
235    return align(toAlign, pageSizePow2);//page aligned
236
237}
238
239void PSeg::setLma( uintptr_t lma )
240{
241    m_lma = lma;
242   
243    m_nextLma = pageAlign(lma);//page aligned
244
245    m_pageLimit = pageAlign(m_lma+m_length); 
246
247    m_limit = (m_lma + m_length);
248
249}
250
251void PSeg::setLength( size_t length )
252{
253    m_length = length;
254
255    m_pageLimit = pageAlign(m_lma+m_length); 
256
257    m_limit = (m_lma + m_length);
258
259    //std::cout << std::hex << " length seted, m_limit: " << m_limit  << std::endl;
260    //std::cout << *this <<std::endl;
261}
262
263void PSeg::add( VSeg& vseg )
264{
265    vseg.m_lma = m_nextLma;
266    incNextLma(vseg.length());//for the next vseg
267    m_vsegs.push_back(vseg); 
268}
269
270void PSeg::addIdent( VSeg& vseg )
271{
272    vseg.m_lma = vseg.m_vma;
273    incNextLma(vseg.length());//to keep track of space used
274    m_vsegs.push_back(vseg); 
275}
276
277void PSeg::setNextLma( uintptr_t nextLma)
278{
279    m_nextLma = nextLma;
280
281    confNextLma();
282}
283
284void PSeg::incNextLma( size_t inc_next)
285{
286
287    m_nextLma += inc_next;
288
289    confNextLma();
290}
291
292void PSeg::confNextLma()
293{
294    if(m_nextLma > m_limit)
295    {
296        std::cerr << "Erreur pseg overflow... nextLma: "
297                  << std::hex << m_nextLma << ", limit: " 
298                  << m_limit << std::endl;
299        exit(1); 
300    }
301
302    m_nextLma = pageAlign( m_nextLma );
303
304    if(m_nextLma > m_pageLimit)
305    {
306        std::cerr << "Erreur pseg page overflow... nextLma: "
307                  << std::hex << m_nextLma << ", limit: " 
308                  << m_pageLimit << std::endl;
309        exit(1); 
310    }
311}
312
313void PSeg::setPageSize(size_t pg)
314{
315    if( pg == 0)
316    {
317        std::cerr << "PageSize must be positive" << std::endl;
318        return;
319    }
320    pageSize() = pg;
321}
322
323size_t& PSeg::pageSize()
324{
325    static size_t m_pageSize;
326    return m_pageSize;
327}
328
329PSeg & PSeg::operator=( const PSeg &ref )
330{
331    if ( &ref == this )
332        return *this;
333
334    //std::cout << "Copying " << ref << " to " << *this << std::endl;
335
336    m_name = ref.m_name;
337    m_length = ref.m_length;
338    m_limit = ref.m_limit;
339    m_pageLimit = ref.m_pageLimit;
340    m_lma = ref.m_lma;
341    m_nextLma = ref.m_nextLma;
342    m_vsegs = ref.m_vsegs;
343
344        return *this;
345}
346
347void PSeg::print( std::ostream &o ) const
348{
349        o << "<Physical segment "
350          << std::showbase << m_name
351          << ", from: " << std::hex
352      << m_lma << " to " << m_limit
353      << ", size : "  << m_length
354      << ", filled to: "  << m_nextLma
355      << ", containing: "<< std::endl;
356        std::vector<VSeg>::const_iterator it;
357        for(it = m_vsegs.begin(); it < m_vsegs.end(); it++)
358    o << " " << *it << std::endl;
359
360    o << ">";
361}
362
363PSeg::PSeg( const std::string &name,
364               uintptr_t lma,
365                size_t length)
366{
367    m_name = name;
368    m_length = length;
369
370    setLma(lma);
371    //std::cout <<"New PSeg :"<< *this ;         
372}
373
374PSeg::PSeg( const std::string &name):
375      m_lma(0),
376      m_length(0),
377      m_nextLma(0),
378      m_limit(0)
379{
380    m_name = name;
381}
382
383PSeg::PSeg( uintptr_t lma):
384      m_name("No name"),
385      m_lma(0),
386      m_length(0),
387      m_nextLma(0),
388      m_limit(0)
389{
390    setLma(lma);
391}
392
393
394PSeg::PSeg()
395    :
396      m_name("Empty section"),
397      m_lma(0),
398      m_length(0),
399      m_nextLma(0),
400      m_limit(0)
401{
402    //std::cout << "New empty PSeg " << *this << std::endl;
403}
404
405PSeg::PSeg( const PSeg &ref )
406    : m_name("To be copied"),
407      m_lma(0),
408      m_length(0),
409      m_nextLma(0),
410      m_limit(0)
411{
412    //std::cout << "New PSeg " << *this << " copied from " << ref << std::endl;
413    (*this) = ref;
414}
415
416PSeg::~PSeg()
417{
418//    std::cout << "Deleted PSeg " << *this << std::endl;
419}
420
421
422
423// Local Variables:
424// tab-width: 4
425// c-basic-offset: 4
426// c-file-offsets:((innamespace . 0)(inline-open . 0))
427// indent-tabs-mode: nil
428// End:
429
430// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
431
Note: See TracBrowser for help on using the repository browser.