From 3a01bf1e6107cb2195e5d4985bcc17aa16a9f107 Mon Sep 17 00:00:00 2001 From: MerryMage Date: Mon, 25 Jan 2016 22:13:31 +0000 Subject: [PATCH] Memory: Implemented InjectIntoMemory and ExtractFromMemory --- src/core/memory.h | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/core/memory.h b/src/core/memory.h index 5af72b7a7..b42ad6268 100644 --- a/src/core/memory.h +++ b/src/core/memory.h @@ -130,6 +130,38 @@ void WriteBlock(VAddr addr, const u8* data, size_t size); u8* GetPointer(VAddr virtual_address); +/** +* Extracts a POD type from memory. Returns false if address is invalid. +*/ +template +bool ExtractFromMemory(VAddr address, T& object) { + static_assert(std::is_standard_layout::value, "Type must have standard layout"); + + const u8* memory = GetPointer(address); + if (!memory) { + return false; + } + + std::memcpy(&object, memory, sizeof(T)); + return true; +} + +/** +* Injects a POD type into memory. Returns false if address is invalid. +*/ +template +bool InjectIntoMemory(VAddr address, const T& object) { + static_assert(std::is_standard_layout::value, "Type must have standard layout"); + + u8* memory = GetPointer(address); + if (!memory) { + return false; + } + + std::memcpy(memory, &object, sizeof(T)); + return true; +} + /** * Converts a virtual address inside a region with 1:1 mapping to physical memory to a physical * address. This should be used by services to translate addresses for use by the hardware.