]> gitweb.factorcode.org Git - factor.git/blobdiff - vm/segments.hpp
alien.c-types: not necessary to import `short` differently anymore
[factor.git] / vm / segments.hpp
index 1884526ad2615f777058a37b73a01d566222baf0..81c8d71beb5a4eed8cbf8e2034e982087e727bb5 100644 (file)
@@ -1,23 +1,43 @@
-namespace factor
-{
+namespace factor {
 
-struct factor_vm;
+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 {
-       factor_vm *myvm;
-       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);
+    }
 
-       segment(factor_vm *myvm, cell size);
-       ~segment();
+    cell hi = end;
+    if (!set_memory_locked(hi, pagesize, locked)) {
+      fatal_error("Cannot (un)protect high guard page", hi);
+    }
+  }
 };
 
 }