12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- #include <support/check.h>
- #include <support/next_to_fault.h>
- #include <support/xunistd.h>
- #include <sys/mman.h>
- #include <sys/param.h>
- struct support_next_to_fault
- support_next_to_fault_allocate (size_t size)
- {
- long page_size = sysconf (_SC_PAGE_SIZE);
- TEST_VERIFY_EXIT (page_size > 0);
- struct support_next_to_fault result;
- result.region_size = roundup (size, page_size) + page_size;
- if (size + page_size <= size || result.region_size <= size)
- FAIL_EXIT1 ("support_next_to_fault_allocate (%zu): overflow", size);
- result.region_start
- = xmmap (NULL, result.region_size, PROT_READ | PROT_WRITE,
- MAP_PRIVATE | MAP_ANONYMOUS, -1);
-
- xmprotect (result.region_start + (result.region_size - page_size),
- page_size, PROT_NONE);
-
- result.buffer = result.region_start + result.region_size - page_size - size;
- result.length = size;
- return result;
- }
- void
- support_next_to_fault_free (struct support_next_to_fault *ntf)
- {
- xmunmap (ntf->region_start, ntf->region_size);
- *ntf = (struct support_next_to_fault) { NULL, };
- }
|