diff --git a/src/override/malloc.cc b/src/override/malloc.cc index ea1838bce..1a864d871 100644 --- a/src/override/malloc.cc +++ b/src/override/malloc.cc @@ -89,7 +89,7 @@ extern "C" return p; } -#ifndef __FreeBSD__ +#if !defined(__FreeBSD__) && !defined(__OpenBSD__) SNMALLOC_EXPORT void* SNMALLOC_NAME_MANGLE(reallocarray)(void* ptr, size_t nmemb, size_t size) { @@ -165,7 +165,7 @@ extern "C" return 0; } -#ifndef __FreeBSD__ +#if !defined(__FreeBSD__) && !defined(__OpenBSD__) SNMALLOC_EXPORT void* SNMALLOC_NAME_MANGLE(valloc)(size_t size) { return SNMALLOC_NAME_MANGLE(memalign)(OS_PAGE_SIZE, size); diff --git a/src/pal/pal.h b/src/pal/pal.h index 799f859ac..6cec451f1 100644 --- a/src/pal/pal.h +++ b/src/pal/pal.h @@ -13,6 +13,7 @@ namespace snmalloc # include "pal_free_bsd_kernel.h" # include "pal_freebsd.h" # include "pal_linux.h" +# include "pal_openbsd.h" # include "pal_windows.h" #endif #include "pal_open_enclave.h" @@ -32,6 +33,8 @@ namespace snmalloc PALFreeBSDKernel; # elif defined(__FreeBSD__) PALFBSD; +# elif defined(__OpenBSD__) + PALOBSD; # else # error Unsupported platform # endif diff --git a/src/pal/pal_bsd.h b/src/pal/pal_bsd.h new file mode 100644 index 000000000..cc996c22d --- /dev/null +++ b/src/pal/pal_bsd.h @@ -0,0 +1,93 @@ +#pragma once + +#if (defined(__FreeBSD__) || defined(__OpenBSD__)) && !defined(_KERNEL) +# include "../ds/bits.h" +# include "../mem/allocconfig.h" + +# include +# include +# include + +namespace snmalloc +{ + class PALBSD + { + public: + /** + * Bitmap of PalFeatures flags indicating the optional features that this + * PAL supports. + */ + static constexpr uint64_t pal_features = 0; + static void error(const char* const str) + { + puts(str); + abort(); + } + + /// Notify platform that we will not be using these pages + void notify_not_using(void* p, size_t size) noexcept + { + assert(bits::is_aligned_block(p, size)); + madvise(p, size, MADV_FREE); + } + + /// Notify platform that we will be using these pages + template + void notify_using(void* p, size_t size) noexcept + { + assert( + bits::is_aligned_block(p, size) || (zero_mem == NoZero)); + if constexpr (zero_mem == YesZero) + { + zero(p, size); + } + else + { + UNUSED(size); + UNUSED(p); + } + } + + /// OS specific function for zeroing memory + template + void zero(void* p, size_t size) noexcept + { + 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, + -1, + 0); + + if (r != MAP_FAILED) + return; + } + + bzero(p, size); + } + + template + void* reserve(const size_t* size) noexcept + { + size_t request = *size; + + void* p = mmap( + nullptr, + request, + PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, + -1, + 0); + + if (p == MAP_FAILED) + error("Out of memory"); + + return p; + } + }; +} // namespace snmalloc +#endif diff --git a/src/pal/pal_freebsd.h b/src/pal/pal_freebsd.h index d0e6bc664..2924fa46f 100644 --- a/src/pal/pal_freebsd.h +++ b/src/pal/pal_freebsd.h @@ -3,6 +3,7 @@ #if defined(__FreeBSD__) && !defined(_KERNEL) # include "../ds/bits.h" # include "../mem/allocconfig.h" +# include "pal_bsd.h" # include # include @@ -10,7 +11,7 @@ namespace snmalloc { - class PALFBSD + class PALFBSD : public PALBSD { public: /** @@ -18,57 +19,6 @@ namespace snmalloc * PAL supports. */ static constexpr uint64_t pal_features = AlignedAllocation | LazyCommit; - static void error(const char* const str) - { - puts(str); - abort(); - } - - /// Notify platform that we will not be using these pages - void notify_not_using(void* p, size_t size) noexcept - { - assert(bits::is_aligned_block(p, size)); - madvise(p, size, MADV_FREE); - } - - /// Notify platform that we will be using these pages - template - void notify_using(void* p, size_t size) noexcept - { - assert( - bits::is_aligned_block(p, size) || (zero_mem == NoZero)); - if constexpr (zero_mem == YesZero) - { - zero(p, size); - } - else - { - UNUSED(size); - UNUSED(p); - } - } - - /// OS specific function for zeroing memory - template - void zero(void* p, size_t size) noexcept - { - 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, - -1, - 0); - - if (r != MAP_FAILED) - return; - } - - bzero(p, size); - } template void* reserve(const size_t* size, size_t align) noexcept diff --git a/src/pal/pal_openbsd.h b/src/pal/pal_openbsd.h new file mode 100644 index 000000000..fb1dbc0db --- /dev/null +++ b/src/pal/pal_openbsd.h @@ -0,0 +1,20 @@ +#pragma once + +#if defined(__OpenBSD__) && !defined(_KERNEL) +# include "../ds/bits.h" +# include "../mem/allocconfig.h" +# include "pal_bsd.h" + +# include +# include +# include + +namespace snmalloc +{ + class PALOBSD : public PALBSD + { + public: + static constexpr uint64_t pal_features = LazyCommit; + }; +} // namespace snmalloc +#endif