mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	ns: rewrite ISystemUpdateInterface
This commit is contained in:
		@@ -771,6 +771,8 @@ add_library(core STATIC
 | 
				
			|||||||
    hle/service/ns/read_only_application_record_interface.h
 | 
					    hle/service/ns/read_only_application_record_interface.h
 | 
				
			||||||
    hle/service/ns/system_update_control.cpp
 | 
					    hle/service/ns/system_update_control.cpp
 | 
				
			||||||
    hle/service/ns/system_update_control.h
 | 
					    hle/service/ns/system_update_control.h
 | 
				
			||||||
 | 
					    hle/service/ns/system_update_interface.cpp
 | 
				
			||||||
 | 
					    hle/service/ns/system_update_interface.h
 | 
				
			||||||
    hle/service/ns/vulnerability_manager_interface.cpp
 | 
					    hle/service/ns/vulnerability_manager_interface.cpp
 | 
				
			||||||
    hle/service/ns/vulnerability_manager_interface.h
 | 
					    hle/service/ns/vulnerability_manager_interface.h
 | 
				
			||||||
    hle/service/nvdrv/core/container.cpp
 | 
					    hle/service/nvdrv/core/container.cpp
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,6 +27,7 @@
 | 
				
			|||||||
#include "core/hle/service/ns/read_only_application_control_data_interface.h"
 | 
					#include "core/hle/service/ns/read_only_application_control_data_interface.h"
 | 
				
			||||||
#include "core/hle/service/ns/read_only_application_record_interface.h"
 | 
					#include "core/hle/service/ns/read_only_application_record_interface.h"
 | 
				
			||||||
#include "core/hle/service/ns/system_update_control.h"
 | 
					#include "core/hle/service/ns/system_update_control.h"
 | 
				
			||||||
 | 
					#include "core/hle/service/ns/system_update_interface.h"
 | 
				
			||||||
#include "core/hle/service/ns/vulnerability_manager_interface.h"
 | 
					#include "core/hle/service/ns/vulnerability_manager_interface.h"
 | 
				
			||||||
#include "core/hle/service/server_manager.h"
 | 
					#include "core/hle/service/server_manager.h"
 | 
				
			||||||
#include "core/hle/service/set/settings_server.h"
 | 
					#include "core/hle/service/set/settings_server.h"
 | 
				
			||||||
@@ -529,44 +530,6 @@ public:
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class NS_SU final : public ServiceFramework<NS_SU> {
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
    explicit NS_SU(Core::System& system_) : ServiceFramework{system_, "ns:su"} {
 | 
					 | 
				
			||||||
        // clang-format off
 | 
					 | 
				
			||||||
        static const FunctionInfo functions[] = {
 | 
					 | 
				
			||||||
            {0, nullptr, "GetBackgroundNetworkUpdateState"},
 | 
					 | 
				
			||||||
            {1, &NS_SU::OpenSystemUpdateControl, "OpenSystemUpdateControl"},
 | 
					 | 
				
			||||||
            {2, nullptr, "NotifyExFatDriverRequired"},
 | 
					 | 
				
			||||||
            {3, nullptr, "ClearExFatDriverStatusForDebug"},
 | 
					 | 
				
			||||||
            {4, nullptr, "RequestBackgroundNetworkUpdate"},
 | 
					 | 
				
			||||||
            {5, nullptr, "NotifyBackgroundNetworkUpdate"},
 | 
					 | 
				
			||||||
            {6, nullptr, "NotifyExFatDriverDownloadedForDebug"},
 | 
					 | 
				
			||||||
            {9, nullptr, "GetSystemUpdateNotificationEventForContentDelivery"},
 | 
					 | 
				
			||||||
            {10, nullptr, "NotifySystemUpdateForContentDelivery"},
 | 
					 | 
				
			||||||
            {11, nullptr, "PrepareShutdown"},
 | 
					 | 
				
			||||||
            {12, nullptr, "Unknown12"},
 | 
					 | 
				
			||||||
            {13, nullptr, "Unknown13"},
 | 
					 | 
				
			||||||
            {14, nullptr, "Unknown14"},
 | 
					 | 
				
			||||||
            {15, nullptr, "Unknown15"},
 | 
					 | 
				
			||||||
            {16, nullptr, "DestroySystemUpdateTask"},
 | 
					 | 
				
			||||||
            {17, nullptr, "RequestSendSystemUpdate"},
 | 
					 | 
				
			||||||
            {18, nullptr, "GetSendSystemUpdateProgress"},
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
        // clang-format on
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        RegisterHandlers(functions);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
    void OpenSystemUpdateControl(HLERequestContext& ctx) {
 | 
					 | 
				
			||||||
        LOG_DEBUG(Service_NS, "called");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        IPC::ResponseBuilder rb{ctx, 2, 0, 1};
 | 
					 | 
				
			||||||
        rb.Push(ResultSuccess);
 | 
					 | 
				
			||||||
        rb.PushIpcInterface<ISystemUpdateControl>(system);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void LoopProcess(Core::System& system) {
 | 
					void LoopProcess(Core::System& system) {
 | 
				
			||||||
    auto server_manager = std::make_unique<ServerManager>(system);
 | 
					    auto server_manager = std::make_unique<ServerManager>(system);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -578,7 +541,7 @@ void LoopProcess(Core::System& system) {
 | 
				
			|||||||
    server_manager->RegisterNamedService("ns:ro", std::make_shared<NS>("ns:ro", system));
 | 
					    server_manager->RegisterNamedService("ns:ro", std::make_shared<NS>("ns:ro", system));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    server_manager->RegisterNamedService("ns:dev", std::make_shared<NS_DEV>(system));
 | 
					    server_manager->RegisterNamedService("ns:dev", std::make_shared<NS_DEV>(system));
 | 
				
			||||||
    server_manager->RegisterNamedService("ns:su", std::make_shared<NS_SU>(system));
 | 
					    server_manager->RegisterNamedService("ns:su", std::make_shared<ISystemUpdateInterface>(system));
 | 
				
			||||||
    server_manager->RegisterNamedService("ns:vm",
 | 
					    server_manager->RegisterNamedService("ns:vm",
 | 
				
			||||||
                                         std::make_shared<IVulnerabilityManagerInterface>(system));
 | 
					                                         std::make_shared<IVulnerabilityManagerInterface>(system));
 | 
				
			||||||
    server_manager->RegisterNamedService("pdm:qry", std::make_shared<PDM_QRY>(system));
 | 
					    server_manager->RegisterNamedService("pdm:qry", std::make_shared<PDM_QRY>(system));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,6 +22,12 @@ enum class ApplicationControlSource : u8 {
 | 
				
			|||||||
    StorageOnly = 2,
 | 
					    StorageOnly = 2,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum class BackgroundNetworkUpdateState : u8 {
 | 
				
			||||||
 | 
					    None,
 | 
				
			||||||
 | 
					    InProgress,
 | 
				
			||||||
 | 
					    Ready,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct ApplicationRecord {
 | 
					struct ApplicationRecord {
 | 
				
			||||||
    u64 application_id;
 | 
					    u64 application_id;
 | 
				
			||||||
    ApplicationRecordType type;
 | 
					    ApplicationRecordType type;
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										61
									
								
								src/core/hle/service/ns/system_update_interface.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								src/core/hle/service/ns/system_update_interface.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,61 @@
 | 
				
			|||||||
 | 
					// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
 | 
				
			||||||
 | 
					// SPDX-License-Identifier: GPL-2.0-or-later
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "core/hle/service/cmif_serialization.h"
 | 
				
			||||||
 | 
					#include "core/hle/service/ns/system_update_control.h"
 | 
				
			||||||
 | 
					#include "core/hle/service/ns/system_update_interface.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Service::NS {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ISystemUpdateInterface::ISystemUpdateInterface(Core::System& system_)
 | 
				
			||||||
 | 
					    : ServiceFramework{system_, "ns:su"}, service_context{system_, "ns:su"},
 | 
				
			||||||
 | 
					      update_notification_event{service_context} {
 | 
				
			||||||
 | 
					    // clang-format off
 | 
				
			||||||
 | 
					    static const FunctionInfo functions[] = {
 | 
				
			||||||
 | 
					        {0, D<&ISystemUpdateInterface::GetBackgroundNetworkUpdateState>, "GetBackgroundNetworkUpdateState"},
 | 
				
			||||||
 | 
					        {1, D<&ISystemUpdateInterface::OpenSystemUpdateControl>, "OpenSystemUpdateControl"},
 | 
				
			||||||
 | 
					        {2, nullptr, "NotifyExFatDriverRequired"},
 | 
				
			||||||
 | 
					        {3, nullptr, "ClearExFatDriverStatusForDebug"},
 | 
				
			||||||
 | 
					        {4, nullptr, "RequestBackgroundNetworkUpdate"},
 | 
				
			||||||
 | 
					        {5, nullptr, "NotifyBackgroundNetworkUpdate"},
 | 
				
			||||||
 | 
					        {6, nullptr, "NotifyExFatDriverDownloadedForDebug"},
 | 
				
			||||||
 | 
					        {9, D<&ISystemUpdateInterface::GetSystemUpdateNotificationEventForContentDelivery>, "GetSystemUpdateNotificationEventForContentDelivery"},
 | 
				
			||||||
 | 
					        {10, nullptr, "NotifySystemUpdateForContentDelivery"},
 | 
				
			||||||
 | 
					        {11, nullptr, "PrepareShutdown"},
 | 
				
			||||||
 | 
					        {12, nullptr, "Unknown12"},
 | 
				
			||||||
 | 
					        {13, nullptr, "Unknown13"},
 | 
				
			||||||
 | 
					        {14, nullptr, "Unknown14"},
 | 
				
			||||||
 | 
					        {15, nullptr, "Unknown15"},
 | 
				
			||||||
 | 
					        {16, nullptr, "DestroySystemUpdateTask"},
 | 
				
			||||||
 | 
					        {17, nullptr, "RequestSendSystemUpdate"},
 | 
				
			||||||
 | 
					        {18, nullptr, "GetSendSystemUpdateProgress"},
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    // clang-format on
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    RegisterHandlers(functions);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ISystemUpdateInterface::~ISystemUpdateInterface() = default;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Result ISystemUpdateInterface::GetBackgroundNetworkUpdateState(
 | 
				
			||||||
 | 
					    Out<BackgroundNetworkUpdateState> out_background_network_update_state) {
 | 
				
			||||||
 | 
					    LOG_WARNING(Service_AM, "(STUBBED) called");
 | 
				
			||||||
 | 
					    *out_background_network_update_state = BackgroundNetworkUpdateState::None;
 | 
				
			||||||
 | 
					    R_SUCCEED();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Result ISystemUpdateInterface::OpenSystemUpdateControl(
 | 
				
			||||||
 | 
					    Out<SharedPointer<ISystemUpdateControl>> out_system_update_control) {
 | 
				
			||||||
 | 
					    LOG_WARNING(Service_NS, "(STUBBED) called");
 | 
				
			||||||
 | 
					    *out_system_update_control = std::make_shared<ISystemUpdateControl>(system);
 | 
				
			||||||
 | 
					    R_SUCCEED();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Result ISystemUpdateInterface::GetSystemUpdateNotificationEventForContentDelivery(
 | 
				
			||||||
 | 
					    OutCopyHandle<Kernel::KReadableEvent> out_event) {
 | 
				
			||||||
 | 
					    LOG_WARNING(Service_NS, "(STUBBED) called");
 | 
				
			||||||
 | 
					    *out_event = update_notification_event.GetHandle();
 | 
				
			||||||
 | 
					    R_SUCCEED();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} // namespace Service::NS
 | 
				
			||||||
							
								
								
									
										38
									
								
								src/core/hle/service/ns/system_update_interface.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								src/core/hle/service/ns/system_update_interface.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
				
			|||||||
 | 
					// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
 | 
				
			||||||
 | 
					// SPDX-License-Identifier: GPL-2.0-or-later
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "core/hle/service/cmif_types.h"
 | 
				
			||||||
 | 
					#include "core/hle/service/kernel_helpers.h"
 | 
				
			||||||
 | 
					#include "core/hle/service/ns/ns_types.h"
 | 
				
			||||||
 | 
					#include "core/hle/service/os/event.h"
 | 
				
			||||||
 | 
					#include "core/hle/service/service.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Kernel {
 | 
				
			||||||
 | 
					class KReadableEvent;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Service::NS {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ISystemUpdateControl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ISystemUpdateInterface final : public ServiceFramework<ISystemUpdateInterface> {
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    explicit ISystemUpdateInterface(Core::System& system_);
 | 
				
			||||||
 | 
					    ~ISystemUpdateInterface() override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    Result GetBackgroundNetworkUpdateState(
 | 
				
			||||||
 | 
					        Out<BackgroundNetworkUpdateState> out_background_network_update_state);
 | 
				
			||||||
 | 
					    Result OpenSystemUpdateControl(
 | 
				
			||||||
 | 
					        Out<SharedPointer<ISystemUpdateControl>> out_system_update_control);
 | 
				
			||||||
 | 
					    Result GetSystemUpdateNotificationEventForContentDelivery(
 | 
				
			||||||
 | 
					        OutCopyHandle<Kernel::KReadableEvent> out_event);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    KernelHelpers::ServiceContext service_context;
 | 
				
			||||||
 | 
					    Event update_notification_event;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} // namespace Service::NS
 | 
				
			||||||
		Reference in New Issue
	
	Block a user