2012-11-15 01:39:56 +02:00
|
|
|
#pragma once
|
2014-07-08 21:18:12 +04:00
|
|
|
|
2012-11-15 01:39:56 +02:00
|
|
|
#include "MemoryBlock.h"
|
|
|
|
|
|
2014-04-10 00:54:32 +02:00
|
|
|
using std::nullptr_t;
|
|
|
|
|
|
2014-07-11 00:16:19 +10:00
|
|
|
#define safe_delete(x) do {delete (x);(x)=nullptr;} while(0)
|
|
|
|
|
#define safe_free(x) do {free(x);(x)=nullptr;} while(0)
|
|
|
|
|
|
2013-11-03 21:23:16 +02:00
|
|
|
enum MemoryType
|
|
|
|
|
{
|
|
|
|
|
Memory_PS3,
|
2013-11-05 20:12:18 +02:00
|
|
|
Memory_PSV,
|
|
|
|
|
Memory_PSP,
|
2013-11-03 21:23:16 +02:00
|
|
|
};
|
|
|
|
|
|
2014-09-15 02:17:24 +04:00
|
|
|
enum : u32
|
2014-07-07 21:22:36 +04:00
|
|
|
{
|
2014-09-15 02:17:24 +04:00
|
|
|
RAW_SPU_OFFSET = 0x00100000,
|
|
|
|
|
RAW_SPU_BASE_ADDR = 0xE0000000,
|
|
|
|
|
RAW_SPU_LS_OFFSET = 0x00000000,
|
|
|
|
|
RAW_SPU_PROB_OFFSET = 0x00040000,
|
2014-07-07 21:22:36 +04:00
|
|
|
};
|
|
|
|
|
|
2014-11-19 16:16:30 +02:00
|
|
|
namespace vm
|
|
|
|
|
{
|
|
|
|
|
extern void* const g_base_addr;
|
|
|
|
|
}
|
|
|
|
|
|
2012-11-15 01:39:56 +02:00
|
|
|
class MemoryBase
|
|
|
|
|
{
|
2014-07-07 21:22:36 +04:00
|
|
|
std::vector<MemoryBlock*> MemoryBlocks;
|
2014-07-08 18:26:49 +04:00
|
|
|
u32 m_pages[0x100000000 / 4096]; // information about every page
|
2012-11-15 01:39:56 +02:00
|
|
|
|
|
|
|
|
public:
|
2013-11-05 20:12:18 +02:00
|
|
|
MemoryBlock* UserMemory;
|
2012-11-15 01:39:56 +02:00
|
|
|
|
|
|
|
|
DynamicMemoryBlock MainMem;
|
2014-11-19 16:16:30 +02:00
|
|
|
DynamicMemoryBlock SPRXMem;
|
2012-11-15 01:39:56 +02:00
|
|
|
DynamicMemoryBlock PRXMem;
|
|
|
|
|
DynamicMemoryBlock RSXCMDMem;
|
2014-11-19 16:16:30 +02:00
|
|
|
DynamicMemoryBlock MmaperMem;
|
2012-11-15 01:39:56 +02:00
|
|
|
DynamicMemoryBlock RSXFBMem;
|
|
|
|
|
DynamicMemoryBlock StackMem;
|
2014-07-08 18:26:49 +04:00
|
|
|
MemoryBlock* RawSPUMem[(0x100000000 - RAW_SPU_BASE_ADDR) / RAW_SPU_OFFSET];
|
2014-01-17 18:56:03 +02:00
|
|
|
VirtualMemoryBlock RSXIOMem;
|
2012-11-15 01:39:56 +02:00
|
|
|
|
2014-09-06 17:33:01 +04:00
|
|
|
struct
|
2013-11-05 20:12:18 +02:00
|
|
|
{
|
2014-09-03 01:48:44 +04:00
|
|
|
DynamicMemoryBlock RAM;
|
|
|
|
|
DynamicMemoryBlock Userspace;
|
2014-07-13 16:26:38 +04:00
|
|
|
} PSV;
|
2013-11-05 20:12:18 +02:00
|
|
|
|
2014-09-06 17:33:01 +04:00
|
|
|
struct
|
2013-11-05 20:12:18 +02:00
|
|
|
{
|
2014-09-03 01:48:44 +04:00
|
|
|
DynamicMemoryBlock Scratchpad;
|
|
|
|
|
DynamicMemoryBlock VRAM;
|
|
|
|
|
DynamicMemoryBlock RAM;
|
|
|
|
|
DynamicMemoryBlock Kernel;
|
|
|
|
|
DynamicMemoryBlock Userspace;
|
2014-07-13 16:26:38 +04:00
|
|
|
} PSP;
|
2013-11-05 20:12:18 +02:00
|
|
|
|
2012-11-15 01:39:56 +02:00
|
|
|
bool m_inited;
|
|
|
|
|
|
|
|
|
|
MemoryBase()
|
|
|
|
|
{
|
|
|
|
|
m_inited = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
~MemoryBase()
|
|
|
|
|
{
|
|
|
|
|
Close();
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-31 13:54:12 +04:00
|
|
|
static void* const GetBaseAddr()
|
2014-07-07 03:36:07 +04:00
|
|
|
{
|
2014-11-19 16:16:30 +02:00
|
|
|
return vm::g_base_addr;
|
2014-07-07 03:36:07 +04:00
|
|
|
}
|
|
|
|
|
|
2014-08-22 18:21:55 +04:00
|
|
|
__noinline void InvalidAddress(const char* func, const u64 addr);
|
2014-07-08 18:26:49 +04:00
|
|
|
|
2014-08-22 18:21:55 +04:00
|
|
|
void RegisterPages(u64 addr, u32 size);
|
2014-07-09 03:04:36 +04:00
|
|
|
|
2014-08-22 18:21:55 +04:00
|
|
|
void UnregisterPages(u64 addr, u32 size);
|
2014-07-08 18:26:49 +04:00
|
|
|
|
2014-07-13 16:26:38 +04:00
|
|
|
u32 RealToVirtualAddr(const void* addr)
|
2014-04-28 00:15:37 -07:00
|
|
|
{
|
2014-07-07 21:22:36 +04:00
|
|
|
const u64 res = (u64)addr - (u64)GetBaseAddr();
|
|
|
|
|
|
2014-08-30 21:51:00 +04:00
|
|
|
if ((u32)res == res)
|
2014-04-28 00:15:37 -07:00
|
|
|
{
|
2014-08-30 21:51:00 +04:00
|
|
|
return (u32)res;
|
2014-04-28 00:15:37 -07:00
|
|
|
}
|
2014-07-07 21:22:36 +04:00
|
|
|
else
|
2014-04-28 00:15:37 -07:00
|
|
|
{
|
2014-08-19 22:17:20 +04:00
|
|
|
assert(!addr);
|
2014-07-07 21:22:36 +04:00
|
|
|
return 0;
|
2014-04-28 00:15:37 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-22 18:21:55 +04:00
|
|
|
u32 InitRawSPU(MemoryBlock* raw_spu);
|
2014-07-08 18:26:49 +04:00
|
|
|
|
2014-08-22 18:21:55 +04:00
|
|
|
void CloseRawSPU(MemoryBlock* raw_spu, const u32 num);
|
2012-11-15 01:39:56 +02:00
|
|
|
|
2014-08-22 18:21:55 +04:00
|
|
|
void Init(MemoryType type);
|
2012-11-15 01:39:56 +02:00
|
|
|
|
2014-09-06 17:33:01 +04:00
|
|
|
bool IsGoodAddr(const u32 addr)
|
2012-11-15 01:39:56 +02:00
|
|
|
{
|
2014-09-06 17:33:01 +04:00
|
|
|
return m_pages[addr / 4096] != 0; // TODO: define page parameters
|
2012-11-15 01:39:56 +02:00
|
|
|
}
|
|
|
|
|
|
2014-09-06 17:33:01 +04:00
|
|
|
bool IsGoodAddr(const u32 addr, const u32 size)
|
2012-11-15 01:39:56 +02:00
|
|
|
{
|
2014-09-06 17:33:01 +04:00
|
|
|
if (!size || addr + size - 1 < addr)
|
2014-07-07 21:22:36 +04:00
|
|
|
{
|
2014-07-08 18:26:49 +04:00
|
|
|
return false;
|
2014-07-07 21:22:36 +04:00
|
|
|
}
|
2014-07-08 18:26:49 +04:00
|
|
|
else
|
2012-11-15 01:39:56 +02:00
|
|
|
{
|
2014-09-06 17:33:01 +04:00
|
|
|
for (u32 i = addr / 4096; i <= (addr + size - 1) / 4096; i++)
|
2014-07-08 18:26:49 +04:00
|
|
|
{
|
2014-09-11 23:33:20 +04:00
|
|
|
if (!m_pages[i]) return false; // TODO: define page parameters
|
2014-07-08 18:26:49 +04:00
|
|
|
}
|
|
|
|
|
return true;
|
2012-11-15 01:39:56 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-22 18:21:55 +04:00
|
|
|
void Close();
|
2012-11-15 01:39:56 +02:00
|
|
|
|
2014-08-25 18:56:13 +04:00
|
|
|
__noinline void WriteMMIO32(u32 addr, const u32 data);
|
2014-08-05 21:33:02 +04:00
|
|
|
|
2014-08-25 18:56:13 +04:00
|
|
|
__noinline u32 ReadMMIO32(u32 addr);
|
2014-08-05 21:33:02 +04:00
|
|
|
|
2012-11-15 01:39:56 +02:00
|
|
|
u32 GetUserMemTotalSize()
|
|
|
|
|
{
|
2013-11-05 20:12:18 +02:00
|
|
|
return UserMemory->GetSize();
|
2012-11-15 01:39:56 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
u32 GetUserMemAvailSize()
|
|
|
|
|
{
|
2013-11-05 20:12:18 +02:00
|
|
|
return UserMemory->GetSize() - UserMemory->GetUsedSize();
|
2012-11-15 01:39:56 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
u64 Alloc(const u32 size, const u32 align)
|
|
|
|
|
{
|
2014-02-02 23:49:10 +04:00
|
|
|
return UserMemory->AllocAlign(size, align);
|
2012-11-15 01:39:56 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool Free(const u64 addr)
|
|
|
|
|
{
|
2013-11-05 20:12:18 +02:00
|
|
|
return UserMemory->Free(addr);
|
2012-11-15 01:39:56 +02:00
|
|
|
}
|
|
|
|
|
|
2014-09-03 01:48:44 +04:00
|
|
|
bool Map(const u64 addr, const u32 size);
|
2014-07-07 21:22:36 +04:00
|
|
|
|
2014-08-22 18:21:55 +04:00
|
|
|
bool Unmap(const u64 addr);
|
2012-11-15 01:39:56 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
extern MemoryBase Memory;
|
|
|
|
|
|
2014-07-31 19:08:02 +03:00
|
|
|
#include "vm.h"
|
|
|
|
|
|