Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/override/malloc.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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);
Expand Down
3 changes: 3 additions & 0 deletions src/pal/pal.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -32,6 +33,8 @@ namespace snmalloc
PALFreeBSDKernel;
# elif defined(__FreeBSD__)
PALFBSD;
# elif defined(__OpenBSD__)
PALOBSD;
# else
# error Unsupported platform
# endif
Expand Down
93 changes: 93 additions & 0 deletions src/pal/pal_bsd.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
#pragma once

#if (defined(__FreeBSD__) || defined(__OpenBSD__)) && !defined(_KERNEL)
# include "../ds/bits.h"
# include "../mem/allocconfig.h"

# include <stdio.h>
# include <strings.h>
# include <sys/mman.h>

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<OS_PAGE_SIZE>(p, size));
madvise(p, size, MADV_FREE);
}

/// Notify platform that we will be using these pages
template<ZeroMem zero_mem>
void notify_using(void* p, size_t size) noexcept
{
assert(
bits::is_aligned_block<OS_PAGE_SIZE>(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<bool page_aligned = false>
void zero(void* p, size_t size) noexcept
{
if (page_aligned || bits::is_aligned_block<OS_PAGE_SIZE>(p, size))
{
assert(bits::is_aligned_block<OS_PAGE_SIZE>(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<bool committed>
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
54 changes: 2 additions & 52 deletions src/pal/pal_freebsd.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,72 +3,22 @@
#if defined(__FreeBSD__) && !defined(_KERNEL)
# include "../ds/bits.h"
# include "../mem/allocconfig.h"
# include "pal_bsd.h"

# include <stdio.h>
# include <strings.h>
# include <sys/mman.h>

namespace snmalloc
{
class PALFBSD
class PALFBSD : public PALBSD
{
public:
/**
* Bitmap of PalFeatures flags indicating the optional features that this
* 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<OS_PAGE_SIZE>(p, size));
madvise(p, size, MADV_FREE);
}

/// Notify platform that we will be using these pages
template<ZeroMem zero_mem>
void notify_using(void* p, size_t size) noexcept
{
assert(
bits::is_aligned_block<OS_PAGE_SIZE>(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<bool page_aligned = false>
void zero(void* p, size_t size) noexcept
{
if (page_aligned || bits::is_aligned_block<OS_PAGE_SIZE>(p, size))
{
assert(bits::is_aligned_block<OS_PAGE_SIZE>(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<bool committed>
void* reserve(const size_t* size, size_t align) noexcept
Expand Down
20 changes: 20 additions & 0 deletions src/pal/pal_openbsd.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#pragma once

#if defined(__OpenBSD__) && !defined(_KERNEL)
# include "../ds/bits.h"
# include "../mem/allocconfig.h"
# include "pal_bsd.h"

# include <stdio.h>
# include <string.h>
# include <sys/mman.h>

namespace snmalloc
{
class PALOBSD : public PALBSD
{
public:
static constexpr uint64_t pal_features = LazyCommit;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you include this line in the PALBSD, then we can remove this file, and just use PALBSD for OpenBSD and extend it for FreeBSD.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes I considered this but was not sure if one day OpenBSD would need a particular treatment (ie having special mmap flags nothing else has).

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the right thing to do here (from the perspective of making the code readable) is for the BSD PAL to set LazyCommit and for the OpenBSD PAL to declare pal_features but set it to PALBSD::pal_features, so if anyone needs to extend this class with non-generic behaviour later then they have a reminder to do so. I'll make that change when I do some cleanup.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No problem at all with that, result is the same just make the "inheritance" reminder clearer indeed.

};
} // namespace snmalloc
#endif