Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #10283 from JosJuice/memmap-nullptr
Memmap: Replace some GetPointer calls
  • Loading branch information
degasus committed Dec 24, 2021
2 parents 6dae404 + 5dd2ddb commit 26bfe78
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 13 deletions.
36 changes: 25 additions & 11 deletions Source/Core/Core/HW/Memmap.cpp
Expand Up @@ -466,16 +466,22 @@ void Clear()
memset(m_pEXRAM, 0, GetExRamSize());
}

static inline u8* GetPointerForRange(u32 address, size_t size)
u8* GetPointerForRange(u32 address, size_t size)
{
// Make sure we don't have a range spanning 2 separate banks
if (size >= GetExRamSizeReal())
{
PanicAlertFmt("Oversized range in GetPointerForRange. {:x} bytes at {:#010x}", size, address);
return nullptr;
}

// Check that the beginning and end of the range are valid
u8* pointer = GetPointer(address);
if (!pointer || !GetPointer(address + u32(size) - 1))
{
// A panic alert has already been raised by GetPointer
return nullptr;
}

return pointer;
}
Expand Down Expand Up @@ -559,55 +565,63 @@ u8* GetPointer(u32 address)

u8 Read_U8(u32 address)
{
return *GetPointer(address);
u8 value = 0;
CopyFromEmu(&value, address, sizeof(value));
return value;
}

u16 Read_U16(u32 address)
{
return Common::swap16(GetPointer(address));
u16 value = 0;
CopyFromEmu(&value, address, sizeof(value));
return Common::swap16(value);
}

u32 Read_U32(u32 address)
{
return Common::swap32(GetPointer(address));
u32 value = 0;
CopyFromEmu(&value, address, sizeof(value));
return Common::swap32(value);
}

u64 Read_U64(u32 address)
{
return Common::swap64(GetPointer(address));
u64 value = 0;
CopyFromEmu(&value, address, sizeof(value));
return Common::swap64(value);
}

void Write_U8(u8 value, u32 address)
{
*GetPointer(address) = value;
CopyToEmu(address, &value, sizeof(value));
}

void Write_U16(u16 value, u32 address)
{
u16 swapped_value = Common::swap16(value);
std::memcpy(GetPointer(address), &swapped_value, sizeof(u16));
CopyToEmu(address, &swapped_value, sizeof(swapped_value));
}

void Write_U32(u32 value, u32 address)
{
u32 swapped_value = Common::swap32(value);
std::memcpy(GetPointer(address), &swapped_value, sizeof(u32));
CopyToEmu(address, &swapped_value, sizeof(swapped_value));
}

void Write_U64(u64 value, u32 address)
{
u64 swapped_value = Common::swap64(value);
std::memcpy(GetPointer(address), &swapped_value, sizeof(u64));
CopyToEmu(address, &swapped_value, sizeof(swapped_value));
}

void Write_U32_Swap(u32 value, u32 address)
{
std::memcpy(GetPointer(address), &value, sizeof(u32));
CopyToEmu(address, &value, sizeof(value));
}

void Write_U64_Swap(u64 value, u32 address)
{
std::memcpy(GetPointer(address), &value, sizeof(u64));
CopyToEmu(address, &value, sizeof(value));
}

} // namespace Memory
5 changes: 3 additions & 2 deletions Source/Core/Core/HW/Memmap.h
Expand Up @@ -74,6 +74,7 @@ void Clear();
// emulated hardware outside the CPU. Use "Device_" prefix.
std::string GetString(u32 em_address, size_t size = 0);
u8* GetPointer(u32 address);
u8* GetPointerForRange(u32 address, size_t size);
void CopyFromEmu(void* data, u32 address, size_t size);
void CopyToEmu(u32 address, const void* data, size_t size);
void Memset(u32 address, u8 value, size_t size);
Expand All @@ -92,7 +93,7 @@ void Write_U64_Swap(u64 var, u32 address);
template <typename T>
void CopyFromEmuSwapped(T* data, u32 address, size_t size)
{
const T* src = reinterpret_cast<T*>(GetPointer(address));
const T* src = reinterpret_cast<T*>(GetPointerForRange(address, size));

if (src == nullptr)
return;
Expand All @@ -104,7 +105,7 @@ void CopyFromEmuSwapped(T* data, u32 address, size_t size)
template <typename T>
void CopyToEmuSwapped(u32 address, const T* data, size_t size)
{
T* dest = reinterpret_cast<T*>(GetPointer(address));
T* dest = reinterpret_cast<T*>(GetPointerForRange(address, size));

if (dest == nullptr)
return;
Expand Down

0 comments on commit 26bfe78

Please sign in to comment.