2013-11-09 02:05:58 +01:00
|
|
|
#include "stdafx.h"
|
2014-06-02 19:27:24 +02:00
|
|
|
#include "Emu/Memory/Memory.h"
|
|
|
|
|
#include "Emu/System.h"
|
2013-11-09 02:05:58 +01:00
|
|
|
#include "Emu/SysCalls/SysCalls.h"
|
2014-08-23 16:51:51 +02:00
|
|
|
|
2014-06-25 00:38:34 +02:00
|
|
|
#include "sys_rsx.h"
|
2013-11-09 02:05:58 +01:00
|
|
|
|
|
|
|
|
SysCallBase sys_rsx("sys_rsx");
|
|
|
|
|
|
2014-06-25 00:38:34 +02:00
|
|
|
s32 sys_rsx_device_open()
|
2013-11-09 02:05:58 +01:00
|
|
|
{
|
2014-07-21 16:42:43 +02:00
|
|
|
sys_rsx.Todo("sys_rsx_device_open()");
|
2013-11-09 02:05:58 +01:00
|
|
|
return CELL_OK;
|
|
|
|
|
}
|
|
|
|
|
|
2014-06-25 00:38:34 +02:00
|
|
|
s32 sys_rsx_device_close()
|
2013-11-09 02:05:58 +01:00
|
|
|
{
|
2014-07-21 16:42:43 +02:00
|
|
|
sys_rsx.Todo("sys_rsx_device_close()");
|
2013-11-09 02:05:58 +01:00
|
|
|
return CELL_OK;
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-16 23:45:56 +02:00
|
|
|
/*
|
|
|
|
|
* lv2 SysCall 668 (0x29C): sys_rsx_memory_allocate
|
|
|
|
|
* @param mem_handle (OUT): Context / ID, which is used by sys_rsx_memory_free to free allocated memory.
|
|
|
|
|
* @param mem_addr (OUT): Returns the local memory base address, usually 0xC0000000.
|
|
|
|
|
* @param size (IN): Local memory size. E.g. 0x0F900000 (249 MB).
|
|
|
|
|
* @param flags (IN): E.g. Immediate value passed in cellGcmSys is 8.
|
|
|
|
|
* @param a5 (IN): E.g. Immediate value passed in cellGcmSys is 0x00300000 (3 MB?).
|
|
|
|
|
* @param a6 (IN): E.g. Immediate value passed in cellGcmSys is 16.
|
|
|
|
|
* @param a7 (IN): E.g. Immediate value passed in cellGcmSys is 8.
|
|
|
|
|
*/
|
2014-09-01 02:51:48 +02:00
|
|
|
s32 sys_rsx_memory_allocate(vm::ptr<be_t<u32>> mem_handle, vm::ptr<be_t<u32>> mem_addr, u32 size, u64 flags, u64 a5, u64 a6, u64 a7)
|
2013-11-09 02:05:58 +01:00
|
|
|
{
|
2014-08-16 23:45:56 +02:00
|
|
|
sys_rsx.Todo("sys_rsx_memory_allocate(mem_handle_addr=0x%x, local_mem_addr=0x%x, size=0x%x, flags=0x%x, a5=%d, a6=%d, a7=%d)",
|
2014-09-01 02:51:48 +02:00
|
|
|
mem_handle.addr(), mem_addr.addr(), size, flags, a5, a6, a7);
|
2013-11-09 02:05:58 +01:00
|
|
|
return CELL_OK;
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-16 23:45:56 +02:00
|
|
|
/*
|
|
|
|
|
* lv2 SysCall 669 (0x29D): sys_rsx_memory_free
|
|
|
|
|
* @param mem_handle (OUT): Context / ID, for allocated local memory generated by sys_rsx_memory_allocate
|
|
|
|
|
*/
|
|
|
|
|
s32 sys_rsx_memory_free(u32 mem_handle)
|
2013-11-09 02:05:58 +01:00
|
|
|
{
|
2014-08-16 23:45:56 +02:00
|
|
|
sys_rsx.Todo("sys_rsx_memory_free(mem_handle=%d)", mem_handle);
|
2013-11-09 02:05:58 +01:00
|
|
|
return CELL_OK;
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-16 23:45:56 +02:00
|
|
|
/*
|
|
|
|
|
* lv2 SysCall 670 (0x29E): sys_rsx_context_allocate
|
2014-08-25 23:17:51 +02:00
|
|
|
* @param context_id (OUT): RSX context, E.g. 0x55555555 (in vsh.self)
|
2014-08-16 23:45:56 +02:00
|
|
|
* @param lpar_dma_control (OUT): Control register area. E.g. 0x60100000 (in vsh.self)
|
|
|
|
|
* @param lpar_driver_info (OUT): RSX data like frequencies, sizes, version... E.g. 0x60200000 (in vsh.self)
|
|
|
|
|
* @param lpar_reports (OUT): Report data area. E.g. 0x60300000 (in vsh.self)
|
|
|
|
|
* @param mem_ctx (IN): mem_ctx given by sys_rsx_memory_allocate
|
|
|
|
|
* @param system_mode (IN):
|
|
|
|
|
*/
|
2014-09-01 02:51:48 +02:00
|
|
|
s32 sys_rsx_context_allocate(vm::ptr<be_t<u32>> context_id, vm::ptr<be_t<u32>> lpar_dma_control, vm::ptr<be_t<u32>> lpar_driver_info, vm::ptr<be_t<u32>> lpar_reports, u64 mem_ctx, u64 system_mode)
|
2013-11-09 02:05:58 +01:00
|
|
|
{
|
2014-08-16 23:45:56 +02:00
|
|
|
sys_rsx.Todo("sys_rsx_context_allocate(context_id_addr=0x%x, lpar_dma_control_addr=0x%x, lpar_driver_info_addr=0x%x, lpar_reports_addr=0x%x, mem_ctx=0x%x, system_mode=0x%x)",
|
2014-09-01 02:51:48 +02:00
|
|
|
context_id.addr(), lpar_dma_control.addr(), lpar_driver_info.addr(), lpar_reports.addr(), mem_ctx, system_mode);
|
2014-08-16 23:45:56 +02:00
|
|
|
|
2013-11-09 02:05:58 +01:00
|
|
|
return CELL_OK;
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-16 23:45:56 +02:00
|
|
|
/*
|
|
|
|
|
* lv2 SysCall 671 (0x29F): sys_rsx_context_free
|
2014-08-25 23:17:51 +02:00
|
|
|
* @param context_id (IN): RSX context generated by sys_rsx_context_allocate to free the context.
|
2014-08-16 23:45:56 +02:00
|
|
|
*/
|
|
|
|
|
s32 sys_rsx_context_free(u32 context_id)
|
2013-11-09 02:05:58 +01:00
|
|
|
{
|
2014-08-16 23:45:56 +02:00
|
|
|
sys_rsx.Todo("sys_rsx_context_free(context_id=%d)", context_id);
|
2013-11-09 02:05:58 +01:00
|
|
|
return CELL_OK;
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-25 23:17:51 +02:00
|
|
|
/*
|
|
|
|
|
* lv2 SysCall 672 (0x2A0): sys_rsx_context_iomap
|
|
|
|
|
* @param context_id (IN): RSX context, E.g. 0x55555555 (in vsh.self)
|
|
|
|
|
* @param io (IN): IO offset mapping area. E.g. 0x00600000
|
|
|
|
|
* @param ea (IN): Start address of mapping area. E.g. 0x20400000
|
|
|
|
|
* @param size (IN): Size of mapping area in bytes. E.g. 0x00200000
|
|
|
|
|
* @param flags (IN):
|
|
|
|
|
*/
|
|
|
|
|
s32 sys_rsx_context_iomap(u32 context_id, u32 io, u32 ea, u32 size, u64 flags)
|
2013-11-09 02:05:58 +01:00
|
|
|
{
|
2014-08-25 23:17:51 +02:00
|
|
|
sys_rsx.Todo("sys_rsx_context_iomap(context_id=0x%x, io=0x%x, ea=0x%x, size=0x%x, flags=0x%llx)",
|
|
|
|
|
context_id, io, ea, size, flags);
|
2013-11-09 02:05:58 +01:00
|
|
|
return CELL_OK;
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-25 23:17:51 +02:00
|
|
|
/*
|
|
|
|
|
* lv2 SysCall 673 (0x2A1): sys_rsx_context_iounmap
|
|
|
|
|
* @param context_id (IN): RSX context, E.g. 0x55555555 (in vsh.self)
|
|
|
|
|
* @param a2 (IN): ?
|
|
|
|
|
* @param io_addr (IN): IO address. E.g. 0x00600000 (Start page 6)
|
|
|
|
|
* @param size (IN): Size to unmap in byte. E.g. 0x00200000
|
|
|
|
|
*/
|
|
|
|
|
s32 sys_rsx_context_iounmap(u32 context_id, u32 a2, u32 io_addr, u32 size)
|
2013-11-09 02:05:58 +01:00
|
|
|
{
|
2014-08-25 23:17:51 +02:00
|
|
|
sys_rsx.Todo("sys_rsx_context_iounmap(context_id=0x%x, a2=0x%x, io_addr=0x%x, size=0x%x)",
|
|
|
|
|
context_id, a2, io_addr, size);
|
2013-11-09 02:05:58 +01:00
|
|
|
return CELL_OK;
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-16 23:45:56 +02:00
|
|
|
/*
|
|
|
|
|
* lv2 SysCall 674 (0x2A2): sys_rsx_context_attribute
|
|
|
|
|
* @param context_id (IN): RSX context, e.g. 0x55555555
|
|
|
|
|
* @param package_id (IN):
|
|
|
|
|
* @param a3 (IN):
|
|
|
|
|
* @param a4 (IN):
|
|
|
|
|
* @param a5 (IN):
|
|
|
|
|
* @param a6 (IN):
|
|
|
|
|
*/
|
|
|
|
|
s32 sys_rsx_context_attribute(s32 context_id, u32 package_id, u64 a3, u64 a4, u64 a5, u64 a6)
|
2013-11-09 02:05:58 +01:00
|
|
|
{
|
2014-08-16 23:45:56 +02:00
|
|
|
sys_rsx.Todo("sys_rsx_context_attribute(context_id=0x%x, package_id=0x%x, a3=%llu, a4=%llu, a5=%llu, a6=%llu)",
|
|
|
|
|
context_id, package_id, a3, a4, a5, a6);
|
|
|
|
|
|
|
|
|
|
switch(package_id)
|
|
|
|
|
{
|
2014-08-18 16:37:23 +02:00
|
|
|
case 0x001: // FIFO
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 0x100: // Display mode set
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 0x101: // Display sync
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 0x102: // Display flip
|
2014-08-16 23:45:56 +02:00
|
|
|
break;
|
|
|
|
|
|
2014-08-18 16:37:23 +02:00
|
|
|
case 0x103: // ?
|
2014-08-16 23:45:56 +02:00
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 0x104: // Display buffer
|
|
|
|
|
break;
|
|
|
|
|
|
2014-08-18 16:37:23 +02:00
|
|
|
case 0x106: // ? (Used by cellGcmInitPerfMon)
|
|
|
|
|
break;
|
|
|
|
|
|
2014-08-16 23:45:56 +02:00
|
|
|
case 0x10a: // ?
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 0x300: // Tiles
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 0x301: // Depth-buffer (Z-cull)
|
|
|
|
|
break;
|
|
|
|
|
|
2014-08-18 16:37:23 +02:00
|
|
|
case 0x600: // Framebuffer setup
|
2014-08-17 11:22:36 +02:00
|
|
|
break;
|
2014-08-18 16:37:23 +02:00
|
|
|
|
|
|
|
|
case 0x601: // Framebuffer blit
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 0x602: // Framebuffer blit sync
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
return CELL_EINVAL;
|
2014-08-16 23:45:56 +02:00
|
|
|
}
|
2014-08-18 16:37:23 +02:00
|
|
|
|
2013-11-09 02:05:58 +01:00
|
|
|
return CELL_OK;
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-16 23:45:56 +02:00
|
|
|
/*
|
|
|
|
|
* lv2 SysCall 675 (0x2A3): sys_rsx_device_map
|
|
|
|
|
* @param a1 (OUT): For example: In vsh.self it is 0x60000000, global semaphore. For a game it is 0x40000000.
|
|
|
|
|
* @param a2 (OUT): Unused?
|
2014-08-18 16:37:23 +02:00
|
|
|
* @param dev_id (IN): An immediate value and always 8. (cellGcmInitPerfMon uses 11, 10, 9, 7, 12 successively).
|
2014-08-16 23:45:56 +02:00
|
|
|
*/
|
2014-09-01 02:51:48 +02:00
|
|
|
s32 sys_rsx_device_map(vm::ptr<be_t<u32>> a1, vm::ptr<be_t<u32>> a2, u32 dev_id)
|
2013-11-09 02:05:58 +01:00
|
|
|
{
|
2014-09-01 02:51:48 +02:00
|
|
|
sys_rsx.Todo("sys_rsx_device_map(a1_addr=0x%x, a2_addr=0x%x, a3=%d)", a1.addr(), a2.addr(), dev_id);
|
2014-08-16 23:45:56 +02:00
|
|
|
|
|
|
|
|
if (dev_id > 15) {
|
|
|
|
|
// TODO: Throw RSX error
|
|
|
|
|
return CELL_EINVAL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (dev_id == 0 || dev_id > 8) {
|
|
|
|
|
// TODO: lv1 related so we may ignore it.
|
|
|
|
|
// if (something) { return CELL_EPERM; }
|
|
|
|
|
}
|
|
|
|
|
|
2013-11-09 02:05:58 +01:00
|
|
|
return CELL_OK;
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-16 23:45:56 +02:00
|
|
|
/*
|
|
|
|
|
* lv2 SysCall 676 (0x2A4): sys_rsx_device_unmap
|
|
|
|
|
* @param dev_id (IN): An immediate value and always 8.
|
|
|
|
|
*/
|
|
|
|
|
s32 sys_rsx_device_unmap(u32 dev_id)
|
2013-11-09 02:05:58 +01:00
|
|
|
{
|
2014-08-16 23:45:56 +02:00
|
|
|
sys_rsx.Todo("sys_rsx_device_unmap(a1=%d)", dev_id);
|
2013-11-09 02:05:58 +01:00
|
|
|
return CELL_OK;
|
|
|
|
|
}
|
|
|
|
|
|
2014-06-25 00:38:34 +02:00
|
|
|
s32 sys_rsx_attribute()
|
2013-11-09 02:05:58 +01:00
|
|
|
{
|
2014-07-21 16:42:43 +02:00
|
|
|
sys_rsx.Todo("sys_rsx_attribute()");
|
2013-11-09 02:05:58 +01:00
|
|
|
return CELL_OK;
|
|
|
|
|
}
|