5 #include "types-arch.h"
6 #include "std_macros.h"
10 template< typename a, typename b > inline
11 a nonull_static_cast( b p )
13 Address d = reinterpret_cast<Address>
14 (static_cast<a>(reinterpret_cast<b>(10))) - 10;
15 return reinterpret_cast<a>( reinterpret_cast<Address>(p) + d);
18 template< typename VALUE, typename TARGET >
23 typedef TARGET Target;
24 struct Type_conversion_error;
28 explicit Number(Value v) : _v(v) {}
32 static Target create(Value v)
35 Target operator = (Target o)
36 { _v = o._v; return *static_cast<Target*>(this); }
38 Value value() const { return _v; }
39 void set_value(Value v) { _v = v; }
41 bool operator < (Target const &o) const { return _v < o._v; }
42 bool operator > (Target const &o) const { return _v > o._v; }
43 bool operator <= (Target const &o) const { return _v <= o._v; }
44 bool operator >= (Target const &o) const { return _v >= o._v; }
45 bool operator == (Target const &o) const { return _v == o._v; }
46 bool operator != (Target const &o) const { return _v != o._v; }
48 operator Type_conversion_error const * () const
49 { return (Type_conversion_error const *)_v; }
51 Target operator | (Target const &o) const
52 { return Target(_v | o._v); }
54 Target operator & (Target const &o) const
55 { return Target(_v & o._v); }
57 Target operator + (Target const &o) const
58 { return Target(_v + o._v); }
60 Target operator - (Target const &o) const
61 { return Target(_v - o._v); }
63 Target operator << (unsigned long s) const
64 { return Target(_v << s); }
66 Target operator >> (unsigned long s) const
67 { return Target(_v >> s); }
69 void operator += (Target const &o) { _v += o._v; }
70 void operator -= (Target const &o) { _v -= o._v; }
71 void operator <<= (unsigned long s) { _v <<= s; }
72 void operator >>= (unsigned long s) { _v >>= s; }
74 Target operator ++ () { return Target(++_v); }
75 Target operator ++ (int) { return Target(_v++); }
77 Target operator -- () { return Target(--_v); }
78 Target operator -- (int) { return Target(_v--); }
80 Target trunc(Target const &size) const
81 { return Target(_v & ~(size._v - 1)); }
83 Target offset(Target const &size) const
84 { return Target(_v & (size._v - 1)); }
86 static Target from_shift(unsigned char shift)
88 if (shift >= (int)sizeof(Value) * 8)
89 return Target(Value(1) << Value((sizeof(Value) * 8 - 1)));
90 return Target(Value(1) << Value(shift));
98 class Page_addr : public Number<Address, Page_addr<SHIFT> >
101 typedef Number<Address, Page_addr<SHIFT> > B;
108 Address __shift(Address x, Itt<true>) { return x << SH; }
111 Address __shift(Address x, Itt<false>) { return x >> (-SH); }
114 enum { Shift = SHIFT };
116 template< int OSHIFT >
117 Page_addr(Page_addr<OSHIFT> o)
118 : B(__shift<Shift-OSHIFT>(o.value(), Itt<(OSHIFT < Shift)>()))
121 explicit Page_addr(Address a) : B(a) {}
128 class Virt_addr : public Page_addr<ARCH_PAGE_SHIFT>
131 template< int OSHIFT >
132 Virt_addr(Page_addr<OSHIFT> o) : Page_addr<ARCH_PAGE_SHIFT>(o) {}
134 explicit Virt_addr(unsigned int a) : Page_addr<ARCH_PAGE_SHIFT>(a) {}
135 explicit Virt_addr(int a) : Page_addr<ARCH_PAGE_SHIFT>(a) {}
136 explicit Virt_addr(long int a) : Page_addr<ARCH_PAGE_SHIFT>(a) {}
137 explicit Virt_addr(unsigned long a) : Page_addr<ARCH_PAGE_SHIFT>(a) {}
138 explicit Virt_addr(void *a) : Page_addr<ARCH_PAGE_SHIFT>(Address(a)) {}
143 typedef Page_addr<ARCH_PAGE_SHIFT> Virt_size;
145 typedef Page_addr<0> Page_number;
146 typedef Page_number Page_count;
150 /// standard size type
151 ///typedef mword_t size_t;
152 ///typedef signed int ssize_t;
154 /// momentary only used in UX since there the kernel has a different
155 /// address space than user mode applications
156 enum Address_type { ADDR_KERNEL = 0, ADDR_USER = 1, ADDR_UNKNOWN = 2 };