5 #include "types-arch.h"
6 #include "std_macros.h"
10 #include <type_traits>
13 template< typename a, typename b > inline
14 a nonull_static_cast( b p )
16 Address d = reinterpret_cast<Address>
17 (static_cast<a>(reinterpret_cast<b>(10))) - 10;
18 return reinterpret_cast<a>( reinterpret_cast<Address>(p) + d);
21 template< typename T >
22 T access_once(T const *a)
25 __asm__ __volatile__ ( "" : "=m"(*const_cast<T*>(a)));
27 __asm__ __volatile__ ( "" : "=m"(*const_cast<T*>(a)));
30 return *static_cast<T const volatile *>(a);
34 template< typename T >
35 void write_now(T *a, T const &val)
37 __asm__ __volatile__ ( "" : "=m"(*a));
39 __asm__ __volatile__ ( "" : : "m"(*a));
42 template< typename T >
47 Static_object(Static_object const &) = delete;
48 Static_object &operator = (Static_object const &) = delete;
55 return reinterpret_cast<T*>(&_i[0]);
58 operator T * () const { return get(); }
59 T *operator -> () const { return get(); }
62 { return new (_i) T; }
64 template< typename... A >
65 T *construct(A&&... args)
66 { return new (_i) T(cxx::forward<A>(args)...); }
69 mutable char __attribute__((aligned(sizeof(Mword)*2))) _i[sizeof(T)];
73 template< typename VALUE, typename TARGET >
78 typedef TARGET Target;
79 struct Type_conversion_error;
83 explicit Number(Value v) : _v(v) {}
87 static Target create(Value v)
90 Target operator = (Target o)
91 { _v = o._v; return *static_cast<Target*>(this); }
93 Value value() const { return _v; }
94 Value value() const volatile { return _v; }
95 void set_value(Value v) { _v = v; }
97 bool operator < (Target const &o) const { return _v < o._v; }
98 bool operator > (Target const &o) const { return _v > o._v; }
99 bool operator <= (Target const &o) const { return _v <= o._v; }
100 bool operator >= (Target const &o) const { return _v >= o._v; }
101 bool operator == (Target const &o) const { return _v == o._v; }
102 bool operator != (Target const &o) const { return _v != o._v; }
104 operator Type_conversion_error const * () const
105 { return (Type_conversion_error const *)_v; }
107 Target operator | (Target const &o) const
108 { return Target(_v | o._v); }
110 Target operator & (Target const &o) const
111 { return Target(_v & o._v); }
113 Target operator + (Target const &o) const
114 { return Target(_v + o._v); }
116 Target operator - (Target const &o) const
117 { return Target(_v - o._v); }
119 Target operator << (unsigned long s) const
120 { return Target(_v << s); }
122 Target operator >> (unsigned long s) const
123 { return Target(_v >> s); }
125 void operator += (Target const &o) { _v += o._v; }
126 void operator -= (Target const &o) { _v -= o._v; }
127 void operator <<= (unsigned long s) { _v <<= s; }
128 void operator >>= (unsigned long s) { _v >>= s; }
130 Target operator ++ () { return Target(++_v); }
131 Target operator ++ (int) { return Target(_v++); }
133 Target operator -- () { return Target(--_v); }
134 Target operator -- (int) { return Target(_v--); }
136 Target trunc(Target const &size) const
137 { return Target(_v & ~(size._v - 1)); }
139 Target offset(Target const &size) const
140 { return Target(_v & (size._v - 1)); }
142 static Target from_shift(unsigned char shift)
144 if (shift >= (int)sizeof(Value) * 8)
145 return Target(Value(1) << Value((sizeof(Value) * 8 - 1)));
146 return Target(Value(1) << Value(shift));
153 template< int SHIFT >
154 class Page_addr : public Number<Address, Page_addr<SHIFT> >
157 typedef Number<Address, Page_addr<SHIFT> > B;
164 Address __shift(Address x, Itt<true>) { return x << SH; }
167 Address __shift(Address x, Itt<false>) { return x >> (-SH); }
170 enum { Shift = SHIFT };
172 template< int OSHIFT >
173 Page_addr(Page_addr<OSHIFT> o)
174 : B(__shift<Shift-OSHIFT>(o.value(), Itt<(OSHIFT < Shift)>()))
177 explicit Page_addr(Address a) : B(a) {}
179 Page_addr(Page_addr const volatile &o) : B(o.value()) {}
180 Page_addr(Page_addr const &o) : B(o.value()) {}
185 class Virt_addr : public Page_addr<ARCH_PAGE_SHIFT>
188 template< int OSHIFT >
189 Virt_addr(Page_addr<OSHIFT> o) : Page_addr<ARCH_PAGE_SHIFT>(o) {}
191 explicit Virt_addr(unsigned int a) : Page_addr<ARCH_PAGE_SHIFT>(a) {}
192 explicit Virt_addr(int a) : Page_addr<ARCH_PAGE_SHIFT>(a) {}
193 explicit Virt_addr(long int a) : Page_addr<ARCH_PAGE_SHIFT>(a) {}
194 explicit Virt_addr(unsigned long a) : Page_addr<ARCH_PAGE_SHIFT>(a) {}
195 Virt_addr(void *a) : Page_addr<ARCH_PAGE_SHIFT>(Address(a)) {}
200 typedef Page_addr<ARCH_PAGE_SHIFT> Virt_size;
202 typedef Page_addr<0> Page_number;
203 typedef Page_number Page_count;
206 struct Simple_ptr_policy
208 typedef T &Deref_type;
210 typedef T *Member_type;
211 typedef T *Storage_type;
213 static void init(Storage_type const &) {}
214 static void init(Storage_type &d, Storage_type const &s) { d = s; }
215 static void copy(Storage_type &d, Storage_type const &s) { d = s; }
216 static void destroy(Storage_type const &) {}
217 static Deref_type deref(Storage_type p) { return *p; }
218 static Member_type member(Storage_type p) { return p; }
219 static Ptr_type ptr(Storage_type p) { return p; }
223 struct Simple_ptr_policy<void>
225 typedef void Deref_type;
226 typedef void *Ptr_type;
227 typedef void Member_type;
228 typedef void *Storage_type;
230 static void init(Storage_type const &) {}
231 static void init(Storage_type &d, Storage_type const &s) { d = s; }
232 static void copy(Storage_type &d, Storage_type const &s) { d = s; }
233 static void destroy(Storage_type const &) {}
234 static Deref_type deref(Storage_type p);
235 static Member_type member(Storage_type p);
236 static Ptr_type ptr(Storage_type p) { return p; }
240 template<typename T, template<typename P> class Policy = Simple_ptr_policy,
241 typename Discriminator = int>
245 struct Null_check_type;
247 typedef typename Policy<T>::Deref_type Deref_type;
248 typedef typename Policy<T>::Ptr_type Ptr_type;
249 typedef typename Policy<T>::Member_type Member_type;
250 typedef typename Policy<T>::Storage_type Storage_type;
252 template<typename A, template<typename X> class B, typename C>
253 friend class Smart_ptr;
260 { Policy<T>::init(_p); }
262 explicit Smart_ptr(T *p)
263 { Policy<T>::init(_p, p); }
265 Smart_ptr(Smart_ptr const &o)
266 { Policy<T>::copy(_p, o._p); }
268 template< typename RHT >
269 Smart_ptr(Smart_ptr<RHT, Policy, Discriminator> const &o)
270 { Policy<T>::copy(_p, o._p); }
273 { Policy<T>::destroy(_p); }
275 Smart_ptr operator = (Smart_ptr const &o)
280 Policy<T>::destroy(_p);
281 Policy<T>::copy(_p, o._p);
285 Deref_type operator * () const
286 { return Policy<T>::deref(_p); }
288 Member_type operator -> () const
289 { return Policy<T>::member(_p); }
292 { return Policy<T>::ptr(_p); }
294 operator Null_check_type const * () const
295 { return reinterpret_cast<Null_check_type const *>(Policy<T>::ptr(_p)); }
298 enum User_ptr_discr {};
303 typedef Smart_ptr<T, Simple_ptr_policy, User_ptr_discr> Ptr;
307 /// standard size type
308 ///typedef mword_t size_t;
309 ///typedef signed int ssize_t;
311 /// momentary only used in UX since there the kernel has a different
312 /// address space than user mode applications
313 enum Address_type { ADDR_KERNEL = 0, ADDR_USER = 1, ADDR_UNKNOWN = 2 };