2 * (c) 2008-2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
3 * Alexander Warg <warg@os.inf.tu-dresden.de>
4 * economic rights: Technische Universität Dresden (Germany)
6 * This file is part of TUD:OS and distributed under the terms of the
7 * GNU General Public License 2.
8 * Please see the COPYING-GPL-2 file for details.
12 #include "dataspace.h"
16 class Dataspace_noncont : public Dataspace
21 Page_addr_mask = ~((1UL << 12)-1),
31 Page() throw() : p(0) {}
32 void *operator * () const throw() { return (void*)(p & Page_addr_mask); }
33 bool valid() const throw() { return p & Page_addr_mask;}
34 unsigned long flags() const throw() { return p & ~Page_addr_mask; }
36 void set(void *addr, unsigned long flags) throw()
37 { p = ((unsigned long)addr & Page_addr_mask) | (flags & ~Page_addr_mask); }
39 void flags(unsigned long add, unsigned long del = 0) throw()
41 p = (p & Page_addr_mask & ~(del & ~Page_addr_mask))
42 | ((unsigned long)add & ~Page_addr_mask);
45 void addr(void *a) throw()
46 { p = (p & ~Page_addr_mask) | ((unsigned long)a & Page_addr_mask); }
49 bool is_static() const throw() { return false; }
51 Dataspace_noncont(unsigned long size, unsigned long flags = Writable) throw()
52 : Dataspace(size, flags | Cow_enabled, L4_LOG2_PAGESIZE), pages(0)
55 virtual ~Dataspace_noncont() {}
57 Address address(l4_addr_t offset,
58 Ds_rw rw = Writable, l4_addr_t hot_spot = 0,
59 l4_addr_t min = 0, l4_addr_t max = ~0) const;
60 void unmap(bool ro = false) const throw();
62 int pre_allocate(l4_addr_t offset, l4_size_t size, unsigned rights);
64 virtual Page &page(unsigned long offs) const throw() = 0;
65 virtual Page &alloc_page(unsigned long offs) const = 0;
67 unsigned long num_pages() const throw()
68 { return (size()+page_size()-1) / page_size(); }
72 unsigned idx_of(unsigned long offset) const { return offset >> 12; }
74 void *page(unsigned idx) const
75 { return (void*)(pages[idx] & Page_addr_mask); }
76 unsigned flags(unsigned idx) const { return pages[idx] & ~Page_addr_mask; }
77 void page(unsigned idx, void *page, unsigned flags = 0) const
79 pages[idx] = (unsigned long)page & Page_addr_mask | flags
84 void free_page(Page &p) const throw();
85 void unmap_page(Page const &p, bool ro = false) const throw();
88 long clear(unsigned long offs, unsigned long size) const throw();
90 static Dataspace_noncont *create(Q_alloc *q, unsigned long size,
91 unsigned long flags = Writable);