]> gitweb.factorcode.org Git - factor.git/blob - vm/segments.hpp
webapps.wiki: adding search bar
[factor.git] / vm / segments.hpp
1 namespace factor {
2
3 inline cell align_page(cell a) { return align(a, getpagesize()); }
4
5 bool set_memory_locked(cell base, cell size, bool locked);
6
7 // segments set up guard pages to check for under/overflow.
8 // size must be a multiple of the page size
9 struct segment {
10   cell start;
11   cell size;
12   cell end;
13
14   segment(cell size, bool executable_p);
15   ~segment();
16
17   bool underflow_p(cell addr) {
18     return addr >= (start - getpagesize()) && addr < start;
19   }
20
21   bool overflow_p(cell addr) {
22     return addr >= end && addr < (end + getpagesize());
23   }
24
25   bool in_segment_p(cell addr) {
26     return addr >= start && addr < end;
27   }
28
29   void set_border_locked(bool locked) {
30     int pagesize = getpagesize();
31     cell lo = start - pagesize;
32     if (!set_memory_locked(lo, pagesize, locked)) {
33       fatal_error("Cannot (un)protect low guard page", lo);
34     }
35
36     cell hi = end;
37     if (!set_memory_locked(hi, pagesize, locked)) {
38       fatal_error("Cannot (un)protect high guard page", hi);
39     }
40   }
41 };
42
43 }