mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-07 19:18:19 +02:00
118 lines
No EOL
2.7 KiB
C++
118 lines
No EOL
2.7 KiB
C++
#include "Debugger.h"
|
|
#include "DebugManager.h"
|
|
#include "Compiler/BfSystem.h"
|
|
|
|
USING_NS_BF;
|
|
|
|
DbgModuleMemoryCache::DbgModuleMemoryCache(uintptr addr, int size)
|
|
{
|
|
mAddr = addr;
|
|
mSize = size;
|
|
|
|
mBlockSize = 4096;
|
|
mBlockCount = size / mBlockSize;
|
|
BF_ASSERT((size & (mBlockSize - 1)) == 0);
|
|
//mBlocks = (uint8**)dwarf->mAlloc.AllocBytes(dwarf->mOrigImageBlockCount * sizeof(uint8*), alignof(uint8*));
|
|
mBlocks = new uint8*[mBlockCount];
|
|
memset(mBlocks, 0, mBlockCount * sizeof(uint8*));
|
|
mFlags = new DbgMemoryFlags[mBlockCount];
|
|
memset(mFlags, 0, mBlockCount * sizeof(DbgMemoryFlags));
|
|
mOwns = true;
|
|
}
|
|
|
|
// DbgModuleMemoryCache::DbgModuleMemoryCache(uintptr addr, uint8* data, int size, bool makeCopy)
|
|
// {
|
|
// mAddr = addr;
|
|
// mBlockSize = size;
|
|
// mBlocks = new uint8*[1];
|
|
// mFlags = new DbgMemoryFlags[1];
|
|
// mSize = size;
|
|
//
|
|
// if (makeCopy)
|
|
// {
|
|
// uint8* dataCopy = new uint8[size];
|
|
// if (data != NULL)
|
|
// memcpy(dataCopy, data, size);
|
|
// else
|
|
// memset(dataCopy, 0, size);
|
|
// mBlocks[0] = dataCopy;
|
|
// }
|
|
// else
|
|
// {
|
|
// mBlocks[0] = data;
|
|
// }
|
|
//
|
|
// mOwns = makeCopy;
|
|
// mBlockCount = 1;
|
|
// }
|
|
|
|
DbgModuleMemoryCache::~DbgModuleMemoryCache()
|
|
{
|
|
if (mOwns)
|
|
{
|
|
for (int i = 0; i < mBlockCount; i++)
|
|
delete mBlocks[i];
|
|
}
|
|
delete [] mBlocks;
|
|
delete [] mFlags;
|
|
}
|
|
|
|
DbgMemoryFlags DbgModuleMemoryCache::Read(uintptr addr, uint8* data, int size)
|
|
{
|
|
BF_ASSERT(mAddr != 0);
|
|
|
|
int sizeLeft = size;
|
|
DbgMemoryFlags flags = DbgMemoryFlags_None;
|
|
|
|
if ((addr < mAddr) || (addr > mAddr + mSize))
|
|
{
|
|
if (data != NULL)
|
|
gDebugger->ReadMemory(addr, size, data);
|
|
flags = gDebugger->GetMemoryFlags(addr);
|
|
BfLogDbg("Got memory flags %p = %d\n", addr, flags);
|
|
return flags;
|
|
}
|
|
|
|
int relAddr = (int)(addr - mAddr);
|
|
int blockIdx = relAddr / mBlockSize;
|
|
int curOffset = relAddr % mBlockSize;
|
|
|
|
while (sizeLeft > 0)
|
|
{
|
|
uint8* block = mBlocks[blockIdx];
|
|
if (block == NULL)
|
|
{
|
|
block = new uint8[mBlockSize];
|
|
gDebugger->ReadMemory(mAddr + blockIdx * mBlockSize, mBlockSize, block);
|
|
mBlocks[blockIdx] = block;
|
|
|
|
mFlags[blockIdx] = gDebugger->GetMemoryFlags(mAddr + blockIdx * mBlockSize);
|
|
BfLogDbg("Memory flags for %p = %d\n", mAddr + blockIdx * mBlockSize, mFlags[blockIdx]);
|
|
}
|
|
|
|
flags = mFlags[blockIdx];
|
|
int readSize = BF_MIN(sizeLeft, mBlockSize - curOffset);
|
|
if (data != NULL)
|
|
{
|
|
memcpy(data, block + curOffset, readSize);
|
|
data += readSize;
|
|
}
|
|
sizeLeft -= readSize;
|
|
curOffset = 0;
|
|
blockIdx++;
|
|
}
|
|
|
|
return flags;
|
|
}
|
|
|
|
void DbgModuleMemoryCache::ReportMemory(MemReporter * memReporter)
|
|
{
|
|
int totalMemory = 0;
|
|
if (mOwns)
|
|
{
|
|
for (int i = 0; i < mBlockCount; i++)
|
|
if (mBlocks[i] != NULL)
|
|
totalMemory += mBlockSize;
|
|
}
|
|
memReporter->Add(totalMemory);
|
|
} |