Memory: Implemented InjectIntoMemory and ExtractFromMemory
This commit is contained in:
parent
444cf8b1ae
commit
3a01bf1e61
1 changed files with 32 additions and 0 deletions
|
@ -130,6 +130,38 @@ void WriteBlock(VAddr addr, const u8* data, size_t size);
|
||||||
|
|
||||||
u8* GetPointer(VAddr virtual_address);
|
u8* GetPointer(VAddr virtual_address);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extracts a POD type from memory. Returns false if address is invalid.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
bool ExtractFromMemory(VAddr address, T& object) {
|
||||||
|
static_assert(std::is_standard_layout<T>::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 <typename T>
|
||||||
|
bool InjectIntoMemory(VAddr address, const T& object) {
|
||||||
|
static_assert(std::is_standard_layout<T>::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
|
* 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.
|
* address. This should be used by services to translate addresses for use by the hardware.
|
||||||
|
|
Loading…
Reference in a new issue