HLE/IPC: move command buffer translation into kernel as TODO says
This commit is contained in:
@@ -27,6 +27,7 @@ class HandleTable;
|
||||
class Process;
|
||||
class Thread;
|
||||
class Event;
|
||||
class HLERequestContext;
|
||||
|
||||
/**
|
||||
* Interface implemented by HLE Session handlers.
|
||||
@@ -39,13 +40,10 @@ public:
|
||||
|
||||
/**
|
||||
* Handles a sync request from the emulated application.
|
||||
* @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.
|
||||
* 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.
|
||||
* @param context holds all the information relevant to his request (ServerSession, Translated
|
||||
* command buffer, etc).
|
||||
*/
|
||||
virtual void HandleSyncRequest(SharedPtr<ServerSession> server_session) = 0;
|
||||
virtual void HandleSyncRequest(Kernel::HLERequestContext& context) = 0;
|
||||
|
||||
/**
|
||||
* Signals that a client has just connected to this HLE handler and keeps the
|
||||
|
@@ -13,7 +13,7 @@
|
||||
|
||||
namespace Kernel {
|
||||
|
||||
ServerSession::ServerSession(KernelSystem& kernel) : WaitObject(kernel) {}
|
||||
ServerSession::ServerSession(KernelSystem& kernel) : WaitObject(kernel), kernel(kernel) {}
|
||||
ServerSession::~ServerSession() {
|
||||
// This destructor will be called automatically when the last ServerSession handle is closed by
|
||||
// the emulated application.
|
||||
@@ -66,7 +66,25 @@ ResultCode ServerSession::HandleSyncRequest(SharedPtr<Thread> thread) {
|
||||
|
||||
// If this ServerSession has an associated HLE handler, forward the request to it.
|
||||
if (hle_handler != nullptr) {
|
||||
hle_handler->HandleSyncRequest(SharedPtr<ServerSession>(this));
|
||||
// TODO(wwylele): avoid GetPointer
|
||||
u32* cmd_buf =
|
||||
reinterpret_cast<u32*>(kernel.memory.GetPointer(thread->GetCommandBufferAddress()));
|
||||
|
||||
Kernel::Process* current_process = thread->owner_process;
|
||||
|
||||
Kernel::HLERequestContext context(this);
|
||||
context.PopulateFromIncomingCommandBuffer(cmd_buf, *current_process);
|
||||
|
||||
hle_handler->HandleSyncRequest(context);
|
||||
|
||||
ASSERT(thread->status == Kernel::ThreadStatus::Running ||
|
||||
thread->status == Kernel::ThreadStatus::WaitHleEvent);
|
||||
// Only write the response immediately if the thread is still running. If the HLE handler
|
||||
// put the thread to sleep then the writing of the command buffer will be deferred to the
|
||||
// wakeup callback.
|
||||
if (thread->status == Kernel::ThreadStatus::Running) {
|
||||
context.WriteToOutgoingCommandBuffer(cmd_buf, *current_process);
|
||||
}
|
||||
}
|
||||
|
||||
if (thread->status == ThreadStatus::Running) {
|
||||
|
@@ -102,6 +102,7 @@ private:
|
||||
std::string name = "Unknown");
|
||||
|
||||
friend class KernelSystem;
|
||||
KernelSystem& kernel;
|
||||
};
|
||||
|
||||
} // namespace Kernel
|
||||
|
Reference in New Issue
Block a user