diff --git a/orbis-kernel/src/sys/sys_sce.cpp b/orbis-kernel/src/sys/sys_sce.cpp index 407b11cc0..2d050d3b9 100644 --- a/orbis-kernel/src/sys/sys_sce.cpp +++ b/orbis-kernel/src/sys/sys_sce.cpp @@ -192,7 +192,7 @@ orbis::SysResult orbis::sys_evf_delete(Thread *thread, sint id) { ORBIS_LOG_WARNING(__FUNCTION__, id); Ref evf = thread->tproc->evfMap.get(id); if (evf == nullptr) { - return ErrorCode::SRCH; + return ErrorCode::NOENT; } thread->tproc->evfMap.destroy(id); @@ -209,29 +209,7 @@ orbis::SysResult orbis::sys_evf_open(Thread *thread, ptr name) { auto eventFlag = thread->tproc->context->findEventFlag(_name); if (eventFlag == nullptr) { - // if (_name[0] == '\0') { - // return ErrorCode::NOENT; - // } - - // HACK :) - if (std::string_view(_name).starts_with("SceAppMessaging")) { - // change pattern on system window open - return sys_evf_create(thread, name, kEvfAttrShared, 1); - } - - if (std::string_view("SceShellCoreUtilPowerControl") == _name) { - return sys_evf_create(thread, name, kEvfAttrShared, 0x400000); - } - - if (std::string_view("SceShellCoreUtilAppFocus") == _name) { - return sys_evf_create(thread, name, kEvfAttrShared, 1); - } - - if (std::string_view("SceBootStatusFlags") == _name) { - return sys_evf_create(thread, name, kEvfAttrShared, 0x2408); - } - return sys_evf_create(thread, name, kEvfAttrShared, 0); - return ErrorCode::SRCH; + return ErrorCode::NOENT; } thread->retval[0] = thread->tproc->evfMap.insert(eventFlag); @@ -240,7 +218,7 @@ orbis::SysResult orbis::sys_evf_open(Thread *thread, ptr name) { orbis::SysResult orbis::sys_evf_close(Thread *thread, sint id) { ORBIS_LOG_WARNING(__FUNCTION__, thread->tid, id); if (!thread->tproc->evfMap.close(id)) { - return ErrorCode::SRCH; + return ErrorCode::NOENT; } return {}; @@ -436,20 +414,6 @@ orbis::SysResult orbis::sys_osem_open(Thread *thread, auto sem = thread->tproc->context->findSemaphore(_name); if (sem == nullptr) { - // FIXME: hack :) - if (std::string_view(_name).starts_with("SceLncSuspendBlock")) { - auto result = sys_osem_create(thread, name, kSemaAttrShared, 1, 10000); - ORBIS_LOG_WARNING(__FUNCTION__, _name, result.value(), thread->retval[0]); - return result; - } else if (std::string_view(_name).starts_with("SceAppMessaging")) { - auto result = sys_osem_create(thread, name, kSemaAttrShared, 1, 10000); - ORBIS_LOG_WARNING(__FUNCTION__, _name, result.value(), thread->retval[0]); - return result; - } else { - auto result = sys_osem_create(thread, name, kSemaAttrShared, 0, 10000); - ORBIS_LOG_WARNING(__FUNCTION__, _name, result.value(), thread->retval[0]); - return result; - } return ErrorCode::NOENT; } @@ -1116,437 +1080,7 @@ orbis::SysResult orbis::sys_ipmimgr_call(Thread *thread, uint op, uint kid, ORBIS_LOG_TODO("sys_ipmimgr_call", thread->tid, op, kid, result, params, paramsSz, arg6); thread->where(); - - if (op == kImpiCreateServer) { - if (paramsSz != sizeof(IpmiCreateServerParams)) { - return ErrorCode::INVAL; - } - - auto createParams = (ptr)params; - - ORBIS_LOG_TODO("IPMI: create server", createParams->arg0, - createParams->name, createParams->arg2); - - auto [server, inserted] = g_context.createIpmiServer(createParams->name); - if (!inserted) { - return ErrorCode::EXIST; - } - - auto id = thread->tproc->ipmiServerMap.insert(server); - return uwrite(result, id); - } - - if (op == 0x10) { - // IPMI server start? - - return uwrite(result, 0); - } - - if (op == 0x201) { - // IPMI server receive packet? - return uwrite(result, 0x80020023); - } - - if (op == kIpmiCreateClient) { - if (paramsSz != sizeof(IpmiCreateClientParams)) { - return ErrorCode::INVAL; - } - - auto createParams = (ptr)params; - - ORBIS_LOG_TODO("IPMI: create client", createParams->arg0, - createParams->name, createParams->arg2); - // auto server = g_context.findIpmiServer(createParams->name); - - // if (server == nullptr) { - // ORBIS_LOG_TODO("IPMI: failed to find server", createParams->name); - // } - - auto ipmiClient = knew(createParams->name); - // ipmiClient->connection = server; - auto id = thread->tproc->ipmiClientMap.insert(ipmiClient); - return uwrite(result, id); - } - - if (op == kImpiDestroyClient) { - ORBIS_LOG_TODO("IPMI: destroy client"); - thread->tproc->ipmiClientMap.close(kid); - if (result) { - return uwrite(result, 0); - } - - return {}; - } - - auto client = thread->tproc->ipmiClientMap.get(kid); - - if (client == nullptr) { - return ErrorCode::INVAL; - } - - if (op == 0x241) { - if (result) { - return uwrite(result, 0); - } - } - - if (op == 0x400) { - if (paramsSz != sizeof(IpmiClientConnectParams)) { - return ErrorCode::INVAL; - } - - auto connectParams = (ptr)params; - ORBIS_LOG_TODO("IPMI: connect?", client->name, connectParams->arg0, - connectParams->name, connectParams->arg2, - connectParams->arg3); - if (result) { - return uwrite(result, 0); - } - } - - if (op == 0x320) { - ORBIS_LOG_TODO("IPMI: invoke sync method"); - - if (paramsSz != sizeof(IpmiSyncCallParams)) { - return ErrorCode::INVAL; - } - - IpmiSyncCallParams syncCallParams; - auto errorCode = uread(syncCallParams, (ptr)params); - if (errorCode != ErrorCode{}) { - return errorCode; - } - - ORBIS_LOG_TODO("IPMI: invokeSyncMethod", client->name, - syncCallParams.method, syncCallParams.dataCount, - syncCallParams.flags, syncCallParams.pData, - syncCallParams.pBuffers, syncCallParams.pResult, - syncCallParams.resultCount); - - IpmiDataInfo dataInfo; - uread(dataInfo, syncCallParams.pData); - - ORBIS_LOG_TODO("", dataInfo.data, dataInfo.size); - - if (client->name == "SceMbusIpc") { - if (syncCallParams.method == 0xce110007) { // SceMbusIpcAddHandleByUserId - struct SceMbusIpcAddHandleByUserIdMethodArgs { - uint32_t unk; // 0 - uint32_t deviceId; - uint32_t userId; - uint32_t type; - uint32_t index; - uint32_t reserved; - uint32_t pid; - }; - - static_assert(sizeof(SceMbusIpcAddHandleByUserIdMethodArgs) == 0x1c); - - if (dataInfo.size != sizeof(SceMbusIpcAddHandleByUserIdMethodArgs)) { - return ErrorCode::INVAL; - } - - SceMbusIpcAddHandleByUserIdMethodArgs args; - uread(args, ptr(dataInfo.data)); - - ORBIS_LOG_TODO("IPMI: SceMbusIpcAddHandleByUserId", args.unk, - args.deviceId, args.userId, args.type, args.index, - args.reserved, args.pid); - } else if (syncCallParams.method == 0xce11002a || - syncCallParams.method == 0xce110029) { - std::this_thread::sleep_for(std::chrono::seconds(60)); - } else { - std::abort(); - } - - return uwrite(result, 1); - } else if (client->name == "SceUserService") { - ORBIS_LOG_TODO("SceUserService"); - if (syncCallParams.method == 0x30011) { // get initial user id - ORBIS_LOG_TODO("SceUserService: get_initial_user_id"); - auto err = uwrite(syncCallParams.pResult, 0); - if (err != ErrorCode{}) { - return err; - } - IpmiBufferInfo bufferInfo; - err = uread(bufferInfo, syncCallParams.pBuffers); - if (err != ErrorCode{}) { - return err; - } - - if (bufferInfo.size != sizeof(uint32_t)) { - return uwrite(result, -1); - } - - err = uwrite((ptr)bufferInfo.data, 1u); // initial user id - if (err != ErrorCode{}) { - return err; - } - return uwrite(result, 0); - } - } else if (client->name == "SceLncService") { - if (syncCallParams.method == 0x30010 || - syncCallParams.method == 0x30013) { // get app status - // returns pending system events - ORBIS_LOG_TODO("SceUserService: get_app_status"); - auto err = uwrite(syncCallParams.pResult, 0); - if (err != ErrorCode{}) { - return err; - } - IpmiBufferInfo bufferInfo; - err = uread(bufferInfo, syncCallParams.pBuffers); - if (err != ErrorCode{}) { - return err; - } - - struct Result { - std::uint32_t unk0; - std::uint32_t unk1; - std::uint32_t unk2; - }; - - static_assert(sizeof(Result) == 0xc); - - if (bufferInfo.size != sizeof(Result)) { - return uwrite(result, -1); - } - - Result bufferResult{ - .unk0 = 1, - .unk1 = 1, - .unk2 = 1, - }; - - err = uwrite((ptr)bufferInfo.data, bufferResult); - if (err != ErrorCode{}) { - return err; - } - return uwrite(result, 0); - } - } else if (client->name == "SceSysAudioSystemIpc") { - if (syncCallParams.method == 0x12340000) { // check shared memory control - struct SceSysAudioSystemIpcCheckSharedMemoryControlMethodArgs { - uint32_t channelId; - }; - - static_assert( - sizeof(SceSysAudioSystemIpcCheckSharedMemoryControlMethodArgs) == - 0x4); - - if (dataInfo.size != - sizeof(SceSysAudioSystemIpcCheckSharedMemoryControlMethodArgs)) { - return ErrorCode::INVAL; - } - - SceSysAudioSystemIpcCheckSharedMemoryControlMethodArgs args; - uread(args, ptr( - dataInfo.data)); - - ORBIS_LOG_TODO( - "impi: SceSysAudioSystemIpcCheckSharedMemoryControlMethodArgs", - args.channelId); - if (auto audioOut = g_context.audioOut) { - audioOut->channelInfo.idControl = args.channelId; - } - } else if (syncCallParams.method == 0x1234000f) { // create event flag - struct SceSysAudioSystemIpcCreateEventFlagMethodArgs { - uint32_t channelId; - }; - - static_assert(sizeof(SceSysAudioSystemIpcCreateEventFlagMethodArgs) == - 0x4); - - if (dataInfo.size != - sizeof(SceSysAudioSystemIpcCreateEventFlagMethodArgs)) { - return ErrorCode::INVAL; - } - - SceSysAudioSystemIpcCreateEventFlagMethodArgs args; - uread(args, ptr( - dataInfo.data)); - - if (auto audioOut = g_context.audioOut) { - // very bad - char buffer[32]; - std::snprintf(buffer, sizeof(buffer), "sceAudioOutMix%x", - args.channelId); - // const char* eventName = &buffer; - auto [eventFlag, inserted] = thread->tproc->context->createEventFlag( - buffer, kEvfAttrShared, 0); - - if (!inserted) { - return ErrorCode::EXIST; // FIXME: verify - } - - audioOut->channelInfo.evf = eventFlag; - } - } else if (syncCallParams.method == - 0x12340001) { // check shared memory audio - struct SceSysAudioSystemIpcCheckSharedMemoryAudioMethodArgs { - uint32_t audioPort; - uint32_t channelId; - }; - - static_assert( - sizeof(SceSysAudioSystemIpcCheckSharedMemoryAudioMethodArgs) == - 0x8); - - if (dataInfo.size != - sizeof(SceSysAudioSystemIpcCheckSharedMemoryAudioMethodArgs)) { - return ErrorCode::INVAL; - } - - SceSysAudioSystemIpcCheckSharedMemoryAudioMethodArgs args; - uread(args, ptr( - dataInfo.data)); - - ORBIS_LOG_TODO( - "IPMI: SceSysAudioSystemIpcCheckSharedMemoryAudioMethodArgs", - args.audioPort, args.channelId); - if (auto audioOut = g_context.audioOut) { - audioOut->channelInfo.port = args.audioPort; - audioOut->channelInfo.channel = args.channelId; - } - } else if (syncCallParams.method == 0x12340002) { // something like open - struct SceSysAudioSystemIpcSomethingMethodArgs { - uint32_t audioPort; - uint32_t channelId; - }; - - static_assert(sizeof(SceSysAudioSystemIpcSomethingMethodArgs) == 0x8); - - if (dataInfo.size != sizeof(SceSysAudioSystemIpcSomethingMethodArgs)) { - return ErrorCode::INVAL; - } - - SceSysAudioSystemIpcSomethingMethodArgs args; - uread(args, - ptr(dataInfo.data)); - - ORBIS_LOG_TODO("IPMI: SceSysAudioSystemIpcSomethingMethodArgs", - args.audioPort, args.channelId); - - if (auto audioOut = g_context.audioOut) { - // here startToListen - audioOut->start(); - } - } else if (syncCallParams.method == 0x12340006) { // close port - struct SceSysAudioSystemIpcCloseAudioMethodArgs { - uint32_t audioPort; - uint32_t channelId; - }; - - static_assert(sizeof(SceSysAudioSystemIpcCloseAudioMethodArgs) == 0x8); - - if (dataInfo.size != sizeof(SceSysAudioSystemIpcCloseAudioMethodArgs)) { - return ErrorCode::INVAL; - } - - SceSysAudioSystemIpcCloseAudioMethodArgs args; - uread(args, - ptr(dataInfo.data)); - - ORBIS_LOG_TODO("IPMI: SceSysAudioSystemIpcCloseAudioMethodArgs", - args.audioPort, args.channelId); - } - } - - if (result != nullptr) { - return uwrite(result, 0); - } - - return {}; - } - - if (op == 0x310) { - ORBIS_LOG_TODO("IPMI: disconnect?"); - if (result) { - return uwrite(result, 0); - } - - return {}; - } - - if (op == 0x252) { - ORBIS_LOG_TODO("IPMI: client:tryGet", client->name); - thread->where(); - - struct SceIpmiClientTryGetArgs { - uint32_t unk; // 0 - uint32_t padding; - ptr message; - ptr pSize; - uint64_t maxSize; - }; - - static_assert(sizeof(SceIpmiClientTryGetArgs) == 0x20); - - if (paramsSz != sizeof(SceIpmiClientTryGetArgs)) { - return ErrorCode::INVAL; - } - - SceIpmiClientTryGetArgs tryGetParams; - auto errorCode = uread(tryGetParams, (ptr)params); - if (errorCode != ErrorCode{}) { - return errorCode; - } - - ORBIS_LOG_WARNING("IPMI: client: tryGet", tryGetParams.unk, - tryGetParams.message, tryGetParams.pSize, - tryGetParams.maxSize); - - if (client->name == "SceUserService") { - static bool isFirst = true; // TODO: implement ipmi hooks at os side - - if (isFirst) { - isFirst = false; - - struct SceUserServiceEvent { - std::uint32_t eventType; // 0 - login, 1 - logout - std::uint32_t user; - }; - - if (tryGetParams.maxSize < sizeof(SceUserServiceEvent)) { - return uwrite(result, 0x80020003); - } - - errorCode = uwrite(tryGetParams.pSize, sizeof(SceUserServiceEvent)); - if (errorCode != ErrorCode{}) { - return errorCode; - } - - errorCode = uwrite((ptr)tryGetParams.message, - {.eventType = 0, .user = 1}); - - if (errorCode != ErrorCode{}) { - return errorCode; - } - - return uwrite(result, 0); - } else { - return uwrite(result, 0x80020003); - } - } - if (result) { - return uwrite(result, 0x80020003); - } - return {}; - } - - if (op == 0x46b) { - thread->retval[0] = -0x40004; // HACK - return {}; - } - - if (op == 0x243) { - return uwrite(result, 0); - } - - if (op == 0x491) { - return uwrite(result, 0); - } - - return ErrorCode::INVAL; + return ErrorCode::NOSYS; } orbis::SysResult orbis::sys_get_gpo(Thread *thread /* TODO */) { return ErrorCode::NOSYS; diff --git a/rpcsx-os/iodev/shm.cpp b/rpcsx-os/iodev/shm.cpp index 5cf905da2..34f1a291f 100644 --- a/rpcsx-os/iodev/shm.cpp +++ b/rpcsx-os/iodev/shm.cpp @@ -32,31 +32,7 @@ orbis::ErrorCode ShmDevice::open(orbis::Ref *file, auto realFlags = O_RDWR; // TODO std::size_t size = 0; - if (~flags & 0x200) { - if (name == "/rpcsx-SceShellCoreUtil") { - // TODO - realFlags |= O_CREAT; - size = 0x4000; - } else if (name == "/rpcsx-vmicDdShmAin") { - // TODO - realFlags |= O_CREAT; - size = 0x4000; - } else if (name == "/rpcsx-SceNpTpip") { - // TODO - realFlags |= O_CREAT; - size = 0x4000; - } else if (name == "/rpcsx-SceNpPlusLogger") { - realFlags |= O_CREAT; - size = 0x4400; - } else if (name == "/rpcsx-SceAvSetting") { - realFlags |= O_CREAT; - size = 0x4400; - } else { - ORBIS_LOG_ERROR("SHM: unknown shared memory", path); - thread->where(); - std::abort(); - } - } else { + if (flags & 0x200) { realFlags |= O_CREAT; }