From 9bede4eeed523f9707a989f1297279c006086e76 Mon Sep 17 00:00:00 2001 From: Fernando Sahmkow Date: Thu, 18 Jul 2019 18:15:53 -0400 Subject: VM_Manager: Align allocated memory to 256bytes This commit ensures that all backing memory allocated for the Guest CPU is aligned to 256 bytes. This due to how gpu memory works and the heavy constraints it has in the alignment of physical memory. --- src/common/alignment.h | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) (limited to 'src/common') diff --git a/src/common/alignment.h b/src/common/alignment.h index 617b14d9b..b3fbdfe20 100644 --- a/src/common/alignment.h +++ b/src/common/alignment.h @@ -3,7 +3,10 @@ #pragma once #include +#include #include +#include +#include namespace Common { @@ -37,4 +40,80 @@ constexpr bool IsWordAligned(T value) { return (value & 0b11) == 0; } +template +class AlignmentAllocator { +public: + typedef T value_type; + typedef std::size_t size_type; + typedef std::ptrdiff_t difference_type; + + typedef T* pointer; + typedef const T* const_pointer; + + typedef T& reference; + typedef const T& const_reference; + +public: + inline AlignmentAllocator() throw() {} + + template + inline AlignmentAllocator(const AlignmentAllocator&) throw() {} + + inline ~AlignmentAllocator() throw() {} + + inline pointer adress(reference r) { + return &r; + } + + inline const_pointer adress(const_reference r) const { + return &r; + } + +#if (defined _MSC_VER) + inline pointer allocate(size_type n) { + return (pointer)_aligned_malloc(n * sizeof(value_type), Align); + } + + inline void deallocate(pointer p, size_type) { + _aligned_free(p); + } +#else + inline pointer allocate(size_type n) { + return (pointer)std::aligned_alloc(Align, n * sizeof(value_type)); + } + + inline void deallocate(pointer p, size_type) { + std::free(p); + } +#endif + + inline void construct(pointer p, const value_type& wert) { + new (p) value_type(wert); + } + + inline void destroy(pointer p) { + p->~value_type(); + } + + inline size_type max_size() const throw() { + return size_type(-1) / sizeof(value_type); + } + + template + struct rebind { + typedef AlignmentAllocator other; + }; + + bool operator!=(const AlignmentAllocator& other) const { + return !(*this == other); + } + + // Returns true if and only if storage allocated from *this + // can be deallocated from other, and vice versa. + // Always returns true for stateless allocators. + bool operator==(const AlignmentAllocator& other) const { + return true; + } +}; + } // namespace Common -- cgit v1.2.3