Sfoglia il codice sorgente

Moved the HLE command buffer translation task to ServerSession instead of the HLE handler superclass.

Subv 9 anni fa
parent
commit
ebbb55ec8f

+ 13 - 2
src/core/hle/kernel/server_session.cpp

@@ -41,8 +41,14 @@ ResultCode ServerSession::HandleSyncRequest() {
     // from its ClientSession, so wake up any threads that may be waiting on a svcReplyAndReceive or similar.
     // from its ClientSession, so wake up any threads that may be waiting on a svcReplyAndReceive or similar.
 
 
     // If this ServerSession has an associated HLE handler, forward the request to it.
     // If this ServerSession has an associated HLE handler, forward the request to it.
-    if (hle_handler != nullptr)
-        return hle_handler->HandleSyncRequest(SharedPtr<ServerSession>(this));
+    if (hle_handler != nullptr) {
+        // Attempt to translate the incoming request's command buffer.
+        ResultCode result = TranslateHLERequest(this);
+        if (result.IsError())
+            return result;
+        hle_handler->HandleSyncRequest(SharedPtr<ServerSession>(this));
+        // TODO(Subv): Translate the response command buffer.
+    }
 
 
     // If this ServerSession does not have an HLE implementation, just wake up the threads waiting on it.
     // If this ServerSession does not have an HLE implementation, just wake up the threads waiting on it.
     signaled = true;
     signaled = true;
@@ -60,4 +66,9 @@ ServerSession::SessionPair ServerSession::CreateSessionPair(const std::string& n
     return std::make_tuple(std::move(server_session), std::move(client_session));
     return std::make_tuple(std::move(server_session), std::move(client_session));
 }
 }
 
 
+ResultCode TranslateHLERequest(ServerSession* server_session) {
+    // TODO(Subv): Implement this function once multiple concurrent processes are supported.
+    return RESULT_SUCCESS;
+}
+
 }
 }

+ 10 - 0
src/core/hle/kernel/server_session.h

@@ -76,4 +76,14 @@ private:
      */
      */
     static ResultVal<SharedPtr<ServerSession>> Create(std::string name = "Unknown", std::shared_ptr<Service::SessionRequestHandler> hle_handler = nullptr);
     static ResultVal<SharedPtr<ServerSession>> Create(std::string name = "Unknown", std::shared_ptr<Service::SessionRequestHandler> hle_handler = nullptr);
 };
 };
+
+/**
+ * Performs command buffer translation for an HLE IPC request.
+ * The command buffer from the ServerSession thread's TLS is copied into a
+ * buffer and all descriptors in the buffer are processed.
+ * TODO(Subv): Implement this function, currently we do not support multiple processes running at once,
+ * but once that is implemented we'll need to properly translate all descriptors in the command buffer.
+ */
+ResultCode TranslateHLERequest(ServerSession* server_session);
+
 }
 }

+ 2 - 2
src/core/hle/service/fs/archive.cpp

