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