-namespace factor
-{
+namespace factor {
-inline cell align_page(cell a)
-{
- return align(a,getpagesize());
-}
+inline cell align_page(cell a) { return align(a, getpagesize()); }
+
+bool set_memory_locked(cell base, cell size, bool locked);
-/* segments set up guard pages to check for under/overflow.
-size must be a multiple of the page size */
+// segments set up guard pages to check for under/overflow.
+// size must be a multiple of the page size
struct segment {
- cell start;
- cell size;
- cell end;
+ cell start;
+ cell size;
+ cell end;
+
+ segment(cell size, bool executable_p);
+ ~segment();
+
+ bool underflow_p(cell addr) {
+ return addr >= (start - getpagesize()) && addr < start;
+ }
+
+ bool overflow_p(cell addr) {
+ return addr >= end && addr < (end + getpagesize());
+ }
+
+ bool in_segment_p(cell addr) {
+ return addr >= start && addr < end;
+ }
+
+ void set_border_locked(bool locked) {
+ int pagesize = getpagesize();
+ cell lo = start - pagesize;
+ if (!set_memory_locked(lo, pagesize, locked)) {
+ fatal_error("Cannot (un)protect low guard page", lo);
+ }
- explicit segment(cell size);
- ~segment();
+ cell hi = end;
+ if (!set_memory_locked(hi, pagesize, locked)) {
+ fatal_error("Cannot (un)protect high guard page", hi);
+ }
+ }
};
}