mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-11-03 23:28:48 +00:00 
			
		
		
		
	HLE/IPC: move command buffer translation into kernel as TODO says
This commit is contained in:
		
							parent
							
								
									de1128c60d
								
							
						
					
					
						commit
						36c8e1d7a9
					
				
					 5 changed files with 31 additions and 36 deletions
				
			
		| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue