cellGcmSys updated

* cellGcmGetTiledPitchSize (thanks 3141card), cellGcmFunc15.
* sysPrxForUser: _sys_memset
* Created headers cellGcmSys.h and sysPrxForUser.h
* int, int32_t -> s32 and uint32_t -> u32.
This commit is contained in:
Alexandro Sánchez Bach 2014-08-01 01:52:43 +02:00
parent e3d38f704f
commit 48a339fd17
6 changed files with 115 additions and 74 deletions

View file

@ -5,6 +5,8 @@
#include "Emu/SysCalls/Modules.h" #include "Emu/SysCalls/Modules.h"
#include "Emu/SysCalls/SysCalls.h" #include "Emu/SysCalls/SysCalls.h"
#include "Emu/GS/GCM.h" #include "Emu/GS/GCM.h"
#include "sysPrxForUser.h"
#include "cellGcmSys.h"
//void cellGcmSys_init(); //void cellGcmSys_init();
//void cellGcmSys_load(); //void cellGcmSys_load();
@ -12,48 +14,22 @@
//Module cellGcmSys(0x0010, cellGcmSys_init, cellGcmSys_load, cellGcmSys_unload); //Module cellGcmSys(0x0010, cellGcmSys_init, cellGcmSys_load, cellGcmSys_unload);
Module *cellGcmSys = nullptr; Module *cellGcmSys = nullptr;
const u32 tiled_pitches[] = {
0x00000000, 0x00000200, 0x00000300, 0x00000400,
0x00000500, 0x00000600, 0x00000700, 0x00000800,
0x00000A00, 0x00000C00, 0x00000D00, 0x00000E00,
0x00001000, 0x00001400, 0x00001800, 0x00001A00,
0x00001C00, 0x00002000, 0x00002800, 0x00003000,
0x00003400, 0x00003800, 0x00004000, 0x00005000,
0x00006000, 0x00006800, 0x00007000, 0x00008000,
0x0000A000, 0x0000C000, 0x0000D000, 0x0000E000,
0x00010000
};
u32 local_size = 0; u32 local_size = 0;
u32 local_addr = 0; u32 local_addr = 0;
u32 system_mode = 0; u32 system_mode = 0;
enum
{
CELL_GCM_ERROR_FAILURE = 0x802100ff,
CELL_GCM_ERROR_NO_IO_PAGE_TABLE = 0x80210001,
CELL_GCM_ERROR_INVALID_ENUM = 0x80210002,
CELL_GCM_ERROR_INVALID_VALUE = 0x80210003,
CELL_GCM_ERROR_INVALID_ALIGNMENT = 0x80210004,
CELL_GCM_ERROR_ADDRESS_OVERWRAP = 0x80210005
};
// Function declaration
int cellGcmSetPrepareFlip(mem_ptr_t<CellGcmContextData> ctxt, u32 id);
//----------------------------------------------------------------------------
// Memory Mapping
//----------------------------------------------------------------------------
struct gcm_offset
{
u64 io;
u64 ea;
};
void InitOffsetTable();
int32_t cellGcmAddressToOffset(u64 address, mem32_t offset);
uint32_t cellGcmGetMaxIoMapSize();
void cellGcmGetOffsetTable(mem_ptr_t<gcm_offset> table);
int32_t cellGcmIoOffsetToAddress(u32 ioOffset, u64 address);
int32_t cellGcmMapEaIoAddress(const u32 ea, const u32 io, const u32 size);
int32_t cellGcmMapEaIoAddressWithFlags(const u32 ea, const u32 io, const u32 size, const u32 flags);
int32_t cellGcmMapMainMemory(u64 ea, u32 size, mem32_t offset);
int32_t cellGcmReserveIoMapSize(const u32 size);
int32_t cellGcmUnmapEaIoAddress(u64 ea);
int32_t cellGcmUnmapIoAddress(u64 io);
int32_t cellGcmUnreserveIoMapSize(u32 size);
//----------------------------------------------------------------------------
CellGcmConfig current_config; CellGcmConfig current_config;
CellGcmContextData current_context; CellGcmContextData current_context;
gcmInfo gcm_info; gcmInfo gcm_info;
@ -287,10 +263,14 @@ int cellGcmGetFlipStatus()
u32 cellGcmGetTiledPitchSize(u32 size) u32 cellGcmGetTiledPitchSize(u32 size)
{ {
cellGcmSys->Warning("cellGcmGetTiledPitchSize(size=%d)", size); cellGcmSys->Log("cellGcmGetTiledPitchSize(size=%d)", size);
// TODO:
return size; for (size_t i=0; i < sizeof(tiled_pitches)/sizeof(tiled_pitches[0]) - 1; i++) {
if (tiled_pitches[i] < size && size <= tiled_pitches[i+1]) {
return tiled_pitches[i+1];
}
}
return 0;
} }
int cellGcmInit(u32 context_addr, u32 cmdSize, u32 ioSize, u32 ioAddress) int cellGcmInit(u32 context_addr, u32 cmdSize, u32 ioSize, u32 ioAddress)
@ -467,7 +447,7 @@ void cellGcmSetFlipStatus()
Emu.GetGSManager().GetRender().m_flip_status = 0; Emu.GetGSManager().GetRender().m_flip_status = 0;
} }
int cellGcmSetPrepareFlip(mem_ptr_t<CellGcmContextData> ctxt, u32 id) s32 cellGcmSetPrepareFlip(mem_ptr_t<CellGcmContextData> ctxt, u32 id)
{ {
cellGcmSys->Log("cellGcmSetPrepareFlip(ctx=0x%x, id=0x%x)", ctxt.GetAddr(), id); cellGcmSys->Log("cellGcmSetPrepareFlip(ctx=0x%x, id=0x%x)", ctxt.GetAddr(), id);
@ -808,7 +788,7 @@ void InitOffsetTable()
} }
} }
int32_t cellGcmAddressToOffset(u64 address, mem32_t offset) s32 cellGcmAddressToOffset(u64 address, mem32_t offset)
{ {
cellGcmSys->Log("cellGcmAddressToOffset(address=0x%x,offset_addr=0x%x)", address, offset.GetAddr()); cellGcmSys->Log("cellGcmAddressToOffset(address=0x%x,offset_addr=0x%x)", address, offset.GetAddr());
@ -827,14 +807,11 @@ int32_t cellGcmAddressToOffset(u64 address, mem32_t offset)
{ {
u16 upper12Bits = Memory.Read16(offsetTable.io + sizeof(u16)*(address >> 20)); u16 upper12Bits = Memory.Read16(offsetTable.io + sizeof(u16)*(address >> 20));
if (upper12Bits != 0xFFFF) if (upper12Bits != 0xFFFF) {
{
result = (((u64)upper12Bits << 20) | (address & (0xFFFFF))); result = (((u64)upper12Bits << 20) | (address & (0xFFFFF)));
} }
// address is not mapped in IO // address is not mapped in IO
else else {
{
return CELL_GCM_ERROR_FAILURE; return CELL_GCM_ERROR_FAILURE;
} }
} }
@ -843,7 +820,7 @@ int32_t cellGcmAddressToOffset(u64 address, mem32_t offset)
return CELL_OK; return CELL_OK;
} }
uint32_t cellGcmGetMaxIoMapSize() u32 cellGcmGetMaxIoMapSize()
{ {
return Memory.RSXIOMem.GetEndAddr() - Memory.RSXIOMem.GetStartAddr() - Memory.RSXIOMem.GetReservedAmount(); return Memory.RSXIOMem.GetEndAddr() - Memory.RSXIOMem.GetStartAddr() - Memory.RSXIOMem.GetReservedAmount();
} }
@ -854,7 +831,7 @@ void cellGcmGetOffsetTable(mem_ptr_t<gcm_offset> table)
table->ea = re(offsetTable.ea); table->ea = re(offsetTable.ea);
} }
int32_t cellGcmIoOffsetToAddress(u32 ioOffset, u64 address) s32 cellGcmIoOffsetToAddress(u32 ioOffset, u64 address)
{ {
u64 realAddr; u64 realAddr;
@ -866,7 +843,7 @@ int32_t cellGcmIoOffsetToAddress(u32 ioOffset, u64 address)
return CELL_OK; return CELL_OK;
} }
int32_t cellGcmMapEaIoAddress(const u32 ea, const u32 io, const u32 size) s32 cellGcmMapEaIoAddress(u32 ea, u32 io, u32 size)
{ {
cellGcmSys->Warning("cellGcmMapEaIoAddress(ea=0x%x, io=0x%x, size=0x%x)", ea, io, size); cellGcmSys->Warning("cellGcmMapEaIoAddress(ea=0x%x, io=0x%x, size=0x%x)", ea, io, size);
@ -891,13 +868,13 @@ int32_t cellGcmMapEaIoAddress(const u32 ea, const u32 io, const u32 size)
return CELL_OK; return CELL_OK;
} }
int32_t cellGcmMapEaIoAddressWithFlags(const u32 ea, const u32 io, const u32 size, const u32 flags) s32 cellGcmMapEaIoAddressWithFlags(u32 ea, u32 io, u32 size, u32 flags)
{ {
cellGcmSys->Warning("cellGcmMapEaIoAddressWithFlags(ea=0x%x, io=0x%x, size=0x%x, flags=0x%x)", ea, io, size, flags); cellGcmSys->Warning("cellGcmMapEaIoAddressWithFlags(ea=0x%x, io=0x%x, size=0x%x, flags=0x%x)", ea, io, size, flags);
return cellGcmMapEaIoAddress(ea, io, size); // TODO: strict ordering return cellGcmMapEaIoAddress(ea, io, size); // TODO: strict ordering
} }
int32_t cellGcmMapLocalMemory(u64 address, u64 size) s32 cellGcmMapLocalMemory(u64 address, u64 size)
{ {
if (!local_size && !local_addr) if (!local_size && !local_addr)
{ {
@ -916,7 +893,7 @@ int32_t cellGcmMapLocalMemory(u64 address, u64 size)
return CELL_OK; return CELL_OK;
} }
int32_t cellGcmMapMainMemory(u64 ea, u32 size, mem32_t offset) s32 cellGcmMapMainMemory(u64 ea, u32 size, mem32_t offset)
{ {
cellGcmSys->Warning("cellGcmMapMainMemory(ea=0x%x,size=0x%x,offset_addr=0x%x)", ea, size, offset.GetAddr()); cellGcmSys->Warning("cellGcmMapMainMemory(ea=0x%x,size=0x%x,offset_addr=0x%x)", ea, size, offset.GetAddr());
@ -950,7 +927,7 @@ int32_t cellGcmMapMainMemory(u64 ea, u32 size, mem32_t offset)
return CELL_OK; return CELL_OK;
} }
int32_t cellGcmReserveIoMapSize(const u32 size) s32 cellGcmReserveIoMapSize(u32 size)
{ {
if (size & 0xFFFFF) if (size & 0xFFFFF)
{ {
@ -968,7 +945,7 @@ int32_t cellGcmReserveIoMapSize(const u32 size)
return CELL_OK; return CELL_OK;
} }
int32_t cellGcmUnmapEaIoAddress(u64 ea) s32 cellGcmUnmapEaIoAddress(u64 ea)
{ {
u32 size = Memory.RSXIOMem.UnmapRealAddress(ea); u32 size = Memory.RSXIOMem.UnmapRealAddress(ea);
if (size) if (size)
@ -992,7 +969,7 @@ int32_t cellGcmUnmapEaIoAddress(u64 ea)
return CELL_OK; return CELL_OK;
} }
int32_t cellGcmUnmapIoAddress(u64 io) s32 cellGcmUnmapIoAddress(u64 io)
{ {
u32 size = Memory.RSXIOMem.UnmapAddress(io); u32 size = Memory.RSXIOMem.UnmapAddress(io);
if (size) if (size)
@ -1016,7 +993,7 @@ int32_t cellGcmUnmapIoAddress(u64 io)
return CELL_OK; return CELL_OK;
} }
int32_t cellGcmUnreserveIoMapSize(u32 size) s32 cellGcmUnreserveIoMapSize(u32 size)
{ {
if (size & 0xFFFFF) if (size & 0xFFFFF)
@ -1094,9 +1071,15 @@ int cellGcmSetFlipCommand(u32 ctx, u32 id)
return cellGcmSetPrepareFlip(ctx, id); return cellGcmSetPrepareFlip(ctx, id);
} }
s64 cellGcmFunc15() s64 cellGcmFunc15(u32 unk_addr)
{ {
cellGcmSys->Todo("cellGcmFunc15()"); cellGcmSys->Todo("cellGcmFunc15(unk_addr=0x%x)", unk_addr);
if (0/*TODO: If what?*/) {
_sys_memset(unk_addr, 0, 0x84);
}
// TODO
return 0; return 0;
} }

View file

@ -0,0 +1,35 @@
#pragma once
enum
{
CELL_GCM_ERROR_FAILURE = 0x802100ff,
CELL_GCM_ERROR_NO_IO_PAGE_TABLE = 0x80210001,
CELL_GCM_ERROR_INVALID_ENUM = 0x80210002,
CELL_GCM_ERROR_INVALID_VALUE = 0x80210003,
CELL_GCM_ERROR_INVALID_ALIGNMENT = 0x80210004,
CELL_GCM_ERROR_ADDRESS_OVERWRAP = 0x80210005
};
struct gcm_offset
{
u64 io;
u64 ea;
};
// Auxiliary functions
void InitOffsetTable();
// SysCalls
s32 cellGcmSetPrepareFlip(mem_ptr_t<CellGcmContextData> ctxt, u32 id);
s32 cellGcmAddressToOffset(u64 address, mem32_t offset);
u32 cellGcmGetMaxIoMapSize();
void cellGcmGetOffsetTable(mem_ptr_t<gcm_offset> table);
s32 cellGcmIoOffsetToAddress(u32 ioOffset, u64 address);
s32 cellGcmMapEaIoAddress(u32 ea, u32 io, u32 size);
s32 cellGcmMapEaIoAddressWithFlags(u32 ea, u32 io, u32 size, u32 flags);
s32 cellGcmMapMainMemory(u64 ea, u32 size, mem32_t offset);
s32 cellGcmReserveIoMapSize(u32 size);
s32 cellGcmUnmapEaIoAddress(u64 ea);
s32 cellGcmUnmapIoAddress(u64 io);
s32 cellGcmUnreserveIoMapSize(u32 size);

View file

@ -10,25 +10,12 @@
#include "Emu/SysCalls/lv2/sys_spu.h" #include "Emu/SysCalls/lv2/sys_spu.h"
#include "Loader/ELF.h" #include "Loader/ELF.h"
#include "Emu/Cell/RawSPUThread.h" #include "Emu/Cell/RawSPUThread.h"
#include "sysPrxForUser.h"
//void sysPrxForUser_init(); //void sysPrxForUser_init();
//Module sysPrxForUser("sysPrxForUser", sysPrxForUser_init); //Module sysPrxForUser("sysPrxForUser", sysPrxForUser_init);
Module *sysPrxForUser = nullptr; Module *sysPrxForUser = nullptr;
struct HeapInfo
{
u32 heap_addr;
u32 align;
u32 size;
HeapInfo(u32 _heap_addr, u32 _align, u32 _size)
: heap_addr(_heap_addr)
, align(_align)
, size(_size)
{
}
};
int sys_heap_create_heap(const u32 heap_addr, const u32 align, const u32 size) int sys_heap_create_heap(const u32 heap_addr, const u32 align, const u32 size)
{ {
sysPrxForUser->Warning("sys_heap_create_heap(heap_addr=0x%x, align=0x%x, size=0x%x)", heap_addr, align, size); sysPrxForUser->Warning("sys_heap_create_heap(heap_addr=0x%x, align=0x%x, size=0x%x)", heap_addr, align, size);
@ -177,6 +164,14 @@ int sys_raw_spu_image_load(int id, mem_ptr_t<sys_spu_image> img)
return CELL_OK; return CELL_OK;
} }
s32 _sys_memset(u32 addr, s32 value, u32 size)
{
sysPrxForUser->Log("_sys_memset(addr=0x%x, value=%d, size=%d)", addr, value, size);
memset(Memory + addr, value, size);
return CELL_OK;
}
void sysPrxForUser_init() void sysPrxForUser_init()
{ {
sysPrxForUser->AddFunc(0x744680a2, sys_initialize_tls); sysPrxForUser->AddFunc(0x744680a2, sys_initialize_tls);
@ -249,4 +244,6 @@ void sysPrxForUser_init()
sysPrxForUser->AddFunc(0x67f9fedb, sys_game_process_exitspawn2); sysPrxForUser->AddFunc(0x67f9fedb, sys_game_process_exitspawn2);
sysPrxForUser->AddFunc(0xfc52a7a9, sys_game_process_exitspawn); sysPrxForUser->AddFunc(0xfc52a7a9, sys_game_process_exitspawn);
sysPrxForUser->AddFunc(0x68b9b011, _sys_memset);
} }

View file

@ -0,0 +1,18 @@
# pragma once
struct HeapInfo
{
u32 heap_addr;
u32 align;
u32 size;
HeapInfo(u32 _heap_addr, u32 _align, u32 _size)
: heap_addr(_heap_addr)
, align(_align)
, size(_size)
{
}
};
// SysCalls
s32 _sys_memset(u32 addr, s32 value, u32 num);

View file

@ -346,6 +346,7 @@
<ClInclude Include="Emu\SysCalls\Modules\cellDmux.h" /> <ClInclude Include="Emu\SysCalls\Modules\cellDmux.h" />
<ClInclude Include="Emu\SysCalls\Modules\cellFont.h" /> <ClInclude Include="Emu\SysCalls\Modules\cellFont.h" />
<ClInclude Include="Emu\SysCalls\Modules\cellGame.h" /> <ClInclude Include="Emu\SysCalls\Modules\cellGame.h" />
<ClInclude Include="Emu\SysCalls\Modules\cellGcmSys.h" />
<ClInclude Include="Emu\SysCalls\Modules\cellGifDec.h" /> <ClInclude Include="Emu\SysCalls\Modules\cellGifDec.h" />
<ClInclude Include="Emu\SysCalls\Modules\cellJpgDec.h" /> <ClInclude Include="Emu\SysCalls\Modules\cellJpgDec.h" />
<ClInclude Include="Emu\SysCalls\Modules\cellNetCtl.h" /> <ClInclude Include="Emu\SysCalls\Modules\cellNetCtl.h" />
@ -367,6 +368,7 @@
<ClInclude Include="Emu\SysCalls\Modules\libsynth2.h" /> <ClInclude Include="Emu\SysCalls\Modules\libsynth2.h" />
<ClInclude Include="Emu\SysCalls\Modules\sceNp.h" /> <ClInclude Include="Emu\SysCalls\Modules\sceNp.h" />
<ClInclude Include="Emu\SysCalls\Modules\sceNpTrophy.h" /> <ClInclude Include="Emu\SysCalls\Modules\sceNpTrophy.h" />
<ClInclude Include="Emu\SysCalls\Modules\sysPrxForUser.h" />
<ClInclude Include="Emu\SysCalls\Modules\sys_net.h" /> <ClInclude Include="Emu\SysCalls\Modules\sys_net.h" />
<ClInclude Include="Emu\SysCalls\SC_FUNC.h" /> <ClInclude Include="Emu\SysCalls\SC_FUNC.h" />
<ClInclude Include="Emu\SysCalls\Static.h" /> <ClInclude Include="Emu\SysCalls\Static.h" />

View file

@ -1105,5 +1105,11 @@
<ClInclude Include="Emu\SysCalls\LogBase.h"> <ClInclude Include="Emu\SysCalls\LogBase.h">
<Filter>Emu\SysCalls</Filter> <Filter>Emu\SysCalls</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Emu\SysCalls\Modules\cellGcmSys.h">
<Filter>Emu\SysCalls\Modules</Filter>
</ClInclude>
<ClInclude Include="Emu\SysCalls\Modules\sysPrxForUser.h">
<Filter>Emu\SysCalls\Modules</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
</Project> </Project>