Split SessionRequestHandler::HandleSyncRequest into HandleSyncRequest, TranslateRequest and HandleSyncRequestImpl.
HandleSyncRequest now takes care of calling the command buffer translate function before actually invoking the command handler for HLE services.
This commit is contained in:
parent
29d809b6e1
commit
00f0c77570
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
#include "common/assert.h"
|
#include "common/assert.h"
|
||||||
#include "core/hle/kernel/client_port.h"
|
#include "core/hle/kernel/client_port.h"
|
||||||
|
#include "core/hle/kernel/client_session.h"
|
||||||
#include "core/hle/kernel/kernel.h"
|
#include "core/hle/kernel/kernel.h"
|
||||||
#include "core/hle/kernel/server_port.h"
|
#include "core/hle/kernel/server_port.h"
|
||||||
#include "core/hle/kernel/server_session.h"
|
#include "core/hle/kernel/server_session.h"
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
|
|
|
@ -93,7 +93,7 @@ File::File(std::unique_ptr<FileSys::FileBackend>&& backend, const FileSys::Path&
|
||||||
|
|
||||||
File::~File() {}
|
File::~File() {}
|
||||||
|
|
||||||
ResultCode File::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) {
|
void File::HandleSyncRequestImpl(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) {
|
||||||
|
@ -116,7 +116,7 @@ ResultCode File::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> serv
|
||||||
ResultVal<size_t> read = backend->Read(offset, data.size(), data.data());
|
ResultVal<size_t> read = backend->Read(offset, data.size(), data.data());
|
||||||
if (read.Failed()) {
|
if (read.Failed()) {
|
||||||
cmd_buff[1] = read.Code().raw;
|
cmd_buff[1] = read.Code().raw;
|
||||||
return read.Code();
|
return;
|
||||||
}
|
}
|
||||||
Memory::WriteBlock(address, data.data(), *read);
|
Memory::WriteBlock(address, data.data(), *read);
|
||||||
cmd_buff[2] = static_cast<u32>(*read);
|
cmd_buff[2] = static_cast<u32>(*read);
|
||||||
|
@ -137,7 +137,7 @@ ResultCode File::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> serv
|
||||||
ResultVal<size_t> written = backend->Write(offset, data.size(), flush != 0, data.data());
|
ResultVal<size_t> written = backend->Write(offset, data.size(), flush != 0, data.data());
|
||||||
if (written.Failed()) {
|
if (written.Failed()) {
|
||||||
cmd_buff[1] = written.Code().raw;
|
cmd_buff[1] = written.Code().raw;
|
||||||
return written.Code();
|
return;
|
||||||
}
|
}
|
||||||
cmd_buff[2] = static_cast<u32>(*written);
|
cmd_buff[2] = static_cast<u32>(*written);
|
||||||
break;
|
break;
|
||||||
|
@ -195,10 +195,9 @@ ResultCode File::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> serv
|
||||||
LOG_ERROR(Service_FS, "Unknown command=0x%08X!", cmd);
|
LOG_ERROR(Service_FS, "Unknown command=0x%08X!", cmd);
|
||||||
ResultCode error = UnimplementedFunction(ErrorModule::FS);
|
ResultCode error = UnimplementedFunction(ErrorModule::FS);
|
||||||
cmd_buff[1] = error.raw; // TODO(Link Mauve): use the correct error code for that.
|
cmd_buff[1] = error.raw; // TODO(Link Mauve): use the correct error code for that.
|
||||||
return error;
|
return;
|
||||||
}
|
}
|
||||||
cmd_buff[1] = RESULT_SUCCESS.raw; // No error
|
cmd_buff[1] = RESULT_SUCCESS.raw; // No error
|
||||||
return RESULT_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Directory::Directory(std::unique_ptr<FileSys::DirectoryBackend>&& backend,
|
Directory::Directory(std::unique_ptr<FileSys::DirectoryBackend>&& backend,
|
||||||
|
@ -207,7 +206,7 @@ Directory::Directory(std::unique_ptr<FileSys::DirectoryBackend>&& backend,
|
||||||
|
|
||||||
Directory::~Directory() {}
|
Directory::~Directory() {}
|
||||||
|
|
||||||
ResultCode Directory::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) {
|
void Directory::HandleSyncRequestImpl(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) {
|
||||||
|
@ -237,10 +236,9 @@ ResultCode Directory::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession>
|
||||||
LOG_ERROR(Service_FS, "Unknown command=0x%08X!", cmd);
|
LOG_ERROR(Service_FS, "Unknown command=0x%08X!", cmd);
|
||||||
ResultCode error = UnimplementedFunction(ErrorModule::FS);
|
ResultCode error = UnimplementedFunction(ErrorModule::FS);
|
||||||
cmd_buff[1] = error.raw; // TODO(Link Mauve): use the correct error code for that.
|
cmd_buff[1] = error.raw; // TODO(Link Mauve): use the correct error code for that.
|
||||||
return RESULT_SUCCESS;
|
return;
|
||||||
}
|
}
|
||||||
cmd_buff[1] = RESULT_SUCCESS.raw; // No error
|
cmd_buff[1] = RESULT_SUCCESS.raw; // No error
|
||||||
return RESULT_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
|
@ -50,11 +50,12 @@ public:
|
||||||
return "Path: " + path.DebugStr();
|
return "Path: " + path.DebugStr();
|
||||||
}
|
}
|
||||||
|
|
||||||
ResultCode HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) override;
|
|
||||||
|
|
||||||
FileSys::Path path; ///< Path of the file
|
FileSys::Path path; ///< Path of the file
|
||||||
u32 priority; ///< Priority of the file. TODO(Subv): Find out what this means
|
u32 priority; ///< Priority of the file. TODO(Subv): Find out what this means
|
||||||
std::unique_ptr<FileSys::FileBackend> backend; ///< File backend interface
|
std::unique_ptr<FileSys::FileBackend> backend; ///< File backend interface
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void HandleSyncRequestImpl(Kernel::SharedPtr<Kernel::ServerSession> server_session) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Directory : public SessionRequestHandler {
|
class Directory : public SessionRequestHandler {
|
||||||
|
@ -66,10 +67,11 @@ public:
|
||||||
return "Directory: " + path.DebugStr();
|
return "Directory: " + path.DebugStr();
|
||||||
}
|
}
|
||||||
|
|
||||||
ResultCode HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) override;
|
|
||||||
|
|
||||||
FileSys::Path path; ///< Path of the directory
|
FileSys::Path path; ///< Path of the directory
|
||||||
std::unique_ptr<FileSys::DirectoryBackend> backend; ///< File backend interface
|
std::unique_ptr<FileSys::DirectoryBackend> backend; ///< File backend interface
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void HandleSyncRequestImpl(Kernel::SharedPtr<Kernel::ServerSession> server_session) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -64,7 +64,27 @@ static std::string MakeFunctionString(const char* name, const char* port_name,
|
||||||
return function_string;
|
return function_string;
|
||||||
}
|
}
|
||||||
|
|
||||||
ResultCode Interface::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) {
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
ResultCode SessionRequestHandler::TranslateRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) {
|
||||||
|
// TODO(Subv): Implement this function once multiple concurrent processes are supported.
|
||||||
|
return RESULT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Interface::HandleSyncRequestImpl(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();
|
||||||
|
@ -80,14 +100,12 @@ ResultCode Interface::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession>
|
||||||
|
|
||||||
// TODO(bunnei): Hack - ignore error
|
// TODO(bunnei): Hack - ignore error
|
||||||
cmd_buff[1] = 0;
|
cmd_buff[1] = 0;
|
||||||
return RESULT_SUCCESS;
|
return;
|
||||||
}
|
}
|
||||||
LOG_TRACE(Service, "%s",
|
LOG_TRACE(Service, "%s",
|
||||||
MakeFunctionString(itr->second.name, GetPortName().c_str(), cmd_buff).c_str());
|
MakeFunctionString(itr->second.name, GetPortName().c_str(), cmd_buff).c_str());
|
||||||
|
|
||||||
itr->second.func(this);
|
itr->second.func(this);
|
||||||
|
|
||||||
return RESULT_SUCCESS; // TODO: Implement return from actual function, it should fail if the parameter translation fails
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Interface::Register(const FunctionInfo* functions, size_t n) {
|
void Interface::Register(const FunctionInfo* functions, size_t n) {
|
||||||
|
@ -179,4 +197,5 @@ void Shutdown() {
|
||||||
g_kernel_named_ports.clear();
|
g_kernel_named_ports.clear();
|
||||||
LOG_DEBUG(Service, "shutdown OK");
|
LOG_DEBUG(Service, "shutdown OK");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -187,11 +187,27 @@ public:
|
||||||
* Dispatches and handles a sync request from the emulated application.
|
* Dispatches and 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): Make a HandleSyncRequestParent function that is called from the outside and does { ReturnIfError(Translate()); HandleSyncRequest(); }
|
* @returns ResultCode the result code of the translate operation.
|
||||||
* The Translate() function would copy the command buffer from the ServerSession thread's TLS into a temporary buffer, and pass it to HandleSyncRequest.
|
|
||||||
* TODO(Subv): HandleSyncRequest's return type should be void.
|
|
||||||
*/
|
*/
|
||||||
virtual ResultCode HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) = 0;
|
ResultCode HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session);
|
||||||
|
|
||||||
|
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);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -231,9 +247,9 @@ public:
|
||||||
return "[UNKNOWN SERVICE PORT]";
|
return "[UNKNOWN SERVICE PORT]";
|
||||||
}
|
}
|
||||||
|
|
||||||
ResultCode HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) override;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
void HandleSyncRequestImpl(Kernel::SharedPtr<Kernel::ServerSession> server_session) override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Registers the functions in the service
|
* Registers the functions in the service
|
||||||
*/
|
*/
|
||||||
|
|
Reference in New Issue