From 24ae5d704ee6b01d61c148dedc45e31acafbc571 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Mon, 26 Aug 2019 18:57:45 +0100 Subject: [PATCH] darwin: override zero/non zeroed pages to tag them. --- src/pal/pal_apple.h | 50 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/pal/pal_apple.h b/src/pal/pal_apple.h index cc9a96d..d2d6049 100644 --- a/src/pal/pal_apple.h +++ b/src/pal/pal_apple.h @@ -22,6 +22,56 @@ namespace snmalloc * should add any required features. */ static constexpr uint64_t pal_features = PALBSD::pal_features; + + // OS specific function for zeroing memory with ID 241. + template + void zero(void* p, size_t size) + { + if (page_aligned || bits::is_aligned_block(p, size)) + { + assert(bits::is_aligned_block(p, size)); + void* r = mmap( + p, + size, + PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, + pal_anon_id, + 0); + + if (r != MAP_FAILED) + return; + } + + bzero(p, size); + } + + // Reserve memory with ID 241. + template + void* reserve(const size_t* size) + { + void* p = mmap( + nullptr, + *size, + PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, + pal_anon_id, + 0); + + if (p == MAP_FAILED) + error("Out of memory"); + + return p; + } + private: + /** + * Anonymous page tag ID + * + * Darwin platform allows to gives an ID to anonymous pages + * from 240 up to 255 are guaranteed to be free of usage + * however eventually a lower could be taken (e.g. LLVM sanitizers + * has 99) so we can monitor their states via vmmap for instance. + */ + int pal_anon_id = 241 << 24; }; } // namespace snmalloc #endif