| // Copyright 2020 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 GARNET_BIN_HWSTRESS_MEMORY_RANGE_H_ |
| #define GARNET_BIN_HWSTRESS_MEMORY_RANGE_H_ |
| |
| #include <lib/zx/status.h> |
| #include <lib/zx/vmo.h> |
| #include <zircon/assert.h> |
| #include <zircon/status.h> |
| #include <zircon/types.h> |
| |
| #include <memory> |
| |
| #include <fbl/span.h> |
| |
| #include "compiler.h" |
| |
| namespace hwstress { |
| |
| // Determines if memory should have CPU caches enabled on it. |
| enum class CacheMode { |
| kCached, |
| kUncached, |
| }; |
| |
| // A MemoryRange tracks a (potentially large) range of memory mapped into the address space. |
| class MemoryRange { |
| public: |
| ~MemoryRange(); |
| |
| // Create and map a memory range of the given size. |
| // |
| // Size must be aligned to zx_system_get_page_size(). |
| static zx::status<std::unique_ptr<MemoryRange>> Create(uint64_t size, CacheMode mode); |
| |
| // Create a MemoryRange from the given pre-mapped VMO. |
| MemoryRange(zx::vmo vmo, uint8_t* addr, uint64_t size, CacheMode mode); |
| |
| // Get the cache mode of the memory. |
| CacheMode cache() const { return cache_mode_; } |
| |
| // Get the memory range as a fbl::Span. |
| fbl::Span<uint8_t> span() const { return fbl::Span<uint8_t>(addr_, size_); } |
| |
| // Get a raw pointer to the memory represented in bytes. |
| uint8_t* bytes() const ASSUME_ALIGNED(ZX_MIN_PAGE_SIZE) { return addr_; } |
| uint64_t size_bytes() const { return size_; } |
| |
| // Get a raw pointer to the memory represented as 64-bit words. |
| uint64_t* words() const ASSUME_ALIGNED(ZX_MIN_PAGE_SIZE) { |
| return reinterpret_cast<uint64_t*>(addr_); |
| } |
| uint64_t size_words() const { return size_ / sizeof(uint64_t); } |
| |
| // CPU cache operations, via the kernel. |
| void CleanCache(); |
| void CleanInvalidateCache(); |
| |
| // Return the underlying vmo. |
| const zx::vmo& vmo() const { return vmo_; } |
| |
| private: |
| // Perform the given cache operation on the entire VMO range. |
| void DoCacheOp(uint32_t operation); |
| |
| zx::vmo vmo_; |
| uint8_t* addr_; |
| uint64_t size_; |
| CacheMode cache_mode_; |
| }; |
| |
| } // namespace hwstress |
| |
| #endif // GARNET_BIN_HWSTRESS_MEMORY_RANGE_H_ |