mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	Merge pull request #62 from bunnei/domain-close-handle
Implement IPC domain command CloseVirtualHandle
This commit is contained in:
		
						commit
						7172ff4d9a
					
				@ -43,6 +43,7 @@ namespace Log {
 | 
			
		||||
    SUB(HW, LCD)                                                                                   \
 | 
			
		||||
    SUB(HW, GPU)                                                                                   \
 | 
			
		||||
    SUB(HW, AES)                                                                                   \
 | 
			
		||||
    CLS(IPC)                                                                                       \
 | 
			
		||||
    CLS(Frontend)                                                                                  \
 | 
			
		||||
    CLS(Render)                                                                                    \
 | 
			
		||||
    SUB(Render, Software)                                                                          \
 | 
			
		||||
@ -91,8 +92,8 @@ const char* GetLevelName(Level log_level) {
 | 
			
		||||
 | 
			
		||||
Entry CreateEntry(Class log_class, Level log_level, const char* filename, unsigned int line_nr,
 | 
			
		||||
                  const char* function, const char* format, va_list args) {
 | 
			
		||||
    using std::chrono::steady_clock;
 | 
			
		||||
    using std::chrono::duration_cast;
 | 
			
		||||
    using std::chrono::steady_clock;
 | 
			
		||||
 | 
			
		||||
    static steady_clock::time_point time_origin = steady_clock::now();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -60,6 +60,7 @@ enum class Class : ClassType {
 | 
			
		||||
    HW_LCD,            ///< LCD register emulation
 | 
			
		||||
    HW_GPU,            ///< GPU control emulation
 | 
			
		||||
    HW_AES,            ///< AES engine emulation
 | 
			
		||||
    IPC,               ///< IPC interface
 | 
			
		||||
    Frontend,          ///< Emulator UI
 | 
			
		||||
    Render,            ///< Emulator video output and hardware acceleration
 | 
			
		||||
    Render_Software,   ///< Software renderer backend
 | 
			
		||||
 | 
			
		||||
@ -143,6 +143,11 @@ struct DataPayloadHeader {
 | 
			
		||||
static_assert(sizeof(DataPayloadHeader) == 8, "DataPayloadRequest size is incorrect");
 | 
			
		||||
 | 
			
		||||
struct DomainMessageHeader {
 | 
			
		||||
    enum class CommandType : u32_le {
 | 
			
		||||
        SendMessage = 1,
 | 
			
		||||
        CloseVirtualHandle = 2,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    union {
 | 
			
		||||
        // Used when responding to an IPC request, Server -> Client.
 | 
			
		||||
        struct {
 | 
			
		||||
@ -153,7 +158,7 @@ struct DomainMessageHeader {
 | 
			
		||||
        // Used when performing an IPC request, Client -> Server.
 | 
			
		||||
        struct {
 | 
			
		||||
            union {
 | 
			
		||||
                BitField<0, 8, u32_le> command;
 | 
			
		||||
                BitField<0, 8, CommandType> command;
 | 
			
		||||
                BitField<16, 16, u32_le> size;
 | 
			
		||||
            };
 | 
			
		||||
            u32_le object_id;
 | 
			
		||||
 | 
			
		||||
@ -2,6 +2,8 @@
 | 
			
		||||
// Licensed under GPLv2 or any later version
 | 
			
		||||
// Refer to the license.txt file included.
 | 
			
		||||
 | 
			
		||||
#include "common/logging/log.h"
 | 
			
		||||
#include "core/hle/ipc_helpers.h"
 | 
			
		||||
#include "core/hle/kernel/client_port.h"
 | 
			
		||||
#include "core/hle/kernel/domain.h"
 | 
			
		||||
#include "core/hle/kernel/handle_table.h"
 | 
			
		||||
@ -36,7 +38,24 @@ ResultCode Domain::SendSyncRequest(SharedPtr<Thread> thread) {
 | 
			
		||||
    if (domain_message_header) {
 | 
			
		||||
        // If there is a DomainMessageHeader, then this is CommandType "Request"
 | 
			
		||||
        const u32 object_id{context.GetDomainMessageHeader()->object_id};
 | 
			
		||||
        return request_handlers[object_id - 1]->HandleSyncRequest(context);
 | 
			
		||||
        switch (domain_message_header->command) {
 | 
			
		||||
        case IPC::DomainMessageHeader::CommandType::SendMessage:
 | 
			
		||||
            return request_handlers[object_id - 1]->HandleSyncRequest(context);
 | 
			
		||||
 | 
			
		||||
        case IPC::DomainMessageHeader::CommandType::CloseVirtualHandle: {
 | 
			
		||||
            LOG_DEBUG(IPC, "CloseVirtualHandle, object_id=0x%08X", object_id);
 | 
			
		||||
 | 
			
		||||
            request_handlers[object_id - 1] = nullptr;
 | 
			
		||||
 | 
			
		||||
            IPC::RequestBuilder rb{context, 2};
 | 
			
		||||
            rb.Push(RESULT_SUCCESS);
 | 
			
		||||
 | 
			
		||||
            return RESULT_SUCCESS;
 | 
			
		||||
        }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        LOG_CRITICAL(IPC, "Unknown domain command=%d", domain_message_header->command.Value());
 | 
			
		||||
        UNIMPLEMENTED();
 | 
			
		||||
    }
 | 
			
		||||
    return request_handlers.front()->HandleSyncRequest(context);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -102,13 +102,21 @@ void HLERequestContext::ParseCommandBuffer(u32_le* src_cmdbuf, bool incoming) {
 | 
			
		||||
    data_payload_header =
 | 
			
		||||
        std::make_unique<IPC::DataPayloadHeader>(rp.PopRaw<IPC::DataPayloadHeader>());
 | 
			
		||||
 | 
			
		||||
    data_payload_offset = rp.GetCurrentOffset();
 | 
			
		||||
 | 
			
		||||
    if (domain_message_header &&
 | 
			
		||||
        domain_message_header->command ==
 | 
			
		||||
            IPC::DomainMessageHeader::CommandType::CloseVirtualHandle) {
 | 
			
		||||
        // CloseVirtualHandle command does not have SFC* or any data
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (incoming) {
 | 
			
		||||
        ASSERT(data_payload_header->magic == Common::MakeMagic('S', 'F', 'C', 'I'));
 | 
			
		||||
    } else {
 | 
			
		||||
        ASSERT(data_payload_header->magic == Common::MakeMagic('S', 'F', 'C', 'O'));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    data_payload_offset = rp.GetCurrentOffset();
 | 
			
		||||
    command = rp.Pop<u32_le>();
 | 
			
		||||
    rp.Skip(1, false); // The command is actually an u64, but we don't use the high part.
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user