diff options
| author | 2023-12-17 20:46:41 -0500 | |
|---|---|---|
| committer | 2023-12-22 21:52:49 -0500 | |
| commit | 31bf57a310f3b3417e96ec9e1cee6c1c817882d9 (patch) | |
| tree | c5101e70584301cfc452641544cd31d4d4c6d105 /src/core/hle/service | |
| parent | k_server_session: remove scratch buffer usage in favor of direct copy (diff) | |
| download | yuzu-31bf57a310f3b3417e96ec9e1cee6c1c817882d9.tar.gz yuzu-31bf57a310f3b3417e96ec9e1cee6c1c817882d9.tar.xz yuzu-31bf57a310f3b3417e96ec9e1cee6c1c817882d9.zip | |
general: properly support multiple memory instances
Diffstat (limited to 'src/core/hle/service')
| -rw-r--r-- | src/core/hle/service/fatal/fatal.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/service/server_manager.cpp | 19 | ||||
| -rw-r--r-- | src/core/hle/service/set/set_sys.cpp | 12 | ||||
| -rw-r--r-- | src/core/hle/service/set/set_sys.h | 1 | ||||
| -rw-r--r-- | src/core/hle/service/sm/sm.cpp | 36 | ||||
| -rw-r--r-- | src/core/hle/service/sm/sm.h | 8 |
6 files changed, 42 insertions, 36 deletions
diff --git a/src/core/hle/service/fatal/fatal.cpp b/src/core/hle/service/fatal/fatal.cpp index fe2ed8df8..31da86074 100644 --- a/src/core/hle/service/fatal/fatal.cpp +++ b/src/core/hle/service/fatal/fatal.cpp | |||
| @@ -89,7 +89,7 @@ static void GenerateErrorReport(Core::System& system, Result error_code, const F | |||
| 89 | crash_report += fmt::format(" ESR: {:016x}\n", info.esr); | 89 | crash_report += fmt::format(" ESR: {:016x}\n", info.esr); |
| 90 | crash_report += fmt::format(" FAR: {:016x}\n", info.far); | 90 | crash_report += fmt::format(" FAR: {:016x}\n", info.far); |
| 91 | crash_report += "\nBacktrace:\n"; | 91 | crash_report += "\nBacktrace:\n"; |
| 92 | for (size_t i = 0; i < info.backtrace_size; i++) { | 92 | for (u32 i = 0; i < std::min<u32>(info.backtrace_size, 32); i++) { |
| 93 | crash_report += | 93 | crash_report += |
| 94 | fmt::format(" Backtrace[{:02d}]: {:016x}\n", i, info.backtrace[i]); | 94 | fmt::format(" Backtrace[{:02d}]: {:016x}\n", i, info.backtrace[i]); |
| 95 | } | 95 | } |
diff --git a/src/core/hle/service/server_manager.cpp b/src/core/hle/service/server_manager.cpp index ec599dac2..15edb23e0 100644 --- a/src/core/hle/service/server_manager.cpp +++ b/src/core/hle/service/server_manager.cpp | |||
| @@ -47,7 +47,7 @@ ServerManager::~ServerManager() { | |||
| 47 | m_stopped.Wait(); | 47 | m_stopped.Wait(); |
| 48 | m_threads.clear(); | 48 | m_threads.clear(); |
| 49 | 49 | ||
| 50 | // Clean up ports. | 50 | // Clean up server ports. |
| 51 | for (const auto& [port, handler] : m_ports) { | 51 | for (const auto& [port, handler] : m_ports) { |
| 52 | port->Close(); | 52 | port->Close(); |
| 53 | } | 53 | } |
| @@ -97,22 +97,15 @@ Result ServerManager::RegisterNamedService(const std::string& service_name, | |||
| 97 | u32 max_sessions) { | 97 | u32 max_sessions) { |
| 98 | ASSERT(m_sessions.size() + m_ports.size() < MaximumWaitObjects); | 98 | ASSERT(m_sessions.size() + m_ports.size() < MaximumWaitObjects); |
| 99 | 99 | ||
| 100 | // Add the new server to sm:. | 100 | // Add the new server to sm: and get the moved server port. |
| 101 | ASSERT(R_SUCCEEDED( | 101 | Kernel::KServerPort* server_port{}; |
| 102 | m_system.ServiceManager().RegisterService(service_name, max_sessions, handler_factory))); | 102 | R_ASSERT(m_system.ServiceManager().RegisterService(std::addressof(server_port), service_name, |
| 103 | 103 | max_sessions, handler_factory)); | |
| 104 | // Get the registered port. | ||
| 105 | Kernel::KPort* port{}; | ||
| 106 | ASSERT( | ||
| 107 | R_SUCCEEDED(m_system.ServiceManager().GetServicePort(std::addressof(port), service_name))); | ||
| 108 | |||
| 109 | // Open a new reference to the server port. | ||
| 110 | port->GetServerPort().Open(); | ||
| 111 | 104 | ||
| 112 | // Begin tracking the server port. | 105 | // Begin tracking the server port. |
| 113 | { | 106 | { |
| 114 | std::scoped_lock ll{m_list_mutex}; | 107 | std::scoped_lock ll{m_list_mutex}; |
| 115 | m_ports.emplace(std::addressof(port->GetServerPort()), std::move(handler_factory)); | 108 | m_ports.emplace(server_port, std::move(handler_factory)); |
| 116 | } | 109 | } |
| 117 | 110 | ||
| 118 | // Signal the wakeup event. | 111 | // Signal the wakeup event. |
diff --git a/src/core/hle/service/set/set_sys.cpp b/src/core/hle/service/set/set_sys.cpp index 0653779d5..8e637f963 100644 --- a/src/core/hle/service/set/set_sys.cpp +++ b/src/core/hle/service/set/set_sys.cpp | |||
| @@ -507,6 +507,14 @@ void SET_SYS::SetTvSettings(HLERequestContext& ctx) { | |||
| 507 | rb.Push(ResultSuccess); | 507 | rb.Push(ResultSuccess); |
| 508 | } | 508 | } |
| 509 | 509 | ||
| 510 | void SET_SYS::GetDebugModeFlag(HLERequestContext& ctx) { | ||
| 511 | LOG_DEBUG(Service_SET, "called"); | ||
| 512 | |||
| 513 | IPC::ResponseBuilder rb{ctx, 3}; | ||
| 514 | rb.Push(ResultSuccess); | ||
| 515 | rb.Push<u32>(0); | ||
| 516 | } | ||
| 517 | |||
| 510 | void SET_SYS::GetQuestFlag(HLERequestContext& ctx) { | 518 | void SET_SYS::GetQuestFlag(HLERequestContext& ctx) { |
| 511 | LOG_WARNING(Service_SET, "(STUBBED) called"); | 519 | LOG_WARNING(Service_SET, "(STUBBED) called"); |
| 512 | 520 | ||
| @@ -926,7 +934,7 @@ SET_SYS::SET_SYS(Core::System& system_) : ServiceFramework{system_, "set:sys"}, | |||
| 926 | {59, &SET_SYS::SetNetworkSystemClockContext, "SetNetworkSystemClockContext"}, | 934 | {59, &SET_SYS::SetNetworkSystemClockContext, "SetNetworkSystemClockContext"}, |
| 927 | {60, &SET_SYS::IsUserSystemClockAutomaticCorrectionEnabled, "IsUserSystemClockAutomaticCorrectionEnabled"}, | 935 | {60, &SET_SYS::IsUserSystemClockAutomaticCorrectionEnabled, "IsUserSystemClockAutomaticCorrectionEnabled"}, |
| 928 | {61, &SET_SYS::SetUserSystemClockAutomaticCorrectionEnabled, "SetUserSystemClockAutomaticCorrectionEnabled"}, | 936 | {61, &SET_SYS::SetUserSystemClockAutomaticCorrectionEnabled, "SetUserSystemClockAutomaticCorrectionEnabled"}, |
| 929 | {62, nullptr, "GetDebugModeFlag"}, | 937 | {62, &SET_SYS::GetDebugModeFlag, "GetDebugModeFlag"}, |
| 930 | {63, &SET_SYS::GetPrimaryAlbumStorage, "GetPrimaryAlbumStorage"}, | 938 | {63, &SET_SYS::GetPrimaryAlbumStorage, "GetPrimaryAlbumStorage"}, |
| 931 | {64, nullptr, "SetPrimaryAlbumStorage"}, | 939 | {64, nullptr, "SetPrimaryAlbumStorage"}, |
| 932 | {65, nullptr, "GetUsb30EnableFlag"}, | 940 | {65, nullptr, "GetUsb30EnableFlag"}, |
| @@ -1143,6 +1151,8 @@ void SET_SYS::StoreSettings() { | |||
| 1143 | } | 1151 | } |
| 1144 | 1152 | ||
| 1145 | void SET_SYS::StoreSettingsThreadFunc(std::stop_token stop_token) { | 1153 | void SET_SYS::StoreSettingsThreadFunc(std::stop_token stop_token) { |
| 1154 | Common::SetCurrentThreadName("SettingsStore"); | ||
| 1155 | |||
| 1146 | while (Common::StoppableTimedWait(stop_token, std::chrono::minutes(1))) { | 1156 | while (Common::StoppableTimedWait(stop_token, std::chrono::minutes(1))) { |
| 1147 | std::scoped_lock l{m_save_needed_mutex}; | 1157 | std::scoped_lock l{m_save_needed_mutex}; |
| 1148 | if (!std::exchange(m_save_needed, false)) { | 1158 | if (!std::exchange(m_save_needed, false)) { |
diff --git a/src/core/hle/service/set/set_sys.h b/src/core/hle/service/set/set_sys.h index 3785d93d8..853f76fce 100644 --- a/src/core/hle/service/set/set_sys.h +++ b/src/core/hle/service/set/set_sys.h | |||
| @@ -98,6 +98,7 @@ private: | |||
| 98 | void GetSettingsItemValue(HLERequestContext& ctx); | 98 | void GetSettingsItemValue(HLERequestContext& ctx); |
| 99 | void GetTvSettings(HLERequestContext& ctx); | 99 | void GetTvSettings(HLERequestContext& ctx); |
| 100 | void SetTvSettings(HLERequestContext& ctx); | 100 | void SetTvSettings(HLERequestContext& ctx); |
| 101 | void GetDebugModeFlag(HLERequestContext& ctx); | ||
| 101 | void GetQuestFlag(HLERequestContext& ctx); | 102 | void GetQuestFlag(HLERequestContext& ctx); |
| 102 | void GetDeviceTimeZoneLocationName(HLERequestContext& ctx); | 103 | void GetDeviceTimeZoneLocationName(HLERequestContext& ctx); |
| 103 | void SetDeviceTimeZoneLocationName(HLERequestContext& ctx); | 104 | void SetDeviceTimeZoneLocationName(HLERequestContext& ctx); |
diff --git a/src/core/hle/service/sm/sm.cpp b/src/core/hle/service/sm/sm.cpp index 296ee6e89..1095dcf6c 100644 --- a/src/core/hle/service/sm/sm.cpp +++ b/src/core/hle/service/sm/sm.cpp | |||
| @@ -29,8 +29,7 @@ ServiceManager::ServiceManager(Kernel::KernelCore& kernel_) : kernel{kernel_} { | |||
| 29 | 29 | ||
| 30 | ServiceManager::~ServiceManager() { | 30 | ServiceManager::~ServiceManager() { |
| 31 | for (auto& [name, port] : service_ports) { | 31 | for (auto& [name, port] : service_ports) { |
| 32 | port->GetClientPort().Close(); | 32 | port->Close(); |
| 33 | port->GetServerPort().Close(); | ||
| 34 | } | 33 | } |
| 35 | 34 | ||
| 36 | if (deferral_event) { | 35 | if (deferral_event) { |
| @@ -50,8 +49,8 @@ static Result ValidateServiceName(const std::string& name) { | |||
| 50 | return ResultSuccess; | 49 | return ResultSuccess; |
| 51 | } | 50 | } |
| 52 | 51 | ||
| 53 | Result ServiceManager::RegisterService(std::string name, u32 max_sessions, | 52 | Result ServiceManager::RegisterService(Kernel::KServerPort** out_server_port, std::string name, |
| 54 | SessionRequestHandlerFactory handler) { | 53 | u32 max_sessions, SessionRequestHandlerFactory handler) { |
| 55 | R_TRY(ValidateServiceName(name)); | 54 | R_TRY(ValidateServiceName(name)); |
| 56 | 55 | ||
| 57 | std::scoped_lock lk{lock}; | 56 | std::scoped_lock lk{lock}; |
| @@ -66,13 +65,17 @@ Result ServiceManager::RegisterService(std::string name, u32 max_sessions, | |||
| 66 | // Register the port. | 65 | // Register the port. |
| 67 | Kernel::KPort::Register(kernel, port); | 66 | Kernel::KPort::Register(kernel, port); |
| 68 | 67 | ||
| 69 | service_ports.emplace(name, port); | 68 | service_ports.emplace(name, std::addressof(port->GetClientPort())); |
| 70 | registered_services.emplace(name, handler); | 69 | registered_services.emplace(name, handler); |
| 71 | if (deferral_event) { | 70 | if (deferral_event) { |
| 72 | deferral_event->Signal(); | 71 | deferral_event->Signal(); |
| 73 | } | 72 | } |
| 74 | 73 | ||
| 75 | return ResultSuccess; | 74 | // Set our output. |
| 75 | *out_server_port = std::addressof(port->GetServerPort()); | ||
| 76 | |||
| 77 | // We succeeded. | ||
| 78 | R_SUCCEED(); | ||
| 76 | } | 79 | } |
| 77 | 80 | ||
| 78 | Result ServiceManager::UnregisterService(const std::string& name) { | 81 | Result ServiceManager::UnregisterService(const std::string& name) { |
| @@ -91,7 +94,8 @@ Result ServiceManager::UnregisterService(const std::string& name) { | |||
| 91 | return ResultSuccess; | 94 | return ResultSuccess; |
| 92 | } | 95 | } |
| 93 | 96 | ||
| 94 | Result ServiceManager::GetServicePort(Kernel::KPort** out_port, const std::string& name) { | 97 | Result ServiceManager::GetServicePort(Kernel::KClientPort** out_client_port, |
| 98 | const std::string& name) { | ||
| 95 | R_TRY(ValidateServiceName(name)); | 99 | R_TRY(ValidateServiceName(name)); |
| 96 | 100 | ||
| 97 | std::scoped_lock lk{lock}; | 101 | std::scoped_lock lk{lock}; |
| @@ -101,7 +105,7 @@ Result ServiceManager::GetServicePort(Kernel::KPort** out_port, const std::strin | |||
| 101 | return Service::SM::ResultNotRegistered; | 105 | return Service::SM::ResultNotRegistered; |
| 102 | } | 106 | } |
| 103 | 107 | ||
| 104 | *out_port = it->second; | 108 | *out_client_port = it->second; |
| 105 | return ResultSuccess; | 109 | return ResultSuccess; |
| 106 | } | 110 | } |
| 107 | 111 | ||
| @@ -172,8 +176,8 @@ Result SM::GetServiceImpl(Kernel::KClientSession** out_client_session, HLEReques | |||
| 172 | std::string name(PopServiceName(rp)); | 176 | std::string name(PopServiceName(rp)); |
| 173 | 177 | ||
| 174 | // Find the named port. | 178 | // Find the named port. |
| 175 | Kernel::KPort* port{}; | 179 | Kernel::KClientPort* client_port{}; |
| 176 | auto port_result = service_manager.GetServicePort(&port, name); | 180 | auto port_result = service_manager.GetServicePort(&client_port, name); |
| 177 | if (port_result == Service::SM::ResultInvalidServiceName) { | 181 | if (port_result == Service::SM::ResultInvalidServiceName) { |
| 178 | LOG_ERROR(Service_SM, "Invalid service name '{}'", name); | 182 | LOG_ERROR(Service_SM, "Invalid service name '{}'", name); |
| 179 | return Service::SM::ResultInvalidServiceName; | 183 | return Service::SM::ResultInvalidServiceName; |
| @@ -187,7 +191,7 @@ Result SM::GetServiceImpl(Kernel::KClientSession** out_client_session, HLEReques | |||
| 187 | 191 | ||
| 188 | // Create a new session. | 192 | // Create a new session. |
| 189 | Kernel::KClientSession* session{}; | 193 | Kernel::KClientSession* session{}; |
| 190 | if (const auto result = port->GetClientPort().CreateSession(&session); result.IsError()) { | 194 | if (const auto result = client_port->CreateSession(&session); result.IsError()) { |
| 191 | LOG_ERROR(Service_SM, "called service={} -> error 0x{:08X}", name, result.raw); | 195 | LOG_ERROR(Service_SM, "called service={} -> error 0x{:08X}", name, result.raw); |
| 192 | return result; | 196 | return result; |
| 193 | } | 197 | } |
| @@ -221,7 +225,9 @@ void SM::RegisterServiceImpl(HLERequestContext& ctx, std::string name, u32 max_s | |||
| 221 | LOG_DEBUG(Service_SM, "called with name={}, max_session_count={}, is_light={}", name, | 225 | LOG_DEBUG(Service_SM, "called with name={}, max_session_count={}, is_light={}", name, |
| 222 | max_session_count, is_light); | 226 | max_session_count, is_light); |
| 223 | 227 | ||
| 224 | if (const auto result = service_manager.RegisterService(name, max_session_count, nullptr); | 228 | Kernel::KServerPort* server_port{}; |
| 229 | if (const auto result = service_manager.RegisterService(std::addressof(server_port), name, | ||
| 230 | max_session_count, nullptr); | ||
| 225 | result.IsError()) { | 231 | result.IsError()) { |
| 226 | LOG_ERROR(Service_SM, "failed to register service with error_code={:08X}", result.raw); | 232 | LOG_ERROR(Service_SM, "failed to register service with error_code={:08X}", result.raw); |
| 227 | IPC::ResponseBuilder rb{ctx, 2}; | 233 | IPC::ResponseBuilder rb{ctx, 2}; |
| @@ -229,13 +235,9 @@ void SM::RegisterServiceImpl(HLERequestContext& ctx, std::string name, u32 max_s | |||
| 229 | return; | 235 | return; |
| 230 | } | 236 | } |
| 231 | 237 | ||
| 232 | auto* port = Kernel::KPort::Create(kernel); | ||
| 233 | port->Initialize(ServerSessionCountMax, is_light, 0); | ||
| 234 | SCOPE_EXIT({ port->GetClientPort().Close(); }); | ||
| 235 | |||
| 236 | IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles}; | 238 | IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles}; |
| 237 | rb.Push(ResultSuccess); | 239 | rb.Push(ResultSuccess); |
| 238 | rb.PushMoveObjects(port->GetServerPort()); | 240 | rb.PushMoveObjects(server_port); |
| 239 | } | 241 | } |
| 240 | 242 | ||
| 241 | void SM::UnregisterService(HLERequestContext& ctx) { | 243 | void SM::UnregisterService(HLERequestContext& ctx) { |
diff --git a/src/core/hle/service/sm/sm.h b/src/core/hle/service/sm/sm.h index ff74f588a..4ae32a9c1 100644 --- a/src/core/hle/service/sm/sm.h +++ b/src/core/hle/service/sm/sm.h | |||
| @@ -56,10 +56,10 @@ public: | |||
| 56 | explicit ServiceManager(Kernel::KernelCore& kernel_); | 56 | explicit ServiceManager(Kernel::KernelCore& kernel_); |
| 57 | ~ServiceManager(); | 57 | ~ServiceManager(); |
| 58 | 58 | ||
| 59 | Result RegisterService(std::string name, u32 max_sessions, | 59 | Result RegisterService(Kernel::KServerPort** out_server_port, std::string name, |
| 60 | SessionRequestHandlerFactory handler_factory); | 60 | u32 max_sessions, SessionRequestHandlerFactory handler_factory); |
| 61 | Result UnregisterService(const std::string& name); | 61 | Result UnregisterService(const std::string& name); |
| 62 | Result GetServicePort(Kernel::KPort** out_port, const std::string& name); | 62 | Result GetServicePort(Kernel::KClientPort** out_client_port, const std::string& name); |
| 63 | 63 | ||
| 64 | template <Common::DerivedFrom<SessionRequestHandler> T> | 64 | template <Common::DerivedFrom<SessionRequestHandler> T> |
| 65 | std::shared_ptr<T> GetService(const std::string& service_name) const { | 65 | std::shared_ptr<T> GetService(const std::string& service_name) const { |
| @@ -84,7 +84,7 @@ private: | |||
| 84 | /// Map of registered services, retrieved using GetServicePort. | 84 | /// Map of registered services, retrieved using GetServicePort. |
| 85 | std::mutex lock; | 85 | std::mutex lock; |
| 86 | std::unordered_map<std::string, SessionRequestHandlerFactory> registered_services; | 86 | std::unordered_map<std::string, SessionRequestHandlerFactory> registered_services; |
| 87 | std::unordered_map<std::string, Kernel::KPort*> service_ports; | 87 | std::unordered_map<std::string, Kernel::KClientPort*> service_ports; |
| 88 | 88 | ||
| 89 | /// Kernel context | 89 | /// Kernel context |
| 90 | Kernel::KernelCore& kernel; | 90 | Kernel::KernelCore& kernel; |