blob: b93e15e5c424f931efbb66ad2cf1fa40c380eaee [file] [log] [blame]
// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
#ifndef RUNTIME_BIN_VIRTUAL_MEMORY_H_
#define RUNTIME_BIN_VIRTUAL_MEMORY_H_
#include "platform/allocation.h"
#include "platform/globals.h"
namespace dart {
namespace bin {
class VirtualMemory {
public:
enum Protection {
kNoAccess,
kReadOnly,
kReadWrite,
kReadExecute,
kReadWriteExecute
};
// The reserved memory is unmapped on destruction.
~VirtualMemory();
void release() {
address_ = nullptr;
size_ = 0;
}
uword start() const { return reinterpret_cast<uword>(address_); }
uword end() const { return reinterpret_cast<uword>(address_) + size_; }
void* address() const { return address_; }
intptr_t size() const { return size_; }
// Changes the protection of the virtual memory area.
static void Protect(void* address, intptr_t size, Protection mode);
void Protect(Protection mode) { return Protect(address(), size(), mode); }
// Reserves and commits a virtual memory segment with size. If a segment of
// the requested size cannot be allocated, nullptr is returned.
static VirtualMemory* Allocate(intptr_t size,
bool is_executable,
const char* name);
static void Init() { page_size_ = CalculatePageSize(); }
// Returns the cached page size. Use only if Init() has been called.
static intptr_t PageSize() {
ASSERT(page_size_ != 0);
return page_size_;
}
private:
static intptr_t CalculatePageSize();
// These constructors are only used internally when reserving new virtual
// spaces. They do not reserve any virtual address space on their own.
VirtualMemory(void* address, size_t size) : address_(address), size_(size) {}
void* address_;
size_t size_;
static uword page_size_;
DISALLOW_IMPLICIT_CONSTRUCTORS(VirtualMemory);
};
} // namespace bin
} // namespace dart
#endif // RUNTIME_BIN_VIRTUAL_MEMORY_H_