1 /*
2  * (c) 2008-2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>
3  *     economic rights: Technische Universität Dresden (Germany)
4  *
5  * This file is part of TUD:OS and distributed under the terms of the
6  * GNU General Public License 2.
7  * Please see the COPYING-GPL-2 file for details.
8  */
9 #ifndef SIGMA0_REGION_H__
10 #define SIGMA0_REGION_H__
11 
12 #include <l4/cxx/iostream>
13 #include <l4/sys/types.h>
14 
15 class Region
16 {
17 private:
18   mutable unsigned long _l, _h;
19   L4_fpage_rights _rights;
20 
21 public:
22   enum { Owner_mask = 0xfff };
Region()23   Region() : _l(0), _h(0), _rights(L4_FPAGE_RWX) {}
24   Region(unsigned long start, unsigned long end, unsigned owner = 0 /*free*/,
25          L4_fpage_rights rights = L4_FPAGE_RWX)
26   : _l((start & ~Owner_mask) | owner), _h(end), _rights(rights)
27   {
28   }
29 
owner()30   unsigned owner() const { return _l & Owner_mask; }
rights()31   L4_fpage_rights rights() const { return _rights; }
start()32   unsigned long start() const { return _l & ~Owner_mask; }
end()33   unsigned long end() const { return _h; }
restore_range_from(Region const & r)34   void restore_range_from(Region const &r) const
35   {
36     start(r.start());
37     end(r.end());
38   }
39 
owner(unsigned owner)40   void owner(unsigned owner) const { _l = (_l & ~Owner_mask) | owner; }
rights(L4_fpage_rights rights)41   void rights(L4_fpage_rights rights) { _rights = rights; }
start(unsigned long _start)42   void start(unsigned long _start) const
43   { _l = (_l & Owner_mask) | (_start & ~Owner_mask); }
end(unsigned long _end)44   void end(unsigned long _end) const { _h = _end; }
45 
46   bool operator < (Region const &r) const { return end() < r.start(); }
contains(Region const & r)47   bool contains(Region const &r) const
48   { return start() <= r.start() && end() >= r.end(); }
49 
50   bool operator == (Region const &r) const
51   { return start() == r.start() && end() == r.end(); }
52 
valid()53   bool valid() const { return end() >= start(); }
54 
invalid()55   static Region invalid() { return Region(~0UL, 0); }
56 
57   static Region bs(unsigned long start, unsigned long size, unsigned owner = 0,
58                    L4_fpage_rights rights = L4_FPAGE_RWX)
59   {
60     if (size == 0)
61       return invalid();
62 
63     return Region(start, start + size - 1, owner, rights);
64   }
65 
66   static Region kr(unsigned long start, unsigned long end, unsigned owner = 0,
67                    L4_fpage_rights rights = L4_FPAGE_RWX)
68   { return bs(start, end - start, owner, rights); }
69 
70 };
71 
72 template< typename OS >
73 OS &operator << (OS &os, Region const &r)
74 {
75   os << '[' << r.owner() << ':' << ((r.rights() & L4_FPAGE_RO) ? 'R' : '-')
76      << ((r.rights() & L4_FPAGE_W) ? 'W' : '-')
77      << ((r.rights() & L4_FPAGE_X) ? 'X' : '-') << ':' << (void *)r.start() << ';'
78      << (void *)r.end() << ']';
79   return os;
80 }
81 #endif
82