mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	HLE/Applets: Stub Mint (eShop) Applet (#2463)
This allows Phoenix Wright - Dual Destinies to boot.
This commit is contained in:
		
				
					committed by
					
						
						Yuri Kunde Schlesner
					
				
			
			
				
	
			
			
			
						parent
						
							0b9c59ff22
						
					
				
				
					commit
					d0bf7df5ba
				
			@@ -40,6 +40,7 @@ set(SRCS
 | 
				
			|||||||
            hle/applets/applet.cpp
 | 
					            hle/applets/applet.cpp
 | 
				
			||||||
            hle/applets/erreula.cpp
 | 
					            hle/applets/erreula.cpp
 | 
				
			||||||
            hle/applets/mii_selector.cpp
 | 
					            hle/applets/mii_selector.cpp
 | 
				
			||||||
 | 
					            hle/applets/mint.cpp
 | 
				
			||||||
            hle/applets/swkbd.cpp
 | 
					            hle/applets/swkbd.cpp
 | 
				
			||||||
            hle/kernel/address_arbiter.cpp
 | 
					            hle/kernel/address_arbiter.cpp
 | 
				
			||||||
            hle/kernel/client_port.cpp
 | 
					            hle/kernel/client_port.cpp
 | 
				
			||||||
@@ -219,6 +220,7 @@ set(HEADERS
 | 
				
			|||||||
            hle/applets/applet.h
 | 
					            hle/applets/applet.h
 | 
				
			||||||
            hle/applets/erreula.h
 | 
					            hle/applets/erreula.h
 | 
				
			||||||
            hle/applets/mii_selector.h
 | 
					            hle/applets/mii_selector.h
 | 
				
			||||||
 | 
					            hle/applets/mint.h
 | 
				
			||||||
            hle/applets/swkbd.h
 | 
					            hle/applets/swkbd.h
 | 
				
			||||||
            hle/kernel/address_arbiter.h
 | 
					            hle/kernel/address_arbiter.h
 | 
				
			||||||
            hle/kernel/client_port.h
 | 
					            hle/kernel/client_port.h
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,6 +12,7 @@
 | 
				
			|||||||
#include "core/hle/applets/applet.h"
 | 
					#include "core/hle/applets/applet.h"
 | 
				
			||||||
#include "core/hle/applets/erreula.h"
 | 
					#include "core/hle/applets/erreula.h"
 | 
				
			||||||
#include "core/hle/applets/mii_selector.h"
 | 
					#include "core/hle/applets/mii_selector.h"
 | 
				
			||||||
 | 
					#include "core/hle/applets/mint.h"
 | 
				
			||||||
#include "core/hle/applets/swkbd.h"
 | 
					#include "core/hle/applets/swkbd.h"
 | 
				
			||||||
#include "core/hle/result.h"
 | 
					#include "core/hle/result.h"
 | 
				
			||||||
#include "core/hle/service/apt/apt.h"
 | 
					#include "core/hle/service/apt/apt.h"
 | 
				
			||||||
@@ -56,6 +57,10 @@ ResultCode Applet::Create(Service::APT::AppletId id) {
 | 
				
			|||||||
    case Service::APT::AppletId::Error2:
 | 
					    case Service::APT::AppletId::Error2:
 | 
				
			||||||
        applets[id] = std::make_shared<ErrEula>(id);
 | 
					        applets[id] = std::make_shared<ErrEula>(id);
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					    case Service::APT::AppletId::Mint:
 | 
				
			||||||
 | 
					    case Service::APT::AppletId::Mint2:
 | 
				
			||||||
 | 
					        applets[id] = std::make_shared<Mint>(id);
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
        LOG_ERROR(Service_APT, "Could not create applet %u", id);
 | 
					        LOG_ERROR(Service_APT, "Could not create applet %u", id);
 | 
				
			||||||
        // TODO(Subv): Find the right error code
 | 
					        // TODO(Subv): Find the right error code
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										72
									
								
								src/core/hle/applets/mint.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								src/core/hle/applets/mint.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,72 @@
 | 
				
			|||||||
 | 
					// Copyright 2016 Citra Emulator Project
 | 
				
			||||||
 | 
					// Licensed under GPLv2 or any later version
 | 
				
			||||||
 | 
					// Refer to the license.txt file included.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "common/string_util.h"
 | 
				
			||||||
 | 
					#include "core/hle/applets/mint.h"
 | 
				
			||||||
 | 
					#include "core/hle/service/apt/apt.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace HLE {
 | 
				
			||||||
 | 
					namespace Applets {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ResultCode Mint::ReceiveParameter(const Service::APT::MessageParameter& parameter) {
 | 
				
			||||||
 | 
					    if (parameter.signal != static_cast<u32>(Service::APT::SignalType::Request)) {
 | 
				
			||||||
 | 
					        LOG_ERROR(Service_APT, "unsupported signal %u", parameter.signal);
 | 
				
			||||||
 | 
					        UNIMPLEMENTED();
 | 
				
			||||||
 | 
					        // TODO(Subv): Find the right error code
 | 
				
			||||||
 | 
					        return ResultCode(-1);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // The Request message contains a buffer with the size of the framebuffer shared
 | 
				
			||||||
 | 
					    // memory.
 | 
				
			||||||
 | 
					    // Create the SharedMemory that will hold the framebuffer data
 | 
				
			||||||
 | 
					    Service::APT::CaptureBufferInfo capture_info;
 | 
				
			||||||
 | 
					    ASSERT(sizeof(capture_info) == parameter.buffer.size());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    memcpy(&capture_info, parameter.buffer.data(), sizeof(capture_info));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // TODO: allocated memory never released
 | 
				
			||||||
 | 
					    using Kernel::MemoryPermission;
 | 
				
			||||||
 | 
					    // Allocate a heap block of the required size for this applet.
 | 
				
			||||||
 | 
					    heap_memory = std::make_shared<std::vector<u8>>(capture_info.size);
 | 
				
			||||||
 | 
					    // Create a SharedMemory that directly points to this heap block.
 | 
				
			||||||
 | 
					    framebuffer_memory = Kernel::SharedMemory::CreateForApplet(
 | 
				
			||||||
 | 
					        heap_memory, 0, heap_memory->size(), MemoryPermission::ReadWrite,
 | 
				
			||||||
 | 
					        MemoryPermission::ReadWrite, "Mint Memory");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Send the response message with the newly created SharedMemory
 | 
				
			||||||
 | 
					    Service::APT::MessageParameter result;
 | 
				
			||||||
 | 
					    result.signal = static_cast<u32>(Service::APT::SignalType::Response);
 | 
				
			||||||
 | 
					    result.buffer.clear();
 | 
				
			||||||
 | 
					    result.destination_id = static_cast<u32>(Service::APT::AppletId::Application);
 | 
				
			||||||
 | 
					    result.sender_id = static_cast<u32>(id);
 | 
				
			||||||
 | 
					    result.object = framebuffer_memory;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Service::APT::SendParameter(result);
 | 
				
			||||||
 | 
					    return RESULT_SUCCESS;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ResultCode Mint::StartImpl(const Service::APT::AppletStartupParameter& parameter) {
 | 
				
			||||||
 | 
					    is_running = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // TODO(Subv): Set the expected fields in the response buffer before resending it to the
 | 
				
			||||||
 | 
					    // application.
 | 
				
			||||||
 | 
					    // TODO(Subv): Reverse the parameter format for the Mint applet
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Let the application know that we're closing
 | 
				
			||||||
 | 
					    Service::APT::MessageParameter message;
 | 
				
			||||||
 | 
					    message.buffer.resize(parameter.buffer.size());
 | 
				
			||||||
 | 
					    std::fill(message.buffer.begin(), message.buffer.end(), 0);
 | 
				
			||||||
 | 
					    message.signal = static_cast<u32>(Service::APT::SignalType::WakeupByExit);
 | 
				
			||||||
 | 
					    message.destination_id = static_cast<u32>(Service::APT::AppletId::Application);
 | 
				
			||||||
 | 
					    message.sender_id = static_cast<u32>(id);
 | 
				
			||||||
 | 
					    Service::APT::SendParameter(message);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    is_running = false;
 | 
				
			||||||
 | 
					    return RESULT_SUCCESS;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Mint::Update() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} // namespace Applets
 | 
				
			||||||
 | 
					} // namespace HLE
 | 
				
			||||||
							
								
								
									
										29
									
								
								src/core/hle/applets/mint.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								src/core/hle/applets/mint.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
				
			|||||||
 | 
					// Copyright 2016 Citra Emulator Project
 | 
				
			||||||
 | 
					// Licensed under GPLv2 or any later version
 | 
				
			||||||
 | 
					// Refer to the license.txt file included.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "core/hle/applets/applet.h"
 | 
				
			||||||
 | 
					#include "core/hle/kernel/shared_memory.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace HLE {
 | 
				
			||||||
 | 
					namespace Applets {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Mint final : public Applet {
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    explicit Mint(Service::APT::AppletId id) : Applet(id) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ResultCode ReceiveParameter(const Service::APT::MessageParameter& parameter) override;
 | 
				
			||||||
 | 
					    ResultCode StartImpl(const Service::APT::AppletStartupParameter& parameter) override;
 | 
				
			||||||
 | 
					    void Update() override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    /// This SharedMemory will be created when we receive the Request message.
 | 
				
			||||||
 | 
					    /// It holds the framebuffer info retrieved by the application with
 | 
				
			||||||
 | 
					    /// GSPGPU::ImportDisplayCaptureInfo
 | 
				
			||||||
 | 
					    Kernel::SharedPtr<Kernel::SharedMemory> framebuffer_memory;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} // namespace Applets
 | 
				
			||||||
 | 
					} // namespace HLE
 | 
				
			||||||
		Reference in New Issue
	
	Block a user