2014-07-31 18:08:02 +02:00
|
|
|
#pragma once
|
2014-11-19 15:16:30 +01:00
|
|
|
#include "Memory.h"
|
2014-07-31 18:08:02 +02:00
|
|
|
|
|
|
|
|
namespace vm
|
|
|
|
|
{
|
2014-11-19 15:16:30 +01:00
|
|
|
enum memory_location
|
|
|
|
|
{
|
|
|
|
|
main,
|
|
|
|
|
stack,
|
|
|
|
|
sprx,
|
|
|
|
|
user_space,
|
|
|
|
|
|
|
|
|
|
memory_location_count
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct location_info
|
|
|
|
|
{
|
|
|
|
|
u32 addr_offset;
|
|
|
|
|
u32 size;
|
|
|
|
|
|
|
|
|
|
u32(*allocator)(u32 size);
|
|
|
|
|
u32(*fixed_allocator)(u32 addr, u32 size);
|
|
|
|
|
void(*deallocator)(u32 addr);
|
|
|
|
|
|
|
|
|
|
u32 alloc_offset;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
extern location_info g_locations[memory_location_count];
|
|
|
|
|
|
|
|
|
|
static void set_stack_size(u32 size) {}
|
|
|
|
|
static void initialize_stack() {}
|
|
|
|
|
|
|
|
|
|
extern void* const g_base_addr;
|
2014-08-01 18:27:48 +02:00
|
|
|
bool map(u32 addr, u32 size, u32 flags);
|
|
|
|
|
bool unmap(u32 addr, u32 size = 0, u32 flags = 0);
|
2014-11-19 15:16:30 +01:00
|
|
|
u32 alloc(u32 size, memory_location location = user_space);
|
|
|
|
|
u32 alloc(u32 addr, u32 size, memory_location location = user_space);
|
|
|
|
|
void dealloc(u32 addr, memory_location location = user_space);
|
2014-08-01 18:27:48 +02:00
|
|
|
|
2014-11-19 15:16:30 +01:00
|
|
|
template<typename T = void>
|
2014-08-31 11:54:12 +02:00
|
|
|
T* const get_ptr(u32 addr)
|
2014-07-31 18:08:02 +02:00
|
|
|
{
|
2014-10-01 11:45:43 +02:00
|
|
|
return (T*)((u8*)g_base_addr + addr);
|
2014-07-31 18:08:02 +02:00
|
|
|
}
|
2014-11-19 15:16:30 +01:00
|
|
|
|
2014-09-15 00:17:24 +02:00
|
|
|
template<typename T>
|
|
|
|
|
T& get_ref(u32 addr)
|
2014-08-31 11:54:12 +02:00
|
|
|
{
|
2014-09-15 00:17:24 +02:00
|
|
|
return *get_ptr<T>(addr);
|
2014-08-31 11:54:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
namespace ps3
|
|
|
|
|
{
|
2014-11-19 15:16:30 +01:00
|
|
|
void init();
|
|
|
|
|
|
2014-09-15 00:17:24 +02:00
|
|
|
static u8 read8(u32 addr)
|
|
|
|
|
{
|
2014-10-01 11:45:43 +02:00
|
|
|
return *((u8*)g_base_addr + addr);
|
2014-09-15 00:17:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void write8(u32 addr, u8 value)
|
|
|
|
|
{
|
2014-10-01 11:45:43 +02:00
|
|
|
*((u8*)g_base_addr + addr) = value;
|
2014-09-15 00:17:24 +02:00
|
|
|
}
|
|
|
|
|
|
2014-08-31 11:54:12 +02:00
|
|
|
static u16 read16(u32 addr)
|
|
|
|
|
{
|
2014-10-01 11:45:43 +02:00
|
|
|
return re16(*(u16*)((u8*)g_base_addr + addr));
|
2014-09-15 00:17:24 +02:00
|
|
|
}
|
|
|
|
|
|
2014-11-19 15:16:30 +01:00
|
|
|
static void write16(u32 addr, be_t<u16> value)
|
2014-08-31 11:54:12 +02:00
|
|
|
{
|
2014-11-19 15:16:30 +01:00
|
|
|
*(be_t<u16>*)((u8*)g_base_addr + addr) = value;
|
2014-09-15 00:17:24 +02:00
|
|
|
}
|
|
|
|
|
|
2014-08-31 11:54:12 +02:00
|
|
|
static u32 read32(u32 addr)
|
|
|
|
|
{
|
|
|
|
|
if (addr < RAW_SPU_BASE_ADDR || (addr % RAW_SPU_OFFSET) < RAW_SPU_PROB_OFFSET)
|
|
|
|
|
{
|
2014-10-01 11:45:43 +02:00
|
|
|
return re32(*(u32*)((u8*)g_base_addr + addr));
|
2014-08-31 11:54:12 +02:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return Memory.ReadMMIO32((u32)addr);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-11-19 15:16:30 +01:00
|
|
|
static void write32(u32 addr, be_t<u32> value)
|
2014-08-31 11:54:12 +02:00
|
|
|
{
|
|
|
|
|
if (addr < RAW_SPU_BASE_ADDR || (addr % RAW_SPU_OFFSET) < RAW_SPU_PROB_OFFSET)
|
|
|
|
|
{
|
2014-11-19 15:16:30 +01:00
|
|
|
*(be_t<u32>*)((u8*)g_base_addr + addr) = value;
|
2014-08-31 11:54:12 +02:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
Memory.WriteMMIO32((u32)addr, value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static u64 read64(u32 addr)
|
|
|
|
|
{
|
2014-10-01 11:45:43 +02:00
|
|
|
return re64(*(u64*)((u8*)g_base_addr + addr));
|
2014-09-15 00:17:24 +02:00
|
|
|
}
|
|
|
|
|
|
2014-11-19 15:16:30 +01:00
|
|
|
static void write64(u32 addr, be_t<u64> value)
|
|
|
|
|
{
|
|
|
|
|
*(be_t<u64>*)((u8*)g_base_addr + addr) = value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void write16(u32 addr, u16 value)
|
|
|
|
|
{
|
|
|
|
|
write16(addr, be_t<u16>::make(value));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void write32(u32 addr, u32 value)
|
|
|
|
|
{
|
|
|
|
|
write32(addr, be_t<u32>::make(value));
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-31 11:54:12 +02:00
|
|
|
static void write64(u32 addr, u64 value)
|
|
|
|
|
{
|
2014-11-19 15:16:30 +01:00
|
|
|
write64(addr, be_t<u64>::make(value));
|
2014-09-15 00:17:24 +02:00
|
|
|
}
|
|
|
|
|
|
2014-08-31 11:54:12 +02:00
|
|
|
static u128 read128(u32 addr)
|
|
|
|
|
{
|
2014-10-01 11:45:43 +02:00
|
|
|
return re128(*(u128*)((u8*)g_base_addr + addr));
|
2014-09-15 00:17:24 +02:00
|
|
|
}
|
|
|
|
|
|
2014-08-31 11:54:12 +02:00
|
|
|
static void write128(u32 addr, u128 value)
|
|
|
|
|
{
|
2014-10-01 11:45:43 +02:00
|
|
|
*(u128*)((u8*)g_base_addr + addr) = re128(value);
|
2014-09-15 00:17:24 +02:00
|
|
|
}
|
2014-08-31 11:54:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
namespace psv
|
|
|
|
|
{
|
2014-11-19 15:16:30 +01:00
|
|
|
void init();
|
|
|
|
|
|
2014-09-15 00:17:24 +02:00
|
|
|
static u8 read8(u32 addr)
|
|
|
|
|
{
|
2014-10-01 11:45:43 +02:00
|
|
|
return *((u8*)g_base_addr + addr);
|
2014-09-15 00:17:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void write8(u32 addr, u8 value)
|
|
|
|
|
{
|
2014-10-01 11:45:43 +02:00
|
|
|
*((u8*)g_base_addr + addr) = value;
|
2014-09-15 00:17:24 +02:00
|
|
|
}
|
|
|
|
|
|
2014-08-31 11:54:12 +02:00
|
|
|
static u16 read16(u32 addr)
|
|
|
|
|
{
|
2014-10-01 11:45:43 +02:00
|
|
|
return *(u16*)((u8*)g_base_addr + addr);
|
2014-08-31 11:54:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void write16(u32 addr, u16 value)
|
|
|
|
|
{
|
2014-10-01 11:45:43 +02:00
|
|
|
*(u16*)((u8*)g_base_addr + addr) = value;
|
2014-08-31 11:54:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static u32 read32(u32 addr)
|
|
|
|
|
{
|
2014-10-01 11:45:43 +02:00
|
|
|
return *(u32*)((u8*)g_base_addr + addr);
|
2014-08-31 11:54:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void write32(u32 addr, u32 value)
|
|
|
|
|
{
|
2014-10-01 11:45:43 +02:00
|
|
|
*(u32*)((u8*)g_base_addr + addr) = value;
|
2014-08-31 11:54:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static u64 read64(u32 addr)
|
|
|
|
|
{
|
2014-10-01 11:45:43 +02:00
|
|
|
return *(u64*)((u8*)g_base_addr + addr);
|
2014-08-31 11:54:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void write64(u32 addr, u64 value)
|
|
|
|
|
{
|
2014-10-01 11:45:43 +02:00
|
|
|
*(u64*)((u8*)g_base_addr + addr) = value;
|
2014-08-31 11:54:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static u128 read128(u32 addr)
|
|
|
|
|
{
|
2014-10-01 11:45:43 +02:00
|
|
|
return *(u128*)((u8*)g_base_addr + addr);
|
2014-08-31 11:54:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void write128(u32 addr, u128 value)
|
|
|
|
|
{
|
2014-10-01 11:45:43 +02:00
|
|
|
*(u128*)((u8*)g_base_addr + addr) = value;
|
2014-08-31 11:54:12 +02:00
|
|
|
}
|
|
|
|
|
}
|
2014-11-19 15:16:30 +01:00
|
|
|
|
|
|
|
|
namespace psp
|
|
|
|
|
{
|
|
|
|
|
using namespace psv;
|
|
|
|
|
|
|
|
|
|
void init();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void close();
|
2014-07-31 18:08:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#include "vm_ref.h"
|
2014-08-31 01:38:55 +02:00
|
|
|
#include "vm_ptr.h"
|
2014-11-19 15:16:30 +01:00
|
|
|
#include "vm_var.h"
|