From 6beec80b60aa532a1547873e2f048c7ee6e99101 Mon Sep 17 00:00:00 2001 From: Raul Tambre Date: Wed, 15 Jul 2015 16:21:41 +0300 Subject: [PATCH] Draft socketselect, other minor fixes --- rpcs3/Emu/SysCalls/Modules/cellFont.cpp | 2 +- rpcs3/Emu/SysCalls/Modules/cellSail.h | 130 ++++++++++----------- rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp | 2 +- rpcs3/Emu/SysCalls/Modules/sys_net.cpp | 73 +++++++++--- rpcs3/Emu/SysCalls/Modules/sys_net.h | 5 + rpcs3/Loader/TRP.cpp | 6 +- 6 files changed, 136 insertions(+), 82 deletions(-) diff --git a/rpcs3/Emu/SysCalls/Modules/cellFont.cpp b/rpcs3/Emu/SysCalls/Modules/cellFont.cpp index 9494a242418b..b2d882c9714c 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellFont.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellFont.cpp @@ -528,7 +528,7 @@ s32 cellFontDeleteGlyph() s32 cellFontExtend(u32 a1, u32 a2, u32 a3) { - cellFont.Warning("cellFontExtend(a1=0x%x, a2=0x%x, a3=0x%x)", a1, a2, a3); + cellFont.Todo("cellFontExtend(a1=0x%x, a2=0x%x, a3=0x%x)", a1, a2, a3); //In a test I did: a1=0xcfe00000, a2=0x0, a3=(pointer to something) if (a1 == 0xcfe00000) { diff --git a/rpcs3/Emu/SysCalls/Modules/cellSail.h b/rpcs3/Emu/SysCalls/Modules/cellSail.h index e8eee799b38a..93167e396740 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSail.h +++ b/rpcs3/Emu/SysCalls/Modules/cellSail.h @@ -620,64 +620,64 @@ union CellSailEvent }; }; -typedef u32(CellSailMemAllocatorFuncAlloc)(u32 pArg, u32 boundary, u32 size); -typedef u32(CellSailMemAllocatorFuncFree)(u32 pArg, u32 boundary, u32 pMemory); - -typedef int(CellSailSoundAdapterFuncMakeup)(u32 pArg); -typedef int(CellSailSoundAdapterFuncCleanup)(u32 pArg); -typedef void(CellSailSoundAdapterFuncFormatChanged)(u32 pArg, vm::ptr pFormat, u32 sessionId); - -typedef int(CellSailGraphicsAdapterFuncMakeup)(u32 pArg); -typedef int(CellSailGraphicsAdapterFuncCleanup)(u32 pArg); -typedef void(CellSailGraphicsAdapterFuncFormatChanged)(u32 pArg, vm::ptr pFormat, u32 sessionId); -typedef int(CellSailGraphicsAdapterFuncAllocFrame)(u32 pArg, u32 size, s32 num, u8 ppFrame); -typedef int(CellSailGraphicsAdapterFuncFreeFrame)(u32 pArg, s32 num, u8 ppFrame); - -typedef int(CellSailSourceFuncMakeup)(u32 pArg, s8 pProtocolNames); -typedef int(CellSailSourceFuncCleanup)(u32 pArg); -typedef void(CellSailSourceFuncOpen)(u32 pArg, s32 streamType, u32 pMediaInfo, s8 pUri, vm::ptr pProfile); -typedef void(CellSailSourceFuncClose)(u32 pArg); -typedef void(CellSailSourceFuncStart)(u32 pArg, vm::ptr pCommand, u32 sessionId); -typedef void(CellSailSourceFuncStop)(u32 pArg); -typedef void(CellSailSourceFuncCancel)(u32 pArg); -typedef int(CellSailSourceFuncCheckout)(u32 pArg, vm::ptr ppItem); -typedef int(CellSailSourceFuncCheckin)(u32 pArg, vm::ptr pItem); -typedef int(CellSailSourceFuncClear)(u32 pArg); -typedef int(CellSailSourceFuncRead)(u32 pArg, s32 streamType, u32 pMediaInfo, s8 pUri, u64 offset, u8 pBuf, u32 size, u64 pTotalSize); -typedef int(CellSailSourceFuncReadSync)(u32 pArg, s32 streamType, u32 pMediaInfo, s8 pUri, u64 offset, u8 pBuf, u32 size, u64 pTotalSize); -typedef int(CellSailSourceFuncGetCapabilities)(u32 pArg, s32 streamType, u32 pMediaInfo, s8 pUri, u64 pCapabilities); -typedef int(CellSailSourceFuncInquireCapability)(u32 pArg, s32 streamType, u32 pMediaInfo, s8 pUri, vm::ptr pCommand); -typedef void(CellSailSourceCheckFuncError)(u32 pArg, s8 pMsg, s32 line); - -typedef int(CellSailFsFuncOpen)(s8 pPath, s32 flag, s32 pFd, u32 pArg, u64 size); -typedef int(CellSailFsFuncOpenSecond)(s8 pPath, s32 flag, s32 fd, u32 pArg, u64 size); -typedef int(CellSailFsFuncClose)(s32 fd); -typedef int(CellSailFsFuncFstat)(s32 fd, u32 pStat_addr); -typedef int(CellSailFsFuncRead)(s32 fd, u32 pBuf, u64 numBytes, u64 pNumRead); -typedef int(CellSailFsFuncLseek)(s32 fd, s64 offset, s32 whence, u64 pPosition); -typedef int(CellSailFsFuncCancel)(s32 fd); - -typedef int(CellSailRendererAudioFuncMakeup)(u32 pArg); -typedef int(CellSailRendererAudioFuncCleanup)(u32 pArg); -typedef void(CellSailRendererAudioFuncOpen)(u32 pArg, vm::ptr pInfo, u32 frameNum); -typedef void(CellSailRendererAudioFuncClose)(u32 pArg); -typedef void(CellSailRendererAudioFuncStart)(u32 pArg, bool buffering); -typedef void(CellSailRendererAudioFuncStop)(u32 pArg, bool flush); -typedef void(CellSailRendererAudioFuncCancel)(u32 pArg); -typedef int(CellSailRendererAudioFuncCheckout)(u32 pArg, vm::ptr ppInfo); -typedef int(CellSailRendererAudioFuncCheckin)(u32 pArg, vm::ptr pInfo); - -typedef int(CellSailRendererVideoFuncMakeup)(u32 pArg); -typedef int(CellSailRendererVideoFuncCleanup)(u32 pArg); -typedef void(CellSailRendererVideoFuncOpen)(u32 pArg, vm::ptr pInfo, u32 frameNum, u32 minFrameNum); -typedef void(CellSailRendererVideoFuncClose)(u32 pArg); -typedef void(CellSailRendererVideoFuncStart)(u32 pArg, bool buffering); -typedef void(CellSailRendererVideoFuncStop)(u32 pArg, bool flush, bool keepRendering); -typedef void(CellSailRendererVideoFuncCancel)(u32 pArg); -typedef int(CellSailRendererVideoFuncCheckout)(u32 pArg, vm::ptr ppInfo); -typedef int(CellSailRendererVideoFuncCheckin)(u32 pArg, vm::ptr pInfo); - -typedef void(CellSailPlayerFuncNotified)(u32 pArg, vm::ptr event, u64 arg0, u64 arg1); +typedef vm::ptr(CellSailMemAllocatorFuncAlloc)(vm::ptr pArg, u32 boundary, u32 size); +typedef u32(CellSailMemAllocatorFuncFree)(vm::ptr pArg, u32 boundary, vm::ptr pMemory); + +typedef s32(CellSailSoundAdapterFuncMakeup)(vm::ptr pArg); +typedef s32(CellSailSoundAdapterFuncCleanup)(vm::ptr pArg); +typedef u32(CellSailSoundAdapterFuncFormatChanged)(vm::ptr pArg, vm::ptr pFormat, u32 sessionId); + +typedef s32(CellSailGraphicsAdapterFuncMakeup)(vm::ptr pArg); +typedef s32(CellSailGraphicsAdapterFuncCleanup)(vm::ptr pArg); +typedef u32(CellSailGraphicsAdapterFuncFormatChanged)(vm::ptr pArg, vm::ptr pFormat, u32 sessionId); +typedef s32(CellSailGraphicsAdapterFuncAllocFrame)(vm::ptr pArg, u32 size, s32 num, vm::ptr ppFrame); +typedef s32(CellSailGraphicsAdapterFuncFreeFrame)(vm::ptr pArg, s32 num, vm::ptr ppFrame); + +typedef s32(CellSailSourceFuncMakeup)(vm::ptr pArg, vm::cptr pProtocolNames); +typedef s32(CellSailSourceFuncCleanup)(vm::ptr pArg); +typedef u32(CellSailSourceFuncOpen)(vm::ptr pArg, s32 streamType, vm::ptr pMediaInfo, vm::cptr pUri, vm::ptr pProfile); +typedef u32(CellSailSourceFuncClose)(vm::ptr pArg); +typedef u32(CellSailSourceFuncStart)(vm::ptr pArg, vm::ptr pCommand, u32 sessionId); +typedef u32(CellSailSourceFuncStop)(vm::ptr pArg); +typedef u32(CellSailSourceFuncCancel)(vm::ptr pArg); +typedef s32(CellSailSourceFuncCheckout)(vm::ptr pArg, vm::ptr ppItem); +typedef s32(CellSailSourceFuncCheckin)(vm::ptr pArg, vm::ptr pItem); +typedef s32(CellSailSourceFuncClear)(vm::ptr pArg); +typedef s32(CellSailSourceFuncRead)(vm::ptr pArg, s32 streamType, vm::ptr pMediaInfo, vm::cptr pUri, u64 offset, vm::ptr pBuf, u32 size, vm::ptr pTotalSize); +typedef s32(CellSailSourceFuncReadSync)(vm::ptr pArg, s32 streamType, vm::ptr pMediaInfo, vm::cptr pUri, u64 offset, vm::ptr pBuf, u32 size, vm::ptr pTotalSize); +typedef s32(CellSailSourceFuncGetCapabilities)(vm::ptr pArg, s32 streamType, vm::ptr pMediaInfo, vm::cptr pUri, vm::ptr pCapabilities); +typedef s32(CellSailSourceFuncInquireCapability)(vm::ptr pArg, s32 streamType, vm::ptr pMediaInfo, vm::cptr pUri, vm::ptr pCommand); +typedef u32(CellSailSourceCheckFuncError)(vm::ptr pArg, vm::cptr pMsg, s32 line); + +typedef s32(CellSailFsFuncOpen)(vm::cptr pPath, s32 flag, vm::ptr pFd, vm::ptr pArg, u64 size); +typedef s32(CellSailFsFuncOpenSecond)(vm::cptr pPath, s32 flag, s32 fd, vm::ptr pArg, u64 size); +typedef s32(CellSailFsFuncClose)(s32 fd); +typedef s32(CellSailFsFuncFstat)(s32 fd, vm::ptr pStat_addr); +typedef s32(CellSailFsFuncRead)(s32 fd, vm::ptr pBuf, u64 numBytes, vm::ptr pNumRead); +typedef s32(CellSailFsFuncLseek)(s32 fd, s64 offset, s32 whence, vm::ptr pPosition); +typedef s32(CellSailFsFuncCancel)(s32 fd); + +typedef s32(CellSailRendererAudioFuncMakeup)(vm::ptr pArg); +typedef s32(CellSailRendererAudioFuncCleanup)(vm::ptr pArg); +typedef u32(CellSailRendererAudioFuncOpen)(vm::ptr pArg, vm::ptr pInfo, u32 frameNum); +typedef u32(CellSailRendererAudioFuncClose)(vm::ptr pArg); +typedef u32(CellSailRendererAudioFuncStart)(vm::ptr pArg, bool buffering); +typedef u32(CellSailRendererAudioFuncStop)(vm::ptr pArg, bool flush); +typedef u32(CellSailRendererAudioFuncCancel)(vm::ptr pArg); +typedef s32(CellSailRendererAudioFuncCheckout)(vm::ptr pArg, vm::ptr ppInfo); +typedef s32(CellSailRendererAudioFuncCheckin)(vm::ptr pArg, vm::ptr pInfo); + +typedef s32(CellSailRendererVideoFuncMakeup)(vm::ptr pArg); +typedef s32(CellSailRendererVideoFuncCleanup)(vm::ptr pArg); +typedef u32(CellSailRendererVideoFuncOpen)(vm::ptr pArg, vm::ptr pInfo, u32 frameNum, u32 minFrameNum); +typedef u32(CellSailRendererVideoFuncClose)(vm::ptr pArg); +typedef u32(CellSailRendererVideoFuncStart)(vm::ptr pArg, bool buffering); +typedef u32(CellSailRendererVideoFuncStop)(vm::ptr pArg, bool flush, bool keepRendering); +typedef u32(CellSailRendererVideoFuncCancel)(vm::ptr pArg); +typedef s32(CellSailRendererVideoFuncCheckout)(vm::ptr pArg, vm::ptr ppInfo); +typedef s32(CellSailRendererVideoFuncCheckin)(vm::ptr pArg, vm::ptr pInfo); + +typedef void(CellSailPlayerFuncNotified)(vm::ptr pArg, CellSailEvent event, u64 arg0, u64 arg1); struct CellSailMemAllocatorFuncs { @@ -855,8 +855,8 @@ struct CellSailMp4DateTime be_t day; be_t month; be_t year; - //be_t reserved0; - //be_t reserved1; + be_t reserved0; + be_t reserved1; }; struct CellSailMp4Movie @@ -871,7 +871,7 @@ struct CellSailMp4MovieInfo be_t trackCount; be_t movieTimeScale; be_t movieDuration; - //be_t reserved[16]; + be_t reserved[16]; }; struct CellSailMp4Track @@ -893,7 +893,7 @@ struct CellSailMp4TrackInfo be_t language; be_t reserved2; be_t mediaType; - //be_t reserved3[3]; + be_t reserved3[3]; }; struct CellSailAviMovie @@ -913,8 +913,8 @@ struct CellSailAviMovieInfo be_t scale; be_t rate; be_t length; - //be_t reserved1; - //be_t reserved2; + be_t reserved1; + be_t reserved2; }; struct CellSailAviMainHeader @@ -929,7 +929,7 @@ struct CellSailAviMainHeader be_t suggestedBufferSize; be_t width; be_t height; - //be_t reserved[4]; + be_t reserved[4]; }; struct CellSailAviExtendedHeader diff --git a/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp b/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp index 8366138ff394..e1a51f781a75 100644 --- a/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp @@ -231,7 +231,7 @@ s32 sceNpTrophyRegisterContext(PPUThread& CPU, u32 context, u32 handle, vm::ptr< s32 sceNpTrophyGetRequiredDiskSpace(u32 context, u32 handle, vm::ptr reqspace, u64 options) { - sceNpTrophy.Error("sceNpTrophyGetRequiredDiskSpace(context=0x%x, handle=0x%x, reqspace*=0x%x, options=0x%llx)", context, handle, reqspace, options); + sceNpTrophy.Todo("sceNpTrophyGetRequiredDiskSpace(context=0x%x, handle=0x%x, reqspace*=0x%x, options=0x%llx)", context, handle, reqspace, options); const auto ctxt = Emu.GetIdManager().get(context); diff --git a/rpcs3/Emu/SysCalls/Modules/sys_net.cpp b/rpcs3/Emu/SysCalls/Modules/sys_net.cpp index e20bf4c0b6e5..9d689348a5d3 100644 --- a/rpcs3/Emu/SysCalls/Modules/sys_net.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sys_net.cpp @@ -98,6 +98,7 @@ namespace sys_net_func s32 accept(s32 s, vm::ptr addr, vm::ptr paddrlen) { sys_net.Warning("accept(s=%d, family=*0x%x, paddrlen=*0x%x)", s, addr, paddrlen); + if (!addr) { int ret = ::accept(s, nullptr, nullptr); *g_lastError = getLastError(); @@ -108,7 +109,7 @@ namespace sys_net_func memcpy(&_addr, addr.get_ptr(), sizeof(sockaddr)); _addr.sa_family = addr->sa_family; pck_len_t _paddrlen; - int ret = ::accept(s, &_addr, &_paddrlen); + s32 ret = ::accept(s, &_addr, &_paddrlen); *paddrlen = _paddrlen; *g_lastError = getLastError(); return ret; @@ -118,26 +119,30 @@ namespace sys_net_func s32 bind(s32 s, vm::ptr addr, u32 addrlen) { sys_net.Warning("bind(s=%d, family=*0x%x, addrlen=%d)", s, addr, addrlen); + sockaddr_in saddr; memcpy(&saddr, addr.get_ptr(), sizeof(sockaddr_in)); saddr.sin_family = addr->sin_family; const char *ipaddr = inet_ntoa(saddr.sin_addr); sys_net.Warning("binding on %s to port %d", ipaddr, ntohs(saddr.sin_port)); - int ret = ::bind(s, (const sockaddr *)&saddr, addrlen); + s32 ret = ::bind(s, (const sockaddr *)&saddr, addrlen); *g_lastError = getLastError(); + return ret; } s32 connect(s32 s, vm::ptr addr, u32 addrlen) { sys_net.Warning("connect(s=%d, family=*0x%x, addrlen=%d)", s, addr, addrlen); + sockaddr_in saddr; memcpy(&saddr, addr.get_ptr(), sizeof(sockaddr_in)); saddr.sin_family = addr->sin_family; const char *ipaddr = inet_ntoa(saddr.sin_addr); sys_net.Warning("connecting on %s to port %d", ipaddr, ntohs(saddr.sin_port)); - int ret = ::connect(s, (const sockaddr *)&saddr, addrlen); + s32 ret = ::connect(s, (const sockaddr *)&saddr, addrlen); *g_lastError = getLastError(); + return ret; } @@ -229,8 +234,9 @@ namespace sys_net_func s32 listen(s32 s, s32 backlog) { sys_net.Warning("listen(s=%d, backlog=%d)", s, backlog); - int ret = ::listen(s, backlog); + s32 ret = ::listen(s, backlog); *g_lastError = getLastError(); + return ret; } @@ -238,8 +244,9 @@ namespace sys_net_func { sys_net.Warning("recv(s=%d, buf=*0x%x, len=%d, flags=0x%x)", s, buf, len, flags); - int ret = ::recv(s, buf.get_ptr(), len, flags); + s32 ret = ::recv(s, buf.get_ptr(), len, flags); *g_lastError = getLastError(); + return ret; } @@ -251,24 +258,26 @@ namespace sys_net_func memcpy(&_addr, addr.get_ptr(), sizeof(sockaddr)); _addr.sa_family = addr->sa_family; pck_len_t _paddrlen; - int ret = ::recvfrom(s, buf.get_ptr(), len, flags, &_addr, &_paddrlen); + s32 ret = ::recvfrom(s, buf.get_ptr(), len, flags, &_addr, &_paddrlen); *paddrlen = _paddrlen; *g_lastError = getLastError(); + return ret; } s32 recvmsg() { UNIMPLEMENTED_FUNC(sys_net); - return CELL_OK; +return CELL_OK; } s32 send(s32 s, vm::cptr buf, u32 len, s32 flags) { sys_net.Warning("send(s=%d, buf=*0x%x, len=%d, flags=0x%x)", s, buf, len, flags); - int ret = ::send(s, buf.get_ptr(), len, flags); + s32 ret = ::send(s, buf.get_ptr(), len, flags); *g_lastError = getLastError(); + return ret; } @@ -285,8 +294,9 @@ namespace sys_net_func sockaddr _addr; memcpy(&_addr, addr.get_ptr(), sizeof(sockaddr)); _addr.sa_family = addr->sa_family; - int ret = ::sendto(s, buf.get_ptr(), len, flags, &_addr, addrlen); + s32 ret = ::sendto(s, buf.get_ptr(), len, flags, &_addr, addrlen); *g_lastError = getLastError(); + return ret; } @@ -294,24 +304,29 @@ namespace sys_net_func { sys_net.Warning("socket(s=%d, level=%d, optname=%d, optval=*0x%x, optlen=%d)", s, level, optname, optval, optlen); - int ret = ::setsockopt(s, level, optname, optval.get_ptr(), optlen); + s32 ret = ::setsockopt(s, level, optname, optval.get_ptr(), optlen); *g_lastError = getLastError(); + return ret; } s32 shutdown(s32 s, s32 how) { sys_net.Warning("shutdown(s=%d, how=%d)", s, how); - int ret = ::shutdown(s, how); + + s32 ret = ::shutdown(s, how); *g_lastError = getLastError(); + return ret; } s32 socket(s32 family, s32 type, s32 protocol) { sys_net.Warning("socket(family=%d, type=%d, protocol=%d)", family, type, protocol); - int ret = ::socket(family, type, protocol); + + s32 ret = ::socket(family, type, protocol); *g_lastError = getLastError(); + return ret; } @@ -333,9 +348,39 @@ namespace sys_net_func return CELL_OK; } - s32 socketselect() + s32 socketselect(s32 nfds, vm::ptr readfds, vm::ptr writefds, vm::ptr exceptfds, vm::ptr timeout) { - UNIMPLEMENTED_FUNC(sys_net); + sys_net.Todo("socketselect(nfds=%d, readfds_addr=0x%x, writefds_addr=0x%x, exceptfds_addr=0x%x, timeout_addr=0x%x)", + nfds, readfds.addr(), writefds.addr(), exceptfds.addr(), timeout.addr()); + + fd_set _readfds; + fd_set _writefds; + fd_set _exceptfds; + + if (readfds) + { + memcpy(&_readfds, readfds.get_ptr(), sizeof(fd_set)); + } + + if (writefds) + { + memcpy(&_writefds, writefds.get_ptr(), sizeof(fd_set)); + } + + if (exceptfds) + { + memcpy(&_exceptfds, exceptfds.get_ptr(), sizeof(fd_set)); + } + + s32 ret = ::select(nfds, readfds.get_ptr(), &_writefds, &_exceptfds, timeout.get_ptr()); + *g_lastError = getLastError(); + + if (getLastError() >= 0) + { + sys_net.Error("socketselect(): error %d", getLastError()); + } + + //return ret; return CELL_OK; } } diff --git a/rpcs3/Emu/SysCalls/Modules/sys_net.h b/rpcs3/Emu/SysCalls/Modules/sys_net.h index 939ec86227f6..7d729504cd98 100644 --- a/rpcs3/Emu/SysCalls/Modules/sys_net.h +++ b/rpcs3/Emu/SysCalls/Modules/sys_net.h @@ -25,3 +25,8 @@ struct sys_net_sockaddr_in be_t sa_addr; // struct in_addr u8 unused[8]; }; + +struct sys_net_fd_set +{ + s32 fds_bits[8]; +}; \ No newline at end of file diff --git a/rpcs3/Loader/TRP.cpp b/rpcs3/Loader/TRP.cpp index 77b076306146..b4ca2131d900 100644 --- a/rpcs3/Loader/TRP.cpp +++ b/rpcs3/Loader/TRP.cpp @@ -22,7 +22,11 @@ bool TRPLoader::Install(std::string dest, bool show) if (!dest.empty() && dest.back() != '/') dest += '/'; - Emu.GetVFS().CreateDir(dest); + if (!Emu.GetVFS().ExistsDir(dest)) + { + Emu.GetVFS().CreateDir(dest); + } + for (const TRPEntry& entry : m_entries) { char* buffer = new char [(u32)entry.size];