blob: baeb1b9a709bc2e4bd578da36fb762f299cbcb71 [file] [log] [blame]
// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ADDRESS_SPACE_ALLOCATOR_H
#define ADDRESS_SPACE_ALLOCATOR_H
#include "magma_util/macros.h"
namespace magma {
class AddressSpaceAllocator {
public:
// Constructs an address space ranging from address base to address base + size.
AddressSpaceAllocator(uint64_t base, size_t size) : base_(base), size_(size)
{
DASSERT(size > 0);
DASSERT(size <= UINT64_MAX - base);
}
virtual ~AddressSpaceAllocator() = default;
uint64_t base() const { return base_; }
size_t size() const { return size_; }
// Allocates an address for a region of the given size and alignment, where alignment
// is specified by 2 << align_pow2.
// If alignment is less than a page than page alignment will be used.
// On success returns true and addr_out is set; otherwise returns false.
virtual bool Alloc(size_t size, uint8_t align_pow2, uint64_t* addr_out) = 0;
// Frees an address that was previously allocated.
virtual bool Free(uint64_t addr) = 0;
// Returns true and the size of the region if mapped; otherwise returns false.
virtual bool GetSize(uint64_t addr, size_t* size_out) = 0;
private:
uint64_t base_;
size_t size_;
};
} // namespace magma
#endif // ADDRESS_SPACE_ALLOCATOR_H