PALOpenEnclave object is lazily constructed. I couldn't figure out a straight-forward way to pass the heap bounds to the constructor of PALOpenEnclave object. As an alternative, store the bounds in inline static variables of the PALOpenEnclave class and set them via static setup_initial_range function. - two_alloc_types/alloc1.cc Define oe_allocator_init to forward base, end values to PALOpenEnclave::setup_inital_range - two_alloc_types/main.cc Use oe_allocator_init function to set up heap range. - fixed_region/fixed_region.cc Initialize heap range via call to PALOpenEnclave::setup_inital_range. Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com>
67 lines
1.5 KiB
C++
67 lines
1.5 KiB
C++
#pragma once
|
|
|
|
#include "ds/address.h"
|
|
#include "pal_plain.h"
|
|
#ifdef OPEN_ENCLAVE
|
|
extern "C" void* oe_memset_s(void* p, size_t p_size, int c, size_t size);
|
|
extern "C" [[noreturn]] void oe_abort();
|
|
|
|
namespace snmalloc
|
|
{
|
|
class PALOpenEnclave
|
|
{
|
|
static inline std::atomic<void*> oe_base;
|
|
static inline void* oe_end = nullptr;
|
|
|
|
public:
|
|
/**
|
|
* This will be called by oe_allocator_init to set up enclave heap bounds.
|
|
*/
|
|
static void setup_initial_range(void* base, void* end)
|
|
{
|
|
oe_base = base;
|
|
oe_end = end;
|
|
}
|
|
|
|
/**
|
|
* Bitmap of PalFeatures flags indicating the optional features that this
|
|
* PAL supports.
|
|
*/
|
|
static constexpr uint64_t pal_features = 0;
|
|
|
|
static constexpr size_t page_size = 0x1000;
|
|
|
|
[[noreturn]] static void error(const char* const str)
|
|
{
|
|
UNUSED(str);
|
|
oe_abort();
|
|
}
|
|
|
|
template<bool committed>
|
|
void* reserve(size_t size) noexcept
|
|
{
|
|
void* old_base = oe_base;
|
|
void* next_base;
|
|
auto end = oe_end;
|
|
do
|
|
{
|
|
auto new_base = old_base;
|
|
next_base = pointer_offset(new_base, size);
|
|
|
|
if (next_base > end)
|
|
return nullptr;
|
|
|
|
} while (!oe_base.compare_exchange_strong(old_base, next_base));
|
|
|
|
return old_base;
|
|
}
|
|
|
|
template<bool page_aligned = false>
|
|
void zero(void* p, size_t size) noexcept
|
|
{
|
|
oe_memset_s(p, size, 0, size);
|
|
}
|
|
};
|
|
}
|
|
#endif
|