@@ -93,7 +93,7 @@ File::File(std::unique_ptr<FileSys::FileBackend>&& backend, const FileSys::Path&
 
 
 File::~File() {}
 File::~File() {}
 
 
-void File::HandleSyncRequestImpl(Kernel::SharedPtr<Kernel::ServerSession> server_session) {
+void File::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) {
     u32* cmd_buff = Kernel::GetCommandBuffer();
     u32* cmd_buff = Kernel::GetCommandBuffer();
     FileCommand cmd = static_cast<FileCommand>(cmd_buff[0]);
     FileCommand cmd = static_cast<FileCommand>(cmd_buff[0]);
     switch (cmd) {
     switch (cmd) {
@@ -207,7 +207,7 @@ Directory::Directory(std::unique_ptr<FileSys::DirectoryBackend>&& backend,
 
 
 Directory::~Directory() {}
 Directory::~Directory() {}
 
 
-void Directory::HandleSyncRequestImpl(Kernel::SharedPtr<Kernel::ServerSession> server_session) {
+void Directory::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) {
     u32* cmd_buff = Kernel::GetCommandBuffer();
     u32* cmd_buff = Kernel::GetCommandBuffer();
     DirectoryCommand cmd = static_cast<DirectoryCommand>(cmd_buff[0]);
     DirectoryCommand cmd = static_cast<DirectoryCommand>(cmd_buff[0]);
     switch (cmd) {
     switch (cmd) {

+ 2 - 2
src/core/hle/service/fs/archive.h

@@ -55,7 +55,7 @@ public:
     std::unique_ptr<FileSys::FileBackend> backend; ///< File backend interface
     std::unique_ptr<FileSys::FileBackend> backend; ///< File backend interface
 
 
 protected:
 protected:
-    void HandleSyncRequestImpl(Kernel::SharedPtr<Kernel::ServerSession> server_session) override;
+    void HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) override;
 };
 };
 
 
 class Directory final : public SessionRequestHandler {
 class Directory final : public SessionRequestHandler {
@@ -71,7 +71,7 @@ public:
     std::unique_ptr<FileSys::DirectoryBackend> backend; ///< File backend interface
     std::unique_ptr<FileSys::DirectoryBackend> backend; ///< File backend interface
 
 
 protected:
 protected:
-    void HandleSyncRequestImpl(Kernel::SharedPtr<Kernel::ServerSession> server_session) override;
+    void HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) override;
 };
 };
 
 
 /**
 /**

+ 1 - 21
src/core/hle/service/service.cpp

@@ -66,21 +66,6 @@ static std::string MakeFunctionString(const char* name, const char* port_name,
     return function_string;
     return function_string;
 }
 }
 
 
-ResultCode SessionRequestHandler::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) {
-    // Attempt to translate the incoming request's command buffer.
-    ResultCode result = TranslateRequest(server_session);
-
-    if (result.IsError())
-        return result;
-
-    // Actually handle the request
-    HandleSyncRequestImpl(server_session);
-
-    // TODO(Subv): Translate the response command buffer.
-
-    return RESULT_SUCCESS;
-}
-
 void SessionRequestHandler::ClientConnected(Kernel::SharedPtr<Kernel::ServerSession> server_session) {
 void SessionRequestHandler::ClientConnected(Kernel::SharedPtr<Kernel::ServerSession> server_session) {
     connected_sessions.push_back(server_session);
     connected_sessions.push_back(server_session);
 }
 }
@@ -89,15 +74,10 @@ void SessionRequestHandler::ClientDisconnected(Kernel::SharedPtr<Kernel::ServerS
     boost::range::remove_erase(connected_sessions, server_session);
     boost::range::remove_erase(connected_sessions, server_session);
 }
 }
 
 
-ResultCode SessionRequestHandler::TranslateRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) {
-    // TODO(Subv): Implement this function once multiple concurrent processes are supported.
-    return RESULT_SUCCESS;
-}
-
 Interface::Interface(u32 max_sessions) : max_sessions(max_sessions) {}
 Interface::Interface(u32 max_sessions) : max_sessions(max_sessions) {}
 Interface::~Interface() = default;
 Interface::~Interface() = default;
 
 
-void Interface::HandleSyncRequestImpl(Kernel::SharedPtr<Kernel::ServerSession> server_session) {
+void Interface::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) {
     // TODO(Subv): Make use of the server_session in the HLE service handlers to distinguish which session triggered each command.
     // TODO(Subv): Make use of the server_session in the HLE service handlers to distinguish which session triggered each command.
 
 
     u32* cmd_buff = Kernel::GetCommandBuffer();
     u32* cmd_buff = Kernel::GetCommandBuffer();

+ 10 - 20
src/core/hle/service/service.h

@@ -15,6 +15,11 @@
 #include "core/hle/result.h"
 #include "core/hle/result.h"
 #include "core/memory.h"
 #include "core/memory.h"
 
 
+
+namespace Kernel {
+class ServerSession;
+}
+
 ////////////////////////////////////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////////////////////////////////
 // Namespace Service
 // Namespace Service
 
 
@@ -31,12 +36,14 @@ static const u32 DefaultMaxSessions = 10; ///< Arbitrary default number of maxim
 class SessionRequestHandler {
 class SessionRequestHandler {
 public:
 public:
     /**
     /**
-     * Dispatches and handles a sync request from the emulated application.
+     * Handles a sync request from the emulated application.
      * @param server_session The ServerSession that was triggered for this sync request,
      * @param server_session The ServerSession that was triggered for this sync request,
      * it should be used to differentiate which client (As in ClientSession) we're answering to.
      * it should be used to differentiate which client (As in ClientSession) we're answering to.
+     * TODO(Subv): Use a wrapper structure to hold all the information relevant to
+     * this request (ServerSession, Originator thread, Translated command buffer, etc).
      * @returns ResultCode the result code of the translate operation.
      * @returns ResultCode the result code of the translate operation.
      */
      */
-    ResultCode HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session);
+    virtual void HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) = 0;
 
 
     /**
     /**
      * Signals that a client has just connected to this HLE handler and keeps the
      * Signals that a client has just connected to this HLE handler and keeps the
@@ -53,23 +60,6 @@ public:
     void ClientDisconnected(Kernel::SharedPtr<Kernel::ServerSession> server_session);
     void ClientDisconnected(Kernel::SharedPtr<Kernel::ServerSession> server_session);
 
 
 protected:
 protected:
-    /**
-     * Handles a sync request from the emulated application and writes the response to the command buffer.
-     * TODO(Subv): Use a wrapper structure to hold all the information relevant to
-     * this request (ServerSession, Originator thread, Translated command buffer, etc).
-     */
-    virtual void HandleSyncRequestImpl(Kernel::SharedPtr<Kernel::ServerSession> server_session) = 0;
-
-private:
-    /**
-     * Performs command buffer translation for this request.
-     * The command buffer from the ServerSession thread's TLS is copied into a
-     * buffer and all descriptors in the buffer are processed.
-     * TODO(Subv): Implement this function, currently we do not support multiple processes running at once,
-     * but once that is implemented we'll need to properly translate all descriptors in the command buffer.
-     */
-    ResultCode TranslateRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session);
-
     /// List of sessions that are connected to this handler.
     /// List of sessions that are connected to this handler.
     /// A ServerSession whose server endpoint is an HLE implementation is kept alive by this list for the duration of the connection.
     /// A ServerSession whose server endpoint is an HLE implementation is kept alive by this list for the duration of the connection.
     std::vector<Kernel::SharedPtr<Kernel::ServerSession>> connected_sessions;
     std::vector<Kernel::SharedPtr<Kernel::ServerSession>> connected_sessions;
@@ -120,7 +110,7 @@ public:
     }
     }
 
 
 protected:
 protected:
-    void HandleSyncRequestImpl(Kernel::SharedPtr<Kernel::ServerSession> server_session) override;
+    void HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) override;
 
 
     /**
     /**
      * Registers the functions in the service
      * Registers the functions in the service