72 lines
1.5 KiB
Plaintext
72 lines
1.5 KiB
Plaintext
static void *
|
|
os_pages_map(void *addr, size_t size, size_t alignment, bool *commit) {
|
|
assert(ALIGNMENT_ADDR2BASE(addr, os_page) == (vaddr_t)addr);
|
|
assert(ALIGNMENT_CEILING(size, os_page) == size);
|
|
assert(size != 0);
|
|
/* Non-NULL addresses don't work in CheriABI */
|
|
if (addr != NULL)
|
|
return (NULL);
|
|
|
|
if (os_overcommits) {
|
|
*commit = true;
|
|
}
|
|
|
|
void *ret;
|
|
|
|
ret = MALLOCCHERI(size);
|
|
|
|
assert(ret != NULL);
|
|
|
|
if (addr != NULL && ret != addr) {
|
|
/*
|
|
* We succeeded in mapping memory, but not in the right place.
|
|
*/
|
|
os_pages_unmap(ret, size);
|
|
ret = NULL;
|
|
}
|
|
}
|
|
|
|
|
|
void *
|
|
pages_map(void *addr, size_t size, size_t alignment, bool *commit) {
|
|
assert(alignment >= PAGE);
|
|
assert(ALIGNMENT_ADDR2BASE(addr, alignment) == (vaddr_t)addr);
|
|
|
|
if (size & ~CHERI_REPRESENTABLE_ALIGNMENT_MASK(size))
|
|
abort();
|
|
|
|
...
|
|
|
|
void *ret = MALLOCCHERI(size); // replaced instead of mmap
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
static bool
|
|
pages_commit_impl(void *addr, size_t size, bool commit) {
|
|
assert(PAGE_ADDR2BASE(addr) == addr);
|
|
assert(PAGE_CEILING(size) == size);
|
|
|
|
...
|
|
|
|
void *result = MALLOCCHERI(size); // replaced instead of mmap
|
|
if (result != addr) {
|
|
/*
|
|
* We succeeded in mapping memory, but not in the right
|
|
* place.
|
|
*/
|
|
os_pages_unmap(result, size);
|
|
return true;
|
|
}
|
|
return false;
|
|
|
|
}
|
|
|
|
static void
|
|
os_pages_unmap(void *addr, size_t size) {
|
|
assert(ALIGNMENT_ADDR2BASE(addr, os_page) == (vaddr_t)addr);
|
|
assert(ALIGNMENT_CEILING(size, os_page) == size);
|
|
|
|
FREECHERI(addr);
|
|
} |