2013-05-11 22:28:18 -04:00
|
|
|
namespace factor {
|
2009-05-04 02:46:13 -04:00
|
|
|
|
2013-05-11 22:28:18 -04:00
|
|
|
inline cell align_page(cell a) { return align(a, getpagesize()); }
|
2009-09-25 22:17:20 -04:00
|
|
|
|
2016-06-27 10:27:56 -04:00
|
|
|
bool set_memory_locked(cell base, cell size, bool locked);
|
|
|
|
|
2016-08-21 10:26:04 -04:00
|
|
|
// segments set up guard pages to check for under/overflow.
|
|
|
|
// size must be a multiple of the page size
|
2009-05-04 05:50:24 -04:00
|
|
|
struct segment {
|
2013-05-11 22:28:18 -04:00
|
|
|
cell start;
|
|
|
|
cell size;
|
|
|
|
cell end;
|
2009-09-25 22:17:20 -04:00
|
|
|
|
2013-05-12 21:48:38 -04:00
|
|
|
segment(cell size, bool executable_p);
|
2013-05-11 22:28:18 -04:00
|
|
|
~segment();
|
2010-03-27 07:33:28 -04:00
|
|
|
|
2013-05-11 22:28:18 -04:00
|
|
|
bool underflow_p(cell addr) {
|
2015-08-14 18:06:59 -04:00
|
|
|
return addr >= (start - getpagesize()) && addr < start;
|
2013-05-11 22:28:18 -04:00
|
|
|
}
|
2010-03-27 07:33:28 -04:00
|
|
|
|
2013-05-11 22:28:18 -04:00
|
|
|
bool overflow_p(cell addr) {
|
2015-08-14 18:06:59 -04:00
|
|
|
return addr >= end && addr < (end + getpagesize());
|
2013-05-11 22:28:18 -04:00
|
|
|
}
|
2011-10-25 18:42:08 -04:00
|
|
|
|
2015-08-14 18:06:59 -04:00
|
|
|
bool in_segment_p(cell addr) {
|
|
|
|
return addr >= start && addr < end;
|
|
|
|
}
|
|
|
|
|
2016-06-27 10:27:56 -04:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
|
|
|
cell hi = end;
|
|
|
|
if (!set_memory_locked(hi, pagesize, locked)) {
|
|
|
|
fatal_error("Cannot (un)protect high guard page", hi);
|
|
|
|
}
|
|
|
|
}
|
2009-05-04 02:00:30 -04:00
|
|
|
};
|
2009-05-04 02:46:13 -04:00
|
|
|
|
|
|
|
}
|